diff --git a/lang/en.json b/lang/en.json index bc0cf05a..bb611d84 100755 --- a/lang/en.json +++ b/lang/en.json @@ -236,6 +236,8 @@ }, "defaultHopeDice": "Default Hope Dice", "defaultFearDice": "Default Fear Dice", + "defaultAdvantageDice": "Default Advantage Dice", + "defaultDisadvantageDice": "Default Disadvantage Dice", "disadvantageSources": { "label": "Disadvantage Sources", "hint": "Add single words or short text as reminders and hints of what a character has disadvantage on." diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 64fa168a..987cfeb1 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -123,6 +123,10 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.advantage = this.config.roll?.advantage; context.disadvantage = this.config.roll?.disadvantage; context.diceOptions = CONFIG.DH.GENERAL.diceTypes; + context.diceFaces = CONFIG.DH.GENERAL.dieFaces.reduce((acc, face) => { + acc[face] = `d${face}`; + return acc; + }, {}); context.isLite = this.config.roll?.lite; context.extraFormula = this.config.extraFormula; context.formula = this.roll.constructFormula(this.config); @@ -153,7 +157,10 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio if (this.config.uses) this.config.uses = foundry.utils.mergeObject(this.config.uses, rest.uses); if (rest.roll?.dice) { Object.entries(rest.roll.dice).forEach(([key, value]) => { - this.roll[key] = value; + if(key === 'advantageFaces') + this.roll[key] = Number.parseInt(value); + else + this.roll[key] = value; }); } if (rest.hasOwnProperty('trait')) { @@ -173,6 +180,16 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio this.disadvantage = advantage === -1; this.config.roll.advantage = this.config.roll.advantage === advantage ? 0 : advantage; + + if(this.config.roll.advantage === 1 && this.config.data.rules.roll.defaultAdvantageDice) { + const faces = Number.parseInt(this.config.data.rules.roll.defaultAdvantageDice); + this.roll.advantageFaces = Number.isNaN(faces) ? this.roll.advantageFaces : faces; + } + else if(this.config.roll.advantage === -1 && this.config.data.rules.roll.defaultDisadvantageDice) { + const faces = Number.parseInt(this.config.data.rules.roll.defaultDisadvantageDice); + this.roll.advantageFaces = Number.isNaN(faces) ? this.roll.advantageFaces : faces; + } + this.render(); } diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 61338344..e7f1bf8c 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -289,7 +289,23 @@ export default class DhCharacter extends DhCreature { guaranteedCritical: new fields.BooleanField({ label: 'DAGGERHEART.ACTORS.Character.roll.guaranteedCritical.label', hint: 'DAGGERHEART.ACTORS.Character.roll.guaranteedCritical.hint' - }) + }), + defaultAdvantageDice: new fields.NumberField({ + nullable: true, + required: true, + integer: true, + choices: CONFIG.DH.GENERAL.dieFaces, + initial: null, + label: 'DAGGERHEART.ACTORS.Character.defaultAdvantageDice' + }), + defaultDisadvantageDice: new fields.NumberField({ + nullable: true, + required: true, + integer: true, + choices: CONFIG.DH.GENERAL.dieFaces, + initial: null, + label: 'DAGGERHEART.ACTORS.Character.defaultDisadvantageDice' + }), }) }) }; diff --git a/module/data/actor/companion.mjs b/module/data/actor/companion.mjs index 81d0aa8a..6e87708a 100644 --- a/module/data/actor/companion.mjs +++ b/module/data/actor/companion.mjs @@ -61,6 +61,24 @@ export default class DhCompanion extends DhCreature { initial: false, label: 'DAGGERHEART.GENERAL.Rules.conditionImmunities.vulnerable' }) + }), + roll: new fields.SchemaField({ + defaultAdvantageDice: new fields.NumberField({ + nullable: true, + required: true, + integer: true, + choices: CONFIG.DH.GENERAL.dieFaces, + initial: null, + label: 'DAGGERHEART.ACTORS.Character.defaultAdvantageDice' + }), + defaultDisadvantageDice: new fields.NumberField({ + nullable: true, + required: true, + integer: true, + choices: CONFIG.DH.GENERAL.dieFaces, + initial: null, + label: 'DAGGERHEART.ACTORS.Character.defaultDisadvantageDice' + }), }) }), attack: new ActionField({ diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index f9a06d37..2448a16d 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -3,7 +3,6 @@ import D20Roll from './d20Roll.mjs'; import { parseRallyDice, setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs'; export default class DualityRoll extends D20Roll { - _advantageFaces = 6; _advantageNumber = 1; _rallyIndex; @@ -11,6 +10,9 @@ export default class DualityRoll extends D20Roll { super(formula, data, options); this.rallyChoices = this.setRallyChoices(); this.guaranteedCritical = options.guaranteedCritical; + + const advantageFaces = data.rules?.roll?.defaultAdvantageDice ? Number.parseInt(data.rules.roll.defaultAdvantageDice) : 6 + this.advantageFaces = Number.isNaN(advantageFaces) ? 6 : advantageFaces; } static messageType = 'dualityRoll'; @@ -51,14 +53,6 @@ export default class DualityRoll extends D20Roll { return this.dice[2] instanceof game.system.api.dice.diceTypes.DisadvantageDie ? this.dice[2] : null; } - get advantageFaces() { - return this._advantageFaces; - } - - set advantageFaces(faces) { - this._advantageFaces = this.getFaces(faces); - } - get advantageNumber() { return this._advantageNumber; } diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index 2deccaf2..6a28cdac 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -158,7 +158,7 @@ {{/times}} {{#if abilities}}