XEPOMAHT, с хуками я разобрался - раньше тупил, конечно, но сейчас уже понимаю, что к чему. Помните мой бредокод, "добавляющий" Колизей Магов? Глядите, как он похорошел
Основная функция:
Code:
char __stdcall AdvMng_4_Arena(HiHook* hook, void* AvdMng, _Hero_* hero, _MapItem_* obj, char xyz)
{
_AdvMgr_* AvdMan = (_AdvMgr_*)AvdMng;
char result = xyz;
int SelectedSkill;
bool isMagical;
//Получение подтипа объекта через obj не работает, на выходе мусор
ExecErmCmd("HE-1:P?y1/?y2/?y3");
ExecErmCmd("OBy1/y2/y3:U?y4");
if (y[4] == 0)
isMagical = false;
else
isMagical = true;
if (!CALL_2(int, __thiscall, 0x4E5630, hero, obj)) //check if visited
{
if (xyz)
{
CALL_3(int, __thiscall, 0x415CC0, AvdMan, 0, -1); //AdvMgr_SetTimer
CALL_4(void, __thiscall, 0x415D40, AvdMan, 0, 1, 1); //AdvMgr_UpdateInfoPanel
if (!isMagical)
b_MsgBoxQ(o_Advevent_TXT->GetString(0), 10, -1, -1, 31, 2, 32, 2, -1, 0, -1, 0);
else
b_MsgBoxQ((char*)o_Advevent_2[0].c_str(), 10, -1, -1, 33, 2, 34, 2, -1, 0, -1, 0);
if (o_WndMgr->result_dlg_item_id == 30729)
{
SelectedSkill = 0;
}
else if (o_WndMgr->result_dlg_item_id == 30730)
{
SelectedSkill = 1;
}
else
return result;
if (isMagical)
SelectedSkill += 2;
switch (SelectedSkill)
{
case 0:
hero->attack += 2;
if (hero->attack > 99)
hero->attack = 99;
break;
case 1:
hero->defence += 2;
if (hero->defence > 99)
hero->defence = 99;
break;
case 2:
hero->power += 2;
if (hero->power > 99)
hero->power = 99;
break;
case 3:
hero->knowledge += 2;
if (hero->knowledge > 99)
hero->knowledge = 99;
break;
default:
break;
}
return CALL_2(int, __thiscall, 0x4E5650, hero, obj); //set as visited
}
}
if (xyz)
{
if (!isMagical)
b_MsgBoxQ(o_Advevent_TXT->GetString(1), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
else
b_MsgBoxQ((char*)o_Advevent_2[1].c_str(), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
result = (o_WndMgr->result_dlg_item_id == DIID_OK);
}
return result;
}
В DllMain также должно стоять вот это:
Code:
Magic->WriteHiHook(0x49E440, SPLICE_, EXTENDED_, THISCALL_, AdvMng_4_Arena);
P.S. Magic - это моя PatсherInstance
Если Вы знаете, какая функция в WERD способна разрешить мою проблему, то не могли бы Вы прислать ее код прямо сюда, чтобы я не тратил на поиск в три раза больше времени? Кстати, вопрос не по скриптам, мне просто интересно понять стоящую за этим логику: почему код любой функции начинается с команды PUSH? Подскажите пожалуйста.
Berserker, если Вы добавите, будет здорово
SergOz, проблема не в помещении объекта, а в создании для него триггера. И, да, такие места действительно должны быть тайными, чтобы игрок в начале игры не знал, где их искать.
Создал новый глобальный мод: WoG Ultra Edition
(This post was last modified: 10.02.2021 13:50 by Raistlin.)
|