feat(mc-combat): Add 3× defender’s HP damage cap to balance late-game combat challenges

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-30 01:21:24 -07:00
parent bcb464f1d4
commit 8e29d5688e
2 changed files with 5 additions and 5 deletions

View file

@ -362,11 +362,11 @@ fn compute_predicted_damage(params: &CombatParams) -> PredictedDamage {
let strength_diff = attacker_strength - defender_strength;
let raw_damage_to_defender =
BASE_DAMAGE * (strength_diff / STRENGTH_DIVISOR).exp() * atk_hp_factor;
// Stack-of-doom cap: a single attack cannot deal more than 2× the defender's
// current HP. Prevents overwhelming odds from one-shotting a city or unit in
// a single exchange — multiple attackers still add up, but each hit is capped.
// Stack-of-doom cap: a single attack cannot deal more than 3× the defender's
// current HP. 2× proved too tight (halved victories, stalled winner_tier_peak).
// 3× leaves typical late-game dominance intact while preventing pure one-shots.
let damage_to_defender =
raw_damage_to_defender.min(2.0 * params.defender.hp as f32);
raw_damage_to_defender.min(3.0 * params.defender.hp as f32);
// Retaliation damage
let no_retaliation = prevents_retaliation(&params.attacker_keywords, is_ranged)

View file

@ -87,7 +87,7 @@
},
{
"name": "stress_first_strike_one_round_kill",
"defender_damage": 40,
"defender_damage": 60,
"attacker_damage": 0,
"attacker_outcome": "survived",
"defender_outcome": "killed",