diff --git a/src/simulator/crates/mc-core/src/combat_balance.rs b/src/simulator/crates/mc-core/src/combat_balance.rs index de475b0b..e08c5e7b 100644 --- a/src/simulator/crates/mc-core/src/combat_balance.rs +++ b/src/simulator/crates/mc-core/src/combat_balance.rs @@ -74,6 +74,37 @@ pub struct CombatBalance { /// 158 invented per-unit numbers. #[serde(default)] pub quality_deltas: QualityDeltas, + /// p1-29i — post-capture refound suppression. After an empire loses a city + /// to capture, it cannot found a *replacement* city for `cooldown_turns` + /// turns. This is the capture-stickiness lever the p1-29h Phase-2 + /// measurement isolated: on the fair gridded duel both empires get pressed + /// down to a single city (`per_player_min_cities = [1, 1]`) but neither is + /// ever eliminated because the loser instantly refounds, so 20 captures + /// produce 0 eliminations (pure churn). A short cooldown gives the attacker + /// a window to press the now-undefended capital before the loser rebuilds. + /// `cooldown_turns == 0` disables the lever entirely (baseline behaviour). + #[serde(default)] + pub refound_suppression: RefoundSuppression, +} + +/// p1-29i — post-capture refound-suppression tunables. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub struct RefoundSuppression { + /// Number of turns after a city *loss* (capture by another player) during + /// which the losing empire may not found a replacement city. `0` disables + /// the lever (no suppression — preserves pre-p1-29i behaviour). + #[serde(default = "default_refound_cooldown_turns")] + pub cooldown_turns: u32, +} + +fn default_refound_cooldown_turns() -> u32 { + 0 +} + +impl Default for RefoundSuppression { + fn default() -> Self { + Self { cooldown_turns: default_refound_cooldown_turns() } + } } /// p2-57c — additive combat-stat deltas applied per production-quality band. @@ -204,6 +235,7 @@ impl Default for CombatBalance { low_worker_pool_threshold: default_low_worker_pool_threshold(), solo_city_grace: SoloCityGrace::default(), quality_deltas: QualityDeltas::default(), + refound_suppression: RefoundSuppression::default(), } } } diff --git a/src/simulator/crates/mc-core/src/lib.rs b/src/simulator/crates/mc-core/src/lib.rs index 6ace11c0..66a807c9 100644 --- a/src/simulator/crates/mc-core/src/lib.rs +++ b/src/simulator/crates/mc-core/src/lib.rs @@ -37,7 +37,8 @@ pub mod worker; pub use building::{BuildingEntity, Placement}; pub use city_action::{CityAction, CityId}; pub use combat_balance::{ - parse_combat_balance, CombatBalance, QualityDeltas, SoloCityGrace, StatDelta, + parse_combat_balance, CombatBalance, QualityDeltas, RefoundSuppression, SoloCityGrace, + StatDelta, }; pub use damage_channel::{ChannelDamageBundle, DamageChannel}; pub use diplomacy::{AgreementType, MechanicKey};