A magpie is robbing a museum at night, and the only thing that can catch her is light. The watchmen's lanterns are real shadow-casting Light2D cones; the display cases and columns carry LightOccluder2D polygons; and the detection test raycasts that same geometry. What you see shaded is literally the stealth state — step behind the case that blocks the light and you have blocked the guard's eyes too.
Arrows / WASD to move · Shift to sneak · E to pry a case · X to flutter-dash (the guards hear it) · P pause · M reduced motion. Five jewels home to the nest before three catches.
Three concept sheets were generated before a line of code: night key art, a magpie character sheet and a museum prop callout board. Every named thing on those sheets is a real authored asset in the shipped game — 24 rows, no skips. The engine frame beside the key art is the live build, not a mock-up.


The whole heist ran as gray rectangles first — patrol routes, cone geometry, occluder raycasts, the pry hold, the carry, the third guard arriving after the third jewel, the dawn restart. Three blockout rounds; round 1 failed because the autopilot parked 118 px from a case, outside the 78 px pry radius, and the fix was to path to the case centre and stop at 62 px. Only then did any art get made.


There are no drawn sprites in this piece. The magpie and the guards are built,
rigged and rendered in Blender at a fixed 64 px/metre, and every single frame is rendered
twice: once for colour and once through a camera-space normal shader. The engine feeds both
halves into a CanvasTexture, so a lantern sweeping past genuinely relights the bird's
back and the parquet's bevels. Directions are never mirrored — flip_h does not re-sign
a normal map's X channel, so all four facings are rendered for real.
The watchmen's gait is not hand-posed: CMU clip 02_01 is retargeted onto the guard rig through the platform's mocap kit and sampled into six frames per direction, with the long stationary clip 15_04 mined for the idle. The lantern arm is the one authored exception — a night watchman carries a lamp, he does not swing it like a free hand, so that arm's baked curves are stripped and hand-set while the mocap still drives the whole body.


A carried light that floats near the lantern instead of on it is a defect
class this lab has already paid for. Here the lantern-glass pixel is measured in Blender for every
frame of every direction and written into char.json; in the engine both the warm pool
and the detection cone are re-pinned to that anchor each frame. The cone the renderer draws
and the ray the detection test casts start from the same point — there is no second, invisible
geometry.
The lab audits with Playwright on this host's software renderer — no GPU — so the frame rate below is the floor, not the ceiling. Unflattering rows included.
| Measurement | Value |
|---|---|
| Export payload (pck) | 1.67 MB |
| Engine runtime (wasm, fixed) | 33.7 MB |
| Authored art in the payload | 1.29 MB |
| Audio stems | 0.46 MB |
| Blockout rounds | 3 (r1 failed: autopilot parked outside the pry radius) |
| Art audit rounds | 7 — r1-r5 found 10 visual defects, r6 clean, r7 confirming |
| Sprite frames rendered | 152 (76 diffuse + 76 camera-space normal) |
| Mocap clips used | CMU 02_01 walk, 15_04 idle (guards); the magpie is procedural |
| Selftest playthrough | 5/5 jewels, win at t=126 s |
| Frame rate in audit | software renderer, no GPU - a fraction of a frame per second |
| Known environment artifact | the software rasterizer stops presenting the world canvas after ~5 min of continuous play; the HUD survives. Investigated in cycle 1, not a scene-graph defect. |
Each guard's lantern is a texture-masked cone PointLight2D with shadows on. The cases and columns are LightOccluder2D — the shadows you see are the hiding places.
Every frame ships a matching camera-space normal pass through CanvasTexture, so the bird, the guards, the parquet and the case bevels all take the lantern light.
Lit means: inside the cone angle, inside range, and a clear raycast on the occluder layer — cast from the drawn lantern glass.
Block-parquet, carpet runner and marble border tiles, each rendered top-down in Blender with a real relief normal map.
Guard patrols and the selftest autopilot path the same grid, built from the actual collider footprints.
Feather bursts on the dash and on a catch, dust motes drifting inside the skylight moonbeams.