[bug] P1: радиовзрыватель засчитывает перехват сквозь стену во время ожидания narrow phase #74

Closed
opened 2026-10-30 09:55:13 +00:00 by chexit · 1 comment
Owner

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

Ревью 76f680eba64b64eb28435e71ce9f22a84b0e5da1 (после 6f3fc64). В исправлении #61/#63 движение перехватчика удерживается перед стеной, но проверка поражения цели не ждёт ответа точной коллизии.

Причина

В sim/mod.rs::step_missiles результат ground.trace может быть Sweep::Wait. Тогда world=sweep.hit() равен None, m.pos ограничивается гранью voxel. После этого всё равно выполняется проверка closest approach и world.is_none_or(...) разрешает взрыватель. Pending narrow phase в этой ветке фактически означает отсутствие препятствия для поражения.

Условие Wait не доказывает ни того, что плита оставляет проход, ни того, что полная стена разрешает поразить цель за ней. Полученный позднее Hit уже не исправит засчитанное сбитие.

Выполненное воспроизведение

Реальный step_missiles на копии мода; occupancy заранее прогрет. Стена x=[3,4), y=[64,141), PAC-3 из (0,100,0), начальная скорость вдоль X=6 (ограничивается spec.speed), цель неподвижна в (5.5,100,0), свежий Fix. Точный ray reply придёт обычным следующим тиком.

first tick, narrow reply not received: through-wall kills=9/10

В 9 из 10 seed цель сбита уже на первом тике; ракета удержана у x≈3. Проверены seed 1..10; отличие исходов — существующий pk. GPU/игра не требовались. Штатный тест missile_cannot_pass_through_a_wall ставит цель дальше (x=8.5), поэтому этот радиусный случай не ловит.

Нужно

Разрешать столкновение/взрыватель в одной упорядоченной процедуре с одинаковым параметром времени исходного движения. Неподтверждённая часть шага и ожидаемый контакт не дают права засчитать поражение за преградой. Если допускается подрыв до препятствия и splash через/вокруг него, это должно быть отдельное явное правило, одинаковое для Pending и уже известного Hit.

Приёмка

Одинаковые исходы при мгновенном, задержанном и тёплом narrow reply; цель сразу за стеной внутри fuse radius, свободная половина плиты, цель перед стеной, быстрая встречная цель. Pending не меняет правильный результат и не даёт бесплатный перехват.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `76f680eba64b64eb28435e71ce9f22a84b0e5da1` (после `6f3fc64`). В исправлении #61/#63 движение перехватчика удерживается перед стеной, но проверка поражения цели не ждёт ответа точной коллизии. ### Причина В `sim/mod.rs::step_missiles` результат `ground.trace` может быть `Sweep::Wait`. Тогда `world=sweep.hit()` равен None, `m.pos` ограничивается гранью voxel. После этого **всё равно** выполняется проверка closest approach и `world.is_none_or(...)` разрешает взрыватель. Pending narrow phase в этой ветке фактически означает отсутствие препятствия для поражения. Условие Wait не доказывает ни того, что плита оставляет проход, ни того, что полная стена разрешает поразить цель за ней. Полученный позднее Hit уже не исправит засчитанное сбитие. ### Выполненное воспроизведение Реальный `step_missiles` на копии мода; occupancy заранее прогрет. Стена `x=[3,4), y=[64,141)`, PAC-3 из `(0,100,0)`, начальная скорость вдоль X=6 (ограничивается spec.speed), цель неподвижна в `(5.5,100,0)`, свежий Fix. Точный ray reply придёт обычным следующим тиком. ```text first tick, narrow reply not received: through-wall kills=9/10 ``` В 9 из 10 seed цель сбита уже на первом тике; ракета удержана у x≈3. Проверены seed 1..10; отличие исходов — существующий pk. GPU/игра не требовались. Штатный тест `missile_cannot_pass_through_a_wall` ставит цель дальше (x=8.5), поэтому этот радиусный случай не ловит. ### Нужно Разрешать столкновение/взрыватель в одной упорядоченной процедуре с одинаковым параметром времени исходного движения. Неподтверждённая часть шага и ожидаемый контакт не дают права засчитать поражение за преградой. Если допускается подрыв до препятствия и splash через/вокруг него, это должно быть отдельное явное правило, одинаковое для Pending и уже известного Hit. ### Приёмка Одинаковые исходы при мгновенном, задержанном и тёплом narrow reply; цель сразу за стеной внутри fuse radius, свободная половина плиты, цель перед стеной, быстрая встречная цель. Pending не меняет правильный результат и не даёт бесплатный перехват.
chexit added the type:bugpriority:P1area:simulation labels 2026-10-30 09:55:13 +00:00
Author
Owner

🤖 Agent: сделано в b43d471706 (запушено в main). Проверено нативными тестами, в игре не запускалось.

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

No dependencies set.

Reference: chexit/airdef#74