Перевод с английского
Это похоже на метод CyQ'а при вставке кода в тело main.scm для замены адресов опкодов. Я нашел два опкода, которые могут выполнят ту же функцию в San Andreas.
Это 0572 и 0A3D.
Итак, как это работает.
1. В San Andreas мы имеем 92 чита (кода). Некоторые из них нерабочие, некоторые хорошо известны и часто
используются.
2. Указанные опкоды так же хорошо известны. 0572 устанавливает нитро на все такси, 0A3D заставляет проституток платить вам (не имеет значения, я все равно использую 0572). Но не каждый знает, что эти опкоды работают подобно читам. Они устанавливают один из
92 флагов и игра начинает думать, что вы используете чит (без изменения истории читов, только применяется то, что делает чит).
3. 0A3В это чит #90, 0572 - чит #91
4. Адреса процедур всех читов хранятся в виде простых чисел (в массиве) и могут быть изменены в режиме реального времени через main.scm. Читайте статью "Меняем игровую память через SCM".
5. Суммируя, данный код меняет адрес 91-го чита на адрес внутри main.scm. После этого мы используем этот опкод, игра считывает адрес чита, переходит в тело main.scm на указанное нами место и начинает работать с кодом как ассемблерным.
Используя конструкцию hex..end в Sanny Builder возможно выполнять ЛЮБОЙ код, который вы хотите.
Лично я не очень хорошо знаю ассемблер, поэтому мой пример простой (я добавляю $1000 на счет игрока), но это только начало. Кто-нибудь, кто хорошо знает ассемблер, может написать процедуру VirtualProtect и тогда нам не потребуется патчить игру с патчем Xieon'а, чтобы изменять некоторые адреса (например, адрес гравитации).
- Code:
// запускаем ассемблерный код
0@ = -429863
&0(0@,1i) = 0xA49960
&0(0@,1i) += @__AsmInjection
0572: 1
&0(0@,1i) = 0 // восстанавливаем первоначальное значение
..................
// сама вставка
:__AsmInjection
hex
//Add $1000 to the player money
81 05 50CEB700 E8030000 // add [0xB7CE50], 1000
C3 // return
end
Этот код добавит 1000 к значению, записанному в 0xB7CE50 (адрес денег игрока). Немного бесполезный пример, но работает!
Обратите внимание: это было протестировано в San Andreas v1.0 US. Если вы имеете v1.01, пожалуйста, протестируйте работает ли код.
- Code:
Игра версии v1.0 SCM начала адресу: 0xA49960
Игра версии v1.01 SCM начала адресу: 0xA4BFE0
0572 Addr для v1.0: -429863
0572 Addr для v1.01: -431117
Данный мод позволяет активировать любой чит нажатием кнопки Действие (Tab по умолчанию). Все читы активируются последовательно.
http://sannybuilder.com/files/cheater.rar
debug_mode работает ,
на самом деле это не имеет отношения к опкоду 00C3. Это концовка кода на ассемблере, а точнее инструкция С3 - return. Можешь посмотреть в примере в первом посте.
Исходный код такой:
- Code:
03C4: set_status_text_to $4 0 'FEC_NMN'
$4 = -1
while true
wait 250
if
00E1: key_pressed 0 4
then
inc($4)
0@ = -429863
&0(0@,1i) = 10789350
0572: 1
03E5: 'CHEAT1'
wait 1000
end
end
end_thread
hex
A1 7099A4 00 // mov eax, $4
50 // push eax
E8 7FE19EFF // call 0x438370 = 4424560
83 C4 04 // add esp, 4
C3 // return
end
правда не пытайтесь вставить это в другой Майн, там все оффсеты посчитаны вручную. Если добавить хоть один опкод, работать не будет. Буду думать, правда ASM плохо знаю.
Кстати говоря, теперь можно переделать процедуру @WriteMem, потому как через ASM можно записывать и 1, и 2 байта одной командой, а не мучиться с установкой битов.