Объявления

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

Улучшение ИИ

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 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)
Поблагодарили: 2184 раз.

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

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

Цитата:
Хотелось бы чтобы он мог уметь следующее:
1. Приоритет прокачки ИИ героя всегда следующий - земля (1,2,3), воздух (1,2,3), атака (1,2,3), защита (1,2,3), оригинальный алгоритм

Хайхук на функцию 52C0B0. У неё два аргумента (левый и правый предлагаемые компу навыки). Если среди предлагаемых навыков есть земля (1,2,3), воздух (1,2,3), атака (1,2,3), защита (1,2,3), возвращаем навык в соответствии с нашими приоритетами. Если нет, выполняем оригинальную функцию GetDefaultFunc().
Вернуться к началу

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

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

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

AlexSpl писал(а):

Цитата:
Хотелось бы чтобы он мог уметь следующее:
1. Приоритет прокачки ИИ героя всегда следующий - земля (1,2,3), воздух (1,2,3), атака (1,2,3), защита (1,2,3), оригинальный алгоритм

Хайхук на функцию 52C0B0. У неё два аргумента (левый и правый предлагаемые компу навыки). Если среди предлагаемых навыков есть земля (1,2,3), воздух (1,2,3), атака (1,2,3), защита (1,2,3), возвращаем навык в соответствии с нашими приоритетами. Если нет, выполняем оригинальную функцию GetDefaultFunc().


То что нужно, еще бы научить ИИ всегда брать опыт из сундуков.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 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)
Поблагодарили: 2184 раз.

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

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

Цитата:
То что нужно, еще бы научить ИИ всегда брать опыт из сундуков.

Это здесь:

Код: Выделить всё
_BOOL1 __fastcall sub_005284C0(int a1, int a2, signed int a3, signed int a4)
{
  signed int v4; // ebx
  float v6; // [esp+14h] [ebp+Ch]

  v6 = (long double)a4;
  v4 = (signed __int64)(v6 * *(float *)(a1 + 265));
  return (signed int)(signed __int64)((double)a3 * GetHeroOwner((_Hero_ *)a1)->ResImportance[a2]) > v4;
}

Если вовращать 0 (false), ИИ будет брать опыт. Но есть подозрение, что это плохое решение, т.к. функция вызывается не только для сундуков.

Лучше выпилить её вызов из этой функции:

Код: Выделить всё
char __thiscall sub_004A60B0(void *this, int Hero, int SType1, char a3)
{
  void *v4; // ebx
  int v5; // edi
  int v6; // esi
  int v7; // eax
  float SType1a; // [esp+18h] [ebp+Ch]

  v4 = this;
  v5 = SType1;
  SType1a = (long double)(SType1 - 500);
  v6 = (signed __int64)(GetLearningPower(Hero) * SType1a);
  if ( a3 )
  {
    sub_00415CC0((int)v4, 0, -1);
    RedrawAdvInfoPart((int)v4, 0, 1, 1);
    MessageDialog(*(char **)(*(_DWORD *)(::this.field_60 + 32) + 584), 7, -1, -1, 6, v5, 17, v6, 1, 0, -1, 0);
    v7 = pHeroWindowManager->ResultItemId;
    if ( v7 != 30725 )
    {
      if ( v7 == 30729 )
        return sub_004E3870(Hero, 6, v5);
      return GiveExperience((_Hero_ *)Hero, v6, 0, 1);
    }
    return sub_004E3870(Hero, 6, v5);
  }
  if ( sub_005284C0(Hero, 6, v5, v6) )
    return sub_004E3870(Hero, 6, v5);
  return GiveExperience((_Hero_ *)Hero, v6, 0, 1);
}

Т.е. убрать строчку

Код: Выделить всё
if ( sub_005284C0(Hero, 6, v5, v6) )
    return sub_004E3870(Hero, 6, v5);
Вернуться к началу

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

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

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

Протестировал ИИ с большим бонусом по ресурсам и золоту.
Отсройка стала гораздо лучше - он идет в армию.
Но почему не всегда скупает ее всю, хотя деньги есть:
 
Изображение

Можно ли его заставить активнее скупать армию?
ОБНОВЛЕНО:
Хотя может быть это и не так плохо - у него остается армия для защиты города в случае чего, ведь если он увидит угрозу, он же скупит ее сразу?

Я пока буду делать прокачку и сундуки.

Кстати мы присутствуем при историческом моменте!
Наверное впервые в истории, ИИ взял мини улик на 123!
 
Изображение
Последний раз редактировалось as239 04 май 2020, 10:58, всего редактировалось 1 раз.
Вернуться к началу

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

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

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

А на какой адрес нужно поставить хук чтобы изменять значения этих адресов 0x66052C, 0x660530, 0x660534, 0x660538,0x66053C, опционально?
Т.е. если это мой шаблон я меняю значения на 100, а если другой то оставляю как есть.
Нужно учитывать что в рамкой одного запуска, игрок может запустить вначале шаблон для ИИ, а затем уже другой.

И нужно ли менять 0x66052C, там стоит 8, больше героев не нужно.
И что означают последующие значения?
Вернуться к началу

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

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

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

А в 0x660530 стоит 11 героев. Тебе это ни о чем не говорит ? )) Это общий лимит героев для всех игроков.
Я менял значение на 100 исходя из того, чтобы ИИ в мультплеере могли нанимать героев как обычно они это делают в синглплеере - столько, сколько им обычно нужно. Поскольку в мультике 2 человека скупают по 8 героев, на долю ИИ ничего не остается, кроме 1 героя со старта. Вот поэтому я и правил это.

А в твоем случае возможно и не стоит ставить 100. Вообще не менять ничего. Зато у ИИ всегда будет герой со всем войском, а не несколько героев с частью войска. Правда, если карта большая, то единственные ИИ герои обязательно застрянут где-нибудь на окраинах, собирая ресурсы, и интересной игры с ними не будет.
Вернуться к началу

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

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

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

Сделал получение только опыта из сундуков, но почему то не работает:
Код: Выделить всё
_LHF_(GetExpFromChest){

   c->return_address = 0x4A6174;
   return NO_EXEC_DEFAULT;
}
   
_PI->WriteLoHook(0x4A614F,GetExpFromChest);

Вижу что ИИ берет сундук, делаю сейв, смотрю а у него 62 опыта.
Последний раз редактировалось as239 04 май 2020, 11:46, всего редактировалось 2 раз(а).
Вернуться к началу

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

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

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

Ben80 писал(а):

А в 0x660530 стоит 11 героев. Тебе это ни о чем не говорит ? )) Это общий лимит героев для всех игроков.
Я менял значение на 100 исходя из того, чтобы ИИ в мультплеере могли нанимать героев как обычно они это делают в синглплеере - столько, сколько им обычно нужно. Поскольку в мультике 2 человека скупают по 8 героев, на долю ИИ ничего не остается, кроме 1 героя со старта. Вот поэтому я и правил это.

А в твоем случае возможно и не стоит ставить 100. Вообще не менять ничего. Зато у ИИ всегда будет герой со всем войском, а не несколько героев с частью войска. Правда, если карта большая, то единственные ИИ герои обязательно застрянут где-нибудь на окраинах, собирая ресурсы, и интересной игры с ними не будет.

Понял спасибо. Поставил пока все значения по 100, в среднем ИИ ко второй неделе нанимает 6 героев, вместо 4, мне это нравится.
Есть минус, конечно, в разделении войск.
Но большой плюс в том, что они будут держать игрока в напряжении т.к. могу отбить сразу несколько городов и игроку придется думать как их защищать.
Вернуться к началу

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

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

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

as239 писал(а):

в среднем ИИ ко второй неделе нанимает 6 героев, вместо 4, мне это нравится.


Это, наверно, из-за того, что бабок много. Если дать денег и ресурсов как обычно и поставить лимиты героев в 100, то по 6 героев ко 2-й неделе он вряд ли будет нанимать.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5584
Зарегистрирован: 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)
Поблагодарили: 2184 раз.

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

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

Цитата:
Вижу что ИИ берет сундук, делаю сейв, смотрю а у него 62 опыта.

Может, в сундуке арт был?
Вернуться к началу

Пред.След.

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

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

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