Files
airdef/docs/BATTERIES-AND-COLD-LAUNCH.md
chexit 0b645d77e9
build / mod (push) Failing after 22s
Normalize #129 measurements and pair the cold-launch capture
Write both measurement CSVs with LF instead of CRLF so the range no longer
fails `git diff --check` on trailing whitespace; the parsed data is unchanged.

Add a matched before/after capture: one copied world, scenario and seed, the
same client/director and the same export command. The baseline hmod is built
from dc36d67 and the final one from the #129 code. Both launch shots start at
frame 94; the first centre illumination is frame 101 (0.233 s) before and
frame 121 (0.900 s) after, against the 0.25/1.00 s cold rules. Raw probe,
hashes and the measurement method are in issue-129-pair.json. The two MP4s
in docs are CRF26 storage copies; the CRF16 originals stay in the scratch
homes.

These are replay exports, not live footage. The capturing agent still has no
image input, so composition is left for human review; the frames before the
launch are not pixel-identical because these are two live sessions.

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

20 KiB
Raw Permalink Blame History

Раздельная батарея и холодный пуск

Из исследования в игру

Вместо «всё на одной машине» добавлена конфигурация с отдельными пусковыми и общими РЛС. Высокоуровневое разделение обзорной и огневой РЛС соответствует публичным описаниям системы; это не полная модель конкретной штатной батареи.

Публично описываемый элемент С-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» разделяет обзорный 91N6 и огневой 92N6; статья об С-400 в официальном Memorial de Artillería 174/2, Ministerio de Defensa перечисляет КП, радары, пусковые и дополнительные средства. Это публичные обзоры, не эксплуатационная документация изготовителя. У чисел времени, дальности и качества в моде собственная игровая шкала; из этих публикаций они не калибровались.

Для наглядности холодного старта найден официальный выпуск «С-400. Секрет ракеты», «Военная приёмка» с участием завода «Авангард». Доступная страница выпуска не содержит стенограммы; форма шарнира крышки и длительность игровых стадий не объявляются воспроизведением механизма прототипа. Для С-500 применяется стилизация существующего игрового профиля, без утверждения о механике всех реальных ракет.

Как собрать

Через N → «Разместить элементы батареи…» можно расставить элементы в разных местах. Командные эквиваленты:

/airdef deploy radar_search
/airdef deploy radar_track
/airdef deploy s400_launcher
/airdef deploy s500_launcher
/airdef deploy radar_height
/airdef battery

Нумерацию существующей техники показывает /airdef battery. Чтобы переоборудовать её:

/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). Текущий объём и ограничения описаны в техническом журнале.

Проверка в игре и тестами

Историческая контрольная точка батареи и команд — 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, максимальные скорости и столкновения не менялись. Данные: сетка, рейды.

Ниже — исходные кадры крышек из изолированного тестового мира Horizon, Metal, 2560×1440. На первом четыре малые крышки ТПК закрыты; на втором одна поднята, остальные закрыты. Большая прямоугольная панель позади труб — навесная РЛС конфигурации integrated.

Четыре закрытые крышки ТПК

Одна использованная ячейка с поднятой крышкой

Для этих кадров использовалась промежуточная сборка SHA-256 3fae616902563b01e6463a32687c062d5983c4e94bd357f8f8129744d859f4d7; геометрия крышек и их преобразования совпадают с опубликованной версией. Сохранение после пуска содержит 3 оставшиеся ракеты С-400 и маску использованной ячейки 1.

Парная съёмка #129: до и после

Оба ролика сняты на одном и том же scratch-мире ColdLaunch129 (плоский тестовый рельеф, --creative), одном сохранении мира, одном сценарии pair129 и одном seed 965460218386186365. Сценарий: С-400 в точке 1.5 72 8.5, роли 31, один Х-22, налёт с 900. Оба прогона — один и тот же клиент/движок 278f356aa (API30), одни ресурсы, Metal/offscreen, HORIZON_NO_AUDIO=1, одна команда режиссёра /airdef replay export <имя> best fps=30 size=1280x720 crf=16 sec=24.

До (dc36d67) После (4b013fb; hmod 00f0209)
.hmod SHA-256 2d828aa8… ca3bdd30…
исходный MP4 17 268 968 Б, 403 кадра 17 832 718 Б, 412 кадров
длительность 13,433 с 13,733 с
поток h264 1280×720 30 fps + AAC 48 кГц то же
план «Пуск» кадры 94–151 кадры 94–160
первое освещение центра кадр 101 = 0,233 с кадр 121 = 0,900 с
cold профиля 5 тиков = 0,25 с 20 тиков = 1,00 с

«Первое освещение» — прокси зажигания/факела: первый кадр, где средняя яркость центрального окна 100×120 px (x 590..689, y 300..419) превышает 100/255. До (dc36d67) это кадр 101, через 7 кадров после начала плана «Пуск» (кадр 94) — 0,233 с при cold=5 (0,25 с). После — кадр 121, через 27 кадров — 0,900 с при cold=20 (1,00 с); к кадру 124 окно выходит на устойчивую яркость ≈198. Разница 0,667 с совпадает с разницей cold 15 тиков = 0,75 с в пределах 2–3 кадров (30 fps). Аудиодорожка даёт тот же сдвиг: RMS (окно 50 мс) впервые превышает 0,03 на 3,45 с до и 4,15 с после при старте плана 3,10 с, то есть через 0,35 и 1,05 с; это атака звука, а не кадр зажигания. Полные числа и хэши: issue-129-pair.json.

Оба MP4 лежат в docs/media/cold-launch: до и после, в перекодировке h264 CRF26 для хранения; число кадров, 30 fps, длительность и AAC сохранены. Исходные файлы с CRF16 и их SHA-256 записаны в JSON. Это replay/export, не live-видео: живые кадры в MP4 не писались (--offscreen не даёт окна для сторонней записи, встроенной live-записи у мода нет). Звук сведён офлайн, живое прослушивание не выполнялось.

Парные кадры (слева — до, справа — после), один и тот же кадр фильма:

Общий план перед пуском, кадр 60

0,53 с после начала плана «Пуск»: до уже с факелом, после ещё без него

1,0 с: у «после» факел уже горит (начало — кадр 121)

1,53 с: обе ракеты под тягой

Ограничение приёмки. Агент, выполнивший прогон, не имеет ввода изображений и не может сам оценить композицию, читаемость и красоту кадров. Проверены факт и параметры съёмки, одинаковый старт плана «Пуск» (кадр 94), яркость центра и её сдвиг по времени; парные кадры приложены для человеческого просмотра. Кадры до/после не пиксельно идентичны: это два отдельных живых прогона, камера общего плана движется, листва/трава анимированы, поэтому в предпусковых кадрах остаётся разница в несколько уровней яркости. Совпадают мир, сохранение, сценарий, seed, метод камеры и команда экспорта, а не каждый пиксель. Отдельный очень крупный статичный план выброса у самой ПУ не снят; план «Пуск» — боковой с 46 блоков. Это не полная визуальная приёмка #129.