Продолжим...
Нам необходимо решить вторую часть вопроса: убрать доп.урон у баллисты шансами 50%,75%,100%
Итак, поехали.
Мы остановились на адресе 0043FF79. С него и начнем.
Если вы куда-то переместились в другое место, то кликаем ЛКМ в закладку IDA-View, жмем горячую клавишу G, вставляем в окно с вводом адреса 0043FF79 и жмем OK. В итоге мы перепрыгнули на первый вызов функции стрельбы стеком "BattleStack_Shoot". Дважды кликаем по этой надписи "BattleStack_Shoot" и декомпилируем код (F5)
Смотрим на заголовок функции:
void - тип возвращаемого результата функции: нас пока что не интересует
__thiscall - соглашение о вызове: нас пока не интересует
BattleStack_Shoot - название функции: и так понятно
(_BattleStack_ *shooter, _BattleStack_ *target): аргументы функции
Это структуры стеков в битве (BM:Z) стрелка и цели. Просто запомним это
Дальше включаем логику: мы ищем увеличение урона, значит нам необходимо найти участок кода с расчетом урона, либо функцию которая расчитывает наносимый урон, и которая вызывается в нашей функции стрельбы.
Исследуем код функции стрельбы:
1. Сначала видим расчет удачи, и ее шансы. Нас не интересует - идем дальше.
2. Дальше видим вызов функции отрисовки полёта снаряда "Battle_Stack_DrawShot_Bullet". Проходим мимо
3. Видим код декремента (вычитания единицы) боеприпасов у стрелка, и проверку на наличие артефакта №5 (повода боеприпасов). Интересно, но всё равно идем дальше
4. Далее пошёл первый if(Magog). Теперь вы знаете где сделана проверка на стрельбу по площади. Тут нужно быть осторожным в правках. ВОГ мог модифицировать код в данном участке. Вспоминаем есть ли приколы в воге, связанные с магогами? Вроде нет. Можно загрузить Ольку (Olly Debager) по данному адресу 0043F729 и помотреть на чужие хаки
Вроде всё чисто. Это было чисто для интереса, поэтому идем дальше. Ах нет! Тут мог вклиниться Тифон, если он включён! И я даже более чем уверен, что Тифон ставит сюда свою проверку. Но проверять уже не будем)
5. Листаем дальше, тут мы видим у Магов загрузку звука фаербола, загрузку дефа анимации и т.п. Листаем до следующего интересного места (хотя тут всё интересно, если честно).
6. Итак, находим проверку на Личей (стр.206)!
else if ( monType == LICH || monType == POWER_LICH )// Lich, Power Lich
Вспоминаем: в воге облаком Личей стреляет еще Драколич. Ради интереса проверяем в отладчике Ольке
И что мы тут видим? А код то разный: в Иде (exe SoD 3.2) и Олли (exe ERA аля TE)
Забегая далеко вперед скажу вам сразу, что если вы увидите адреса в пределах 0x701000-0x785000 при вызове функций - это установил хук наш родной Вог. Вот так выглядит эта нетривиальная проверка:
Code:
0x767B9F signed int __usercall DracolichShoot(int creatureID)
{
signed int result; // eax
if ( creatureID == 64 || creatureID == 65 || creatureID == 196 )
result = 65; // возвращаем Могущественного Лича
else
result = 0;
return result;
}
Так что при попытке подмене стрелка с облаком смерти по адресу 0043FA1F !!UN:C4454945/1/x; вы получите неожиданный вылет из игры. Вот здорово! Поэтому если не проверять изменяемые вами данные в отладчике, можно долго биться головой об стену.
Надеюсь я вас предупредил о такого рода неожиданностях.
7. Поехали дальше - пролистываем (и конечно же изучаем код действия стрельбы Лича) до следующего "else"
8. Нажмите TAB и обратите внимание, что в ASM коде мы переместились от проверки на Лича всего на несколько строк, а декомпилированном коде TAB (F5) мы пролистали порядка 20-30 строк. Такое бывает)) Привыкайте.
Если сбились с адреса, то это 0043FA38
Переходим опять в декомпилированный код и что мы видим:
Видим такую логику: если цель есть, считаем базовый урон, считаем урон по цели, наносим урон цели.
9. Нам нужно найти бонус Баллисты. Заходим сначала в первую функцию - расчет базового урона. Двойно клик по "Battle_Stack_CalcDamage". Изучаем её, и понимаем простую логику:
- если на стрелке висит забывчивость, режем кол-во стрелков вдвое
- если баллиста - урон умножаем на силу атаки героя. Это не наш случай. Идем дальше
- проверки на заклинания Благословления и Проклятия (увеличиваем или режем величину урона)
- генерирем силу урона в пределах от Min...Max
- возвращаем силу урона
Итог: решения нашей задачи мы не нашли.
Нам нужно проверять следующую функцию. Жмем G и вводим адрес 0043FA3C (прыгаем туда, где были в начале п.8)
10. Делаем двойной клик по BattleStack_CalculateDamageToMonster и внутри этой функции стразу же видим функцию BattleStack_Calc_Damage_BonusesplyDoubleDamage. Название уже говорит о бонусах. Здорово. Нам сюда
11. Делаем двойной клик по функции насчета бонусов BattleStack_Calc_Damage_BonusesplyDoubleDamage. В ней есть проверка на дабблурон Черных рыцарей. Листаем дальше и находим проверку на баллисту (146) 004435B2
Изучаем детально код. Тут и кроется решение нашей задачи. Решений можно придумать 3-4 вида. Все они отличаются: можно подменить номер монстра, можно вырезать этот код вообще, поставив безусловный переход. Можно обнулить шансы бонусов балисты "BallistaDamageBonus 0063B810", можно изменить номер вторичного навыка, и сделать скажем зависимость от Магии Земли (да, давайте её еще сильнее усилим
)
В общем достаточно большое поле для манёвров.
Итак, задачу мы решили.
В следующий раз возьмёмся на нахождение адресов элементов диалогов, что на порядок сложнее нашей текущей задачи.
(24.07.2020 11:29)Zur13 Wrote: А эти адреса не изменяются при применении разного рода бинарных патчей или еще чего-либо? Насколько это решение надежно?
И еще вопрос, то фактически на чем я застрял при подходе с помощью исходников, как ИДА подключить к героям в режиме дебага? У меня при попытке выполнить Attach to process к героям ИДА падает вместе с героями. Хотелось с помощью точки останова посмотреть то место кода которое я нашел с помощью исходников ВоГ.
Конечно адреса могут меняться, если кто-то это намеренно сделает. Во второй части я показал один из таких примеров.
Я Иду ни разу не подключал к героям. Тут не подскажу. Только Олли.