From 7eae95cbbd7a8bce903fc149681ef13f07f886ae Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Sat, 13 Jun 2026 15:22:34 +0200 Subject: [PATCH] fix: use arcane spell defense D30 chart for spell saves Bug: saveSpell local var initialized to false (line 142), while dialog checkbox was pre-checked via dialogContext.saveSpell = game.lethalFantasy.spellDefense. If user didn't click the checkbox, D30 call used SAVING_THROWS chart instead of ARCANE_SPELL_DEFENSE. Also: game.lethalFantasy.spellDefense was set true before spell defense rolls but never cleared, leaking to subsequent non-spell saves. Fix: initialize saveSpell from the one-shot flag and delete it immediately. Dialog context now uses the local saveSpell variable instead of re-reading the deleted flag. --- module/documents/roll.mjs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index bd5d8dc..ec55385 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -139,7 +139,9 @@ export default class LethalFantasyRoll extends Roll { let hasGrantedDice = false let pointBlank = false let letItFly = false - let saveSpell = false + let saveSpell = game.lethalFantasy?.spellDefense ?? false + // Consume one-shot flag so it doesn't leak to subsequent non-spell saves + if (game.lethalFantasy) delete game.lethalFantasy.spellDefense let beyondSkill = false let hasStaticModifier = false let hasExplode = true @@ -358,7 +360,7 @@ export default class LethalFantasyRoll extends Roll { dice, hasTarget: options.hasTarget, modifier, - saveSpell: game.lethalFantasy?.spellDefense ?? false, + saveSpell, favor: "none", targetName, isRangedAttack