A Super Meat Boy–style browser platformer starring Clawd, parodying the AI race. Built with three.js and Vite. See DESIGN.md for the story, mechanics, and roadmap.
npm install
npm run dev # http://localhost:5173 (add `-- --host` to reach it from Windows when running in WSL)
npm run build # static site in dist/| Action | Keyboard | Gamepad |
|---|---|---|
| Move | Arrows / WASD | Left stick / D-pad |
| Jump (hold for height) | Space / Z / J / Up | A |
| Run | Shift / X / K | X / RB / RT |
| Extended Thinking | C / L | Y / LB / LT |
| Restart (from the checkpoint, once reached) | R | Select (Y on the replay screen) |
| Hint ghost on/off | H | B |
| Menu | Esc | B on the replay screen |
| Music on/off | M, or click the note in the bottom-left corner | |
| Options (music, volumes) | O on the title screen |
src/level.js: physics, hazards, splatter, checkpoints, replay, the hint ghost (feel constants live inPat the top)src/levels.js: ASCII level maps (legend at the top); long levels are chains of screen-sized chunkssrc/route.js/src/routes.js: replays the solver's winning route for each level to drive the hint ghost;routes.jsis generatedsrc/cutscenes.js: scripted in-engine cutscenessrc/pixel.js: pixel pipeline (low-res integer-scaled render, orthographic camera, sprite helpers)src/sprites.js: all pixel art, generated in code (Clawd frames, tiles, saws, backdrops, bosses, props)src/audio.js: procedural WebAudio sound effects (and the shared AudioContext / SFX volume)src/music.js: stage soundtrack player: streamed MP3s with crossfades, loudness levelling and the thinking mufflepublic/music/: the soundtrack MP3s (256 kbps)src/main.js: game flow, HUD, title screentools/solver.js: dev-only solver that beam-searches the real physics to prove levels are beatable, set par times and boss speed, and record the hint routes;tools/solve.mjsruns it from the command line
node tools/solve.mjs # every level: solved?, solver time vs par (and a suggested par), boss gap
node tools/solve.mjs 1-5 --trace # one level, with its route drawn on the ASCII map
node tools/solve.mjs --write-routes # re-record the hint routes into src/routes.js
node tools/solve.mjs 1-B --mods '{"boss":{"speed":12.1,"catchup":7.1,"delay":0.56}}' # boss stress testAfter editing a level, run --write-routes (for that level id, or all of them). The game checks each
route on load and turns the hint off for that level if the map has changed since it was recorded.
The boss takes about two minutes to solve (it searches a wider beam); the other levels take seconds each.
All music by Kevin MacLeod (incompetech.com), licensed under Creative Commons: By Attribution 4.0. The credit (with the track list below) is also shown on the in-game Credits screen.
| Stage | Track |
|---|---|
| Title, prologue, epilogue | Exhilarate |
| 1-1 Hello, World | Rocket Power |
| 1-2 Wall of Text | Ready Aim Fire |
| 1-3 Gradient Descent | In a Heartbeat |
| 1-4 Hallucination | Dream Culture |
| 1-5 Human Feedback | Pinball Spring 160 |
| 1-6 Prompt Injection | Overworld |
| 1-7 Rate Limited | Blown Away |
| 1-8 Data Pipeline | Cyborg Ninja |
| Boss intro, 1-B The Gemini Twins | Summon the Rawk |
Dr. Overfit's laugh at the end of the epilogue is Evil Cyber Laugh
by AppPro (CC0), in public/sfx/.
To add or swap a track: drop the MP3 (128–256 kbps) in public/music/, measure its loudness with
ffmpeg -i track.mp3 -af ebur128 -f null - (the final I: value, in LUFS) and add it to TRACKS in
src/music.js so it's levelled against the others.