Как добавить, удалить или изменить абилки у монстров Heroes 4 WoW
Первым делом необходимо установить hex-редактор и дизассемблер Hiew. Именно в нем и придется работать. Можно еще скачать IDA версии 4.1 или выше (версия 4.1 бесплатная, остальные ищите на варезятниках) - но он нужен только, если вы хотите понять, как вообще находить инфу в экзешнике.
Для оставшихся объясняю: IDA очень полезная штука, так как в нем можно снабжать код дизассемблера своими комментариями, давать свои имена функциям и вообще много чего еще. Откройте IDA, откройте в нем файл heroes.exe (no-cd 3.0WoW), который можно скачать, к примеру, на сайте Haze. Пока IDA расшифровывает файл и создает свою базу, можно выпить чашек 5 кофе, скурить пачку сигарет, прочитать какую-нибудь книжку или помедитировать - дело это неспешное. Когда надпись сверху сменится на READY - можно приступать.
Теперь жмите меню Navigate->Jump to->Address->00654820
Должно появиться что-то типа этого
Code: Select all
.text:00654820 sub_0_654820 proc near ; CODE XREF: .text:0065
.text:00654820 push 21h
.text:00654822 push 11h
.text:00654824 push 19h
.text:00654826 push 0
.text:00654828 mov ecx, offset unk_0_AB1960
.text:0065482D call sub_0_6551D0
.text:00654832 push 39h
.text:00654834 push 19h
.text:00654836 push 1
.text:00654838 mov ecx, offset unk_0_AB1974
.text:0065483D call sub_0_655000
.text:00654842 push 3Dh
.text:00654844 push 24h
Code: Select all
.text:00654820 push 21h
.text:00654822 push 11h
.text:00654824 push 19h
.text:00654826 push 0
.text:00654828 mov ecx, offset unk_0_AB1960
.text:0065482D call sub_0_6551D0
В общем, первые 3 команды определяют абилки создания (таблица абилок ниже), четвертая - номер создания, пятая - адрес в памяти, куда будет писаться инфа о создании, а команда call - вызывает процедуру для собственно добавления абилок. Правда, если добавляется одна абилка, то вызывается одна процедура, а если две - то другая, три - третья, четыре - четвертая. Таблицы их адресов даны ниже.
Для дальнейшего удобства обзовите процедуру по адресу 654820 именем FillAbility (нужно встать на строчку с адресо 654820 и нажать N), а процедуры добавления абилок назвать Fill1Ability, Fill2Abilities, Fill3Abilities, Fill4Abilities. Чтобы определить, сколько абилок добавляется в функции, подсчитайте количество push перед вызовом процедуры и отнимите 1. К примеру, первым делом вызывается процедура по адресу 6551d0. Перед ней стоит 4 инструкции push (21,11,19,0). Значит, адрес 6551d0 - это адрес процедуры с тремя абилками. Наведите курсор на call и нажмите Enter и N. Введите имя процедуры - Fill3Abilities. Также следует поступить с остальными процедурами Fill1,2,4Abilities.
Теперь неплохо бы определить, каким существам соответствуют вызовы абилок. Вооружившись таблицей абилок, можно определить, каким существам соответствует вызов по его абилкам. К примеру, абилки 21,11,19 соответствуют insubstantial, elemenal, flying - можно догадаться, что это воздушный элементал. Точно таким же образом определяются и остальные создания. Можно заметить, что создания перечисляются по алфавиту (исключая новеньких из WoW и TGS). Для тех, кто не хочет напрягаться, ниже таблица адресов абилок всех созданий. Чтобы было потом легче изменять абилки, возле первого push, относящегося к существу, в комментариях подпишите его название.
Должно получиться примерно такое:
Code: Select all
.text:00654820
.text:00654820 ; --------------- S U B R O U T I N E ---------------------
.text:00654820
.text:00654820
.text:00654820 FillAbilities proc near ; CODE XREF: .text:
.text:00654820 push 21h ; air elemental
.text:00654822 push 11h
.text:00654824 push 19h
.text:00654826 push 0
.text:00654828 mov ecx, offset air_elemental
.text:0065482D call Fill3Abilities
.text:00654832 push 39h ; angel
.text:00654834 push 19h
.text:00654836 push 1
.text:00654838 mov ecx, offset angel
.text:0065483D call Fill2Abilities
.text:00654842 push 3Dh ; ballista