A warp crossing is just a step; only a wormhole opening surges
Eric's direction: passing through an ordinary warp mouth is a normal stride. The veil already marks the doorway, and the wizard walks through it as through any door — no shimmer, no surge, and the eyes carry on the way they were going instead of turning back to show the mouth. The surge stays for the moment a wormhole is cast, staged straight from the warpOpened event through both its new mouths. The heist's pinned frames re-blessed for it: at the crossing the reel now looks down the corridor at the enemy's home rather than back through the mouth. deploy/film-clips.mjs films the catalog for the gallery — every scene in both takes, the reel playing under the paused clock at one frame per 40ms, muxed to 25fps mp4s with the first pinned beat as the poster. The recorder used for the first clip set lived in a session scratchpad and was lost; this one lives here. 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
a7f77367a6
commit
6a933f030c
@@ -125,20 +125,10 @@ export function fpFxForEvents(
|
||||
});
|
||||
}
|
||||
} else if (fx.kind === "portal") {
|
||||
// The board ripples the mouth; here the mouth's own veil surges.
|
||||
// Every mouth heads one entry of board.warps, the index the
|
||||
// raycaster tags its columns with.
|
||||
const warp = view.board.warps.findIndex(
|
||||
(w) => w.from.cell.x === fx.cell.x && w.from.cell.y === fx.cell.y && w.from.side === fx.side,
|
||||
);
|
||||
if (warp >= 0) {
|
||||
out.push({ fx: { id: nextId++, kind: "surge", warp, t0: 0, dur: 900 }, delay });
|
||||
} else {
|
||||
out.push({
|
||||
fx: { id: nextId++, kind: "impact", art: "shimmer", at: { x: fx.cell.x + 0.5, y: fx.cell.y + 0.5 }, t0: 0, dur: 550 },
|
||||
delay,
|
||||
});
|
||||
}
|
||||
// The board ripples a mouth on every crossing. In here a warp is
|
||||
// a doorway like any other — the veil already marks it, and a
|
||||
// body walks through as it would a door. A mouth just OPENED is
|
||||
// staged from the raw event below.
|
||||
} else if ("at" in fx && IMPACT_ART[fx.kind]) {
|
||||
out.push({
|
||||
fx: { id: nextId++, kind: "impact", art: IMPACT_ART[fx.kind]!, at: { x: fx.at.x + 0.5, y: fx.at.y + 0.5 }, t0: 0, dur: 550 },
|
||||
@@ -147,8 +137,17 @@ export function fpFxForEvents(
|
||||
}
|
||||
}
|
||||
// The maze itself performs: doors swing for whoever steps through,
|
||||
// walls die into rubble, and walking THROUGH stone shimmers.
|
||||
// walls die into rubble, walking THROUGH stone shimmers, and a
|
||||
// wormhole just cast surges through both its new mouths.
|
||||
const warpIndex = (m: { cell: { x: number; y: number }; side: string }) =>
|
||||
view.board.warps.findIndex((w) => w.from.cell.x === m.cell.x && w.from.cell.y === m.cell.y && w.from.side === m.side);
|
||||
for (const e of events) {
|
||||
if (e.type === "warpOpened") {
|
||||
for (const [m, delay] of [[e.a, 0], [e.b, 200]] as const) {
|
||||
const warp = warpIndex(m);
|
||||
if (warp >= 0) out.push({ fx: { id: nextId++, kind: "surge", warp, t0: 0, dur: 900 }, delay });
|
||||
}
|
||||
}
|
||||
if ((e.type === "moved" || e.type === "creatureMoved") && "direction" in e) {
|
||||
const via = e.type === "moved" ? e.via : "step";
|
||||
const key = edgeKey(e.from, e.direction);
|
||||
|
||||
Reference in New Issue
Block a user