Dynamic Collision system in Sonic 1
From Sonic Retro
(Original guide by Theocas)
This system works best with the dynamic art and palette system, but if every zone has the same art and you still want dynamic collision for some reason, read on. I originally wrote this over on SSRG, but I thought I might as well add it here. This tutorial will tell you how to load different collision indexes for each act, with support for a 4th act. First of all, find ColIndexLoad: in your disasm. move.l ColPointers(pc,d0.w),($FFFFF796).w
ColIndexLoad: ; XREF: Level
moveq #0,d0
move.b ($FFFFFE10).w,d0
lsl.w #2,d0
cmp.b #$00, ($FFFFFE11).w
beq.s ColIndexLoadAct1
cmp.b #$01, ($FFFFFE11).w
beq.s ColIndexLoadAct2
cmp.b #$02, ($FFFFFE11).w
beq.s ColIndexLoadAct3
cmp.b #$03, ($FFFFFE11).w
beq.s ColIndexLoadAct4
Now Make the subroutines you just created read like so:
ColIndexLoadAct1:
move.l ColPointers(pc,d0.w),($FFFFF796).w
bra.w ColIndexLoad_locret
ColIndexLoadAct2:
move.l ColPointers2(pc,d0.w),($FFFFF796).w
bra.w ColIndexLoad_locret
ColIndexLoadAct3:
move.l ColPointers3(pc,d0.w),($FFFFF796).w
bra.w ColIndexLoad_locret
ColIndexLoadAct4:
move.l ColPointers4(pc,d0.w),($FFFFF796).w
bra.w ColIndexLoad_locret
ColIndexLoad_locret:
rts
Oh, yeah, the ColIndexLoad_locret method. Can you guess what it does? It simply contains and rts, or Return To Subroutine. Now for actually adding those pointers for each additional act. See this line?
ColPointers:
include "_inc\Collision index pointers.asm"
As you might have guessed, make 3 copies of that line, but adding the numbers 2, 3 and 4 to ColPointers and the file name before .asm. If you did it correctly, it will look like this:
; ---------------------------------------------------------------------------
; Collision index pointers for Act 1
; ---------------------------------------------------------------------------
ColPointers:
include "_inc\Collision index pointers.asm"
; ---------------------------------------------------------------------------
; Collision index pointers for Act 2
; ---------------------------------------------------------------------------
ColPointers2:
include "_inc\Collision index pointers2.asm"
; ---------------------------------------------------------------------------
; Collision index pointers for Act 3
; ---------------------------------------------------------------------------
ColPointers3:
include "_inc\Collision index pointers3.asm"
; ---------------------------------------------------------------------------
; Collision index pointers for Act 4
; ---------------------------------------------------------------------------
ColPointers4:
include "_inc\Collision index pointers4.asm"
; ---------------------------------------------------------------------------
; Collision index pointers for Act 2
; ---------------------------------------------------------------------------
dc.l Col_GHZ2
dc.l Col_LZ2
dc.l Col_MZ2
dc.l Col_SLZ2
dc.l Col_SYZ2
dc.l Col_SBZ2
You get where I'm going? Do the same for Act 3, but changing the 2 to 3. The Act 4 file requires special treatment - well, not really, but if you want to edit the collision for SBZ3/LZ4 seperatly you should make it exactly like the Act 1 file, but add a 4 after Col_LZ. If you don't plan on doing that, you can just change the include for the Act 4 file to the Act 1 file. You can always change it once you've added the new file. Now go into the collide folder in your disasm and make 2 copies of all these files. Rename them to GHZ, GHZ2, and GHZ3. Now you need to actually include them in the ROM. Find Col_GHZ: in your disasm, and replace the entire block with this:
Col_GHZ: incbin collide\ghz.bin ; GHZ index
even
Col_GHZ2: incbin collide\ghz2.bin ; GHZ 2 index
even
Col_GHZ3: incbin collide\ghz3.bin ; GHZ 3 index
even
Col_LZ: incbin collide\lz.bin ; LZ index
even
Col_LZ2: incbin collide\lz2.bin ; LZ index
even
Col_LZ3: incbin collide\lz3.bin ; LZ index
even
Col_MZ: incbin collide\mz.bin ; MZ index
even
Col_MZ2: incbin collide\mz2.bin ; MZ index
even
Col_MZ3: incbin collide\mz3.bin ; MZ index
even
Col_SLZ: incbin collide\slz.bin ; SLZ index
even
Col_SLZ2: incbin collide\slz2.bin ; SLZ index
even
Col_SLZ3: incbin collide\slz3.bin ; SLZ index
even
Col_SYZ: incbin collide\syz.bin ; SYZ index
even
Col_SYZ2: incbin collide\syz2.bin ; SYZ index
even
Col_SYZ3: incbin collide\syz3.bin ; SYZ index
even
Col_SBZ: incbin collide\sbz.bin ; SBZ index
even
Col_SBZ2: incbin collide\sbz2.bin ; SBZ index
even
Col_SBZ3: incbin collide\sbz3.bin ; SBZ index
even
If you did all this, you should be ready to go! Compile and see your dynamic collision. You will also need to fix the SonED2 Project files, but that will not be covered today because it's a thing that takes all of 5 minutes to do.
|Dynamic Collision system in Sonic 1]]