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
+7 -13
View File
@@ -27,12 +27,7 @@ export interface Warp {
from: { cell: Cell; side: Side };
/** ...you arrive at this cell (entering through `side`). */
to: { cell: Cell; side: Side };
/**
* An aisle (AUTO) warp joins two edges that physically meet at a corner:
* "for all purposes, treat the connected board edges as though they are
* adjacent" — including line of sight. The lettered wraparounds carry
* movement only; no rule grants sight across the map.
*/
/** An aisle (AUTO) warp joins two edges that meet at a corner. */
aisle?: boolean;
}
@@ -45,8 +40,6 @@ export interface AssembledBoard {
/** Cells that are part of the map (all cells inside placed sectors). */
cells: Record<string, true>;
warps: Warp[];
/** Pre-rev-7 games saw through every warp; their replays keep that sight. */
sightThroughAllWarps?: boolean;
/** Per player-sector info, in placement order. */
homes: Cell[];
treasureSpaces: Cell[][];
@@ -353,10 +346,12 @@ function onSegment(ax: number, ay: number, bx: number, by: number, px: number, p
}
/**
* Sight through a wraparound opening. Rulebook: "If casting a spell, or
* checking line of sight through the AUTO WARP, treat it as a straight
* line, and the two connected boards as though they were adjacent" — and
* the lettered openings reconnect edges the same way. So the far side is
* Sight through a wraparound opening — the boards "have open sides", and
* the AUTO WARP rule shows how to trace sight across a join: "treat it as
* a straight line, and the two connected boards as though they were
* adjacent". The texts never deny the lettered openings what they grant
* the aisle (only DIMENSIONAL WARP's tokens carry an explicit "no L.O.S."
* — and those are not board warps). So the far side is
* virtually abutted at the mouth (rotated if the pairing turns a corner,
* as the aisle warps do), and the center-to-center line must pass through
* the one-cell opening: diagonals through the gap are as legal as they are
@@ -373,7 +368,6 @@ export function hasWarpLineOfSight(
};
const EPS = 1e-9;
for (const w of board.warps) {
if (!w.aisle && !board.sightThroughAllWarps) continue;
const mouthA = w.from.cell;
const sideA = w.from.side;
const mouthB = w.to.cell;