From 9473250f0c80a3b410021b69002ceec60ffcf5d3 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Tue, 13 Jan 2026 20:47:43 +0100 Subject: [PATCH 1/2] Fixed critical threshold applying to reactions --- module/data/fields/action/rollField.mjs | 2 +- module/dice/d20Roll.mjs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/module/data/fields/action/rollField.mjs b/module/data/fields/action/rollField.mjs index e2196c1c..63d48990 100644 --- a/module/data/fields/action/rollField.mjs +++ b/module/data/fields/action/rollField.mjs @@ -87,7 +87,7 @@ export class DHActionRollData extends foundry.abstract.DataModel { if (this.type === CONFIG.DH.GENERAL.rollTypes.attack.id) modifiers.push({ label: 'Bonus to Hit', - value: this.bonus ?? this.parent.actor.system.attack.roll.bonus + value: this.bonus ?? this.parent.actor.system.attack.roll.bonus ?? 0 }); break; default: diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index f679d725..3ddd8027 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -35,7 +35,9 @@ export default class D20Roll extends DHRoll { get isCritical() { if (!this.d20._evaluated) return; - return this.d20.total >= this.data.system.criticalThreshold; + + const criticalThreshold = this.options.actionType === 'reaction' ? 20 : this.data.system.criticalThreshold; + return this.d20.total >= criticalThreshold; } get hasAdvantage() { From acafd2c8b923a543a0ef90504280e7ee261b6771 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Tue, 13 Jan 2026 21:00:24 +0100 Subject: [PATCH 2/2] Added fallback for defaultHopeDice and defaultFearDice --- module/dice/dualityRoll.mjs | 10 ++++++---- module/enrichers/DualityRollEnricher.mjs | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 155d6aa5..32bb167a 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -131,11 +131,13 @@ export default class DualityRoll extends D20Roll { return; } - const { defaultHopeDice, defaultFearDice } = this.data.rules.dualityRoll; - - this.terms[0] = new foundry.dice.terms.Die({ faces: defaultHopeDice }); + this.terms[0] = new foundry.dice.terms.Die({ + faces: this.data.rules.dualityRoll?.defaultHopeDice ?? 12 + }); this.terms[1] = new foundry.dice.terms.OperatorTerm({ operator: '+' }); - this.terms[2] = new foundry.dice.terms.Die({ faces: defaultFearDice }); + this.terms[2] = new foundry.dice.terms.Die({ + faces: this.data.rules.dualityRoll?.defaultFearDice ?? 12 + }); } applyAdvantage() { diff --git a/module/enrichers/DualityRollEnricher.mjs b/module/enrichers/DualityRollEnricher.mjs index 1d6404ff..95733c45 100644 --- a/module/enrichers/DualityRollEnricher.mjs +++ b/module/enrichers/DualityRollEnricher.mjs @@ -101,7 +101,7 @@ export const enrichedDualityRoll = async ( await target.diceRoll(config); } else { // For no target, call DualityRoll directly with basic data - config.data = { experiences: {}, traits: {} }; + config.data = { experiences: {}, traits: {}, rules: {} }; config.source = { actor: null }; await CONFIG.Dice.daggerheart.DualityRoll.build(config); }