Migration vers datamodels

This commit is contained in:
2026-02-25 15:49:55 +01:00
parent 64eb40abfb
commit f1ab04bf32
95 changed files with 7418 additions and 593 deletions

View File

@@ -1,169 +1,192 @@
import { EcrymeUtility } from "../common/ecryme-utility.js";
import { EcrymeRollDialog } from "./ecryme-roll-dialog.js";
export class EcrymeConfrontDialog extends Dialog {
const { HandlebarsApplicationMixin } = foundry.applications.api
/**
* Main confrontation dialog — Application V2 version.
* Features drag-and-drop of dice from the pool to execution/preservation slots.
* All event listeners (change + drag-drop) are bound once via _listenersAdded guard.
*/
export class EcrymeConfrontDialog extends HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2) {
#dragDrop
_listenersAdded = false
/* -------------------------------------------- */
constructor(actor, rollData, options = {}) {
super(options)
this.actor = actor
this.rollData = rollData
this.buttonDisabled = true
this.#dragDrop = this.#createDragDropHandlers()
}
/* -------------------------------------------- */
/** @override */
static DEFAULT_OPTIONS = {
classes: ["fvtt-ecryme", "ecryme-confrontation-dialog"],
position: { width: 640 },
window: { title: "ECRY.ui.confront" },
dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }],
actions: {
launchConfront: EcrymeConfrontDialog.#onLaunchConfront,
cancel: EcrymeConfrontDialog.#onCancel,
},
}
/** @override */
static PARTS = {
content: { template: "systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs" },
}
/* -------------------------------------------- */
static async create(actor, rollData) {
let options = foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme ecryme-confrontation-dialog"],
dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }],
width: 620, height: 'fit-content', 'z-index': 99999
});
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs', rollData);
return new EcrymeConfrontDialog(actor, rollData, html, options);
return new EcrymeConfrontDialog(actor, rollData)
}
/* -------------------------------------------- */
constructor(actor, rollData, html, options, close = undefined) {
let conf = {
title: game.i18n.localize("ECRY.ui.confront"),
content: html,
buttons: {
launchConfront: {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("ECRY.ui.launchconfront"),
callback: () => { this.launchConfront().catch("Error when launching Confrontation") }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: game.i18n.localize("ECRY.ui.cancel"),
callback: () => { this.close() }
}
},
close: close
async _prepareContext() {
return {
...this.rollData,
config: game.system.ecryme.config,
buttonDisabled: this.buttonDisabled,
}
super(conf, options);
this.actor = actor;
this.rollData = rollData;
// Ensure button is disabled
setTimeout(function () { $(".launchConfront").attr("disabled", true) }, 180)
}
/* -------------------------------------------- */
async launchConfront() {
let msg = await EcrymeUtility.createChatMessage(this.rollData.alias, "blindroll", {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs`, this.rollData)
/** Bind drag-drop and form-change listeners once; re-bind DragDrop on each render. */
_onRender(context, options) {
// DragDrop must be re-bound each render because the DOM is replaced
this.#dragDrop.forEach(d => d.bind(this.element))
// Form-change listener is bound once (event delegation survives DOM re-renders)
if (!this._listenersAdded) {
this._listenersAdded = true
this.element.addEventListener('change', this.#onFormChange.bind(this))
}
}
/* -------------------------------------------- */
#onFormChange(event) {
const target = event.target
switch (target.id) {
case 'bonusMalusPerso':
this.rollData.bonusMalusPerso = Number(target.value)
this.computeTotals()
break
case 'roll-specialization':
this.rollData.selectedSpecs = Array.from(target.selectedOptions).map(o => o.value)
this.computeTotals()
break
case 'roll-trait-bonus':
this.rollData.traitsBonusSelected = Array.from(target.selectedOptions).map(o => o.value)
this.computeTotals()
break
case 'roll-trait-malus':
this.rollData.traitsMalusSelected = Array.from(target.selectedOptions).map(o => o.value)
this.computeTotals()
break
case 'roll-select-transcendence':
this.rollData.skillTranscendence = Number(target.value)
this.computeTotals()
break
case 'roll-apply-transcendence':
this.rollData.applyTranscendence = target.value
this.computeTotals()
break
case 'annency-bonus':
this.rollData.annencyBonus = Number(target.value)
break
}
}
// #region Drag-and-Drop
#createDragDropHandlers() {
return this.options.dragDrop.map(d => {
d.permissions = {
dragstart: () => true,
drop: () => true,
}
d.callbacks = {
dragstart: this._onDragStart.bind(this),
dragover: this._onDragOver.bind(this),
drop: this._onDrop.bind(this),
}
return new foundry.applications.ux.DragDrop.implementation(d)
})
EcrymeUtility.blindMessageToGM( { rollData: this.rollData, template: "systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs" })
console.log("MSG", this.rollData)
msg.setFlag("world", "ecryme-rolldata", this.rollData)
}
/* -------------------------------------------- */
async refreshDice() {
this.rollData.filter = "execution"
let content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-execution").html(content)
this.rollData.filter = "preservation"
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-preservation").html(content)
this.rollData.filter = "mainpool"
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
$("#confront-dice-pool").html(content)
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-bonus-pool").html(content)
}
/* -------------------------------------------- */
async refreshDialog() {
const content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs", this.rollData)
this.data.content = content
this.render(true)
let button = this.buttonDisabled
setTimeout(function () { $(".launchConfront").attr("disabled", button) }, 180)
}
/* ------------------ -------------------------- */
_canDragStart(selector) {
console.log("CAN DRAG START", selector, super._canDragStart(selector) )
return true
}
_canDragDrop(selector) {
console.log("CAN DRAG DROP", selector, super._canDragDrop(selector) )
return true
}
/* ------------------ -------------------------- */
_onDragStart(event) {
console.log("DRAGSTART::::", event)
super._onDragStart(event)
let dragType = $(event.srcElement).data("drag-type")
let diceData = {}
console.log("DRAGTYPE", dragType)
if (dragType == "dice") {
const target = event.target
const dragType = target.dataset.dragType
let diceData
if (dragType === "dice") {
diceData = {
dragType: "dice",
diceIndex: $(event.srcElement).data("dice-idx"),
diceValue: $(event.srcElement).data("dice-value"),
dragType: "dice",
diceIndex: target.dataset.diceIdx,
diceValue: target.dataset.diceValue,
}
} else {
diceData = {
dragType: "bonus",
bonusIndex: $(event.srcElement).data("bonus-idx"),
bonusValue: 1
dragType: "bonus",
bonusIndex: target.dataset.bonusIdx,
bonusValue: 1,
}
}
event.dataTransfer.setData("text/plain", JSON.stringify(diceData));
event.dataTransfer.setData("text/plain", JSON.stringify(diceData))
}
/* -------------------------------------------- */
_onDragOver(event) {
event.preventDefault()
}
/* -------------------------------------------- */
_onDrop(event) {
let dataJSON = event.dataTransfer.getData('text/plain')
let data = JSON.parse(dataJSON)
if ( data.dragType == "dice") {
let idx = Number(data.diceIndex)
console.log("DATA", data, event, event.srcElement.className)
if (event.srcElement.className.includes("execution") &&
this.rollData.availableDices.filter(d => d.location == "execution").length < 2) {
let data
try { data = JSON.parse(event.dataTransfer.getData("text/plain")) }
catch (e) { return }
// Walk up the DOM to find a meaningful drop area
const executionArea = event.target.closest('.confront-execution-area')
const preservationArea = event.target.closest('.confront-preservation-area')
const diceList = event.target.closest('.confrontation-dice-list')
const bonusList = event.target.closest('.confrontation-bonus-list')
if (data.dragType === "dice") {
const idx = Number(data.diceIndex)
if (executionArea && this.rollData.availableDices.filter(d => d.location === "execution").length < 2) {
this.rollData.availableDices[idx].location = "execution"
}
if (event.srcElement.className.includes("preservation") &&
this.rollData.availableDices.filter(d => d.location == "preservation").length < 2) {
} else if (preservationArea && this.rollData.availableDices.filter(d => d.location === "preservation").length < 2) {
this.rollData.availableDices[idx].location = "preservation"
}
if (event.srcElement.className.includes("dice-list")) {
} else if (diceList) {
this.rollData.availableDices[idx].location = "mainpool"
}
if (this.rollData.availableDices.filter(d => d.location == "execution").length == 2 && this.rollData.availableDices.filter(d => d.location == "preservation").length == 2) {
this.buttonDisabled = false
} else {
this.buttonDisabled = true
}
} else {
let idx = Number(data.bonusIndex)
if (event.srcElement.className.includes("execution")) {
this.rollData.confrontBonus[idx].location = "execution"
}
if (event.srcElement.className.includes("preservation")) {
this.rollData.confrontBonus[idx].location = "preservation"
}
if (event.srcElement.className.includes("bonus-list")) {
this.rollData.confrontBonus[idx].location = "mainpool"
}
const execCount = this.rollData.availableDices.filter(d => d.location === "execution").length
const presCount = this.rollData.availableDices.filter(d => d.location === "preservation").length
this.buttonDisabled = !(execCount === 2 && presCount === 2)
} else if (data.dragType === "bonus") {
const idx = Number(data.bonusIndex)
if (executionArea) this.rollData.confrontBonus[idx].location = "execution"
else if (preservationArea) this.rollData.confrontBonus[idx].location = "preservation"
else if (bonusList) this.rollData.confrontBonus[idx].location = "mainpool"
}
// Manage total values
this.computeTotals()
}
// #endregion
/* -------------------------------------------- */
processTranscendence() {
// Apply Transcend if needed
if (this.rollData.skillTranscendence > 0) {
if (this.rollData.applyTranscendence == "execution") {
this.rollData.executionTotal += Number(this.rollData.skillTranscendence)
if (this.rollData.applyTranscendence === "execution") {
this.rollData.executionTotal += Number(this.rollData.skillTranscendence)
} else {
this.rollData.preservationTotal += Number(this.rollData.skillTranscendence)
}
@@ -172,94 +195,78 @@ export class EcrymeConfrontDialog extends Dialog {
/* -------------------------------------------- */
computeTotals() {
let rollData = this.rollData
let actor = game.actors.get(rollData.actorId)
const rollData = this.rollData
const actor = game.actors.get(rollData.actorId)
rollData.executionTotal = rollData.availableDices.filter(d => d.location == "execution").reduce((previous, current) => {
return previous + current.result
}, rollData.skill.value)
rollData.executionTotal = rollData.confrontBonus.filter(d => d.location == "execution").reduce((previous, current) => {
return previous + 1
}, rollData.executionTotal)
rollData.executionTotal = rollData.availableDices
.filter(d => d.location === "execution")
.reduce((acc, d) => acc + d.result, rollData.skill.value)
rollData.executionTotal = rollData.confrontBonus
.filter(d => d.location === "execution")
.reduce((acc) => acc + 1, rollData.executionTotal)
rollData.preservationTotal = rollData.availableDices.filter(d => d.location == "preservation").reduce((previous, current) => {
return previous + current.result
}, rollData.skill.value)
rollData.preservationTotal = rollData.confrontBonus.filter(d => d.location == "preservation").reduce((previous, current) => {
return previous + 1
}, rollData.preservationTotal)
rollData.preservationTotal = rollData.availableDices
.filter(d => d.location === "preservation")
.reduce((acc, d) => acc + d.result, rollData.skill.value)
rollData.preservationTotal = rollData.confrontBonus
.filter(d => d.location === "preservation")
.reduce((acc) => acc + 1, rollData.preservationTotal)
this.processTranscendence()
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
// Specialization
if (rollData.selectedSpecs?.length > 0) {
rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.specApplied = true
rollData.executionTotal += 2
rollData.executionTotal += 2
rollData.preservationTotal += 2
}
if ( rollData.specApplied && rollData.selectedSpecs.length == 0) {
rollData.spec = undefined
if (rollData.specApplied && rollData.selectedSpecs?.length === 0) {
rollData.spec = undefined
rollData.specApplied = false
}
// Traits bonus/malus
rollData.bonusMalusTraits = 0
for (let t of rollData.traitsBonus) {
t.activated = false
for (const t of rollData.traitsBonus) t.activated = false
for (const t of rollData.traitsMalus) t.activated = false
for (const id of (rollData.traitsBonusSelected ?? [])) {
const trait = rollData.traitsBonus.find(t => t._id === id)
if (trait) { trait.activated = true; rollData.bonusMalusTraits += Number(trait.system.level) }
}
for (let t of rollData.traitsMalus) {
t.activated = false
}
if (rollData.traitsBonusSelected && rollData.traitsBonusSelected.length > 0) {
for (let id of rollData.traitsBonusSelected) {
let trait = rollData.traitsBonus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits += Number(trait.system.level)
}
}
if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) {
for (let id of rollData.traitsMalusSelected) {
let trait = rollData.traitsMalus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits -= Number(trait.system.level)
}
for (const id of (rollData.traitsMalusSelected ?? [])) {
const trait = rollData.traitsMalus.find(t => t._id === id)
if (trait) { trait.activated = true; rollData.bonusMalusTraits -= Number(trait.system.level) }
}
rollData.executionTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
rollData.executionTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
rollData.preservationTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
this.refreshDialog()
this.render()
}
/* -------------------------------------------- */
activateListeners(html) {
super.activateListeners(html);
html.find('#bonusMalusPerso').change((event) => {
this.rollData.bonusMalusPerso = event.currentTarget.value
this.computeTotals()
async launchConfront() {
const msg = await EcrymeUtility.createChatMessage(this.rollData.alias, "blindroll", {
content: await foundry.applications.handlebars.renderTemplate(
`systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs`, this.rollData
),
})
html.find('#roll-specialization').change((event) => {
this.rollData.selectedSpecs = $('#roll-specialization').val()
this.computeTotals()
EcrymeUtility.blindMessageToGM({
rollData: this.rollData,
template: "systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs",
})
html.find('#roll-trait-bonus').change((event) => {
this.rollData.traitsBonusSelected = $('#roll-trait-bonus').val()
this.computeTotals()
})
html.find('#roll-trait-malus').change((event) => {
this.rollData.traitsMalusSelected = $('#roll-trait-malus').val()
this.computeTotals()
})
html.find('#roll-select-transcendence').change((event) => {
this.rollData.skillTranscendence = Number($('#roll-select-transcendence').val())
this.computeTotals()
})
html.find('#roll-apply-transcendence').change((event) => {
this.rollData.applyTranscendence = $('#roll-apply-transcendence').val()
this.computeTotals()
})
html.find('#annency-bonus').change((event) => {
this.rollData.annencyBonus = Number(event.currentTarget.value)
})
msg.setFlag("world", "ecryme-rolldata", this.rollData)
}
}
/* -------------------------------------------- */
static async #onLaunchConfront(event, target) {
await this.launchConfront()
this.close()
}
static #onCancel(event, target) {
this.close()
}
}

View File

@@ -1,77 +1,80 @@
import { EcrymeUtility } from "../common/ecryme-utility.js";
import { EcrymeConfrontDialog } from "./ecryme-confront-dialog.js";
export class EcrymeConfrontStartDialog extends Dialog {
const { HandlebarsApplicationMixin } = foundry.applications.api
/**
* Confrontation start dialog — Application V2 version.
* Player picks which dice formula to roll (normal / spleen / ideal),
* the dice are rolled and the main EcrymeConfrontDialog is opened.
*/
export class EcrymeConfrontStartDialog extends HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2) {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["fvtt-ecryme", "ecryme-confront-start-dialog"],
position: { width: 540 },
window: { title: "ECRY.ui.confront" },
actions: {
rollNormal: EcrymeConfrontStartDialog.#onRollNormal,
rollSpleen: EcrymeConfrontStartDialog.#onRollSpleen,
rollIdeal: EcrymeConfrontStartDialog.#onRollIdeal,
cancel: EcrymeConfrontStartDialog.#onCancel,
},
}
/** @override */
static PARTS = {
content: { template: "systems/fvtt-ecryme/templates/dialogs/confront-start-dialog.hbs" },
}
/* -------------------------------------------- */
constructor(actor, rollData, options = {}) {
super(options)
this.actor = actor?.token?.actor ?? actor
this.rollData = rollData
}
/* -------------------------------------------- */
static async create(actor, rollData) {
if (!actor) throw new Error("Ecryme | No actor provided for confront dialog");
if (!rollData) throw new Error("Ecryme | No roll data provided for confront dialog");
if (actor?.token) rollData.tokenId = actor.token.id;
let options = { classes: ["fvtt-ecryme ecryme-confront-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-start-dialog.hbs', rollData);
return new EcrymeConfrontStartDialog(actor, rollData, html, options);
if (!actor) throw new Error("Ecryme | No actor provided for confront dialog")
if (!rollData) throw new Error("Ecryme | No roll data provided for confront dialog")
if (actor?.token) rollData.tokenId = actor.token.id
return new EcrymeConfrontStartDialog(actor, rollData)
}
/* -------------------------------------------- */
constructor(actor, rollData, html, options, close = undefined) {
let conf = {
title: game.i18n.localize("ECRY.ui.confront"),
content: html,
buttons: {
rollNormal: {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("ECRY.ui.rollnormal"),
callback: () => { this.rollConfront("4d6") }
},
rollSpleen: {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("ECRY.ui.rollspleen"),
callback: () => { this.rollConfront("5d6kl4") }
},
rollIdeal: {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("ECRY.ui.rollideal"),
callback: () => { this.rollConfront("5d6kh4") }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: game.i18n.localize("ECRY.ui.cancel"),
callback: () => { this.close() }
}
},
close: close
async _prepareContext() {
return {
...this.rollData,
config: game.system.ecryme.config,
}
super(conf, options);
this.actor = actor?.token?.actor || actor;
this.rollData = rollData;
}
/* -------------------------------------------- */
async rollConfront(diceFormula) {
// Do the initial roll
let myRoll = await new Roll(diceFormula).roll()
async #rollConfront(diceFormula) {
const myRoll = await new Roll(diceFormula).roll()
await EcrymeUtility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
// Fill the available dice table
let rollData = this.rollData
const rollData = this.rollData
rollData.roll = foundry.utils.duplicate(myRoll)
rollData.availableDices = []
for (let result of myRoll.terms[0].results) {
for (const result of myRoll.terms[0].results) {
if (!result.discarded) {
let resultDup = foundry.utils.duplicate(result)
resultDup.location = "mainpool"
rollData.availableDices.push(resultDup)
const dup = foundry.utils.duplicate(result)
dup.location = "mainpool"
rollData.availableDices.push(dup)
}
}
let confrontDialog = await EcrymeConfrontDialog.create(this.actor, rollData)
const confrontDialog = await EcrymeConfrontDialog.create(this.actor, rollData)
confrontDialog.render(true)
this.close()
}
/* -------------------------------------------- */
activateListeners(html) {
super.activateListeners(html);
}
}
static async #onRollNormal(event, target) { await this.#rollConfront("4d6") }
static async #onRollSpleen(event, target) { await this.#rollConfront("5d6kl4") }
static async #onRollIdeal(event, target) { await this.#rollConfront("5d6kh4") }
static #onCancel(event, target) { this.close() }
}

View File

@@ -1,86 +1,78 @@
import { EcrymeUtility } from "../common/ecryme-utility.js";
export class EcrymeRollDialog extends Dialog {
const { HandlebarsApplicationMixin } = foundry.applications.api
/**
* Roll dialog — Application V2 version.
* Reads all form values at roll time (no live tracking needed).
*/
export class EcrymeRollDialog extends HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2) {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["fvtt-ecryme", "ecryme-roll-dialog"],
position: { width: 540 },
window: { title: "ECRY.ui.rolltitle" },
actions: {
roll: EcrymeRollDialog.#onRoll,
cancel: EcrymeRollDialog.#onCancel,
},
}
/** @override */
static PARTS = {
content: { template: "systems/fvtt-ecryme/templates/dialogs/roll-dialog-generic.hbs" },
}
/* -------------------------------------------- */
constructor(actor, rollData, options = {}) {
super(options)
this.actor = actor
this.rollData = rollData
}
/* -------------------------------------------- */
static async create(actor, rollData) {
let options = { classes: ["ecryme-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/dialogs/roll-dialog-generic.hbs', rollData);
return new EcrymeRollDialog(actor, rollData, html, options);
return new EcrymeRollDialog(actor, rollData)
}
/* -------------------------------------------- */
constructor(actor, rollData, html, options, close = undefined) {
let conf = {
title: game.i18n.localize("ECRY.ui.rolltitle"),
content: html,
buttons: {
roll: {
icon: '<i class="fas fa-check"></i>',
label: game.i18n.localize("ECRY.ui.roll"),
callback: () => { this.roll() }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: game.i18n.localize("ECRY.ui.cancel"),
callback: () => { this.close() }
}
},
close: close
async _prepareContext() {
return {
...this.rollData,
config: game.system.ecryme.config,
}
super(conf, options);
this.actor = actor;
this.rollData = rollData;
}
/* -------------------------------------------- */
roll() {
/** Read all form values at roll time, then execute. */
static #onRoll(event, target) {
const el = this.element
const bonusEl = el.querySelector('#bonusMalusPerso')
const diffEl = el.querySelector('#roll-difficulty')
const specEl = el.querySelector('#roll-specialization')
const traitBonusEl = el.querySelector('#roll-trait-bonus')
const traitMalusEl = el.querySelector('#roll-trait-malus')
const transcEl = el.querySelector('#roll-select-transcendence')
const spleenEl = el.querySelector('#roll-use-spleen')
const idealEl = el.querySelector('#roll-use-ideal')
if (bonusEl) this.rollData.bonusMalusPerso = Number(bonusEl.value)
if (diffEl) this.rollData.difficulty = Number(diffEl.value) || 0
if (specEl) this.rollData.selectedSpecs = Array.from(specEl.selectedOptions).map(o => o.value)
if (traitBonusEl) this.rollData.traitsBonus = Array.from(traitBonusEl.selectedOptions).map(o => o.value)
if (traitMalusEl) this.rollData.traitsMalus = Array.from(traitMalusEl.selectedOptions).map(o => o.value)
if (transcEl) this.rollData.skillTranscendence = Number(transcEl.value)
if (spleenEl) this.rollData.useSpleen = spleenEl.checked
if (idealEl) this.rollData.useIdeal = idealEl.checked
EcrymeUtility.rollEcryme(this.rollData)
this.close()
}
/* -------------------------------------------- */
async refreshDialog() {
const content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/roll-dialog-generic.hbs", this.rollData)
this.data.content = content
this.render(true)
static #onCancel(event, target) {
this.close()
}
/* -------------------------------------------- */
activateListeners(html) {
super.activateListeners(html);
function onLoad() {
}
$(function () { onLoad(); });
html.find('#bonusMalusPerso').change((event) => {
console.log("DIFF", event.currentTarget.value)
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
})
html.find('#roll-difficulty').change((event) => {
this.rollData.difficulty = Number(event.currentTarget.value) || 0
})
html.find('#roll-specialization').change((event) => {
this.rollData.selectedSpecs = $('#roll-specialization').val()
})
html.find('#roll-trait-bonus').change((event) => {
this.rollData.traitsBonus = $('#roll-trait-bonus').val()
})
html.find('#roll-trait-malus').change((event) => {
this.rollData.traitsMalus = $('#roll-trait-malus').val()
})
html.find('#roll-select-transcendence').change((event) => {
this.rollData.skillTranscendence = Number($('#roll-select-transcendence').val())
})
html.find('#roll-use-spleen').change((event) => {
this.rollData.useSpleen = event.currentTarget.checked
})
html.find('#roll-use-ideal').change((event) => {
this.rollData.useIdeal = event.currentTarget.checked
})
}
}
}