[bug] Настройки графики меняют боевую случайность и ID: отделить RNG/идентичность эффектов #85

Closed
opened 2026-10-30 10:29:35 +00:00 by chexit · 1 comment
Owner

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

Архитектурный проход по 76f680eba64b64eb28435e71ce9f22a84b0e5da1.

Подтверждено тестом

airdef-mod/src/sim/mod.rs::fireball при shader=true возвращается до создания fallback-модели. При shader=false тот же взрыв вызывает self.id() и три раза расходует self.rng на декоративный поворот. Этот же RNG используется механиками, в том числе damage.rs::aim_error; entity ID участвуют и в stateless dice датчиков/повреждений.

В изолированной копии выполнен native characterization test: два Sim::new(12345), одинаковый fireball, отличается только shader. После взрыва:

  • следующий entity ID: 48 / 32;
  • следующий aim_error(Shahed): (1.881179, 0, 1.971875) / (1.443901, 0, 0.000006536).

Это проверяет конкретную цепочку до игрового значения, а не доказывает, что каждый бой обязательно даст другое число сбитий. Похожие смешения есть в шуме факела, pitch звуков и обломках.

Исправление

  1. Разделить игровые и декоративные ID/случайность. Сохранить устойчивые связи launcher→missile→target и диапазоны part ID.
  2. Для визуального шума использовать отдельный поток либо hash(event ID, visual time, effect seed). Боевой RNG не должен расходоваться отрисовкой, звуком или камерой.
  3. Проверить также stateless dice: одинаковая механика должна получать одинаковые domain ID независимо от количества FX.

Приёмка

Одинаковые seed, команды и ответы мира дают одинаковый combat trace/state hash при HD/fallback, звуке on/off и разных частотах показа. Сравнивать попадания, ошибки наведения, повреждения, боезапас и domain ID, исключив косметику. Обычный same-seed тест с одинаковыми настройками этот случай не ловит. Нужен отдельный регрессионный тест. Поддерживает будущий общий журнал событий.

Общий порядок и зависимости: архитектурная дорожная карта.

🤖 Filed by Codex, AI-агент Владимира (chexit). Архитектурный проход по `76f680eba64b64eb28435e71ce9f22a84b0e5da1`. ### Подтверждено тестом `airdef-mod/src/sim/mod.rs::fireball` при `shader=true` возвращается до создания fallback-модели. При `shader=false` тот же взрыв вызывает `self.id()` и три раза расходует `self.rng` на декоративный поворот. Этот же RNG используется механиками, в том числе `damage.rs::aim_error`; entity ID участвуют и в stateless `dice` датчиков/повреждений. В изолированной копии выполнен native characterization test: два `Sim::new(12345)`, одинаковый `fireball`, отличается только `shader`. После взрыва: - следующий entity ID: **48 / 32**; - следующий `aim_error(Shahed)`: **(1.881179, 0, 1.971875) / (1.443901, 0, 0.000006536)**. Это проверяет конкретную цепочку до игрового значения, а не доказывает, что каждый бой обязательно даст другое число сбитий. Похожие смешения есть в шуме факела, pitch звуков и обломках. ### Исправление 1. Разделить игровые и декоративные ID/случайность. Сохранить устойчивые связи launcher→missile→target и диапазоны part ID. 2. Для визуального шума использовать отдельный поток либо hash(event ID, visual time, effect seed). Боевой RNG не должен расходоваться отрисовкой, звуком или камерой. 3. Проверить также stateless dice: одинаковая механика должна получать одинаковые domain ID независимо от количества FX. ### Приёмка Одинаковые seed, команды и ответы мира дают одинаковый combat trace/state hash при HD/fallback, звуке on/off и разных частотах показа. Сравнивать попадания, ошибки наведения, повреждения, боезапас и domain ID, исключив косметику. Обычный same-seed тест с одинаковыми настройками этот случай не ловит. Нужен отдельный регрессионный тест. Поддерживает будущий общий журнал событий. Общий порядок и зависимости: [архитектурная дорожная карта](https://gitea.maoniao.team/chexit/airdef/issues/103).
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#85