Читайте в этой статье
Попробуем проанализировать интеллект поведения юнитов. Используется некоторый алгоритм поиска пути на плоскости с весом. Поиск происходит в циклах, во время которых юниты смещаются в клетку с меньшим, для определенности, весом. На каждом шаге, для каждого юнита рассчитывается есть ли для него такая клетка, она должна быть не занята для возможности перемещения. Веса рассчитываются до некоторой опорной точки у донжона. Сам донжон соответственно весит очень много, чтоб юниты не могли находиться в его клетках (кроме понятно сердцевины), ни при каких обстоятельствах.
Чтобы юнит переместился в некоторую клетку, она должна иметь вес меньший веса всех ее соседей. Дополнительно при построении матрицы весов нужно учитывать веса зданий, юнитов а также свободного пространства.
Логично проводить построение от опорной точки донжона к краям. Задавая ей некоторый вес, рассчитываем все остальные клетки по принципу: общий вес клетки = наименьший вес ее соседей + вес части здания-юнита-пустого пространства этой клетки (такой вес назовем дополнительным). При программировании логично иметь матрицу весов замковых построек для удобства. Вес пустой клетки нужен, например, для инициации перемещения за пределами замка.
Дополнительные веса, вероятно, берутся в зависимости от показателя прочности (сколько ударов выдерживает объект против мечника-пикинера и тд) или в таком-же соотношении. Вес пустой клетки допустим 1. Пустые клетки в и снаружи замка по логике имеют одинаковый вес. Башня, из-за неразрушимости обычными войсками, должна иметь значительный вес, например, превосходить максимум из любых разрешимых объектов на всей карте. Все клетки башни равны, для любого типа башен, так как дополнительную разницу вводить не логично. Соответственно вес башни состоит из веса всех ее клеток, и пожалуй все клетки стоит брать целочисленными. Минимальная башня — 2 на 2 итого на 4 клетки должен приходится такой значительный вес.
Общая карта весов обновляется при передвижении юнитов, разрушении ими структур и при разрушении структур баллистами.
Особенности поиска пути
В левом верхнем углу в игре происходит особенно выраженное запаздывание юнитов при передвижении к донжону, отмеченные в руководстве по нападению ряды. В других углах такого не наблюдается. По-видимому, поиск идет сверху вниз, то есть промежуток из-за этого и образуется, ибо в первый цикл смещается только нижняя линия, верхние блочатся как раз ей и предыдущими. Отсюда предполагаем что центр координат для циклов пересчета находится на верхней горизонтальной прямой для типовой схеме типа этой: (или на схеме ниже на линии Х.)
Посмотрим некоторое поведение юнитов:
Здесь видно позицию юнита приходящего первым среди остальных, размещенных вертикальным рядом и идущих на пустой замок без зданий и противодействия кониной. Также логично предположить что вторая координата У, классически находится слева, тобишь центр координат в левом верхнем углу, уточним это в дальнейшем.
На следующем изображении:
видно приоритет У координаты. Юнит отмеченный красной точкой избирает путь отмеченный синим вначале инициируя диагональное перемещения и меняя координату У.
Посмотрим на следующие изображения:
Здесь мы убеждаемся в действительности что расчет по X происходит слева направо и координатная прямая У действительно слева. Если бы первым передвигался юнит у границы, то последующий юнит передвигался бы тоже прямо а не ходил в обход.
На схеме ярко красным обозначен первый юнит, точка его перемещения синяя. Красным и светло синим остальные юниты и их перемещение по диагонали.
Итого имеем следующую иллюстрацию для поля с произвольным замком:
Дополнительные особенности поиска пути
Будем рассматривать различные ситуации, в частности котлы с тыла. Посмотрим пару игровых изображений.
Начальное:
Некоторое промежуточное:
Как видим при поиске пути один пикинер предпочитает идти через котел, другой обходить достаточно длинным окружным путем. Посмотрим схему:
Вес клеток внутри и снаружи замка, как было сказано, скорее всего одинаковый. Путь через котел представлен 4мя клетками. Расстояние между пикинерами 8 клеток.
Итого имеем: (7+2) пустых клеток+стена предпочтительнее 3х пустых и 4х клеток котла, в остальном вес путей схож. Или же вес 6 пустых+ стена < 4 клеток котла.
То есть, как ни странно, котел хоть и весьма слабая структура, но вес имеет достаточно значительный.
Опорные точки. Асимметричность сторон
Опорные точки — точки совпадающие для множества атак.
Так на изображении ниже:
Синяя точка в центральной части донжона является опорной вообще для любых атак. Красные точки являются опорными для множества атак с боков при отсутствии чрезмерной асимметрии уже самого замка. Светло зелеными симметричными линиями относительно белых перпендикуляров и опорных красных точек показаны стандартные возможные диагональные перемещения. Здесь мы замечаем асимметричность боков. Стоит учитывать этот фактор при построении замков — ближе к тылу допустимо уменьшать прочность.
Пример замка с чрезмерной асимметрией для лучшего понимания:
Только стены, башни и пустое пространство. В реальности понятно не встречается, но тем не менее. Светло зеленые пути поверх башен оставлены для наглядности. Синим обозначен путь некоторого юнита с верхней стороны. Таким образом верхняя красная точка для этого пути не является опорной.
Синие опорные точки и диагональные перемещения для тыловых атак:
Несколько слов о рыцарях
Как показывалось юниты могут перемещаться по диагонали, более того рыцари могут проскакивать через «диагональные дыры» даже если замок полностью закрыт.
По видимому такие «диагональные дыры» допустимы только один раз, ибо даже в весьма простых случаях рыцари игнорируют подобные пути.
Возможный вес башни
Общее число клеток поля вне замка равно 4376, внутри замка 52*52 =2704. 4376+2704=7080 всего клеток. После башни наибольший вес, в силу прочности, можно, например, отдать каменной стене — 33 удара мечника. Далее вес башни делаем превосходящим 4376*(вес пустого места)+2704*(вес каменной стены) = 4376+2704*33 =93608. То есть например берем 100000, итого на каждую ячейку башни 2на2 приходится вес 25000. Далее можно считать что все остальные ячейки башен также имеют вес 25000
Реальное поле
Отметим также тот факт, что реальное поле несколько больше для более плавного исчезновения юнитов после боя, например после успешного поджога. Полное поле имеет на пару клеток в каждую сторону больше и выглядит примерно так:
Подтверждение, при подглючивании движка:
Для реального размещение дополнительная зона понятно не доступна.
Советы при построении замков:
- Ров имеет меньшую стоимость нежели каменная стена, используйте лучше стену в некритичных местах при моделировании замков играющих на перемещении юнитов.
Рассинхронизация отчетов:
Рассмотрим интересный баг. В реальности башни остались целы, и сначала показывался отчет с результатом как на скриншоте 1:
После некоторого перерыва, отчет превратился в следующее:
Использовалась карта башни х 1.5, что, по-видимому, не принципиально.
Еще один момент — при пересылке отчета другой игрок сначала видел, что башни оставались целыми, но через какое-то время у него отчет также превратился в отчет с разрушенными башнями. При пересылке этого отчета обратно (после момента превращения), опять же показываются неразрешенные башни. Основное различие в том выживает ли третья волна рыцарей. Когда она выживает она уничтожает оставшиеся катапульты и башни не разрушаются, впрочем мелкие различия видны и раньше этого момента.
Момент подхода третей волны конины, примерно одинаковое время:
Или чуть позже, для наглядности: