Rev 17: a warp mouth on a pit's rim is a way off it (M4Q7)
Kestrel stood beside a pit dug against the board's west edge, walls north and south of it, and was told there was nothing to land on — the rim check counted only neighbouring squares, and the warp mouth beyond the pit is not one. From rev 17 a mouth on the rim is an exit like any square, named at a fork like any other; every older game takes the mouth when no square offers, so the refused crossing goes through as it stands. The jump through a mouth carries `via: "warp"`: the board shimmers both mouths instead of streaking across the maze, and the reel cuts rather than gliding. The automaton leaves a pit only by its exits. Three tests walk the rim under both readings. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
dc4d2a1221
commit
461c1a5c83
@@ -941,8 +941,8 @@
|
||||
if (view.squareContents[cellKey(pit)]?.kind !== "pit") continue;
|
||||
for (const out of SIDES) {
|
||||
if (out === (side === "N" ? "S" : side === "S" ? "N" : side === "E" ? "W" : "E")) continue;
|
||||
const land = { x: pit.x + (out === "E" ? 1 : out === "W" ? -1 : 0), y: pit.y + (out === "S" ? 1 : out === "N" ? -1 : 0) };
|
||||
if (cellKey(land) === cellKey(cell)) { tryMove(side, undefined, out); return; }
|
||||
const foot = stepTarget(view.board, pit, out);
|
||||
if (foot.kind !== "blocked" && cellKey(foot.to) === cellKey(cell)) { tryMove(side, undefined, out); return; }
|
||||
}
|
||||
}
|
||||
// BIG MAN: clicking two squares away over a pit/tacks/ooze leaps it.
|
||||
|
||||
@@ -133,7 +133,7 @@ export function hurledIn(events: GameEvent[], povId: string): boolean {
|
||||
// and straight, eyes ahead — never a cut that reads as a teleport.
|
||||
return events.some((e) =>
|
||||
(e.type === "knockedBack" || e.type === "shoved" || e.type === "washedBack" ||
|
||||
e.type === "retreatedInHorror" || e.type === "jumpedPit") && e.player === povId);
|
||||
e.type === "retreatedInHorror" || (e.type === "jumpedPit" && e.via !== "warp")) && e.player === povId);
|
||||
}
|
||||
|
||||
export interface Glide {
|
||||
|
||||
@@ -266,7 +266,13 @@ export function fxForEvents(
|
||||
beat++;
|
||||
break;
|
||||
case "jumpedPit":
|
||||
push({ kind: "streak", a: wizMid(e.from), b: anchorAt(e.to, e.player) });
|
||||
if (e.via === "warp") {
|
||||
// Off the rim through a warp mouth: the mouths shimmer, as for a step.
|
||||
push({ kind: "portal-cell", at: e.from });
|
||||
push({ kind: "portal-cell", at: e.to }, 150);
|
||||
} else {
|
||||
push({ kind: "streak", a: wizMid(e.from), b: anchorAt(e.to, e.player) });
|
||||
}
|
||||
beat++;
|
||||
break;
|
||||
case "fellInPit":
|
||||
|
||||
Reference in New Issue
Block a user