159 lines
5.1 KiB
JavaScript
159 lines
5.1 KiB
JavaScript
import { MournbladeUtility } from "../mournblade-utility.js"
|
|
|
|
/**
|
|
* Dialogue de jet de dé pour Mournblade - Version DialogV2
|
|
*/
|
|
export class MournbladeRollDialog {
|
|
|
|
/**
|
|
* Create and display the roll dialog
|
|
* @param {MournbladeActor} actor - The actor making the roll
|
|
* @param {Object} rollData - Data for the roll
|
|
* @returns {Promise<MournbladeRollDialog>}
|
|
*/
|
|
static async create(actor, rollData) {
|
|
// Préparer le contexte pour le template
|
|
const context = {
|
|
...rollData,
|
|
difficulte: String(rollData.difficulte || 0),
|
|
img: actor.img,
|
|
name: actor.name,
|
|
config: game.system.mournblade.config,
|
|
}
|
|
|
|
// Si attrKey est "tochoose", préparer la liste des attributs sélectionnables
|
|
if (rollData.attrKey === "tochoose") {
|
|
context.selectableAttributes = actor.system.attributs
|
|
}
|
|
|
|
// Rendre le template en HTML
|
|
const content = await foundry.applications.handlebars.renderTemplate(
|
|
"systems/fvtt-mournblade/templates/roll-dialog-v2.hbs",
|
|
context
|
|
)
|
|
|
|
// Utiliser DialogV2.wait avec le HTML rendu
|
|
return foundry.applications.api.DialogV2.wait({
|
|
window: { title: "Test de Capacité", icon: "fa-solid fa-dice-d20" },
|
|
classes: ["mournblade-roll-dialog"],
|
|
position: { width: 500 },
|
|
modal: false,
|
|
content,
|
|
buttons: [
|
|
{
|
|
action: "rolld10",
|
|
label: "Lancer 1d10",
|
|
icon: "fa-solid fa-dice-d10",
|
|
default: true,
|
|
callback: (event, button, dialog) => {
|
|
this._updateRollDataFromForm(rollData, button.form.elements, actor)
|
|
rollData.mainDice = "1d10"
|
|
MournbladeUtility.rollMournblade(rollData)
|
|
}
|
|
},
|
|
{
|
|
action: "rolld20",
|
|
label: "Lancer 1d20",
|
|
icon: "fa-solid fa-dice-d20",
|
|
callback: (event, button, dialog) => {
|
|
this._updateRollDataFromForm(rollData, button.form.elements, actor)
|
|
rollData.mainDice = "1d20"
|
|
MournbladeUtility.rollMournblade(rollData)
|
|
}
|
|
},
|
|
],
|
|
rejectClose: false,
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Mettre à jour rollData avec les valeurs du formulaire
|
|
* @param {Object} rollData - L'objet rollData à mettre à jour
|
|
* @param {HTMLFormControlsCollection} formElements - Les éléments du formulaire
|
|
* @param {MournbladeActor} actor - L'acteur pour récupérer les attributs
|
|
* @private
|
|
*/
|
|
static _updateRollDataFromForm(rollData, formElements, actor) {
|
|
// Attributs
|
|
if (formElements.attrKey) {
|
|
rollData.attrKey = formElements.attrKey.value
|
|
if (rollData.attrKey !== "tochoose" && actor) {
|
|
rollData.attr = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey])
|
|
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
|
|
}
|
|
}
|
|
|
|
// Modificateurs de base
|
|
if (formElements.difficulte) {
|
|
rollData.difficulte = Number(formElements.difficulte.value)
|
|
}
|
|
if (formElements.modificateur) {
|
|
rollData.modificateur = Number(formElements.modificateur.value)
|
|
}
|
|
|
|
// Runes
|
|
if (formElements.runemode) {
|
|
rollData.runemode = String(formElements.runemode.value)
|
|
}
|
|
if (formElements.runeame) {
|
|
rollData.runeame = Number(formElements.runeame.value)
|
|
}
|
|
|
|
// Combat mêlée
|
|
if (formElements.typeAttaque) {
|
|
rollData.typeAttaque = String(formElements.typeAttaque.value)
|
|
}
|
|
if (formElements.isMonte !== undefined) {
|
|
rollData.isMonte = formElements.isMonte.checked
|
|
}
|
|
|
|
// Combat distance
|
|
if (formElements.visee !== undefined) {
|
|
rollData.visee = formElements.visee.checked
|
|
}
|
|
if (formElements.cibleconsciente !== undefined) {
|
|
rollData.cibleconsciente = formElements.cibleconsciente.checked
|
|
}
|
|
if (formElements.ciblecourt !== undefined) {
|
|
rollData.ciblecourt = formElements.ciblecourt.checked
|
|
}
|
|
if (formElements.typeCouvert) {
|
|
rollData.typeCouvert = String(formElements.typeCouvert.value)
|
|
}
|
|
|
|
// Désavantages
|
|
if (!rollData.desavantages) rollData.desavantages = {}
|
|
|
|
if (formElements.cibleausol !== undefined) {
|
|
rollData.desavantages.cibleausol = formElements.cibleausol.checked
|
|
}
|
|
if (formElements.cibledesarmee !== undefined) {
|
|
rollData.desavantages.cibledesarmee = formElements.cibledesarmee.checked
|
|
}
|
|
if (formElements.ciblerestreint !== undefined) {
|
|
rollData.desavantages.ciblerestreint = formElements.ciblerestreint.checked
|
|
}
|
|
if (formElements.cibleimmobilisée !== undefined) {
|
|
rollData.desavantages.cibleimmobilisée = formElements.cibleimmobilisée.checked
|
|
}
|
|
if (formElements.ciblesurplomb !== undefined) {
|
|
rollData.desavantages.ciblesurplomb = formElements.ciblesurplomb.checked
|
|
}
|
|
|
|
// Double D20
|
|
if (formElements.doubleD20 !== undefined) {
|
|
rollData.doubleD20 = formElements.doubleD20.checked
|
|
}
|
|
|
|
// Modifiers
|
|
if (rollData.modifiers) {
|
|
rollData.modifiers.forEach((modifier, idx) => {
|
|
const checkbox = formElements[`apply-modifier-${idx}`]
|
|
if (checkbox) {
|
|
modifier.system.apply = checkbox.checked
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|