# Аэродромы вне городов: проверка исходных правил

Этап 5.2, эталон подготовлен после v0.21.0. Это исследование предоставленного Atlants EXE и контрольные случаи для реализации. Подключённая в v0.22.0 часть и оставшиеся ограничения описаны отдельно: [полевые аэродромы в движке](airfields-and-worker-bases.md). Городские аэропорты и воздушная торговля остаются самостоятельными системами.

Источник — `Conquests/Civ3Conquests.exe`, SHA-256 `c40583d707af7abd9b8568e2ed5a4f117f27a775dca617c8d7b873d76772dd6d`; профиль `atlants2-827be8b3f7aab140`. Исходная Civilopedia находится в `Original Sources/CIV3ATL2/Text/Civilopedia.txt`, раздел `#TFRM_Airfield`. Справка полезна для назначения действия, но не заменяет проверки машинного кода.

## Подтверждённые условия

| Система | Результат проверки |
| --- | --- |
| Исходная запись | TFRM9 «Аэродром», технология119, `work_required_raw=1` |
| Кнопка рабочего | Команда `0x20002000`, категория2/индекс13, ячейка33 оригинального Conquests NormButtons, область `[32,128,32,32]` |
| Остаток движения | Достаточно положительного остатка, в том числе после частичного перемещения; нужен собственный флаг действия типа |
| Территория | Только своя или нейтральная; чужая отвергается до общих проверок, право прохода этого не меняет |
| Местность и требования | Проверяется `Allow_Airfields`, отсутствие города, требуемая технология и доступ к указанным в TFRM ресурсам |
| Существующая база | Второй аэродром на той же клетке недопустим |
| Работа | Состояние юнита `0xb` направляется в обычный расчёт прогресса TFRM9; завершение создаёт базу и расходует рабочего |
| Замена улучшений | Конструктор задания задаёт маску удаления `0xc000001c`; перед созданием выполняется удаление шахты, орошения, форта и других полевых сооружений из маски. Дорога и железная дорога в неё не входят |
| Отправка | Аэродром имеет собственный признак использования. Отсутствующий объект или уже использованный слот запрещают отправку |
| Приём | Свой аэродром принимается как цель, в том числе с уже использованным отправочным слотом; чужой не принимается этой веткой |
| Передача базы | Новый владелец записывается без сброса использованного слота |
| Переход территории | Исследованная ветка передаёт базу владельцу с требуемой технологией, иначе вызывает уничтожение |
| Сброс слота | Отдельная исходная функция обнуляет признак; цикл лидера вызывает её для его аэродромов |

Важное уточнение: функция завершения выглядит как разовое создание с расходованием рабочего, но это **не доказательство мгновенного строительства при нажатии кнопки**. Диспетчер приказов вызывает общий механизм накопления работы. При реализации необходимо сохранить этот путь, проверить точный момент первого начисления, поправку местности и совместную работу; не подменять их мгновенным специальным приказом.

Справка формулирует условие клетки как «пустая или с дорогой/железной дорогой». Машинный предикат разрешает существующие шахту и орошение; общий код предусматривает подтверждение замены. Проверка запускается без окон Windows по исходной ветке без диалога, поэтому точный текст и порядок подтверждений не объявлены проверенными.

## Воспроизводимые доказательства

`scripts/verify-airfields.py` исполняет неизменённые инструкции x86 через Unicorn. Получены **370 случаев**:336 размещений,8 сочетаний флага действия и движения,4 источника переброски,12 целей,2 ветки передачи территории, а также отдельные случаи таблицы работ, диспетчеризации, завершения, удаления старых улучшений, инициализации базы, переноса и сброса слота, привязки команды.

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

Результаты и точные диапазоны/байты: [airfield-native-evidence.json](data/airfield-native-evidence.json). Тест `tests/test_airfield_evidence.py` сверяет13 диапазонов и7 дополнительных сигнатур с предоставленным EXE, а также полноту набора случаев. Семь проверок нового эталона, прежней авиации и сборки библиотеки прошли.

```bash
PYTHONPATH=/tmp/civ3-native-math-python python3 scripts/run-limited.py -- python3 scripts/verify-airfields.py
python3 scripts/run-limited.py -- python3 -m unittest tests.test_airfield_evidence
```

## Границы исходного эталона

- Полный путь накопления TFRM9: календарь, местность, несколько рабочих, какой из них расходуется при завершении.
- Полное окружение территориальной передачи: потеря границ до нейтральной клетки, прямой захват наземной частью, судьба находящихся самолётов.
- Базирование самолётов, предел вместимости, выбор целей ИИ, бомбардировка и разрушение базы.
- Исходные изображения: два кадра из `Civ3PTW/Art/Terrain/x_airfields and detect.PCX` и отдельный атлас теней; точный выбор кадра ещё не подтверждён.
- Общие команды движка, данные владельца/слота, миграция, редактор и интерфейс включены в0.22.0; их собственные проверки перечислены в статье реализации.
- Результаты игровых и публичных браузерных действий фиксируются отдельно в отчёте0.22.0.

Воздушная торговля ресурсами не следует из возможности переброски или базирования: её действующие городские флаги описаны отдельно в [воздушной ресурсной сети](air-trade-network.md). Не добавлять торговое соединение к полевому аэродрому по аналогии с аэропортом без отдельного доказательства.

## Дополнение v0.22.3: культурная эвакуация

Исследована ветка0x5d3d60–0x5d3f60 вместе с полными функциями ближайшего города0x56cfb0, разделений осей0x441f50/0x4379f0 и переноса0x5c6ed0.140 случаев подтверждают перенос воздушных частей в город прежнего владельца до передачи или разрушения базы, отсутствие требований аэропорта/дальности, удаление при отсутствии города и добавление расхода одного очка движения. Исходные байты и точные границы контролируемых зависимостей — [новый эталон](data/airfield-evacuation-native-evidence.json). Старый набор370 случаев остаётся исторически ограниченным и не расширяется задним числом.
