The reel learns to shine: gliding bodies, warp-threaded shots, a clip worth sharing

Three polishes aimed at the instant-replay dream. Other wizards and
creatures now GLIDE between steps in first person instead of blinking
cell to cell — a stride tweens, a teleport still simply arrives. A
projectile whose sight line runs through a warp now flies as two
simultaneous legs under the mouths' rigid motion, so the fireball
plunges into the opening on one side and bursts from the pair on the
other, whichever room the camera stands in. And the saved video is no
longer a bare canvas grab: it composites into a shareable 1280x720
frame with the step's caption burned in — gold actor name, the reel's
own words — and the game's name in the corner, so a clip passed along
explains itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-23 15:20:13 -04:00
co-authored by Claude Fable 5
parent e8c6b93c71
commit b82d526a79
4 changed files with 167 additions and 25 deletions
+4 -1
View File
@@ -18,6 +18,7 @@
width = 720,
height = 440,
fx = [],
posOverride,
}: {
view: GameView;
povId: string;
@@ -30,6 +31,8 @@
height?: number;
/** Live spell moments: projectiles, impacts, flashes, shakes. */
fx?: FpFx[];
/** Bodies mid-glide: world positions that override the view's cells. */
posOverride?: Record<string, { x: number; y: number }>;
} = $props();
const FOV = Math.PI / 2.9;
@@ -195,7 +198,7 @@
}
// Sprites, far to near, sliced against the depth buffer.
const sprites = billboards(view, povId, tokenArt)
const sprites = billboards(view, povId, tokenArt, posOverride)
.map((b) => project(b, ex, ey))
.filter((s): s is Projected => s !== null);
for (const f of fx) {