[bug] Ответная ракета после ожидания world-query догоняет таймер скачком на сотни блоков #117

Closed
opened 2026-11-01 10:54:15 +00:00 by chexit · 1 comment
Owner

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

Ревью kimi-work @ cd3c4ed76d3308ec1d87341b962ff04aadada293, 1 ноября 2026. Регрессия нового движения counter-strike из 31d967b (#106); отличается от пропуска терминального sweep, который дописан в #106.

Причина

fly_strikes:589 вычисляет плановую точку по абсолютному времени (now - f.start)/(f.arrive - f.start). Sweep::Wait/Unknown ограничивают текущую f.pos, но время движения продолжает идти. Когда мир наконец отвечает, want находится далеко впереди; ничто не ограничивает длину шага want - from.

Ракета наверстывает ожидание одним перемещением вместо продолжения полёта с нормальной скоростью. Sweep проверяет этот длинный прямой отрезок, поэтому тест не утверждает, что ракета обязательно проходит сквозь известные блоки; ошибка — в самой траектории/скорости и её зависимости от задержки загрузки. Звук при этом по-прежнему получает dir * TUNE.speed (строка 644), хотя фактическое перемещение намного больше. Если ожидание заканчивается после arrive, план сразу указывает на endpoint.

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

Использован новый fixture fixed_site/Wall/warm/serve прямо из strike.rs в отдельной копии мода. Seed=11, площадка z=1000, старт (0,64,0), cover=0. Первые 20 тиков world-query не отвечены, затем cache заполнен открытой геометрией и сделан один шаг.

tick 20: pos=(0,65.5,0)
tick 21: pos=(0.194,93.635,162.304)
distance moved in ONE tick=164.72484
TUNE.speed=8 blocks/tick

Задержка искусственно задана fixture; это проверка контракта асинхронных ответов, не замер скорости streaming на конкретном устройстве.

let mut sim = Sim::new(11);
sim.strikes.cover_override = Some(0);
let id = fixed_site(&mut sim, DVec3::new(0.0,64.0,1000.0), 0);
let (mut ground, mut out) = (Ground::default(), Out::default());
sim.order_strike(id, DVec3::new(0.0,64.0,0.0), &mut out).unwrap();
for _ in 0..20 { sim.step(&mut ground, None, &mut out); }
let before = sim.strikes.flights[0].pos;
let open = Wall { at: 10_000, hole: None };
let f = sim.strikes.flights[0];
warm(&mut ground, &open, f.from, DVec3::new(f.land.x,110.0,f.land.y));
serve(&mut ground, &open, sim.tick);
sim.step(&mut ground, None, &mut out);
let after = sim.strikes.flights[0].pos;
assert!(before.distance(after) < TUNE.speed * 2.0); // сейчас 164.7

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

Вести прогресс траектории по фактически разрешённому движению; ожидание геометрии не должно превращаться в накопленный долг перемещения. Или двигаться от текущей позиции с ограничением скорости/шага. Общий таймаут жизни оставить отдельным от времени продвижения, чтобы ракета не висела бесконечно.

  • Одинаковый открытый мир с ответами сразу и после задержки: ожидание меняет время прибытия, но не создаёт скачка скорости.
  • Проверить Pending, exact-shape Wait, Missing chunk и несколько отдельных ожиданий, включая после планового arrive.
  • Полная/частичная остановка согласованы с обнулением hold на Clear; дым, recorded positions и velocity двигателя следуют фактическому движению.
  • Путь к новой текущей высоте рельефа также не даёт мгновенного скачка.
🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `kimi-work` @ `cd3c4ed76d3308ec1d87341b962ff04aadada293`, 1 ноября 2026. Регрессия нового движения counter-strike из `31d967b` (#106); отличается от пропуска терминального sweep, который дописан в #106. ### Причина [fly_strikes:589](https://gitea.maoniao.team/chexit/airdef/src/commit/cd3c4ed76d3308ec1d87341b962ff04aadada293/airdef-mod/src/sim/strike.rs#L589) вычисляет плановую точку по абсолютному времени `(now - f.start)/(f.arrive - f.start)`. `Sweep::Wait`/`Unknown` ограничивают текущую `f.pos`, но время движения продолжает идти. Когда мир наконец отвечает, `want` находится далеко впереди; ничто не ограничивает длину шага `want - from`. Ракета наверстывает ожидание одним перемещением вместо продолжения полёта с нормальной скоростью. Sweep проверяет этот длинный прямой отрезок, поэтому тест не утверждает, что ракета обязательно проходит сквозь известные блоки; ошибка — в самой траектории/скорости и её зависимости от задержки загрузки. Звук при этом по-прежнему получает `dir * TUNE.speed` ([строка 644](https://gitea.maoniao.team/chexit/airdef/src/commit/cd3c4ed76d3308ec1d87341b962ff04aadada293/airdef-mod/src/sim/strike.rs#L644)), хотя фактическое перемещение намного больше. Если ожидание заканчивается после arrive, план сразу указывает на endpoint. ### Подтверждено нативно Использован новый fixture `fixed_site`/`Wall`/`warm`/`serve` прямо из strike.rs в отдельной копии мода. Seed=11, площадка z=1000, старт `(0,64,0)`, cover=0. Первые 20 тиков world-query не отвечены, затем cache заполнен открытой геометрией и сделан один шаг. ``` tick 20: pos=(0,65.5,0) tick 21: pos=(0.194,93.635,162.304) distance moved in ONE tick=164.72484 TUNE.speed=8 blocks/tick ``` Задержка искусственно задана fixture; это проверка контракта асинхронных ответов, не замер скорости streaming на конкретном устройстве. ```rust let mut sim = Sim::new(11); sim.strikes.cover_override = Some(0); let id = fixed_site(&mut sim, DVec3::new(0.0,64.0,1000.0), 0); let (mut ground, mut out) = (Ground::default(), Out::default()); sim.order_strike(id, DVec3::new(0.0,64.0,0.0), &mut out).unwrap(); for _ in 0..20 { sim.step(&mut ground, None, &mut out); } let before = sim.strikes.flights[0].pos; let open = Wall { at: 10_000, hole: None }; let f = sim.strikes.flights[0]; warm(&mut ground, &open, f.from, DVec3::new(f.land.x,110.0,f.land.y)); serve(&mut ground, &open, sim.tick); sim.step(&mut ground, None, &mut out); let after = sim.strikes.flights[0].pos; assert!(before.distance(after) < TUNE.speed * 2.0); // сейчас 164.7 ``` ### Исправление и приёмка Вести прогресс траектории по фактически разрешённому движению; ожидание геометрии не должно превращаться в накопленный долг перемещения. Или двигаться от текущей позиции с ограничением скорости/шага. Общий таймаут жизни оставить отдельным от времени продвижения, чтобы ракета не висела бесконечно. - Одинаковый открытый мир с ответами сразу и после задержки: ожидание меняет время прибытия, но не создаёт скачка скорости. - Проверить Pending, exact-shape Wait, Missing chunk и несколько отдельных ожиданий, включая после планового arrive. - Полная/частичная остановка согласованы с обнулением hold на Clear; дым, recorded positions и velocity двигателя следуют фактическому движению. - Путь к новой текущей высоте рельефа также не даёт мгновенного скачка.
chexit added the type:bugarea:simulationpriority:P2 labels 2026-11-01 10:54:15 +00:00
Author
Owner

🤖 Agent: Codex — опубликовано в kimi-work, 5860c50.

Фактическое перемещение counter-strike теперь ограничено TUNE.speed за тик, включая возобновление после ожидания мира и изменение высоты endpoint. Абсолютная плановая точка остаётся ориентиром; накопленный долг времени не разрешает скачок. Velocity постоянного звукового источника берётся из реального перемещения. Clear сбрасывает hold; общий ограниченный срок жизни сохранён.

Регрессия: 20 тиков без ответов мира, затем открытая геометрия; проверяется каждый последующий шаг <= TUNE.speed и обычное завершение удара. Вместе с терминальной стеной #106 целевые strike tests: 19 passed.

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

🤖 Agent: Codex — опубликовано в `kimi-work`, [5860c50](https://gitea.maoniao.team/chexit/airdef/commit/5860c50). Фактическое перемещение counter-strike теперь ограничено TUNE.speed за тик, включая возобновление после ожидания мира и изменение высоты endpoint. Абсолютная плановая точка остаётся ориентиром; накопленный долг времени не разрешает скачок. Velocity постоянного звукового источника берётся из реального перемещения. Clear сбрасывает hold; общий ограниченный срок жизни сохранён. Регрессия: 20 тиков без ответов мира, затем открытая геометрия; проверяется каждый последующий шаг <= TUNE.speed и обычное завершение удара. Вместе с терминальной стеной #106 целевые strike tests: 19 passed. Проверка всего набора после объединения: 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#117