Объявления

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

Улучшение ИИ

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 29 май 2021, 11:56

Нашел решение, как в битвах-симуляциях учесть стрелковые башни. При этом используется кастомная глобальная структурка, в которую позже можно будет добавить и заклинания, выученные в битве посредством Орлоглаза (в оригинале это не учитывается). Но пока с Орлоглазом заморачиваться не буду.

***

Поскольку стрелковые башни игнорируют защиту цели, то при желании можно ввести модификатор, линейно зависящий от средней силы существ averagePower = armyStrength / nCreatures

Код: Выделить всё
int __stdcall fix_AI_SimulationBattle_ArrowTowers(LoHook* h, HookContext* c)
{
   _AI_SimulationBattle_Side_* battleSide = (_AI_SimulationBattle_Side_*)c->ecx;
   if(!battleSide->isRestrictedMovement)
   {
      if(simBattleAux.nTurrets == 1)
      {
         c->ebx = 80 * simBattleAux.nBuildings;
      }
      if(simBattleAux.nTurrets == 3)
      {
         c->ebx = 80 * (2 * simBattleAux.nBuildings + 1);
      }
   }

   return EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x42639F, fix_AI_SimulationBattle_ArrowTowers);
Последний раз редактировалось Ben80 04 июн 2021, 07:35, всего редактировалось 1 раз.
Вернуться к началу

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

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

Сообщение as239 » 02 июн 2021, 07:59

На HW igrik написал про следующие ошибки:
1. ошибка в начислении опыта выигравшим героем ИИ (нет +500 опыта за побежденного героя)
2. нет передачи артефактов выигравшему герою
3. все артефакты остаются у поверженного.
4. ошибка, связанная с бонусами Альянса Ангелов в битве против нейтралов
5. ИИ герой может сбежать в битве даже при Оковах Войны- при переполнении просчёта, герою ИИ может добавляться армия в миллионах!! существ после битвы.
6. герой с огромнейшей армией проигрывает малой численности нейтралов.

Было бы полезно иметь плагин(ы) исправляющие их.
Вернуться к началу

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

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

Сообщение Ben80 » 02 июн 2021, 08:27

Большинство игроков используют HD мод, а там настоящие сражения между героями всегда происходят посредством быстрого боя (не путать с битвами-симуляциями). Однако может возникать серьезное различие между результатами реального боя и предварительной оценкой ИИ последствий этого боя. Для оценки же моменты, связанные с Оковами Войны и тд, естественно, не имеют значения.

Я HD мод не использую, поэтому для меня моменты, перечисленные выше, имеют значение.

п.2-3 - это я исправлял (можно найти в теме ASI плагинов для Героев 3), RoseKavalier также знает исправление
п.4 - пока не могу ничего сказать. Вообще, в битвы-симуляции нужно добавлять/отнимать бонусы, связанные с моралью и удачей (естественно, не через сами показатели морали и удачи), учитывать влияние суперартефактов, влияние Плаща Отречения (сейчас учитывается только Сфера Запрещения) и тд. + Бонусы, связанные с навыками Доспехи и Нападение у героев.
по поводу переполнения (не только в битвах-симуляциях, но и в других моментах игры) - никогда не считал это за реальную проблему, так как нужно умудриться собирать такие армии или набирать героями такие показатели, чтобы происходило переполнение. Редко кто любит и играет в такого рода игры.

Для Оков войны добавочный код не сложен:
Код: Выделить всё
int __stdcall AI_checkShacklesOfWar(LoHook* h, HookContext* c)
{
   _Hero_* hero1 = (_Hero_*)(c->eax);
   _Hero_* hero2 = (_Hero_*)(c->ebx);

   if(hero1->DoesWearArtifact(AID_SHACKLES_OF_WAR) || hero2->DoesWearArtifact(AID_SHACKLES_OF_WAR))
   {
      c->return_address = 0x426F50;
      return NO_EXEC_DEFAULT;
   }

    return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x426F33, AI_checkShacklesOfWar);
Вернуться к началу

offlineАватара пользователя
leiz  
Подмастерье
Подмастерье
 
Сообщения: 187
Зарегистрирован: 15 сен 2018, 07:58
Пол: Не указан
Поблагодарили: 95 раз.

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

Сообщение leiz » 02 июн 2021, 09:27

Цитата:
6. герой с огромнейшей армией проигрывает малой численности нейтралов.

Неужели та же ошибка, которая с Единички тянется? AlexSpl ее подробно разобрал в свое время.
Вернуться к началу

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

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

Сообщение Ben80 » 02 июн 2021, 09:31

leiz писал(а):

Неужели та же ошибка, которая с Единички тянется? AlexSpl ее подробно разобрал в свое время.


Суть любого переполнения одинакова - число не помещается в отведенные под него байты.
Вернуться к началу

offlineАватара пользователя
leiz  
Подмастерье
Подмастерье
 
Сообщения: 187
Зарегистрирован: 15 сен 2018, 07:58
Пол: Не указан
Поблагодарили: 95 раз.

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

Сообщение leiz » 02 июн 2021, 09:56

Спасибо, кэп :smile2:
Когда не помещается - всегда плохо.
Вернуться к началу

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

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

Сообщение Ben80 » 02 июн 2021, 11:14

Да, поэтому о баге я бы говорил только в том случае, если большое число вдруг возникает там, где оно возникать не должно (допустим, ошибка в формуле или еще что-то), либо когда под число отведено явно мало места в памяти (например, для value отрядов вместо адекватного int вдруг решили использовать, например, short).

А так, чисто теоретически, много чего в игре может в конце концов переполниться. Допустим, какой-нибудь сердобольный кодер заменит int на long long int, пытаясь исправить "баг". Но тогда какой-нибудь не менее харизматичный игрок запустит игру, скажем на 1000 игровых лет, и все равно что-нибудь переполнит.
Вернуться к началу

offlineАватара пользователя
leiz  
Подмастерье
Подмастерье
 
Сообщения: 187
Зарегистрирован: 15 сен 2018, 07:58
Пол: Не указан
Поблагодарили: 95 раз.

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

Сообщение leiz » 02 июн 2021, 11:24

Ну, пару миллиардов скелетиков несколько труднее получить, чем "жалкие" 32K.
Вернуться к началу

offlinewenwell  
имя: Roman
Новичок
Новичок
 
Сообщения: 15
Зарегистрирован: 29 мар 2019, 09:31
Пол: Мужчина
Поблагодарили: 16 раз.

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

Сообщение wenwell » 02 июн 2021, 13:26

Баг с переполнением может быть довольно неприятен. Хороший пример - самая популярная русскоязычная карта Paragon и переполнение существ у одного из её героев, который по сюжету должен умереть на событии, но при определенном шансе может остаться в живых с 200k+ архимагов =)

Вот ещё немного примеров -
https://www.youtube.com/watch?v=qwtb_tj ... el=wenwell
https://www.youtube.com/watch?v=LIzw-M_ ... ellwenwell
Вернуться к началу

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

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

Сообщение Ben80 » 02 июн 2021, 13:54

wenwell писал(а):

Баг с переполнением может быть довольно неприятен. Хороший пример - самая популярная русскоязычная карта Paragon и переполнение существ у одного из её героев, который по сюжету должен умереть на событии, но при определенном шансе может остаться в живых с 200k+ архимагов =)


Создатели то игры явно не расчитывали на такие количества. Копить их с городских приростов - явно не накопишь. Такие количества можно только нарисовать где-то (в пандорках, в городах как уже нанятых и тд). В чем смысл использования таких количеств ? Неужели это где-то абсолютно необходимо для реализации замысла автора карты ? Мне почему-то кажется, что всегда можно сделать "деноминацию" на 2-3 (и более) нолика - по всей карте, где такое имеет место.
Если такой необходимости нет, то я бы сказал - поделом, если происходит переполнение ))
Последний раз редактировалось Ben80 02 июн 2021, 14:03, всего редактировалось 1 раз.
Вернуться к началу

Пред.След.

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

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

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