Commit Graph
17 Commits
Author SHA1 Message Date
Eric WagonerandClaude Fable 5 700db70d4e A cell-wide sprite is now actually a cell wide
Rubble drawn to span its gap stopped short of the posts, and the
ledger of blame is arithmetic: billboard widths scaled by the vertical
pixel ratio (H/depth) when horizontal pixels-per-world-unit is the
focal length over depth — about 1.4x larger. Every "one cell wide"
volume rendered at seventy percent. Sprites that declare an aspect now
mean WORLD width and use the horizontal scale, so rubble reaches post
to post and hedges brush both walls; plain square token sprites keep
their familiar pixel shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:39:26 -04:00
Eric WagonerandClaude Fable 5 5fc5805354 Odds, ends, and every missing effect: doorways dressed, victory earns its fireworks
The audit Eric called for, delivered whole. Open doors are DOORWAYS
now: stone jamb posts at both ends and a lintel hung across the top
(paintable as textures/doorframe.png), the way through open to the eye.
Battle damage shows — the engine's per-edge wallDamage wears painted
cracks into any wall, heavier as harm mounts. The wall safe stands as
a strongbox volume instead of a flat token. Hedges take root: an
underbrush floor decal covers the whole square beneath them (Eric's
report — a billboard at center depth can't reach the floor trapezoid's
near edge), and the hedge itself widens past the cell. Rubble
stretches across the fallen wall's full gap, corner piles landing at
the posts, exactly as its art was painted.

The first-person effect gaps close: victory now throws SIX fireworks
climbing over the winner's home with gold washing the screen; sector
rotations flash violet and heave the whole world; the Thumb of God
lands with a burst and a shudder; walls conjured from nothing rise in
stone dust; and every hazard pratfall plays — pit falls (with a dark
drop and jolt for the faller's own eyes), ooze slips, tack yelps,
thorn snaps, slime, dust. Dying in first person fades long and dark.

And the whole tale travels: a finished game's full replay carries the
share button too — turn -1 mints a link to every turn of the game,
each through its wizard's own eyes, titled for the winner's triumph.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:32:42 -04:00
Eric WagonerandClaude Fable 5 1e79f2ffb2 The terrain moves in: pits open downward, hedges stand waist-high, ooze is jello
The flat token billboards give way to terrain that inhabits the room.
Pits, slime, tacks, and the dimensional warp's rings are painted INTO
the flagstones — the home-tile decal pass grows into a general per-cell
overlay grid, one texture per cell, alpha-blended texel by texel. Thorn
and rose hedges fill their square wall to wall at half height, drawn
with a near-bias so the wizard standing among the thorns peeks over the
top. The killer ooze rises as a full translucent cube of jello, bricks
and bodies visible through it; dust billows; and each dimensional warp
mouth throws an additive pillar of violet light up from its floor ring.
Billboards learn aspect, translucency, glow, and draw-order bias to
carry it all.

Nine paintable starters ship — four floor decals under textures/, five
standing volumes under terrain3d/ (spec updated for the artist, hedges
wide, jello solid, warpglow as light) — shown in the token workshop,
rehearsable in place with /?fpv&terrain=thornbush@3,7;jello@4,7.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 18:25:01 -04:00
Eric WagonerandClaude Fable 5 4838996cf0 Share a turn with the world: /watch links, cards and chrome included
The share button lands on the instant replay. One click mints a slug —
persistent, unguessable, one per (room, turn) — and copies a /watch
link anyone can open: the server rebuilds exactly that turn for the
nameless SPECTATOR, public knowledge only, none of the rest of the
game visible. The page arrives with its OpenGraph card pre-baked into
the head (crawlers never run the app): the turn's title and round in
the text, and an og.png of the maze itself — cells, walls, doors, warp
mouths, homes, standees — painted server-side and PNG-encoded with
nothing but node's own zlib. The viewer page wears its chrome: the
WIZ-WAR masthead linking home, the turn's title, the reel opening
straight into the turn-owner's eyes with a "watch it again" loop, and
a footer that says what this table is and deals the visitor in.

The share page loads as its own entry so a shared link never drags the
full app's socket appetite along; the reel's modal scrim learns to
stand in a page instead of over one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:34:00 -04:00
Eric WagonerandClaude Fable 5 727b9144d0 Walls you know are lies stand as ghosts
A wizard who has seen through an illusion no longer walks toward empty
air where the board shows a dashed ghost: the ray records the first
known-illusion edge it crosses without stopping, and the renderer
stands a wall there at one-fifth opacity, violet ripple running through
it, drawn over the sprites so bodies show through its breath. Untested
illusions get the same tell the board gives — a faint shimmer on their
solid face, maybe stone, maybe not — while a believed illusion stays
honest brick. The workshop rehearses it with ?illusion=H:2,8.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:09:24 -04:00
Eric WagonerandClaude Fable 5 b3bc4d079b Stepping through a believed illusion reads as magic, not a glitch
A9WK's mystery, solved by Eric: the wizard walked through an illusion
wall it disbelieves, and the viewer — still deceived — watched the
camera slide through solid stone. The deception stays intact, but the
crossing now performs: any body stepping through an edge the VIEWER
holds as wall (which can only be an illusion the mover saw through)
shimmers on both faces, with the stone-gray wash when the eyes
themselves cross. Same dressing Pass Wall wears.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:04:38 -04:00
Eric WagonerandClaude Fable 5 cdfae39398 The maze performs: doors swing, walls die loudly, homes wear their colors
Entertainment polish for the instant replay, all through one wizard's
eyes. Doors now slide open along their own edge — Wolf3D style — when
anyone steps through in a reel, hold for the crossing, and swing shut;
the raycaster takes a per-edge openness map and doors carry their
texture with them, leaving a sliver of jamb at the far post. A wall
that dies bursts into stone and shakes the camera, then leaves a mound
of rubble at the fallen edge for the rest of the reel (a tenth
paintable sprite, drawn opaque — debris, not light). Jammed locks
seethe: a rusty pulse across the wood, keyed off the view's own door
states. Walking THROUGH a wall shimmers on both faces and washes the
walker's own screen stone-gray. And every home base wears its owner's
emblem on the flagstones — a near-white paintable overlay tinted by
wizard color per cell in the floor cast.

Testing surfaced a real ghost: a body standing near a far warp mouth
also rendered at its virtual position, which can overlap real
corridors — the depth buffer alone cannot clip it. Every column now
remembers whether its ray bent, and a sprite draws only where its warp
side matches the column's; projectile legs carry the same flag.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:30:35 -04:00
Eric WagonerandClaude Fable 5 bfece01468 The workshop walks through warps; conjurations wear their own inks
A stride into a warp mouth now carries the walker out of the paired
mouth mid-glide, body turned exactly as the rays turn — canWalk admits
a rim edge only where a mouth waits, and the crawler splits the stride
at the crossing. And with painted conjuration sprites arriving, the fx
pass composites them normally instead of additively: painted art is
ink, not light, and additive blending would bloom its outlines white.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 15:28:34 -04:00
Eric WagonerandClaude Fable 5 b82d526a79 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>
2026-08-23 15:20:13 -04:00
Eric WagonerandClaude Fable 5 e8c6b93c71 Stage three: spells fly through your own eyes
The reel's first-person mode now shows the fight, not just the rooms.
The board flourishes' event map is recast into world space (fx3d):
fireballs, bolts, and thrown things streak caster to target as glowing
billboards; landings swell and fade; blows that land on YOU wash the
screen red and jolt the camera; warp-steps and teleports flash violet;
a hurled body glides fast and straight with its eyes held steady. Nine
paintable conjuration sprites ship at public/fx3d (spec for the artist
in research/), shown in the token workshop beside the masonry.

Three rough edges sharpened along the way: sprites now project through
warp mouths under the same rigid motion the rays use, clipped by the
depth buffer to the opening; fire and warp surfaces pull a different
texture slice per world cell so a long blaze reads as one; and the
replay camera only turns toward an actor its eyes could actually see.

Two more gifts: the reel can record its first-person canvas straight
to a downloadable WebM (⏺ save video), and the About tab now shows
visitors the way into the three workshops.

One buried mine defused: rAF hands frame-start times that can precede
the tween's own clock, and a zero-length turn divided by it — one NaN
facing poisoned every ray black and re-triggered the camera effect
forever. The tween clamps and guards its phases now.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 14:51:04 -04:00
Eric WagonerandClaude Fable 5 fcafdb06de The painted ground actually loads: floor and ceiling join MATERIALS
The loader walks MATERIALS to swap painted files over the procedural
bakes, and the two ground planes were never added to it — so floor.png
and ceiling.png sat served-but-unread while the renderer kept its own
flagstones. Eight materials in the list now, all eight paintable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 14:07:07 -04:00
Eric WagonerandClaude Fable 5 3ff7d164c0 Walls take on thickness: every blocked edge stands as a slab
Zero-width planes vanish when seen end-on. Each wall edge now rises as
a thin box — masonry thickest, door joinery slimmer, fire a mere sheet
— so the ray march tests the slabs of every cell it passes through and
wall ENDS present a cap face. Corners, jambs, and junctions read as
stone with depth instead of paper. Warp traversal, stone cells, and
the rim keep their crossings; the frame budget doesn't notice.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 13:11:35 -04:00
Eric WagonerandClaude Fable 5 0f01f8c356 The ground gets cast: per-pixel floor and ceiling, both paintable
True floor-casting replaces the gradients and the projected seam lines:
every screen row lies at one depth, walked with a constant world-space
step and sampled from floor.png underfoot and ceiling.png overhead —
each maze cell wearing exactly one tile, so the artist's border IS the
cell seam. Distance shade and fog fold into the same per-pixel pass,
pixel buffers cache per texture (re-read when a painted file lands),
and the whole frame still clears 60fps with room to spare. Flagstones
and dark slabs ship as the starter files beside the other masonry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 13:05:46 -04:00
Eric WagonerandClaude Fable 5 fb89d752ae The masonry becomes files: first-person textures join the paintable art
The six materials move out of the renderer into public/textures/*.png —
repaint any of them (any size; the sampler reads each file's own scale)
and refresh, exactly as the token SVGs work. fpv/textures.ts keeps the
procedural bake as the shipped default and the stand-in while files
load, and the /?tokens gallery grows a masonry section showing the set
beside the tokens they will someday match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:48:58 -04:00
Eric WagonerandClaude Fable 5 cf6349aca8 Stage 2.5: the maze gets its masonry and the walk gets its gait
Walls wear baked 64-texel textures sampled per column — running-bond
brick for the maze, darker courses for the rim, rough blocks for filled
stone, planked doors with an iron band and handle, flame-streaked fire,
swirling violet for the warps — drawn crisp with smoothing off, shaded
by distance and animated by overlay. The floor shows its tile seams:
grid lines projected onto the ground plane, occluded by the walls that
stand on them. And the workshop walks like the game plays: a tap glides
exactly one square with an eased stride, a turn swings a clean quarter,
held keys queueing the next move as each settles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:41:49 -04:00
Eric WagonerandClaude Fable 5 65092f50af The reel through your own eyes: first-person replay (stage two)
Sight now runs THROUGH the warps as the rules say: a ray reaching a
mouth re-enters at its pair and marches on, the far side swimming in
violet haze. The floor's furniture joins the scene — bushes stand tall,
safes squat, slime and tacks and pits lie low, dropped daggers glint.
And the replay reel gains a 👁 toggle: relive the catch-up or the whole
tale through your wizard's eyes, the camera turning before it strides,
easing between cells, cutting on teleports, and turning toward whoever
acted while you stood still. The /?fpv workshop grows &demo=1 — two
automatons play a stretch and the real Replay component reruns it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:29:11 -04:00
Eric WagonerandClaude Fable 5 3c479eddbb The maze through a wizard's eyes: the first-person raycaster (/?fpv)
Stage one of the replay vision: a canvas raycaster over the GameView —
walls on edges marched by DDA, doors with lintels, firewalls that
flicker, rim warp mouths that shimmer violet, token art billboarded and
occluded per column, torchlit vignette. It renders the view a player
would be SENT, so an illusion this wizard has not seen through stands as
solid as stone in first person too. The /?fpv workshop free-flies a
dealt maze with wall collision, a minimap eye-cone, and ?seed=&x=&y=&dir=
to stand the camera anywhere. Next: drive it from the replay reel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:19:03 -04:00