Difference between revisions of "Disable floor collision while dying"
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 6: | Line 6: | ||
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 20: | Line 20: | ||
and insert the following code: | and insert the following code: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
; loc_1E596: | ; loc_1E596: | ||
Floor_ChkTile: | Floor_ChkTile: | ||
Line 42: | Line 42: | ||
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 71: | Line 71: | ||
For Sonic, find this block of code: | For Sonic, find this block of code: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
Sonic_Boundary_Bottom: ;; | Sonic_Boundary_Bottom: ;; | ||
bra.w JmpTo_KillCharacter | bra.w JmpTo_KillCharacter | ||
Line 79: | Line 79: | ||
and change it to this: | and change it to this: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
Sonic_Boundary_Bottom: ;; | Sonic_Boundary_Bottom: ;; | ||
addq.l #4,sp | addq.l #4,sp | ||
Line 88: | Line 88: | ||
For Tails, the relevant code block is this: | For Tails, the relevant code block is this: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
Tails_Boundary_Bottom: ;; | Tails_Boundary_Bottom: ;; | ||
bra.w JmpTo2_KillCharacter | bra.w JmpTo2_KillCharacter |
Revision as of 21:46, 20 December 2015
(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.