feat(city): Adjust city HP and related mechanics constants for improved simulation balance

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-29 12:26:49 -07:00
parent 2a6d02505f
commit ffd739caa8

View file

@ -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);