Сайт Влада

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

Автор гида: vladikcomper
Вторая версия

Я все-таки решился раскрыть свой код Jump Dash'а. Не бойтесь, вставить Jump Dash намного легче, чем Spin Dash.

Идите к суброутине Obj01_MdJump2 и добавьте после «bsr.w Sonic_LevelBound» строчку «bsr.w Sonic_JumpDash», получится вот так:

Obj01_MdJump2:					; 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)

Сделайте то же самое в суброутине Obj01_MdJump2

Теперь напишем саму суброутину Sonic_JumpDash. Я лично вставил ее после Sonic_JumpHeight. Для этого найдите строчку «; End of function Sonic_JumpHeight» — это конец суброутины. Сразу после нее вставьте новый код:

; ---------------------------------------------------------------------------
; 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

Постройте РОМ, опробуйте новую способность. Новый Jump Dash срабатывает только один раз, после чего отказывается работать. Дело в том, что он использует флаг, который устанавливается после рывка, чтобы предотвратить повторный Jump Dash в воздухе. Флаг этот располагается по адресу $22(a0), в восьмом бите. Если бит равен единице, то повторно Jump Dash не произойдет. Но флаг нужно сбрасывать при приземлении, чтобы дать Сонику возможность снова совершать Jump Dash.

Для исправления бага, идите к лейбелу Sonic_ResetOnFloor и добавьте прямо после него строчку:

		bclr    #7,$22(a0)

Отлично! Теперь у вас есть полноценный Jump Dash. Однако осталась одна небольшая недоработка, связанная с работой движка Первого Соника: в игре есть скоростной барьер (Speed Cap), который сильно уменьшает скорость Jump Dash'а. Для того, чтобы это исправить, опробуйте гид «Как убрать Speed Cap»