Итак, как я ранее и говорил начинать реализацию "встреч героев ИИ" в любом случае придётся с расчёта расстояния между героями.
Ситуация следующая. Реализовывать алгоритм поиска оптимального пути на ERM с нуля достаточно сложно. Ситуация осложняется отсутствием переменных типа массивов в ERM. Но данный алгоритм уже реализован в базовом ИИ игре, но как извлечь его, отделив от перемещения - я не знаю, да и вряд ли кто-то здесь мне поможет это сделать.
В связи с этим возникает следующая идея. А что, если не пытаться отделить расчёт длины пути от самого хода героя ИИ. Алгоритм ниже не предусматривает встреч героев в радиусе больше, чем ход одного героя, так как на мой вопрос выше ещё не дан ответ. Итак:
1) В начале хода каждого героя ИИ фиксируем клетку на карте его местоположения. Проверяем положение других героев этого же игрока. Находим линейное расстояние до них в MP, как если бы у героя была способность "полёт" на глобальной карте. Сразу же вопрос, в ERM же нет корня, а как тогда вычислить гипотенузу?
2) Для тех героев, до которых герой мог бы добраться по прямой за свой ход, проверяется необходимость встречи по формуле.
3) Для каждого из героев, встреча с которым была бы необходима при движении по прямой производится проверка реальной достижимости встречи за ход, исходя из ландшафта, почв и. т. д. Для этого:
3.1) Картинка героя (на лошади с флагом), являющегося инициатором встречи, на глобальной карте заменяется невидимой картинкой.
3.2) Точка на карте, где расположен герой, являющийся целью встречи, назначается максимально приоритетной целью для героя-инициатора встречи.
3.3) После окончания хода или при достижении героя-цели либо при попытке совершения им по ходу движения какого-либо другого действия, кроме перемещения или встречи с целевым героем (действие отменяется), герой-инициатор возвращается на исходную позицию (как в начале дня) с возвращением ему полного запаса хода, которое у него было в начале дня. В случае достижения героя-цели запоминается реальное количество очков хода, затраченное до встречи.
3.4) Данный цикл повторяется для всех героев-целей, с которыми была бы необходима встреча, если бы герой-инициатор двигался по прямой без штрафов.
3.5) Картинка героя меняется обратно на нормальную.
3.6) Для тех героев-целей, которые были достигнуты, заново рассчитывается необходимость встречи, исходя уже из реально затраченных очков перемещения.
3.7) Заново назначается оптимальный герой-цель для встречи с максимальной значимостью этой встречи.
Данный алгоритм можно упростить в пользу большей линейности отказа от выбора оптимального и сортировок, что в рамках ERM затруднительно. Таким образом все пункты будут выполняться линейно по очереди для каждого героя-цели. При этом первый же герой-цель, целесообразность движения к которому подтверждена назначается целевой точкой для реального движения.