Объявления
Поздравляем
Roman2211


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

Улучшение ИИ

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
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 » 14 май 2020, 12:08

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

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 » 14 май 2020, 12:12

Цитата:
if (!CurMon) return EXEC_DEFAULT;

Вот здесь, если указатель на монстра равен 0, то выходим из цикла (0x421DE9), а не EXEC_DEFAULT.

Так, за границы массива мы не выйдем, там по 20 отрядов на каждую сторону, но мусор получить можем, если палатка действительно последний стек.
Вернуться к началу

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

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

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

Так тоже вылет:
Код: Выделить всё
   if (!CurMon){
      c->return_address = 0x421DE9;
      return NO_EXEC_DEFAULT;
   }
Вернуться к началу

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 » 14 май 2020, 12:48

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

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

Сообщение RoseKavalier » 14 май 2020, 12:51

as239 писал(а):

Спасибо! То что нужно.
Код: Выделить всё
H3CreatureInformation *creature = &P_Creatures[Level*2+Grade+14*Town->type];

Level(0-6), Grade(0,1)


Suggestion to avoid extra arithmetic and risk of errors:

Код: Выделить всё
H3TownCreatureTypes& townCreatures = P_TownCreatureTypes[Town->type];
...
H3CreatureInformation* creature = &P_Creatures[townCreatures.base[0~6]];
H3CreatureInformation* creature = &P_Creatures[townCreatures.upgrade[0~6]];


Also has handy begin() and end() iterator that hase both Base() and Upgraded() directly...
Вернуться к началу

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

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

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

AlexSpl писал(а):

После вылета нажмите "Не отправлять" и посмотрите крэш-лог. Очень бы помог адрес инструкции, на которой происходит вылет.
Вложения
HD_CRASH_LOG.TXT
(6.53 КБ) Скачиваний: 192
Вернуться к началу

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 » 14 май 2020, 12:56

Всё ясно. Делим на 0 хитпоинтов, а это значит пропускаем в цикл несуществующего монстра. Нужно как-то понять, что мы имеем дело с последним монстром, и в этом случае не продолжать цикл, а выходить из него.

Короче, в c->edi попадает мусор после последнего стека, который рассматривается, как структура H3CombatMonster.
Вернуться к началу

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 » 14 май 2020, 13:05

Предлагаю проверять не по указателю, а по индексу существа (сравнивать индекс текущего отряда с общим кол-вом отрядов героя):
Код: Выделить всё
_int32_ stacks_count[2];//+0x54BC  // 0 - attacker, 1 - defender


У _BattleStack_ есть поле:
Код: Выделить всё
_dword_ index_on_side;    // +248 F8 dd = номер стэка у стороны на поле боя

Вот его и сравнивать.
Последний раз редактировалось AlexSpl 14 май 2020, 13:12, всего редактировалось 1 раз.
Вернуться к началу

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

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

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

AlexSpl писал(а):

Всё ясно. Делим на 0 хитпоинтов, а это значит пропускаем в цикл несуществующего монстра. Нужно как-то понять, что мы имеем дело с последним монстром, и в этом случае не продолжать цикл, а выходить из него.

Короче, в c->edi попадает мусор после последнего стека, который рассматривается, как структура H3CombatMonster.

Да действительно похоже так и есть.
Сделал вот так, тупо считая, что палатка всегда последний стек:
Код: Выделить всё
   if (ItsWarMachine(CurMon->type))
   {
      c->return_address = 0x421DE9;
      return NO_EXEC_DEFAULT;


Вылета нет и поведение ИИ стало гораздо лучше.
Было:
 
Изображение

Стало:
 
Изображение
Вернуться к началу

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 » 14 май 2020, 13:15

Почти как человек сыграл.

Цитата:
Сделал вот так, тупо считая, что палатка всегда последний стек:

Кстати, да. Где-то читал, что боевые машины в самом конце идут, а поэтому код верный (как только встречаем боевую машину, прерываем цикл, т.к. если и есть какие-то стеки после неё, то они тоже боевые машины).

Хотя... Как насчёт клонов и призванных элементалей? Так что проверку всё же нужно делать.
Вернуться к началу

Пред.След.

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

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

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

cron