56093b3a55
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>
178 lines
18 KiB
Markdown
178 lines
18 KiB
Markdown
# Раздельная батарея и холодный пуск
|
||
|
||
## Из исследования в игру
|
||
|
||
Вместо «всё на одной машине» добавлена конфигурация с отдельными пусковыми и общими РЛС.
|
||
Высокоуровневое разделение обзорной и огневой РЛС соответствует публичным описаниям системы;
|
||
это не полная модель конкретной штатной батареи.
|
||
|
||
| Публично описываемый элемент С-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`.
|
||
|
||

|
||
|
||

|
||
|
||
Для этих кадров использовалась промежуточная сборка 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 с — разгон):
|
||
|
||

|
||
|
||

|
||
|
||

|
||
|
||

|
||
|
||
**Ограничение приёмки.** Агент, выполнивший прогон, не имеет ввода изображений и не может сам
|
||
оценить композицию, читаемость и красоту кадров; он проверил только факт съёмки, разрешение,
|
||
частоту, длительность, звуковую дорожку, границы планов и появление крупной факельной области.
|
||
Кадры и MP4 приложены для человеческого просмотра. Отдельный очень крупный статичный план
|
||
выброса у самой ПУ и live-видео в этом прогоне не сняты; `--offscreen` не даёт окна для
|
||
сторонней записи экрана. Это не полная визуальная приёмка #129.
|