Обновлено:

На этой странице

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

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

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 должны получать одинаковый список разрешённых команд. Проверять маршрут после изменения дипломатии, удаления юнита, разрушения дороги и загрузки сохранения.