Bots stop wasting counters on what cannot be countered

Per the owner's ruling: EMPATHY mirrors only delivered damage, so a
damage-less curse gives it nothing — the berserker keeps it sheathed
against afflictions (an automaton burned one on SLOW DEATH). And the
permanent curses (slow death, walking dead, idiot) ride no duration
pipe, so BLUNT and shieldstone numbers can't shorten them: only a full
stop or REMOVE CURSE answers those, and the ladder now knows it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
This commit is contained in:
Eric Wagoner
2026-08-18 00:57:31 -04:00
co-authored by Claude Fable 5
parent 3323f81fba
commit 7d97bb1093
+12 -6
View File
@@ -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 };
}