A darkly satirical top-down action-roguelite built for js13kGames 2026 (Theme: Unicorns and Rainbows).
The Grand Concordat of Radiant Serenity has criminalized naps, rain, and minor melancholies. Play as Vespera, a grumpy obsidian unicorn with a 300-year migraine, dismantling the Solar Spire to claim 500 years of uninterrupted sleep.
- WASD / Arrows — Move
- Mouse — Aim; Left Click — Umbral Lance
- Right Click — Somber Rainbow (bullet-absorbing Grump Arc; inflicts GRUMPY)
- Q — Void Scythe (AoE + knockback)
- Space / Shift — Phase Dash (i-frame dodge)
- Space / Enter — Advance dialogue & read Edict Shrines
- P — Pause / options · M — Mute · N — Reduced Motion
- Left half — drag to move · Right half — drag to aim & auto-fire
- On-screen buttons — Rainbow (◗), Scythe (Q), Dash (⇢)
(Landscape orientation recommended.)
- Procedurally generated runs — room order, count, enemy mix, and Edicts vary each run.
- Cynical Boons with a shard-funded reroll at altars.
- Full ability kit: buffed Somber Rainbow (fast, wide arc), and a Void Scythe forward slam.
- Juicy combat — enemy hit-flash, plus visible bullet-absorption on the Rainbow.
- Dramatic three-phase boss duel with a slow-motion finishing blow.
- Sim pauses during dialogue, so banter lands without unfair damage.
- 8 Edict shrines of dark satire, shown at random.
- Room-type visual tinting and a procedural victory lullaby ("The Eternal Nap").
- Pause / options overlay, mute, and a Reduced Motion toggle (auto-detects
prefers-reduced-motion). - Best clear-time & shard tracking saved to
localStorage. - Responsive canvas that scales to any viewport.
- Pure HTML5 Canvas 2D procedural rendering (zero external image assets).
- 100% procedural Web Audio API sound synthesizer.
- Ships ≤ 13,312 bytes zipped.
The readable, playable source is the root index.html (served directly by GitHub Pages). The competition artifact is produced by minifying + Roadroller-packing it into dist/:
npm install
npm run build # → dist/index.html + dist/game.zip, asserts the 13,312-byte budgetThe build fails (non-zero exit) if the zip exceeds the limit.
MIT © sandgraal