diff --git a/packages/engine/src/automaton.ts b/packages/engine/src/automaton.ts index 78ff8e6..90c8f36 100644 --- a/packages/engine/src/automaton.ts +++ b/packages/engine/src/automaton.ts @@ -760,14 +760,19 @@ function respond(view: GameView, style: AutomatonStyle, tier: TierTraits): Comma if (half && incoming >= 3) return { type: "counteract", instanceId: half.instanceId }; } // ABSORB soaks points only ("no effect on duration-based spells"); - // BLUNT and the stones work on durations too. + // BLUNT and the stones halve durations — but a PERMANENT curse (slow + // death, walking dead, idiot) rides no duration pipe, so nothing short + // of a full stop or REMOVE CURSE touches it. + const permanentCurse = affliction && + (attackId === "slow-death" || attackId === "walking-dead" || attackId === "idiot"); const absorb = find("absorb"); if (absorb && !affliction && incoming >= 2 - flinch && incoming <= 3) return { type: "counteract", instanceId: absorb.instanceId }; const blunt = find("blunt"); - if (blunt && incoming >= 2 - flinch) return { type: "counteract", instanceId: blunt.instanceId }; - // The berserker shares its pain out of spite. + if (blunt && !permanentCurse && incoming >= 2 - flinch) return { type: "counteract", instanceId: blunt.instanceId }; + // The berserker shares its pain out of spite — but only pain: a + // damage-less curse gives EMPATHY nothing to mirror. const empathy = find("empathy"); - if (empathy && style === "berserker" && incoming >= 2) { + if (empathy && style === "berserker" && !affliction && incoming >= 2) { return { type: "counteract", instanceId: empathy.instanceId }; } // Nothing to block with: teleport clear of the big ones. @@ -785,9 +790,10 @@ function respond(view: GameView, style: AutomatonStyle, tier: TierTraits): Comma ...(num ? { numberInstanceIds: [num.instanceId] } : {}), }; } - // A displayed shieldstone lets numbers soak the small ones. + // A displayed shieldstone lets numbers soak the small ones — durations + // included, but never a permanent curse. const stoneShown = me(view).displayed.some((c) => c.cardId === "shieldstone"); - if (stoneShown && incoming >= 2) { + if (stoneShown && !permanentCurse && incoming >= 2) { const num = numbersInHand(view)[0]; if (num) return { type: "counteract", instanceId: num.instanceId }; }