Mad Dash doubles everything it promises (rules rev 12)

'Including NUMBER cards and other add-ons' now means it: a number
riding the cast fuels the dash — (base + number) × 2 — and numbers or
POWER RUN points played under it double as well. The 5BM4 five that
vanished into a borrowed 'burns 0 life for speed' line gets its own
madDash event and chronicle voice. Older games doubled only the base
and replay so, pinned at deckRev 11.

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-30 16:25:30 -04:00
co-authored by Claude Fable 5
parent 6189b4935c
commit 12ece6065a
3 changed files with 70 additions and 4 deletions
@@ -84,6 +84,49 @@ describe("expansion combat cards", () => {
expect(state.players.find((p) => p.id === defender)!.life).toBe(16);
});
it("mad dash doubles the base, the riding number, and later fuel (rev 12)", () => {
let { state } = newGame();
state = toRound2(state);
const me = activePlayer(state).id;
const md = giveCard(state, me, "mad-dash");
giveCard(state, me, "exp1-number-5", "N5", 1);
state = must(state, me, {
type: "cast", instanceId: md.instanceId, numberInstanceIds: ["exp1-number-5#N5"],
});
expect(state.turn.movementAllowance).toBe(16); // (3 + 5) × 2
// The rider was the turn's movement number: a bare second is refused.
giveCard(state, me, "number-2", "N2", 0);
expect(applyCommand(state, me, { type: "playNumberForMovement", instanceId: "number-2#N2" }).ok).toBe(false);
// POWER RUN points double under the dash too.
const pr = giveCard(state, me, "power-run", "PR", 2);
state = must(state, me, { type: "cast", instanceId: pr.instanceId, params: { points: 2 } });
expect(state.turn.movementAllowance).toBe(20); // 16 + 2×2
});
it("a number played after a bare mad dash doubles as well (rev 12)", () => {
let { state } = newGame();
state = toRound2(state);
const me = activePlayer(state).id;
const md = giveCard(state, me, "mad-dash");
state = must(state, me, { type: "cast", instanceId: md.instanceId });
expect(state.turn.movementAllowance).toBe(6); // 3 × 2
giveCard(state, me, "exp1-number-5", "N5", 0);
state = must(state, me, { type: "playNumberForMovement", instanceId: "exp1-number-5#N5" });
expect(state.turn.movementAllowance).toBe(16); // 6 + 5×2
});
it("older decks double only the base and eat the rider (rev ≤11)", () => {
let { state } = createGame({ playerIds: ["alice", "bob"], seed: 42, sets: ["basic", "expansion1"], deckRev: 11 });
state = toRound2(state);
const me = activePlayer(state).id;
const md = giveCard(state, me, "mad-dash");
giveCard(state, me, "exp1-number-5", "N5", 1);
state = must(state, me, {
type: "cast", instanceId: md.instanceId, numberInstanceIds: ["exp1-number-5#N5"],
});
expect(state.turn.movementAllowance).toBe(6); // 3 × 2, the five wasted
});
it("mental swap trades entire hands", () => {
let { state } = newGame();
state = toRound2(state);