diff --git a/engine/match.go b/engine/match.go index e863bef..4622806 100644 --- a/engine/match.go +++ b/engine/match.go @@ -257,15 +257,15 @@ func (mr *MatchRunner) generateMap(gs *GameState, numPlayers int) { // Place cores for each player using rotational symmetry. // Tight spawn radius forces immediate bot contact. // For 2 players: 20% from center (~8 tiles on 40x40) → ~16 tiles apart at spawn - // For 3+ players: 25% from center (~7 tiles on 54x54) → ~12 tiles apart at spawn - // Attack radius is 3 tiles, so bots need to close ~10 tiles to engage. + // For 3+ players: 18% from center (~5 tiles on 54x54) → ~10 tiles apart at spawn + // Attack radius is 3.5 tiles (AttackRadius2=12), so bots need to close ~6 tiles to engage. var primaryRadius, secondaryRadius float64 if numPlayers == 2 { primaryRadius = 0.20 // Tighter for 2-player to force contact secondaryRadius = 0.12 } else { - primaryRadius = 0.25 - secondaryRadius = 0.15 + primaryRadius = 0.18 // Reduced from 0.25 to force earlier contact + secondaryRadius = 0.12 } halfRows := float64(centerRow) halfCols := float64(centerCol) diff --git a/engine/types.go b/engine/types.go index e284b99..d1afa9c 100644 --- a/engine/types.go +++ b/engine/types.go @@ -246,7 +246,7 @@ func ConfigForPlayers(numPlayers, coresPerPlayer int) Config { cfg.ZoneMinRadius = 3 // Tight final zone forces contact cfg.AttackRadius2 = 12 // 3.5 tiles (balanced for 2-player) } else { - cfg.ZoneStartTurn = 15 // Start zone early (bots already close at spawn) + cfg.ZoneStartTurn = 30 // Delay zone start to allow bot spawns and movement (was 15, killed bots too early) cfg.ZoneShrinkInterval = 3 // Shrink every 3 turns (vs default 5) cfg.ZoneShrinkStep = 3 // Shrink 3 tiles per interval (1 tile/turn) cfg.ZoneMinRadius = 5 // Tight final zone forces final contact