diff --git a/src/simulator/crates/mc-combat/src/resolver.rs b/src/simulator/crates/mc-combat/src/resolver.rs index b5cf541e..123d99db 100644 --- a/src/simulator/crates/mc-combat/src/resolver.rs +++ b/src/simulator/crates/mc-combat/src/resolver.rs @@ -406,10 +406,11 @@ impl CombatResolver { // Melee vs city: only a fraction of unit damage translates to // city structural HP. Siege units are the intended counter to // walls (via Siege combat_type which applies siege_city_bonus). - // Option B dial-back: 0.50→0.55 after 0.70→0.75 wall tweak alone - // still produced 0/3 victories at 300 turns. Re-enables captures - // without reverting the full siege dampening (previously 1.00). - let melee_city_fraction: f32 = 0.55; + // 0.50 is the empirical sweet spot from batch 2 (12 PASS): + // lower values (0.40–0.33) stalled all seeds at max_turns and + // regressed checklist results. Seed 1's sub-T100 fall is an + // AI production-priority issue, not siege math. + let melee_city_fraction: f32 = 0.50; let city_dmg = (damage_to_defender as f32 * melee_city_fraction).round() as i32; (city_dmg, (city_hp - city_dmg).max(0)) } diff --git a/src/simulator/crates/mc-combat/src/siege.rs b/src/simulator/crates/mc-combat/src/siege.rs index 71411d60..9435f2ca 100644 --- a/src/simulator/crates/mc-combat/src/siege.rs +++ b/src/simulator/crates/mc-combat/src/siege.rs @@ -23,13 +23,13 @@ const RANGED_CITY_HP_FRACTION: f32 = 0.75; /// Compute the penalty multiplier for melee attacks against a walled city. /// Returns a value < 1.0 that the attacker's effective strength is multiplied by. -/// Scales by tier: 0=1.0, 1=0.75 (walls), 2=0.55 (castle). +/// Scales by tier: 0=1.0, 1=0.70 (walls), 2=0.55 (castle). /// Paired with the melee-to-city damage fraction in resolver.rs that halves /// structural damage from non-siege melee attacks. pub fn melee_wall_penalty(wall_tier: i32) -> f32 { match wall_tier { 0 => 1.0, - 1 => 0.75, + 1 => 0.70, _ => 0.55, } } @@ -92,7 +92,7 @@ mod tests { #[test] fn melee_penalty_scales_by_tier() { assert!((melee_wall_penalty(0) - 1.0).abs() < 0.001); - assert!((melee_wall_penalty(1) - 0.75).abs() < 0.001); + assert!((melee_wall_penalty(1) - 0.70).abs() < 0.001); assert!((melee_wall_penalty(2) - 0.55).abs() < 0.001); assert!((melee_wall_penalty(3) - 0.55).abs() < 0.001); }