Skip to content

Repository files navigation

uBomber 💣

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.

Features

  • 💥 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

Quick start

npm install
npm run dev

Open 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/

Controls

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

How it works

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.

Repository layout

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

Contributing

New arenas need one TypeScript file. See CONTRIBUTING.md for ground rules and good first issues.

Credits & License

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.

About

An open-source Bomberman-style arcade game set in Stockholm.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages