Commit graph

11 commits

Author SHA1 Message Date
jedarden
2696e70257 Implement SiegeBot: spawn-lockout strategy
- 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
2026-06-17 01:02:01 -04:00
jedarden
db54067f56 fix(engine): add wall awareness to zone escape direction
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>
2026-05-26 19:46:39 -04:00
jedarden
ccdec39c52 feat(engine): add zone escape as Priority 1 to all built-in bots
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
2026-05-26 18:47:39 -04:00
jedarden
149fbe4edf fix(engine): achieve 65-80% combat density target via zone timing and spawn radius
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>
2026-05-26 11:51:30 -04:00
jedarden
c97912a782 feat(engine): increase 2-player spawn radius and make RusherBot cautious
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>
2026-05-26 09:52:44 -04:00
jedarden
4f1b26f6fe feat(bots): add zone bounds awareness to GathererBot, RusherBot, SwarmBot
- 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>
2026-05-26 08:03:30 -04:00
jedarden
0fb2d2976c feat(engine): SwarmBot soloMove advances toward enemies per plan §5.5
- 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.
2026-05-26 02:50:13 -04:00
jedarden
f8f4b58e9e feat(engine): add zone awareness to bot strategies
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
2026-05-26 02:01:03 -04:00
jedarden
ea04f4debb style: apply gofmt alignment fixes across codebase
Tab/space alignment consistency from running gofmt on all packages.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 10:40:33 -04:00
jedarden
4ba39e3aa8 feat(evolver): complete Phase 7 LLM-driven evolution implementation
- Complete autonomous evolution pipeline with island model (4 islands)
- MAP-Elites behavior grid integration for diversity
- LLM ensemble integration (fast + strong model tiers)
- 3-stage validation pipeline (syntax → schema → sandbox smoke test)
- Evaluation arena (10-match mini-tournament per candidate)
- Promotion gate (Nash equilibrium PSRO + MAP-Elites niche fill)
- Retirement policy (auto-retire low-rated bots, population cap)
- Live export to R2 for evolution dashboard
- Enhanced replay viewer with commentary and win probability
- Added series, seasons, and predictions pages

All tests passing. Phase 7 exit criteria met.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 16:38:48 -04:00
jedarden
df3e59b9a9 feat(acb-local): add strategy bots for offline matches
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>
2026-03-29 14:27:36 -04:00