Reversed, Walking Dead heals half a point per step (rules rev 11)

The same FAQ turn as Slow Death's: a REVERSE riding the cast attaches
the curse backward, and every second space walked gains the point the
bite would have taken. Older ledgers attached it biting and replay so.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
This commit is contained in:
Eric Wagoner
2026-08-29 23:01:01 -04:00
co-authored by Claude Fable 5
parent 4430a0def1
commit b538a0a2ae
2 changed files with 45 additions and 8 deletions
+19 -8
View File
@@ -270,10 +270,11 @@ export interface GameConfig {
* Rev 10: BUTT-HEAD's ram is MOVEMENT the charge walks real
* corridors on the turn's legal legs (three plus numbers) and spends
* them.
* Rev 11: a REVERSE against SLOW DEATH turns the whole curse (FAQ)
* the victim gains a point for every card drawn, permanently and a
* FULL REFLECTION returns a permanent curse (SLOW DEATH, WALKING DEAD,
* IDIOT) onto its caster instead of letting it evaporate.
* Rev 11: a REVERSE against SLOW DEATH or WALKING DEAD turns the whole
* curse (FAQ) a point gained per card drawn, half a point per space
* walked, permanently and a FULL REFLECTION returns a permanent
* curse (SLOW DEATH, WALKING DEAD, IDIOT) onto its caster instead of
* letting it evaporate.
*/
deckRev?: number;
}
@@ -2219,9 +2220,13 @@ const CARD_EFFECTS: Record<string, AttackEffect | NeutralEffect | CounterEffect>
baseDamage: () => 0,
permanentCurse: true,
// "1/2 point of damage for every space moved. This spell is permanent."
// Rev 11: REVERSED at cast, the walk heals instead — half a point
// gained per space, as permanently. Older games attached it biting.
onResolved: (ctx) => {
if (ctx.fullyStopped || !ctx.defender.alive) return;
attachSustained(ctx.state, ctx.events, "walking-dead", ctx.attacker.id, ctx.defender.id, PERMANENT_TURNS);
const reversed = ctx.reversed && (ctx.state.config.deckRev ?? 1) >= 11;
attachSustained(ctx.state, ctx.events, "walking-dead", ctx.attacker.id, ctx.defender.id,
PERMANENT_TURNS, reversed ? { reversed: 1 } : {});
},
},
disease: {
@@ -4312,12 +4317,18 @@ function doMove(prev: GameState, direction: Side, over = false): CommandResult {
state.turn.movementUsed++;
events.push({ type: "moved", player: p.id, from, to: p.position, direction, via });
// WALKING DEAD: 1/2 point per space moved (a full point every two steps).
// WALKING DEAD: 1/2 point per space moved (a full point every two
// steps) — gained instead of bled for a curse REVERSED at its casting.
for (const fx of sustainedOn(state, p.id, "walking-dead")) {
fx.data.halfSteps = (fx.data.halfSteps ?? 0) + 1;
if (fx.data.halfSteps % 2 === 0) {
applyDamage(state, events, p, 1, "walking dead", null);
checkVictory(state, events);
if (fx.data.reversed) {
p.life += 1;
events.push({ type: "lifeGained", player: p.id, amount: 1, source: "walking dead (reversed)", lifeAfter: p.life });
} else {
applyDamage(state, events, p, 1, "walking dead", null);
checkVictory(state, events);
}
}
}
// DISEASE: the carrier infects every other player in a square they enter.