[enhancement] Единые события и снимки сцены для live-боя, реплея, кинорежиссёра и экспорта #88

Open
opened 2026-10-30 10:29:54 +00:00 by chexit · 3 comments
Owner

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

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

Почему текущая запись уже тесна

sim/record.rs::EventKind хранит Kill/Hit/SamLost/Split/Crash; позиции треков пишутся раз в два тика, а SAM — статическим (id, kind, pos). Не записаны реальные обнаружение/захват, поворот/поза установки, событие пуска/зажигания, движение ПВО и переходы узлов/пожара. Кинорежиссёр честно выводит пуск из первой точки ракеты и не может достоверно показать отсутствующий захват. Live рисует через Sim::draw_*, replay отдельно восстанавливает draw_ghosts, replay_blasts и replay_fires.

Кроме того, метод с названием Sim::log запускает ignite: запись события одновременно является местом игрового эффекта. Это затрудняет отключение/перестройку recorder без изменения боя. #76 и #78 — конкретные баги нынешнего тракта; их исправление не нужно откладывать до рефакторинга.

Предложение

  • Типизированные доменные события с устойчивыми ID и временем: Scan/TrackAcquired/TrackLost, Aim/Launch/Ignition, Damage/Destroyed(outcome), FireStarted/Changed/Ended. Записывать действительные переходы, не домысливать их в кино.
  • Начальный snapshot + необходимые дельты/периодические keyframes: поза/состояние SAM, движущиеся объекты, окружение, seed косметики. Плотность выбирать по данным, не копировать весь мир каждый тик.
  • Общий read-only SceneSnapshot/SceneTimeline для live и recorded источников. Render/audio читают его; кинорежиссёр выбирает камеру/скорость, не пересимулирует бой.
  • Игровые последствия выполняет domain handler; recorder и статистика — потребители фактов. Повторное проигрывание события для картинки не наносит повторный урон живому миру.

Приёмка

Seek и повторный seek на один момент дают те же позы, огонь, дым и звук. В кино видны фактические поворот/пуск/зажигание и исход поражения; данные не берутся из текущего боя. Старые записи имеют явный fallback/версию. Ограничить память/длину и измерить стоимость на существующем 10-минутном лимите. Это небольшой журнал сцены, не требование внедрить распределённый event-sourcing.

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

🤖 Filed by Codex, AI-агент Владимира (chexit). Архитектурный проход по `76f680eba64b64eb28435e71ce9f22a84b0e5da1`. ### Почему текущая запись уже тесна `sim/record.rs::EventKind` хранит Kill/Hit/SamLost/Split/Crash; позиции треков пишутся раз в два тика, а SAM — статическим `(id, kind, pos)`. Не записаны реальные обнаружение/захват, поворот/поза установки, событие пуска/зажигания, движение ПВО и переходы узлов/пожара. Кинорежиссёр честно выводит пуск из первой точки ракеты и не может достоверно показать отсутствующий захват. Live рисует через `Sim::draw_*`, replay отдельно восстанавливает `draw_ghosts`, `replay_blasts` и `replay_fires`. Кроме того, метод с названием `Sim::log` запускает `ignite`: запись события одновременно является местом игрового эффекта. Это затрудняет отключение/перестройку recorder без изменения боя. #76 и #78 — конкретные баги нынешнего тракта; их исправление не нужно откладывать до рефакторинга. ### Предложение - Типизированные доменные события с устойчивыми ID и временем: Scan/TrackAcquired/TrackLost, Aim/Launch/Ignition, Damage/Destroyed(outcome), FireStarted/Changed/Ended. Записывать действительные переходы, не домысливать их в кино. - Начальный snapshot + необходимые дельты/периодические keyframes: поза/состояние SAM, движущиеся объекты, окружение, seed косметики. Плотность выбирать по данным, не копировать весь мир каждый тик. - Общий read-only `SceneSnapshot/SceneTimeline` для live и recorded источников. Render/audio читают его; кинорежиссёр выбирает камеру/скорость, не пересимулирует бой. - Игровые последствия выполняет domain handler; recorder и статистика — потребители фактов. Повторное проигрывание события для картинки не наносит повторный урон живому миру. ### Приёмка Seek и повторный seek на один момент дают те же позы, огонь, дым и звук. В кино видны фактические поворот/пуск/зажигание и исход поражения; данные не берутся из текущего боя. Старые записи имеют явный fallback/версию. Ограничить память/длину и измерить стоимость на существующем 10-минутном лимите. Это небольшой журнал сцены, не требование внедрить распределённый event-sourcing. Общий порядок и зависимости: [архитектурная дорожная карта](https://gitea.maoniao.team/chexit/airdef/issues/103).
Author
Owner

🤖 Agent: Codex — работа Владимира (chexit).

Сцена и события: ограниченный typed journal хранит фактические launch/ignition с позицией, ID и звуком, переходы track/lock/source, изменения пожара; SAM keyframes сохраняют health и узлы. Replay использует точный запуск/зажигание и пожар, режиссёр — фактический пуск и позицию SAM. Старые/усечённые записи имеют fallback. Доменные последствия вынесены из recorder: record_event только сохраняет факт, emit_combat_event применяет последствия независимо от наличия записи.

Проверены seek, дубли звука, состояние узлов, огонь с/без recorder. Лимит 65536 scene transitions с явным truncated; отдельный синтетический journal stress на Mac: 12000 ticks ×16 lock transitions, около 26 ms, event Vec capacity 4 MiB. Это не замер FPS/полной записи. Общий SceneSnapshot/SceneTimeline для всех потребителей ещё не завершён; текущие render adapters остаются.

Issue оставлен открытым согласно просьбе автора.

🤖 Agent: Codex — работа Владимира (chexit). [Сцена и события](https://gitea.maoniao.team/chexit/airdef/commit/f28e68d): ограниченный typed journal хранит фактические launch/ignition с позицией, ID и звуком, переходы track/lock/source, изменения пожара; SAM keyframes сохраняют health и узлы. Replay использует точный запуск/зажигание и пожар, режиссёр — фактический пуск и позицию SAM. Старые/усечённые записи имеют fallback. Доменные последствия вынесены из recorder: record_event только сохраняет факт, emit_combat_event применяет последствия независимо от наличия записи. Проверены seek, дубли звука, состояние узлов, огонь с/без recorder. Лимит 65536 scene transitions с явным truncated; отдельный синтетический journal stress на Mac: 12000 ticks ×16 lock transitions, около 26 ms, event Vec capacity 4 MiB. Это не замер FPS/полной записи. Общий SceneSnapshot/SceneTimeline для всех потребителей ещё не завершён; текущие render adapters остаются. Issue оставлен открытым согласно просьбе автора.
Author
Owner

🤖 Agent: Codex, при участии GPT-6.1 Terra и GPT-6 Luna. Продолжение в kimi-work: код.

Smoke и Shown теперь читают общий read-only Snapshot с live/recorded/empty источником, временем, movers, пожарами и blast. Отсутствующая запись не подхватывает накопленные live trails. Recorded smoke billows сохраняют ограниченное 900-тиковое окно независимо от более короткой вспышки; классификация событий общая. Физический strike сохраняет carrier/muzzle, холодный выброс и относительную сетку записи, а дым не рисуется задним числом на неработавшем двигателе.

Тесты seek 40→120→40 с чередованием чужих live Sim, отсутствующей записи и delayed ignition проходят. Потребители model/audio и режиссёр ещё используют отдельные adapters; 10-минутный замер стоимости/памяти и полная унификация остаются. Issue не закрываю.

🤖 Agent: Codex, при участии GPT-6.1 Terra и GPT-6 Luna. Продолжение в `kimi-work`: [код](https://gitea.maoniao.team/chexit/airdef/commit/d4adbb1e473c94241c9b38f82bb325ba5450d67e). Smoke и Shown теперь читают общий read-only Snapshot с live/recorded/empty источником, временем, movers, пожарами и blast. Отсутствующая запись не подхватывает накопленные live trails. Recorded smoke billows сохраняют ограниченное 900-тиковое окно независимо от более короткой вспышки; классификация событий общая. Физический strike сохраняет carrier/muzzle, холодный выброс и относительную сетку записи, а дым не рисуется задним числом на неработавшем двигателе. Тесты seek 40→120→40 с чередованием чужих live Sim, отсутствующей записи и delayed ignition проходят. Потребители model/audio и режиссёр ещё используют отдельные adapters; 10-минутный замер стоимости/памяти и полная унификация остаются. Issue не закрываю.
Author
Owner

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna.

Replay snapshots now carry battery mode, radar role, spent-cell mask and individual lid pose. Seeking restores the recorded state rather than consulting live SAMs. Live/replayed missile exhaust starts at ignition; the first recorded trail segment is clipped to the ignition position. A seek-forward/back regression test passes.

Pushed code in 966b52f and visual verification/docs in 2689d93 on kimi-work. Core: 169 passed, 7 ignored; 4 scenarios passed. Adapter: 53 tests, 1 boundary test and 4 scenarios passed. Actual WASM contract: 21 steps passed. Implementation and checks

Issue state intentionally unchanged.

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna. Replay snapshots now carry battery mode, radar role, spent-cell mask and individual lid pose. Seeking restores the recorded state rather than consulting live SAMs. Live/replayed missile exhaust starts at ignition; the first recorded trail segment is clipped to the ignition position. A seek-forward/back regression test passes. Pushed code in 966b52f and visual verification/docs in 2689d93 on kimi-work. Core: 169 passed, 7 ignored; 4 scenarios passed. Adapter: 53 tests, 1 boundary test and 4 scenarios passed. Actual WASM contract: 21 steps passed. [Implementation and checks](https://gitea.maoniao.team/chexit/airdef/src/branch/kimi-work/docs/BATTERIES-AND-COLD-LAUNCH.md) Issue state intentionally unchanged.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#88