Files
wizwar6e/research/fx3d-sprite-spec.md
Eric WagonerandClaude Fable 5 7a32370ccb Credibility pass: the reel's scars sanded, the veil finally hung
Three blind reviews over the first-person arc, every finding verified
against the source. History-narrating comments made timeless or cut;
the stacked BUDDY comment collapsed to one voice. Dead code out: the
orphaned FACE copy, the DIR_ANGLE duplicate, the dead loop-counter
poke, the impossible-state sentinel. The never-produced "warp" hit
kind resolved the right way — warp mouths now hang a translucent veil
of the painted warp texture, so art that never rendered finally does.
Types tightened (SlabStrike named once, ShareData rides CatchUpStep,
botTier loses its casts), the gallery reads MATERIALS instead of a
hand-copied list, the chronicle resets through one helper, a
superseded share mint rejects instead of stranding, and the conjured
safe gains the growth key its siblings had. Tests lose a triple
assignment, a tautology, and two self-swallowing regex alternatives.
The sprite spec — which still told the artist to paint for additive
compositing the renderer no longer uses — now describes the renderer
that exists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:41:11 -04:00

5.1 KiB
Raw Permalink Blame History

The conjuration sprites — a spec for the artist

The first-person view (/?fpv, and the replay's "your eyes" mode) throws spell moments through the air as billboard sprites: flat images that always face the camera, drawn in mid-air, occluded by walls, and scaled by distance. The sprites in FX_ART (fpv/fx3d.ts) cover every spell moment in the game. Each lives at packages/web/public/fx3d/<name>.png — replace the file, refresh, done. Missing files fall back to built-in procedural glows; the whole set is shown side by side at /?tokens under "The conjurations."

Technical requirements

  • Format: PNG with a transparent background. The transparent area is essential — whatever is opaque is what flies.
  • Size: square, any resolution; 128×128 or 256×256 recommended. The renderer scales freely and pixelates on magnification (the whole view is deliberately chunky, like the wall textures).
  • Compositing: painted sprites draw normally — inks stay true, dark outlines hold. (Only warpglow in terrain3d is drawn additively, as light.) Impacts fade out by alpha as they swell.
  • No animation frames. Each sprite is a single still. Motion comes from the renderer: projectiles streak across the room, impacts swell from small to large while fading out. Radially symmetric (or nearly so) designs work best since the image does not rotate.
  • Fills most of the canvas. Leave only a small transparent margin; the renderer sizes the sprite by its canvas, not its painted extent.

The nine sprites and where they appear

file flies as moment
fireball.png projectile Fireball, Sudden Death, Blaster Wand — a ball of fire streaking caster → target
bolt.png projectile Lightning Blast, Power Drain — a crackling bolt
waterbolt.png projectile Waterbolt — a hurled gout of water
spark.png projectile anything else that travels: thrown objects, bodies knocked back, dragged things — a neutral streak of force
burst.png impact a fireball landing; victory fireworks — swells and fades
splash.png impact waterbolt landing, stone turned to water
hit.png impact damage landing on someone you can see; punches, claws
shimmer.png impact teleports, warps, illusions, minds touched — the general "magic happened here" glimmer, violet by tradition
shield.png impact an attack fully stopped; absorbed spells
rubble.png prop a destroyed wall's remains: bursts on the kill, then stands stretched across the fallen edge's whole gap for the rest of the reel — piles painted at the canvas's lower corners land at the two posts

Projectiles hold their size in flight (about a third of a wizard's height). Impacts start small and swell past triple while fading — so an impact painted as a ring or burst reads especially well.

What the sprites do NOT need to carry: screen-wide flashes when YOU are hit (red), healed (green), or teleported (violet), the camera shake, the door slide (doors animate by sliding door.png along its own edge — no separate art), and the jammed-lock seethe (a pulsing rust glow the renderer lays over the door) — those are renderer effects, not images.

The terrain, in two families

Floor decalspublic/textures/pit.png, slime.png, tacks.png, dimwarp.png — are painted INTO the flagstones by the floor caster, alpha-blended texel by texel like the home tile: transparent wherever plain floor should show. The pit can carry its own painted label if wanted. Square, any size.

Standing volumespublic/terrain3d/thornbush.png, rosebush.png, jello.png, dust.png, warpglow.png — are billboards in the room. The hedges render CELL-WIDE at half wall height (paint them twice as wide as tall; a wizard in the square peeks over the top). The jello cube fills the whole square and is drawn ~60% opaque — paint it solid, the renderer supplies the translucency. Dust likewise. warpglow is a pillar of light drawn ADDITIVELY (like the old glow sprites): bright means bright, black vanishes. Rehearse any of them in place: /?fpv&terrain=thornbush@3,7;jello@4,7;dimwarp@2,7.

Walls' dressing and damage

public/textures/doorframe.png dresses OPEN doorways: paint an empty stone doorway on transparency — posts in the outer ~8% columns, the lintel in the top ~16% rows, nothing in the middle (the way through). public/textures/cracks.png is battle damage: dark fractures on transparency, laid over any damaged wall with opacity rising as the harm mounts. public/textures/underbrush.png is the ground beneath a hedge — leaf litter to the square's edges, a floor decal like the pit. public/terrain3d/safe.png is the wall safe, standing as an opaque strongbox (square, transparent ground).

One more paintable surface: the home tile

public/textures/home.png is a floor overlay for home-base cells, drawn over the flagstones and TINTED by the owning wizard's color at draw time. Paint it near-white/neutral with transparency wherever the plain floor should show through; the tint does the rest. Square, any size, same as the other textures.