Difference between revisions of "Add Spin Dash to Sonic 1/Part 4"
From Sonic Retro
Scarred Sun (talk | contribs) m (Text replacement - "</asm>" to "</syntaxhighlight>") |
Scarred Sun (talk | contribs) m (Text replacement - "<asm>" to "<syntaxhighlight lang="asm">") |
||
Line 3: | Line 3: | ||
==2005 HiveBrain's disassembly== | ==2005 HiveBrain's disassembly== | ||
This will fix the issue which causes weird camera movements if the player performs a Spin Dash at the very beginning of a level since the camera will try to follow bad data from the array of Sonic's previous positions. The following code therefore clears the aforementioned array and should be added right after the loc_60D0 label: | This will fix the issue which causes weird camera movements if the player performs a Spin Dash at the very beginning of a level since the camera will try to follow bad data from the array of Sonic's previous positions. The following code therefore clears the aforementioned array and should be added right after the loc_60D0 label: | ||
− | <asm> clr.w ($FFFFF7A8).w ; reset Sonic's position tracking index | + | <syntaxhighlight lang="asm"> clr.w ($FFFFF7A8).w ; reset Sonic's position tracking index |
lea ($FFFFCB00).w,a2 ; load the tracking array into a2 | lea ($FFFFCB00).w,a2 ; load the tracking array into a2 | ||
moveq #63,d2 ; begin a 64-step loop | moveq #63,d2 ; begin a 64-step loop | ||
Line 13: | Line 13: | ||
There is one stupid bug we haven't looked at: Going through objects. This is rather annoying bug, and can be used to glitch the game. So why not fix this. Obviously it wont fix all the problems, but using springs to make screen delay like crazy is easiest way to do this glitch. So, add following just before Obj41_AniLR: label: | There is one stupid bug we haven't looked at: Going through objects. This is rather annoying bug, and can be used to glitch the game. So why not fix this. Obviously it wont fix all the problems, but using springs to make screen delay like crazy is easiest way to do this glitch. So, add following just before Obj41_AniLR: label: | ||
− | <asm> move.w #0,($FFFFC904).w ; clear screen delay counter</syntaxhighlight> | + | <syntaxhighlight lang="asm"> move.w #0,($FFFFC904).w ; clear screen delay counter</syntaxhighlight> |
And finally, there's an annoying bug that occurs when rolling into a [[Caterkiller]] too fast, which will result Sonic in taking damage despite the head being destroyed already. This happens because the spiked body segments are actually not getting deleted immediately after destroying the head, but rather one frame later. To fix this, go to loc_16C7C: and right below the label add: | And finally, there's an annoying bug that occurs when rolling into a [[Caterkiller]] too fast, which will result Sonic in taking damage despite the head being destroyed already. This happens because the spiked body segments are actually not getting deleted immediately after destroying the head, but rather one frame later. To fix this, go to loc_16C7C: and right below the label add: | ||
− | <asm> clr.b $20(a1) ; immediately remove all touch response values when destroying the head to avoid taking damage</syntaxhighlight> | + | <syntaxhighlight lang="asm"> clr.b $20(a1) ; immediately remove all touch response values when destroying the head to avoid taking damage</syntaxhighlight> |
Line 23: | Line 23: | ||
This will fix the issue which causes weird camera movements if the player performs a Spin Dash at the very beginning of a level since the camera will try to follow bad data from the array of Sonic's previous positions. The following code therefore clears the aforementioned array. Open '''_inc\LevelSizeLoad & BgScrollSpeed.asm''' (or its JP1 counterpart if you have the JP1 revision enabled), and add theese lines at the beggining or the LevSz_SkipStartPos label: | This will fix the issue which causes weird camera movements if the player performs a Spin Dash at the very beginning of a level since the camera will try to follow bad data from the array of Sonic's previous positions. The following code therefore clears the aforementioned array. Open '''_inc\LevelSizeLoad & BgScrollSpeed.asm''' (or its JP1 counterpart if you have the JP1 revision enabled), and add theese lines at the beggining or the LevSz_SkipStartPos label: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
clr.w (v_trackpos).w ; reset Sonic's position tracking index | clr.w (v_trackpos).w ; reset Sonic's position tracking index | ||
lea (v_tracksonic).w,a2 ; load the tracking array into a2 | lea (v_tracksonic).w,a2 ; load the tracking array into a2 | ||
Line 35: | Line 35: | ||
There is one little bug we haven't looked at: Going through objects. This is rather annoying bug, and can be used to glitch the game, so why not fix this. Obviously it wont fix all the problems, but using springs to make screen delay like crazy is easiest way to do this glitch. So, add following just before '''Spring_AniLR''' label: | There is one little bug we haven't looked at: Going through objects. This is rather annoying bug, and can be used to glitch the game, so why not fix this. Obviously it wont fix all the problems, but using springs to make screen delay like crazy is easiest way to do this glitch. So, add following just before '''Spring_AniLR''' label: | ||
− | <asm> move.w #0,($FFFFC904).w ; clear screen delay counter</syntaxhighlight> | + | <syntaxhighlight lang="asm"> move.w #0,($FFFFC904).w ; clear screen delay counter</syntaxhighlight> |
And finally, there's an annoying bug that occurs when rolling into a [[Caterkiller]] too fast, which will result Sonic in taking damage despite the head being destroyed already. This happens because the spiked body segments are actually not getting deleted immediately after destroying the head, but rather one frame later. To fix this, go to loc_16C7C: and right below the label add: | And finally, there's an annoying bug that occurs when rolling into a [[Caterkiller]] too fast, which will result Sonic in taking damage despite the head being destroyed already. This happens because the spiked body segments are actually not getting deleted immediately after destroying the head, but rather one frame later. To fix this, go to loc_16C7C: and right below the label add: | ||
− | <asm> clr.b obColType(a1) ; immediately remove all touch response values when destroying the head to avoid taking damage</syntaxhighlight> | + | <syntaxhighlight lang="asm"> clr.b obColType(a1) ; immediately remove all touch response values when destroying the head to avoid taking damage</syntaxhighlight> |
Revision as of 21:44, 20 December 2015
(Original guide by Mercury)
2005 HiveBrain's disassembly
This will fix the issue which causes weird camera movements if the player performs a Spin Dash at the very beginning of a level since the camera will try to follow bad data from the array of Sonic's previous positions. The following code therefore clears the aforementioned array and should be added right after the loc_60D0 label:
clr.w ($FFFFF7A8).w ; reset Sonic's position tracking index
lea ($FFFFCB00).w,a2 ; load the tracking array into a2
moveq #63,d2 ; begin a 64-step loop
@looppoint:
move.w d1,(a2)+ ; fill in X
move.w d0,(a2)+ ; fill in Y
dbf d2,@looppoint ; loop
There is one stupid bug we haven't looked at: Going through objects. This is rather annoying bug, and can be used to glitch the game. So why not fix this. Obviously it wont fix all the problems, but using springs to make screen delay like crazy is easiest way to do this glitch. So, add following just before Obj41_AniLR: label:
move.w #0,($FFFFC904).w ; clear screen delay counter
And finally, there's an annoying bug that occurs when rolling into a Caterkiller too fast, which will result Sonic in taking damage despite the head being destroyed already. This happens because the spiked body segments are actually not getting deleted immediately after destroying the head, but rather one frame later. To fix this, go to loc_16C7C: and right below the label add:
clr.b $20(a1) ; immediately remove all touch response values when destroying the head to avoid taking damage
GitHub disassembly
This will fix the issue which causes weird camera movements if the player performs a Spin Dash at the very beginning of a level since the camera will try to follow bad data from the array of Sonic's previous positions. The following code therefore clears the aforementioned array. Open _inc\LevelSizeLoad & BgScrollSpeed.asm (or its JP1 counterpart if you have the JP1 revision enabled), and add theese lines at the beggining or the LevSz_SkipStartPos label:
clr.w (v_trackpos).w ; reset Sonic's position tracking index
lea (v_tracksonic).w,a2 ; load the tracking array into a2
moveq #63,d2 ; begin a 64-step loop
@looppoint:
move.w d1,(a2)+ ; fill in X
move.w d0,(a2)+ ; fill in Y
dbf d2,@looppoint ; loop
There is one little bug we haven't looked at: Going through objects. This is rather annoying bug, and can be used to glitch the game, so why not fix this. Obviously it wont fix all the problems, but using springs to make screen delay like crazy is easiest way to do this glitch. So, add following just before Spring_AniLR label:
move.w #0,($FFFFC904).w ; clear screen delay counter
And finally, there's an annoying bug that occurs when rolling into a Caterkiller too fast, which will result Sonic in taking damage despite the head being destroyed already. This happens because the spiked body segments are actually not getting deleted immediately after destroying the head, but rather one frame later. To fix this, go to loc_16C7C: and right below the label add:
clr.b obColType(a1) ; immediately remove all touch response values when destroying the head to avoid taking damage
That's it!