# Юниты и анимации оригинальной игры

## Связь правил и графики

Для основного профиля установлена цепочка `PRTO → идентификатор Civilopedia → ANIMNAME в Pediaicons → каталог юнита → INI → FLC и звук`. Тип юнита из правил и каталог анимации не обязаны иметь одинаковое имя. Несколько типов могут использовать одну графику.

Например, в правилах есть разные типы поселенцев, а часть из них использует каталог `Settler`. Имя юнита для интерфейса следует брать из профиля правил; имя каталога — из индекса графики. Сопоставление только по русскому названию или порядковому номеру папки ненадёжно.

В [unit-resource-links.json](data/unit-resource-links.json) сохранены связи для всех 413 строк PRTO. Настройки графики найдены для **412 строк**. Аудит с учётом вариантов по эпохам проверил **4 612 прямых ссылок действий и звуков**. Дополнительно проверены **2 145 ссылок на изображения** из блоков значков; отсутствующих файлов среди этих ссылок не найдено. Полнота ссылок не равна проверке корректного отображения каждого ресурса.

## Действия и варианты по эпохам

INI описывает отдельные анимации `DEFAULT`, `RUN`, `ATTACK1`, `DEATH`, `FORTIFY` и другие. Не каждое действие заполнено; отсутствие `WALK`, `VICTORY` или дополнительной атаки не означает неисправность набора. Допустимые действия дополнительно задаются флагами PRTO.

В Pediaicons обнаружено **20 привязок по эпохам**: по четыре для армий, лидеров и трёх типов варваров. Импортер должен разрешать такой ключ по текущей эпохе. Для адмирала найдено различие регистра ключа `Fleet` и `fleet`; анализатор нормализует ключи при сопоставлении, но это не подтверждает чувствительность оригинального движка к регистру.

Звуки INI могут находиться рядом с FLC или ссылаться на соседний каталог через `..`. Это нормальная зависимость ресурсов. Составные AMB требуют дополнительного чтения — см. [аудиоформаты](audio-text-and-formats.md).

## Структура FLC

В архиве 3 963 файла с расширением FLC; заголовки стандартного FLIC прочитаны у **3 962**. Из них у **3 622** число последовательностей в расширенных полях равно восьми, у 61 — одному, у двух — двум, у 277 — нулю. Ноль встречается у обычных FLIC без заполненного расширения направлений и не должен автоматически трактоваться как пустая анимация.

Фактический размер кадра различается. Встречаются 200×240, 140×140, 240×240, 73×73 и другие размеры. У боевого верблюда `WCDefault.flc` кадр — **104×120**, а поля исходного холста указывают 240×240 и смещения внутри него. Единый размер спрайта для всех юнитов приведёт к прыжкам или неправильной привязке к клетке.

У этого примера записано 128 основных кадров: восемь направлений по 16 кадров. Кроме основных кадров, контейнеры содержат дополнительные кадры замыкания последовательностей. Проверка границ выявила восемь дополнительных кадров у всех 3 622 контейнеров с восемью последовательностями. Кадры замыкания не следует автоматически включать в обычный цикл воспроизведения.

Среди подблоков встречаются палитры, полностью сжатые кадры, дельты, несжатые данные, служебные и необычные варианты. Для чтения последующего дельта-кадра требуется предыдущее изображение. Набор независимых PNG нельзя получить простым вырезанием блоков из файла.

## Особенности контейнеров модификации

Первый строгий проход не смог полностью пройти 949 контейнеров. Дальнейший анализ показал повторяющиеся особенности:

- Последний блок палитры иногда имеет служебное значение размера `0xCDCDCDCD`. В 2 217 таких блоках форма данных соответствует полной палитре на 256 цветов, точно ограниченной концом кадра. Для неё добавлена узкая обработка с проверкой структуры.
- В 114 случаях объявленное число подблоков превышает число, помещающееся в границы кадра. Анализатор останавливает чтение на границе и фиксирует предупреждение.
- После такой обработки полностью пройдены границы **3 961 контейнера**. `Art/units/Tactical Nuke/Tact_AttackA.flc` остаётся неразобранным строгой проверкой подблоков.
- Отдельный `ModernInfantryVictoryAlt.flc` не прошёл даже проверку стандартной сигнатуры. Это может быть иной вариант формата или некорректный файл; автоматического исправления не выполнялось.

Эти результаты нельзя описывать как «949 повреждённых анимаций». Они показывают необходимость совместимого декодера и явных диагностик. Пройдены контейнеры, а не все пиксели всех кадров. Журнал предупреждений: [animation-container-warnings.json](data/animation-container-warnings.json); итог: [animation-chunk-summary.json](data/animation-chunk-summary.json).

## Что сохранять при конвертации

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

Палитра несёт служебный смысл. В [открытой реализации конвертации](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7/Textures/PCXToGodot.cs) отдельно обрабатываются прозрачные индексы, тени и окрашиваемая одежда. Для нашего конвертера нужна такая же явная модель, проверенная на конкретных кадрах. Однократная конвертация в обычный RGB закрепит цвет одежды и потеряет часть эффектов.

Для управления действиями подходит собственный автомат состояний поверх Canvas или WebGL. Анимированный WebP удобен для простого непрерывного ролика, но атлас с манифестом лучше подходит для выбора направления, прерывания движения атакой и синхронизации звука. Сам игровой движок из FLC не извлекается.

## Оставшиеся ссылки для ручного решения

`PRTO_Heavy_Frigate` указывает на `Ship_of_the_Line`, тогда как в поставке есть каталог `Ship of the Line`. Это кандидат на явный псевдоним импортера после проверки нужной графики. У всадника `Rider.INI` поле `DEAD` равно точке; его нужно классифицировать как специальное пустое значение или уточнить поведение в игре. Исходные файлы не изменялись.


Дополнение: для `Art/Animations/Cursor/Cursor.flc` найден одинарный кольцевой кадр. При 30 объявленных кадрах физически присутствует 31; последний точно равен первому по индексам и палитре. Декодер проверяет равенство перед удалением и записывает предупреждение; отличающийся лишний кадр по-прежнему отклоняется. Подготовлены исходные 30 кадров выбранного юнита и NTP01/NTP09 по общей модели цветовых слотов и альфа. Проверки включены в `tests/test_cursor_media.py`; Windows-тайминг не считается установленным.

## Дополнение v0.23.0: десант и восстановленные контейнеры

Для наземного десанта используется исходное Build из INI. Однонаправленные атласы имеют одну строку; выбор направления не может выйти за её пределы. Восстановлены23 объявленных кадра DesertParatrooperDrop и120 кадров AirTransDeath без изменения оригиналов: ограниченное кольцо расширенного заголовка и одно строго проверенное вложение F1FA. Все143 кадра сравнены с PNG по пикселям; рекурсивное/неправильно ограниченное вложение отклоняется. Исходные пустые Build у124 и342 остаются пустыми, вывод использует Default. [Подробности, исходные случаи и ограничения](air-transport-and-drops.md).
