Multiplayer arena bomber: low-poly 3D, dedicated servers, up to 8 players per match.
Drop bombs, blow up soft blocks, grab power-ups, be the last one standing. Anyone can open a match; it shows up in the public lobby list and fills with players (or bots) until the host starts it. No Steam, no accounts required to play.
Download the Windows installer from blastlands.ferrlabs.com.
- Pick a name, then a character, then a mode on the match list. All three are remembered on that machine, so the next launch goes straight to the match list; Change next to your name goes back to edit it.
- Host a match asks for the mode, how many seats (2 to 8) and how hard the bots are, then lists the match publicly. Both choices are remembered like the mode. Others join from the list, the host can Add bot to fill seats, and starts whenever they like; every seat nobody took goes to a bot.
- The lobby hands each player a dedicated server instance. The server runs the simulation, clients only send their inputs.
- A player who drops out mid-round is taken over by a bot.
- The game checks for a new version on launch. When one is out, an icon and a card appear at the bottom right of the lobby, and F5 installs it and restarts.
| Mode | Board | Bombs | Moves | Sight |
|---|---|---|---|---|
| Classic | the bomberman board: 13x11 inside a border, a pillar on every other tile, corner starts | owned, each one comes back once it goes off | walk, place a bomb | the whole board |
| Classic Blinded | same as Classic | same as Classic | same as Classic | only what you have a line to |
| Arena | 25x21 eroded island, cover in clumps, bushes to hide in | found on the ground, spent for good | walk, dash, shove, ability | only what you have a line to |
| Survival | same as Classic | same as Classic, and fire only hurts zombies | same as Classic | the whole board |
Survival is co-op: everyone against five waves of zombies. They walk the corridors towards the nearest player, kill on contact, chew through a soft block when walls shut them out, and die to fire like anything else. Each wave is bigger and a little faster, with five seconds of breather in between. Clear the fifth and the run is won; if everyone is caught, it is over. There is no sudden death in this mode. Bots play on your side.
In the versus modes, destroyed soft blocks grow back after 20 seconds (a marker shows where), and after 90 seconds sudden death closes the board from the edge one ring every five seconds, so no round outlasts two minutes. Last one standing wins. Soft blocks grow back in Survival too.
The blast is a disc, stopped by walls, and a bomb caught in fire goes off at once, so chains are part of the game. Soft blocks hide pickups:
| Pickup | Effect |
|---|---|
| Bomb up | carry one more bomb |
| Fire up | one more tile of blast reach |
| Speed up | one step faster |
| Pierce bomb | the next bomb burns through soft blocks |
| Cluster bomb | the next bomb flares one tile around the end of each arm |
Classic and Classic Blinded add three more, under blocks that would otherwise hide nothing:
| Pickup | Effect |
|---|---|
| Kick | walking into a bomb sends it sliding until something stops it |
| Remote | your bombs wait for the ability button instead of a fuse, oldest first |
| Skull | a random curse for 10 s: slow, too fast, reversed controls, dropping bombs nonstop, or no bombs at all |
Each character starts with a kit and has one ability on a cooldown. Classic modes play without characters.
| Character | Starts with | Ability |
|---|---|---|
| Demolisher | one more tile of reach | Trigger: sets off your oldest live bomb now (6 s) |
| Runner | two speed steps | Vanish: hidden for 2 s wherever you stand (10 s) |
| Grenadier | cluster bombs | Throw: your next bomb lands up to three tiles ahead (5 s) |
| Sapper | pierce bombs | Wall: raises a soft block in front of you for 8 s (10 s) |
| Action | Keyboard and mouse | Gamepad |
|---|---|---|
| Move | WASD, ZQSD or arrows | left stick or d-pad |
| Drop a bomb | E | south button (A / Cross) |
| Dash | Space | either shoulder |
| Shove | left click | west button (X / Square) |
| Ability | right click | north button (Y / Triangle) |
A shove never kills on its own: it pushes the nearest player in front of you, and stuns them if they hit a wall. Xbox and PlayStation pads both work, and the on-screen prompts follow whichever one is plugged in.
Settings on the match list sets the master volume, turns the screen shake on or off, picks the HUD size (Small, Normal, Large), and rebinds the keyboard key or mouse button for dropping a bomb, dashing, shoving and the ability. A key that is already in use is refused, Esc cancels a rebind, Reset keys puts the defaults back, and the HUD prompts show whatever you picked. Everything is saved on that machine. Movement keys and pad buttons are fixed.
Easy, Normal and Hard. They use the same inputs as a player and see only what a player in their seat would see. A harder bot plans further ahead, reacts sooner and remembers where it last saw you for longer. The host picks the difficulty for an online match, and it covers the bots that fill empty seats and the ones that take over from a player who dropped out. Practice plays at Normal.
Practice vs bots on the match list starts a local match in the mode selected there,
without a server or a connection: one player per gamepad (the first also gets the keyboard),
up to four, with bots in the other seats and the screen split between the people playing. The
series is first to three rounds, the other seats' characters rotate between rounds, R or Start
rerolls the board, and Escape or Select goes back to the lobby. Opening the Match scene
directly in the editor runs the same thing in Arena.
- Seven arena themes (Wasteland, Overgrown, Desert, Boneyard, Military base, Crypt, Volcano), one picked per match.
- Low-poly Synty art, with a 3D preview of your character in the lobby.
- A camera that follows your player, online and alone on a couch, and a split screen when
several people play locally.
--no-shakeon the command line turns off the screen shake whatever Settings says. - Positional sound on a single screen: a fuse just off screen is heard from its side. Split
screen falls back to a flat mix. The effects are built from Kenney's CC0 packs, see
client/Assets/_Game/Audio/LICENSE.txt.
The design reasoning and the numbers behind the tuning are in docs/GAMEPLAY.md.
| Path | What |
|---|---|
client/ |
Unity 6 project. Builds the player client and the headless dedicated server (same codebase, SERVER define). |
client/Assets/_Game/Core/ |
Engine-free deterministic simulation (grid, bombs, explosions, bots). No UnityEngine references, so it compiles under plain .NET. |
client/Assets/_Game/Runtime/ |
Unity glue: presentation, input, Netcode for GameObjects wiring. |
server/ |
Rust + axum lobby service. Holds the match directory and allocates game server instances. |
tests/ |
.NET test project that compiles the sim core outside Unity so CI can run it without a Unity licence. |
docs/ |
Architecture and gameplay design. |
┌──────────────────────┐
Unity client ───▶│ lobby (Rust/axum) │ list / create / join matches
│ api.blastlands.* │
└──────────┬───────────┘
│ allocates
▼
┌──────────────────────┐
Unity client ══▶│ game server instance │ authoritative simulation, UDP
(UTP) │ Unity Dedicated Srv │ several matches per process, one port each
└──────────────────────┘
The lobby never sees gameplay traffic: it hands the client a host:port and gets out of
the way. The game server is authoritative: clients send inputs, never positions.
Sim core tests (no Unity needed):
dotnet test tests/Blastlands.Core.TestsLobby:
cargo run --manifest-path server/Cargo.tomlClient: Unity Hub, Add, Add project from disk, client/, with Unity 6000.4.2f1.
The licensed art is a private submodule at client/Assets/Synty: clone with
--recurse-submodules and set up the LFS credentials described in docs/assets.md.
The repo tracks Packages/manifest.json, ProjectVersion.txt and Assets/; Unity generates
the rest of ProjectSettings/ on first open and resolves the packages from the manifest.
After the first open you still need to create the URP asset and assign it in Graphics and
Quality settings: the manifest pulls the package, not the configuration.
Pre-alpha and playable. The milestones show what is being built next.
The code is Apache-2.0, see LICENSE.
The art is not. The Synty packs the game draws with are licensed to FerrLabs and live in a
private repository, mounted at client/Assets/Synty as a submodule that only FerrLabs can
clone, so a clone of this repository carries no licensed asset. The game opens and runs
without them, with missing meshes where the art would be. docs/assets.md
explains how that is put together and what has to be bought to see the game as it looks.
A FerrLabs project.