Quote:В чём смысл её ставить, если ИИ, как я уже сказал, не заходит в неё?
Я думаю, нужно поставить хук в
528553. В
еах будет лежать тип объекта - если это таверна, и у текущего игрока (указатель на структуру в
69CCFC, смещение - 1 байт, размер - 1 байт) меньше 8 героев, то в качестве возвращаемого значения (
еах) можно записать:
ценность армии лучшего из двух доступных героев (считается с помощью функции 44A950) + какой-то бонус за специфику карты (отсутствие городов) и за параметры героя - ценность 2500 золотых для текущего игрока (указатель на структуру в 69CCFC, смещение - 0x128, по одному double на каждый ресурс - соответственно, ещё + 0x30, чтобы дойти до ценности золота. Эту ценность нужно умножить на 2500, это число сохранено в самой игре в дробном виде как 8 байт по адресу 6405C0). В качестве адреса возврата в код подойдёт
5285A1.
Скорее всего, этого будет достаточно для того, чтобы ИИ начал воспринимать таверны. В функции, где я предлагаю поставить хук, рассчитываются ценности объектов на карте, и таверна просто не учтена (результат всегда 0). Если он будет положительным, ИИ будет посещать объект.
Quote:Даже непонятно, что произойдёт, если ИИ её всё-таки посетит - ничего или он всё же наймёт героя.
Судя по коду, ничего - там стоит проверка, запрещающая ИИ нанимать героев. Адрес проверки:
4A9D5A. Думаю, её трогать не стоит, так как после меняются параметры мыши и вызывается диалог найма героев. Для ИИ можно просто снимать деньги (если они есть) и вызывать функцию создания героя поверх таверны -
4D7B00. Параметров 3: указатель на структуру нанимаемого героя, номер игрока и координаты, сохраненные в виде 4 байт. Чтобы отловить посещение таверны, можно поставить хук по адресу проверки и брать координаты из (ebp + 0x10). Является ли игрок ИИ, можно прочитать из регистра al.