Local multiplayer SNES-style Bomberman clone for desktop web.
- TypeScript
- Phaser 3
- Vite
- Vitest
npm run devstart local dev servernpm run buildtype-check + production buildnpm run testrun simulation testsnpm run test:soakrun deterministic 60-rematch soak testnpm run lintrun eslintnpm run checklint + test + buildnpm run generate:assetsgenerate valid baseline external theme assets (PNG + WAV)npm run validate:assetsstrict external asset validation (signatures, frame counts, non-empty files)npm run check:releasefull check + strict asset validation (setSOAK_TESTS=1to also run soak test)
Drop final assets in public/assets/final using these files:
tileset.pngspritesheet frames:0 empty,1 hard,2 soft,3 sudden death,4 empty alt,5 hard alt,6 soft alt,7 sudden altplayers.pngspritesheet frames: 4 palette blocks x 8 directional frames each (32 total). Per block:0 down idle,1 down walk,2 up idle,3 up walk,4 left idle,5 left walk,6 right idle,7 right walkbombs.pngspritesheet frames:0 idle,1 litflames.pngspritesheet frames:0 frame A,1 frame Bpowerups.pngspritesheet frames:0 extraBomb,1 flameUp,2 fullFire,3 speedUp,4 kick,5 glove,6 powerBomb,7 skull- Audio files (any one format per key):
.oggor.mp3or.m4aor.wavbgm-battle.{ogg|mp3|m4a|wav}sfx-place.{ogg|mp3|m4a|wav}sfx-blast.{ogg|mp3|m4a|wav}sfx-pickup.{ogg|mp3|m4a|wav}
If any required visual sheet is missing or invalid, the game auto-falls back to generated retro sprites. If audio files are missing, unsupported, or invalid, it auto-falls back to synth SFX.
- Title:
Up/Downselect,Enterconfirm,Ssettings - Settings:
Up/Downselect,Left/Rightadjust or back,Enterapply,Escback - Lobby:
Up/Downselect row,Left/Righttoggle Human/Bot or change CPU difficulty,Entercontinue,Ssettings - Map Select:
Up/Downselect row,Left/Rightchange map/timer/set,Enterstart,Ssettings - Match:
- Player 1:
WASD+Space - Player 2: Arrow keys +
Enter - Player 3:
IJKL+U - Player 4: Numpad
8456+0 - Gamepads: auto-mapped by slot index
Ppause,Ffullscreen,Escmap select
- Player 1:
- Results:
Up/Downselect action,Left/RightorEnterconfirm
- Match rules now support
Single,Best of 3, andBest of 5set formats. - The battle HUD top bar shows the live set score for all player slots.
Enterfrom results advances to the next round until a player wins the set, then starts a fresh set with the same rules.
window.render_game_to_text()returns JSON state snapshot.window.advanceTime(ms)steps simulation deterministically by fixed ticks.window.export_replay_json()exports seed + input-frame replay JSON for bug repros.window.import_replay_json(payload)imports replay JSON and starts a replay run (or queues it until battle scene is active).