Half the warp pairings were secretly mirrors

Eric walked a five-player board's corner warp and the world stretched.
The lane rule — carry the along-the-edge offset through unchanged —
is only correct for half the side pairings: for the rest (N to N,
E to N, and their kin, the ones five-player boards deal), the proper
rotation lands the entry axis head-to-head against the exit axis, and
preserving the raw lane smuggled a REFLECTION into the traversal —
rays crossing over at the mouth, parallax inverted, the far room
swimming. warpLaneMirrored computes the pairing's sign from the
rotation itself; castRay mirrors the lane where required, and
warpMotion anchors the far mouth at its opposite corner to stay the
same pure rotation — so sprites and projectile legs agree with the
rays again. The workshop grows ?players=2..6 to stand on any table
size (the mirror-class mouths live on the five-player boards).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-23 19:47:28 -04:00
co-authored by Claude Fable 5
parent 700db70d4e
commit 707297da17
2 changed files with 35 additions and 4 deletions
+4 -1
View File
@@ -14,8 +14,11 @@
/** ?demo=1: two automatons play a stretch, then the reel replays it —
* the real Replay component, toggleable into first person. */
const demoReel = q.has("demo");
// ?players=2..6 sizes the table (5-player boards carry the corner
// warps whose traversals rotate the world a quarter-turn).
const count = Math.min(6, Math.max(2, Number(q.get("players") ?? 3)));
const { state: dealt } = createGame({
playerIds: ["Wanderer", "Rival", "Stranger"],
playerIds: ["Wanderer", "Rival", "Stranger", "Pilgrim", "Vagabond", "Drifter"].slice(0, count),
seed,
sets: ["basic", "expansion1"],
});