- Add SiegeBot to engine/bot_strategies.go with spawn denial logic
- Implement standalone siege bot in bots/siege/ with main.go, strategy.go, Dockerfile
- Register siege bot in acb-local for arena testing
- Add test-siege-arena.sh script for validation
Strategy: Surround enemy cores to block spawning phase. Bot assigns
units to lockout rings (8 neighbors) around cores, greedily by distance.
Unassigned units collect energy or rush fully-sieged cores.
Tested: 3/10 wins vs rusher+gatherer, 1/10 wins vs rusher+gatherer+guardian
getZoneEscapeDirection now accepts wallSet parameter and skips directions
that would move into walls. This prevents bots from getting trapped by
walls when trying to escape the shrinking zone, allowing them to survive
longer and actually engage in combat instead of dying to zone.
Testing with RusherBot vs SwarmBot shows 85% combat density (target: 65-80%).
Fixes: RandomBot getting stuck against walls and dying to zone without
engaging in combat.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Per plan §3.7.1, the zone forces bots into contact. This change ensures
all built-in bots escape the zone FIRST when threatened (dist to zone
edge < 5 tiles), before any other action like energy collection or combat.
Changes:
- GuardianBot, SwarmBot, HunterBot: Added zone escape as Priority 1
- Phase 13 bots (Defender, Scout, Farmer, Pacifist, Phalanx, Raider,
Nomad, Opportunist, Assassin, Kamikaze): Added zone escape as Priority 1
- RandomBot: Added zone escape before random movement
The getZoneEscapeDirection function was already present and correctly
implements toroidal distance calculation with 5-tile safety margin.
Closes: bf-4m78q
Changes:
- Activate zone BEFORE bots move on turn 10 (previously after moves)
- Increase initial zone radius from 55% to 90% of map size
- Increase zone escape safety margin from 2 to 5 tiles
- Reduce 2-player spawn radius from 0.32 to 0.28 (11.2 tiles apart)
- Modify RusherBot to move toward center when no adjacent energy
Results (100 matches, rusher vs swarm):
- Combat density: 80% (target: 65-80%)
- Zone deaths: 17
- Avg turns per match: 9.5
- Deaths per 20 turns: 3.5
The zone now serves as an effective forcing function for combat engagement,
preventing pure energy farming strategies while maintaining strategic depth.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Problem: 2-player matches ended in early mutual destruction (turns 2-5)
with 90% combat density, far exceeding the plan target of 65-80% with
~1 death per 20 turns (plan §3.4, §3.7.1).
Solution:
1. Increased 2-player spawn radius from 0.20 to 0.32 (~13 tiles apart vs
8 tiles), giving bots time to collect energy before zone forces combat.
2. Modified RusherBot to collect energy and hold position before zone
starts (turn 10), preventing early aggression that leads to mutual
destruction.
Results (100 matches, gatherer vs rusher):
- Combat density: 61% (target: 65-80%, improved from 90%)
- Average turns: 14 (improved from 3-5)
- Turn range: 7-18 turns
- Zone now serves as forcing function for mid-game combat
Closes: bf-17ez
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add ZoneBounds type to bot state structs (Go, Rust, TypeScript)
- GathererBot now moves toward zone center when outside or near edge
- Bots can see zone bounds in fog-filtered state (per plan §3.7.1)
- Fixes gofmt formatting in types.go and bot_strategies.go
This improves bot survival and combat behavior by making them
zone-aware, preventing unnecessary zone deaths when the safe area
shrinks.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove enemy avoidance penalty (was -200 when close)
- Add bonus for moving closer to enemies (40 / distance)
- Add moderate bonus for being in attack range (+35)
- Increase energy priority slightly (100→120, 20→25)
Plan §5.5 states SwarmBot should 'advance as a group toward enemies'.
The previous soloMove behavior avoided enemies, contradicting this.
Now soloMode advances toward enemies to engage in combat and build
swarm via kills while still gathering energy.
Per plan §3.7.1, the shrinking zone is a forcing function that should
force combat engagement. Previously, bots ignored the zone and died
without fighting, achieving 0% combat density.
Changes:
- Add getZoneEscapeDirection() helper to calculate direction toward zone center
- Update GathererBot.computeBotMove() to check zone threat as priority 1
- Update RusherBot.GetMoves() to check zone threat before rushing
- Add safety margin (2 tiles) to anticipate shrinking zone
Results (20 replays with varied seeds):
- Combat density: 80% (16/20 matches have combat_deaths)
- Target: 65-80% per plan §3.7.1 ✓
- Deaths per 20 turns: ~6.2 (matches demo replay at ~5.7)
Bots now move toward zone center when threatened, forcing them into
contact range where focus-fire combat triggers naturally.
Closes: bf-y4fc
Add Go implementations of 5 strategy bots directly into the engine:
- GathererBot: prioritizes energy collection, avoids combat
- RusherBot: aggressively rushes enemy cores
- GuardianBot: defends cores with cautious expansion
- SwarmBot: formation-based coordinated movement
- HunterBot: targets isolated enemy units
Update acb-local with bot selection flags:
- -bot0/-bot1: select bot strategies
- -list-bots: list available strategies
- Default to gatherer vs rusher for interesting gameplay
Enables demo replays with real strategic behavior without K8s infrastructure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>