An open-source maze-bomber arcade game set in Stockholm.
Battle the computer across 10 arenas themed after Stockholm's districts — from the medieval alleys of Gamla Stan to the winter archipelago. Play solo in your browser, or create a room and invite up to 5 friends with a single link.
Built with Three.js on top of a deterministic, fixed-step TypeScript simulation, backed by Supabase Realtime, hosted on Vercel.
Every pixel and every sound is generated by code. The repository contains no images and no audio files: tilesets, block faces, characters, blasts, skylines, sound effects, ambience and music are all synthesized at runtime from each map's theme. That is what makes a new arena cost one file.
- 💥 Classic maze-bomber rules: bombs, chain explosions, destructible crates, power-ups (extra bomb, bigger flame, speed), last-one-standing wins — and sudden death walls that spiral in after 2 minutes, so no match drags on
- 🗺️ 10 Stockholm arenas, each with its own procedural tileset, skyline, weather, colour grade and generative soundtrack — no two share a tileset, a floor palette or an ambient bed, and the test suite enforces it
- 🎨 Zero art assets: ten floor generators, five block-face families, a parametric character with a hand-authored pose table, procedural skies
- 🔊 Zero audio assets: three Web Audio buses, position-panned effects synthesized from noise and oscillators, per-map ambient beds, generative music
- ✨ Bloom, per-map colour grading, screen shake, detonation flash, debris and per-map weather — all switchable from the menu to hold the frame rate
- 🤖 Bots with danger-aware pathfinding — they flee blasts, farm crates and hunt you down
- 🏆 Campaign mode: beat all 10 arenas in order; progress saved locally
- 🎯 Arcade scoring (crates +10, power-ups +25, kills +200, win +500, suicide −100) with a live scoreboard and a hearts indicator
- 📊 Rankings screen: overall totals and the best score on each arena
- 🔗 Link-based multiplayer: create a room, share
https://…/?room=K7WQ2R, friends drop straight into the lobby (up to 5 humans; bots fill the rest) - 🌱 Deterministic seeded arenas — every peer sees the same crates
- 🧪 The whole simulation is pure TypeScript, with determinism, fuzz and performance budgets enforced in CI
npm install
npm run devOpen the printed URL. That is the full game — solo play, campaign and rankings need no backend.
For online play, provision Supabase and drop a config.json next to the build;
see docs/LOCAL_DEVELOPMENT.md.
npm test # simulation, maps, bots, protocol, determinism, fuzz, perf
npm run build # typecheck + production build into dist/| Key | Action |
|---|---|
| Arrows / WASD | Move |
| Space | Drop a bomb (and skip ahead once you are out) |
| P | Pause (offline matches only) |
| Esc | Back out / leave the match |
| Layer | Tech | Docs |
|---|---|---|
| Simulation | Pure TypeScript, fixed 30 Hz tick, seeded RNG | ARCHITECTURE.md |
| Rendering | Three.js, orthographic, one instanced sprite batch | ARCHITECTURE.md |
| Art | Procedural canvas synthesis per map theme | MAPS.md |
| Audio | Web Audio synthesis, generative music | ARCHITECTURE.md |
| Bots | Danger maps + BFS pathfinding | ARCHITECTURE.md |
| Multiplayer | Host-authoritative over Supabase Realtime | MULTIPLAYER.md |
| Maps | One TypeScript module each, validated by tests | MAPS.md |
| Hosting | Vercel (Vite build), Supabase backend | DEPLOYMENT.md |
The arena draws in roughly ten calls: sky, two skyline bands, a shader-tiled
floor, one InstancedMesh holding every block, bomb, blast and character, one
particle pass, and the post stack. Instances are filled row by row, so instance
order alone gives a correct painter's y-sort.
src/core Pure simulation (no renderer imports)
src/ai Bots
src/net Supabase Realtime multiplayer
src/maps Ten arenas: grid + theme, one module each
src/render Three.js renderer, procedural art, VFX, post
src/audio Web Audio synthesis
src/ui Menu, lobby, HUD (DOM)
tests/ Vitest suites
supabase/ Database migrations + local stack config
docs/ Architecture, multiplayer, maps, local dev, deployment
New arenas need one TypeScript file. See CONTRIBUTING.md for ground rules and good first issues.
See CREDITS.md. Released under the MIT License.
uBomber belongs to the maze-bomber genre pioneered in the 1980s. It is an original work: all names, characters, art, audio and arena layouts were created for this project. It is not affiliated with or endorsed by any other game or rights holder.