
Game modes, maps and rotation
BattleSpades runs all ten public modes of the retail Match Lobby plus the Arena extension. This guide shows how to pick the startup mode, control the clock, build a rotation, tune the end-of-round vote and add your own maps.
The modes
Use the short code in [game] default_mode, /mode and [modes.<code>]. The aliases are accepted everywhere and stored as the short code; an unknown name stops the server at startup with the list of valid names.
| Code | Mode | Retail clock | Retail map pool | Also accepted |
|---|---|---|---|---|
tdm | Team Deathmatch | 15 min | AncientEgypt, ArcticBase, Atlantis, BlockNess, CastleWars, DoubleDragon, DragonIsland, Frontier, GreatWall, Invasion, London, LunarBase, MayanJungle, SpookyMansion, TheColosseum, TokyoNeon | — |
ctf | Capture the Flag | 30 min | Atlantis, BlockNess, CastleWars, DoubleDragon, Invasion, TokyoNeon | — |
cctf | Classic CTF | 90 min | Crossroads, Hiesville, ToTheBridge, Trenches, WinterValley, WW1, Classic | classic-ctfclassic_ctf |
zom | Zombie | 10 min | AncientEgypt, ArcticBase, Atlantis, BlockNess, BranCastle, CastleWars, DoubleDragon, DragonIsland, Frontier, GreatWall, Invasion, London, MayanJungle, SpookyMansion, TheColosseum, TokyoNeon | zombie |
vip | VIP | 15 min | Alcatraz, CityOfChicago | — |
mh | Multi-Hill | 25 min | AncientEgypt, Atlantis, BlockNess, BranCastle, CastleWars, DoubleDragon, DragonIsland, Frontier, GreatWall, Invasion, London, LunarBase, MayanJungle, SpookyMansion, TheColosseum | multi-hillmultihill |
tc | Territory Control | 25 min | Alcatraz, CityOfChicago | territory-controlterritory_control |
dia | Diamond Mine | 15 min | AncientEgypt, ArcticBase, Atlantis, BlockNess, BranCastle, CastleWars, DoubleDragon, DragonIsland, Frontier, GreatWall, London, LunarBase, MayanJungle, SpookyMansion, TheColosseum, TokyoNeon | diamonddiamond_mine |
dem | Demolition | 15 min | Atlantis, BlockNess, CastleWars, DoubleDragon, DragonIsland, Frontier, LunarBase, TokyoNeon | demolition |
oc | Occupation | 15 min | AncientEgypt, ArcticBase, Atlantis, BlockNess, DragonIsland, Frontier, GreatWall, Invasion, London, LunarBase, MayanJungle, SpookyMansion, TheColosseum | occupation |
arena | Arena (BattleSpades extension) | rounds (no clock) | any installed map | — |
- TDM, CTF, Classic CTF, Zombie and VIP are fully playable.
- Multi-Hill, Territory Control, Diamond Mine, Demolition and Occupation have complete objective state machines (hills, territories, diamond cash-in, destructible bases, bombs) and tests; exact retail parity is still being confirmed in live matches.
- Classic CTF locks both teams to the classic Deuce class and uses the seven classic maps. VIP and Territory Control use the mafia maps Alcatraz and CityOfChicago.
- Arena is a BattleSpades extension (rounds instead of a clock), not a retail Match Lobby row.
Startup mode, map and clock
[game]
default_mode = "tdm"
default_map = "ArcticBase" # file maps/ArcticBase.vxl
[lobby]
# One clock for every mode; only 5,10,15,...,60 or 90 are accepted.
match_length_minutes = 20
[modes.ctf]
time_limit = 1800 # seconds; beats match_length_minutes for CTFClock precedence: [modes.<code>] time_limit (seconds, 0 = no clock) → [lobby] match_length_minutes → the mode's retail clock from the table above. Score targets come from the mode's [game_rules] rule (for example RULE_TDM_SCORE_TARGET = 200, RULE_CTF_SCORE_TARGET = 5) or a score_limit override. Every per-mode key is listed in the configuration reference.
Map rotation
[lobby] map_rotation is the list of maps offered in the end-of-round vote.
- Empty (`[]`, the default): the mode's retail playlist from the table above, filtered exactly like retail (maps marked invalid for the mode are skipped). If none of those maps is installed, every
.vxlin the maps folder is used. - A list: exactly these maps. Names are
.vxlfile names without extension; missing files are logged and skipped, and stock maps retail marks invalid for the running mode (such as GreatWall in Demolition) are dropped with a warning. map_rotation_shuffle = trueshuffles the list once at startup, as the retail lobby did;falsekeeps your order.
[lobby]
map_rotation = ["CastleWars", "TokyoNeon", "Atlantis", "BlockNess"]
map_rotation_shuffle = falseMaps shipped with the server:
20thCenturyTownAlcatrazAncientEgyptArcticBaseAtlantisBlockNessBranCastleCastleWarsCityOfChicagoClassicCrossroadsDoubleDragonDragonIslandFrontierGreatWallHiesvilleInvasionLondonLunarBaseMayanJungleSpookyMansionTheColosseumToTheBridgeTokyoNeonTrainingTrenchesWW1WinterValley
End-of-round vote and presentation
When a round ends, players vote for the next map from candidates drawn from the rotation (never the current map). The candidates are ordered to suit the lobby:
- With
map_vote_size_fiton, maps whose playable area fits the player count come first: the ideal area is players ×map_vote_area_per_player(8000 columns), never belowmap_vote_min_area(24000). Bots count asmap_vote_bot_weightof a player. - The last
map_vote_recent_exclude(2) played maps are offered last. - With
map_vote_retail_max_players, maps whose retail player cap is below the human count (DragonIsland 16, London and LunarBase 20, BlockNess and SpookyMansion 24) are offered after maps that fit. map_size_overridespins a map's size when its bot-navigation cache is missing or misleading:{ WW1 = "large", DragonIsland = 27000 }(small,medium,large).
After the vote the scores screen stays up for end_screen_seconds (12 s), then every client reloads into the next map. end_round_scoreboard holds the scoreboard open at round end and end_round_headline shows the retail result headline (“Blue wins!”, “Draw!”).
Admin controls
| Command | Effect |
|---|---|
/map CastleWars | Switch map now (all clients reload). |
/mode ctf | Switch mode now. |
/restart | Restart the round on the same map, skipping the end screen. |
/endround 1 | End the round now with team 1 as winner (or the current leader without an argument) and run the normal end-of-round sequence. |
/time 300 | Set the remaining time to 5 minutes. |
Custom maps
- 01Format
Maps are Ace of Spades
.vxlfiles of 512 × 512 × 240 voxels. - 02Install
Copy
MyMap.vxlinto themaps/folder (or your[world] maps_path). - 03Metadata (optional)
Spawns, bases, objectives, crates, fog and skybox come from a sidecar next to the map:
MyMap.json, or the.txt/.ugcpair written by the BattleSpades Map Creator. Without one the server derives team sides and spawns from the terrain and team-coloured markers, and uses[world] default_skyboxandfog_color_rgb. - 04Use it
Set
default_map = "MyMap", add it tomap_rotation, or switch live with/map MyMap.
Bots work on custom maps without preparation; the bot worker builds its navigation data from the map on load. Shipped maps include a precomputed .botnav cache to start faster; a source checkout can build one for your map with py -3 scripts/build_bot_navigation.py --map MyMap.
The Map Creator (run_map_creator.py / BattleSpadesMapCreator) is a separate program for building maps with the retail editor UI; it requires your own retail game assets and is configured through [map_creator].
Retail-style presets
The ten profiles in configs/ are complete examples of retail-faithful setups (rotation, clock, bots). Copy one next to your config.toml and start it with --config, or run them all with the fleet launcher; see Multiple servers and updates.
Common questions
Can I run two modes on one server?+
One server runs one mode at a time; /mode switches it live. To offer several modes at once, run several servers (the fleet launcher does this).
Why was a map in my rotation skipped?+
Either the file is missing from the maps folder (the log names it) or the retail catalogue marks that map invalid for the running mode.
How do I disable the clock?+
Set time_limit = 0 in the mode's [modes.<code>] table. The mode then ends only by its score target.


