MENU
Главная » Статьи » Гайды по хакингу Sonic 1

Сборник мини-гайдов по С1

1.МОНИТОР С КОЛЬЦАМИ (ИЗМЕНЕНИЕ КОЛ-ВА КОЛЕЦ)

Найдите Obj2E
Потом перейдите к Obj2E_ChkRings

Obj2E_ChkRings:
cmpi.b #6,d0 ; does monitor contain 10 rings?
bne.s Obj2E_ChkS ; if not, branch
addi.w #$A,($FFFFFE20).w ; add 10 rings to the number of rings you have
ori.b #1,($FFFFFE1D).w ; update the ring counter
cmpi.w #100,($FFFFFE20).w ; check if you have 100 rings
bcs.s Obj2E_RingSound
bset #1,($FFFFFE1B).w
beq.w ExtraLife
cmpi.w #200,($FFFFFE20).w ; check if you have 200 rings
bcs.s Obj2E_RingSound
bset #2,($FFFFFE1B).w
beq.w ExtraLife

В СТРОКЕ addi.w #$A,($FFFFFE20).w ; add 10 rings to the number of rings you have НУЖНО ИЗМЕНИТЬ ЗНАЧЕНИЕ #$A, НА ТО КОЛ-ВО КОЛЕЦ, КОТОРОЕ ВЫ ХОТИТЕ
Для этого, НУЖНО это число #$A перевести из шестнадцатеричной системы счисления в десятичную. Допустим вы хотите, чтобы монитор с десятью кольцами
давал не 10, а 50 колец, для этого число 50 нужно перевести в шестнадцатеричную сисиему счисления,сделать это можно с помощью калькулятора (переводим, получилось 32), теперь вместо #$A
нужно ввести #$32 (теперь монитор должен давать 50 колец).

 

2.МОНИТОР С НЕУЯЗВИМОСТЬЮ (НЕУЯЗВИМОСТЬ ДЛИТСЯ В 2 РАЗА ДОЛЬШЕ)

 

Перейдите к Obj2E_ChkInvinc

Obj2E_ChkInvinc:
cmpi.b #5,d0 ; does monitor contain invincibility?
bne.s Obj2E_ChkRings ; if not, branch
move.b #1,($FFFFFE2D).w ; make Sonic invincible
move.w #$4B0,($FFFFD032).w ; time limit for the power-up
move.b #$38,($FFFFD200).w ; load stars object ($3801)
move.b #1,($FFFFD21C).w
move.b #$38,($FFFFD240).w ; load stars object ($3802)
move.b #2,($FFFFD25C).w
move.b #$38,($FFFFD280).w ; load stars object ($3803)
move.b #3,($FFFFD29C).w
move.b #$38,($FFFFD2C0).w ; load stars object ($3804)
move.b #4,($FFFFD2DC).w
tst.b ($FFFFF7AA).w ; is boss mode on?
bne.s Obj2E_NoMusic ; if yes, branch
move.w #$98,d0
jmp (PlaySound).l ; play invincibility music

В СТРОКЕ move.w #$4B0,($FFFFD032).w ; time limit for the power-up нужно изменить значение #$4B0, воспользовавшись калькулятором, умножаем это число на 2 получилось 960,
теперь изменяем #$4B0 на #$960, неуязвимость будет длится по времени в 2 раза дольше, если хотите чтобы неуязвимость длилась в 3 раза дольше, умножте число 960 (в шестнадцатеричной
системе счисления hex) на 2 и т.д.

 

ВЕЧНАЯ НЕУЯЗВИМОСТЬ

ПЕРЕЙДИТЕ К СТРОКЕ
move.w #$4B0,($FFFFD032).w ; time limit for the power-up И УДАЛИТЕ ЕЕ

Чтобы наоборот уменьшить время неуязвимости (допустим в 2 раза), нужно разделить число 4B0 (hex) на 2 и т.д.

3.МОНИТОР С САПОГАМИ (БЫСТРЫЙ БЕГ ДЛИТСЯ В 2 РАЗА БЫСТРЕЕ)

Перейдите к Obj2E_ChkShoes

Obj2E_ChkShoes:
cmpi.b #3,d0 ; does monitor contain speed shoes?
bne.s Obj2E_ChkShield ; if not, branch
move.b #1,($FFFFFE2E).w ; set speed shoes flag
move.w #$4B0,($FFFFD034).w ; time limit for the power-up
move.w #$C00,($FFFFF760).w ; change Sonic's top speed
move.w #$18,($FFFFF762).w
move.w #$80,($FFFFF764).w
move.w #$E2,d0
jmp (PlaySound).l ; Speed up the music

 

ПЕРЕХОДИМ К СТРОКЕ

move.w #$4B0,($FFFFD034).w ; time limit for the power-up

Точно также, как и в предыдущем случае, умножаем шестнадцатеричное число 4B0 на 2 получаем 960, значение #$4B0 изменяем на #$960 и т.д.
Для того, чтобы быстрый бег был неограничен удаляем эту строку

 

ИЗМЕНЕНИЕ СКОРОСТИ СОНИКА ВО ВРЕМЯ БЫСТРОГО БЕГА

ПЕРЕХОДИМ К СТРОКЕ

move.w #$C00,($FFFFF760).w ; change Sonic's top speed

Чтобы увеличить скорость Соника в 2 раза, умножаем C00 на 2, получаем 1800, в 3 раза увеличиваем, нужно уже 1800 (hex) умножить на 2, получим 3000 (hex) и т.д.
Чтобы уменьшить скорость Сонику в 2 раза, делим C00 на 2 и т.д.

4.МОНИТОР С ЖИЗНЬЮ (ИЗМЕНЕНИЕ КОЛ-ВА ЖИЗНЕЙ, КОТОРЫЕ ДАЕТ МОНИТОР)

Перейдите к Obj2E_ChkSonic

Obj2E_ChkSonic:
cmpi.b #2,d0 ; does monitor contain Sonic?
bne.s Obj2E_ChkShoes ; if not, branch

ExtraLife:
addq.b #1,($FFFFFE12).w ; add 1 to the number of lives you have
addq.b #1,($FFFFFE1C).w ; add 1 to the lives counter
move.w #$9F,d0
jmp (PlaySound).l ; play extra life music

По умолчанию монитор с жизнью дает 1 жизнь, но это число можно изменить, для этого перейдите к строке

addq.b #1,($FFFFFE12).w ; add 1 to the number of lives you have

Тут не нужно переводить число, просто нужно изменить #1 на то кол-во жизней, которое вы хотите в десятичной системе счисления.

 

5.МОНИТОРЫ С ЭГГМАНОМ И МОНИТОР "S"

 

В оригинальной версии игры, эти мониторы не работают, но используя программу Sonic hacking studio 3, вы в исходном коде можете заметить, что скрипт, для этого монитора уже написан разработчиком
этой программы, но можно для этого монитора написать какой-нибудь другой скрипт по вашему усмотрению, также как и для монитора "S".
Для того, чтобы написать другой скрипт для монитора с Эггманом перейдите к Obj2E_ChkEggman

Obj2E_ChkEggman: ; XREF: Obj2E_Move
addq.b #2,$24(a0)
move.w #29,$1E(a0) ; set timer to #29
move.b $1C(a0),d0
cmpi.b #1,d0 ; does monitor contain Eggman?
bne.s Obj2E_ChkSonic ; if not, branch
ПОСЛЕ ЭТОЙ СТРОКИ УДАЛИТЕ ВСЕ ДО rts; Eggman monitor does nothing И ПИШИТЕ СВОЙ СКРИПТ


if _EGGMANMONITOR_
move.l a0,a1;Запишим a0 в a1, потому что Touch_ChkHurt ждем повреждение объекта
move.l a0,-(sp); push a0 on the stack, and decrement stack pointer
lea ($FFFFD000).w,a0; put Sonic's ram address in a0, because Touch_ChkHurt wants the damaged object to be in a0
jsr Touch_ChkHurt; run the Touch_ChkHurt routine
move.l (sp)+,a0; pop the previous value of a0 from the stack, and increment stack pointer
endc
rts ; Eggman monitor does nothing

 

 

Монитор "S", перейдите к Obj2E_ChkS
Obj2E_ChkS:
cmpi.b #7,d0 ; does monitor contain 'S'?
bne.s Obj2E_ChkEnd ; if not, branch
ПОСЛЕ ЭТОЙ СТРОКИ, ПИШИТЕ СВОЙ СКРИПТ
nop

Вообще, неизвестно, для чего нужен был монитор "S", но предполагается, что этот монитор должен был давать Сонику способность превращаться в Супер Соника.
Вообще, в первой части Sonic the hedgehog, нет способности Супер Соника, конечно можно прописать скрипт для него, но я не знаю как, поэтому давайте просто сделаем так, чтобы
этот монитор давал Сонику вечную неуязвимость и вечный быстрый бег.Для этого, воспользуемся уже существующими скриптами для мониторов с неуязвимостью и быстрым бегом.
Переходим к Obj2E_ChkInvinc (монитор с неуязвимостью) и копируем этот скрипт:

Копируем скрипт, начиная со строки move.b #1,($FFFFFE2D).w ; make Sonic invincible, и заканчивая bne.s Obj2E_NoMusic ; if yes, branch

Obj2E_ChkInvinc:
cmpi.b #5,d0 ; does monitor contain invincibility?
bne.s Obj2E_ChkRings ; if not, branch
move.b #1,($FFFFFE2D).w ; make Sonic invincible
move.w #$4B0,($FFFFD032).w ; time limit for the power-up
move.b #$38,($FFFFD200).w ; load stars object ($3801)
move.b #1,($FFFFD21C).w
move.b #$38,($FFFFD240).w ; load stars object ($3802)
move.b #2,($FFFFD25C).w
move.b #$38,($FFFFD280).w ; load stars object ($3803)
move.b #3,($FFFFD29C).w

 

move.b #$38,($FFFFD2C0).w ; load stars object ($3804)

move.b #4,($FFFFD2DC).w
tst.b ($FFFFF7AA).w ; is boss mode on?
bne.s Obj2E_NoMusic ; if yes, branch
move.w #$98,d0
jmp (PlaySound).l ; play invincibility music



ВОТ ЧТО ДОЛЖНО ПОЛУЧИТЬСЯ:

Obj2E_ChkS:
cmpi.b #7,d0 ; does monitor contain 'S'?
bne.s Obj2E_ChkEnd ; if not, branch
cmpi.b #5,d0 ; does monitor contain invincibility?
bne.s Obj2E_ChkRings ; if not, branch
move.b #1,($FFFFFE2D).w ; make Sonic invincible
move.w #$4B0,($FFFFD032).w ; time limit for the power-up
move.b #$38,($FFFFD200).w ; load stars object ($3801)
move.b #1,($FFFFD21C).w
move.b #$38,($FFFFD240).w ; load stars object ($3802)
move.b #2,($FFFFD25C).w
move.b #$38,($FFFFD280).w ; load stars object ($3803)
move.b #3,($FFFFD29C).w
move.b #$38,($FFFFD2C0).w ; load stars object ($3804)
move.b #4,($FFFFD2DC).w
tst.b ($FFFFF7AA).w ; is boss mode on?
bne.s Obj2E_NoMusic ; if yes, branch
move.w #$98,d0
jmp (PlaySound).l ; play invincibility music

nop

УДАЛЯЕМ СТРОКУ move.w #$4B0,($FFFFD032).w ; time limit for the power-up

 

 

Теперь переходим к Obj2E_ChkShoes

Obj2E_ChkShoes:
cmpi.b #3,d0 ; does monitor contain speed shoes?
bne.s Obj2E_ChkShield ; if not, branch
move.b #1,($FFFFFE2E).w ; set speed shoes flag
move.w #$4B0,($FFFFD034).w ; time limit for the power-up
move.w #$C00,($FFFFF760).w ; change Sonic's top speed
move.w #$18,($FFFFF762).w
move.w #$80,($FFFFF764).w
move.w #$E2,d0
jmp (PlaySound).l ; Speed up the music

КОПИРУЕМ СКРИПТ, НАЧИНАЯ СО СТРОКИ move.b #1,($FFFFFE2E).w ; set speed shoes flag И ЗАКАНЧИВАЯ move.w #$80,($FFFFF764).w

ТАКЖЕ УДАЛЯЕМ СТРОКУ move.w #$4B0,($FFFFD034).w ; time limit for the power-up

ВОТ ЧТО В ИТОГЕ ДОЛЖНО ПОЛУЧИТЬСЯ

Obj2E_ChkS:
cmpi.b #7,d0 ; does monitor contain 'S'?
bne.s Obj2E_ChkEnd ; if not, branch
move.b #1,($FFFFFE2D).w ; make Sonic invincible
move.b #$38,($FFFFD200).w ; load stars object ($3801)
move.b #1,($FFFFD21C).w
move.b #$38,($FFFFD240).w ; load stars object ($3802)
move.b #2,($FFFFD25C).w
move.b #$38,($FFFFD280).w ; load stars object ($3803)
move.b #3,($FFFFD29C).w
move.b #$38,($FFFFD2C0).w ; load stars object ($3804)
move.b #4,($FFFFD2DC).w
move.b #1,($FFFFFE2E).w ; set speed shoes flag
move.w #$C00,($FFFFF760).w ; change Sonic's top speed
nop 

 

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

Obj2E_ChkS:
cmpi.b #7,d0 ; does monitor contain 'S'?
bne.s Obj2E_ChkEnd ; if not, branch
move.b #1,($FFFFFE2D).w ; make Sonic invincible
move.b #$38,($FFFFD200).w ; load stars object ($3801)
move.b #1,($FFFFD21C).w
move.b #$38,($FFFFD240).w ; load stars object ($3802)
move.b #2,($FFFFD25C).w
move.b #$38,($FFFFD280).w ; load stars object ($3803)
move.b #3,($FFFFD29C).w
move.b #$38,($FFFFD2C0).w ; load stars object ($3804)
move.b #4,($FFFFD2DC).w
move.b #1,($FFFFFE2E).w ; set speed shoes flag
move.w #$C00,($FFFFF760).w ; change Sonic's top speed
move.w #$E2,d0
jmp (PlaySound).l ; 
nop 
Теперь, вместо #$E2, мы вводим код музыки, которая нам нужна, посмотреть какой код у какой музыки или звука, можно через Sound test в самой игре

 

Obj2E_ChkS:
cmpi.b #7,d0 ; does monitor contain 'S'?
bne.s Obj2E_ChkEnd ; if not, branch
move.b #1,($FFFFFE2D).w ; make Sonic invincible
move.b #$38,($FFFFD200).w ; load stars object ($3801)
move.b #1,($FFFFD21C).w
move.b #$38,($FFFFD240).w ; load stars object ($3802)
move.b #2,($FFFFD25C).w
move.b #$38,($FFFFD280).w ; load stars object ($3803)
move.b #3,($FFFFD29C).w
move.b #$38,($FFFFD2C0).w ; load stars object ($3804)
move.b #4,($FFFFD2DC).w
move.b #1,($FFFFFE2E).w ; set speed shoes flag
move.w #$C00,($FFFFF760).w ; change Sonic's top speed
move.w #$E2,d0
jmp (PlaySound).l ; 
nop 
Теперь, вместо #$E2, мы вводим код музыки, которая нам нужна, посмотреть какой код у какой музыки или звука, можно через Sound test в самой игре

 

ГАЙД. РЕДАКТИРОВАНИЕ КОЛЕЦ В ИГРЕ

 

1.ИЗМЕНЕНИЕ ЗАСЧИТЫВАНИЯ КОЛЕЦ

По умолчанию, каждое собранное кольцо, добавляет Сонику по 1 кольцу, но это количество можно изменить

Найдите Obj25

Потом перейдите к CollectRing

CollectRing: ; XREF: Obj25_Collect
addq.w #1,($FFFFFE20).w ; add 1 to rings
ori.b #1,($FFFFFE1D).w ; update the rings counter
move.w #$B5,d0 ; play ring sound
cmpi.w #100,($FFFFFE20).w ; do you have < 100 rings?
bcs.s Obj25_PlaySnd ; if yes, branch
bset #1,($FFFFFE1B).w ; update lives counter
beq.s loc_9CA4
cmpi.w #200,($FFFFFE20).w ; do you have < 200 rings?
bcs.s Obj25_PlaySnd ; if yes, branch
bset #2,($FFFFFE1B).w ; update lives counter
bne.s Obj25_PlaySnd

В СТРОКЕ addq.w #1,($FFFFFE20).w ; add 1 to rings ИЗМЕНИТЕ #1 НА НУЖНОЕ ВАМ КОЛИЧЕСТВО КОЛЕЦ (ПРОСТО ВВОДИТЕ ОБЫЧНОЕ ДЕСЯТИЧНОЕ ЧИСЛО),например,
вы хотите, чтобы каждое собранное Соником кольцо равнялось 5, измените #1 на #5

2.ИЗМЕНЕНИЕ КОЛИЧЕСТВА КОЛЕЦ,ЗА КОТОРОЕ СОНИК ПОЛУЧАЕТ ЖИЗНЬ

в строке cmpi.w #100,($FFFFFE20).w ; do you have < 100 rings? измените #100 на нужное вам количество колец, также в десятичной системе. Допустим, вы хотите, чтобы
жизнь давалась не за 100, а за 50 собранных колец, измените #100 на #50

 

 

3.РАССЫПАЮЩИЕСЯ КОЛЬЦА (ИЗМЕНЕНИЕ КОЛИЧЕСТВА)

Когда Соник получает поражение, у него рассыпаются кольца, максимальное количество, которое он может успеть собрать это 32 кольца, это количество
можно увеличить или уменьшить.

Найдите Obj37

Потом перейдите к Obj37_CountRings

Obj37_CountRings: ; XREF: Obj37_Index
movea.l a0,a1
moveq #0,d5
move.w ($FFFFFE20).w,d5 ; check number of rings you have
moveq #32,d0
cmp.w d0,d5 ; do you have 32 or more?
bcs.s loc_9CDE ; if not, branch
move.w d0,d5 ; if yes, set d5 to 32

loc_9CDE:
subq.w #1,d5
move.w #$288,d4
bra.s Obj37_MakeRings

в строке moveq #32,d0 измените #32 на нужное вам количество колец

 

РЕДАКТИРОВАНИЕ СОНИКА

1.ВЫСОТА ПРЫЖКА

Найдите Obj01

Потом перейдите к Sonic_Jump

Sonic_Jump: ; XREF: Obj01_MdNormal; Obj01_MdRoll
tpress A+B+C,(SonicControl) ; is A, B or C pressed?
beq.w locret_1348E ; if not, branch
moveq #0,d0
move.b $26(a0),d0
addi.b #$80,d0
bsr.w sub_14D48
cmpi.w #6,d1
blt.w locret_1348E
move.w #$680,d2
btst #6,$22(a0)
beq.s loc_1341C
move.w #$380,d2

 

в строке move.w #$680,d2 нужно изменить значение #$680.Допустим, вам захотелось увеличить высоту прыжка Соника в 2 раза, умножаем 680 (в шестнадцатеричной системе

счисления hex) на 2 , с помощью калькулятора, получилось D00, чтобы увеличить в 3 раза, умножте D00 (hex) на 2 и т.д., для уменьшения, наобарот нужно делить на 2

Категория: Гайды по хакингу Sonic 1 | Добавил: tntheromhacker (18.08.2016)
Просмотров: 825 | Рейтинг: 5.0/1
Всего комментариев: 0
avatar