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>
20 KiB
Раздельная батарея и холодный пуск
Из исследования в игру
Вместо «всё на одной машине» добавлена конфигурация с отдельными пусковыми и общими РЛС. Высокоуровневое разделение обзорной и огневой РЛС соответствует публичным описаниям системы; это не полная модель конкретной штатной батареи.
| Публично описываемый элемент С-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 был магазин на четыре ракеты при двух нарисованных ТПК;
теперь он согласован с двумя физическими ячейками. При загрузке старой расстановки
его загруженный остаток ограничивается новой вместимостью, как при обычном восстановлении боезапаса.
Что видно при пуске
- Подготовка резервирует конкретную ячейку. Отдельная крышка ТПК открывается; ракета ещё не расходуется.
- При потере цели или неисправности/сворачивании носителя до выброса подготовка отменяется.
- Ракета выбрасывается из фактического muzzle. Боекомплект уменьшается один раз; использованный ТПК остаётся открытым.
- Выброс идёт без двигателя: ракета поднимается и линейно теряет скорость под газовым сопротивлением.
Длительность считается от выброса, а не от открытия крышки: у С-400 (
M48n6) 20 тиков — 1,00 с, у С-500 (M77n6) 24 тика — 1,20 с, у IRIS-T и Тора (IrisT/M9m338) 8 тиков — 0,40 с. В этой фазе нет факела, непрерывного звука двигателя, моторного света и powered smoke; остаётся только отдельный газовый хлопок/клуб. - Зажигание — отдельное событие в текущей точке ракеты, а не у оставленной ПУ: там же появляются
вспышка, факел, звук и запись
MotorIgnition. Оно наступает послеcoldтиков выброса. - После зажигания начинается 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-записи у мода нет). Звук сведён офлайн, живое
прослушивание не выполнялось.
Парные кадры (слева — до, справа — после), один и тот же кадр фильма:
Ограничение приёмки. Агент, выполнивший прогон, не имеет ввода изображений и не может сам оценить композицию, читаемость и красоту кадров. Проверены факт и параметры съёмки, одинаковый старт плана «Пуск» (кадр 94), яркость центра и её сдвиг по времени; парные кадры приложены для человеческого просмотра. Кадры до/после не пиксельно идентичны: это два отдельных живых прогона, камера общего плана движется, листва/трава анимированы, поэтому в предпусковых кадрах остаётся разница в несколько уровней яркости. Совпадают мир, сохранение, сценарий, seed, метод камеры и команда экспорта, а не каждый пиксель. Отдельный очень крупный статичный план выброса у самой ПУ не снят; план «Пуск» — боковой с 46 блоков. Это не полная визуальная приёмка #129.





