Actions

SCHG How-to

Dynamic Collision system in Sonic 1

From Sonic Retro

Revision as of 23:43, 11 August 2010 by Theocas (talk | contribs) (Created page with 'This system works best with the dynamic art and pallet system, but if every zone has the same art and you still want dynamic collision for some reason, read on. I originally wrot…')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

This system works best with the dynamic art and pallet 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. <asm> move.l ColPointers(pc,d0.w),($FFFFF796).w</asm> loads the Collision Pointer for the correct zone into a RAM adress. Make 4 subroutines titled ColIndexLoadAct1, ColIndexLoadAct2, ColIndexLoadAct3 and ColIndexLoadAct4. Even if you don't have a 4th act for your zones, Scrap Brain 3 is actually Act 4 of Labyrinth so it is required. Now that you have these subroutines, turn ColIndexLoad into this: <asm<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[/asm] Now Make the subroutines you just created read like so:[asm]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 </asm> 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?[asm]ColPointers: include "_inc\Collision index pointers.asm"[/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: <asm>; ---------------------------------------------------------------------------

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"</asm> Make 3 copies of Collision index pointers.asm and rename them just like you did in the include above. Now you just need the actual content to put in these files. This is what the Act 2 file looks like:<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</asm> 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 added 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: <asm> 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</asm> 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 this.