Apply coast drag after interceptor burnout

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
2026-11-03 00:02:29 +03:00
parent ce76f20074
commit a7b8cb980a
2 changed files with 22 additions and 1 deletions
+1 -1
View File
@@ -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)
+21
View File
@@ -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");
}