[bug] Уничтоженная ТЗМ навсегда резервирует заявку на подвоз боеприпасов #2

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

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

Список taken собирает job всех ТЗМ, включая уничтоженные. Обработка уничтоженных грузовиков пропускается, а их job при уничтожении не снимается. Другие исправные машины исключают эту цель из выбора.

Воспроизведение: есть склад далеко от установки; установка ждёт БК; уничтоженная ТЗМ имеет job на эту установку; рядом есть живая ТЗМ с грузом. Живая машина не принимает заявку.

Предложение: освобождать заявку при уничтожении/удалении машины и при построении taken учитывать только живые машины с действительными заданиями.

Код:

let taken: Vec<u32> = self.sams.iter().filter(|s| s.kind == SamKind::Tzm).filter_map(|s| s.job).collect();

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

#[test]
fn dead_truck_must_not_reserve_a_waiting_system() {
        let mut sim=Sim::new(1);
        let depot=sim.id(); sim.sams.push(Sam::new(depot,SamKind::Depot,DVec3::new(500.,70.,0.),0.));
        let target=sim.id(); let mut s=Sam::new(target,SamKind::Tor,DVec3::new(0.,70.,0.),0.);s.empty=true;s.missiles=0;sim.sams.push(s);
        let dead=sim.id();let mut s=Sam::new(dead,SamKind::Tzm,DVec3::new(100.,70.,0.),0.);s.job=Some(target);s.health=0.;sim.sams.push(s);
        let live=sim.id();sim.sams.push(Sam::new(live,SamKind::Tzm,DVec3::new(30.,70.,0.),0.));
        sim.tick=3;sim.step_supply(&mut Out::default());
        assert_eq!(sim.sams[3].job,Some(target),"a live loaded truck must take the waiting system");
    }
Проверено на `90379f6`. Список `taken` собирает `job` всех ТЗМ, включая уничтоженные. Обработка уничтоженных грузовиков пропускается, а их `job` при уничтожении не снимается. Другие исправные машины исключают эту цель из выбора. Воспроизведение: есть склад далеко от установки; установка ждёт БК; уничтоженная ТЗМ имеет `job` на эту установку; рядом есть живая ТЗМ с грузом. Живая машина не принимает заявку. Предложение: освобождать заявку при уничтожении/удалении машины и при построении `taken` учитывать только живые машины с действительными заданиями. Код: https://gitea.maoniao.team/chexit/airdef/src/commit/90379f6/airdef-mod/src/sim/logistics.rs#L75 Воспроизведено на настоящем коде `sim` и `wave` в отдельном native Rust crate (`edition=2024`, `glam=0.30.10`, `cargo test --release`). Движок и GPU не участвовали. Тест ниже проверяет ожидаемое исправленное поведение и сейчас падает; поместить в дочерний `#[cfg(test)]`-модуль соответствующего файла с `use super::*;`. ```rust #[test] fn dead_truck_must_not_reserve_a_waiting_system() { let mut sim=Sim::new(1); let depot=sim.id(); sim.sams.push(Sam::new(depot,SamKind::Depot,DVec3::new(500.,70.,0.),0.)); let target=sim.id(); let mut s=Sam::new(target,SamKind::Tor,DVec3::new(0.,70.,0.),0.);s.empty=true;s.missiles=0;sim.sams.push(s); let dead=sim.id();let mut s=Sam::new(dead,SamKind::Tzm,DVec3::new(100.,70.,0.),0.);s.job=Some(target);s.health=0.;sim.sams.push(s); let live=sim.id();sim.sams.push(Sam::new(live,SamKind::Tzm,DVec3::new(30.,70.,0.),0.)); sim.tick=3;sim.step_supply(&mut Out::default()); assert_eq!(sim.sams[3].job,Some(target),"a live loaded truck must take the waiting system"); } ```
chexit added the area:logisticspriority:P1type:bug labels 2026-10-29 12:56:02 +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#2