diff --git a/airdef-mod/src/sim/mod.rs b/airdef-mod/src/sim/mod.rs index 6a4b2a2..8492d1c 100644 --- a/airdef-mod/src/sim/mod.rs +++ b/airdef-mod/src/sim/mod.rs @@ -2990,7 +2990,7 @@ impl Sim { if m.age == spec.cold + m.kind.burn_ticks() + 1 { burnouts.push((m.pos, m.id, m.kind)); } - let speed = if !lit { + let speed = if m.age <= spec.cold { (m.vel.length() * 0.97).max(0.4) } else if lit { (m.vel.length() + spec.accel).min(spec.speed) diff --git a/airdef-mod/src/sim/regress.rs b/airdef-mod/src/sim/regress.rs index c42f999..b8b4b11 100644 --- a/airdef-mod/src/sim/regress.rs +++ b/airdef-mod/src/sim/regress.rs @@ -1968,3 +1968,24 @@ fn spent_motor_has_less_maneuver_at_low_speed() { let coast = fly(MissileKind::Pac3.burn_ticks() + 1); assert!(powered.x > coast.x && coast.x > 0.0, "{powered:?} {coast:?}"); } + +#[test] +fn cold_ejection_power_and_coast_use_their_own_speed_rules() { + let kind = MissileKind::M48n6; + let spec = kind.spec(); + let fly = |age: u32, initial: f64| { + let mut sim = Sim::new(120); + let target_pos = DVec3::new(0.0, 100.0, 2000.0); + sim.add_drone(DroneKind::Shahed, target_pos, DVec3::ZERO, target_pos); + let (target, id) = (sim.drones[0].id, sim.id()); + sim.tick = 100; + let fix = Some(Fix { pos: target_pos, vel: DVec3::ZERO, tick: 100, seeker: false }); + sim.missiles.push(Missile { id, kind, pos: DVec3::new(0.0, 100.0, 0.0), vel: DVec3::Z * initial, target, sam: 999, age, hold: 0, fix, seen: 0 }); + sim.step_missiles(&mut Ground::default(), &mut Out::default()); + sim.missiles[0].vel.length() + }; + assert!((fly(0, 2.0) - 2.0 * 0.97).abs() < 1e-9, "cold ejection drag"); + assert!((fly(spec.cold, 2.0) - (2.0 + spec.accel)).abs() < 1e-9, "powered acceleration"); + assert!((fly(spec.cold + kind.burn_ticks(), 2.0) - 2.0 * 0.995).abs() < 1e-9, "coast drag"); + assert!((fly(0, 0.2) - 0.4).abs() < 1e-9, "cold ejection minimum"); +}