diff --git a/src/simulator/crates/mc-city/src/city.rs b/src/simulator/crates/mc-city/src/city.rs index af005beb..168d00a7 100644 --- a/src/simulator/crates/mc-city/src/city.rs +++ b/src/simulator/crates/mc-city/src/city.rs @@ -195,12 +195,12 @@ pub const CITY_CENTER_BASELINE_CULTURE: f64 = 2.0; /// reach pop 30 from ~7000 to ~3500 — the dominant lever for pop_peak. pub const GROWTH_FOOD_CARRYOVER: f64 = 0.5; -/// Base city HP before population scaling. Tuned up from 200 to 260 to -/// extend TTV alongside the melee-city-damage fraction in resolver.rs. The -/// combination (HP boost + 0.50 melee-to-city fraction + 20 HP/turn regen) -/// pushed capital fall from T99 to the batch-2 median of 156. Further bumps -/// (280, 300) regressed results — 260 is the empirical peak. -pub const BASE_CITY_HP: u32 = 260; +/// Base city HP before population scaling. Bumped 260 → 500 for p1-29 R5a: +/// prior small bumps (280, 300) regressed because at low HP the snowballer's +/// stack still one-shots; the handoff calls for a step large enough that +/// capture takes 5-10 turns of siege rather than 1-2. Composed with the +/// stronger wall penalty in mc-combat::siege (tier1 0.40, tier2 0.25). +pub const BASE_CITY_HP: u32 = 500; /// HP gained per population point. pub const HP_PER_POP: u32 = 10; @@ -1021,7 +1021,7 @@ mod tests { #[test] fn defense_mechanics() { let mut city = City::found("Ironhold", (5, 5), true, 1, None); - let initial_hp = BASE_CITY_HP + HP_PER_POP; // 210 at pop 1 + let initial_hp = BASE_CITY_HP + HP_PER_POP; assert_eq!(city.hp, initial_hp); city.take_damage(50); assert_eq!(city.hp, initial_hp - 50);