# Юниты, перемещение, поиск пути и транспорт

## Возможности и состояние

[C7Engine/C7GameData/UnitPrototype.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/UnitPrototype.cs) содержит действия `BuildCity`, `Bombard`, `Hold`, `Wait`, `Fortify`, `Disband`, `Goto`, `Explore`, `Automate`, `Load`, `Unload`. Работы рабочих представлены отдельными определениями Terraform.

Экземпляр [MapUnit](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/MapUnit.cs) хранит остаток движения, здоровье, опыт, направление, автоматизацию, задание, маршрут и идентификатор транспорта. Возможность команды должна зависеть и от прототипа, и от текущего состояния, и от клетки назначения.

## Стоимость перемещения

[GetMovementCost](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/AIData/TilePath.cs) учитывает знание клетки, переход реки, возможность пользоваться инфраструктурой, воду и город, а также улучшения исходной и целевой клеток. Неразведанная клетка для человека оценивается условной стоимостью 1.

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

Остаток хранится как float с epsilon **0.0001**. Списание ограничивается снизу нулём. Это позволяет дробные дороги, но требует аккуратной проверки округлений. Для нашей игры можно рассмотреть целые доли общей единицы движения; это наша альтернатива реализации.

## A* и нулевая стоимость

[C7Engine/AI/Pathing/PathingAlgorithmChooser.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/Pathing/PathingAlgorithmChooser.cs) выбирает A* с отдельной проверкой мирного прохода через промежуточные клетки и силового входа в цель. Для сухопутных юнитов эвристика расстояния делится на **100**, чтобы бесплатные железные дороги не проигрывали короткому, но дорогому маршруту.

Комментарий называет это практическим приближением и не обещает строгую допустимость эвристики для всех карт. Наш вариант для доказуемо кратчайшего маршрута с нулевыми рёбрами — Dijkstra либо допустимая нижняя оценка; решение требует измерения производительности.

Источники алгоритма и проверок: [C7Engine/AI/Pathing/AStarAlgorithm.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/Pathing/AStarAlgorithm.cs), [EngineTests/AI/Pathing/AStarPathFindingTest.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/AI/Pathing/AStarPathFindingTest.cs), [EngineTests/GameData/WheeledMovementRulesTest.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/EngineTests/GameData/WheeledMovementRulesTest.cs).

## Транспорт

Перевозимые юниты остаются объектами карты и связываются с перевозчиком через `loadedOnUnitId`. При движении перевозчика перемещаются его пассажиры. Есть посадка, высадка и вместимость.

Ограничения для авианосцев, вертолётов и прямого goto к кораблю обсуждаются в [#943](https://github.com/C7-Game/OpenCiv3/issues/943). Армии — самостоятельная [незавершённая тема #1011](https://github.com/C7-Game/OpenCiv3/issues/1011), а не автоматически работающий вариант транспорта. Источник действий: [C7Engine/C7GameData/MapUnit_Actions.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/C7GameData/MapUnit_Actions.cs).

Для нашего редактора важно задавать способности данными, а UI и AI должны получать одинаковый список разрешённых команд. Проверять маршрут после изменения дипломатии, удаления юнита, разрушения дороги и загрузки сохранения.

