(07.11.2025 18:53)daemon_n Wrote: Проверь, пожалуйста, есть ли у тебя там что-то из патчей или хуков:
_PI->WriteLoHook(0x441982, LoHook_00441982) - этот хук затирается Тифоном и срабатывать не должен
_PI->WriteLoHook(0x441AFF, LoHook_00441AFF) - этот хук Тифону вроде б не мешает - там работает содовский код, на выполнение Тифоновского кода это никак не влияет
_PI->WriteHiHook(0x441b5d, CALL_, EXTENDED_, THISCALL_, HiHook_00441b5d); - этот хук затирается Тифоном и срабатывать не должен
(07.11.2025 18:53)daemon_n Wrote: if (reinterpret_cast<_BattleStack_*>(c->edi)->count_current > 0)
Не очень понимаю эту строку с аж 4 знаками сравнения (я плохо понимаю Си), но что означает в ней "reinterpret_cast"? Если это какая-то воговская переменная, то её может и не быть, т.к. Тифон некоторые ненужные воговские данные отключает.
PS: Методом научного тыка, на который я потратил 2,5 часа, удалось узнать, что глючит эта функция:
Code:
// © JackSlater
// Вампиризм не работает на клонов
_LHF_(LoHook_BattleStackVampirism)
{
if (reinterpret_cast<H3CombatCreature *>(c->edx)->creature.clone)
{
c->return_address = 0x4412AB;
return NO_EXEC_DEFAULT;
}
return EXEC_DEFAULT;
}
Для Тифоновских Духов в edx будет МУСОР (точнее, тифоновский флаг вампиризма, чтобы вампиры не вампирили друг у друга). Поэтому игра тут глючит! Структуру стека в этом месте для совместимости нужно извлекать из стека, а не из edx (т.к. Тифоновская вставка его не восстанавливает, т.к. в дальнейшем коде он в следующей команде затирается содовским кодом).
Пришлось перенести этот багфикс в Тифон, после чего ошибка изчезла:
Code:
proc Багфикс_вапиризма
mov edx, dword [ebp+8]
bt dword [edx+Структура_стека.Флаги], Флаг_Клон ; цель отсоса - не клон
jb .нет_вампиризма
mov ebx, dword [esi+Структура_стека.Текущее_количество]
mov edx, dword [esi+Структура_стека.Количество_в_начале_битвы]
push 44093Bh
ret
.нет_вампиризма:
push 4412ABh
ret
endp