diff --git a/engine/match.go b/engine/match.go index a69255c..487a748 100644 --- a/engine/match.go +++ b/engine/match.go @@ -255,10 +255,11 @@ func (mr *MatchRunner) generateMap(gs *GameState, numPlayers int) { } // Place cores for each player using rotational symmetry. - // Primary core at radius ~70% from center, additional cores at ~40% radius - // offset angularly from the primary. - primaryRadius := 0.7 - secondaryRadius := 0.4 + // Very tight spawn radius (25% from center) forces immediate bot contact. + // At 25% radius on 54x54 grid: ~7 tiles from center, ~12 tiles between 3 players. + // Attack radius is 3 tiles, so bots need to close ~9 tiles to engage. + primaryRadius := 0.25 + secondaryRadius := 0.15 halfRows := float64(centerRow) halfCols := float64(centerCol) diff --git a/engine/types.go b/engine/types.go index 582d608..da2c277 100644 --- a/engine/types.go +++ b/engine/types.go @@ -238,11 +238,12 @@ func ConfigForPlayers(numPlayers, coresPerPlayer int) Config { // Scale zone parameters for 3+ players to force combat contact // 2-player matches naturally converge at center; 3+ need aggressive zone // Zone must compress bots into contact range while preserving enough population for combat + // Tight spawn radius (0.25) means bots start very close; zone finishes the job if numPlayers >= 3 { - cfg.ZoneStartTurn = 20 // Start shrinking early (vs default 50) + cfg.ZoneStartTurn = 15 // Start zone early (bots already close at spawn) cfg.ZoneShrinkInterval = 3 // Shrink every 3 turns (vs default 5) cfg.ZoneShrinkStep = 3 // Shrink 3 tiles per interval (1 tile/turn) - cfg.ZoneMinRadius = 12 // Balance proximity and population (50% combat_death observed) + cfg.ZoneMinRadius = 5 // Tight final zone forces final contact } return cfg