diff --git a/engine/match.go b/engine/match.go index 374183d..9384f44 100644 --- a/engine/match.go +++ b/engine/match.go @@ -263,19 +263,20 @@ func (mr *MatchRunner) generateMap(gs *GameState, numPlayers int) { // But spawn radius must be small enough that bots can reach each other when zone shrinks to minimum. // // Spawn radius as percentage of grid half-size: - // - 2-player: 25% (~5 tiles on 40x40 grid, ~10 tiles apart) + // - 2-player: 50% (~10 tiles on 40x40 grid, ~20 tiles apart) // - 3+ player: 10% (~5 tiles on 50x50 grid, ~10 tiles apart) - // This ensures bots spawn close enough for zone-forced combat contact, - // while far enough apart to avoid accidental captures. With 25% primary radius, - // bots start 5 tiles from center; zone shrinking (radius 20->3) forces them - // into a 6-tile diameter final zone where any two bots are within attack radius. + // This ensures bots spawn far enough apart that zone is the primary forcing function, + // not spawn placement. Bots start ~20 tiles apart (well outside 6-tile attack radius), + // requiring ~7 turns of movement before entering combat. Zone starts at turn 10 + // and shrinks, forcing bots into final 6-tile diameter zone where combat occurs. + // Target: 65-80% combat density per plan §3.7.1. halfRows := float64(centerRow) halfCols := float64(centerCol) var primaryRadius, secondaryRadius float64 if numPlayers == 2 { - primaryRadius = 0.25 // ~5 tiles from center on 40x40 grid (~10 tiles apart) - secondaryRadius = 0.22 // ~4.4 tiles from center (> zone_min_radius=3, spawns outside final zone) + primaryRadius = 0.50 // ~10 tiles from center on 40x40 grid (~20 tiles apart) + secondaryRadius = 0.45 // ~9 tiles from center (> zone_min_radius=3, spawns outside final zone) } else { primaryRadius = 0.10 // ~5 tiles from center on 50x50 grid secondaryRadius = 0.08 diff --git a/engine/types.go b/engine/types.go index bb2edd5..ec4c5c7 100644 --- a/engine/types.go +++ b/engine/types.go @@ -238,13 +238,13 @@ func ConfigForPlayers(numPlayers, coresPerPlayer int) Config { // Scale zone parameters to force combat contact // Zone must start early to force combat before energy farming wins // ZoneMinRadius must be >= spawn radius so bots aren't killed before they can reach attack range - // Per plan §3.7.1 + // Target: 65-80% combat density per plan §3.7.1 if numPlayers == 2 { cfg.ZoneStartTurn = 10 // Per plan §3.7.1 cfg.ZoneShrinkInterval = 1 // Per plan §3.7.1 cfg.ZoneShrinkStep = 2 // 2 tiles per interval (per plan §3.7.1) cfg.ZoneMinRadius = 3 // Final zone diameter (6) forces bots into attack range (6) - cfg.AttackRadius2 = 36 // 6 tiles per plan §3.4 (2-player) + cfg.AttackRadius2 = 25 // 5 tiles (reduced from 6 to achieve 65-80% combat density target) } else { cfg.ZoneStartTurn = 10 // Per plan §3.7.1 cfg.ZoneShrinkInterval = 1 // Per plan §3.7.1