Как добавить Jump Dash
Автор гида: vladikcomperJump Dash — способность Соника совершать мгновенный рывок вперед, находясь в воздухе в свернутом в клубок состоянии. В этом гиде я расскажу о том, как добавить полноценный Jump Dash с исправлением всех багов.
Обратите внимание на то, что код в гиде написан под дизасембл Второго Соника от Xenowhirl, 2007 года.
В исходном коде игры найдите суброутину Obj01_MdJump и добавьте над «bsr.w Sonic_JumpAngle» строчку:
bsr.w Sonic_JumpDash ;++ branch to Jump Dash subroutine
Теперь нужно вставить саму суброутину, отвечающую за Jump Dash. Я лично вставил ее после функции Sonic_Jump. Найдите конец функции, строчку «; End of function Sonic_Jump» и после нее вставьте новую суброутину:
; --------------------------------------------------------------------------- ; 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
Постройте РОМ, опробуйте новую способность. Новый Jump Dash срабатывает только один раз, после чего отказывается работать. Дело в том, что он использует флаг, который устанавливается после рывка, чтобы предотвратить повторный Jump Dash в воздухе. Флаг этот располагается по адресу status(a0), в восьмом бите. Если бит равен единице, то повторно Jump Dash не произойдет. Но флаг нужно сбрасывать при приземлении, чтобы дать Сонику возможность снова совершать Jump Dash.
Для исправления бага, идите к лейбелу Sonic_ResetOnFloor и добавьте прямо после него строчку:
bclr #7,status(a0)
Теперь при приземлении флаг Jump Dash будет очищаться и Соник снова сможет совершать Jump Dash.
Постройте РОМ, если все сделано правильно, Jump Dash примет нормальный вид. Однако останется еще один баг: при приземлении на объекты (мостик, платформ и пр.) игра не будет сбрасывать флаг Jump Dash, так как при приземлении на них суброутина Sonic_ResetOnFloor не запускается.
Когда Соник становится на объект, четвертый бит байта status(a0) устанавливается как единица. Нужно добавить на это проверку. Идите к суброутине Obj01_Control и над строчкой «tst.b (Control_Locked).w ; are controls locked?» вставьте этот кусок кода:
+ btst #3,status(a0) ; is Sonic standing on an object? beq.s + ; if no, branch bclr #7,status(a0) ; clear Jump Dash flag
Последний баг, который необходимо исправить, это баг со скоростью Jump Dash. Попробуйте совершить Jump Dash зажав кнопку Влево или Вправо, а затем без зажатия этих кнопок. Скорость рывка будет разной. Это из-за скоростного барьера в воздухе (Air Speed Cap), чтобы убрать его, воспользуйтесь гидом «Как убрать Air Speed Cap»
Постройте РОМ. Теперь у Вас есть полноценный безглючный Jump Dash.