[bug] После ремонта комплекс снова уничтожается от собственной отложенной детонации #5

Closed
opened 2026-10-29 11:43:57 +00:00 by chexit · 1 comment
Owner

Проверено на 90379f6.

repair() восстанавливает здоровье, боезапас и состояние техники, но оставляет self.later — запланированные взрывы старого боекомплекта. Они продолжают происходить уже внутри восстановленной машины.

Проверено: уничтожить полный Patriot взрывом мощности 4, немедленно вызвать repair(), затем обработать отложенные взрывы на тике 3. Восстановленный комплекс снова уничтожен, даже без новых противников.

Предложение: явно определить семантику ремонта. Если это полный сброс повреждений/восстановление техники, отменять связанные cook-off события; для точного решения хранить владельца/поколение техники в отложенном событии. Если сохранение взрывов задумано, отразить это в интерфейсе и дать отдельное безопасное восстановление.

Код:

pub fn repair(&mut self) -> u32 {

Воспроизведено на настоящем коде sim и wave в отдельном native Rust crate (edition=2024, glam=0.30.10, cargo test --release). Движок и GPU не участвовали. Тест ниже проверяет ожидаемое исправленное поведение и сейчас падает; поместить в дочерний #[cfg(test)]-модуль соответствующего файла с use super::*;.

#[test]
fn repair_must_cancel_pending_magazine_explosions() {
        let mut sim=Sim::new(1);
        let id=sim.id();sim.sams.push(Sam::new(id,SamKind::Patriot,DVec3::new(0.,70.,0.),0.));
        sim.blast_damage(DVec3::new(0.,70.,0.),4,&mut Out::default());
        assert!(!sim.later.is_empty());sim.repair();
        sim.tick=3; sim.step_later(&mut Ground::default(),None,&mut Out::default());
        assert!(sim.sams[0].alive(),"a fully repaired launcher was destroyed again by its own pre-repair cook-off");
    }
Проверено на `90379f6`. `repair()` восстанавливает здоровье, боезапас и состояние техники, но оставляет `self.later` — запланированные взрывы старого боекомплекта. Они продолжают происходить уже внутри восстановленной машины. Проверено: уничтожить полный Patriot взрывом мощности 4, немедленно вызвать `repair()`, затем обработать отложенные взрывы на тике 3. Восстановленный комплекс снова уничтожен, даже без новых противников. Предложение: явно определить семантику ремонта. Если это полный сброс повреждений/восстановление техники, отменять связанные cook-off события; для точного решения хранить владельца/поколение техники в отложенном событии. Если сохранение взрывов задумано, отразить это в интерфейсе и дать отдельное безопасное восстановление. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/sim/damage.rs#L171 Воспроизведено на настоящем коде `sim` и `wave` в отдельном native Rust crate (`edition=2024`, `glam=0.30.10`, `cargo test --release`). Движок и GPU не участвовали. Тест ниже проверяет ожидаемое исправленное поведение и сейчас падает; поместить в дочерний `#[cfg(test)]`-модуль соответствующего файла с `use super::*;`. ```rust #[test] fn repair_must_cancel_pending_magazine_explosions() { let mut sim=Sim::new(1); let id=sim.id();sim.sams.push(Sam::new(id,SamKind::Patriot,DVec3::new(0.,70.,0.),0.)); sim.blast_damage(DVec3::new(0.,70.,0.),4,&mut Out::default()); assert!(!sim.later.is_empty());sim.repair(); sim.tick=3; sim.step_later(&mut Ground::default(),None,&mut Out::default()); assert!(sim.sams[0].alive(),"a fully repaired launcher was destroyed again by its own pre-repair cook-off"); } ```
chexit added the area:simulationpriority:P1type:bug labels 2026-10-29 12:56:33 +00:00
Author
Owner

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/e08fc65 (запушено в main).

🤖 Agent: исправлено в https://gitea.maoniao.team/chexit/airdef/commit/e08fc65 (запушено в main).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#5