Как добавить Jump Dash в Sonic 1
(Оригинальное руководство написано vladikcomper)
Не бойтесь, вставить Jump Dash намного легче, чем Spin Dash.
Идите к суброутине Obj01_MdJump и добавьте после «bsr.w Sonic_LevelBound» строчку «bsr.w Sonic_JumpDash», получится вот так:
<asm> Obj01_MdJump: ; XREF: Obj01_Modes bsr.w Sonic_JumpHeight bsr.w Sonic_ChgJumpDir bsr.w Sonic_LevelBound bsr.w Sonic_JumpDash ; ++ branch to JumpDash subroutine jsr ObjectFall btst #6,$22(a0) beq.s loc_12E5C subi.w #$28,$12(a0) </asm>
Сделайте то же самое в суброутине Obj01_MdJump2
Теперь напишем саму суброутину Sonic_JumpDash. Я лично вставил её после Sonic_JumpHeight. Для этого найдите строчку «; End of function Sonic_JumpHeight» — это конец суброутины. Сразу после неё вставьте новый код:
<asm>
- ---------------------------------------------------------------------------
- Subroutine to do Jump Dash (code by Vladikcomper)
- ---------------------------------------------------------------------------
- ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
Sonic_JumpDash: cmpi.b #2,$1C(a0) ; is Sonic rolling? bne.s Sonic_JD_Rts ; if no, branch btst #7,$22(a0) ; was Jump Dash flag set? bne.s Sonic_JD_Rts ; if yes, branch move.b ($FFFFF603).w,d0 andi.b #$70,d0 ; is A,B or C pressed? beq.w Sonic_JD_Rts ; if no, branch bset #7,$22(a0) ; set Jump Dash flag move.w #$BC,d0 ; play JD sound jsr (PlaySound_Special).l ; move.w #$900,$10(a0) ; set Jump Dash speed move.w #0,$12(a0) ; clear Y-velocity btst #6,$22(a0) ; is Sonic underwater? beq.s Sonic_JD_ChkShoes sub.w #$300,$10(a0) ; set speed to $600
Sonic_JD_ChkShoes: tst.b ($FFFFFE2E).w ; does Sonic have speed shoes? beq.s Sonic_JD_ChkOrientation ; if not, branch add.w #$200,$10(a0) ; set speed to $B00 or $500 if underwater
Sonic_JD_ChkOrientation: btst #0,$22(a0) beq.s Sonic_JD_Rts neg.w $10(a0)
Sonic_JD_Rts: rts
- End of function Sonic_JumpDash
</asm>
Постройте РОМ, опробуйте новую способность. Новый Jump Dash срабатывает только один раз, после чего отказывается работать. Дело в том, что он использует флаг, который устанавлиется после рывка, чтобы предотвратить повторный Jump Dash в воздухе. Флаг этот располагается по адресу $22(a0), в восьмом бите. Если бит равен единице, то повторно Jump Dash не произойдет. Но флаг нужно сбрасывать при приземлении, чтобы дать Сонику возможность снова совершать Jump Dash.
Для исправления бага, идите к лейбелу Sonic_ResetOnFloor и добавьте прямо после него строчку:
<asm> bclr #7,$22(a0) </asm>
Отлично! Теперь у вас есть полноценный Jump Dash. Однако осталась одна небольшая недоработка, связанная с работой движка Sonic 1: в игре есть скоростной барьер (Speed Cap), который сильно уменьшает скорость Jump Dash'а. Для того, чтобы это исправить, попробуйте гид "Как убрать лимит скорости в Sonic 1".