Per plan §3.8, maps should be generated offline and stored in the map
library, not generated on-the-fly during matches. This commit adds
support for loading pre-generated maps from the database.
Changes:
- Add PreGeneratedMap type and WithMap option to MatchRunner
- Add loadPreGeneratedMap() to parse map JSON (walls, cores)
- Update worker to pass loaded map data to MatchRunner via WithMap
- Fallback to on-the-fly generation if map data is invalid
- Update acb-mapgen spawn radius to 25% for 2-player (aligns with match.go)
- Update test to verify cores are outside final zone radius
This enables the map library infrastructure (maps/, acb-mapgen, index
builder) to be used in production matches instead of being ignored.
Closes: bf-5m29
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Plan: §3.7.1 Spawn mechanics, §3.8 Map Generation
The map generator was using outdated core placement radius (0.35) that
placed cores too far apart on 40x40 maps (~28 tiles between cores on
opposite sides). This exceeded the attack radius (6 tiles for 2-player,
3.5 tiles for 3+ player), meaning generated maps didn't force combat.
The match runner was already fixed in commit e8fda06 to use:
- 2-player: primaryRadius = 0.15 (6 tiles apart = attack radius)
- 3+ player: primaryRadius = 0.063 (~3.4 tiles, within attack radius)
This change aligns cmd/acb-mapgen with the same logic, ensuring all
generated maps place cores within attack range.
Also adds validation test TestGenerateMap_CoresWithinAttackRadius to
verify cores are placed within attack radius on standard 40x40 maps.
Closes: bf-2wn4
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Implement center-weighted energy distribution as a forcing function
to pull players into contested midfield, increasing combat density.
Changes:
- engine/match.go: Update placeEnergyNodes to use tiered radius
distribution (30% central 0.05-0.20, 40% mid 0.20-0.40, 30% outer
0.40-0.60) instead of uniform 0.3-0.7
- engine/integration_test.go: Add TestIntegration_CenterWeightedEnergy
to verify ~25% of energy nodes spawn in central zone
- cmd/acb-mapgen: Already had tiered distribution (unchanged, just
comments updated)
- cmd/acb-mapgen/mapgen_test.go: Add TestGenerateMap_CenterWeightedEnergy
This uses the existing economic incentive (energy collection) as a
forcing function without changing combat resolution or scoring.
Closes: bf-648i
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Reduce default 2-player map size from 60x60 to 40x40 (from 3600 to 1600
tiles) to increase encounter frequency and combat density. Add -skirmish
flag to acb-mapgen for generating even smaller dense maps (32x32, 0.20
wall density, 15 energy nodes) with "skirmish_" ID prefix.
Changes:
- engine/types.go: DefaultConfig() returns 40x40, ConfigForPlayers()
uses 800 tiles/player for 2-player (40x40) and 2000 tiles/player for
3+ players
- cmd/acb-matchmaker/tickers.go: gridForPlayers() returns 40x40 for 2
players
- cmd/acb-map-evolver/main.go: gridForPlayers() returns 40x40 for 2
players
- cmd/acb-mapgen/main.go: defaults to 40x40, adds -skirmish flag for
32x32 high-density maps
- cmd/acb-matchmaker/tickers_test.go: update test expectations for new
40x40 default
Closes: bf-39wt
Replace broken Taylor series sin/cos approximations with math.Sin/math.Cos
in both engine/match.go and cmd/acb-mapgen. The Taylor series produced
incorrect results for angles > π, causing wrong positions in 3+ player maps.
Upgrade map generator wall placement from random scatter to cellular
automata (B5/S4 rule, 4 iterations) with rotational symmetry enforcement
and connectivity validation. Add comprehensive mapgen tests and dominance
win condition tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add connectivity.go: BFS-based map connectivity validation with retry
- Update mapgen to use connectivity checking by default
- Add determinism_test.go: property-based tests for reproducibility
- Same seed produces identical replays
- Turn execution is deterministic
- Grid operations are deterministic
- Combat resolution is deterministic
- Full 500-turn match validation
- All 32 tests pass
- Update PROGRESS.md: Phase 1 complete
Co-Authored-By: Claude Opus 4.6 <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>