Actions

SCHG How-to

Remove the Air Speed Cap

From Sonic Retro

Revision as of 14:54, 3 August 2010 by Selbi (talk | contribs) (Created page with '''(Guide written by Selbi; code by Puto, taken from the Sonic 1 Speed Cap page)'' In Sonic 1 is a function, that limits Sonic's …')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

(Guide written by Selbi; code by Puto, taken from the Sonic 1 Speed Cap page)

In Sonic 1 is a function, that limits Sonic's top speed when you are keeping pressing in the direction you are looking at (you can feel that best when running down a hill). In Sonic 2 this function doesn't apply; well, at least not completely. Running on the ground works just fine, but in the air you still have it. So let's fix that:

Go to Sonic_ChgJumpDir, which should look like this: <asm>Sonic_ChgJumpDir: move.w (Sonic_top_speed).w,d6 move.w (Sonic_acceleration).w,d5 asl.w #1,d5 btst #4,status(a0) ; did Sonic jump from rolling? bne.s Obj01_Jump_ResetScr ; if yes, branch to skip midair control move.w x_vel(a0),d0 btst #2,(Ctrl_1_Held_Logical).w beq.s + ; if not holding left, branch

bset #0,status(a0) sub.w d5,d0 ; add acceleration to the left move.w d6,d1 neg.w d1 cmp.w d1,d0 ; compare new speed with top speed bgt.s + ; if new speed is less than the maximum, branch move.w d1,d0 ; limit speed in air going left, even if Sonic was already going faster (speed limit/cap) + btst #3,(Ctrl_1_Held_Logical).w beq.s + ; if not holding right, branch

bclr #0,status(a0) add.w d5,d0 ; accelerate right in the air cmp.w d6,d0 ; compare new speed with top speed blt.s + ; if new speed is less than the maximum, branch move.w d6,d0 ; limit speed in air going right, even if Sonic was already going faster (speed limit/cap)

Obj01_JumpMove

+ move.w d0,x_vel(a0)</asm> If you look closely, you will notice that this code works excactly like in Sonic 1. This is good, because we can use the excact same methods to fix it. After the line bgt.s + ; if new speed is less than the maximum, branch add these lines: <asm> add.w d5,d0 ; +++ air speed cap fix cmp.w d1,d0 ; +++ air speed cap fix ble.s + ; +++ air speed cap fix</asm> Do the same thing after blt.s + ; if new speed is less than the maximum, branch by using these lines: <asm> sub.w d5,d0 ; +++ air speed cap fix cmp.w d6,d0 ; +++ speed cap fix bge.s + ; +++ air air speed cap fix</asm>

The final result should look like this: <asm>Sonic_ChgJumpDir: move.w (Sonic_top_speed).w,d6 move.w (Sonic_acceleration).w,d5 asl.w #1,d5 btst #4,status(a0) ; did Sonic jump from rolling? bne.s Obj01_Jump_ResetScr ; if yes, branch to skip midair control move.w x_vel(a0),d0 btst #2,(Ctrl_1_Held_Logical).w beq.s + ; if not holding left, branch

bset #0,status(a0) sub.w d5,d0 ; add acceleration to the left move.w d6,d1 neg.w d1 cmp.w d1,d0 ; compare new speed with top speed bgt.s + ; if new speed is less than the maximum, branch add.w d5,d0 ; +++ air speed cap fix cmp.w d1,d0 ; +++ air speed cap fix ble.s + ; +++ air speed cap fix move.w d1,d0 ; limit speed in air going left, even if Sonic was already going faster (speed limit/cap) + btst #3,(Ctrl_1_Held_Logical).w beq.s + ; if not holding right, branch

bclr #0,status(a0) add.w d5,d0 ; accelerate right in the air cmp.w d6,d0 ; compare new speed with top speed blt.s + ; if new speed is less than the maximum, branch sub.w d5,d0 ; +++ air speed cap fix cmp.w d6,d0 ; +++ air speed cap fix bge.s + ; +++ air speed cap fix move.w d6,d0 ; limit speed in air going right, even if Sonic was already going faster (speed limit/cap)

Obj01_JumpMove

+ move.w d0,x_vel(a0)</asm>