Юниты, перемещение, поиск пути и транспорт
Возможности и состояние
C7Engine/C7GameData/UnitPrototype.cs содержит действия BuildCity, Bombard, Hold, Wait, Fortify, Disband, Goto, Explore, Automate, Load, Unload. Работы рабочих представлены отдельными определениями Terraform.
Экземпляр MapUnit хранит остаток движения, здоровье, опыт, направление, автоматизацию, задание, маршрут и идентификатор транспорта. Возможность команды должна зависеть и от прототипа, и от текущего состояния, и от клетки назначения.
Стоимость перемещения
GetMovementCost учитывает знание клетки, переход реки, возможность пользоваться инфраструктурой, воду и город, а также улучшения исходной и целевой клеток. Неразведанная клетка для человека оценивается условной стоимостью 1.
Для инфраструктуры берётся более высокая из двух стоимостей; если у одной стороны подходящего улучшения нет, используется местность. Пересечение реки нарушает дорожное движение до получения возможности мостов.
Остаток хранится как float с epsilon 0.0001. Списание ограничивается снизу нулём. Это позволяет дробные дороги, но требует аккуратной проверки округлений. Для нашей игры можно рассмотреть целые доли общей единицы движения; это наша альтернатива реализации.
A* и нулевая стоимость
C7Engine/AI/Pathing/PathingAlgorithmChooser.cs выбирает A* с отдельной проверкой мирного прохода через промежуточные клетки и силового входа в цель. Для сухопутных юнитов эвристика расстояния делится на 100, чтобы бесплатные железные дороги не проигрывали короткому, но дорогому маршруту.
Комментарий называет это практическим приближением и не обещает строгую допустимость эвристики для всех карт. Наш вариант для доказуемо кратчайшего маршрута с нулевыми рёбрами — Dijkstra либо допустимая нижняя оценка; решение требует измерения производительности.
Источники алгоритма и проверок: C7Engine/AI/Pathing/AStarAlgorithm.cs, EngineTests/AI/Pathing/AStarPathFindingTest.cs, EngineTests/GameData/WheeledMovementRulesTest.cs.
Транспорт
Перевозимые юниты остаются объектами карты и связываются с перевозчиком через loadedOnUnitId. При движении перевозчика перемещаются его пассажиры. Есть посадка, высадка и вместимость.
Ограничения для авианосцев, вертолётов и прямого goto к кораблю обсуждаются в #943. Армии — самостоятельная незавершённая тема #1011, а не автоматически работающий вариант транспорта. Источник действий: C7Engine/C7GameData/MapUnit_Actions.cs.
Для нашего редактора важно задавать способности данными, а UI и AI должны получать одинаковый список разрешённых команд. Проверять маршрут после изменения дипломатии, удаления юнита, разрушения дороги и загрузки сохранения.