Commit graph

10 commits

Author SHA1 Message Date
jedarden
cf80f6132b fix(engine): force combat via adaptive zone + tighter spawn radius
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
2026-05-25 14:43:17 -04:00
jedarden
f0a0673eca fix(engine): emit zone_death events instead of bot_died with reason
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>
2026-05-25 14:30:48 -04:00
jedarden
b3982ab6d7 feat(engine): add combat_deaths to MatchResult statistics
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>
2026-05-24 17:59:57 -04:00
jedarden
f7752193fc fix(engine): zone should not kill bots before activation
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.
2026-05-24 10:47:28 -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
16d474aceb feat(engine): add shrinking play-zone (storm) for combat density
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
2026-05-24 10:01:34 -04:00
jedarden
8e0aa5e1be Emit combat_death events with killers array in executeCombat
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>
2026-05-22 14:48:19 -04:00
jedarden
c56cc8bae6 fix(matchmaker): multi-match crash cooldown (3 strikes / 30 min) per §4.5 + §6.1
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>
2026-04-22 15:22:12 -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
6d3f3506b3 Implement Phase 1 core engine: grid, combat, fog of war, turn execution
- 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>
2026-03-24 01:48:27 -04:00