Zone mechanics:
- Zone now starts with adaptive radius based on bot positions
(contains all bots + margin of 10) to prevent early deaths
- Zone center follows midpoint of living bots (dynamic)
- Zone shrink step: 6 tiles/turn for 2-player (faster forcing)
- Zone start turn: 5 (earlier to force combat before spread)
- Zone min radius: 0 (forces bots to same tile)
- Zone skips shrink on first turn (prevents instant kills)
Spawn radius:
- 2-player: reduced from 0.25 to 0.13 (~10.4 tiles apart vs ~20 tiles)
- This places bots just outside attack range (5 tiles), forcing them
to move toward each other to avoid zone deaths
Testing: 10/10 random vs random matches had combat_death events (100%
density), exceeding the plan §3.7.1 target of 65-80%.
Closes: bf-fzy0
Per plan §3.7.1, zone kills should emit dedicated zone_death events
for tracking, not generic bot_died events with a reason field.
Changes:
- executeZone() now directly emits EventZoneDeath instead of calling
KillBot() which would emit EventBotDied with reason="zone"
- Event includes bot_id, owner, position fields (consistent with
combat_death and collision_death events)
Verification:
- Generated test replay shows zone_death events with correct schema
- All Go tests pass
Closes: bf-xauy
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add CombatDeaths []int field to MatchResult to track combat density
per player. This enables monitoring of focus-fire combat across all
matches and helps verify that the zone forcing function is working.
Changes:
- Add CombatDeaths []int to MatchResult struct
- Add CombatDeaths []int to GameState for tracking during match
- Increment combat death count for each killer in executeCombat
- Populate combat_deaths in final match result
- Update tests to include CombatDeaths in MatchResult
Verified: 6-player match shows combat_deaths: [1,1,1,1,1,1] (each
player killed 1 bot in mutual combat).
Closes: bf-4fez
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The executeZone function was killing bots outside the zone radius
before the zone became active (ZoneStartTurn). This caused bots to
die at turn 49 when the zone shouldn't start until turn 50.
Added early return when ZoneActive is false, so zone killing only
occurs after the zone has activated.
Add configurable active zone that contracts toward map center on an interval,
forcing bots together to trigger focus-fire engagements. Bots outside the zone
die with reason "zone", and zone bounds are recorded in replay turns.
Config fields:
- ZoneEnabled: enable/disable the zone
- ZoneStartTurn: turn when zone starts shrinking (default 50)
- ZoneShrinkInterval: turns between shrink steps (default 5)
- ZoneShrinkStep: tiles to shrink each step (default 2)
- ZoneMinRadius: minimum zone radius (default 10)
Turn sequence update: MOVE → COMBAT → ZONE → CAPTURE → COLLECT → SPAWN → ENERGY_TICK
Zone phase inserted after COMBAT, uses toroidal distance calculation,
and emits bot_died events with reason "zone" for killed bots.
Replay update: ZoneBounds struct added to ReplayTurn to record center,
radius, and active state per turn for visualization.
Determinism verified: all tests pass, engine remains deterministic.
Closes: bf-2g96
Modified executeCombat to emit EventCombatDeath events with a killers
array containing all enemy bots within attack radius of the killed bot.
Each killer entry includes bot_id, owner, and position, matching the
replay schema specification.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add crash_strikes and cooldown_until columns to bots table. Worker
increments strikes on crash (cooldown at 3), resets on success.
Matchmaker excludes cooldown bots from pairing, series scheduling,
and championship brackets. Fix erroneous cooldown filter on series
table in finalizeCompletedSeries (column only exists on bots).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add engine package with toroidal grid, game state, turn execution
- Implement focus-fire combat resolution with simultaneous deaths
- Add fog of war visibility filtering for bot state
- Implement energy collection (contested resources denied)
- Add bot spawning at active cores
- Implement win conditions: elimination, draw, dominance, turns
- Add replay JSON writer for match recording
- Add match runner with concurrent bot communication
- Add CLI tools: acb-local (match runner), acb-mapgen (map generator)
- Add comprehensive unit tests (26 tests passing)
Exit criteria met: can run complete 500-turn matches and produce valid replays
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>