diff --git a/system/lang/en-en.json b/system/lang/en-en.json index 5837f76..cfa08d6 100644 --- a/system/lang/en-en.json +++ b/system/lang/en-en.json @@ -88,7 +88,8 @@ "strives": "Strives", "difficulty": "TN", "difficulty_hidden": "TN ???", - "dicepicker": "Dice Picker" + "dicepicker": "Dice Picker", + "void_point_used": "Void point used" }, "dicepicker": { "difficulty_title": "Difficulty", diff --git a/system/lang/es-es.json b/system/lang/es-es.json index fffb65d..2cb4424 100644 --- a/system/lang/es-es.json +++ b/system/lang/es-es.json @@ -88,7 +88,8 @@ "strives": "Strives", "difficulty": "TN", "difficulty_hidden": "TN ???", - "dicepicker": "Dice Picker" + "dicepicker": "Dice Picker", + "void_point_used": "Void point used" }, "dicepicker": { "difficulty_title": "Difficulty", diff --git a/system/lang/fr-fr.json b/system/lang/fr-fr.json index cc7ff3d..3ca0f06 100644 --- a/system/lang/fr-fr.json +++ b/system/lang/fr-fr.json @@ -88,7 +88,8 @@ "strives": "Conflits", "difficulty": "ND", "difficulty_hidden": "ND ???", - "dicepicker": "Dice Picker" + "dicepicker": "Dice Picker", + "void_point_used": "Point de vide utilisé" }, "dicepicker": { "difficulty_title": "Difficulté", diff --git a/system/scripts/actors/twenty-questions-dialog.js b/system/scripts/actors/twenty-questions-dialog.js index f887c8b..8f64e44 100644 --- a/system/scripts/actors/twenty-questions-dialog.js +++ b/system/scripts/actors/twenty-questions-dialog.js @@ -160,6 +160,7 @@ export class TwentyQuestionsDialog extends FormApplication { // Heritage Roll (step 18) html.find(".inline-roll").on("click", (event) => { + event.preventDefault(); event.stopPropagation(); const diceRoll = $(event.currentTarget); const stepKey = diceRoll.data("step"); diff --git a/system/scripts/dice/dice-picker-dialog.js b/system/scripts/dice/dice-picker-dialog.js index 22eb6e6..b2847ff 100644 --- a/system/scripts/dice/dice-picker-dialog.js +++ b/system/scripts/dice/dice-picker-dialog.js @@ -11,26 +11,25 @@ export class DicePickerDialog extends FormApplication { _actor = null; /** - * Preset ring (attribute / approach) + * Payload Object */ - _ringId = null; - - /** - * Preset Skill (and data from actor if actor provided) - */ - _skillData = { - id: "", - value: 0, - cat: "", - name: "", - }; - - /** - * Difficulty - */ - _difficulty = { - difficulty: 2, - isHidden: false, + object = { + ring: { + id: null, + value: 1, + }, + skill: { + id: "", + value: 0, + default_value: 0, + cat: "", + name: "", + }, + difficulty: { + value: 2, + hidden: false, + }, + useVoidPoint: false, }; /** @@ -133,7 +132,13 @@ export class DicePickerDialog extends FormApplication { * @param actor */ set actor(actor) { - this._actor = actor instanceof Actor && actor.owner ? actor : null; + if (!actor || !(actor instanceof Actor) || !actor.owner) { + return; + } + this._actor = actor; + if (this.object.ring.id === null) { + this.ringId = this._actor.data.data.stance; + } } /** @@ -141,7 +146,7 @@ export class DicePickerDialog extends FormApplication { * @param ringId */ set ringId(ringId) { - this._ringId = CONFIG.l5r5e.stances.includes(ringId) || null; + this.object.ring.id = CONFIG.l5r5e.stances.includes(ringId) ? ringId : "void"; } /** @@ -153,7 +158,7 @@ export class DicePickerDialog extends FormApplication { return; } - this._skillData = { + this.object.skill = { id: skillId.toLowerCase().trim(), value: 0, cat: "", @@ -172,11 +177,11 @@ export class DicePickerDialog extends FormApplication { return; } - this._skillData = { - ...this._skillData, + this.object.skill = { + ...this.object.skill, value: 0, cat: skillCatId.toLowerCase().trim(), - name: game.i18n.localize("l5r5e.skills." + skillCatId + "." + (this._skillData.id || "title")), + name: game.i18n.localize("l5r5e.skills." + skillCatId + "." + (this.object.skill.id || "title")), }; if (!this._actor) { @@ -184,12 +189,14 @@ export class DicePickerDialog extends FormApplication { } switch (this._actor.data.type) { case "character": - this._skillData.value = this._actor.data.data.skills[skillCatId]?.[this._skillData.id] || 0; + this.object.skill.value = this._actor.data.data.skills[skillCatId]?.[this.object.skill.id] || 0; + this.object.skill.default_value = this.object.skill.value; break; case "npc": // Skill value is in categories for npc - this._skillData.value = this._actor.data.data.skills[skillCatId] || 0; + this.object.skill.value = this._actor.data.data.skills[skillCatId] || 0; + this.object.skill.default_value = this.object.skill.value; break; } } @@ -201,9 +208,9 @@ export class DicePickerDialog extends FormApplication { set difficulty(difficulty) { difficulty = parseInt(difficulty) || null; if (difficulty < 0) { - difficulty = null; + difficulty = 2; } - this._difficulty.difficulty = difficulty; + this.object.difficulty.value = difficulty; } /** @@ -211,7 +218,7 @@ export class DicePickerDialog extends FormApplication { * @param isHidden */ set difficultyHidden(isHidden) { - this._difficulty.isHidden = !!isHidden; + this.object.difficulty.hidden = !!isHidden; } /** @@ -231,12 +238,11 @@ export class DicePickerDialog extends FormApplication { return { ...super.getData(options), ringsList: game.l5r5e.HelpersL5r5e.getRingsList(this._actor), - dicesList: [0, 1, 2, 3, 4, 5, 6], - skillData: this._skillData, + data: this.object, actor: this._actor, actorIsPc: !this._actor || this._actor.data?.type === "character", - difficulty: this._difficulty, - canUseVoidPoint: !this._actor || this._actor.data.data.void_points.value > 0, + canUseVoidPoint: + this.object.difficulty.hidden || !this._actor || this._actor.data.data.void_points.value > 0, }; } @@ -265,88 +271,55 @@ export class DicePickerDialog extends FormApplication { activateListeners(html) { super.activateListeners(html); - // On change approaches + // Select Ring html.find('input[name="approach"]').on("click", async (event) => { - $("#ring_value").val(event.target.value); - $(".ring-selection").removeClass("ring-selected"); - $("." + event.target.dataset.ringid).addClass("ring-selected"); - $("#stance_label").html( - game.i18n.localize("l5r5e.skills." + this._skillData.cat + "." + event.target.dataset.ringid) - ); + this.object.ring.id = event.target.dataset.ringid; + this.object.ring.value = event.target.value; + this.render(false); }); - // ****************** DIFF ****************** - // Difficulty - Add button - html.find("#diff_add").on("click", async (event) => { + // Quantity change for difficulty, ring and skill + html.find(".quantity").on("click", async (event) => { event.preventDefault(); event.stopPropagation(); - this._difficulty.difficulty = this._quantityChange("#diff_value", 1); + const data = $(event.currentTarget); + this._quantityChange(data.data("item"), data.data("value")); + this.render(false); }); - // Difficulty - Subtract button - html.find("#diff_sub").on("click", async (event) => { - event.preventDefault(); - event.stopPropagation(); - this._difficulty.difficulty = this._quantityChange("#diff_value", -1); - }); - - // Difficulty - hidden checkbox - html.find("#diff_hidden").on("click", async (event) => { - this._difficulty.isHidden = !this._difficulty.isHidden; - $("#difficulty_picker").toggle(); - }); - - // ****************** RING ****************** - // Ring - Add button - html.find("#ring_add").on("click", async (event) => { - event.preventDefault(); - event.stopPropagation(); - this._quantityChange("#ring_value", 1); - }); - - // Ring - Subtract button - html.find("#ring_sub").on("click", async (event) => { - event.preventDefault(); - event.stopPropagation(); - this._quantityChange("#ring_value", -1); - }); - - // Ring - Spend a Void point checkbox - html.find("#use_void_point").on("click", async (event) => { - this._quantityChange("#ring_value", event.target.checked ? 1 : -1); - html.find("#use_void_point").attr("checked", event.target.checked); - }); - - // ****************** SKILL ****************** - // Skill - Add button - html.find("#skill_add").on("click", async (event) => { - event.preventDefault(); - event.stopPropagation(); - this._quantityChange("#skill_value", 1); - }); - - // Skill - Subtract button - html.find("#skill_sub").on("click", async (event) => { - event.preventDefault(); - event.stopPropagation(); - this._quantityChange("#skill_value", -1); - }); - - // Skill - Default Dice div + // Click on the Default Skill Dice html.find("#skill_default_value").on("click", async (event) => { event.preventDefault(); event.stopPropagation(); - $("#skill_value").val(this._skillData.value); + this.object.skill.value = this.object.skill.default_value; + this.render(false); }); - // ****************** INIT ****************** - // Select current actor's stance - html.find(`.approach_${this._actor ? this._actor.data.data.stance : "void"}`) - .first() - .trigger("click"); + // Spend a Void point checkbox + html.find("#use_void_point").on("click", async (event) => { + event.preventDefault(); + event.stopPropagation(); + this.object.useVoidPoint = event.target.checked; + this._quantityChange("ring", this.object.useVoidPoint ? 1 : -1); + this.render(false); + }); - // Set skill point - html.find("#skill_value").val(this._skillData.value); + // Difficulty Hidden + html.find("#diff_hidden").on("click", async (event) => { + event.preventDefault(); + event.stopPropagation(); + this.object.difficulty.hidden = !this.object.difficulty.hidden; + if ( + this.object.useVoidPoint && + !this.object.difficulty.hidden && + !!this._actor && + this._actor.data.data.void_points.value < 1 + ) { + this.object.useVoidPoint = false; + this._quantityChange("ring", -1); + } + this.render(false); + }); } /** @@ -357,20 +330,16 @@ export class DicePickerDialog extends FormApplication { * @override */ async _updateObject(event, formData) { - const approach = $(".ring-selection.ring-selected > input").data("ringid") || null; - const ring = formData.ring || null; - const skill = formData.skill || null; - - if (!approach || !skill || !ring || (skill < 1 && ring < 1)) { + if (this.object.skill.value < 1 && this.object.ring.value < 1) { return false; } let formula = []; - if (ring > 0) { - formula.push(`${ring}dr`); + if (this.object.ring.value > 0) { + formula.push(`${this.object.ring.value}dr`); } - if (skill > 0) { - formula.push(`${skill}ds`); + if (this.object.skill.value > 0) { + formula.push(`${this.object.skill.value}ds`); } // Update Actor @@ -381,12 +350,12 @@ export class DicePickerDialog extends FormApplication { // actorData.stance = approach; // If hidden add 1 void pt - if (this._difficulty.isHidden) { + if (this.object.difficulty.hidden) { actorData.void_points.value = Math.min(actorData.void_points.value + 1, actorData.void_points.max); } // If Void point is used, minus the actor - if (formData.use_void_point) { + if (this.object.useVoidPoint) { actorData.void_points.value = Math.max(actorData.void_points.value - 1, 0); } @@ -400,11 +369,12 @@ export class DicePickerDialog extends FormApplication { const roll = await new RollL5r5e(formula.join("+")); roll.actor = this._actor; - roll.l5r5e.stance = approach; - roll.l5r5e.skillId = this._skillData.id; - roll.l5r5e.skillCatId = this._skillData.cat; - roll.l5r5e.summary.difficulty = this._difficulty.difficulty; - roll.l5r5e.summary.difficultyHidden = this._difficulty.isHidden; + roll.l5r5e.stance = this.object.ring.id; + roll.l5r5e.skillId = this.object.skill.id; + roll.l5r5e.skillCatId = this.object.skill.cat; + roll.l5r5e.summary.difficulty = this.object.difficulty.value; + roll.l5r5e.summary.difficultyHidden = this.object.difficulty.hidden; + roll.l5r5e.summary.voidPointUsed = this.object.useVoidPoint; await roll.roll(); await roll.toMessage(); @@ -415,11 +385,8 @@ export class DicePickerDialog extends FormApplication { * Change quantity between 0-9 on the element, and return the new value * @private */ - _quantityChange(elmtSelector, add) { - const elmt = $(elmtSelector); - const value = Math.max(Math.min(parseInt(elmt.val()) + add, 9), 0); - elmt.val(value); - return value; + _quantityChange(element, add) { + this.object[element].value = Math.max(Math.min(parseInt(this.object[element].value) + add, 9), 0); } /** @@ -435,13 +402,13 @@ export class DicePickerDialog extends FormApplication { name = this._actor.name; } - if (this._skillData.id) { - params.skillId = this._skillData.id; - } else if (this._skillData.cat) { - params.skillCatId = this._skillData.cat; + if (this.object.skill.id) { + params.skillId = this.object.skill.id; + } else if (this.object.skill.cat) { + params.skillCatId = this.object.skill.cat; } - if (this._skillData.name) { - name = name + " - " + this._skillData.name; + if (this.object.skill.name) { + name = name + " - " + this.object.skill.name; } let command = `new game.l5r5e.DicePickerDialog(${JSON.stringify(params)}).render(true);`; diff --git a/system/scripts/dice/roll.js b/system/scripts/dice/roll.js index f39f8aa..c06a1d4 100644 --- a/system/scripts/dice/roll.js +++ b/system/scripts/dice/roll.js @@ -26,6 +26,7 @@ export class RollL5r5e extends Roll { explosive: 0, opportunity: 0, strife: 0, + voidPointUsed: false, }, }; diff --git a/system/templates/dice/chat-roll.html b/system/templates/dice/chat-roll.html index af0b1c9..31dfcc2 100644 --- a/system/templates/dice/chat-roll.html +++ b/system/templates/dice/chat-roll.html @@ -32,6 +32,9 @@ {{else}} {{localize 'l5r5e.chatdices.difficulty'}} {{l5r5e.summary.difficulty}} {{/if}} + {{#if l5r5e.summary.voidPointUsed}} +
+ {{/if}} diff --git a/system/templates/dice/dice-picker-dialog.html b/system/templates/dice/dice-picker-dialog.html index d74fbc2..bb4b8a7 100644 --- a/system/templates/dice/dice-picker-dialog.html +++ b/system/templates/dice/dice-picker-dialog.html @@ -1,6 +1,6 @@
- + {{!-- First line--}} - + {{!-- Second line--}} - + {{!-- Third line--}} - + {{!-- Fourth line--}}
{{#each ringsList}}
  • -
  • - {{#if skillData.name}} + {{#if data.skill.name}}
    - +
    {{#if actorIsPc}}
    - +
    {{/if}}
    - +
    1
    - {{skillData.value}} + {{data.skill.default_value}}
    {{else}} @@ -63,7 +63,7 @@
    {{localize "l5r5e.dicepicker.difficulty_title"}} @@ -76,80 +76,82 @@
    + {{^if data.difficulty.hidden}}
    - +
    1
    - +
    - +
    + {{/if}}
    - +
    1
    - +
    - +
    - +
    1
    - +
    - +
    {{#if canUseVoidPoint}} {{/if}}