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 -13
View File
@@ -218,8 +218,10 @@ export interface GameConfig {
* BIG MAN pushes occupants ahead, steps over floor hazards for 2 points,
* and bars monsters from his square. Rev 6: ANTI-ANTI cannot pin a
* teleport escape ("does not work against escape" — the card face).
* Rev 7: sight passes only through aisle-warp corners, not the lettered
* wraparounds ("no rule grants it; DIMENSIONAL WARP explicitly denies it").
* Rev 7 briefly restricted warp sight to aisle corners; the table's
* reading prevailed and all board openings carry sight in every revision.
* DIMENSIONAL WARP's tokens never do ("There is no L.O.S. through the
* warp." — the card face).
*/
deckRev?: number;
}
@@ -292,17 +294,8 @@ export interface GameState {
/** The board with dynamic wall changes applied — use for movement and LOS. */
export function boardView(state: GameState): AssembledBoard {
// Rev 7 restricts warp sight to the aisle corners; earlier games keep the
// wider sight their commands were validated against.
const legacySight = (state.config.deckRev ?? 1) < 7;
if (Object.keys(state.edgeOverrides).length === 0) {
return legacySight ? { ...state.board, sightThroughAllWarps: true } : state.board;
}
return {
...state.board,
edges: { ...state.board.edges, ...state.edgeOverrides },
...(legacySight ? { sightThroughAllWarps: true } : {}),
};
if (Object.keys(state.edgeOverrides).length === 0) return state.board;
return { ...state.board, edges: { ...state.board.edges, ...state.edgeOverrides } };
}
export function sustainedOn(state: GameState, playerId: PlayerId, cardId?: string): SustainedEffect[] {