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:
co-authored by
Claude Fable 5
parent
019deedd85
commit
2a8539e59a
@@ -225,6 +225,21 @@ probing legality is free, so when unsure, try it and read the error.
|
|||||||
expect neither bias nor exploitability from the bots — their BFS is
|
expect neither bias nor exploitability from the bots — their BFS is
|
||||||
natively non-Euclidean.
|
natively non-Euclidean.
|
||||||
|
|
||||||
|
## Game-thirteen scars (the goat)
|
||||||
|
|
||||||
|
- **BUTT-HEAD is a cross-map physical nuke**: damage = the full walked
|
||||||
|
distance of the charge, and it found 8 points across half a maze.
|
||||||
|
ABSORB SPELL answers spells ONLY — at low life with no teleport in
|
||||||
|
hand, there is NO answer to big physical; your only defenses are
|
||||||
|
position and never being worth the charge. Audit the hand for
|
||||||
|
physical answers separately from spell answers.
|
||||||
|
- He parks his OWN chest on open floor when he needs free arms —
|
||||||
|
custody is a dial, not a state. Watch every drop: grounded chests
|
||||||
|
are targets again the moment they land.
|
||||||
|
- My game-one wall and his one dust cloud shaped the ENTIRE game:
|
||||||
|
single-square terrain on a junction outlives every spell cast near
|
||||||
|
it. Place terrain at junctions, not corridors.
|
||||||
|
|
||||||
## The board is the truth (I keep paying for this one)
|
## The board is the truth (I keep paying for this one)
|
||||||
|
|
||||||
- NEVER narrate a persistent effect without re-verifying it in the
|
- NEVER narrate a persistent effect without re-verifying it in the
|
||||||
|
|||||||
@@ -238,8 +238,10 @@ export interface CastParams {
|
|||||||
* Rev 7: DISEASE is a self-cast plague ("You're the carrier!") — the caster
|
* Rev 7: DISEASE is a self-cast plague ("You're the carrier!") — the caster
|
||||||
* carries it, sharing a square bites both directions, no counteraction.
|
* carries it, sharing a square bites both directions, no counteraction.
|
||||||
* Rev 8: the fire imp's scorch is a SPELL (FAQ) — counteractable, magical —
|
* Rev 8: the fire imp's scorch is a SPELL (FAQ) — counteractable, magical —
|
||||||
* and SOULSTONE's floor holds even at 3 life or below. */
|
* and SOULSTONE's floor holds even at 3 life or below.
|
||||||
export const CURRENT_RULES_REV = 8;
|
* 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 {
|
export interface GameConfig {
|
||||||
playerIds: PlayerId[];
|
playerIds: PlayerId[];
|
||||||
@@ -4567,9 +4569,30 @@ function doWardChoice(prev: GameState, play: boolean): CommandResult {
|
|||||||
owner.displayed = owner.displayed.filter((id) => id !== card!.instanceId);
|
owner.displayed = owner.displayed.filter((id) => id !== card!.instanceId);
|
||||||
state.discard.push(card!);
|
state.discard.push(card!);
|
||||||
events.push({ type: "wardSprung", owner: owner.id, victim: taker.id });
|
events.push({ type: "wardSprung", owner: owner.id, victim: taker.id });
|
||||||
|
// 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);
|
applyDamage(state, events, taker, 3, "warded treasure", null);
|
||||||
checkVictory(state, events);
|
checkVictory(state, events);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return { ok: true, 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.params?.damage ?? 1) // a creature's blow
|
||||||
: stack.tearTreasure
|
: stack.tearTreasure
|
||||||
? 0 // the tear wrestles; it does not bruise
|
? 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."
|
// 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) {
|
if (attackId === "fireball" && sustainedOn(state, defender.id, "sticky-web").length > 0) {
|
||||||
base += 2;
|
base += 2;
|
||||||
|
|||||||
Reference in New Issue
Block a user