-
Ben80
имя: Сергей
- Эксперт
-
- Сообщения: 1318
- Зарегистрирован: 18 июн 2017, 06:49
- Пол:
- Поблагодарили: 336 раз.
|
Ben80 » 03 май 2021, 17:24
Если интересно, могу показать, что по данному вопросу я для ИИ сделал более полугода назад. Всегда интересно почитать что-то новое Сейчас много кода, плагинов, а вот детальные описания работы алгоритмов редко встретишь. Ну, если интересуют именно алгоритмы, а не усиление эффективности ИИ, то тогда наверно не буду показывать, по какому принципу я стал "взвешивать" втор. навыки. Скажу только, что сначала долго смотрел (выводил на печать) веса, которые получаются в оригинальной игре. И пришел к выводу, что в процедуре 0x527C40 где-то ошибка (может, сам алгоритм кривой). Из-за этого для "магических" втор. навыков часто веса скакали - то сильно мало (0 или чуть больше), то сильно много (но не переполнение, насколько помню). Поэтому я просто переписал все хайхуком по своему. Ну и также переписал 0x527770 хайхуком, со своими изменениями кое-где. Так что вот - Код: Выделить всё
int __stdcall HiHook_AI_BuffDebuffSpellEff(HiHook* h, int magicParams[9], int iSpell, int levelSpell, int nApp) { double k = 0.003; int nAffectedStacks; int nStacks = 0; _Hero_* hero = (_Hero_*)magicParams[0]; int armyPower = 0;
for(int i=0; i<7; i++) if(hero->army.type[i] >= 0) { nStacks++; armyPower += hero->army.count[i] * o_pCreatureInfo[hero->army.type[i]].AI_value; }
if(magicParams[3] > nApp) nAffectedStacks = nApp; else nAffectedStacks = magicParams[3];
if((o_Spell[iSpell].flags & 0x00000040) && levelSpell > 2) nAffectedStacks = nStacks; else if(nAffectedStacks > 4) nAffectedStacks = 4;
int duration = magicParams[3]; if(duration > 7) duration = 7;
int result = (o_Spell[iSpell].ai_value[levelSpell] * duration * armyPower * nAffectedStacks * k / nStacks);
return result; }
int __stdcall HiHook_AI_Set_HeroParameters(HiHook* h, _Hero_* hero) {
int magicParams[9]; CALL_2(int, __thiscall, 0x527220, magicParams, hero);
int k = 3;
int needExpo = CALL_1(int, __fastcall, 0x4DA690, hero->level); _dword_ armyPower = *(int*)(0x67814C) + CALL_1(int, __thiscall, 0x44A950, (int)(&hero->army)); hero->ai_exp_eff_109 = (float)armyPower * 5.0f / (40.0f * (float)needExpo);
const int allAISpellFlags = 2064384; const int buffdebuffAISpellFlags = 262144; const int mapAISpellFlags = 1048576; const int otherAISpellFlags = 753664;
_dword_ spell_eff_0 = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4;
magicParams[2] += 1; magicParams[3] += 1;
_dword_ ai_power_eff = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_0;
if(ai_power_eff > 10) { ai_power_eff *= k; hero->ai_power_eff_47E = ai_power_eff; } else hero->ai_power_eff_47E = 10 * k;
magicParams[2] -= 1;
_dword_ ai_duration_eff = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_0; hero->ai_duration_eff_482 = k * ai_duration_eff;
magicParams[3] -= 1; magicParams[4] += 30;
_dword_ ai_knowl_eff = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_0;
if(ai_knowl_eff / 3 > 10) { ai_knowl_eff *= k; hero->ai_knowl_eff_486 = ai_knowl_eff / 3; } else hero->ai_knowl_eff_486 = 10 * k;
int maxMana = magicParams[4] - 30; magicParams[4] = hero->spell_points;
_dword_ spell_eff_mana = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4;
if(hero->spell_points >= maxMana) hero->ai_mana_eff_48E = 0; else { hero->ai_mana_eff_48E = k * (spell_eff_0 - spell_eff_mana); hero->ai_mana_eff_48E /= 2; }
if(hero->spell_points >= maxMana * 2) hero->ai_dmana_eff_48A = 0; else { magicParams[4] = maxMana * 2; hero->ai_dmana_eff_48A = CALL_2(int, __thiscall, 0x527A90, magicParams, buffdebuffAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, otherAISpellFlags) / 2 + CALL_2(int, __thiscall, 0x527A90, magicParams, mapAISpellFlags) / 4 - spell_eff_mana;
hero->ai_dmana_eff_48A *= k; hero->ai_dmana_eff_48A /= 2; }
return 0; }
...
_PI->WriteHiHook(0x527770, SPLICE_, EXTENDED_, THISCALL_, HiHook_AI_BuffDebuffSpellEff); _PI->WriteHiHook(0x527C40, SPLICE_, EXTENDED_, THISCALL_, HiHook_AI_Set_HeroParameters);
|