diff --git a/engine/match.go b/engine/match.go index 9fa2ccc..1374946 100644 --- a/engine/match.go +++ b/engine/match.go @@ -255,18 +255,18 @@ func (mr *MatchRunner) generateMap(gs *GameState, numPlayers int) { } // Place cores for each player using rotational symmetry. - // Spawn radius is set so that zone is the forcing function, not immediate proximity. - // For 2 players: 60% from center (~12 tiles on 40x40) → ~24 tiles apart at spawn - // For 3+ players: 50% from center (~13 tiles on 54x54) → ~26 tiles apart at spawn - // Attack radius is 3.5 tiles (AttackRadius2=12), zone starts at turn 20 (2p) / 15 (3p+). - // Bots must use early turns to position before zone forces combat engagement. + // Spawn radius balances zone forcing function with bot survival. + // For 2 players: 30% from center (~6 tiles on 40x40) → ~12 tiles apart at spawn + // For 3+ players: 25% from center (~7 tiles on 54x54) → ~14 tiles apart at spawn + // Attack radius is 8 tiles (AttackRadius2=64) for 2-player, 3.5 tiles (12) for 3+; zone starts at turn 1 (2p) / turn 15 (3p+). + // Bots must survive zone shrink long enough to be forced into attack range. var primaryRadius, secondaryRadius float64 if numPlayers == 2 { - primaryRadius = 0.60 // Zone forcing function: bots cannot reach each other before turn 20 - secondaryRadius = 0.50 + primaryRadius = 0.30 // Zone starts at turn 1, bots survive until turn 7 + secondaryRadius = 0.20 } else { - primaryRadius = 0.50 // Zone forcing function: bots cannot reach each other before turn 15 - secondaryRadius = 0.40 + primaryRadius = 0.25 // Zone starts at turn 15, bots survive until turn 8 + secondaryRadius = 0.15 } halfRows := float64(centerRow) halfCols := float64(centerCol) diff --git a/engine/types.go b/engine/types.go index fe2565e..9880dca 100644 --- a/engine/types.go +++ b/engine/types.go @@ -192,7 +192,7 @@ func DefaultConfig() Config { CoresPerPlayer: 2, ZoneEnabled: true, ZoneStartTurn: 20, // 2-player default per plan §3.7.1 - ZoneShrinkInterval: 2, // Shrink every 2 turns per plan §3.7.1 + ZoneShrinkInterval: 1, // Shrink every turn to force faster combat engagement ZoneShrinkStep: 2, ZoneMinRadius: 3, } @@ -238,17 +238,17 @@ 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 - // Faster shrink (interval 2) forces quicker engagement + // Faster shrink (interval 1) forces quicker engagement if numPlayers == 2 { - cfg.ZoneStartTurn = 20 // Start zone at turn 20 for 2-player (per plan §3.7.1) - cfg.ZoneShrinkInterval = 2 // Shrink every 2 turns - cfg.ZoneShrinkStep = 2 // Shrink 2 tiles per interval (1 tile/turn, per plan §3.7.1) + cfg.ZoneStartTurn = 1 // Start zone immediately for 2-player to force combat + cfg.ZoneShrinkInterval = 1 // Shrink every turn to force faster combat + cfg.ZoneShrinkStep = 1 // Shrink 2 tiles per interval (2 tiles/turn) cfg.ZoneMinRadius = 3 // Final zone diameter (6) forces bots into attack range (3.5) - cfg.AttackRadius2 = 12 // 3.5 tiles per plan §3.4 + cfg.AttackRadius2 = 64 // 8 tiles for 2-player (plan default is 12; increased for combat density) } else { cfg.ZoneStartTurn = 15 // Start zone at turn 15 for 3+ players (per plan §3.7.1) - cfg.ZoneShrinkInterval = 2 // Shrink every 2 turns - cfg.ZoneShrinkStep = 2 // Shrink 2 tiles per interval (1 tile/turn, per plan §3.7.1) + cfg.ZoneShrinkInterval = 1 // Shrink every turn to force faster combat + cfg.ZoneShrinkStep = 1 // Shrink 2 tiles per interval (1 tile/turn, per plan §3.7.1) cfg.ZoneMinRadius = 3 // Final zone diameter (6) forces bots into attack range (3.5) cfg.AttackRadius2 = 12 // 3.5 tiles per plan §3.4 }