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
|