Rev 9 ships with game thirteen's scars

The WARD's bite now rides the stack per its card text, cardless traps
carry their own damage through resolution, and the duel skill records
the goat: BUTT-HEAD's charge is cross-map physical that no spell-
counter answers, custody of one's own chest is a dial not a state, and
junction terrain outlives every spell cast near it. Ledgers verified.

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 00:10:13 -04:00
co-authored by Claude Fable 5
parent 019deedd85
commit 2a8539e59a
2 changed files with 43 additions and 5 deletions
+28 -5
View File
@@ -238,8 +238,10 @@ export interface CastParams {
* Rev 7: DISEASE is a self-cast plague ("You're the carrier!") the caster
* carries it, sharing a square bites both directions, no counteraction.
* Rev 8: the fire imp's scorch is a SPELL (FAQ) counteractable, magical
* and SOULSTONE's floor holds even at 3 life or below. */
export const CURRENT_RULES_REV = 8;
* and SOULSTONE's floor holds even at 3 life or below.
* Rev 9: the WARD's bite is counteractable ("COUNTERACTIONs ... otherwise
* work as written"), though nothing a counter does touches its caster. */
export const CURRENT_RULES_REV = 9;
export interface GameConfig {
playerIds: PlayerId[];
@@ -4567,8 +4569,29 @@ function doWardChoice(prev: GameState, play: boolean): CommandResult {
owner.displayed = owner.displayed.filter((id) => id !== card!.instanceId);
state.discard.push(card!);
events.push({ type: "wardSprung", owner: owner.id, victim: taker.id });
applyDamage(state, events, taker, 3, "warded treasure", null);
checkVictory(state, events);
// Rev 9: "COUNTERACTIONs against WARD ... otherwise work as written" —
// the bite rides the stack. `trapped` carries the card's other clause:
// nothing a counter does can touch the Ward's caster. Older games
// recorded the instant bite and replay it.
if ((state.config.deckRev ?? 1) >= 9) {
state.stack = {
attackerId: owner.id,
defenderId: taker.id,
attackCard: null,
numberValue: null,
amplifyFactor: 1,
extendFactor: 1,
powerAttackPoints: 0,
params: { damage: 3 },
kind: "spell",
counters: [],
waitingOn: taker.id,
trapped: true,
};
} else {
applyDamage(state, events, taker, 3, "warded treasure", null);
checkVictory(state, events);
}
}
return { ok: true, state, events };
}
@@ -5839,7 +5862,7 @@ function resolveStack(state: GameState, events: GameEvent[]): void {
? (stack.params?.damage ?? 1) // a creature's blow
: stack.tearTreasure
? 0 // the tear wrestles; it does not bruise
: 1; // a punch
: (stack.params?.damage ?? 1); // a punch — or a cardless trap's bite
// Webs burn: "Any fire damage done to player in webs causes two extra points."
if (attackId === "fireball" && sustainedOn(state, defender.id, "sticky-web").length > 0) {
base += 2;