Объявления
Поздравляем
Roman2211


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Моды

Обсуждаем, делимся впечатлениями, новой информацией
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Моды

Сообщение AlexSpl » 06 ноя 2014, 21:56

Сделать можно всё. Первые 2 пункта быстрее. Остальные 3 - чуть дольше. 5-й - совсем не фантастика. Но обещать не буду. Просто говорю, что написать такой патч несложно (1-2 вечера).
Вернуться к началу

offlineАватара пользователя
DeathLust  
Подмастерье
Подмастерье
 
Сообщения: 140
Зарегистрирован: 29 ноя 2012, 15:19
Пол: Не указан
Поблагодарили: 62 раз.

Re: Моды

Сообщение DeathLust » 06 ноя 2014, 22:18

Интересней всего, конечно, научиться править что-то по аналогии с конкретными патчами. Т.е. что-то вроде методички: пример с устранением рукопашного штрафа для высших друидов и пояснение, как сделать то же самое для произвольного стрелка (вдруг у кого-то другое видение, в котором это будет полезно). Изучать и отлаживать ассемблер могут не только лишь все, а действовать по аналогии гораздо больше кто.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Моды

Сообщение AlexSpl » 07 ноя 2014, 02:09

Количество определённого ресурса, требующегося для найма существа, прописано прямо в машинной команде, т.е. является частью ассемблерной инструкции:

Код: Выделить всё
468D75          mov     dword ptr [ecx+14h], 1     ; Genie (Gems: 1)
468D81          mov     dword ptr [edx+4], 1       ; Phoenix (Mercury: 1)
468D8D          mov     dword ptr [eax+10h], 1     ; Cyclops (Crystal: 1)
468D99          mov     dword ptr [ecx+0Ch], 1     ; Green & Red Dragon (Sulfur: 1)
468DA5          mov     dword ptr [edx+0Ch], 2     ; Black Dragon (Sulfur: 2)
468DB1          mov     dword ptr [eax+14h], 1     ; Giant (Gems: 1)
468DBD          mov     dword ptr [ecx+14h], 2     ; Titan (Gems: 2)

Т.к. Image Base для версии от "Буки" равен 400000, то соответствующие адреса в исполняемом файле на диске: 68D75, 68D81, 68D8D, 68D99, 68DA5, 68DB1, 68DBD. Теперь осталось открыть исполняемый файл в любом шестнадцатеричном редакторе, перейти по одному из этих адресов и заменить часть инструкции, являющуюся непосредственно заданным операндом ("число после запятой"). В нашем случае непосредственный операнд - это двойное слово, которое занимает последние четыре байта машинной команды.

Ближе к делу. Например, увеличим количество серы, требуемое для покупки Чёрного Дракона, до 3 ед. Для этого переходим по адресу 68DA5, видим там команду C7 42 0C 02 00 00 00, меняем непосредственный операнд 2 (02 00 00 00) на 3 (03 00 00 00) и сохраняемся. Теперь Чёрные Драконы стоят на 1 ед. серы дороже.
Последний раз редактировалось AlexSpl 07 ноя 2014, 12:55, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
DeathLust  
Подмастерье
Подмастерье
 
Сообщения: 140
Зарегистрирован: 29 ноя 2012, 15:19
Пол: Не указан
Поблагодарили: 62 раз.

Re: Моды

Сообщение DeathLust » 07 ноя 2014, 10:44

AlexSpl писал(а):

Количество определённого ресурса, требующегося для найма существа, прописано прямо в машинной команде, т.е. является частью ассемблерной инструкции:
Код: Выделить всё
468D99          mov     dword ptr [ecx+0Ch], 1     ; Green & Red Dragon (Sulfur: 1)


Я правильно понимаю, что в таком случае для увеличения серы на 1 штуку только для красных придётся повозиться посерьёзней? Хотелось бы равномерной стоимости: 1, 2, 3.
PS Наверняка такие простые изменения (правку количества ресурсов для найма существ, которые в оригинале уже требуют ресурсов) можно внести в новую версию UBP. Ассемблерная инструкция заданного вида однозначно генерируется по количеству и типу ресурса.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Моды

Сообщение AlexSpl » 07 ноя 2014, 12:23

Да, чтобы разделить случай с Зелёным и Красным Драконом, а также назначить стоимость в ресурсах произвольному существу, придётся переписывать уже сами инструкции непосредственно.
Вернуться к началу

offlineАватара пользователя
DeathLust  
Подмастерье
Подмастерье
 
Сообщения: 140
Зарегистрирован: 29 ноя 2012, 15:19
Пол: Не указан
Поблагодарили: 62 раз.

Re: Моды

Сообщение DeathLust » 07 ноя 2014, 13:51

Сэр Алекс, в теме, начинавшейся с замены аватаров, упоминались хуки. Правильно я понимаю, что в случае нехватки количества инструкций для сложного алгоритма внутри исполняемого файла в его конец добавляется тело дополнительной функции, которая вызывается из нужного места с последующей передачей управления обратно?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Моды

Сообщение AlexSpl » 07 ноя 2014, 13:54

Прописать стоимость в ресурсах произвольному существу довольно просто. Во-первых, нужно создать таблицу, в которой будет храниться стоимость существ в ресурсах. Она может быть, к примеру, такой:

00 00 00 00 ... 0С 01 0С 02 0С 03 ...

Здесь байты идут парами, первый представляет собой тип ресурса (00 - дерево, 04 - ртуть, 08 - руда, 0C - сера, 10 - кристаллы, 14 - самоцветы), второй - количество ресурса. Т.к. нам не нужны большие значения, будет достаточно одного байта. Первая пара (00 00) будет использоваться для хранения типа и количества ресурса, требуемого для найма Крестьянина, вторая (00 00) - для найма Лучника и т.д. Соответственно, 0C 01, 0C 02 и 0C 03 - это значения для Зелёного, Красного и Чёрного Драконов. Размер такой таблицы будет равен 66 * 2 = 132 байта.

Во-вторых, при найме существа нужно читать значения из этой таблицы и записывать в специальную структуру менеджера найма (recruitManager), хранящую информацию о стоимости существа. Это можно сделать, например, так:

Код: Выделить всё
mov     ecx, [ebp-10h]                                             ; загружаем в регистр ecx ID покупаемого монстра
xor     eax, eax     
mov     al, byte [ecx*2 + {адрес вышеприведённой таблицы}]         ; в регистр eax помещается тип ресурса из таблицы
xor     edx, edx
mov     dl, byte [ecx*2 + {адрес вышеприведённой таблицы + 1}]     ; в регистр edx помещается количество ресурса из таблицы
mov     ecx, [ebp-0Ch]                                             ; адрес структуры, куда будем записывать
mov     [ecx + eax * 4], edx                                       ; затем тип и количество прописываются в структуру менеджера найма (сравните эту команду с командами, где количество ресурса задаётся непосредственным операндом)


Такой код займёт 37 байтов. Итого нам потребуется 37 + 132 = 169 байтов на всё. К счастью, у нас есть около 200 :)

Если интересно, как это реализовать на практике, дайте знать :)
Последний раз редактировалось AlexSpl 07 ноя 2014, 14:08, всего редактировалось 3 раз(а).
Вернуться к началу

offlineАватара пользователя
DeathLust  
Подмастерье
Подмастерье
 
Сообщения: 140
Зарегистрирован: 29 ноя 2012, 15:19
Пол: Не указан
Поблагодарили: 62 раз.

Re: Моды

Сообщение DeathLust » 07 ноя 2014, 14:02

AlexSpl писал(а):

Если интересно, как это реализовать на практике, дайте знать :)

Интересно. Но у меня нет широкомасштабных планов по изменению ресурсных требований при найме (т.е. таблица для всех юнитов избыточна). Только драконы и, возможно, на пробу сделать стоимость Крестоносца в 850 золота + 1 руды.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Моды

Сообщение AlexSpl » 07 ноя 2014, 14:11

Цитата:
Правильно я понимаю, что в случае нехватки количества инструкций для сложного алгоритма внутри исполняемого файла в его конец добавляется тело дополнительной функции, которая вызывается из нужного места с последующей передачей управления обратно?

Дополнительный код в этом случае помещается в DLL, которая затем подгружается при запуске приложения (игры).

Цитата:
Интересно. Но у меня нет широкомасштабных планов по изменению ресурсных требований при найме (т.е. таблица для всех юнитов избыточна). Только драконы и, возможно, на пробу сделать стоимость Крестоносца в 850 золота + 1 руды.

Зато вышеприведённый код будет универсален. Если когда-нибудь захочется поэкспериментировать со стоимостью существ в ресурсах, достаточно будет только изменить значения в таблице.
Вернуться к началу

offlineАватара пользователя
DeathLust  
Подмастерье
Подмастерье
 
Сообщения: 140
Зарегистрирован: 29 ноя 2012, 15:19
Пол: Не указан
Поблагодарили: 62 раз.

Re: Моды

Сообщение DeathLust » 07 ноя 2014, 15:05

AlexSpl писал(а):

Код: Выделить всё
xor     eax, eax     

Эта инструкция побитово обнуляет регистр и делает его "текущим" для следующих операций?
AlexSpl писал(а):

Такой код займёт 37 байтов. Итого нам потребуется 37 + 132 = 169 байтов на всё. К счастью, у нас есть около 200 :)

И где же эти драгоценные 200 последовательных и неиспользуемых байт в файле скрываются? :)
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2