1. Идём по адресу 1DBFD и "зануляем", т.е. заполняем командами nop (90h), фрагмент старого кода [1DBFD; 1DC20]. Только что мы освободили 36 байт для нашего кода.
2. Компилируем следующий фрагмент кода в FASM'е:
- Код: Выделить всё
use32
mov edx, dword [ecx+76h] ; edx <- ID монстра
xor eax, eax
xor ecx, ecx
@Loop:
movzx eax, byte [ecx+468DEEh] ; Для удобства таблицу монстров без штрафа в рукопашной
; разместим сразу после таблицы со стоимостью монстров в ресурсах
; eax <- ID монстра из таблицы с индексом ecx
cmp edx, eax ; Сравниваем ID монстров
jz @NoPenalty ; Если ID совпадают, штрафа нет
jl @Penalty ; Если ID монстра меньше, смотреть таблицу дальше не имеет смысла,
; т.к. она упорядочена по возрастанию ID
inc ecx ; Иначе увеличиваем счётчик
jmp @Loop ; и переходим к следующей итерации
@Penalty:
fld dword [ebp-14h] ; Оставляем оригинальный код деления на 2,
fdiv dword [4EA4E4h] ; чтобы избежать возможных погрешностей при вычислении урона
fstp dword [ebp-14h]
@NoPenalty:
Получилось 35 байтов. Вставляем полученный бинарный код с заменой по адресу 1DBFD.
3. Идём по адресу 68DEE и прописываем таблицу монстров без штрафа в рукопашной, завершая её байтом FF. Монстры в таблице должны быть расположены строго по возрастанию ID. По умолчанию пропишем там тех монстров, что не имеют штрафа в рукопашной в оригинальной игре: 2B 2C 2E FF.
4. Сохраняем исполняемый файл под каким-нибудь именем - и патч готов.
Вы можете сразу вставить бинарный код ShootPatch_1DBFD.bin по адресу 1DBFD, но не забудьте также прописать таблицу монстров без штрафа в рукопашной по адресу 68DEE. ID монстров в таблице должны следовать строго в возрастающем порядке, заканчиваться таблица должна специальным байтом, который заведомо больше любого ID (например, FF).