Как добавить Jump Dash в Sonic 2
Jump Dash — способность Соника совершать мнгновенный рывок вперед, находясь в воздухе в свернутом в клубок состоянии. В этом гиде я расскажу о том, как добавить полноценный Jump Dash с исправлением всех багов.
Обрати внимание на то, что код в гиде написан под дизасембл второго Соника от Xenowhirl, 2007 года.
В исходном коде игры найди суброутину Obj01_MdJump и добавь над «bsr.w Sonic_JumpAngle» строчку:
<asm> bsr.w Sonic_JumpDash ;++ branch to Jump Dash subroutine </asm>
Теперь нужно вставить саму суброутину, отвечающую за Jump Dash. Я лично вставил ее после функции Sonic_Jump. Найди конец функции, строчку «; End of function Sonic_Jump» и после нее вставь новую суброутину:
<asm>
- ---------------------------------------------------------------------------
- Subroutine to do Jump Dash (code by Vladikcomper)
- ---------------------------------------------------------------------------
- ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
Sonic_JumpDash: cmpi.b #2,anim(a0) ; is Sonic rolling? bne.s Sonic_JumpDash_Rts ; if no, branch btst #7,status(a0) ; was Jump Dash flag set? bne.s Sonic_JumpDash_Rts ; if yes, branch move.b (Ctrl_1_Press_Logical).w,d0 andi.b #$70,d0 ; is A,B or C pressed? beq.w Sonic_JumpDash_Rts ; if no, branch move.w #$BC,d0 ; play sound jsr (PlaySound).l bset #7,status(a0) ; set Jump Dash flag move.w #$900,x_vel(a0) ; set Jump Dash speed move.w #0,y_vel(a0) ; clear Y-velocity btst #0,status(a0) ; is sonic facing left? beq.s Sonic_JumpDash_Rts ; if no, branch neg.w x_vel(a0) ; negate X-velocity
Sonic_JumpDash_Rts: rts
- End of function Sonic_JumpDash
</asm>
Построй РОМ, опробуй новую способность. Новый Jump Dash срабатывает только один раз, после чего отказывается работать. Дело в том, что он использует флаг, который устанавлиется после рывка, чтобы предотвратить повторный Jump Dash в воздухе. Флаг этот располагается по адресу status(a0), в восьмом бите. Если бит равен единице, то повторно Jump Dash не произойдет. Но флаг нужно сбрасывать при приземлении, чтобы дать Сонику возможность снова совершать Jump Dash.
Для исправления бага, иди к лейбелу Sonic_ResetOnFloor и добавь прямо после него строчку:
<asm> bclr #7,status(a0) </asm>
Теперь при приземлении флаг Jump Dash будет очищаться и Соник снова сможет совершать Jump Dash.
Построй РОМ, если все сделано правильно, Jump Dash примет нормальный вид. Однако останется еще один баг: при приземлении на объекты (мостик, платформ и пр.) игра не будет сбрасывать флаг Jump Dash, так как при призимлении на них суброутина Sonic_ResetOnFloor не запускается.
Когда Соник становится на объект, четвертый бит байта status(a0) устанавливается как единица. Нужно добавить на это проверку. Иди к суброутине Obj01_Control и над строчкой «tst.b (Control_Locked).w ; are controls locked?» вставь этот кусок кода:
<asm> + btst #3,status(a0) ; is Sonic standing on an object? beq.s + ; if no, branch bclr #7,status(a0) ; clear Jump Dash flag </asm>
Последний баг, который необходимо исправить, это баг со скоростью Jump Dash. Попробуй совершить Jump Dash, зажав кнопку Влево или Вправо, а затем без зажатия этих кнопок. Скорость рывка будет разной. Это из-за скоростного барьера (Speed Cap). Чтобы исправить баг, найдите все строчки:
<asm> move.w #$600,(Sonic_top_speed).w </asm>
И замени их на:
<asm> move.w #$900,(Sonic_top_speed).w </asm>
Построй РОМ. Теперь у тебя есть полноценный безглючный Jump Dash.