Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Улучшение ИИ

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 04 май 2020, 14:27

AlexSpl писал(а):

А так?

Код: Выделить всё
int __stdcall LevelUP(HiHook* h, _Hero_* hero, int a1, int a2)
{

   return CALL_3(int, __fastcall, h->GetDefaultFunc(), hero, a1, a2);
   
}

...

_PI->WriteHiHook(0x52C0B0, SPLICE_, EXTENDED_, FASTCALL_, LevelUP);


Это, походу, __thiscall, заменённый компилятором на __fastcall. Такое бывает.

Пропустил героя.


Все равно вылет :(
Код: Выделить всё
int __stdcall LevelUP(HiHook* h, int hero, int a1, int a2)
{

   return FASTCALL_3(int, h->GetDefaultFunc(), hero, a1, a2);
}

_PI->WriteHiHook(0x52C0B0, SPLICE_, EXTENDED_, FASTCALL_, LevelUP);

Первый раз такая ерунда с хайхуком, всегда без проблем ставятся.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Улучшение ИИ

Сообщение AlexSpl » 04 май 2020, 14:36

Да, интересный случай. Ещё интересно, почему перед вызовом функции в стек попадает три dword'а (герой и первый навык передаются через ecx и edx соответственно), а функция убирает только за двумя (retn 8) :smile1:
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Улучшение ИИ

Сообщение Ben80 » 04 май 2020, 15:37

Как почему ? Это же userpurge. Я так понимаю, в игре есть структуры/переменные, которые не являются глобальными, но используются на какую-то достаточно большую глубину вложенности вызовов.
Когда я пишу программы, у меня иногда бывает, что какая-то переменная передается все дальше и дальше. Возможно, тут что-то вроде этого.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Улучшение ИИ

Сообщение AlexSpl » 04 май 2020, 15:40

Как я и предполагал, функция Hero::AIGetSecSkill() - это __thiscall, оптимизированный до __fastcall'a. Выступает аргументом другой функции: Hero::ApplySecSkill(hero, Hero::AIGetSecSkill(hero, leftSkill, rightSkill, a), a2), т.е. аргумент a2 убирает со стека Hero::ApplySecSkill(), а не AIGetSecSkill().

Так что, пробуйте __fastcall с четырьмя аргументами. Последний (a) можно не трогать (может быть 0 или 1).
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 04 май 2020, 16:02

AlexSpl писал(а):

Как я и предполагал, функция Hero::AIGetSecSkill() - это __thiscall, оптимизированный до __fastcall'a. Выступает аргументом другой функции: Hero::ApplySecSkill(hero, Hero::AIGetSecSkill(hero, leftSkill, rightSkill, a), a2), т.е. аргумент a2 убирает со стека Hero::ApplySecSkill(), а не AIGetSecSkill().

Так что, пробуйте __fastcall с четырьмя аргументами. Последний (a) можно не трогать (может быть 0 или 1).

Спасибо! Сейчас не вылетает.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 04 май 2020, 16:23

Алгоритм "правильной" раскачки сделал.
Вот такие теперь красавцы и красавицы получаются:
Изображение

А какая функция добавляет опыт ИИ после битвы?
Хочу увеличить его вдвое.
Хоть правка по сундукам заметно помогла, в середине 2-й недели ИИ имеет самого мощного героя в среднем 5-7 уровня.
Нужно побольше. Да и в принципе, это логично - бои ИИ даются гораздо тяжелее чем человеку, соответственно и бонус он должен получать больший.
Последний раз редактировалось as239 04 май 2020, 17:06, всего редактировалось 3 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Улучшение ИИ

Сообщение AlexSpl » 04 май 2020, 16:34

Посмотрите, откуда вызывается функция GiveExperience (sub_4E3620) - всего 14 мест - и выберите те, где хотите модифицировать опыт компа. А лучше сразу модифицировать весь получаемый им опыт прямо в этой функции. Отличить компа от человека поможет функция из homm3.h или H3API.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: Улучшение ИИ

Сообщение as239 » 04 май 2020, 17:14

AlexSpl писал(а):

Посмотрите, откуда вызывается функция GiveExperience (sub_4E3620) - всего 14 мест - и выберите те, где хотите модифицировать опыт компа. А лучше сразу модифицировать весь получаемый им опыт прямо в этой функции. Отличить компа от человека поможет функция из homm3.h или H3API.

В самой функции, конечно, лучший вариант, и отличить ИИ не проблема.
Проблема в том чтобы понять что это опыт полученный от битвы, удваивать прям весь полученный опыт - не очень.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Улучшение ИИ

Сообщение AlexSpl » 04 май 2020, 17:37

Битва героя AI против героя AI/нейтралов - 426F81h;
Битва героя AI против героя игрока - 477096h.

Может, есть и другие случаи. Судя по всему, здесь тоже опыт за битву - 477278h.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Улучшение ИИ

Сообщение AlexSpl » 05 май 2020, 10:50

Вот Ghidra успешно справилась с определением соглашения о вызове и кол-ва параметров функции sub_52C0B0:

Код: Выделить всё
int __fastcall FUN_0052c0b0(int param_1,int param_2,int param_1_00,undefined4 param_2_00)

{
  char cVar1;
  int iVar2;
  int iVar3;
  int iVar4;
 
  cVar1 = *(char *)(param_1 + 0xc9 + param_1_00);
  iVar4 = param_1_00;
  if ('\0' < *(char *)(param_1 + 0xc9 + param_2) == '\0' < cVar1) {
    iVar2 = FUN_00524b70(param_2_00);
    iVar3 = FUN_00524b70(param_2_00);
    if (iVar3 <= iVar2) {
      return param_2;
    }
  }
  else {
    if (cVar1 == '\0') {
      iVar4 = param_2;
      param_2 = param_1_00;
    }
    cVar1 = FUN_005252b0(param_2_00);
    if (cVar1 != '\0') {
      return param_2;
    }
  }
  return iVar4;
}
Последний раз редактировалось AlexSpl 05 май 2020, 10:52, всего редактировалось 1 раз.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5