Difference between revisions of "Disable floor collision while dying"
From Sonic Retro
KingofHarts (talk | contribs) (Added a bugfix that occurs after the design change.) |
m (Text replacement - "\[\[Category:SCHG How-tos.*" to "") |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | ''(Guide written by [[Esrael]])'' | + | ''(Guide written by [[User:Esrael|Esrael]], Alternate fix by [[User:Flamewing|flamewing]])'' |
− | This is something that you are most likely to notice in [[Chemical Plant Zone]] while fighting the Act 2 boss. When your character dies, he will still detect any floor that is still above him, and if the detection returns a collision, the character will stop, and just drop like a rock, instead of move upwards like he normally does. This is not necessarily a bug, though it can be "fixed". Perform this fix if you don't want your character to detect floor tiles while dying. | + | This is something that you are most likely to notice in [[Chemical Plant Zone]] while fighting the Act 2 boss. When your character dies, he will still detect any floor that is still above him, and if the detection returns a collision, the character will stop, and just drop like a rock, instead of move upwards like he normally does. This is not necessarily a bug, though it can be "fixed". Perform this fix if you don't want your character to detect floor tiles while dying. There are two methods to fixing this, given to us by two of our well respected Tech Members. Both methods work, but ''flamewing'''s method is probably preferred, as it is less likely to cause other bugs with other objects. |
− | == | + | ==Esrael Method (v. 1)== |
Find "loc_1E596" (Xenowhirl) or "Floor_ChkTile" (SVN) | Find "loc_1E596" (Xenowhirl) or "Floor_ChkTile" (SVN) | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
; loc_1E596: | ; loc_1E596: | ||
Floor_ChkTile: | Floor_ChkTile: | ||
Line 17: | Line 17: | ||
; (Sonic 1 calculated it every time instead of using a table) | ; (Sonic 1 calculated it every time instead of using a table) | ||
word_1E5D0: | word_1E5D0: | ||
− | </ | + | </syntaxhighlight> |
and insert the following code: | and insert the following code: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
; loc_1E596: | ; loc_1E596: | ||
Floor_ChkTile: | Floor_ChkTile: | ||
Line 35: | Line 35: | ||
; (Sonic 1 calculated it every time instead of using a table) | ; (Sonic 1 calculated it every time instead of using a table) | ||
word_1E5D0: | word_1E5D0: | ||
− | </ | + | </syntaxhighlight> |
Your character will no longer detect floor tiles above him when dying. | Your character will no longer detect floor tiles above him when dying. | ||
− | ==Fixing a bug with this change== | + | ===Fixing a bug with this change=== |
Now, everything seems well and good... but now I want you to "19, 65, 09, 17" your way over to Death Egg Zone for a minute. go to the Metal Sonic boss fight. You will notice that your robot adversary falls through the floor. WHY? Well, it's simple. Silver Sonic can't detect the floor with our fix, due to the fact that his initial animation shares the same id as Sonic/Tails while dying. To fix this, add the following lines to the code: | Now, everything seems well and good... but now I want you to "19, 65, 09, 17" your way over to Death Egg Zone for a minute. go to the Metal Sonic boss fight. You will notice that your robot adversary falls through the floor. WHY? Well, it's simple. Silver Sonic can't detect the floor with our fix, due to the fact that his initial animation shares the same id as Sonic/Tails while dying. To fix this, add the following lines to the code: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
; loc_1E596: | ; loc_1E596: | ||
Floor_ChkTile: | Floor_ChkTile: | ||
Line 64: | Line 64: | ||
; (Sonic 1 calculated it every time instead of using a table) | ; (Sonic 1 calculated it every time instead of using a table) | ||
word_1E5D0: | word_1E5D0: | ||
− | </ | + | </syntaxhighlight> |
Silver Sonic should behave like he is supposed to again... That's good! Oh, wait... now we gotta fight him. Shit. | Silver Sonic should behave like he is supposed to again... That's good! Oh, wait... now we gotta fight him. Shit. | ||
+ | |||
+ | ==flamewing's method (v. 2)== | ||
+ | |||
+ | For Sonic, find this block of code: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | Sonic_Boundary_Bottom: ;; | ||
+ | bra.w JmpTo_KillCharacter | ||
+ | ; =========================================================================== | ||
+ | ; loc_1A9BA: | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | and change it to this: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | Sonic_Boundary_Bottom: ;; | ||
+ | addq.l #4,sp | ||
+ | bra.w JmpTo_KillCharacter | ||
+ | ; =========================================================================== | ||
+ | ; loc_1A9BA: | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | For Tails, the relevant code block is this: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | Tails_Boundary_Bottom: ;; | ||
+ | bra.w JmpTo2_KillCharacter | ||
+ | ; =========================================================================== | ||
+ | ; loc_1C5A0: | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Do the same change as was done for Sonic. | ||
+ | |||
+ | These changes will cause Sonic (and Tails) to skip some subroutines for the current control mode; this includes some that move Sonic (or Tails) and either make Sonic/Tails follow the ground or collide with the level. This will only happen during one frame; starting the next frame will work as normal since a different subroutine will be used. Being crushed by objects, drowning and being killed by badniks don't need to be changed because they all happen after the physics updates, and will only make effect on the next frame. | ||
{{S2Howtos}} | {{S2Howtos}} | ||
− | + | |Disable floor collision while dying]] |
Latest revision as of 11:11, 25 August 2018
(Guide written by Esrael, Alternate fix by flamewing)
This is something that you are most likely to notice in Chemical Plant Zone while fighting the Act 2 boss. When your character dies, he will still detect any floor that is still above him, and if the detection returns a collision, the character will stop, and just drop like a rock, instead of move upwards like he normally does. This is not necessarily a bug, though it can be "fixed". Perform this fix if you don't want your character to detect floor tiles while dying. There are two methods to fixing this, given to us by two of our well respected Tech Members. Both methods work, but flamewing's method is probably preferred, as it is less likely to cause other bugs with other objects.
Esrael Method (v. 1)
Find "loc_1E596" (Xenowhirl) or "Floor_ChkTile" (SVN)
; loc_1E596:
Floor_ChkTile:
move.w d2,d0
....
movea.l d1,a1
rts
; ===========================================================================
; precalculated values for Floor_ChkTile
; (Sonic 1 calculated it every time instead of using a table)
word_1E5D0:
and insert the following code:
; loc_1E596:
Floor_ChkTile:
move.w d2,d0
....
movea.l d1,a1
cmpi.b #$06, $0024(A0)
bne.s Player_Not_Death
move.l #$FFFF0000, A1
Player_Not_Death:
rts
; ===========================================================================
; precalculated values for Floor_ChkTile
; (Sonic 1 calculated it every time instead of using a table)
word_1E5D0:
Your character will no longer detect floor tiles above him when dying.
Fixing a bug with this change
Now, everything seems well and good... but now I want you to "19, 65, 09, 17" your way over to Death Egg Zone for a minute. go to the Metal Sonic boss fight. You will notice that your robot adversary falls through the floor. WHY? Well, it's simple. Silver Sonic can't detect the floor with our fix, due to the fact that his initial animation shares the same id as Sonic/Tails while dying. To fix this, add the following lines to the code:
; loc_1E596:
Floor_ChkTile:
move.w d2,d0
....
movea.l d1,a1
;--------------------------------------
cmpi.b #$06, $0024(A0)
bne.s Player_Not_Death
cmpi.b #$01, (A0) ; Is Sonic
beq.s Player_Death ;
cmpi.b #$02, (A0) ; Is Miles
bne.s Player_Not_Death ;
Player_Death: ;
move.l #$FFFF0000, A1
Player_Not_Death:
;---------------------------------------
rts
; ===========================================================================
; precalculated values for Floor_ChkTile
; (Sonic 1 calculated it every time instead of using a table)
word_1E5D0:
Silver Sonic should behave like he is supposed to again... That's good! Oh, wait... now we gotta fight him. Shit.
flamewing's method (v. 2)
For Sonic, find this block of code:
Sonic_Boundary_Bottom: ;;
bra.w JmpTo_KillCharacter
; ===========================================================================
; loc_1A9BA:
and change it to this:
Sonic_Boundary_Bottom: ;;
addq.l #4,sp
bra.w JmpTo_KillCharacter
; ===========================================================================
; loc_1A9BA:
For Tails, the relevant code block is this:
Tails_Boundary_Bottom: ;;
bra.w JmpTo2_KillCharacter
; ===========================================================================
; loc_1C5A0:
Do the same change as was done for Sonic.
These changes will cause Sonic (and Tails) to skip some subroutines for the current control mode; this includes some that move Sonic (or Tails) and either make Sonic/Tails follow the ground or collide with the level. This will only happen during one frame; starting the next frame will work as normal since a different subroutine will be used. Being crushed by objects, drowning and being killed by badniks don't need to be changed because they all happen after the physics updates, and will only make effect on the next frame.
|Disable floor collision while dying]]