06 — Shadowhunter
How the Hunter Learned to Move
Every sprite in Shadowhunter is a real video generation, cut into cells and packed by hand-written tools. The laws that keep a one-person Godot game looking like one drawing.

Shadowhunter runs on Godot 4.6 and started on the last day of August 2026 as a prototype called Wispbound. The hero came from a set of six concepts and was picked for being a hybrid: a lantern archer with a bow and traps who could swap to a staff and spells. Most of that hybrid has since sharpened into one identity, the Hunter, but the ambition stayed. Movement first. Everything else second.
The pipeline is unusual. Hero animation cells are generated with MiniMax H3, a video model, from a single reference pose on a flat magenta plate. Each clip is keyed, measured and packed into a sprite sheet by a small Python toolchain: pack, audit, normalise, defringe. Enemies and creatures start from a Nano Banana reference that matches the flat-cel style, then go through the same H3 route in parallel batches. Environment panels are Nano Banana too, sliced into parallax layers and tiles.

The laws
The rules are written down and enforced by scripts, because the project learned each one the hard way.
Animation-led only. The hero is never rotated or scaled in code. An aim lean done with rotation was removed. State changes must be real animations, and a squash-scale is a bug, not a feel pass.
Figure-scale law. Never resize pose content to fill the frame. Every H3 clip opens on the standing reference, so the packer scales from frame zero's body height to a fixed 138 pixels and anchors the feet row. Scaling by the set's median height inflated every leaning pose, and a height-only audit missed it: the tell was hood width, not body height.
Palette law. The Hunter is slate indigo with pale grey accents, and those colours never appear in environment art. The forest lives in deep teal-greens, back layer lightest and playable layer darkest, with gold and glow-teal reserved for light sources. Blood is one red. Plague green belongs to enemies only. Fire is red, orange and gold, never magenta, because magenta is the key colour and a keyed flame leaves a halo.
Texture law. The game ships on iPad through OpenGL, where any texture over 4096 pixels on a side is clamped and sprite slicing corrupts: chipped heads, flashing edges, sunk feet, while the Mac looks perfect. Every shipped sheet is at most 2048 wide, multi-row, with a sidecar text file describing the grid.
Never rotate or scale the hero in code. If it looks like it should react, it must.
— Two of the standing rules
A reactive forest
The environment consistency law came out of a QA note about disconnected vines. Everything now attaches to the painted surface, never to the tile row: ground art rides a few pixels above its row with a mossy lip, ledges span their painted thickness, hanging things attach to the painted underside. One anchor helper per surface type, so a floating prop is fixed in the maths rather than nudged by hand.
And the reactive rule: if it looks like it should react, it must. Flame arrows ignite grass and fire spreads tuft to tuft. Brambles burn away. Lanterns gust. Grass rustles. In the Hollow, three stone irises open and glow when the flame passes and close after it leaves, decoration that answers the player rather than a lock.
Low sound
The audio direction is three words: low, tactile, ASMR. No piercing tones. The Oathkeeper is heavy breath, dull shield contact, thick swings and grounded thumps. Dungeon gates grind stone and chain and settle with a subdued latch. The skill screen's flame cues were rejected once for being liquid and fizzy and rebuilt as rounded fire breaths, low woody whooshes and muted ember rumble, with treble rolled off above a kilohertz. Footsteps sit on the contact frames of the run at nineteen decibels under, with slight pitch variation, the way Hollow Knight and Celeste do it.
Every one of those cues is generated, mixed by a script from preserved originals, checked for peak and high-band energy, and then, because signal checks are not ears, handed to the owner to listen to on a real device. Some of them come back.