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


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

Улучшение ИИ

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

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

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

Possibly...
Код: Выделить всё
typedef int MonstersInTowns[9][2][7];


@as239 see the definition:
Код: Выделить всё
_H3API_ H3TownCreatureTypes& P_TownCreatureTypes(int town)
   {      
      return (*(H3TownCreatureTypes**)(0x47AB00 + 3))[town];      
   }

I declared as reference so you can get a pointer through (H3TownCreatureTypes*)(0x6747B4)
Вернуться к началу

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

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

Сообщение Ben80 » 14 май 2020, 19:31

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


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

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, 20:06

Проверил в HotA. Берёт золото, пробивает копейщиков и красит шахту.

Проверил в SoD. Тоже берёт.

Изображение

Изображение
Последний раз редактировалось AlexSpl 14 май 2020, 20:15, всего редактировалось 2 раз(а).
Вернуться к началу

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

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

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

Хорошо, что берет :)
Я так, из головы нарисовал. Надо будет в СоД проверить. В любом случае, не все там хорошо, с MovementManager.

***

Да, берет. Но если монстр-охранник сильнее героя, то золото не возьмет. Интересные моменты это все. Эх, как представлю, что когда-нибудь разберу код, который за все это отвечает...
Вернуться к началу

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

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

Сообщение wenwell » 14 май 2020, 20:25

Возможно, если вместо этой кучки золота положить пандору без охраны но с наградой в 1 золота то он не будет её подбирать и, следовательно, брать шахту даже если будет стоять без вариантов куда идти. Помню, тестил это дело, комп не брал безопасную пандору с наградой в боевой дух и удачу, либо с очень маленьким количеством золота, из-за чего не мог идти дальше.
Вернуться к началу

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

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

Сообщение as239 » 15 май 2020, 06:18

Где-то читал что ИИ не берет доступные объекты если они в радиусе 1 клетки от охраны.
Т.е. как будто играет с патчем igrika - охрана объектов.

По существам и их типам, получилось вот так:
Код: Выделить всё
struct H3TownCreatureTypes
{
   INT types[2][7];
};
H3TownCreatureTypes& P_TownCreatureTypes(int town)
{
   return (*(H3TownCreatureTypes**)(0x47AB00 + 3))[town];
}
......
H3TownCreatureTypes MonstersInTowns = P_TownCreatureTypes(Town->type);
int CreatureID = MonstersInTowns.types[Grade][Level];
Вернуться к началу

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

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

Сообщение RoseKavalier » 15 май 2020, 11:52

Код: Выделить всё
H3TownCreatureTypes MonstersInTowns = P_TownCreatureTypes(Town->type);

This makes a complete copy of the array... basically:
Код: Выделить всё
INT types[2][7] = P_TownCreatureTypes(Town->type);

when working with return-type as reference you almost always want to add '&' to your variable, similar to how one adds '*' to a pointer variable.
Код: Выделить всё
H3TownCreatureTypes& MonstersInTowns = P_TownCreatureTypes(Town->type);
...
H3TownCreatureTypes* MonstersInTowns = &P_TownCreatureTypes(Town->type);
...
auto& MonstersInTowns = P_TownCreatureTypes(Town->type);
Вернуться к началу

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

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

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

А какая функция вызывается один раз при начале битвы?
Вернуться к началу

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

Посмотрите CombatMan_Init_BatMan (sub_463840) и CombatMan_SetupCombat (sub_4635D0). Обе функции вызываются по одному разу.

Вот ещё одна: CombatMan_00462600_onStart. Любая из них, в зависимости от целей. Первая вообще инициализирует менеджер битвы, а эта её вызывает.
Вернуться к началу

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

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

Сообщение Ben80 » 19 май 2020, 08:45

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

Добавил апдейт этих параметров по адресу 0x4C7F94, больше мусора в указанных полях пока не видел.

Код: Выделить всё
int __stdcall updateAIMagicParams(LoHook* h, HookContext* c)
{
   CALL_1(int, __thiscall, 0x527C40, c->edi);

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

Пред.След.

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

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 1