The Token Workshop

Every token, twice: the photographed physical set beside the hand-drawn contingency. Edit public/tokens-svg/ and refresh. Small is board size; large is the close-up the peek modal shows. → the flourish workshop

{#each GROUPS as group (group.title)}

{group.title}

{#each group.files as f (f)}
{`${f} photo
drawn
{f}
{/each}
{/each}

The masonry — first-person wall textures

The materials the raycaster (/?fpv) wraps its walls in. Each lives at public/textures/<name>.png — repaint the file (any size) and refresh; the built-in procedural bake stands in wherever a file is missing.

{#each ["wall", "rim", "stone", "door", "firewall", "warp", "doorframe", "cracks", "floor", "ceiling", "home", "pit", "slime", "tacks", "dimwarp", "underbrush"] as name (name)}
{`${name}
{name}
{/each}

The conjurations — first-person spell sprites

The moments the raycaster throws through the air: projectiles in flight, bursts on landing, shimmers and shields. Each lives at public/fx3d/<name>.png — square, transparent ground, drawn glowing mid-air at any size; a procedural glow stands in wherever a file is missing.

{#each FX_ART as name (name)}
{`${name}
{name}
{/each}

The standing terrain — first-person volumes

Terrain that stands in the room: hedges filling a square to half height, the killer ooze as a translucent cube, dust billowing, the dimensional warp's pillar of light. Each lives at public/terrain3d/<name>.png — transparent PNG, any size; hedges render twice as wide as tall. Rehearse them in place with /?fpv&terrain=thornbush@3,7;jello@4,7.

{#each TERRAIN3D as name (name)}
{`${name}
{name}
{/each}

Walls & doors — as the maze draws them

Wall-segment effects have never been tokens: locks picked, jammed, and removed, held doors, standing fires, and illusions are edge treatments, shown here with the very components the board mounts.

{#each EDGE_PIECES as piece (piece.caption)}
{#each [0, 1, 2] as cy (cy)}{#each [0, 1, 2] as cx (cx)} {/each}{/each} {#if piece.special === "firewall"} {:else if piece.special === "shimmer"} {:else if piece.special === "known-illusion"} {:else} {/if}
{piece.caption}
{/each}