Основная функция (огромное спасибо 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