# Воздушная разведка и перебазирование — начало5.2, v0.17.0

Первая подключённая часть воздушной системы: общие приказы `AIR_RECON` и `REBASE`, дальность, видимость, города и авианосцы, сохранения и базовая разведка ИИ. Остальные миссии27 исходных воздушных типов — бомбардировка, точечный удар, перехват, ПВО, транспортные выброски и аэродромы — остаются в работе. Полный5.2 и MVP не завершены.

## Доступно в основной партии

В производство включены исходные «Воздушный Шар»285 и «Дирижабль»286: это типы с разведкой/перебазированием без боевой миссии и транспортного груза. Их технологии —150 «Термодинамика» и119 «Полёт»; стоимости и прочие требования берутся непосредственно из профиля. Действуют общие национальные ограничения и устаревание заказа. Остальные боевые самолёты пока не включены в обычное производство.

Авианосец279 и Ударный Авианосец280 используют собственную вместимость и ограничение Only Air: сухопутный груз не принимается. Это доводит текущий морской производственный набор до49 из53 исходных типов. Воздушная часть выбирается в окне транспорта; после выбора появляются две отдельные кнопки с оригинальными32px значками.

Выбор «Воздушная разведка» включает указание цели на карте. Подсказка проверяет дальность, Escape отменяет наведение. Цель может быть неизвестной: проверка не читает её скрытые объекты. Выполненная миссия открывает логический квадрат5×5, оставляет юнит на базе и расходует всё оставшееся движение. Новое исследование местности остаётся в карте знаний после возврата тумана.

Разведка сохраняет текущую видимость на протяжении чужих ходов. Она истекает при настоящем начале следующего хода владельца, а не при любом возврате управления: переговоры посреди чужого хода её не прекращают. Этот случай проверяется и сохранением во время предложения обмена, и реальным отказом в браузере.

«Перебазировать» направляет часть в собственный город либо на собственный авианосец со свободным местом. Расходуется одна исходная единица движения, дальность —шесть рабочих радиусов. Перебазирование использует общую анимацию движения с исходными кадрами; результат и PRNG от её скорости не зависят. Посадка на корабль сохраняет ссылку груза; часть следует за авианосцем и погибает вместе с ним. С палубы можно выполнить разведку или перебазироваться в другой город.

Шар и дирижабль в исходном профиле не имеют Immobile. Они также используют обычные маршруты над сушей и водой с воздушной стоимостью шага, без дорожных скидок и наземной зоны контроля. Самолёты с Immobile не получают такое движение. При входе сухопутной части в клетку с оставленной вражеской авиацией она уничтожается, а не остаётся чужим стеком после занятия базы.

ИИ выбирает цели разведки по своему отфильтрованному представлению мира, пользуется общей проверкой приказа и может заказать исходный разведывательный тип. Уже строящийся разведчик сохраняется; одновременные заказы в других городах учитываются. Дальняя разведка мобильной части использует общие автоматические приказы. Это начальная политика, а не восстановление стратегии Firaxis.

## Оригинальный EXE и выявленные различия

[Доказательства](data/air-native-evidence.json) закрепляют предоставленный EXE SHA256 `c40583d707af7abd9b8568e2ed5a4f117f27a775dca617c8d7b873d76772dd6d`. В Unicorn выполнены505 случаев неизменённых инструкций: полная проверка дальности перебазирования0x5c3570, выбор радиуса перехвата с отдельной ветвью нулевой дальности, арифметика зенитного выстрела и знаменатель городской ПВО. Отдельно проверены18 последовательностей байтов. Полная Windows-партия, поиск целей и PRNG-порядок не исполнялись.

В некоторых справочниках перебазированию Conquests приписывают тройную дальность. Исходная функция этой поставки сравнивает `floor((abs(dx)+abs(dy))/2)` с `6×operationalRange`, учитывая оборачивание координат. Неположительная дальность в этой функции заменяется500. Нативные координаты и обёртка проверены машинными случаями. Наши логические координаты дают ту же метрику. [Общая справка CivFanatics](https://civfanatics.com/civ3/faq/) полезна для терминов, но не подменяет исходные инструкции выбранной поставки.

Нативная воздушная разведка проходит25 координат и устанавливает полное использованное движение. Перебазирование добавляет только один дорожный квант. Следовательно, общая фраза «любая воздушная миссия всегда завершает ход» не используется как правило движка.

В RULE Atlants вероятность обнаружения обычной авиации80%, stealth5%. Для перехвата положительный рабочий радиус делится пополам с усечением и минимумом1; нулевая исходная дальность обходит этот минимум и даёт0. Эти расчёты закреплены, но сам боевой приказ перехвата ещё не подключён.

Для зенитных частей исходный код использует опыт самолёта, не его текущий урон:

`W = planeDefense × (experienceId + 1) × 5`

`chanceToDestroy = airDefense / (W + airDefense)`

При обычном опыте1 множитель10 совпадает с часто приводимым упрощённым описанием. Для других уровней получается другое значение. Отбираются не более четырёх наиболее сильных зенитных частей; точные исключения владельцев и контейнеров ещё требуют контроля. У городской ПВО отдельно проверяются обнаружение и случайный результат с знаменателем `planeDefense + airPower`. Ветка выжившего самолёта возвращается через исследованный выход перехвата; полная диспетчеризация отмены миссии пока не выполнялась. Эти расчёты подготовлены для следующей части5.2 и не объявлены действующей ПВО текущего выпуска.

Адреса сверялись с [таблицей C3X](https://raw.githubusercontent.com/maxpetul/C3X/master/civ_prog_objects.csv), раскладка PRTO/Unit и битов — с [Civ3Conquests.h](https://raw.githubusercontent.com/maxpetul/C3X/master/Civ3Conquests.h). В частности, абсолютное поле юнита0x44 —опыт; Damage находится по другому смещению. Опциональные исправления C3X не принимаются за правила исходного EXE.

## Сохранения и исходники

Схема35 добавляет только `airModel: native-air-missions-v1` к подлинному сохранению опубликованной34. Старые юниты, ресурсы, договоры, карта и PRNG не меняются. Новая необязательная `reconTarget` принадлежит конкретному юниту; при загрузке проверяются тип, флаг миссии, целые координаты, границы и лишние поля. Гибель источника убирает дополнительную видимость. Базирование хранится общим полем груза, без второй конкурирующей модели авианосца.

Модули `engine/air-rules.mjs`, `air.mjs`, `air-ai.mjs` и `ui/air.mjs` разделяют числа, выполнение, политику ИИ и кнопки. Общие сохранения/видимость/команды связывает интегратор. Разведка не получает отдельный прямой доступ к скрытому миру в интерфейсе или ИИ.

Исправлены два выявленных интеграционных дефекта: общий производственный фильтр отвергал даже включённые в каталог воздушные типы; перенос груза добавлял `facing: undefined`, исчезавшее при JSON-сохранении. Поле теперь копируется только при наличии. Функциональные сравнения сохранений не ослаблялись.

## Проверки и открытая работа

17 проверок ядра охватывают машинные эталоны, реальные маски, неизвестную цель, срок разведки, переговоры, полный расход движения, города/авианосцы, вместимость, гибель источника, водное движение, выбор ИИ по знаниям, производство и миграцию34. В браузере проверяются оригинальные значки, наведение, видимость, реальный отказ от обмена, срок действия, посадка/выбор части на палубе, повторная разведка, исходные кадры полёта, заказ шара и точный экспорт/перезагрузка. Итоговый отчёт — [release-0170-validation.json](data/release-0170-validation.json).

Открыты: боевые самолёты и их миссии/анимации, перехват и ПВО как полные действия, точечный удар, аэродромы и воздушные связи/перевозки, специальные контейнеры и базирование на той же клетке, оригинальная геометрия зон перехвата, нулевая дальность разведки пользовательских типов, полная Windows-сверка фаз и отображения. Оригинальные параметры всех27 типов сохранены, но это не означает их функциональную готовность.

Воспроизведение: `PYTHONPATH=/tmp/civ3-native-math-python python3 scripts/run-limited.py -- python3 scripts/verify-air-rules.py`; затем сборка и `node tests/air-missions.test.mjs`. Unicorn используется только в проверочном стенде, браузер от него не зависит. Пакет находится в локальном временном каталоге стенда; системные библиотеки не менялись.

В выпуске0.17.0 привязка ячеек ещё не была подтверждена. В0.17.1 обнаружены и исправлены две неверные пиктограммы: разведка использует ячейку38, перебазирование40 отдельного Conquests-атласа. Исполнены полный исходный перечислитель команд и расчёт вырезок, проверены67 машинных случаев и11 сигнатур. [Точная привязка, происхождение изображений и ограничения](air-command-icons.md). Боевые воздушные действия по-прежнему требуют отдельной реализации.

## Продолжение после v0.17.3

Боевая часть подключена в рабочей модели v0.18.0: [бомбардировки, перехват и ПВО](air-combat-model.md). Описание выше сохраняет границы исторического выпуска0.17.0; текущий статус и исключения указаны в новом документе.
