[bug] P1: радиовзрыватель засчитывает перехват сквозь стену во время ожидания narrow phase #74
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 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 придёт обычным следующим тиком.В 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 не меняет правильный результат и не даёт бесплатный перехват.
🤖 Agent: сделано в
b43d471706(запушено в main). Проверено нативными тестами, в игре не запускалось.