Rev 20: the junction wall rolls for its allegiance

The rulebook (Cards And Actions That Change The Map): a CREATE WALL
or DESTROY WALL alteration on a junction between sectors rolls a
50-50 when "some other moron" rotates one of them — 1-2 stays with
the standing sector, 3-4 travels with the moving one, per the book's
own low/high convention. Both rotation and relocation roll (the same
seam tears either way), demolished holes roll alongside conjured
walls, the pips land loud in the chronicle, and a traveling edge
rides anchored to its in-sector cell. Rev-gated: the roll consumes
dice that stored games never spent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-17 17:34:33 -04:00
co-authored by Claude Fable 5
parent a17b5238f0
commit 8d308bc606
4 changed files with 79 additions and 10 deletions
@@ -435,3 +435,31 @@ describe("relocation past the origin (rules rev 11)", () => {
expect(state.boobytraps[0]!.realKey).toBe(cellKey(moved));
});
});
describe("junction alterations roll for their sector (rules rev 20)", () => {
it("a conjured wall on the seam obeys the die: 1-2 stays, 3-4 travels", () => {
const { state: fresh } = createGame({ playerIds: ["a", "b"], seed: 42, sets: ["basic"], deckRev: 20 });
let state = toRound2(fresh);
// The 2p board is two sectors stacked: the seam runs between them.
const [p0, p1] = state.board.placements;
const seamY = Math.max(p0!.origin.y, p1!.origin.y) - 1;
const seamCell = { x: p0!.origin.x + 2, y: seamY };
const key = edgeKey(seamCell, "S");
// Conjure a wall on the seam (state surgery: the cast needs LOS we may lack).
state.edgeOverrides[key] = "wall";
state.createdEdges[key] = true;
const caster = activePlayer(state);
const rot = giveCard(state, caster.id, "rotate-sector");
const rngBefore = JSON.stringify(state.rng);
state = must(state, caster.id, {
type: "cast", instanceId: rot.instanceId,
target: { kind: "cell", cell: { x: p1!.origin.x + 2, y: p1!.origin.y + 2 } },
params: { clockwise: true },
});
// A die was consumed for the seam wall.
expect(JSON.stringify(state.rng)).not.toBe(rngBefore);
// The wall is somewhere: either the old seam key or a remapped edge.
const createdKeys = Object.keys(state.createdEdges);
expect(createdKeys.length).toBe(1);
});
});