
Bots on your server
BattleSpades bots are server-owned players with fair perception and aim, voxel pathfinding, class tools and mode-specific roles. They keep an empty server playable and step aside as humans arrive.
How many bots
[bots] population_mode decides how the bot count is managed. The server re-checks it about once a second.
| Mode | Behaviour | Use it for |
|---|---|---|
backfill (default) | Bots = fill_target − playing humans (spectators do not count), never above max_bots. Each human who joins replaces a bot. | Public servers that should never feel empty |
fixed | Always max_bots bots. | Practice servers, bot-only matches |
admin | Only bots added with /bots add; nothing automatic. | Events and testing |
In every mode bots never take the last free slots: reserve_human_slots (at least 1, sample 2) are always kept free so a human can join a full server, and bots are retired from the larger team first. Bots also count toward [server] max_players.
# Keep matches at about 12 players
[bots]
enabled = true
population_mode = "backfill"
fill_target = 12
max_bots = 12
reserve_human_slots = 2
# Always 8 bots
# population_mode = "fixed"
# max_bots = 8
# No bots at all
# enabled = falseDifficulty and skill balance
difficulty:casual,normal,hard, ormixed(a spread). It applies to newly created bot profiles;/bots difficulty hardchanges it live for new bots.skill_balance(on by default): when one team's humans clearly out-kill the other side, that team's bots are eased and the other team's bots sharpened — by at mostskill_balance_max_shift, atskill_balance_rateper second, ignoring small edges (skill_balance_deadband) and teams with fewer thanskill_balance_min_eventskills and deaths.behavior_version = "cooperative"(default) runs tactical squads;classicrestores the older behaviour layer.chatteradds occasional, rate-limited bot chat;friendly_mischiefallows harmless playfulness towards teammates.
Performance
Bot perception, decisions and pathfinding run outside the 60 Hz simulation; the game only applies their validated intentions within main_thread_budget_ms per tick.
| Setting | Sample | Official profiles | Notes |
|---|---|---|---|
worker | thread | process | process uses more memory but a native fault in the planner cannot take the server down. |
perception_hz | 10 | 8 | 1–30 |
decision_hz | 8 | 8 | Never above perception_hz |
main_thread_budget_ms | 0.75 | 1.5 | Main-thread time for bots per tick |
clean_slate_games | 3 | 3 | Recycle the planner every N games to keep memory flat |
Expect roughly 30–60 MB extra memory for bots. /bots status shows the worker's health (restarts, stalls, queue sizes).
Managing bots in game
After /admin <password>:
| Command | Effect |
|---|---|
/bots status | Bot count and worker health. |
/bots fill 12 | Switch to backfill with target 12 (capped at max_players). |
/bots add 2 blue | Add bots now (max 12 per command; team 1/blue/team1 or 2/green/team2). Switches to admin-managed population. |
/bots remove 2 | Remove bots by count, name prefix, or all. Objective carriers are kept. Also switches to admin mode. |
/bots difficulty hard | Difficulty for newly created bots. |
/bots debug on · /bots debug BotName | Show a bot's action, goal and path (diagnostics). |
These changes are in memory only; the config file decides the behaviour after a restart. See the full commands reference.
Bots and other systems
- Team balance moves or replaces bots before it ever moves a human.
- Map votes count bots as
map_vote_bot_weightof a player when sizing maps. - Kick votes: bots count toward
votekick_min_team_players. - Server lists: AoSPlay heartbeats report humans and bots separately.
- Anti-cheat reports never analyse bots; grief and AFK rules never apply to them.
Common questions
Bots do not appear.+
Check [bots] enabled = true, that fill_target/max_bots are above 0, and that free slots remain after reserve_human_slots. /bots status says “Bots disabled” when no bot runtime is running.
Can I name or skin bots?+
Not through configuration; the server generates bot names. Humans and bots share one name space, so a human can never take a live bot's name.


