chore(mc-core): 🔧 Add post-capture refound suppression logic to combat balance system

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-06-04 17:11:17 -07:00
parent 20509d2cce
commit 2441454e95
2 changed files with 34 additions and 1 deletions

View file

@ -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(),
}
}
}

View file

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