Rev 25: a bush or the ooze is attacked like a wall — POWER ATTACK counts, thrown weapons land at its foot

Older games took neither; both sides pinned.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
Eric Wagoner
2026-09-22 12:19:15 -04:00
co-authored by Claude Fable 5.1
parent 66b5c06f17
commit 5193b12b8e
2 changed files with 52 additions and 3 deletions
+32 -1
View File
@@ -727,11 +727,42 @@ describe("attacks aimed at a bush or the ooze", () => {
expect(r.state.turn.attackUsed).toBe(true);
});
it("a thrown dagger scratches a rosebush, and the scratch stays", () => {
it("a thrown dagger scratches a rosebush, the scratch stays, and the dagger lies at its foot", () => {
const { state, me, cell } = withContent("rosebush");
const dagger = giveCard(state, me.id, "dagger");
const next = must(state, me.id, { type: "cast", instanceId: dagger.instanceId, target: { kind: "cell", cell } });
expect(next.squareContents[cellKey(cell)]).toEqual(expect.objectContaining({ kind: "rosebush", damage: 3 }));
expect(next.groundObjects[cellKey(cell)]).toEqual([expect.objectContaining({ cardId: "dagger" })]);
expect(next.discard.some((c) => c.instanceId === dagger.instanceId)).toBe(false);
});
it("POWER ATTACK's bought points count against a bush, at the caster's cost", () => {
const { state, me, cell } = withContent("thornbush");
const rock = giveCard(state, me.id, "large-rock");
giveCard(state, me.id, "power-attack", "PA", 1);
const next = must(state, me.id, {
type: "cast", instanceId: rock.instanceId, target: { kind: "cell", cell },
powerAttackInstanceId: "power-attack#PA", powerAttackPoints: 2,
});
expect(next.squareContents[cellKey(cell)]).toEqual(expect.objectContaining({ kind: "thornbush", damage: 4 }));
expect(next.players.find((p) => p.id === me.id)!.life).toBe(13);
});
it("older games let a thrown weapon vanish and POWER ATTACK count for nothing against a bush", () => {
const state = toRound2(createGame({ playerIds: ["alice", "bob"], seed: 42, sets: ["basic", "expansion1"], deckRev: 24 }).state);
const me = activePlayer(state);
const { cell } = emptyNeighborCell(state, me.position);
state.squareContents[cellKey(cell)] = { kind: "rosebush", damage: 0, createdBy: "bob" };
const rock = giveCard(state, me.id, "large-rock");
giveCard(state, me.id, "power-attack", "PA", 1);
const next = must(state, me.id, {
type: "cast", instanceId: rock.instanceId, target: { kind: "cell", cell },
powerAttackInstanceId: "power-attack#PA", powerAttackPoints: 2,
});
expect(next.squareContents[cellKey(cell)]).toEqual(expect.objectContaining({ kind: "rosebush", damage: 2 }));
expect(next.players.find((p) => p.id === me.id)!.life).toBe(15);
expect(next.groundObjects[cellKey(cell)]).toBeUndefined();
expect(next.discard.some((c) => c.instanceId === rock.instanceId)).toBe(true);
});
it("only fire hurts the ooze", () => {