AOS REVIVALMenuJoin Discord
Server guide 08

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.

Checked BattleSpades 0.1.0-beta.17 minute read

How many bots

[bots] population_mode decides how the bot count is managed. The server re-checks it about once a second.

ModeBehaviourUse 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
fixedAlways max_bots bots.Practice servers, bot-only matches
adminOnly 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.

RecipesTXT
# 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 = false

Difficulty and skill balance

  • difficulty: casual, normal, hard, or mixed (a spread). It applies to newly created bot profiles; /bots difficulty hard changes 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 most skill_balance_max_shift, at skill_balance_rate per second, ignoring small edges (skill_balance_deadband) and teams with fewer than skill_balance_min_events kills and deaths.
  • behavior_version = "cooperative" (default) runs tactical squads; classic restores the older behaviour layer.
  • chatter adds occasional, rate-limited bot chat; friendly_mischief allows 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.

SettingSampleOfficial profilesNotes
workerthreadprocessprocess uses more memory but a native fault in the planner cannot take the server down.
perception_hz1081–30
decision_hz88Never above perception_hz
main_thread_budget_ms0.751.5Main-thread time for bots per tick
clean_slate_games33Recycle 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>:

CommandEffect
/bots statusBot count and worker health.
/bots fill 12Switch to backfill with target 12 (capped at max_players).
/bots add 2 blueAdd bots now (max 12 per command; team 1/blue/team1 or 2/green/team2). Switches to admin-managed population.
/bots remove 2Remove bots by count, name prefix, or all. Objective carriers are kept. Also switches to admin mode.
/bots difficulty hardDifficulty for newly created bots.
/bots debug on · /bots debug BotNameShow 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_weight of 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.