Files
airdef/docs/BATTERIES-AND-COLD-LAUNCH.md
T
chexit 56093b3a55 Record the #129 balance and the cold-launch capture
The stage contract and profiles are in 4b013fb. This commit adds the
measured balance (the #120 grid on identical seeds and the 12-seed raid),
the replay/export video with four stills, and updates the user and handoff
documentation. The visual files are provided for human review; the agent
that captured them has no image input and checked only the encoded
parameters, shot boundaries and the first large plume.

Co-Authored-By: Kimi Code <noreply@kimi.com>
2026-11-06 13:35:35 +03:00

178 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Раздельная батарея и холодный пуск
## Из исследования в игру
Вместо «всё на одной машине» добавлена конфигурация с отдельными пусковыми и общими РЛС.
Высокоуровневое разделение обзорной и огневой РЛС соответствует публичным описаниям системы;
это не полная модель конкретной штатной батареи.
| Публично описываемый элемент С-400 | Его смысл | Игровая адаптация |
|---|---|---|
| 91Н6: обзор/обнаружение | Общая воздушная картина | `radar_search`: больший игровой обзор, передача наблюдений |
| 92Н6: сопровождение/управление огнём | Отдельный радар огневого комплекса | `radar_track`: более частые собственные измерения, поддержка нескольких ПУ |
| Дополнительная 96Л6 и антенные мачты | Дополнительные средства обнаружения | `radar_height`: условная мачтовая роль, улучшенный игровой радиогоризонт; это не копия 96Л6 |
| Командный пункт 55К6 | Управление и обмен данными | Пока абстрагирован существующей сетью и распределением целей, отдельной машины КП нет |
| Пусковая с ТПК | Боекомплект и физический пуск | `s400_launcher` / `s500_launcher`, без навесной РЛС |
Источники для архитектуры: оригинальная техническая публикация
[Bundesheer, «Radars für Raketenabwehr»](https://www.bmlv.gv.at/pdf_pool/publikationen/7_rosmann.pdf)
разделяет обзорный 91N6 и огневой 92N6; статья об С-400 в официальном
[Memorial de Artillería 174/2, Ministerio de Defensa](https://publicaciones.defensa.gob.es/media/downloadable/files/links/m/e/memorial_artilleria_174-2.pdf)
перечисляет КП, радары, пусковые и дополнительные средства. Это публичные обзоры,
не эксплуатационная документация изготовителя. У чисел времени, дальности и качества в моде
собственная игровая шкала; из этих публикаций они не калибровались.
Для наглядности холодного старта найден официальный выпуск
[«С-400. Секрет ракеты», «Военная приёмка»](https://rutube.ru/video/37a2ef7d5e83ffa9ec4ba222bfd8ce5f/)
с участием завода «Авангард». Доступная страница выпуска не содержит стенограммы;
форма шарнира крышки и длительность игровых стадий не объявляются воспроизведением механизма прототипа.
Для С-500 применяется стилизация существующего игрового профиля, без утверждения о механике всех реальных ракет.
## Как собрать
Через N → «Разместить элементы батареи…» можно расставить элементы в разных местах.
Командные эквиваленты:
```text
/airdef deploy radar_search
/airdef deploy radar_track
/airdef deploy s400_launcher
/airdef deploy s500_launcher
/airdef deploy radar_height
/airdef battery
```
Нумерацию существующей техники показывает `/airdef battery`. Чтобы переоборудовать её:
```text
/airdef battery <номер С-400 или С-500> launcher
/airdef radar <номер РЛС> search
/airdef radar <номер другой РЛС> engagement
```
Можно оставить одну многофункциональную РЛС (`multi`) и несколько пусковых.
Поисковая/мачтовая РЛС даёт подсказку, но не разрешает огонь сама. РЛС сопровождения принимает
подсказку и должна **сама измерить** цель в своей игровой досягаемости и с учётом рельефа.
Чужой трек не превращается в собственное измерение. После этого связанные пусковые используют
общую картину и существующее распределение целей. Если РЛС сопровождения уничтожена, свёрнута,
потеряла связь или её измерение устарело, новые пуски прекращаются. Уже вылетевшие ракеты
продолжают штатную игровую логику связи/памяти/самонаведения.
Старые миры и обычные `/airdef deploy s400` / `s500` сохраняют сборную конфигурацию `integrated`.
Режимы, роли, боезапас и использованные контейнеры сохраняются с миром и сценариями.
У прежнего игрового С-500 был магазин на четыре ракеты при двух нарисованных ТПК;
теперь он согласован с двумя физическими ячейками. При загрузке старой расстановки
его загруженный остаток ограничивается новой вместимостью, как при обычном восстановлении боезапаса.
## Что видно при пуске
1. Подготовка резервирует конкретную ячейку. Отдельная крышка ТПК открывается; ракета ещё не расходуется.
2. При потере цели или неисправности/сворачивании носителя до выброса подготовка отменяется.
3. Ракета выбрасывается из фактического muzzle. Боекомплект уменьшается один раз; использованный ТПК остаётся открытым.
4. Выброс идёт без двигателя: ракета поднимается и линейно теряет скорость под газовым сопротивлением.
Длительность считается от выброса, а не от открытия крышки: у С-400 (`M48n6`) 20 тиков — 1,00 с,
у С-500 (`M77n6`) 24 тика — 1,20 с, у IRIS-T и Тора (`IrisT`/`M9m338`) 8 тиков — 0,40 с.
В этой фазе нет факела, непрерывного звука двигателя, моторного света и powered smoke; остаётся
только отдельный газовый хлопок/клуб.
5. Зажигание — отдельное событие в текущей точке ракеты, а не у оставленной ПУ: там же появляются
вспышка, факел, звук и запись `MotorIgnition`. Оно наступает после `cold` тиков выброса.
6. После зажигания начинается departure: тяга плавно нарастает от 45% к 100%, а допустимый темп
поворота — от 20% к полному за `boost` тиков. Полное наведение (включая самонаведение и облёт
рельефа) включается только при `age >= cold + boost`; при увеличении `cold` оно не может
включиться раньше мотора. Максимальная скорость, `pk`, `turn` и правила столкновений не менялись.
Это действует для зенитных С-400/С-500 и подготовленного ударного RM48U у С-400.
У ручного удара носитель и ячейка резервируются до пуска; изменение состояния отменяет подготовку
без расхода. RM48U использует ту же 20-тиковую хореографию: неосвещённый выброс, зажигание в текущей
точке, затем разгон; насчитанное время полёта включает выброс, а записанный дым начинается у точки
зажигания. Задержанный ручной приказ не возобновляется после загрузки мира: незапущенный боеприпас
остаётся в носителе. Ракеты с рельсовым (горячим) пуском тоже получили плавное нарастание тяги за
свой `boost`, но не холодный выброс; электрический P1-SUN сохраняет постоянный разгон и не получает
ракетную струю.
В записи сохраняются конфигурация машины, использованные ячейки и положение крышки;
повтор восстанавливает их по своей временной шкале. Записанный дым начинается у точки зажигания,
а не рисуется задним числом от горловины контейнера.
## Ограничения
Роли РЛС и мачта пока используют общую модель машины, с разным поведением/отображением антенны.
Отдельные точные модели 91Н6/92Н6/96Л6, машина КП, ручная принадлежность к батарее, отдельные
каналы сопровождения и кабельное снабжение пока не добавлены. Подробные режимы и параметры реальных
комплексов не моделируются. В следующей серии добавлены конечная работа двигателя/coast (#120),
доставка RM48U через ТЗМ (#118), переключение излучения (#121) и укрытия от непрямого blast (#119).
Текущий объём и ограничения описаны в [техническом журнале](CODEX-HANDOFF.md).
## Проверка в игре и тестами
Историческая контрольная точка батареи и команд — `966b52f`: 169 тестов ядра и 4 сценария
(7 ignored), 53 теста адаптера, проверка границы с ядром и ещё 4 сценария; настоящий WASM-пакет
прошёл 21 шаг `wasm_contract.toml`, генератор моделей не нашёл различий.
Контрольная точка #129 — `4b013fb7f30dbaa87a266b27a31911937fc523b4` (ветка
`agent/issue-129-cold-launch`): core release **206 + 8 сценариев** (8 ignored), адаптер
**67 + 1 boundary + 5 сценариев**, настоящий WASM **30 шагов**, `gen_catalog.py --check` без
расхождений, `gen_models.py --check` без различий, `test_gen_assets.py` — 10 тестов.
Отдельные тесты проверяют открытие до расхода, отмену при повреждении, однократное списание при
выбросе, отсутствие голоса/факела до зажигания, записанное зажигание через `cold` тиков после
выброса, плавные ограничения скорости и поворота для всех профилей, а также RM48U без powered
эффектов до зажигания. Тест повтора проверяет перемотку состояния крышек и конфигурации ПУ туда и
обратно и отсутствие дыма до записанного зажигания.
Сравнительная выборка #129 (те же seed, что у сетки #120; 6 вариантов × 8 seed, 2208 целей на
сторону): сбито 1988 → 1939, прорывов 216 → 258, ракет 3461 → 3467; `energy_lost` 0 → 0,
`expired` 1 → 0, сорванных о рельеф 2 → 4. Близкие (`near200`) 318 → 311 сбитых, дальние
(`far1500`) 338 → 334, холмы (`hills20`) 334 → 319. Отдельные 12 seed `SAMS=20 SIZE=12`:
203 → 201 сбитых, 1 → 3 прорыва, 355 → 360 ракет. Это ожидаемое следствие более длинного старта,
а не скрытая компенсация: `pk`, максимальные скорости и столкновения не менялись. Данные:
[сетка](measurements/issue-129-grid.csv), [рейды](measurements/issue-129-balance.csv).
Ниже — исходные кадры крышек из изолированного тестового мира Horizon, Metal, 2560×1440.
На первом четыре малые крышки ТПК закрыты; на втором одна поднята, остальные закрыты.
Большая прямоугольная панель позади труб — навесная РЛС конфигурации `integrated`.
![Четыре закрытые крышки ТПК](media/cold-launch/s400-closed.png)
![Одна использованная ячейка с поднятой крышкой](media/cold-launch/s400-one-cell-used.png)
Для этих кадров использовалась промежуточная сборка SHA-256
`3fae616902563b01e6463a32687c062d5983c4e94bd357f8f8129744d859f4d7`;
геометрия крышек и их преобразования совпадают с опубликованной версией.
Сохранение после пуска содержит 3 оставшиеся ракеты С-400 и маску использованной ячейки `1`.
### Съёмка стадий #129
Изолированный scratch-мир `ColdLaunch129` (плоский тестовый рельеф, `--creative`), Metal,
`HORIZON_NO_AUDIO=1`, мод и клиент из коммита `4b013fb…`. Один перехват Х-22
записан и экспортирован режиссёром: `/airdef replay export cold129d best fps=30 size=1280x720`.
Файл [cold-launch-129.mp4](media/cold-launch/cold-launch-129.mp4) — h264 1280×720, 30 fps,
403 кадра, 13,43 с, AAC 48 кГц stereo (mean −15,7 dB, max −1,1 dB; звук сведён офлайн,
живое прослушивание не выполнялось). Это повтор/экспорт одной записи, а не отдельная
live-съёмка: живые кадры того же пуска в MP4 не попали.
Планы фильма (по сменам кадра и OCR титров, 30 fps): общий план ПУ — кадры 1–93; «Пуск» —
94–152; «Сближение» — 153–218; «Поражение цели» — 219–403. В плане «Пуск» камера стоит в
46 блоках сбоку и следит за ракетой. Выброс начинается на кадре 94; крупная факельная область
появляется на кадре 128, то есть через 34 кадра ≈ 1,13 с от начала выброса — в пределах
нескольких кадров от правила `cold=20` тиков = 1,00 с (титр/склейка и порог цвета добавляют
задержку). До этого кадра крупного факела нет. Разгон и поворот видны в кадрах 128–152
(≈0,8 с powered departure).
Кадры из того же MP4 (общий план, 0,5 с выброса без факела, 1,1 с — факел, 1,7 с — разгон):
![Общий план С-400 перед пуском](media/cold-launch/cold-launch-129-general.png)
![Неосвещённый выброс, около 0,5 с](media/cold-launch/cold-launch-129-eject-0.5s.png)
![Факел после зажигания, около 1,1 с](media/cold-launch/cold-launch-129-ignition-1.1s.png)
![Разгон и поворот, около 1,7 с](media/cold-launch/cold-launch-129-departure-1.7s.png)
**Ограничение приёмки.** Агент, выполнивший прогон, не имеет ввода изображений и не может сам
оценить композицию, читаемость и красоту кадров; он проверил только факт съёмки, разрешение,
частоту, длительность, звуковую дорожку, границы планов и появление крупной факельной области.
Кадры и MP4 приложены для человеческого просмотра. Отдельный очень крупный статичный план
выброса у самой ПУ и live-видео в этом прогоне не сняты; `--offscreen` не даёт окна для
сторонней записи экрана. Это не полная визуальная приёмка #129.