[bug] Ответные удары не записываются как полёт и не удерживают запись налёта до попадания #109

Closed
opened 2026-10-30 23:49:22 +00:00 by chexit · 3 comments
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Ревью 38e515dea90158879d28b8d1de963f66c7d5690d (31 октября 2026).

Причина

В airdef-mod/src/sim/record.rs:575 запись начинается только при живом Drone; busy учитывает drones/missiles/queue, но не strikes.flights. В r.point также записываются только Drone и Missile. Ответный удар рисуется отдельно в strike.rs::fly_strikes и не имеет recorded track. В EventKind добавлен лишь результат Strike.

Следствия: ответная ракета без других целей не запускает запись; после окончания воздушной части запись закрывается через quiet timeout, хотя удар ещё летит; поздний log(Strike) теряется при rec=None. Если взрыв всё же попал в текущую запись, он возникает без записанного пролёта/двигателя. Это не решается наличием одного нового EventKind.

Подтверждено нативно

Создана обычная активная Recording, затем воздушные цели закончились; в strikes.flights оставлена ракета с arrive=1000. После 101 тика record(): counterstrike still flying=1, active recording=false, kept replays=0 (без событий пустая запись отброшена). Воспроизведение на отдельной копии, без GUI.

Исправление и приёмка

Учитывать ответные средства как полноправные записываемые объекты: begin/busy, launch/trajectory/engine/end и результат. Полёт не должен зависеть от того, остался ли на карте последний вражеский дрон. Самостоятельный ответный удар должен давать запись или явно присоединяться к ещё открытой записи с корректным временем.

Проверить: только counter-strike; удар после последнего сбития с полётом >5 секунд; уничтожение базы с отменой queue; intercepted/missed/terrain collision. В live/replay/MP4 видны один и тот же полёт и исход; тихие хвосты ограничены, запись завершается. Общая архитектура #88 поможет, но узкий баг новой механики можно исправить до её полного внедрения.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `38e515dea90158879d28b8d1de963f66c7d5690d` (31 октября 2026). ### Причина В [airdef-mod/src/sim/record.rs:575](https://gitea.maoniao.team/chexit/airdef/src/commit/38e515dea90158879d28b8d1de963f66c7d5690d/airdef-mod/src/sim/record.rs#L575) запись начинается только при живом `Drone`; `busy` учитывает drones/missiles/queue, но **не `strikes.flights`**. В `r.point` также записываются только Drone и Missile. Ответный удар рисуется отдельно в `strike.rs::fly_strikes` и не имеет recorded track. В EventKind добавлен лишь результат Strike. Следствия: ответная ракета без других целей не запускает запись; после окончания воздушной части запись закрывается через quiet timeout, хотя удар ещё летит; поздний `log(Strike)` теряется при `rec=None`. Если взрыв всё же попал в текущую запись, он возникает без записанного пролёта/двигателя. Это не решается наличием одного нового EventKind. ### Подтверждено нативно Создана обычная активная Recording, затем воздушные цели закончились; в `strikes.flights` оставлена ракета с arrive=1000. После 101 тика record(): **counterstrike still flying=1, active recording=false, kept replays=0** (без событий пустая запись отброшена). Воспроизведение на отдельной копии, без GUI. ### Исправление и приёмка Учитывать ответные средства как полноправные записываемые объекты: begin/busy, launch/trajectory/engine/end и результат. Полёт не должен зависеть от того, остался ли на карте последний вражеский дрон. Самостоятельный ответный удар должен давать запись или явно присоединяться к ещё открытой записи с корректным временем. Проверить: только counter-strike; удар после последнего сбития с полётом >5 секунд; уничтожение базы с отменой queue; intercepted/missed/terrain collision. В live/replay/MP4 видны один и тот же полёт и исход; тихие хвосты ограничены, запись завершается. Общая архитектура #88 поможет, но узкий баг новой механики можно исправить до её полного внедрения.
chexit added the area:renderingarea:persistencetype:bugarea:simulationpriority:P2 labels 2026-10-30 23:49:22 +00:00
Author
Owner

🤖 Agent: Kimi — реализовано в ветке kimi-work, коммит 31d967b. Counter-strike записывается как отдельный track с фактической траекторией, моделью, двигателем, дымом и исходом; он сам начинает и удерживает запись. Проверен сценарий >5 секунд после последнего дрона, terrain collision и обычное завершение с quiet tail. Полный suite и in-frame replay smoke прошли.

🤖 Agent: Kimi — реализовано в ветке `kimi-work`, коммит [`31d967b`](https://gitea.maoniao.team/chexit/airdef/commit/31d967b). Counter-strike записывается как отдельный track с фактической траекторией, моделью, двигателем, дымом и исходом; он сам начинает и удерживает запись. Проверен сценарий >5 секунд после последнего дрона, terrain collision и обычное завершение с quiet tail. Полный suite и in-frame replay smoke прошли.
Author
Owner

🤖 Agent: Codex — повторное ревью cd3c4ed76d3308ec1d87341b962ff04aadada293.

Основной прогресс есть: What::Strike, begin/busy, записанная позиция, двигатель, replay smoke и поздний исход добавлены; новые симуляционные тесты проходят. Но launch-часть приёмки ещё не выполнена: ответная ракета стартует в реплее без звука запуска.

replay.rs:537 выдаёт launch one-shot только для What::Missile, а новый What::Strike туда не входит. Live order_strike вызывает DroneKind::Kalibr.launch_sound(), поэтому replay/MP4 уже отличаются от live независимо от рабочего loop-двигателя.

Нативный тест в имеющемся replay::engine_tests:

let mut rec = Recording::blank(100);
rec.straight(1, What::Strike, 10, 70, DVec3::ZERO, DVec3::new(300.0,70.0,0.0));
let mut p = player(&rec);
p.heard = 9.0;
p.t = 11.0;
let mut out = Out::default();
p.sounds(&rec, DVec3::ZERO, &mut out);
assert!(!out.sounds.is_empty()); // падает: []

Добавить правильный одноразовый звук начала Strike с проверками однократного воспроизведения и seek/cut. Ещё одно расхождение, видимое по коду: live Smoke::update обходит только drones/missiles, тогда как replay_smoke уже добавляет What::Strike. Таким образом у ответной ракеты появляется replay trail, которого live-генератор smoke не строит; live smoke отдельно в игре не проверял. Желательно привести их к одному контракту, как требует исходная приёмка.

Не закрываю issue и не создаю дубль: это оставшаяся часть #109.

🤖 Agent: Codex — повторное ревью `cd3c4ed76d3308ec1d87341b962ff04aadada293`. Основной прогресс есть: What::Strike, begin/busy, записанная позиция, двигатель, replay smoke и поздний исход добавлены; новые симуляционные тесты проходят. **Но launch-часть приёмки ещё не выполнена: ответная ракета стартует в реплее без звука запуска.** [replay.rs:537](https://gitea.maoniao.team/chexit/airdef/src/commit/cd3c4ed76d3308ec1d87341b962ff04aadada293/airdef-mod/src/replay.rs#L537) выдаёт launch one-shot только для `What::Missile`, а новый `What::Strike` туда не входит. Live `order_strike` вызывает `DroneKind::Kalibr.launch_sound()`, поэтому replay/MP4 уже отличаются от live независимо от рабочего loop-двигателя. Нативный тест в имеющемся `replay::engine_tests`: ```rust let mut rec = Recording::blank(100); rec.straight(1, What::Strike, 10, 70, DVec3::ZERO, DVec3::new(300.0,70.0,0.0)); let mut p = player(&rec); p.heard = 9.0; p.t = 11.0; let mut out = Out::default(); p.sounds(&rec, DVec3::ZERO, &mut out); assert!(!out.sounds.is_empty()); // падает: [] ``` Добавить правильный одноразовый звук начала Strike с проверками однократного воспроизведения и seek/cut. Ещё одно расхождение, видимое по коду: live `Smoke::update` обходит только drones/missiles, тогда как replay_smoke уже добавляет What::Strike. Таким образом у ответной ракеты появляется replay trail, которого live-генератор smoke не строит; live smoke отдельно в игре не проверял. Желательно привести их к одному контракту, как требует исходная приёмка. Не закрываю issue и не создаю дубль: это оставшаяся часть #109.
Author
Owner

🤖 Agent: Codex — устранены описанные в повторном ревью остатки, опубликовано в kimi-work, afe3207.

What::Strike теперь воспроизводит launch one-shot Kalibr через общий heard-cursor. Добавлен тест однократного запуска и повторного воспроизведения после возврата курсора до старта. Live Smoke::update теперь строит след по фактическим позициям strikes тем же cruise-профилем, что использует replay; отдельная категория ключей не пересекается с drone/missile, завершённые источники удаляются из bookkeeping.

Тест live-следа проверяет геометрию сегмента, профиль и очистку источника. Полная унификация сцен/событий из #88 этой небольшой правкой не объявляется выполненной.

Проверка всего набора после объединения: 173 unit + 4 scenario tests passed, 7 ignored; WASM release build и git diff --check прошли. GUI/прослушивание звука в этом проходе не выполнялись. Статус issue не меняю.

🤖 Agent: Codex — устранены описанные в повторном ревью остатки, опубликовано в `kimi-work`, [afe3207](https://gitea.maoniao.team/chexit/airdef/commit/afe3207). What::Strike теперь воспроизводит launch one-shot Kalibr через общий heard-cursor. Добавлен тест однократного запуска и повторного воспроизведения после возврата курсора до старта. Live Smoke::update теперь строит след по фактическим позициям strikes тем же cruise-профилем, что использует replay; отдельная категория ключей не пересекается с drone/missile, завершённые источники удаляются из bookkeeping. Тест live-следа проверяет геометрию сегмента, профиль и очистку источника. Полная унификация сцен/событий из #88 этой небольшой правкой не объявляется выполненной. Проверка всего набора после объединения: 173 unit + 4 scenario tests passed, 7 ignored; WASM release build и git diff --check прошли. GUI/прослушивание звука в этом проходе не выполнялись. Статус issue не меняю.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#109