Объявления

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

Улучшение ИИ

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

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

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

RoseKavalier писал(а):

reinterpret_cast<DWORD>


Code of RoseKavalier becomes more and more complex. We make just hacking, not complete programming project. Who need
all those "protected", "public" and so on (object properties) ? In hacking all properties are public ))

In principle we could use just C, not C++... Though, to tell the truth I have used sometimes some C++ abilities. For example, passing an array by reference to procedures.

P.S. Thank you for H3API.
Вернуться к началу

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

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

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

AlexSpl писал(а):

А когда-то в Паскале был такой тип как Extended... Целых 10 байт! До сих пор думал, что long double есть аналог Extended, а тут такой облом.


In C and related programming languages, long double refers to a floating-point data type that is often more precise than double-precision though the language standard only requires it to be at least as precise as double. As with C's other floating-point types, it may not necessarily map to an IEEE format.
...
On the x86 architecture, most C compilers implement long double as the 80-bit extended precision type supported by x86 hardware (sometimes stored as 12 or 16 bytes to maintain data structure alignment), as specified in the C99 / C11 standards (IEC 60559 floating-point arithmetic (Annex F)). An exception is Microsoft Visual C++ for x86, which makes long double a synonym for double.[2] The Intel C++ compiler on Microsoft Windows supports extended precision, but requires the /Qlong‑double switch for long double to correspond to the hardware's extended precision format.
Вернуться к началу

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

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

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

Я думаю, что вполне мог бы многие свои простые ЛоХуки трансформировать в Asm хуки - скорость работы у них должна быть в несколько раз выше (потому что дополнительных инструкций-процессорных команд почти нет).
Вернуться к началу

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

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

Сообщение as239 » 08 май 2020, 08:07

Сделал, чтобы ИИ тратил ману только против героев, по методу Ben80, через обнуление маны герою ИИ перед началом битвы, а потом через восстановление.
Однако, когда ИИ решает кого-то атаковать, он учитывает свою полную ману.
Чтобы здесь не было проблем сделал этот хук:
Код: Выделить всё
void __stdcall AI_VirtualBattle_Main(HiHook* h, H3AIQuickBattle *Atacker, int a2, H3AIQuickBattle *Defenfer){
   if (Atacker && Atacker->hero && Defenfer && !Defenfer->hero) Atacker->spellPoints = 0;

   FASTCALL_3(void, h->GetDefaultFunc(), Atacker, a2, Defenfer);
}
...
_PI->WriteHiHook(0x426BC0, SPLICE_, EXTENDED_, FASTCALL_, AI_VirtualBattle_Main);

Верно ли выбрана функция и все ли правильно с логикой?
Технически и на глаз, вроде все ок.
Последний раз редактировалось as239 08 май 2020, 08:10, всего редактировалось 2 раз(а).
Вернуться к началу

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

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

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

Есть ли идеи, как можно сделать следующий момент:
- если ИИ видит что у него возможной маны в 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 » 08 май 2020, 08:10

Весь смысл же во времени, а не в скорости. Можно и вручную патчить - ещё быстрее (работать) будет (я так в TE делал). Но это долго и неудобно.
Вернуться к началу

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

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

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

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

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

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

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

as239 писал(а):

Есть ли идеи, как можно сделать следующий момент:
- если ИИ видит что у него возможной маны в 2 раза больше чем есть, то он идет срочно в город с ГМ и пополняет ее там.


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

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

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

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

AlexSpl писал(а):

Весь смысл же во времени, а не в скорости. Можно и вручную патчить - ещё быстрее (работать) будет (я так в TE делал). Но это долго и неудобно.


AlexSpl, зацени новую Дипломатию. Без Asm хуков это трудно было бы сделать.

Код: Выделить всё
double double_6 = 6.0;
double double_2 = 2.0;
...
         // Новая Дипломатия
         _PI->WriteByte(0x4A7497, 0xC);
         _PI->WriteDword(0x4A747E+2, (int)(&double_6));
         _PI->WriteDword(0x4A74A0+2, (int)(&double_2));
         // Новая формула для расчета PowerFactor
         _PI->WriteAsmHook(0x4A74AD, "fld dword ptr [ebp+0xC];\
                              fadd st, st;\
                              fadd dword ptr [ebp+0xC];\
                              fsub dword ptr ds:[0x63B9E4];\
                              jmp 0x4A74B8", 0);
         // Только PowerFactor влияет на решение монстров драться или нет
         _PI->WriteHexPatch(0x4A752A, "90 90 90 90");
         // RM Hint Diplomacy
         _PI->WriteByte(0x4A7344, 0xC);
         _PI->WriteDword(0x4A7336+2, (int)(&double_6));
         _PI->WriteDword(0x4A734F+2, (int)(&double_2));
         _PI->WriteAsmHook(0x4A735C, "fld dword ptr [ebp+8];\
                              fadd st, st;\
                              fadd dword ptr [ebp+8];\
                              fsub dword ptr ds:[0x63B9E4];\
                              jmp 0x4A7367", 0);
         // Только PowerFactor влияет на решение монстров драться или нет
         _PI->WriteHexPatch(0x41721B, "90 90");
         _PI->WriteHexPatch(0x41721F, "90 90");

Вернуться к началу

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 » 08 май 2020, 09:21

На предыдущей странице как раз писал, как можно без них обойтись.

Например, этот хук

Код: Выделить всё
_PI->WriteAsmHook(0x4A74AD, "fld dword ptr [ebp+0xC];\
                fadd st, st;\
                fadd dword ptr [ebp+0xC];\
                fsub dword ptr ds:[0x63B9E4];\
                jmp 0x4A74B8", 0);

Можно переписать через лоухук (не проверял, но примерно так):

Код: Выделить всё
int __stdcall diplo(LoHook* h, HookContext* h)
{
   c->eax = (int)(3 * *(float*)(c->ebp + 0xC) - 6.0f);
   
   c->return_address = 0x4A74EE;
   return NO_EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x4A74AD, diplo);
Вернуться к началу

Пред.След.

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

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

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