Сайт Влада

Как добавить Jump Dash

Автор гида: vladikcomper

Jump 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.