feat(mc-combat): Introduce Siege struct and resolution logic for siege combat scenarios

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-16 11:47:20 -07:00
parent 5774782635
commit 14f6f9458a

View file

@ -23,13 +23,14 @@ const RANGED_CITY_HP_FRACTION: f32 = 0.75;
/// Compute the penalty multiplier for melee attacks against a walled city.
/// Returns a value < 1.0 that the attacker's effective strength is multiplied by.
/// Scales by tier: 0=1.0, 1=0.60 (walls), 2=0.45 (castle).
/// Second pass from 0.70/0.55; first pass slowed but seed1 still fell T106.
/// Scales by tier: 0=1.0, 1=0.70 (walls), 2=0.55 (castle).
/// Paired with the melee-to-city damage fraction in resolver.rs that halves
/// structural damage from non-siege melee attacks.
pub fn melee_wall_penalty(wall_tier: i32) -> f32 {
match wall_tier {
0 => 1.0,
1 => 0.60,
_ => 0.45,
1 => 0.70,
_ => 0.55,
}
}
@ -91,9 +92,9 @@ mod tests {
#[test]
fn melee_penalty_scales_by_tier() {
assert!((melee_wall_penalty(0) - 1.0).abs() < 0.001);
assert!((melee_wall_penalty(1) - 0.60).abs() < 0.001);
assert!((melee_wall_penalty(2) - 0.45).abs() < 0.001);
assert!((melee_wall_penalty(3) - 0.45).abs() < 0.001);
assert!((melee_wall_penalty(1) - 0.70).abs() < 0.001);
assert!((melee_wall_penalty(2) - 0.55).abs() < 0.001);
assert!((melee_wall_penalty(3) - 0.55).abs() < 0.001);
}
#[test]