Основная функция (огромное спасибо igrik за создание работающего варианта, а то у меня все-же что-то не склеилось
):
Code:
char _bool8_ __stdcall AdvMng_4_Arena(HiHook* hook, _AdvMgr_* AvdMgr, _Hero_* hero, _MapItem_* object, _bool8_ isHuman)
{
// Hero_GetVisited7_Object
if( !CALL_2(_bool8_, __thiscall, 0x4E5630, hero, object) )
{
//
int skillId = 0;
// получаем подтип объекта (0 - атака/защита, 1 - сила/знания)
int subtype = object->os_type *2;
// код игрока человека
if (isHuman)
{
// AdvMgr_SetTimer
CALL_3(int, __thiscall, 0x415CC0, AvdMgr, 0, -1);
// AdvMgr_UpdateInfoPanel
CALL_4(void, __thiscall, 0x415D40, AvdMgr, 0, 1, 1);
// показ сообщения с выбором первичного навыка +2
skillId = o_MsgBox(o_ADVEVENT_TXT->GetString(1), 10, -1, -1, 31 + subtype, 2, 32 + subtype, 2, -1, 0, -1, 0);
// если нажата отмена: выход
if( skillId == 30721 )
return 1;
// получаем номер выбранного скилла
skillId -= 30729;
} else { // код ИИ
skillId = Randint(0, 1);
}
// первоначальная величина бонуса
int bonus = 2;
// собираем правильный номер выбранного скилла
skillId += subtype;
// величина первичного навыка героя
int valueSkillPower = *(_byte_*)(&hero->attack + skillId);
// работаем с границами величин (0..99)
if (valueSkillPower >= 99)
bonus = 0;
else if(valueSkillPower == 98)
bonus = 1;
// выдаём бонус герою
*(_byte_*)(&hero->attack + skillId) += bonus;
// Hero_SetVisited7_Object
CALL_2(_bool8_, __thiscall, 0x4E5650, hero, object);
}
else if (isHuman)
{
// сообщение игроку человеку, что объект уже был посещён этим героем
o_MsgBox(o_ADVEVENT_TXT->GetString(2), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
}
return isHuman;
}
В DllMain также должно стоять вот это:
Code:
Magic->WriteHiHook(0x49E440, SPLICE_, EXTENDED_, THISCALL_, AdvMng_4_Arena);
Если что, Magic - это моя PatсherInstance