The table's reading prevails: open sides carry sight

An hour of rules archaeology, summarized: DIMENSIONAL WARP denies
LOS explicitly (its tokens stay sightless); the AUTO WARP describes
how to trace sight across a join; and on the lettered wraparounds
the texts are silent — no grant, no denial. The FAQ's Permawarp
rulings even have area effects counting distance through warps. Where
the texts are silent, the edition's own table breaks the tie, and the
table says the open sides see. Board openings carry sight in every
revision (a permissive change: every stored game's log replays
clean); the brief rev-7 restriction and its legacy flag are gone,
along with the sophistry that justified them. The adjacency geometry
stands. The friend's sticky-wand shot through the C opening was legal
after all.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-16 15:29:09 -04:00
co-authored by Claude Fable 5
parent 493f3bc567
commit 4833a229e1
4 changed files with 84 additions and 44 deletions
+6 -18
View File
@@ -144,18 +144,15 @@ describe("sight and the wraparound openings", () => {
{ boardId: "board-b", origin: { x: 0, y: 5 }, rotation: 0 },
];
it("lettered wraparounds carry movement only — no sight across the map", () => {
it("the open sides carry sight: mouths see each other through the join", () => {
const board = assembleBoard(twoSector);
// (2,0) N wraps to (2,9) for walking, but no rule grants sight there,
// and DIMENSIONAL WARP's own face denies it for warps generally.
expect(sightBetween(board, { x: 2, y: 0 }, { x: 2, y: 9 })).toBe(false);
expect(sightBetween(board, { x: 2, y: 9 }, { x: 2, y: 0 })).toBe(false);
expect(hasLineOfSight(board, { x: 2, y: 0 }, { x: 2, y: 9 })).toBe(false);
expect(sightBetween(board, { x: 2, y: 0 }, { x: 2, y: 9 })).toBe(true);
expect(sightBetween(board, { x: 2, y: 9 }, { x: 2, y: 0 })).toBe(true);
});
it("pre-rev-7 games keep the wider sight their commands were validated under", () => {
const board = { ...assembleBoard(twoSector), sightThroughAllWarps: true };
expect(sightBetween(board, { x: 2, y: 0 }, { x: 2, y: 9 })).toBe(true);
// Even then: walls inside the corridor still block, and a filled mouth chokes.
it("walls inside the corridor still block, and a filled mouth chokes", () => {
const board = assembleBoard(twoSector);
expect(sightBetween(board, { x: 2, y: 2 }, { x: 2, y: 9 })).toBe(false);
expect(sightBetween(board, { x: 2, y: 0 }, { x: 2, y: 8 }, { "2,9": true })).toBe(false);
});
@@ -244,14 +241,5 @@ describe("the aisle warp treats its corner as adjacent — sight included", () =
}
expect(seen).toBeGreaterThan(0);
expect(offAxis).toBeGreaterThan(0);
// A lettered (non-aisle) mouth on the same board sees nothing extra.
const lettered = board.warps.find((w) => !w.aisle)!;
const lm = lettered.from.cell;
let extra = 0;
for (const key of Object.keys(board.cells)) {
const [x, y] = key.split(",").map(Number) as [number, number];
if (!hasLineOfSight(board, lm, { x, y }) && sightBetween(board, lm, { x, y })) extra++;
}
expect(extra).toBe(0);
});
});