diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index f3ee3685..49db18cb 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -217,7 +217,7 @@ export default class D20Roll extends DHRoll { results: d.results }; }); - data.modifierTotal = this.calculateTotalModifiers(roll); + data.modifierTotal = roll.modifierTotal; return data; } diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index dd09afcd..e4a34bd4 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -12,6 +12,10 @@ export default class DHRoll extends Roll { return game.i18n.localize('DAGGERHEART.GENERAL.Roll.basic'); } + get modifierTotal() { + return this.constructor.calculateTotalModifiers(this); + } + static messageType = 'adversaryRoll'; static CHAT_TEMPLATE = 'systems/daggerheart/templates/ui/chat/roll.hbs'; @@ -242,16 +246,21 @@ export default class DHRoll extends Roll { return (this._formula = this.constructor.getFormula(this.terms)); } + /** + * Calculate total modifiers of any rolls, including non-dh rolls. + * This exists because damage rolls still may receive base roll classes + */ static calculateTotalModifiers(roll) { let modifierTotal = 0; for (let i = 0; i < roll.terms.length; i++) { - if ( - roll.terms[i] instanceof foundry.dice.terms.NumericTerm && - !!roll.terms[i - 1] && - roll.terms[i - 1] instanceof foundry.dice.terms.OperatorTerm - ) - modifierTotal += Number(`${roll.terms[i - 1].operator}${roll.terms[i].total}`); + if (!roll.terms[i].isDeterministic) continue; + const termTotal = roll.terms[i].total; + if (typeof termTotal === 'number') { + const multiplier = roll.terms[i - 1]?.operator === " - " ? -1 : 1; + modifierTotal += multiplier * termTotal; + } } + return modifierTotal; } diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index a6944a56..3e827ab7 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -72,21 +72,6 @@ export default class DualityRoll extends D20Roll { return this.dice.filter(x => ![DualityDie, AdvantageDie, DisadvantageDie].some(die => x instanceof die)); } - /* This isn't fullproof, but trying to cover parathetical situations is ridiculously complex */ - get modifierTotal() { - let modifierTotal = 0; - for (let i = 0; i < this.terms.length; i++) { - if ( - this.terms[i] instanceof foundry.dice.terms.NumericTerm && - !!this.terms[i - 1] && - this.terms[i - 1] instanceof foundry.dice.terms.OperatorTerm - ) - modifierTotal += Number(`${this.terms[i - 1].operator}${this.terms[i].total}`); - } - - return modifierTotal; - } - setRallyChoices() { return this.data?.parent?.appliedEffects.reduce((a, c) => { const change = c.system.changes.find(ch => ch.key === 'system.bonuses.rally');