The tear waits for counteractions (rules rev 6)
STRENGTH's card says the grab "would be an attack," but the engine resolved it instantly while punches opened counteraction windows — the defender never got their say. At rev 6 the tear rides the stack like any physical attack: the clutch roll waits out the counters, and only an unstopped grab still in arm's reach of a still-laden defender gets its wrestle. A TELEPORT escape now genuinely saves the chest (FULL SHIELD does not — the card stops spell attacks only, and the grab is physical). The automatons counter tears at their carried gold by not being there when the hand closes. Narrowing, so rev-gated: games pinned at rev 5 keep their instant tears and replay unchanged — all 29 ledgers verify. 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
cbd4d80dea
commit
e388691858
@@ -417,7 +417,11 @@ describe("strength tears treasures from wizards' arms", () => {
|
||||
let torn = 0, kept = 0;
|
||||
for (let seed = 1; seed <= 12; seed++) {
|
||||
const { state, attacker, defender, treasure } = grip(seed);
|
||||
const r = applyCommand(state, attacker, { type: "tearTreasure", targetId: defender });
|
||||
let r = applyCommand(state, attacker, { type: "tearTreasure", targetId: defender });
|
||||
if (!r.ok) throw new Error(r.error);
|
||||
// Rev 6: the grab waits out its counteraction window first.
|
||||
expect(r.state.stack?.tearTreasure).toBe(true);
|
||||
r = applyCommand(r.state, defender, { type: "pass" });
|
||||
if (!r.ok) throw new Error(r.error);
|
||||
expect(r.state.turn.attackUsed).toBe(true);
|
||||
// FAQ: tearing is not picking up — the turn's actions continue.
|
||||
@@ -477,7 +481,10 @@ describe("strength tears treasures from wizards' arms", () => {
|
||||
state = must(state, "alice", {
|
||||
type: "cast", instanceId: st.instanceId, numberInstanceIds: ["number-2#N"],
|
||||
});
|
||||
const r = applyCommand(state, "alice", { type: "tearTreasure", targetId: "bob" });
|
||||
let r = applyCommand(state, "alice", { type: "tearTreasure", targetId: "bob" });
|
||||
if (!r.ok) throw new Error(r.error);
|
||||
// Rev 6: the grab waits out its counteraction window first.
|
||||
r = applyCommand(r.state, "bob", { type: "pass" });
|
||||
if (!r.ok) throw new Error(r.error);
|
||||
const after = r.state.treasures.find((t) => t.id === caras.id)!;
|
||||
if (after.carriedBy === "bob") continue; // Bob rolled his 1 — try again
|
||||
|
||||
Reference in New Issue
Block a user