Actions

SCHG How-to

Difference between revisions of "Extend the level index past $10 in Sonic 2"

From Sonic Retro

(Extending the object index)
(Initial Notes and Revisions Done)
 
(97 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 
==Initial Notes and Revisions Done==
 
==Initial Notes and Revisions Done==
''(Split Trial: due to an unfortunate edit, I'm now trying to split this page to point some fixes - [[silent.creature]])''
+
''(Original guide by [[User:Kramlat|kramlat]], current revision that fixes major bugs and extends properly by [[GARY 'M 9]])''
  
''(Original guide by [[kram]], current revision that fixes major bugs and extends properly by [[GARY 'M 9]])''
+
''(Updated again by [[User:Kramlat|kramlat]], adding back custom titlecard mappings howto, due to guide being unfinished, thus finally fixing the "ZONE ZONE" bug.  Replace all the empty levels with your new ones.)''
  
''(Updated again by [[kram]], adding back custom titlecard mappings howto, due to guide being unfinished, thus finally fixing the "ZONE ZONE" bug.  Replace all the empty levels with your new ones.)''
+
''(Updated by [[silent.creature]], fixing some code within the procedures)''
  
'''WARNING:'''  Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you [[SCHG_How-to:Port_Sonic_1's_Sound_Driver_to_Sonic_2|port the Sonic 1 sound driver]] first before proceeding.  A lot of major data shifting will occur in this tutorial and it '''will''' make the rom size a '''lot''' bigger than it was before.  This '''will''' break the sonic2 or even sonic2 beta sound driver, thus so you definitely want the sonic 1 sound driver due to the fact that it can take the shifting and still work properly. However, if you are using Xenowhirl's 2007 Sonic 2 disassembly, it is not necessary to port any other sound driver, since that uses disassembled Z80 code which automatically references the correct locations and can thus work properly even if there are massive location shifts.
+
''(Updated by [[User:Kramlat|kramlat]], moved to the current GIT disassembly)''
  
You probably noticed that all the indexes in the game stop at $10 and when you try to extend it, by extending the MLLB, you get weird glitches or even crashes, that is because you haven't extended all the indexes that need to be extended.
+
'''WARNING:'''  Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you [[SCHG_How-to:Port_Sonic_1's_Sound_Driver_to_Sonic_2|port the Sonic 1 sound driver]] or the Sonic 2 clone driver V2 first before proceeding.  A lot of major data shifting will occur in this tutorial and it '''will''' make the rom size a '''lot''' bigger than it was before.  This '''will''' break the Sonic 2 or even Sonic 2 beta sound driver; thus, you definitely want Sonic 1 sound driver due to the fact that it can take the shifting and still work properly.
 +
However, if you are using Xenowhirl's 2007 Sonic 2 disassembly, it is not necessary to port any other sound driver, since it uses disassembled Z80 code which automatically references the correct locations and can thus work properly even if there are massive location shifts.
  
==Extending the Titlecard index==
+
'''EDIT:'''  If you are using the svn/hg/git version, this should not be a problem because those have the sound driver disassembled and macros to keep the driver properly aligned.  For this reason, we will now be using that instead of the xenowhirl one we used in the past.
First we find:
 
  
<asm>
+
You probably noticed that all the indexes in the game stop at $10 and when you try to extend them, by extending the Main Level Load Blocks index, you get weird glitches and crashes. It means you haven't extended all the indexes that need to be extended.
Obj34_TitleCardData:
 
dc.b    8,   0, $80, $1B
 
dc.w $240, $120, $B8
 
  
dc.b  $A, $11, $40, $1C
+
We will initially extend the indexes for $20 zones, but we show that this can be extended to any number between $11 and $7F. (I didn't tried $80 and more because of the ROM cartridge size, but I think it is possible.) You will see frequently the variable-label ''NumberOfZones'', just to explain this. Please define it or substitute it to its desired value.
dc.$28, $148, $D0
 
  
dc.b  $C,  $12, $18, $1C
+
==Extending the Titlecard index==
dc.w  $68, $188, $D0
+
===Extending Main Configuration indexes===
 +
====Updating TitleCard Data====
 +
We need to allocate more card indexes for our new zone. To do this, we find:
  
dc.b    2,   0,  0,  0
+
<syntaxhighlight lang="asm">
dc.w   0,    0,  0
+
; word_13CD4:
 +
Obj34_TitleCardData:
 +
titlecardobjdata  8,  0, $80, $1B, $240, $120, $B8 ; zone name
 +
titlecardobjdata $A, $11, $40, $1C,  $28, $148, $D0 ; "ZONE"
 +
titlecardobjdata $C, $12, $18, $1C,  $68, $188, $D0 ; act number
 +
titlecardobjdata  2,   0,  0,  0,   0,    0,  0 ; blue background
 +
titlecardobjdata  4, $15, $48,  8, $2A8, $168,$120 ; bottom yellow part
 +
titlecardobjdata  6, $16,  8, $15,  $80,  $F0, $F0 ; left red part
 +
Obj34_TitleCardData_End:
 +
</syntaxhighlight>
  
dc.b    4,  $15, $48,  8
+
and change this to:
dc.w $2A8, $168,$120
+
<syntaxhighlight lang="asm">
 
+
; word_13CD4:
dc.b    6,  $16,  8, $15
 
dc.w  $80,  $F0, $F0
 
</asm>
 
 
 
and change it to:
 
<asm>
 
 
Obj34_TitleCardData:
 
Obj34_TitleCardData:
dc.b    8,   0, $80, $1B ; this is the zone string start index and  placement
+
titlecardobjdata  8,   0,       $80, $1B, $240, $120, $B8 ; zone name
dc.w $240, $120, $B8
+
titlecardobjdata $A, NumberOfZones+1, $40, $1C, $28, $148, $D0 ; "ZONE"
 
+
titlecardobjdata $C, NumberOfZones+2, $18, $1C, $68, $188, $D0 ; act number
dc.b  $A, $21, $40, $1C ; "ZONE" string index number and placement
+
titlecardobjdata  2,   0, 0,  0,    0,    0,  0 ; blue background
dc.w $28, $148, $D0
+
titlecardobjdata  4, NumberOfZones+5, $48,  8, $2A8, $168,$120 ; bottom yellow part
 
+
titlecardobjdata  6, NumberOfZones+6, 8, $15,  $80,  $F0, $F0 ; left red part
dc.b  $C, $22, $18, $1C ; act number start index and placement
+
Obj34_TitleCardData_End:
dc.w $68, $188, $D0
+
</syntaxhighlight>
 
 
dc.b    2,   0,   0,  0 ; this part of the titlecard is totally unknown, colored backdrop possibly
 
dc.w   0,    0,  0
 
  
dc.b    4$25, $48,  8 ; red strip edge index and placement
+
Where ''NumberOfZones'' is the total number of zones you want in the game. As we said before, we will work with $20 zones. The best place for it, is in '''s2.constants.asm'''
dc.w $2A8, $168,$120
 
  
dc.b    6,  $26,  8, $15 ; red "Sonic The Hedgehog" string and placement
+
====Fixing Act Number Handler====
dc.w  $80, $F0, $F0
+
Now, find:
</asm>
+
<syntaxhighlight lang="asm">
 
+
Obj34_ActNumber: ; the act number, coming in
next, find:
+
jsr Obj34_Wait(pc)
<asm>
+
move.b (Current_Zone).w,d0 ; get the current zone
    jsr       sub_13D10(pc)
+
cmpi.b #sky_chase_zone,d0 ; is it Sky Chase?
    move.b   (Current_Zone).w,d0
+
beq.s BranchTo9_DeleteObject ; if yes, branch
    cmpi.b   #$10,d0
+
cmpi.b #wing_fortress_zone,d0 ; is it Wing Fortress?
    beq.s     BranchTo9_DeleteObject
+
beq.s BranchTo9_DeleteObject ; if yes, branch
    cmpi.b   #6,d0
+
cmpi.b #death_egg_zone,d0 ; is it Death Egg Zone?
    beq.s     BranchTo9_DeleteObject
+
beq.s BranchTo9_DeleteObject ; if yes, branch
    cmpi.b   #$E,d0
+
move.b (Current_Act).w,d1 ; get the current act
    beq.s     BranchTo9_DeleteObject
+
addi.b #$12,d1 ; add $12 to it (this is the index of the "1" frame in the mappings)
    move.b   (Current_Act).w,d1
+
cmpi.b #metropolis_zone_2,d0 ; are we in Metropolis Zone Act 3?
    addi.b   #$12,d1
+
bne.s + ; if not, branch
    cmpi.b   #5,d0
+
moveq #$14,d1 ; use the "3" frame instead
    bne.s     loc_13E18
+
</syntaxhighlight>
    moveq     #$14,d1
 
</asm>
 
  
 
and change it to:
 
and change it to:
<asm>
+
<syntaxhighlight lang="asm">
    jsr       sub_13D10(pc)
+
Obj34_ActNumber: ; the act number, coming in
    move.b   (Current_Zone).w,d0
+
jsr Obj34_Wait(pc)
    cmpi.b   #$10,d0
+
move.b (Current_Zone).w,d0 ; get the current zone
    beq.s     BranchTo9_DeleteObject
+
cmpi.b #sky_chase_zone,d0 ; is it Sky Chase?
    cmpi.b   #6,d0
+
beq.s BranchTo9_DeleteObject ; if yes, branch
    beq.s     BranchTo9_DeleteObject
+
cmpi.b #wing_fortress_zone,d0 ; is it Wing Fortress?
    cmpi.b   #$E,d0
+
beq.s BranchTo9_DeleteObject ; if yes, branch
    beq.s     BranchTo9_DeleteObject
+
cmpi.b #death_egg_zone,d0 ; is it Death Egg Zone?
    move.b   (Current_Act).w,d1
+
beq.s BranchTo9_DeleteObject ; if yes, branch
    addi.b   #$22,d1                 ; Act number mappings (Act 1)
+
move.b (Current_Act).w,d1 ; get the current act
    cmpi.b   #5,d0
+
addi.b #NumberOfZones+2,d1 ; Act number mappings (Act 1)
    bne.s     loc_13E18
+
cmpi.b #metropolis_zone_2,d0 ; are we in Metropolis Zone Act 3?
    moveq     #$24,d1                 ; Act number mappings (Act 3).  Used for drawing MTZ (0x05) titlecard only
+
bne.s + ; if not, branch
</asm>
+
moveq #NumberOfZones+4,d1 ; Act number mappings (Act 3).  Used for drawing MTZ (0x05) titlecard only
 +
</syntaxhighlight>
  
 
Now we have the offset data of where to load the mappings for the titlecards shifted so that we can now start working on updating the mappings and not have that strange "ZONE ZONE" bug that [[GARY 'M 9]] left behind and I intended to correct.
 
Now we have the offset data of where to load the mappings for the titlecards shifted so that we can now start working on updating the mappings and not have that strange "ZONE ZONE" bug that [[GARY 'M 9]] left behind and I intended to correct.
  
 +
====Adding new Art Load Cue Data to the TitleCards for New Zones====
 
Next, another thing I wanted to see others correct.  this time, I will explain why I changed byte_15820 into a 16-bit relative offset index as opposed to it staying as a byte-by-byte relative offset that does not point correctly, and to appropriately handle the string data in word_15832, as well as allow that string data to be properly represented.  This time I will make it even clearer too.
 
Next, another thing I wanted to see others correct.  this time, I will explain why I changed byte_15820 into a 16-bit relative offset index as opposed to it staying as a byte-by-byte relative offset that does not point correctly, and to appropriately handle the string data in word_15832, as well as allow that string data to be properly represented.  This time I will make it even clearer too.
  
 
Next off, in this part of the hack the first thing before converting to a better manageable datatype, we want to replace the byte_15820 handler with a better one.
 
Next off, in this part of the hack the first thing before converting to a better manageable datatype, we want to replace the byte_15820 handler with a better one.
  
look for:
+
Look for:
<asm>
+
<syntaxhighlight lang="asm">
 
; loc_157D2:
 
; loc_157D2:
 
LoadTitleCard:
 
LoadTitleCard:
Line 103: Line 100:
 
moveq #0,d0
 
moveq #0,d0
 
move.b (Current_Zone).w,d0
 
move.b (Current_Zone).w,d0
move.b byte_15820(pc,d0.w),d0
+
move.b Off_TitleCardLetters(pc,d0.w),d0
lea word_15832(pc),a0
+
lea TitleCardLetters(pc),a0
 
lea (a0,d0.w),a0
 
lea (a0,d0.w),a0
move.l #$7BC00002,d0
+
move.l #vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0
</asm>
+
</syntaxhighlight>
  
 
and we want to replace it with:
 
and we want to replace it with:
<asm>
+
<syntaxhighlight lang="asm">
 
; loc_157D2:
 
; loc_157D2:
 
LoadTitleCard:
 
LoadTitleCard:
Line 117: Line 114:
 
move.b (Current_Zone).w,d0
 
move.b (Current_Zone).w,d0
 
add.w d0,d0
 
add.w d0,d0
move.w Off_Titlecardtext(pc,d0.w),d0
+
move.w Off_TitleCardLetters(pc,d0.w),d0
lea Off_Titlecardtext(pc,d0.w),a0
+
lea Off_TitleCardLetters(pc,d0.w),a0
move.l #$7BC00002,d0
+
move.l #vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0
</asm>
+
</syntaxhighlight>
  
 
That takes care of the loader, now time to update the string data.
 
That takes care of the loader, now time to update the string data.
  
 
find:
 
find:
<asm>
+
<syntaxhighlight lang="asm">
; unknown
+
; byte_15820:
byte_15820:
+
Off_TitleCardLetters:
dc.b   0,  0,  0,  0,$10,$10,$98,$20,$2C,  0,$3C,$46,$58,$68,$A8,$7A
+
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 0
dc.b $8A,  0 ; 16
+
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 1
; unknown
+
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 2
word_15832:
+
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 3
dc.w $2A06,$3804,    4,$2604, $C04,$1804,$1C02,$FFFF
+
dc.b TitleCardLetters_MTZ - TitleCardLetters ; 4
dc.w $2A06,$4004,$3804,$3004,$2604,$1C02,$3C04,$FFFF; 8
+
dc.b TitleCardLetters_MTZ - TitleCardLetters ; 5
dc.w $1804,$1C02,$2604,$4004,$3004,$FFFF,$1804,$1C02; 16
+
dc.b TitleCardLetters_WFZ - TitleCardLetters ; 6
dc.w  $C04,$3004,    4,$2604, $804,$FFFF,$1C02,$2604; 24
+
dc.b TitleCardLetters_HTZ - TitleCardLetters ; 7
dc.w  $804,    4,$FFFF,$2A06,$5604,$3C04,$4004,$1C02; 32
+
dc.b TitleCardLetters_HPZ - TitleCardLetters ; 8
dc.w  $804,    4,$4804,$FFFF, $804,    4,$3C04,$1C02; 40
+
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 9
dc.w $1404,$1804,$4004,$FFFF, $804,$1804,$2A06,$1C02; 48
+
dc.b TitleCardLetters_OOZ - TitleCardLetters ; A
dc.w 4,$2604,$3004,$4004,$FFFF,    4,$3404,$4404; 56
+
dc.b TitleCardLetters_MCZ - TitleCardLetters ; B
dc.w $4004,$1C02, $804,$3804,$FFFF,$3C04,$2204,$5604; 64
+
dc.b TitleCardLetters_CNZ - TitleCardLetters ; C
dc.w $804,$1804,   4,$FFFF,$4C06,$1C02,$1404,$1004; 72
+
dc.b TitleCardLetters_CPZ - TitleCardLetters ; D
dc.w $3804,$4004,$3C04,$FFFF, $C04,    4,$4004,$1804; 80
+
dc.b TitleCardLetters_DEZ - TitleCardLetters ; E
dc.w $1404,$FFFF ; 88
+
dc.b TitleCardLetters_ARZ - TitleCardLetters ; F
</asm>
+
dc.b TitleCardLetters_SCZ - TitleCardLetters ; 10
 +
even
 +
 
 +
  ; temporarily remap characters to title card letter format
 +
; Characters are encoded as Aa, Bb, Cc, etc. through a macro
 +
charset 'A',0 ; can't have an embedded 0 in a string
 +
charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4"
 +
charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4"
 +
charset '.',"\x5A"
 +
 
 +
; Defines which letters load for the continue screen
 +
; Each letter occurs only once, and  the letters ENOZ (i.e. ZONE) aren't loaded here
 +
; However, this is hidden by the titleLetters macro, and normal titles can be used
 +
; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here)
 +
 
 +
; word_15832:
 +
TitleCardLetters:
 +
 
 +
TitleCardLetters_EHZ:
 +
titleLetters "EMERALD HILL"
 +
TitleCardLetters_MTZ:
 +
titleLetters "METROPOLIS"
 +
TitleCardLetters_HTZ:
 +
titleLetters "HILL TOP"
 +
TitleCardLetters_HPZ:
 +
titleLetters "HIDDEN PALACE"
 +
TitleCardLetters_OOZ:
 +
titleLetters "OIL OCEAN"
 +
TitleCardLetters_MCZ:
 +
titleLetters "MYSTIC CAVE"
 +
TitleCardLetters_CNZ:
 +
titleLetters "CASINO NIGHT"
 +
TitleCardLetters_CPZ:
 +
titleLetters "CHEMICAL PLANT"
 +
TitleCardLetters_ARZ:
 +
titleLetters "AQUATIC RUIN"
 +
TitleCardLetters_SCZ:
 +
titleLetters "SKY CHASE"
 +
TitleCardLetters_WFZ:
 +
titleLetters "WING FORTRESS"
 +
TitleCardLetters_DEZ:
 +
titleLetters "DEATH EGG"
 +
 
 +
charset ; revert character set
 +
</syntaxhighlight>
  
 
and replace it with:
 
and replace it with:
<asm>
+
<syntaxhighlight lang="asm">
 
;byte_15820
 
;byte_15820
Off_Titlecardtext:
+
Off_TitleCardLetters: offsetTable
dc.w   Text_EHZ-Off_Titlecardtext ; EHZ Titlecard 00
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 00
dc.w   Text_LZ-Off_Titlecardtext  ; LZ Titlecard 01
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 01
dc.w   Text_WZ-Off_Titlecardtext  ; WZ Titlecard 02
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 02
dc.w   Text_DHZ-Off_Titlecardtext ; DHZ Titlecard 03
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 03
dc.w   Text_MTZ-Off_Titlecardtext ; MTZ Titlecard 04
+
offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 04
dc.w   Text_MTZ-Off_Titlecardtext ; MTZ Titlecard 05
+
offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 05
dc.w   Text_WFZ-Off_Titlecardtext ; WFZ Titlecard 06
+
offsetTableEntry.w TitleCardLetters_WFZ ; WFZ Titlecard 06
dc.w   Text_HTZ-Off_Titlecardtext ; HTZ Titlecard 07
+
offsetTableEntry.w TitleCardLetters_HTZ ; HTZ Titlecard 07
dc.w   Text_HPZ-Off_Titlecardtext ; HPZ Titlecard 08
+
offsetTableEntry.w TitleCardLetters_HPZ ; HPZ Titlecard 08
dc.w   Text_GCZ-Off_Titlecardtext ; GCZ Titlecard 09
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 09
dc.w   Text_OOZ-Off_Titlecardtext ; OOZ Titlecard 0A
+
offsetTableEntry.w TitleCardLetters_OOZ ; OOZ Titlecard 0A
dc.w   Text_MCZ-Off_Titlecardtext ; MCZ Titlecard 0B
+
offsetTableEntry.w TitleCardLetters_MCZ ; MCZ Titlecard 0B
dc.w   Text_CNZ-Off_Titlecardtext ; CNZ Titlecard 0C
+
offsetTableEntry.w TitleCardLetters_CNZ ; CNZ Titlecard 0C
dc.w   Text_CPZ-Off_Titlecardtext ; CPZ Titlecard 0D
+
offsetTableEntry.w TitleCardLetters_CPZ ; CPZ Titlecard 0D
dc.w   Text_DEZ-Off_Titlecardtext ; DEZ Titlecard 0E
+
offsetTableEntry.w TitleCardLetters_DEZ ; DEZ Titlecard 0E
dc.w   Text_ARZ-Off_Titlecardtext ; ARZ Titlecard 0F
+
offsetTableEntry.w TitleCardLetters_ARZ ; ARZ Titlecard 0F
dc.w   Text_SCZ-Off_Titlecardtext ; SCZ Titlecard 10
+
offsetTableEntry.w TitleCardLetters_SCZ ; SCZ Titlecard 10
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 11
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 11
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 12
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 12
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 13
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 13
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 14
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 14
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 15
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 15
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 16
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 16
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 17
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 17
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 18
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 18
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 19
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 19
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1A
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1A
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1B
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1B
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1C
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1C
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1D
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1D
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1E
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1E
dc.w   Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1F
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1F
dc.w   Text_NZ-Off_Titlecardtext NZ Titlecard 20
+
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 20
 +
 
 +
; temporarily remap characters to title card letter format
 +
; Characters are encoded as Aa, Bb, Cc, etc. through a macro
 +
charset 'A',0 ; can't have an embedded 0 in a string
 +
charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4"
 +
charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4"
 +
  charset '.',"\x5A"
 +
 
 +
; Defines which letters load for the continue screen
 +
; Each letter occurs only once, and the letters ENOZ (i.e. ZONE) aren't loaded here
 +
; However, this is hidden by the titleLetters macro, and normal titles can be used
 +
; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here)
 +
 
 +
; word_15832:
 +
TitleCardLetters:
  
;word_15832
+
TitleCardLetters_EHZ:
Text_EHZ: dc.b $2A,$38,$00,$26,$0C,$18,$1C ; 'MRALDHI'
+
titleLetters "EMERALD HILL"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_MTZ:
Text_LZ: dc.b $26,$00,$04,$56,$38,$1C,$40,$18 ; 'LABYRITH'
+
titleLetters "METROPOLIS"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_HTZ:
Text_WZ: dc.b $4C,$0C ; 'WD'
+
titleLetters "HILL TOP"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_HPZ:
Text_DHZ: dc.b $0C,$44,$3C,$40,$18,$1C,$26 ; 'DUSTHIL'
+
titleLetters "HIDDEN PALACE"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_OOZ:
Text_MTZ: dc.b $2A,$40,$38,$30,$26,$1C,$3C ; 'MTRPLIS'
+
titleLetters "OIL OCEAN"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_MCZ:
Text_WFZ: dc.b $4C,$1C,$14,$10,$38,$40,$3C ; 'WIGFRTS'
+
titleLetters "MYSTIC CAVE"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_CNZ:
Text_HTZ: dc.b $18,$1C,$26,$40,$30 ; 'HILTP'
+
titleLetters "CASINO NIGHT"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_CPZ:
Text_HPZ: dc.b $18,$1C,$0C,$30,$00,$26,$08 ; 'HIDPALCE'
+
titleLetters "CHEMICAL PLANT"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_ARZ:
Text_GCZ: dc.b $14,$08,$1C,$0C,$40,$56 ; 'GCIDTY'
+
titleLetters "AQUATIC RUIN"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_SCZ:
Text_OOZ: dc.b $1C,$26,$08,$00 ; 'ILCAN'
+
titleLetters "SKY CHASE"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_WFZ:
Text_MCZ: dc.b $2A,$56,$3C,$40,$1C,$08,$00,$48 ; 'MYSTICAV'
+
titleLetters "WING FORTRESS"
  dc.w $FFFF ; '<EOF>'
+
TitleCardLetters_DEZ:
Text_CNZ: dc.b $08,$00,$3C,$1C,$14,$18,$40 ; 'CASIGHT'
+
titleLetters "DEATH EGG"
  dc.w $FFFF ; '<EOF>'
 
Text_CPZ: dc.b $08,$18,$2A,$1C,$00,$26,$30,$40 ; 'CHMICALPT'
 
  dc.w $FFFF ; '<EOF>'
 
Text_DEZ: dc.b $0C,$00,$40,$18,$14 ; 'DATHG'
 
  dc.w $FFFF ; '<EOF>'
 
Text_ARZ: dc.b $00,$34,$44,$40,$1C,$08,$38 ; 'AQUTICR'
 
  dc.w $FFFF ; '<EOF>'
 
Text_SCZ: dc.b $3C,$22,$56,$08,$18,$00,$3C ; 'SKYCHAS'
 
  dc.w $FFFF ; '<EOF>'
 
Text_NZ:  dc.b $4C ; 'W'
 
  dc.w $FFFF ; '<EOF>'
 
</asm>
 
  
This extends the title card index to $20, adds titlecards for Wood Zone, Labyrinth Zone, Dust Hill Zone, Genocide City Zone, and an empty New Zone titlecard for every single level above SCZ, compacts the titlecard text data for all titlecards, and makes it more easier to manage. you will be wondering probably what to do with the mappings.  Well that is what is next.
+
  charset ; revert character set
 +
</syntaxhighlight>
  
find:
+
''Point Fix'': This data manager, as implemented, doesn't work with a byte-string data. If you tried to use that byte-string data, you've noticed weird names. For example, Emerald Hill became Emepqrs T?rr.
<asm>
+
 
 +
This adds the basic card configuration to our new levels. You can freely edit the entries of this table to suit your needs.
 +
 
 +
===Extending TitleCard Sprite Mappings===
 +
Now, find:
 +
<syntaxhighlight lang="asm">
 
; -------------------------------------------------------------------------------
 
; -------------------------------------------------------------------------------
 
; sprite mappings
 
; sprite mappings
 
; -------------------------------------------------------------------------------
 
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA: BINCLUDE "mappings/sprite/obj34.bin"
+
Obj34_MapUnc_147BA: offsetTable
; -------------------------------------------------------------------------------
+
offsetTableEntry.w word_147E8
</asm>
+
offsetTableEntry.w word_147E8
 +
offsetTableEntry.w word_147E8
 +
offsetTableEntry.w word_147E8
 +
offsetTableEntry.w word_14842
 +
offsetTableEntry.w word_14842
 +
offsetTableEntry.w word_14B24
 +
offsetTableEntry.w word_14894
 +
offsetTableEntry.w word_148CE
 +
offsetTableEntry.w word_147E8
 +
offsetTableEntry.w word_14930
 +
offsetTableEntry.w word_14972
 +
offsetTableEntry.w word_149C4
 +
offsetTableEntry.w word_14A1E
 +
offsetTableEntry.w word_14B86
 +
offsetTableEntry.w word_14A88
 +
offsetTableEntry.w word_14AE2
 +
offsetTableEntry.w word_14BC8
 +
offsetTableEntry.w word_14BEA
 +
offsetTableEntry.w word_14BF4
 +
offsetTableEntry.w word_14BFE
 +
offsetTableEntry.w word_14C08
 +
offsetTableEntry.w word_14C32
 +
word_147E8: dc.w $B
 +
dc.w 5, $8580, $82C0, $FFC3
 +
dc.w 9, $85DE, $82EF, $FFD0
 +
dc.w 5, $8580, $82C0, $FFE8
 +
dc.w 5, $85E4, $82F2, $FFF8
 +
dc.w 5, $85E8, $82F4, 8
 +
dc.w 5, $85EC, $82F6, $18
 +
dc.w 5, $85F0, $82F8, $28
 +
dc.w 5, $85F4, $82FA, $48
 +
dc.w 1, $85F8, $82FC, $58
 +
dc.w 5, $85EC, $82F6, $60
 +
dc.w 5, $85EC, $82F6, $70
 +
word_14842: dc.w $A
 +
dc.w 9, $85DE, $82EF, $FFE0
 +
dc.w 5, $8580, $82C0, $FFF8
 +
dc.w 5, $85E4, $82F2, 8
 +
dc.w 5, $85E8, $82F4, $18
 +
dc.w 5, $8588, $82C4, $28
 +
dc.w 5, $85EC, $82F6, $38
 +
dc.w 5, $8588, $82C4, $48
 +
dc.w 5, $85F0, $82F8, $58
 +
dc.w 1, $85F4, $82FA, $68
 +
dc.w 5, $85F6, $82FB, $70
 +
word_14894: dc.w 7
 +
dc.w 5, $85DE, $82EF, 8
 +
dc.w 1, $85E2, $82F1, $18
 +
dc.w 5, $85E4, $82F2, $20
 +
dc.w 5, $85E4, $82F2, $30
 +
dc.w 5, $85E8, $82F4, $51
 +
dc.w 5, $8588, $82C4, $60
 +
dc.w 5, $85EC, $82F6, $70
 +
word_148CE: dc.w $C
 +
dc.w 5, $85DE, $82EF, $FFB8
 +
dc.w 1, $85E2, $82F1, $FFC8
 +
dc.w 5, $85E4, $82F2, $FFD0
 +
dc.w 5, $85E4, $82F2, $FFE0
 +
dc.w 5, $8580, $82C0, $FFF0
 +
dc.w 5, $8584, $82C2, 0
 +
dc.w 5, $85E8, $82F4, $20
 +
dc.w 5, $85EC, $82F6, $30
 +
dc.w 5, $85F0, $82F8, $40
 +
dc.w 5, $85EC, $82F6, $50
 +
dc.w 5, $85F4, $82FA, $60
 +
dc.w 5, $8580, $82C0, $70
 +
word_14930: dc.w 8
 +
dc.w 5, $8588, $82C4, $FFFB
 +
dc.w 1, $85DE, $82EF, $B
 +
dc.w 5, $85E0, $82F0, $13
 +
dc.w 5, $8588, $82C4, $33
 +
dc.w 5, $85E4, $82F2, $43
 +
dc.w 5, $8580, $82C0, $53
 +
dc.w 5, $85E8, $82F4, $60
 +
dc.w 5, $8584, $82C2, $70
 +
word_14972: dc.w $A
 +
dc.w 9, $85DE, $82EF, $FFD0
 +
dc.w 5, $85E4, $82F2, $FFE8
 +
dc.w 5, $85E8, $82F4, $FFF8
 +
dc.w 5, $85EC, $82F6, 8
 +
dc.w 1, $85F0, $82F8, $18
 +
dc.w 5, $85F2, $82F9, $20
 +
dc.w 5, $85F2, $82F9, $41
 +
dc.w 5, $85F6, $82FB, $50
 +
dc.w 5, $85FA, $82FD, $60
 +
dc.w 5, $8580, $82C0, $70
 +
word_149C4: dc.w $B
 +
dc.w 5, $85DE, $82EF, $FFD1
 +
dc.w 5, $85E2, $82F1, $FFE0
 +
dc.w 5, $85E6, $82F3, $FFF0
 +
dc.w 1, $85EA, $82F5, 0
 +
dc.w 5, $8584, $82C2, 8
 +
dc.w 5, $8588, $82C4, $18
 +
dc.w 5, $8584, $82C2, $38
 +
dc.w 1, $85EA, $82F5, $48
 +
dc.w 5, $85EC, $82F6, $50
 +
dc.w 5, $85F0, $82F8, $60
 +
dc.w 5, $85F4, $82FA, $70
 +
word_14A1E: dc.w $D
 +
dc.w 5, $85DE, $82EF, $FFA4
 +
dc.w 5, $85E2, $82F1, $FFB4
 +
dc.w 5, $8580, $82C0, $FFC4
 +
dc.w 9, $85E6, $82F3, $FFD1
 +
dc.w 1, $85EC, $82F6, $FFE9
 +
dc.w 5, $85DE, $82EF, $FFF1
 +
dc.w 5, $85EE, $82F7, 0
 +
dc.w 5, $85F2, $82F9, $10
 +
dc.w 5, $85F6, $82FB, $31
 +
dc.w 5, $85F2, $82F9, $41
 +
dc.w 5, $85EE, $82F7, $50
 +
dc.w 5, $8584, $82C2, $60
 +
dc.w 5, $85FA, $82FD, $70
 +
word_14A88: dc.w $B
 +
dc.w 5, $85DE, $82EF, $FFD2
 +
dc.w 5, $85E2, $82F1, $FFE2
 +
dc.w 5, $85E6, $82F3, $FFF2
 +
dc.w 5, $85DE, $82EF, 0
 +
dc.w 5, $85EA, $82F5, $10
 +
dc.w 1, $85EE, $82F7, $20
 +
dc.w 5, $85F0, $82F8, $28
 +
dc.w 5, $85F4, $82FA, $48
 +
dc.w 5, $85E6, $82F3, $58
 +
dc.w 1, $85EE, $82F7, $68
 +
dc.w 5, $8584, $82C2, $70
 +
word_14AE2: dc.w 8
 +
dc.w 5, $85DE, $82EF, $FFF0
 +
dc.w 5, $85E2, $82F1, 0
 +
dc.w 5, $85E6, $82F3, $10
 +
dc.w 5, $85EA, $82F5, $30
 +
dc.w 5, $85EE, $82F7, $40
 +
dc.w 5, $85F2, $82F9, $50
 +
dc.w 5, $85DE, $82EF, $60
 +
dc.w 5, $8580, $82C0, $70
 +
word_14B24: dc.w $C
 +
dc.w 9, $85DE, $82EF, $FFB1
 +
dc.w 1, $85E4, $82F2, $FFC8
 +
dc.w 5, $8584, $82C2, $FFD0
 +
dc.w 5, $85E6, $82F3, $FFE0
 +
dc.w 5, $85EA, $82F5, 1
 +
dc.w 5, $8588, $82C4, $10
 +
dc.w 5, $85EE, $82F7, $20
 +
dc.w 5, $85F2, $82F9, $30
 +
dc.w 5, $85EE, $82F7, $40
 +
dc.w 5, $8580, $82C0, $50
 +
dc.w 5, $85F6, $82FB, $5F
 +
dc.w 5, $85F6, $82FB, $6F
 +
word_14B86: dc.w 8
 +
dc.w 5, $85DE, $82EF, $FFF2
 +
dc.w 5, $8580, $82C0, 2
 +
dc.w 5, $85E2, $82F1, $10
 +
dc.w 5, $85E6, $82F3, $20
 +
dc.w 5, $85EA, $82F5, $30
 +
dc.w 5, $8580, $82C0, $51
 +
dc.w 5, $85EE, $82F7, $60
 +
dc.w 5, $85EE, $82F7, $70
 +
word_14BC8: dc.w 4
 +
dc.w 5, $858C, $82C6, 1
 +
dc.w 5, $8588, $82C4, $10
 +
dc.w 5, $8584, $82C2, $20
 +
dc.w 5, $8580, $82C0, $30
 +
word_14BEA: dc.w 1
 +
dc.w 7, $A590, $A2C8, 0
 +
word_14BF4: dc.w 1
 +
dc.w $B, $A598, $A2CC, 0
 +
word_14BFE: dc.w 1
 +
dc.w $B, $A5A4, $A2D2, 0
 +
word_14C08: dc.w 5
 +
dc.w $D, $85B0, $82D8, $FFB8
 +
dc.w $D, $85B8, $82DC, $FFD8
 +
dc.w $D, $85C0, $82E0, $FFF8
 +
dc.w $D, $85C8, $82E4, $18
 +
dc.w 5, $85D0, $82E8, $38
 +
word_14C32: dc.w 7
 +
dc.w $9003, $85D4, $82EA, 0
 +
dc.w $B003, $85D4, $82EA, 0
 +
dc.w $D003, $85D4, $82EA, 0
 +
dc.w $F003, $85D4, $82EA, 0
 +
dc.w $1003, $85D4, $82EA, 0
 +
dc.w $3003, $85D4, $82EA, 0
 +
dc.w $5003, $85D4, $82EA, 0
 +
</syntaxhighlight>
  
and replace it with:
+
If you check the routine of Obj34, you will see this is called from anywhere it is in the ROM. Thus, we can shift this data to another place we can edit it without any code interference. I can suggest you two locations for editing: the first is the end of the disassembly. The second is the end of the header. We will use here the end of disassembly. We will replace it with:
<asm>
+
<syntaxhighlight lang="asm">
 +
word_14BC8: ;keep this line to prevent errors
 +
dc.w 4 ; number of letters
 +
dc.w 5, $858C, $82C6,    0 ;Z
 +
dc.w 5, $8588, $82C4,  $10 ;O
 +
dc.w 5, $8584, $82C2,  $20 ;N
 +
dc.w 5, $8580, $82C0,  $30 ;E
 +
word_14BEA: ;keep this line to prevent errors
 +
dc.w $1 ; number of digits
 +
dc.w 7, $A590, $A2C8,    0 ;1
 +
word_14BF4: ;keep this line to prevent errors
 +
dc.w $1 ; number of digits
 +
dc.w $B, $A598, $A2CC,    0 ;2
 +
word_14BFE: ;keep this line to prevent errors
 +
dc.w $1 ; number of digits
 +
dc.w $B, $A5A4, $A2D2,    0 ;3
 +
</syntaxhighlight>
 +
for compatibility woth other mappings in the area and put this at the end of your disassembly:
 +
<syntaxhighlight lang="asm">
 
; -------------------------------------------------------------------------------
 
; -------------------------------------------------------------------------------
 
; sprite mappings
 
; sprite mappings
 
; -------------------------------------------------------------------------------
 
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA: dc.w Titlecard_EHZ-Obj34_MapUnc_147BA ; EHZ 00  
+
Obj34_MapUnc_147BA: offsetTable
    dc.w Titlecard_LZ-Obj34_MapUnc_147BA  ; LZ  01
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 00  
    dc.w Titlecard_WZ-Obj34_MapUnc_147BA  ; WZ  02
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 01  
    dc.w Titlecard_DHZ-Obj34_MapUnc_147BA ; DHZ 03
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 02  
    dc.w Titlecard_MTZ-Obj34_MapUnc_147BA ; MTZ 04
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 03  
    dc.w Titlecard_MTZ-Obj34_MapUnc_147BA ; MTZ 05
+
offsetTableEntry.w Titlecard_MTZ ; MTZ 04
    dc.w Titlecard_WFZ-Obj34_MapUnc_147BA ; WFZ 06
+
offsetTableEntry.w Titlecard_MTZ ; MTZ 05
    dc.w Titlecard_HTZ-Obj34_MapUnc_147BA ; HTZ 07
+
offsetTableEntry.w Titlecard_WFZ ; WFZ 06
    dc.w Titlecard_HPZ-Obj34_MapUnc_147BA ; HPZ 08
+
offsetTableEntry.w Titlecard_HTZ ; HTZ 07
    dc.w Titlecard_GCZ-Obj34_MapUnc_147BA ; GCZ 09  
+
offsetTableEntry.w Titlecard_HPZ ; HPZ 08
    dc.w Titlecard_OOZ-Obj34_MapUnc_147BA ; OOZ 0A
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 09  
    dc.w Titlecard_MCZ-Obj34_MapUnc_147BA ; MCZ 0B
+
offsetTableEntry.w Titlecard_OOZ ; OOZ 0A
    dc.w Titlecard_CNZ-Obj34_MapUnc_147BA ; CNZ 0C
+
offsetTableEntry.w Titlecard_MCZ ; MCZ 0B
    dc.w Titlecard_CPZ-Obj34_MapUnc_147BA ; CPZ 0D
+
offsetTableEntry.w Titlecard_CNZ ; CNZ 0C
    dc.w Titlecard_DEZ-Obj34_MapUnc_147BA ; DEZ 0E
+
offsetTableEntry.w Titlecard_CPZ ; CPZ 0D
    dc.w Titlecard_ARZ-Obj34_MapUnc_147BA ; ARZ 0F
+
offsetTableEntry.w Titlecard_DEZ ; DEZ 0E
    dc.w Titlecard_SCZ-Obj34_MapUnc_147BA ; SCZ 10
+
offsetTableEntry.w Titlecard_ARZ ; ARZ 0F
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  11
+
offsetTableEntry.w Titlecard_SCZ ; SCZ 10
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  12
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 11  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  13
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 12  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  14
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 13  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  15
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 14  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  16
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 15  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  17
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 16  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  18
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 17  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  19  
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 18  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1A
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 19  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1B
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 1A  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1C
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 1B  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1D
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 1C  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1E
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 1D  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  1F
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 1E  
    dc.w Titlecard_NZ-Obj34_MapUnc_147BA  ; NZ  20
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 1F  
    dc.w T_ZONE-Obj34_MapUnc_147BA        ; "ZONE"
+
offsetTableEntry.w Titlecard_EHZ ; EHZ 20  
    dc.w T_ACT1-Obj34_MapUnc_147BA        ; "1"
+
offsetTableEntry.w T_ZONE ; "ZONE"
    dc.w T_ACT2-Obj34_MapUnc_147BA        ; "2"
+
offsetTableEntry.w T_ACT1 ; "1"
    dc.w T_ACT3-Obj34_MapUnc_147BA        ; "3"
+
offsetTableEntry.w T_ACT2 ; "2"
    dc.w T_STH-Obj34_MapUnc_147BA        ; "SONIC THE HEDGEHOG"
+
offsetTableEntry.w T_ACT3 ; "3"
    dc.w T_STRIPEDGE-Obj34_MapUnc_147BA  ; ">"
+
offsetTableEntry.w T_STH ; "SONIC THE HEDGEHOG"
 +
offsetTableEntry.w T_STRIPEDGE ; ">"
  
Titlecard_EHZ:     dc.w $b ; number of letters
+
TitleCard_EHZ:
    dc.w $0005, $8580, $82C0, $FFC0 ;E
+
dc.w 11 ; number of letters
    dc.w $0009, $85DE, $82EF, $FFD0 ;M
+
dc.w 5, $8580, $82C0, $FFC3 ;E
    dc.w $0005, $8580, $82C0, $FFE8 ;E
+
dc.w 9, $85DE, $82EF, $FFD0 ;M
    dc.w $0005, $85E4, $82F2, $FFF8 ;R
+
dc.w 5, $8580, $82C0, $FFE8 ;E
    dc.w $0005, $85E8, $82F4, $0008 ;A
+
dc.w 5, $85E4, $82F2, $FFF8 ;R
    dc.w $0005, $85EC, $82F6, $0018 ;L
+
dc.w 5, $85E8, $82F4,     8 ;A
    dc.w $0005, $85F0, $82F8, $0028 ;D
+
dc.w 5, $85EC, $82F6,  $18 ;L
 +
dc.w 5, $85F0, $82F8,  $28 ;D
 +
 +
dc.w 5, $85F4, $82FA,  $48 ;H
 +
dc.w 1, $85F8, $82F2,  $58 ;I
 +
dc.w 5, $85EC, $82F6,  $60 ;L
 +
dc.w 5, $85EC, $82F6,  $70 ;L
 +
 +
 +
TitleCard_MTZ:
 +
dc.w 10 ; number of letters
 +
dc.w 9, $85DE, $82EF, $FFE0 ;M
 +
dc.w 5, $8580, $82C0, $FFF8 ;E
 +
dc.w 5, $85E4, $82F2,    8 ;T
 +
dc.w 5, $85E8, $82F4,  $18 ;R
 +
dc.w 5, $8588, $82C4,  $28 ;O
 +
dc.w 5, $85EC, $82F6,  $38 ;P
 +
dc.w 5, $8588, $82C4,  $48 ;O
 +
dc.w 5, $85F0, $82F8,  $58 ;L
 +
dc.w 1, $85F4, $82FA,  $68 ;I
 +
dc.w 5, $85F6, $82FB,  $70 ;S
 +
 +
TitleCard_WFZ:
 +
dc.w 12 ; number of letters
 +
dc.w 9, $85DE, $82EF, $FFB0 ;W
 +
dc.w 1, $85E4, $82F2, $FFC8 ;I
 +
dc.w 5, $8584, $82C2, $FFD0 ;N
 +
dc.w 5, $85E6, $82F3, $FFE0 ;G
 +
 +
dc.w 5, $85EA, $82F5,    0 ;F
 +
dc.w 5, $8588, $82C4,  $10 ;O
 +
dc.w 5, $85EE, $82F7,  $20 ;R
 +
dc.w 5, $85F2, $82F9,  $30 ;T
 +
dc.w 5, $85EE, $82F7,  $40 ;R
 +
dc.w 5, $8580, $82C0,   $50 ;E
 +
dc.w 5, $85F6, $82FB,  $60 ;S
 +
dc.w 5, $85F6, $82FB,  $70 ;S
 +
 +
TitleCard_HTZ:
 +
dc.w 7 ; number of letters
 +
dc.w 5, $85DE, $82EF,    8 ;H
 +
dc.w 1, $85E2, $82F1,  $18 ;I
 +
dc.w 5, $85E4, $82F2,  $20 ;L
 +
dc.w 5, $85E4, $82F2,  $30 ;L
 +
 +
dc.w 5, $85E8, $82F4,  $50 ;T
 +
dc.w 5, $8588, $82C4,  $60 ;O
 +
dc.w 5, $85EC, $82F6,  $70 ;P
 +
 +
TitleCard_HPZ:
 +
dc.w 12 ; number of letters
 +
dc.w 5, $85DE, $82EF, $FFB8 ;H
 +
dc.w 1, $85E2, $82F1, $FFC8 ;I
 +
dc.w 5, $85E4, $82F2, $FFD0 ;D
 +
dc.w 5, $85E4, $82F2, $FFE0 ;D
 +
dc.w 5, $8580, $82C0, $FFF0 ;E
 +
dc.w 5, $8584, $82C4,    0 ;N
 +
 +
dc.w 5, $85E8, $82F4,  $20 ;P
 +
dc.w 5, $85EC, $82F6,  $30 ;A
 +
dc.w 5, $85F0, $82F8,  $40 ;L
 +
dc.w 5, $85EC, $82F6,  $50 ;A
 +
dc.w 5, $85F4, $82FA,  $60 ;C
 +
dc.w 5, $8580, $82C0,  $70 ;E
 +
 +
TitleCard_OOZ:
 +
dc.w 8 ; number of letters
 +
dc.w 5, $8588, $82C4, $FFF8 ;O
 +
dc.w 1, $85DE, $82EF,    8 ;I
 +
dc.w 5, $85E0, $82F0,  $10 ;L
 +
 +
dc.w 5, $8588, $82C4,  $30 ;O
 +
dc.w 5, $85E4, $82F2,  $40 ;C
 +
dc.w 5, $8580, $82C0,  $50 ;E
 +
dc.w 5, $85E8, $82F4,   $60 ;A
 +
dc.w 5, $8584, $82C2,  $70 ;N
 +
 +
TitleCard_MCZ:
 +
dc.w 10 ; number of letters
 +
dc.w 9, $85DE, $82EF, $FFD0 ;M
 +
dc.w 5, $85E4, $82F2, $FFE8 ;Y
 +
dc.w 5, $85E8, $82F4, $FFF8 ;S
 +
dc.w 5, $85EC, $82F6,    8 ;T
 +
dc.w 1, $85F0, $82F8,  $18 ;I
 +
dc.w 5, $85F2, $82F9,  $20 ;C
 +
 +
dc.w 5, $85F2, $82F9,  $40 ;C
 +
dc.w 5, $85F6, $82FB,  $50 ;A
 +
dc.w 5, $85FA, $82FD,  $60 ;V
 +
dc.w 5, $8580, $82C0,  $70 ;E
 +
 +
TitleCard_CNZ:
 +
dc.w 11 ; number of letters
 +
dc.w 5, $85DE, $82EF, $FFD0 ;C
 +
dc.w 5, $85E2, $82F1, $FFE0 ;A
 +
dc.w 5, $85E6, $82F3, $FFF0 ;S
 +
dc.w 1, $85EA, $82F5,    0 ;I
 +
dc.w 5, $8584, $82C2,    8 ;N
 +
dc.w 5, $8588, $82C4,  $18 ;O
 +
 +
dc.w 5, $8584, $82C2,  $38 ;N
 +
dc.w 1, $85EA, $82F5,  $48 ;I
 +
dc.w 5, $85EC, $82F6,  $50 ;G
 +
dc.w 5, $85F0, $82F8,  $60 ;H
 +
dc.w 5, $85F4, $82FA,  $70 ;T
 +
 +
TitleCard_CPZ:
 +
dc.w 13 ; number of letters
 +
dc.w 5, $85DE, $82EF, $FFA0 ;C
 +
dc.w 5, $85E2, $82F1, $FFB0 ;H
 +
dc.w 5, $8580, $82C0, $FFC0 ;E
 +
dc.w 9, $85E6, $82F3, $FFD0 ;M
 +
dc.w 1, $85EC, $82F6, $FFE8 ;I
 +
dc.w 5, $85DE, $82EF, $FFF0 ;C
 +
dc.w 5, $85EE, $82F7,    0 ;A
 +
dc.w 5, $85F2, $82F9,  $10 ;L
 +
 +
dc.w 5, $85F6, $82FB,  $30 ;P
 +
dc.w 5, $85F2, $82F9,  $40 ;L
 +
dc.w 5, $85EE, $82F7,  $50 ;A
 +
dc.w 5, $8584, $82C2,  $60 ;N
 +
dc.w 5, $85FA, $82FD,  $70 ;T
 +
 +
TitleCard_DEZ:
 +
dc.w 8 ; number of letters
 +
dc.w 5, $85DE, $82EF, $FFF0 ;D
 +
dc.w 5, $8580, $82C0,    0 ;E
 +
dc.w 5, $85E2, $82F1,  $10 ;A
 +
dc.w 5, $85E6, $82F3,  $20 ;T
 +
dc.w 5, $85EA, $82F5,  $30 ;H
 +
 +
dc.w 5, $8580, $82C0,  $50 ;E
 +
dc.w 5, $85EE, $82F7,  $60 ;G
 +
dc.w 5, $85EE, $82F7,  $70 ;G
 +
 +
TitleCard_ARZ:
 +
dc.w 11 ; number of letters
 +
dc.w 5, $85DE, $82EF, $FFD0 ;A
 +
dc.w 5, $85E2, $82F1, $FFE0 ;Q
 +
dc.w 5, $85E6, $82F3, $FFF0 ;U
 +
dc.w 5, $85DE, $82EF,    0 ;A
 +
dc.w 5, $85EA, $82F5,  $10 ;T
 +
dc.w 1, $85EE, $82F7,  $20 ;I
 +
dc.w 5, $85F0, $82F8,  $28 ;C
 +
 +
dc.w 5, $85F4, $82FA,  $48 ;R
 +
dc.w 5, $85E6, $82F3,  $58 ;U
 +
dc.w 1, $85EE, $82F7,  $68 ;I
 +
dc.w 5, $8584, $82C2,  $70 ;N
 +
 +
TitleCard_SCZ:
 +
dc.w 8 ; number of letters
 +
dc.w 5, $85DE, $82EF, $FFF0 ;S
 +
dc.w 5, $85E2, $82F1,    0 ;K
 +
dc.w 5, $85E6, $82F3,  $10 ;Y
 +
 +
dc.w 5, $85EA, $82F5,  $30 ;C
 +
dc.w 5, $85EE, $82F7,  $40 ;H
 +
dc.w 5, $85F2, $82F7,  $50 ;A
 +
dc.w 5, $85DE, $82EF,  $60 ;S
 +
dc.w 5, $8580, $82C0,  $70 ;E
 +
 +
T_ZONE:
 +
dc.w 4 ; number of letters
 +
dc.w 5, $858C, $82C6,    0 ;Z
 +
dc.w 5, $8588, $82C4,  $10 ;O
 +
dc.w 5, $8584, $82C2,  $20 ;N
 +
dc.w 5, $8580, $82C0,  $30 ;E
 +
 +
T_ACT1:
 +
dc.w $1 ; number of digits
 +
dc.w 7, $A590, $A2C8,    0 ;1
 +
 +
T_ACT2:
 +
dc.w $1 ; number of digits
 +
dc.w $B, $A598, $A2CC,    0 ;2
 +
 +
T_ACT3:
 +
dc.w $1 ; number of digits
 +
dc.w $B, $A5A4, $A2D2,    0 ;3
 +
 +
T_STH:
 +
dc.w $5 ; number of tiles (what they say is below)
 +
dc.w $D, $85B0, $82DE, $FFB8 ;SONI
 +
dc.w $D, $85B8, $82DC, $FFD8 ;C TH
 +
dc.w $D, $85C0, $82E0, $FFF8 ;E HE
 +
dc.w $D, $85C8, $82E4,  $18 ;DGEH
 +
dc.w $5, $85D0, $82E8,  $38 ;OG
 +
 +
T_STRIPEDGE:
 +
dc.w $7 ; number of tiles (to display strip edge)
 +
dc.w $9003, $85D4, $82EA, 0 ;>
 +
dc.w $B003, $85D4, $82EA, 0 ;>
 +
dc.w $D003, $85D4, $82EA, 0 ;>
 +
dc.w $F003, $85D4, $82EA, 0 ;>
 +
dc.w $1003, $85D4, $82EA, 0 ;>
 +
dc.w $3003, $85D4, $82EA, 0 ;>
 +
dc.w $5003, $85D4, $82EA, 0 ;>
 +
; ==================================================================
 +
</syntaxhighlight>
  
    dc.w $0005, $85F4, $82FA, $0048 ;H
+
To avoid alignment problems, add this line before and after the code above:
    dc.w $0001, $85F8, $82F2, $0058 ;I
 
    dc.w $0005, $85EC, $82F6, $0060 ;L
 
    dc.w $0005, $85EC, $82F6, $0070 ;L
 
  
Titlecard_LZ:     dc.w $9 ; number of letters
+
<syntaxhighlight lang="asm">
    dc.w $0005, $85DE, $82EF, $FFE8 ;L
+
     align $200
    dc.w $0005, $85E2, $82F1, $FFF8 ;A
+
</syntaxhighlight>
    dc.w $0005, $85E6, $82F3, $0008 ;B
 
    dc.w $0005, $85EA, $82F5, $0018 ;Y
 
    dc.w $0005, $85EE, $82F7, $0028 ;R
 
    dc.w $0001, $85F2, $82F9, $0038 ;I
 
    dc.w $0005, $8584, $82C2, $0040 ;N
 
    dc.w $0005, $85F4, $82FA, $0050 ;T
 
    dc.w $0005, $85F8, $82FC, $0060 ;H
 
  
Titlecard_WZ:     dc.w $4 ; number of letters
+
==Extending the Palette Cycle information==
    dc.w $0009, $85DE, $82EF, $0008 ;W
+
Now we want to locate:
    dc.w $0005, $8588, $82C4, $0010 ;O
+
<syntaxhighlight lang="asm">
    dc.w $0005, $8588, $82C4, $0020 ;O
+
; off_19F4:
    dc.w $0005, $85E4, $82F2, $0030 ;D
+
PalCycle: zoneOrderedOffsetTable 2,1
 +
zoneOffsetTableEntry.w PalCycle_EHZ ; 0
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1
 +
zoneOffsetTableEntry.w PalCycle_WZ ; 2
 +
zoneOffsetTableEntry.w PalCycle_Null ; 3
 +
zoneOffsetTableEntry.w PalCycle_MTZ ; 4
 +
zoneOffsetTableEntry.w PalCycle_MTZ ; 5
 +
zoneOffsetTableEntry.w PalCycle_WFZ ; 6
 +
zoneOffsetTableEntry.w PalCycle_HTZ ; 7
 +
zoneOffsetTableEntry.w PalCycle_HPZ ; 8
 +
zoneOffsetTableEntry.w PalCycle_Null ; 9
 +
zoneOffsetTableEntry.w PalCycle_OOZ ; 10
 +
zoneOffsetTableEntry.w PalCycle_MCZ ; 11
 +
zoneOffsetTableEntry.w PalCycle_CNZ ; 12
 +
zoneOffsetTableEntry.w PalCycle_CPZ ; 13
 +
zoneOffsetTableEntry.w PalCycle_CPZ ; 14
 +
zoneOffsetTableEntry.w PalCycle_ARZ ; 15
 +
zoneOffsetTableEntry.w PalCycle_WFZ ; 16
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
 +
and replace it with:
 +
<syntaxhighlight lang="asm">
 +
; off_19F4:
 +
PalCycle: zoneOrderedOffsetTable 2,1
 +
zoneOffsetTableEntry.w PalCycle_EHZ ; 00
 +
zoneOffsetTableEntry.w PalCycle_Null ; 01
 +
zoneOffsetTableEntry.w PalCycle_WZ ; 02
 +
zoneOffsetTableEntry.w PalCycle_Null ; 03
 +
zoneOffsetTableEntry.w PalCycle_MTZ ; 04
 +
zoneOffsetTableEntry.w PalCycle_MTZ ; 05
 +
zoneOffsetTableEntry.w PalCycle_WFZ ; 06
 +
zoneOffsetTableEntry.w PalCycle_HTZ ; 07
 +
zoneOffsetTableEntry.w PalCycle_HPZ ; 08
 +
zoneOffsetTableEntry.w PalCycle_Null ; 09
 +
zoneOffsetTableEntry.w PalCycle_OOZ ; 0A
 +
zoneOffsetTableEntry.w PalCycle_MCZ ; 0B
 +
zoneOffsetTableEntry.w PalCycle_CNZ ; 0C
 +
zoneOffsetTableEntry.w PalCycle_CPZ ; 0D
 +
zoneOffsetTableEntry.w PalCycle_CPZ ; 0E
 +
zoneOffsetTableEntry.w PalCycle_ARZ ; 0F
 +
zoneOffsetTableEntry.w PalCycle_WFZ ; 10
 +
zoneOffsetTableEntry.w PalCycle_Null ; 11
 +
zoneOffsetTableEntry.w PalCycle_Null ; 12
 +
zoneOffsetTableEntry.w PalCycle_Null ; 13
 +
zoneOffsetTableEntry.w PalCycle_Null ; 14
 +
zoneOffsetTableEntry.w PalCycle_Null ; 15
 +
zoneOffsetTableEntry.w PalCycle_Null ; 16
 +
zoneOffsetTableEntry.w PalCycle_Null ; 17
 +
zoneOffsetTableEntry.w PalCycle_Null ; 18
 +
zoneOffsetTableEntry.w PalCycle_Null ; 19
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1A
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1B
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1C
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1D
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1E
 +
zoneOffsetTableEntry.w PalCycle_Null ; 1F
 +
zoneOffsetTableEntry.w PalCycle_Null ; 20
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
Titlecard_DHZ:     dc.w $8 ; number of letters
+
That inserts empty slots for the cycling palettes of out new levels.
    dc.w $0005, $85DE, $82EF, $FFE8 ;D
 
    dc.w $0005, $85E2, $82F1, $FFF8 ;U
 
    dc.w $0005, $85E6, $82F3, $0008 ;S
 
    dc.w $0005, $85EA, $82F5, $0018 ;T
 
  
    dc.w $0005, $85EE, $82F7, $0038 ;H
+
==Extending the static palette list==
    dc.w $0001, $85F2, $82F9, $0048 ;I
+
Next we locate:
    dc.w $0005, $85F4, $82FA, $0050 ;L
+
<syntaxhighlight lang="asm">
    dc.w $0005, $85F4, $82FA, $0060 ;L
+
;----------------------------------------------------------------------------
 +
; Palette pointers
 +
; (PALETTE DESCRIPTOR ARRAY)
 +
; This struct array defines the palette to use for each level.
 +
;----------------------------------------------------------------------------
  
Titlecard_MTZ:     dc.w $a ; number of letters
+
palptr macro ptr,lineno
    dc.w $0009, $85DE, $82EF, $FFE8 ;M
+
dc.l ptr ; Pointer to palette
    dc.w $0005, $8580, $82C0, $FFF8 ;E
+
dc.w (Normal_palette+lineno*palette_line_size)&$FFFF ; Location in ram to load palette into
    dc.w $0005, $85E4, $82F2, $0008 ;T
+
dc.w bytesToLcnt(ptr_End-ptr) ; Size of palette in (bytes / 4)
    dc.w $0005, $85E8, $82F4, $0018 ;R
+
endm
    dc.w $0005, $8588, $82C4, $0028 ;O
 
    dc.w $0005, $85EC, $82F6, $0038 ;P
 
    dc.w $0005, $8588, $82C4, $0048 ;O
 
    dc.w $0005, $85F0, $82F8, $0058 ;L
 
    dc.w $0001, $85F4, $82FA, $0068 ;I
 
    dc.w $0005, $85F6, $82FB, $0070 ;S
 
  
Titlecard_WFZ:     dc.w $c ; number of letters
+
PalPointers:
    dc.w $0009, $85DE, $82EF, $FFB0 ;W
+
PalPtr_SEGA: palptr Pal_SEGA,  0
    dc.w $0001, $85E4, $82F2, $FFC8 ;I
+
PalPtr_Title: palptr Pal_Title, 1
    dc.w $0005, $8584, $82C2, $FFD0 ;N
+
PalPtr_MenuB: palptr Pal_MenuB, 0
    dc.w $0005, $85E6, $82F3, $FFE0 ;G
+
PalPtr_BGND: palptr Pal_BGND,  0
 +
PalPtr_EHZ: palptr Pal_EHZ,  1
 +
PalPtr_EHZ2: palptr Pal_EHZ,  1
 +
PalPtr_WZ: palptr Pal_WZ,    1
 +
PalPtr_EHZ3: palptr Pal_EHZ,  1
 +
PalPtr_MTZ: palptr Pal_MTZ,  1
 +
PalPtr_MTZ2: palptr Pal_MTZ,  1
 +
PalPtr_WFZ: palptr Pal_WFZ,  1
 +
PalPtr_HTZ: palptr Pal_HTZ,  1
 +
PalPtr_HPZ: palptr Pal_HPZ,  1
 +
PalPtr_EHZ4: palptr Pal_EHZ,  1
 +
PalPtr_OOZ: palptr Pal_OOZ,  1
 +
PalPtr_MCZ: palptr Pal_MCZ,  1
 +
PalPtr_CNZ: palptr Pal_CNZ,  1
 +
PalPtr_CPZ: palptr Pal_CPZ,  1
 +
PalPtr_DEZ: palptr Pal_DEZ,  1
 +
PalPtr_ARZ: palptr Pal_ARZ,  1
 +
PalPtr_SCZ: palptr Pal_SCZ,  1
 +
PalPtr_HPZ_U: palptr Pal_HPZ_U, 0
 +
PalPtr_CPZ_U: palptr Pal_CPZ_U, 0
 +
PalPtr_ARZ_U: palptr Pal_ARZ_U, 0
 +
PalPtr_SS: palptr Pal_SS,    0
 +
PalPtr_MCZ_B: palptr Pal_MCZ_B, 1
 +
PalPtr_CNZ_B: palptr Pal_CNZ_B, 1
 +
PalPtr_SS1: palptr Pal_SS1,   3
 +
PalPtr_SS2: palptr Pal_SS2,   3
 +
PalPtr_SS3: palptr Pal_SS3,   3
 +
PalPtr_SS4: palptr Pal_SS4,  3
 +
PalPtr_SS5: palptr Pal_SS5,  3
 +
PalPtr_SS6: palptr Pal_SS6,   3
 +
PalPtr_SS7: palptr Pal_SS7,   3
 +
PalPtr_SS1_2p: palptr Pal_SS1_2p,3
 +
PalPtr_SS2_2p: palptr Pal_SS2_2p,3
 +
PalPtr_SS3_2p: palptr Pal_SS3_2p,3
 +
PalPtr_OOZ_B: palptr Pal_OOZ_B, 1
 +
PalPtr_Menu: palptr Pal_Menu, 0
 +
PalPtr_Result: palptr Pal_Result,0
  
    dc.w $0005, $85EA, $82F5, $0000 ;F
+
; ----------------------------------------------------------------------------
    dc.w $0005, $8588, $82C4, $0010 ;O
+
</syntaxhighlight>
    dc.w $0005, $85EE, $82F7, $0020 ;R
 
    dc.w $0005, $85F2, $82F9, $0030 ;T
 
    dc.w $0005, $85EE, $82F7, $0040 ;R
 
    dc.w $0005, $8580, $82C0, $0050 ;E
 
    dc.w $0005, $85F6, $82FB, $0060 ;S
 
    dc.w $0005, $85F6, $82FB, $0070 ;S
 
  
Titlecard_HTZ:     dc.w $7 ; number of letters
+
We all know that the palettes are directly addressed here. It means the index above can detect palettes anywhere in the ROM.
    dc.w $0005, $85DE, $82EF, $0008 ;H
+
This label, PalPointers, is called directly. We can, then, move this table to any location we want it in the ROM. Put this after:
    dc.w $0001, $85E2, $82F1, $0018 ;I
 
    dc.w $0005, $85E4, $82F2, $0020 ;L
 
    dc.w $0005, $85E4, $82F2, $0030 ;L
 
  
    dc.w $0005, $85E8, $82F4, $0050 ;T
+
<syntaxhighlight lang="asm">
    dc.w $0005, $8588, $82C4, $0060 ;O
+
    EndOfHeader:
    dc.w $0005, $85EC, $82F6, $0070 ;P
+
</syntaxhighlight>
  
Titlecard_HPZ:     dc.w $c ; number of letters
+
And after this table, put the following line to avoid alignment errors:
    dc.w $0005, $85DE, $82EF, $FFB8 ;H
 
    dc.w $0001, $85E2, $82F1, $FFC8 ;I
 
    dc.w $0005, $85E4, $82F2, $FFD0 ;D
 
    dc.w $0005, $85E4, $82F2, $FFE0 ;D
 
    dc.w $0005, $8580, $82C0, $FFF0 ;E
 
    dc.w $0005, $8584, $82C4, $0000 ;N
 
  
    dc.w $0005, $85E8, $82F4, $0020 ;P
+
<syntaxhighlight lang="asm">
    dc.w $0005, $85EC, $82F6, $0030 ;A
+
    align $200
    dc.w $0005, $85F0, $82F8, $0040 ;L
+
</syntaxhighlight>
    dc.w $0005, $85EC, $82F6, $0050 ;A
 
    dc.w $0005, $85F4, $82FA, $0060 ;C
 
    dc.w $0005, $8580, $82C0, $0070 ;E
 
  
Titlecard_GCZ:     dc.w $c ; number of letters
+
You can add more indexes to this table this way:
    dc.w $0005, $85DE, $82EF, $FFB8 ;G
+
<syntaxhighlight lang="asm">
    dc.w $0005, $8580, $82C0, $FFC8 ;E
+
palptr Palette,   Normal_palette_line2, $17
    dc.w $0005, $8584, $82C2, $FFD8 ;N
+
</syntaxhighlight>
    dc.w $0005, $8588, $82C4, $FFE8 ;O
 
    dc.w $0005, $85E2, $82F1, $FFF8 ;C
 
    dc.w $0001, $85E6, $82F3, $0008 ;I
 
    dc.w $0005, $85E8, $82F4, $0010 ;D
 
    dc.w $0005, $8580, $82C0, $0020 ;E
 
  
    dc.w $0005, $85E2, $82F1, $0040 ;C
+
for a normal level palette, and, for a underwater level palette, you will add the normal palette for that level and its underwater palette.
    dc.w $0001, $85E6, $82F3, $0050 ;I
+
<syntaxhighlight lang="asm">
    dc.w $0005, $85EC, $82F6, $0058 ;T
+
palptr UnderwaterPalette,   Normal_palette_line, $1F
    dc.w $0005, $85F0, $82F8, $0068 ;Y
+
</syntaxhighlight>
  
Titlecard_OOZ:     dc.w $8 ; number of letters
+
You must only have attention when adding more palettes to don't overflow the palette index (yes, it is possible to have 255 palettes...).
    dc.w $0005, $8588, $82C4, $FFF8 ;O
 
    dc.w $0001, $85DE, $82EF, $0008 ;I
 
    dc.w $0005, $85E0, $82F0, $0010 ;L
 
  
    dc.w $0005, $8588, $82C4, $0030 ;O
+
==Extending Zone Procedures and Scripts==
    dc.w $0005, $85E4, $82F2, $0040 ;C
+
Now we need to add the zone scripts.
    dc.w $0005, $8580, $82C0, $0050 ;E
 
    dc.w $0005, $85E8, $82F4, $0060 ;A
 
    dc.w $0005, $8584, $82C2, $0070 ;N
 
  
Titlecard_MCZ:     dc.w $a ; number of letters
+
Find:
    dc.w $0009, $85DE, $82EF, $FFD0 ;M
+
<syntaxhighlight lang="asm">
    dc.w $0005, $85E4, $82F2, $FFE8 ;Y
+
PLC_DYNANM: zoneOrderedOffsetTable 2,2 ; Zone ID
    dc.w $0005, $85E8, $82F4, $FFF8 ;S
+
zoneOffsetTableEntry.w Dynamic_Normal ; $00
    dc.w $0005, $85EC, $82F6, $0008 ;T
+
zoneOffsetTableEntry.w Animated_EHZ
    dc.w $0001, $85F0, $82F8, $0018 ;I
 
    dc.w $0005, $85F2, $82F9, $0020 ;C
 
  
    dc.w $0005, $85F2, $82F9, $0040 ;C
+
zoneOffsetTableEntry.w Dynamic_Null ; $01
    dc.w $0005, $85F6, $82FB, $0050 ;A
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $0005, $85FA, $82FD, $0060 ;V
 
    dc.w $0005, $8580, $82C0, $0070 ;E
 
  
Titlecard_CNZ:     dc.w $b ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Null ; $02
    dc.w $0005, $85DE, $82EF, $FFD0 ;C
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $0005, $85E2, $82F1, $FFE0 ;A
 
    dc.w $0005, $85E6, $82F3, $FFF0 ;S
 
    dc.w $0001, $85EA, $82F5, $0000 ;I
 
    dc.w $0005, $8584, $82C2, $0008 ;N
 
    dc.w $0005, $8588, $82C4, $0018 ;O
 
  
    dc.w $0005, $8584, $82C2, $0038 ;N
+
zoneOffsetTableEntry.w Dynamic_Null ; $03
    dc.w $0001, $85EA, $82F5, $0048 ;I
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $0005, $85EC, $82F6, $0050 ;G
 
    dc.w $0005, $85F0, $82F8, $0060 ;H
 
    dc.w $0005, $85F4, $82FA, $0070 ;T
 
  
Titlecard_CPZ:     dc.w $d ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Normal ; $04
    dc.w $0005, $85DE, $82EF, $FFA0 ;C
+
zoneOffsetTableEntry.w Animated_MTZ
    dc.w $0005, $85E2, $82F1, $FFB0 ;H
 
    dc.w $0005, $8580, $82C0, $FFC0 ;E
 
    dc.w $0009, $85E6, $82F3, $FFD0 ;M
 
    dc.w $0001, $85EC, $82F6, $FFE8 ;I
 
    dc.w $0005, $85DE, $82EF, $FFF0 ;C
 
    dc.w $0005, $85EE, $82F7, $0000 ;A
 
    dc.w $0005, $85F2, $82F9, $0010 ;L
 
  
    dc.w $0005, $85F6, $82FB, $0030 ;P
+
zoneOffsetTableEntry.w Dynamic_Normal ; $05
    dc.w $0005, $85F2, $82F9, $0040 ;L
+
zoneOffsetTableEntry.w Animated_MTZ
    dc.w $0005, $85EE, $82F7, $0050 ;A
 
    dc.w $0005, $8584, $82C2, $0060 ;N
 
    dc.w $0005, $85FA, $82FD, $0070 ;T
 
  
Titlecard_DEZ:     dc.w $8 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Null ; $06
    dc.w $0005, $85DE, $82EF, $FFF0 ;D
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $0005, $8580, $82C0, $0000 ;E
 
    dc.w $0005, $85E2, $82F1, $0010 ;A
 
    dc.w $0005, $85E6, $82F3, $0020 ;T
 
    dc.w $0005, $85EA, $82F5, $0030 ;H
 
  
    dc.w $0005, $8580, $82C0, $0050 ;E
+
zoneOffsetTableEntry.w Dynamic_HTZ ; $07
    dc.w $0005, $85EE, $82F7, $0060 ;G
+
zoneOffsetTableEntry.w Animated_HTZ
    dc.w $0005, $85EE, $82F7, $0070 ;G
 
  
Titlecard_ARZ:     dc.w $c ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Normal ; $08
    dc.w $0005, $85DE, $82EF, $FFD0 ;A
+
zoneOffsetTableEntry.w Animated_HPZ
    dc.w $0005, $85E2, $82F1, $FFE0 ;Q
 
    dc.w $0005, $85E6, $82F3, $FFF0 ;U
 
    dc.w $0005, $85DE, $82EF, $0000 ;A
 
    dc.w $0005, $85EA, $82F5, $0010 ;T
 
    dc.w $0001, $85EE, $82F7, $0020 ;I
 
    dc.w $0005, $85F0, $82F8, $0028 ;C
 
  
    dc.w $0005, $85F4, $82FA, $0048 ;R
+
zoneOffsetTableEntry.w Dynamic_Null ; $09
    dc.w $0005, $85E6, $82F3, $0058 ;U
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $0001, $85EE, $82F7, $0068 ;I
 
    dc.w $0005, $8584, $82C2, $0070 ;N
 
  
Titlecard_SCZ:     dc.w $8 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Normal ; $0A
    dc.w $0005, $85DE, $82EF, $FFF0 ;S
+
zoneOffsetTableEntry.w Animated_OOZ
    dc.w $0005, $85E2, $82F1, $0000 ;K
 
    dc.w $0005, $85E6, $82F3, $0010 ;Y
 
  
    dc.w $0005, $85EA, $82F5, $0030 ;C
+
zoneOffsetTableEntry.w Dynamic_Null ; $0B
    dc.w $0005, $85EE, $82F7, $0040 ;H
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $0005, $85F2, $82F7, $0050 ;A
 
    dc.w $0005, $85DE, $82EF, $0060 ;S
 
    dc.w $0005, $8580, $82C0, $0070 ;E
 
  
Titlecard_NZ:     dc.w $3 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_CNZ ; $0C
    dc.w $0005, $8584, $82C2, $0048 ;N
+
zoneOffsetTableEntry.w Animated_CNZ
    dc.w $0005, $8580, $82C0, $0058 ;E
 
    dc.w $0009, $85DE, $82EF, $0068 ;W
 
  
T_ZONE:     dc.w $4 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Normal ; $0D
    dc.w $0005, $858C, $82C6, $0000 ;Z
+
zoneOffsetTableEntry.w Animated_CPZ
    dc.w $0005, $8588, $82C4, $0010 ;O
 
    dc.w $0005, $8584, $82C2, $0020 ;N
 
    dc.w $0005, $8580, $82C0, $0030 ;E
 
  
 +
zoneOffsetTableEntry.w Dynamic_Normal ; $0E
 +
zoneOffsetTableEntry.w Animated_DEZ
  
T_ACT1:             dc.w $1 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_ARZ ; $0F
    dc.w $0007, $A590, $A2C8, $0000 ;1
+
zoneOffsetTableEntry.w Animated_ARZ
  
T_ACT2:     dc.w $1 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Null ; $10
    dc.w $000B, $A598, $A2CC, $0000 ;2
+
zoneOffsetTableEntry.w Animated_Null
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
T_ACT3:     dc.w $1 ; number of letters
+
and add to the end of it just before zoneTableEnd:
    dc.w $000B, $A5A4, $A2D2, $0000 ;3
+
<syntaxhighlight lang="asm">
 +
zoneOffsetTableEntry.w Dynamic_Null ; $11
 +
zoneOffsetTableEntry.w Animated_Null
  
T_STH:          dc.w $5 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Null ; $12
    dc.w $000D, $85B0, $82DE, $FFB8 ;SONI
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $000D, $85B8, $82DC, $FFD8 ;C TH
 
    dc.w $000D, $85C0, $82E0, $FFF8 ;E HE
 
    dc.w $000D, $85C8, $82E4, $0018 ;DGEH
 
    dc.w $0005, $85D0, $82E8, $0038 ;OG
 
  
T_STRIPEDGE:     dc.w $7 ; number of letters
+
zoneOffsetTableEntry.w Dynamic_Null ; $13
    dc.w $9003, $85D4, $82EA, $0000 ;>
+
zoneOffsetTableEntry.w Animated_Null
    dc.w $B003, $85D4, $82EA, $0000 ;>
 
    dc.w $D003, $85D4, $82EA, $0000 ;>
 
    dc.w $F003, $85D4, $82EA, $0000 ;>
 
    dc.w $1003, $85D4, $82EA, $0000 ;>
 
    dc.w $3003, $85D4, $82EA, $0000 ;>
 
    dc.w $5003, $85D4, $82EA, $0000 ;>
 
  
; -------------------------------------------------------------------------------
+
zoneOffsetTableEntry.w Dynamic_Null ; $14
</asm>
+
zoneOffsetTableEntry.w Animated_Null
  
==Extending the Palette Cycle information==
+
zoneOffsetTableEntry.w Dynamic_Null ; $15
Now we want to locate:
+
zoneOffsetTableEntry.w Animated_Null
<asm>
 
; off_19F4:
 
PalCycle:
 
dc.w PalCycle_EHZ - PalCycle ; 0
 
dc.w PalCycle_Null - PalCycle ; 1
 
dc.w PalCycle_Level2 - PalCycle ; 2
 
dc.w PalCycle_Null - PalCycle ; 3
 
dc.w PalCycle_MTZ - PalCycle ; 4
 
dc.w PalCycle_MTZ - PalCycle ; 5
 
dc.w PalCycle_WFZ - PalCycle ; 6
 
dc.w PalCycle_HTZ - PalCycle ; 7
 
dc.w PalCycle_HPZ - PalCycle ; 8
 
dc.w PalCycle_Null - PalCycle ; 9
 
dc.w PalCycle_OOZ - PalCycle ; 10
 
dc.w PalCycle_MCZ - PalCycle ; 11
 
dc.w PalCycle_CNZ - PalCycle ; 12
 
dc.w PalCycle_CPZ - PalCycle ; 13
 
dc.w PalCycle_CPZ - PalCycle ; 14
 
dc.w PalCycle_ARZ - PalCycle ; 15
 
dc.w PalCycle_WFZ - PalCycle ; 16
 
</asm>
 
  
and replace it with:
+
zoneOffsetTableEntry.w Dynamic_Null ; $16
<asm>
+
zoneOffsetTableEntry.w Animated_Null
; off_19F4:
 
PalCycle:
 
dc.w PalCycle_EHZ - PalCycle ; 00
 
dc.w PalCycle_Null - PalCycle ; 01
 
dc.w PalCycle_Level2 - PalCycle ; 02
 
dc.w PalCycle_Null - PalCycle ; 03
 
dc.w PalCycle_MTZ - PalCycle ; 04
 
dc.w PalCycle_MTZ - PalCycle ; 05
 
dc.w PalCycle_WFZ - PalCycle ; 06
 
dc.w PalCycle_HTZ - PalCycle ; 07
 
dc.w PalCycle_HPZ - PalCycle ; 08
 
dc.w PalCycle_Null - PalCycle ; 09
 
dc.w PalCycle_OOZ - PalCycle ; 0A
 
dc.w PalCycle_MCZ - PalCycle ; 0B
 
dc.w PalCycle_CNZ - PalCycle ; 0C
 
dc.w PalCycle_CPZ - PalCycle ; 0D
 
dc.w PalCycle_CPZ - PalCycle ; 0E
 
dc.w PalCycle_ARZ - PalCycle ; 0F
 
dc.w PalCycle_WFZ - PalCycle ; 10
 
dc.w PalCycle_Null - PalCycle ; 11
 
dc.w PalCycle_Null - PalCycle ; 12
 
dc.w PalCycle_Null - PalCycle ; 13
 
dc.w PalCycle_Null - PalCycle ; 14
 
dc.w PalCycle_Null - PalCycle ; 15
 
dc.w PalCycle_Null - PalCycle ; 16
 
dc.w PalCycle_Null - PalCycle ; 17
 
dc.w PalCycle_Null - PalCycle ; 18
 
dc.w PalCycle_Null - PalCycle ; 19
 
dc.w PalCycle_Null - PalCycle ; 1A
 
dc.w PalCycle_Null - PalCycle ; 1B
 
dc.w PalCycle_Null - PalCycle ; 1C
 
dc.w PalCycle_Null - PalCycle ; 1D
 
dc.w PalCycle_Null - PalCycle ; 1E
 
dc.w PalCycle_Null - PalCycle ; 1F
 
dc.w PalCycle_Null - PalCycle ; 20
 
</asm>
 
  
That inserts empty slots for the cycling palettes of out new levels.
+
zoneOffsetTableEntry.w Dynamic_Null ; $17
 +
zoneOffsetTableEntry.w Animated_Null
  
==Extending the static palette list==
+
zoneOffsetTableEntry.w Dynamic_Null ; $18
Next we locate:
+
zoneOffsetTableEntry.w Animated_Null
<asm>
 
PalPointers:
 
palptr Pal_SEGA,  Normal_palette, $1F
 
palptr Pal_Title, Normal_palette_line2, 7
 
palptr Pal_UNK1,  Normal_palette, $1F
 
palptr Pal_BGND,  Normal_palette, $F
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_WZ,    Normal_palette_line2, $17
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_MTZ,  Normal_palette_line2, $17
 
palptr Pal_MTZ,  Normal_palette_line2, $17
 
palptr Pal_WFZ,  Normal_palette_line2, $17
 
palptr Pal_HTZ,  Normal_palette_line2, $17
 
palptr Pal_HPZ,  Normal_palette_line2, $17
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_OOZ,  Normal_palette_line2, $17
 
palptr Pal_MCZ,  Normal_palette_line2, $17
 
palptr Pal_CNZ,  Normal_palette_line2, $17
 
palptr Pal_CPZ,  Normal_palette_line2, $17
 
palptr Pal_DEZ,  Normal_palette_line2, $17
 
palptr Pal_ARZ,  Normal_palette_line2, $17
 
palptr Pal_SCZ,  Normal_palette_line2, $17
 
palptr Pal_HPZ_U, Normal_palette, $1F
 
palptr Pal_CPZ_U, Normal_palette, $1F
 
palptr Pal_ARZ_U, Normal_palette, $1F
 
palptr Pal_SS,    Normal_palette, $17
 
palptr Pal_UNK2,  Normal_palette_line2, 7
 
palptr Pal_UNK3,  Normal_palette_line2, 7
 
palptr Pal_SS1,  Normal_palette_line4, 7
 
palptr Pal_SS2,  Normal_palette_line4, 7
 
palptr Pal_SS3,  Normal_palette_line4, 7
 
palptr Pal_SS4,  Normal_palette_line4, 7
 
palptr Pal_SS5,  Normal_palette_line4, 7
 
palptr Pal_SS6,  Normal_palette_line4, 7
 
palptr Pal_SS7,  Normal_palette_line4, 7
 
palptr Pal_UNK4,  Normal_palette_line4, 7
 
palptr Pal_UNK5,  Normal_palette_line4, 7
 
palptr Pal_UNK6,  Normal_palette_line4, 7
 
palptr Pal_OOZ_B, Normal_palette_line2, 7
 
palptr Pal_Menu,  Normal_palette, $1F
 
palptr Pal_UNK7,  Normal_palette, $1F
 
  
; ----------------------------------------------------------------------------
+
zoneOffsetTableEntry.w Dynamic_Null ; $19
Pal_SEGA:  BINCLUDE "art/palettes/Sega screen.bin" ; SEGA screen palette (Sonic and initial background)
+
zoneOffsetTableEntry.w Animated_Null
Pal_Title: BINCLUDE "art/palettes/Title screen.bin" ; Title screen Palette
 
Pal_UNK1:  BINCLUDE "art/palettes/Unknown 1.bin" ; Unknown palette 1 (leftover S1 level select palette?)
 
Pal_BGND:  BINCLUDE "art/palettes/SonicAndTails.bin" ; "Sonic and Miles" background palette (also usually the primary palette line)
 
Pal_EHZ:  BINCLUDE "art/palettes/EHZ.bin" ; Emerald Hill Zone palette
 
Pal_WZ:    BINCLUDE "art/palettes/Wood Zone.bin" ; Wood Zone palette
 
Pal_MTZ:  BINCLUDE "art/palettes/MTZ.bin" ; Metropolis Zone palette
 
Pal_WFZ:  BINCLUDE "art/palettes/WFZ.bin" ; Wing Fortress Zone palette
 
Pal_HTZ:  BINCLUDE "art/palettes/HTZ.bin" ; Hill Top Zone palette
 
Pal_HPZ:  BINCLUDE "art/palettes/HPZ.bin" ; Hidden Palace Zone palette
 
Pal_HPZ_U: BINCLUDE "art/palettes/HPZ underwater.bin" ; Hidden Palace Zone underwater palette
 
Pal_OOZ:  BINCLUDE "art/palettes/OOZ.bin" ; Oil Ocean Zone palette
 
Pal_MCZ:  BINCLUDE "art/palettes/MCZ.bin" ; Mystic Cave Zone palette
 
Pal_CNZ:  BINCLUDE "art/palettes/CNZ.bin" ; Casino Night Zone palette
 
Pal_CPZ:  BINCLUDE "art/palettes/CPZ.bin" ; Chemical Plant Zone palette
 
Pal_CPZ_U: BINCLUDE "art/palettes/CPZ underwater.bin" ; Chemical Plant Zone underwater palette
 
Pal_DEZ:  BINCLUDE "art/palettes/DEZ.bin" ; Death Egg Zone palette
 
Pal_ARZ:  BINCLUDE "art/palettes/ARZ.bin" ; Aquatic Ruin Zone palette
 
Pal_ARZ_U: BINCLUDE "art/palettes/ARZ underwater.bin" ; Aquatic Ruin Zone underwater palette
 
Pal_SCZ:  BINCLUDE "art/palettes/SCZ.bin" ; Sky Chase Zone palette
 
Pal_UNK2:  BINCLUDE "art/palettes/Unknown 2.bin" ; Unknown palette 2
 
Pal_UNK3:  BINCLUDE "art/palettes/Unknown 3.bin" ; Unknown palette 3
 
Pal_OOZ_B: BINCLUDE "art/palettes/OOZ Boss.bin" ; Oil Ocean Zone boss palette
 
Pal_Menu:  BINCLUDE "art/palettes/Menu.bin" ; Menu palette
 
Pal_SS:    BINCLUDE "art/palettes/Special Stage Main.bin" ; Special Stage palette
 
Pal_SS1:  BINCLUDE "art/palettes/Special Stage 1.bin" ; Special Stage 1 palette
 
Pal_SS2:  BINCLUDE "art/palettes/Special Stage 2.bin" ; Special Stage 2 palette
 
Pal_SS3:  BINCLUDE "art/palettes/Special Stage 3.bin" ; Special Stage 3 palette
 
Pal_SS4:  BINCLUDE "art/palettes/Special Stage 4.bin" ; Special Stage 4 palette
 
Pal_SS5:  BINCLUDE "art/palettes/Special Stage 5.bin" ; Special Stage 5 palette
 
Pal_SS6:  BINCLUDE "art/palettes/Special Stage 6.bin" ; Special Stage 6 palette
 
Pal_SS7:  BINCLUDE "art/palettes/Special Stage 7.bin" ; Special Stage 7 palette
 
Pal_UNK4:  BINCLUDE "art/palettes/Special Stage 1 2p.bin" ; Special Stage 1 2p palette
 
Pal_UNK5:  BINCLUDE "art/palettes/Special Stage 2 2p.bin" ; Special Stage 2 2p palette
 
Pal_UNK6:  BINCLUDE "art/palettes/Special Stage 3 2p.bin" ; Special Stage 3 2p palette
 
Pal_UNK7:  BINCLUDE "art/palettes/Special Stage Results Screen.bin" ; Special Stage Results Screen palette
 
</asm>
 
  
and replace it with:
+
zoneOffsetTableEntry.w Dynamic_Null ; $1A
<asm>
+
zoneOffsetTableEntry.w Animated_Null
PalPointers:
 
palptr Pal_SEGA,  Normal_palette, $1F
 
palptr Pal_Title, Normal_palette_line2, 7
 
palptr Pal_UNK1,  Normal_palette, $1F
 
palptr Pal_BGND,  Normal_palette, $F
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_WZ,    Normal_palette_line2, $17
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_MTZ,  Normal_palette_line2, $17
 
palptr Pal_MTZ,  Normal_palette_line2, $17
 
palptr Pal_WFZ,  Normal_palette_line2, $17
 
palptr Pal_HTZ,  Normal_palette_line2, $17
 
palptr Pal_HPZ,  Normal_palette_line2, $17
 
palptr Pal_EHZ,  Normal_palette_line2, $17
 
palptr Pal_OOZ,  Normal_palette_line2, $17
 
palptr Pal_MCZ,  Normal_palette_line2, $17
 
palptr Pal_CNZ,  Normal_palette_line2, $17
 
palptr Pal_CPZ,  Normal_palette_line2, $17
 
palptr Pal_DEZ,  Normal_palette_line2, $17
 
palptr Pal_ARZ,  Normal_palette_line2, $17
 
palptr Pal_SCZ,  Normal_palette_line2, $17
 
palptr Pal_HPZ_U, Normal_palette, $1F
 
palptr Pal_CPZ_U, Normal_palette, $1F
 
palptr Pal_ARZ_U, Normal_palette, $1F
 
palptr Pal_SS,    Normal_palette, $17
 
palptr Pal_UNK2,  Normal_palette_line2, 7
 
palptr Pal_UNK3,  Normal_palette_line2, 7
 
palptr Pal_SS1,  Normal_palette_line4, 7
 
palptr Pal_SS2,  Normal_palette_line4, 7
 
palptr Pal_SS3,  Normal_palette_line4, 7
 
palptr Pal_SS4,  Normal_palette_line4, 7
 
palptr Pal_SS5,  Normal_palette_line4, 7
 
palptr Pal_SS6,  Normal_palette_line4, 7
 
palptr Pal_SS7,  Normal_palette_line4, 7
 
palptr Pal_UNK4,  Normal_palette_line4, 7
 
palptr Pal_UNK5,  Normal_palette_line4, 7
 
palptr Pal_UNK6,  Normal_palette_line4, 7
 
palptr Pal_OOZ_B, Normal_palette_line2, 7
 
palptr Pal_Menu,  Normal_palette, $1F
 
palptr Pal_UNK7,  Normal_palette, $1F
 
palptr Pal_Lev11,  Normal_palette_line2, $17
 
palptr Pal_Lev12,  Normal_palette_line2, $17
 
palptr Pal_Lev13,  Normal_palette_line2, $17
 
palptr Pal_Lev14,  Normal_palette_line2, $17
 
palptr Pal_Lev15,  Normal_palette_line2, $17
 
palptr Pal_Lev16,  Normal_palette_line2, $17
 
palptr Pal_Lev17,  Normal_palette_line2, $17
 
palptr Pal_Lev18,  Normal_palette_line2, $17
 
palptr Pal_Lev19,  Normal_palette_line2, $17
 
palptr Pal_Lev1A,  Normal_palette_line2, $17
 
palptr Pal_Lev1B,  Normal_palette_line2, $17
 
palptr Pal_Lev1C,  Normal_palette_line2, $17
 
palptr Pal_Lev1D,  Normal_palette_line2, $17
 
palptr Pal_Lev1E,  Normal_palette_line2, $17
 
palptr Pal_Lev1F,  Normal_palette_line2, $17
 
palptr Pal_Lev20,  Normal_palette_line2, $17
 
  
; ----------------------------------------------------------------------------
+
zoneOffsetTableEntry.w Dynamic_Null ; $1B
Pal_SEGA:  BINCLUDE "art/palettes/Sega screen.bin" ; SEGA screen palette (Sonic and initial background)
+
zoneOffsetTableEntry.w Animated_Null
Pal_Title: BINCLUDE "art/palettes/Title screen.bin" ; Title screen Palette
 
Pal_UNK1:  BINCLUDE "art/palettes/Unknown 1.bin" ; Unknown palette 1 (leftover S1 level select palette?)
 
Pal_BGND:  BINCLUDE "art/palettes/SonicAndTails.bin" ; "Sonic and Miles" background palette (also usually the primary palette line)
 
Pal_EHZ:  BINCLUDE "art/palettes/EHZ.bin" ; Emerald Hill Zone palette
 
Pal_WZ:    BINCLUDE "art/palettes/Wood Zone.bin" ; Wood Zone palette
 
Pal_MTZ:  BINCLUDE "art/palettes/MTZ.bin" ; Metropolis Zone palette
 
Pal_WFZ:  BINCLUDE "art/palettes/WFZ.bin" ; Wing Fortress Zone palette
 
Pal_HTZ:  BINCLUDE "art/palettes/HTZ.bin" ; Hill Top Zone palette
 
Pal_HPZ:  BINCLUDE "art/palettes/HPZ.bin" ; Hidden Palace Zone palette
 
Pal_HPZ_U: BINCLUDE "art/palettes/HPZ underwater.bin" ; Hidden Palace Zone underwater palette
 
Pal_OOZ:  BINCLUDE "art/palettes/OOZ.bin" ; Oil Ocean Zone palette
 
Pal_MCZ:  BINCLUDE "art/palettes/MCZ.bin" ; Mystic Cave Zone palette
 
Pal_CNZ:  BINCLUDE "art/palettes/CNZ.bin" ; Casino Night Zone palette
 
Pal_CPZ:  BINCLUDE "art/palettes/CPZ.bin" ; Chemical Plant Zone palette
 
Pal_CPZ_U: BINCLUDE "art/palettes/CPZ underwater.bin" ; Chemical Plant Zone underwater palette
 
Pal_DEZ:  BINCLUDE "art/palettes/DEZ.bin" ; Death Egg Zone palette
 
Pal_ARZ:  BINCLUDE "art/palettes/ARZ.bin" ; Aquatic Ruin Zone palette
 
Pal_ARZ_U: BINCLUDE "art/palettes/ARZ underwater.bin" ; Aquatic Ruin Zone underwater palette
 
Pal_SCZ:  BINCLUDE "art/palettes/SCZ.bin" ; Sky Chase Zone palette
 
Pal_Lev11:  BINCLUDE "art/palettes/Lev11.bin" ; New Level palette
 
Pal_Lev12:  BINCLUDE "art/palettes/Lev12.bin" ; New Level palette
 
Pal_Lev13:  BINCLUDE "art/palettes/Lev13.bin" ; New Level palette
 
Pal_Lev14:  BINCLUDE "art/palettes/Lev14.bin" ; New Level palette
 
Pal_Lev15:  BINCLUDE "art/palettes/Lev15.bin" ; New Level palette
 
Pal_Lev16:  BINCLUDE "art/palettes/Lev16.bin" ; New Level palette
 
Pal_Lev17:  BINCLUDE "art/palettes/Lev17.bin" ; New Level palette
 
Pal_Lev18:  BINCLUDE "art/palettes/Lev18.bin" ; New Level palette
 
Pal_Lev19:  BINCLUDE "art/palettes/Lev19.bin" ; New Level palette
 
Pal_Lev1A:  BINCLUDE "art/palettes/Lev1A.bin" ; New Level palette
 
Pal_Lev1B:  BINCLUDE "art/palettes/Lev1B.bin" ; New Level palette
 
Pal_Lev1C:  BINCLUDE "art/palettes/Lev1C.bin" ; New Level palette
 
Pal_Lev1D:  BINCLUDE "art/palettes/Lev1D.bin" ; New Level palette
 
Pal_Lev1E:  BINCLUDE "art/palettes/Lev1E.bin" ; New Level palette
 
Pal_Lev1F:  BINCLUDE "art/palettes/Lev1F.bin" ; New Level palette
 
Pal_Lev20:  BINCLUDE "art/palettes/Lev20.bin" ; New Level palette
 
Pal_UNK2:  BINCLUDE "art/palettes/Unknown 2.bin" ; Unknown palette 2
 
Pal_UNK3:  BINCLUDE "art/palettes/Unknown 3.bin" ; Unknown palette 3
 
Pal_OOZ_B: BINCLUDE "art/palettes/OOZ Boss.bin" ; Oil Ocean Zone boss palette
 
Pal_Menu:  BINCLUDE "art/palettes/Menu.bin" ; Menu palette
 
Pal_SS:    BINCLUDE "art/palettes/Special Stage Main.bin" ; Special Stage palette
 
Pal_SS1:  BINCLUDE "art/palettes/Special Stage 1.bin" ; Special Stage 1 palette
 
Pal_SS2:  BINCLUDE "art/palettes/Special Stage 2.bin" ; Special Stage 2 palette
 
Pal_SS3:  BINCLUDE "art/palettes/Special Stage 3.bin" ; Special Stage 3 palette
 
Pal_SS4:  BINCLUDE "art/palettes/Special Stage 4.bin" ; Special Stage 4 palette
 
Pal_SS5:  BINCLUDE "art/palettes/Special Stage 5.bin" ; Special Stage 5 palette
 
Pal_SS6:  BINCLUDE "art/palettes/Special Stage 6.bin" ; Special Stage 6 palette
 
Pal_SS7:  BINCLUDE "art/palettes/Special Stage 7.bin" ; Special Stage 7 palette
 
Pal_UNK4:  BINCLUDE "art/palettes/Special Stage 1 2p.bin" ; Special Stage 1 2p palette
 
Pal_UNK5:  BINCLUDE "art/palettes/Special Stage 2 2p.bin" ; Special Stage 2 2p palette
 
Pal_UNK6:  BINCLUDE "art/palettes/Special Stage 3 2p.bin" ; Special Stage 3 2p palette
 
Pal_UNK7:  BINCLUDE "art/palettes/Special Stage Results Screen.bin" ; Special Stage Results Screen palette
 
</asm>
 
  
That inserts our new palettes, which we will be using when we start on the main level load block.
+
zoneOffsetTableEntry.w Dynamic_Null ; $1C
 +
zoneOffsetTableEntry.w Animated_Null
  
==Extending Zone Procedures and Scripts==
+
zoneOffsetTableEntry.w Dynamic_Null ; $1D
Now we need to add the zone scripts.
+
zoneOffsetTableEntry.w Animated_Null
  
Find:
+
zoneOffsetTableEntry.w Dynamic_Null ; $1E
<asm>
+
zoneOffsetTableEntry.w Animated_Null
PLC_DYNANM: ; Zone ID
 
dc.w Dynamic_Normal-PLC_DYNANM ; $00
 
dc.w Animated_EHZ-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM ; $01
+
zoneOffsetTableEntry.w Dynamic_Null ; $1F
dc.w Animated_Null-PLC_DYNANM
+
zoneOffsetTableEntry.w Animated_Null
  
dc.w Dynamic_Null-PLC_DYNANM ; $02
+
zoneOffsetTableEntry.w Dynamic_Null ; $20
dc.w Animated_Null-PLC_DYNANM
+
zoneOffsetTableEntry.w Animated_Null
 +
</syntaxhighlight>
  
dc.w Dynamic_Null-PLC_DYNANM ; $03
+
This creates scripts for the new levels. To make complex animations (like the HPZ pulsing ball) you will need to create a Anim*level*.bin and add it to the Anim*level*.bin files and add it to the animated pattern mappings. See the section below.
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Normal-PLC_DYNANM ; $04
+
==Extending Animated Pattern Mappings==
dc.w Animated_MTZ-PLC_DYNANM
+
Find:
 +
<syntaxhighlight lang="asm">
 +
AnimPatMaps: zoneOrderedOffsetTable 2,1
 +
zoneOffsetTableEntry.w APM_EHZ ;  0
 +
zoneOffsetTableEntry.w APM_Null ;  1
 +
zoneOffsetTableEntry.w APM_Null ;  2
 +
zoneOffsetTableEntry.w APM_Null ;  3
 +
zoneOffsetTableEntry.w APM_MTZ ;  4
 +
zoneOffsetTableEntry.w APM_MTZ ;  5
 +
zoneOffsetTableEntry.w APM_Null ;  6
 +
zoneOffsetTableEntry.w APM_EHZ ;  7
 +
zoneOffsetTableEntry.w APM_HPZ ;  8
 +
zoneOffsetTableEntry.w APM_Null ;  9
 +
zoneOffsetTableEntry.w APM_OOZ ; $A
 +
zoneOffsetTableEntry.w APM_Null ; $B
 +
zoneOffsetTableEntry.w APM_CNZ ; $C
 +
zoneOffsetTableEntry.w APM_CPZ ; $D
 +
zoneOffsetTableEntry.w APM_DEZ ; $E
 +
zoneOffsetTableEntry.w APM_ARZ ; $F
 +
zoneOffsetTableEntry.w APM_Null ;$10
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
dc.w Dynamic_Normal-PLC_DYNANM ; $05
+
then add this to the end of this index, just before zoneTableEnd:
dc.w Animated_MTZ-PLC_DYNANM
+
<syntaxhighlight lang="asm">
 +
zoneOffsetTableEntry.w APM_Null ;$11
 +
zoneOffsetTableEntry.w APM_Null ;$12
 +
zoneOffsetTableEntry.w APM_Null ;$13
 +
zoneOffsetTableEntry.w APM_Null ;$14
 +
zoneOffsetTableEntry.w APM_Null ;$15
 +
zoneOffsetTableEntry.w APM_Null ;$16
 +
zoneOffsetTableEntry.w APM_Null ;$17
 +
zoneOffsetTableEntry.w APM_Null ;$18
 +
zoneOffsetTableEntry.w APM_Null ;$19
 +
zoneOffsetTableEntry.w APM_Null ;$1A
 +
zoneOffsetTableEntry.w APM_Null ;$1B
 +
zoneOffsetTableEntry.w APM_Null ;$1C
 +
zoneOffsetTableEntry.w APM_Null ;$1D
 +
zoneOffsetTableEntry.w APM_Null ;$1E
 +
zoneOffsetTableEntry.w APM_Null ;$1F
 +
zoneOffsetTableEntry.w APM_Null ;$20
 +
</syntaxhighlight>
  
dc.w Dynamic_Null-PLC_DYNANM ; $06
+
then edit and change as needed. Add the new .bin files to below here:
dc.w Animated_Null-PLC_DYNANM
+
<syntaxhighlight lang="asm">
 +
; byte_40372:
 +
APM_EHZ: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$4 ,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$5 ,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$8 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$C ,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$9 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$D ,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$10,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$14,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$11,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$15,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$6 ,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$3 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$7 ,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$A ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$E ,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$B ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$F ,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$12,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$16,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$13,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$17,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$18,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1A,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$19,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1B,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1E,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1F,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_Checkers+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_Checkers+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$0,1,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$1,1,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$0,1,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$1,1,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$0,1,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$1,1,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$0,1,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$1,1,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$0,1,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$1,1,0,3,1)
 +
APM_EHZ_End:
  
dc.w Dynamic_HTZ-PLC_DYNANM ; $07
 
dc.w Animated_HTZ-PLC_DYNANM
 
  
dc.w Dynamic_Normal-PLC_DYNANM ; $08
 
dc.w Animated_OOZ-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM ; $09
+
; byte_403EE:
dc.w Animated_Null-PLC_DYNANM
+
APM_MTZ: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,1,0,1,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,1,0,1,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,1,0,1,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,1,0,1,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,1,0,1,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,1,0,1,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,1,0,1,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,1,0,1,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,1,0,1,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,1,0,1,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,1,0,1,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,1,0,1,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$0    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$1    ,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$2    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$3    ,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$4    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$5    ,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$8    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$9    ,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$6    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$7    ,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$A    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$B    ,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1)
 +
APM_MTZ_End:
  
dc.w Dynamic_Normal-PLC_DYNANM ; $0A
 
dc.w Animated_OOZ2-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM ; $0B
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_CNZ-PLC_DYNANM ; $0C
+
; byte_404C2:
dc.w Animated_CNZ-PLC_DYNANM
+
APM_HPZ: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0)
  
dc.w Dynamic_Normal-PLC_DYNANM ; $0D
+
    if gameRevision<2
dc.w Animated_CPZ-PLC_DYNANM
+
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
    endif
 +
APM_HPZ_End:
  
dc.w Dynamic_Normal-PLC_DYNANM ; $0F
 
dc.w Animated_DEZ-PLC_DYNANM
 
  
dc.w Dynamic_ARZ-PLC_DYNANM ; $10
 
dc.w Animated_ARZ-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM ; $11
+
; byte_405B6:
dc.w Animated_Null-PLC_DYNANM ; yes, level $11
+
APM_OOZ: begin_animpat
</asm>
+
dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$0,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$2,0,0,0,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$1,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$3,0,0,0,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$1,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$3,0,0,3,1)
 +
 +
    if gameRevision<2
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
 +
    else
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0)
 +
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
 +
    endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$1,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$9,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$3,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$B,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$5,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$D,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$7,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$F,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$1,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$9,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$3,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$B,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$5,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$D,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$7,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$F,0,0,2,1)
 +
APM_OOZ_End:
  
and add to the end of it:
 
<asm>
 
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
+
; byte_4061A:
dc.w Animated_Null-PLC_DYNANM
+
APM_CNZ: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$4,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$5,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$C,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$D,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$6,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$7,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$E,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$F,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$4,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$5,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$C,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$D,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$6,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$7,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$E,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$F,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$4,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$5,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$C,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$D,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$6,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$7,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$E,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$F,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$4,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$5,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$C,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$D,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$6,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$7,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$E,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$F,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$4,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$5,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$C,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$D,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$6,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$7,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$E,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$F,0,0,3,1)
 +
APM_CNZ_End:
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
+
; byte_406BE:
dc.w Animated_Null-PLC_DYNANM
+
APM_CNZ2P: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$4,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$5,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$C,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$D,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$6,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$7,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$E,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$F,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$4,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$5,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$C,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$D,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$6,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$7,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$E,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$F,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$4,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$5,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$C,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$D,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$6,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$7,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$E,0,0,0,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$F,0,0,0,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$4,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$5,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$C,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$D,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$6,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$7,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$E,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$F,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$4,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$5,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$C,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$D,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$6,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$7,0,0,3,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$E,0,0,3,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$F,0,0,3,1)
 +
APM_CNZ2P_End:
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
+
; byte_40762:
dc.w Animated_Null-PLC_DYNANM
+
APM_CPZ: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0)
 +
APM_CPZ_End:
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
+
; byte_4076E:
dc.w Animated_Null-PLC_DYNANM
+
APM_DEZ: begin_animpat
 +
dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0)
 +
APM_DEZ_End:
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
 
dc.w Animated_Null-PLC_DYNANM
 
  
dc.w Dynamic_Null-PLC_DYNANM
+
; byte_4077A:
dc.w Animated_Null-PLC_DYNANM
+
APM_ARZ: begin_animpat
</asm>
+
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1  ,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3  ,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1  ,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3  ,0,0,2,1)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,1)
 +
 +
;These are invalid animation entries for waterfalls (bug in original game):
 +
if 1==1
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,1)
 +
else
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,1)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,1)
 +
endif
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1  ,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3  ,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1  ,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3  ,0,0,2,0)
 +
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,0)
 +
 +
;These are invalid animation entries for waterfalls (bug in original game):
 +
if 1==1
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,0)
 +
else
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,0)
 +
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,0)
 +
endif
 +
APM_ARZ_End:
  
This creates scripts for the new levels. To make complex animations (like the HPZ pulsing ball) you will need to create a Anim*level*.bin and add it to the Anim*level*.bin files and add it to the animated pattern mappings. See the section below.
 
  
==Extending Animated Pattern Mappings==
 
Find:
 
<asm>
 
AnimPatMaps:
 
dc.w APM16_EHZ - AnimPatMaps ;  0
 
dc.w APM_Null - AnimPatMaps  ;  1
 
dc.w APM_Null - AnimPatMaps  ;  2
 
dc.w APM_Null - AnimPatMaps  ;  3
 
dc.w APM16_MTZ - AnimPatMaps ;  4
 
dc.w APM16_MTZ - AnimPatMaps ;  5
 
dc.w APM_Null - AnimPatMaps  ;  6
 
dc.w APM16_EHZ - AnimPatMaps ;  7
 
dc.w APM_HPZ - AnimPatMaps  ;  8
 
dc.w APM_Null - AnimPatMaps  ;  9
 
dc.w APM_OOZ - AnimPatMaps  ; $A
 
dc.w APM_Null - AnimPatMaps  ; $B
 
dc.w APM_CNZ - AnimPatMaps  ; $C
 
dc.w APM_CPZ - AnimPatMaps  ; $D
 
dc.w APM_DEZ - AnimPatMaps  ; $E
 
dc.w APM_ARZ - AnimPatMaps  ; $F
 
dc.w APM_Null - AnimPatMaps  ;$10
 
</asm>
 
  
then add this to the end
+
; byte_407BE:
<asm>
+
APM_Null: dc.w   0
dc.w APM_Null - AnimPatMaps
+
</syntaxhighlight>
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
dc.w APM_Null - AnimPatMaps
 
</asm>
 
  
then edit and change as needed. Add the new .bin files to below here:
+
and fit this table to suit your needs, creating the necessary load queries for them. (If so, you need to know what you're doing here.)
<asm>
 
; byte_40372:
 
APM16_EHZ: BINCLUDE "mappings/16x16/AnimEHZ.bin"
 
  
; byte_403EE:
+
==Extending the 1 Player and 2 Player music playlists==
APM16_MTZ: BINCLUDE "mappings/16x16/AnimMTZ.bin"
+
To avoid some code-breaking problems (branches), we will fix this using a different way.
  
; byte_404C2:
+
Go to EndOfHeader. If you are really following this tutorial, you've put a PalPointers table there. You will add between those two labels the following procedure:
APM_HPZ: BINCLUDE "mappings/16x16/AnimHPZ.bin"
+
<syntaxhighlight lang="asm">
 +
DefineLevelBGM:
 +
moveq    #0,d0
 +
move.b    (Current_Zone).w,d0
 +
lea    (NormalMusicList).l,a1
 +
tst.w    (Two_Player_Mode).w
 +
beq.s    PlayNormalMusic
 +
lea    (MusicList2PMode).l,a1
  
; byte_405B6:
+
PlayNormalMusic:
APM_OOZ: BINCLUDE "mappings/16x16/AnimOOZ.bin"
+
move.b    (a1,d0.w),d0
 +
move.w    d0,(Level_Music).w
 +
bsr.w    JTR_PlayMusic
 +
move.b #ObjID_TitleCard,(TitleCard+id).w ; <-- we need this, or there won't even be a title card, and if we remove it to remove the titlecard, we get a refresh glitch with sonic standing on air.
 +
jmp    Level_TtlCard
 +
rts
  
; byte_4061A:
+
JTR_PlayMusic:
APM_CNZ: BINCLUDE "mappings/16x16/AnimCNZ.bin"
+
jmp    PlayMusic
 +
rts
  
; byte_406BE:
+
NormalMusicList:
APM_CNZ2P: BINCLUDE "mappings/16x16/AnimCNZ2P.bin"
+
    dc.b    MusID_EHZ    ;00
 +
    dc.b    MusID_EHZ    ;01
 +
    dc.b    MusID_EHZ    ;02
 +
    dc.b    MusID_EHZ    ;03
 +
    dc.b    MusID_MTZ    ;04
 +
    dc.b    MusID_MTZ    ;05
 +
    dc.b    MusID_WFZ    ;06
 +
    dc.b    MusID_HTZ    ;07
 +
    dc.b    MusID_HPZ    ;08
 +
    dc.b    MusID_EHZ    ;09
 +
    dc.b    MusID_OOZ    ;0A
 +
    dc.b    MusID_MCZ    ;0B
 +
    dc.b    MusID_CNZ    ;0C
 +
    dc.b    MusID_CPZ    ;0D
 +
    dc.b    MusID_DEZ    ;0E
 +
    dc.b    MusID_ARZ    ;0F
 +
    dc.b    MusID_SCZ    ;10
 +
    dc.b    MusID_EHZ    ;11
 +
    dc.b    MusID_EHZ    ;12
 +
    dc.b    MusID_EHZ    ;13
 +
    dc.b    MusID_EHZ    ;14
 +
    dc.b    MusID_EHZ    ;15
 +
    dc.b    MusID_EHZ    ;16
 +
    dc.b    MusID_EHZ    ;17
 +
    dc.b    MusID_EHZ    ;18
 +
    dc.b    MusID_EHZ    ;19
 +
    dc.b    MusID_EHZ    ;1A
 +
    dc.b    MusID_EHZ    ;1B
 +
    dc.b    MusID_EHZ    ;1C
 +
    dc.b    MusID_EHZ    ;1D
 +
    dc.b    MusID_EHZ    ;1E
 +
    dc.b    MusID_EHZ    ;1F
 +
    dc.b    MusID_EHZ    ;20
  
; byte_40762:
+
    align 4
APM_CPZ: BINCLUDE "mappings/16x16/AnimCPZ.bin"
 
  
; byte_4076E:
+
MusicList2PMode:
APM_DEZ: BINCLUDE "mappings/16x16/AnimDEZ.bin"
+
    dc.b    MusID_EHZ_2P ;00
 
+
    dc.b    MusID_EHZ    ;01
; byte_4077A:
+
    dc.b    MusID_EHZ    ;02
APM_ARZ: BINCLUDE "mappings/16x16/AnimARZ.bin"
+
    dc.b    MusID_EHZ    ;03
 
+
    dc.b    MusID_MTZ    ;04
; byte_407BE:
+
    dc.b    MusID_MTZ    ;05
APM_Null: dc.w  0
+
    dc.b    MusID_WFZ    ;06
</asm>
+
    dc.b    MusID_HTZ    ;07
 +
    dc.b    MusID_HPZ    ;08
 +
    dc.b    MusID_EHZ    ;09
 +
    dc.b    MusID_OOZ    ;0A
 +
    dc.b    MusID_MCZ_2P ;0B
 +
    dc.b    MusID_CNZ_2P ;0C
 +
    dc.b    MusID_CPZ    ;0D
 +
    dc.b    MusID_DEZ    ;0E
 +
    dc.b    MusID_ARZ    ;0F
 +
    dc.b    MusID_SCZ    ;10
 +
    dc.b    MusID_EHZ    ;11
 +
    dc.b    MusID_EHZ    ;12
 +
    dc.b    MusID_EHZ    ;13
 +
    dc.b    MusID_EHZ    ;14
 +
    dc.b    MusID_EHZ    ;15
 +
    dc.b    MusID_EHZ    ;16
 +
    dc.b    MusID_EHZ    ;17
 +
    dc.b    MusID_EHZ    ;18
 +
    dc.b    MusID_EHZ    ;19
 +
    dc.b    MusID_EHZ    ;1A
 +
    dc.b    MusID_EHZ    ;1B
 +
    dc.b    MusID_EHZ    ;1C
 +
    dc.b    MusID_EHZ    ;1D
 +
    dc.b    MusID_EHZ    ;1E
 +
    dc.b    MusID_EHZ    ;1F
 +
    dc.b    MusID_EHZ    ;20
  
and then possibly create the nessisary load queries for them. (If so, you need to know what you're doing here.)
+
    align $200
 +
</syntaxhighlight>
 +
I decided to enumerate the music ids because it is likely you either extended the existing sound driver, or installed a new one if you added this many zones and you would likely want to not have to worry about fixing the music.
  
==Extending the 1 Player and 2 Player music playlists==
+
Now, go to Level_GetBGM. You will see this:
next we find:
+
<syntaxhighlight lang="asm">
<asm>
 
 
; loc_40AE:
 
; loc_40AE:
 
Level_GetBgm:
 
Level_GetBgm:
 
tst.w (Demo_mode_flag).w
 
tst.w (Demo_mode_flag).w
bmi.s loc_4114
+
bmi.s +
 
moveq #0,d0
 
moveq #0,d0
 
move.b (Current_Zone).w,d0
 
move.b (Current_Zone).w,d0
Line 982: Line 1,683:
 
beq.s Level_PlayBgm
 
beq.s Level_PlayBgm
 
lea MusicList2(pc),a1
 
lea MusicList2(pc),a1
</asm>
+
</syntaxhighlight>
  
 
and replace it with:
 
and replace it with:
<asm>
+
<syntaxhighlight lang="asm">
 
; loc_40AE:
 
; loc_40AE:
 
Level_GetBgm:
 
Level_GetBgm:
 
tst.w (Demo_mode_flag).w
 
tst.w (Demo_mode_flag).w
bmi.s loc_4114
+
bmi.s +
moveq #0,d0
+
jmp    DefineLevelBGM
move.b (Current_Zone).w,d0
+
</syntaxhighlight>
lea MusicList(pc),a1
 
tst.w (Two_player_mode).w
 
beq.s Level_PlayBgm
 
jsr Level_2PlayerBGMList
 
</asm>
 
  
 +
==Extending the demo list==
 +
now we will prepare everything so that we can put in new demo files for our new levels.
  
now we want to find:
+
find:
<asm>
+
<syntaxhighlight lang="asm">; off_4948:
;----------------------------------------------------------------------------
+
; ---------------------------------------------------------------------------
; 1P Music Playlist
+
; DEMO SCRIPT POINTERS
;----------------------------------------------------------------------------
 
; byte_3EA0:
 
MusicList:
 
dc.b  2+$80 ; 0 ; EHZ
 
dc.b  2+$80 ; 1
 
dc.b  5+$80 ; 2
 
dc.b  4+$80 ; 3
 
dc.b  5+$80 ; 4 ; MTZ1,2
 
dc.b  5+$80 ; 5 ; MTZ3
 
dc.b  $F+$80 ; 6 ; WFZ
 
dc.b  6+$80 ; 7 ; HTZ
 
dc.b $10+$80 ; 8
 
dc.b  $D+$80 ; 9
 
dc.b  4+$80 ; 10 ; OOZ
 
dc.b  $B+$80 ; 11 ; MCZ
 
dc.b  $9+$80 ; 12 ; CNZ
 
dc.b  $E+$80 ; 13 ; CPZ
 
dc.b  $A+$80 ; 14 ; DEZ
 
dc.b  7+$80 ; 15 ; ARZ
 
dc.b  $D+$80 ; 16 ; SCZ
 
dc.b  0 ; 17
 
;----------------------------------------------------------------------------
 
; 2P Music Playlist
 
;----------------------------------------------------------------------------
 
; byte_3EB2:
 
MusicList2:
 
dc.b  $C+$80 ; 0  ; EHZ 2P
 
dc.b  2+$80 ; 1
 
dc.b  5+$80 ; 2
 
dc.b  4+$80 ; 3
 
dc.b  5+$80 ; 4
 
dc.b  5+$80 ; 5
 
dc.b  $F+$80 ; 6
 
dc.b  6+$80 ; 7
 
dc.b $10+$80 ; 8
 
dc.b  $D+$80 ; 9
 
dc.b  4+$80 ; 10
 
dc.b  3+$80 ; 11 ; MCZ 2P
 
dc.b  8+$80 ; 12 ; CNZ 2P
 
dc.b  $E+$80 ; 13
 
dc.b  $A+$80 ; 14
 
dc.b  7+$80 ; 15
 
dc.b  $D+$80 ; 16
 
dc.b  0 ; 17
 
</asm>
 
  
and replace it with:
+
; Contains an array of pointers to the script controlling the players actions
<asm>
+
; to use for each level.
;----------------------------------------------------------------------------
+
; ---------------------------------------------------------------------------
; 2P Music Playlist
+
; off_4948:
;----------------------------------------------------------------------------
+
DemoScriptPointers: zoneOrderedTable 4,1
; byte_3EB2:
+
zoneTableEntry.l Demo_EHZ ; $00
MusicList2:
+
zoneTableEntry.l Demo_EHZ ; $01
dc.$C+$80 ; 00 ; EHZ 2P
+
zoneTableEntry.l Demo_EHZ ; $02
dc.b  2+$80 ; 01
+
zoneTableEntry.l Demo_EHZ ; $03
dc.b  5+$80 ; 02
+
zoneTableEntry.l Demo_EHZ ; $04
dc.b  4+$80 ; 03
+
zoneTableEntry.l Demo_EHZ ; $05
dc.b  5+$80 ; 04
+
zoneTableEntry.l Demo_EHZ ; $06
dc.b  5+$80 ; 05
+
zoneTableEntry.l Demo_EHZ ; $07
dc.$F+$80 ; 06
+
zoneTableEntry.l Demo_EHZ ; $08
dc.b  6+$80 ; 07
+
zoneTableEntry.l Demo_EHZ ; $09
dc.b $10+$80 ; 08
+
zoneTableEntry.l Demo_EHZ ; $0A
dc.b  $D+$80 ; 09
+
zoneTableEntry.l Demo_EHZ ; $0B
dc.b  4+$80 ; 0A
+
zoneTableEntry.l Demo_CNZ ; $0C
dc.b  3+$80 ; 0B ; MCZ 2P
+
zoneTableEntry.l Demo_CPZ ; $0D
dc.b  8+$80 ; 0C ; CNZ 2P
+
zoneTableEntry.l Demo_EHZ ; $0E
dc.$E+$80 ; 0D
+
zoneTableEntry.l Demo_ARZ ; $0F
dc.b  $A+$80 ; 0E
+
zoneTableEntry.l Demo_EHZ ; $10
dc.b  7+$80 ; 0F
+
</syntaxhighlight>
dc.$D+$80 ; 10
 
dc.b  2+$80 ; 11
 
dc.b  2+$80 ; 12
 
dc.b  2+$80 ; 13
 
dc.b  2+$80 ; 14
 
dc.b  2+$80 ; 15
 
dc.b  2+$80 ; 16
 
dc.b  2+$80 ; 17
 
dc.b  2+$80 ; 18
 
dc.b  2+$80 ; 19
 
dc.b  2+$80 ; 1A
 
dc.b  2+$80 ; 1B
 
dc.b  2+$80 ; 1C
 
dc.b  2+$80 ; 1D
 
dc.b  2+$80 ; 1E
 
dc.b  2+$80 ; 1F
 
dc.b  2+$80 ; 20
 
dc.b  0
 
  
Level_2PlayerBGMList:
+
and insert after it:
lea MusicList2(pc),a1
+
<syntaxhighlight lang="asm">
rts
+
zoneTableEntry.l Demo_EHZ ; $11
 +
zoneTableEntry.l Demo_EHZ ; $12
 +
zoneTableEntry.l Demo_EHZ ; $13
 +
zoneTableEntry.l Demo_EHZ ; $14
 +
zoneTableEntry.l Demo_EHZ ; $15
 +
zoneTableEntry.l Demo_EHZ ; $16
 +
zoneTableEntry.l Demo_EHZ ; $17
 +
zoneTableEntry.l Demo_EHZ ; $18
 +
zoneTableEntry.l Demo_EHZ ; $19
 +
zoneTableEntry.l Demo_EHZ ; $1A
 +
zoneTableEntry.l Demo_EHZ ; $1B
 +
zoneTableEntry.l Demo_EHZ ; $1C
 +
zoneTableEntry.l Demo_EHZ ; $1D
 +
zoneTableEntry.l Demo_EHZ ; $1E
 +
zoneTableEntry.l Demo_EHZ ; $1F
 +
zoneTableEntry.l Demo_EHZ ; $20
 +
</syntaxhighlight>
  
;----------------------------------------------------------------------------
+
==Extending the Collision index==
; 1P Music Playlist
+
You would want solidity in your new zones, wouldn't you? Here we will extend the solidity list so that our extra levels can have solid ground for that blue hedgehog to walk on.
;----------------------------------------------------------------------------
 
; byte_3EA0:
 
MusicList:
 
dc.b  2+$80 ; 00 ; EHZ
 
dc.b  2+$80 ; 01
 
dc.b  5+$80 ; 02
 
dc.b  4+$80 ; 03
 
dc.b  5+$80 ; 04 ; MTZ1,2
 
dc.b  5+$80 ; 05 ; MTZ3
 
dc.b $F+$80 ; 06 ; WFZ
 
dc.b  6+$80 ; 07 ; HTZ
 
dc.b $10+$80 ; 08
 
dc.b  $D+$80 ; 09
 
dc.b  4+$80 ; 0A ; OOZ
 
dc.b  $B+$80 ; 0B ; MCZ
 
dc.b  $9+$80 ; 0C; CNZ
 
dc.b  $E+$80 ; 0D ; CPZ
 
dc.b  $A+$80 ; 0E ; DEZ
 
dc.b  7+$80 ; 0F ; ARZ
 
dc.b  $D+$80 ; 10 ; SCZ
 
dc.b  2+$80 ; 11
 
dc.b  2+$80 ; 12
 
dc.b  2+$80 ; 13
 
dc.b  2+$80 ; 14
 
dc.b  2+$80 ; 15
 
dc.b  2+$80 ; 16
 
dc.b  2+$80 ; 17
 
dc.b  2+$80 ; 18
 
dc.b  2+$80 ; 19
 
dc.b  2+$80 ; 1A
 
dc.b  2+$80 ; 1B
 
dc.b  2+$80 ; 1C
 
dc.b  2+$80 ; 1D
 
dc.b  2+$80 ; 1E
 
dc.b  2+$80 ; 1F
 
dc.b  2+$80 ; 20
 
dc.b  0
 
</asm>
 
 
 
That updates our music list for both 2 player and 1 player modes, and fixes an error that sometimes occurs during the build process relating to somwthing not fitting in a signed byte, which can easily happen when you have a lot of added zones.
 
 
 
==Branch fixes==
 
Before we go any further, I will note that if you tried to compile now, you would have some "jump distance too big" errors, lets fix them:
 
 
 
first, we will find:
 
<asm>
 
GameModesArray: ;;
 
bra.w SegaScreen ; $00 SEGA screen mode
 
bra.w TitleScreen ; $04 Title screen mode
 
bra.w Level ; $08 Demo mode
 
bra.w Level ; $0C Zone play mode
 
bra.w SpecialStage ; $10 Special stage play mode
 
bra.w ContinueScreen ; $14 Continue mode
 
bra.w TwoPlayerResults ; $18 2P results mode
 
bra.w LevelSelectMenu2P ; $1C 2P level select mode
 
bra.w JmpTo_EndingSequence ; $20 End sequence mode
 
bra.w OptionsMenu ; $24 Options mode
 
bra.w LevelSelectMenu ; $28 Level select mode
 
; ===========================================================================
 
</asm>
 
 
 
and replace it with:
 
<asm>
 
GameModesArray: ;;
 
bra.w SegaScreen ; $00 SEGA screen mode
 
bra.w TitleScreen ; $04 Title screen mode
 
bra.w Level ; $08 Demo mode
 
bra.w Level ; $0C Zone play mode
 
bra.w SpecialStage ; $10 Special stage play mode
 
bra.w ContinueScreen ; $14 Continue mode
 
bra.w Jmpto_TwoPlayerResults ; $18 2P results mode
 
bra.w LevelSelectMenu2P ; $1C 2P level select mode
 
bra.w JmpTo_EndingSequence ; $20 End sequence mode
 
bra.w OptionsMenu ; $24 Options mode
 
bra.w LevelSelectMenu ; $28 Level select mode
 
; ===========================================================================
 
Jmpto_TwoPlayerResults:
 
jmp TwoPlayerResults
 
</asm>
 
  
then we we will find:
+
Well. We will fit, first, the collision procedure. This way, we can merge both tables into only one.
<asm>
 
MenuScreen:
 
bsr.w Pal_FadeFrom
 
move #$2700,sr
 
move.w ($FFFFF60C).w,d0
 
andi.b #-$41,d0
 
move.w d0,(VDP_control_port).l
 
bsr.w ClearScreen
 
lea (VDP_control_port).l,a6
 
move.w #$8004,(a6)
 
move.w #$8230,(a6)
 
move.w #$8407,(a6)
 
move.w #$8230,(a6)
 
move.w #$8700,(a6)
 
move.w #$8C81,(a6)
 
move.w #$9001,(a6)
 
clearRAM Sprite_Table_Input,$400
 
clearRAM Object_RAM,$2000
 
 
 
clr.w (VDP_Command_Buffer).w
 
move.l #VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w
 
move.l #$42000000,(VDP_control_port).l
 
lea (ArtNem_FontStuff).l,a0
 
bsr.w NemDec
 
move.l #$4E000000,(VDP_control_port).l
 
lea (ArtNem_MenuBox).l,a0
 
bsr.w NemDec
 
move.l #$52000000,(VDP_control_port).l
 
lea (ArtNem_LevelSelectPics).l,a0
 
bsr.w NemDec
 
</asm>
 
 
 
we want to change it to:
 
<asm>
 
MenuScreen:
 
bsr.w Pal_FadeFrom
 
move #$2700,sr
 
move.w ($FFFFF60C).w,d0
 
andi.b #-$41,d0
 
move.w d0,(VDP_control_port).l
 
bsr.w JumpTo_ClearScreen
 
lea (VDP_control_port).l,a6
 
move.w #$8004,(a6)
 
move.w #$8230,(a6)
 
move.w #$8407,(a6)
 
move.w #$8230,(a6)
 
move.w #$8700,(a6)
 
move.w #$8C81,(a6)
 
move.w #$9001,(a6)
 
jmp Cont_MenuScreen
 
 
 
 
 
JumpTo_ClearScreen:
 
jmp ClearScreen
 
JumpTo_NemDec000:
 
jmp ClearScreen
 
 
 
Cont_MenuScreen:
 
 
 
clearRAM Sprite_Table_Input,$400
 
clearRAM Object_RAM,$2000
 
 
 
clr.w (VDP_Command_Buffer).w
 
move.l #VDP_Command_Buffer,(VDP_Command_Buffer_Slot).w
 
move.l #$42000000,(VDP_control_port).l
 
lea (ArtNem_FontStuff).l,a0
 
bsr.w JumpTo_NemDec000
 
move.l #$4E000000,(VDP_control_port).l
 
lea (ArtNem_MenuBox).l,a0
 
bsr.w JumpTo_NemDec000
 
move.l #$52000000,(VDP_control_port).l
 
lea (ArtNem_LevelSelectPics).l,a0
 
bsr.w JumpTo_NemDec000
 
</asm>
 
 
 
now we want to locate:
 
<asm>
 
MenuScreen_LevelSelect:
 
lea (Metablock_Table).l,a1
 
lea (MapEng_LevSel).l,a0
 
move.w #0,d0
 
bsr.w EniDec
 
lea (Metablock_Table).l,a1
 
move.l #$40000003,d0
 
moveq #$27,d1
 
moveq #$1B,d2
 
bsr.w JmpTo_ShowVDPGraphics
 
moveq #0,d3
 
bsr.w loc_965A
 
lea ($FFFF08C0).l,a1
 
lea (MapEng_LevSelIcon).l,a0
 
move.w #$90,d0
 
bsr.w EniDec
 
bsr.w loc_9688
 
clr.w (Player_mode).w
 
clr.w (Results_Screen_2P).w
 
clr.b (Level_started_flag).w
 
clr.w ($FFFFF7F0).w
 
lea (word_87C6).l,a2
 
bsr.w JmpTo2_Dynamic_Normal
 
moveq #$26,d0
 
bsr.w PalLoad1
 
lea (Normal_palette_line3).w,a1
 
lea (Second_palette_line3).w,a2
 
moveq #7,d1
 
</asm>
 
 
 
and change it to:
 
<asm>
 
MenuScreen_LevelSelect:
 
lea (Metablock_Table).l,a1
 
lea (MapEng_LevSel).l,a0
 
move.w #0,d0
 
bsr.w JumpTo_EniDec
 
lea (Metablock_Table).l,a1
 
move.l #$40000003,d0
 
moveq #$27,d1
 
moveq #$1B,d2
 
bsr.w JmpTo_ShowVDPGraphics
 
moveq #0,d3
 
bsr.w loc_965A
 
lea ($FFFF08C0).l,a1
 
lea (MapEng_LevSelIcon).l,a0
 
move.w #$90,d0
 
bsr.w JumpTo_EniDec
 
bsr.w loc_9688
 
clr.w (Player_mode).w
 
clr.w (Results_Screen_2P).w
 
clr.b (Level_started_flag).w
 
clr.w ($FFFFF7F0).w
 
lea (word_87C6).l,a2
 
bsr.w JmpTo2_Dynamic_Normal
 
moveq #$26,d0
 
bsr.w PalLoad1
 
lea (Normal_palette_line3).w,a1
 
lea (Second_palette_line3).w,a2
 
moveq #7,d1
 
jmp loc_9366
 
 
 
JumpTo_EniDec:
 
jmp EniDec
 
</asm>
 
 
 
next we want to find:
 
<asm>
 
; loc_8FCC:
 
MenuScreen_Options:
 
lea (Metablock_Table).l,a1
 
lea (MapEng_Options).l,a0
 
move.w #$70,d0
 
bsr.w EniDec
 
lea ($FFFF0160).l,a1
 
lea (MapEng_Options).l,a0
 
move.w #$2070,d0
 
bsr.w EniDec
 
clr.b (Options_menu_box).w
 
bsr.w sub_9186
 
addq.b #1,(Options_menu_box).w
 
bsr.w loc_91F8
 
addq.b #1,(Options_menu_box).w
 
bsr.w loc_91F8
 
clr.b (Options_menu_box).w
 
clr.b (Level_started_flag).w
 
clr.w ($FFFFF7F0).w
 
lea (word_87C6).l,a2
 
bsr.w JmpTo2_Dynamic_Normal
 
moveq #$26,d0
 
bsr.w PalLoad1
 
move.b #-$6F,d0
 
bsr.w JmpTo_PlayMusic
 
clr.w (Two_player_mode).w
 
clr.l (Camera_X_pos).w
 
clr.l (Camera_Y_pos).w
 
clr.w (Correct_cheat_entries).w
 
clr.w (Correct_cheat_entries_2).w
 
move.b #$16,(Delay_Time).w
 
bsr.w DelayProgram
 
move.w ($FFFFF60C).w,d0
 
ori.b #$40,d0
 
move.w d0,(VDP_control_port).l
 
bsr.w Pal_FadeTo
 
</asm>
 
 
 
and change it to:
 
<asm>
 
MenuScreen_Options:
 
lea (Metablock_Table).l,a1
 
lea (MapEng_Options).l,a0
 
move.w #$70,d0
 
bsr.w JmpTo_EniDec
 
lea ($FFFF0160).l,a1
 
lea (MapEng_Options).l,a0
 
move.w #$2070,d0
 
bsr.w JmpTo_EniDec
 
clr.b (Options_menu_box).w
 
bsr.w sub_9186
 
addq.b #1,(Options_menu_box).w
 
bsr.w loc_91F8
 
addq.b #1,(Options_menu_box).w
 
bsr.w loc_91F8
 
clr.b (Options_menu_box).w
 
clr.b (Level_started_flag).w
 
clr.w ($FFFFF7F0).w
 
lea (word_87C6).l,a2
 
bsr.w JmpTo2_Dynamic_Normal
 
moveq #$26,d0
 
bsr.w PalLoad1
 
move.b #-$6F,d0
 
bsr.w JmpTo_PlayMusic
 
clr.w (Two_player_mode).w
 
clr.l (Camera_X_pos).w
 
clr.l (Camera_Y_pos).w
 
clr.w (Correct_cheat_entries).w
 
clr.w (Correct_cheat_entries_2).w
 
move.b #$16,(Delay_Time).w
 
bsr.w DelayProgram
 
move.w ($FFFFF60C).w,d0
 
ori.b #$40,d0
 
move.w d0,(VDP_control_port).l
 
bsr.w Pal_FadeTo
 
</asm>
 
  
 
Find:
 
Find:
<asm>
+
<syntaxhighlight lang="asm">
loc_4114:
+
LoadCollisionIndexes:
moveq #3,d0
+
moveq #0,d0
bsr.w PalLoad1 ; load Sonic's palette line
+
move.b (Current_Zone).w,d0
bsr.w LevelSizeLoad
+
lsl.w #2,d0
bsr.w JmpTo_DeformBgLayer
+
move.l #Primary_Collision,(Collision_addr).w
clr.w (Vscroll_Factor).w
+
move.w d0,-(sp)
move.w #-$E0,($FFFFF61E).w
+
movea.l Off_ColP(pc,d0.w),a0
 +
lea (Primary_Collision).w,a1
 +
bsr.w KosDec
 +
move.w (sp)+,d0
 +
movea.l Off_ColS(pc,d0.w),a0
 +
lea (Secondary_Collision).w,a1
 +
bra.w KosDec
 +
</syntaxhighlight>
  
clearRAM Horiz_Scroll_Buf,$400
+
Now, replace it with this:
 +
<syntaxhighlight lang="asm">
 +
LoadCollisionIndexes:
 +
moveq #0,d0
 +
move.b (Current_Zone).w,d0
 +
lsl.w #3,d0 ;change to lsl.w #3,d0 to make the offset 8 instead of 4
 +
move.l #Primary_Collision,(Collision_addr).w
 +
move.w d0,-(sp) ;without this line, CPZ and ARZ solidity will be a little wonky
 +
movea.l CollisionData(pc,d0.w),a0
 +
lea (Primary_Collision).w,a1
 +
bsr.w KosDec
 +
move.w (sp)+,d0 ;without this line, CPZ and ARZ solidity will be a little wonky
 +
movea.l CollisionData+4(pc,d0.w),a0
 +
lea (Secondary_Collision).w,a1
 +
bsr.w KosDec
 +
</syntaxhighlight>
  
bsr.w sub_4E98
+
I saw no point in leaving the old indexes as dummies here, since that just eats up rom space so I just went to deleting them in the merge.
bsr.w JmpTo_loadZoneBlockMaps
 
jsr (loc_402D4).l
 
bsr.w JmpTo_loc_E300
 
jsr (FloorLog_Unk).l
 
bsr.w LoadCollisionIndexes
 
bsr.w WaterEffects
 
bsr.w InitPlayers
 
move.w #0,(Ctrl_1_Logical).w
 
move.w #0,(Ctrl_2_Logical).w
 
move.w #0,(Ctrl_1).w
 
move.w #0,(Ctrl_2).w
 
move.b #1,(Control_Locked).w
 
move.b #1,($FFFFF7CF).w
 
move.b #0,(Level_started_flag).w
 
; Level_ChkWater:
 
tst.b (Water_flag).w ; does level have water?
 
beq.s + ; if not, branch
 
move.b #4,(Object_RAM+$380).w ; load Obj04 (water surface) at $FFFFB380
 
move.w #$60,(Object_RAM+$380+x_pos).w ; set horizontal offset
 
move.b #4,(Object_RAM+$3C0).w ; load Obj04 (water surface) at $FFFFB3C0
 
move.w #$120,(Object_RAM+$3C0+x_pos).w ; set different horizontal offset
 
+
 
cmpi.b #$D,(Current_Zone).w ; check if zone == CPZ
 
bne.s + ; branch if not
 
move.b #$7C,(Object_RAM+$340).w ; load Obj7C (CPZ pylon) at $FFFFB340
 
+
 
cmpi.b #$A,(Current_Zone).w ; check if zone == OOZ
 
bne.s Level_ClrHUD ; branch if not
 
move.b #7,(Object_RAM+$380).w ; load Obj07 (OOZ oil) at $FFFFB380
 
</asm>
 
  
and replace it with:
+
Change:
<asm>
+
<syntaxhighlight lang="asm">
loc_4114:
+
; ---------------------------------------------------------------------------
moveq #3,d0
+
; Pointers to primary collision indexes
bsr.w PalLoad1 ; load Sonic's palette line
 
bsr.w JmpTo_LevelSizeLoad
 
bsr.w JmpTo_DeformBgLayer
 
clr.w (Vscroll_Factor).w
 
move.w #-$E0,($FFFFF61E).w
 
  
clearRAM Horiz_Scroll_Buf,$400
+
; Contains an array of pointers to the primary collision index data for each
 +
; level. 1 pointer for each level, pointing the primary collision index.
 +
; ---------------------------------------------------------------------------
 +
Off_ColP: zoneOrderedTable 4,1
 +
zoneTableEntry.l ColP_EHZHTZ
 +
zoneTableEntry.l Off_Level ; 1
 +
zoneTableEntry.l ColP_MTZ ; 2
 +
zoneTableEntry.l Off_Level ; 3
 +
zoneTableEntry.l ColP_MTZ ; 4
 +
zoneTableEntry.l ColP_MTZ ; 5
 +
zoneTableEntry.l ColP_WFZSCZ ; 6
 +
zoneTableEntry.l ColP_EHZHTZ ; 7
 +
zoneTableEntry.l ColP_OOZ ; 8
 +
zoneTableEntry.l Off_Level ; 9
 +
zoneTableEntry.l ColP_OOZ ; 10
 +
zoneTableEntry.l ColP_MCZ ; 11
 +
zoneTableEntry.l ColP_CNZ ; 12
 +
zoneTableEntry.l ColP_CPZDEZ ; 13
 +
zoneTableEntry.l ColP_CPZDEZ ; 14
 +
zoneTableEntry.l ColP_ARZ ; 15
 +
zoneTableEntry.l ColP_WFZSCZ ; 16
 +
    zoneTableEnd
  
bsr.w sub_4E98
+
; ---------------------------------------------------------------------------
bsr.w JmpTo_loadZoneBlockMaps
+
; Pointers to secondary collision indexes
jsr (loc_402D4).l
 
bsr.w JmpTo_loc_E300
 
jsr (FloorLog_Unk).l
 
bsr.w LoadCollisionIndexes
 
bsr.w WaterEffects
 
bsr.w InitPlayers
 
move.w #0,(Ctrl_1_Logical).w
 
move.w #0,(Ctrl_2_Logical).w
 
move.w #0,(Ctrl_1).w
 
move.w #0,(Ctrl_2).w
 
move.b #1,(Control_Locked).w
 
move.b #1,($FFFFF7CF).w
 
move.b #0,(Level_started_flag).w
 
; Level_ChkWater:
 
tst.b (Water_flag).w ; does level have water?
 
beq.s + ; if not, branch
 
move.b #4,(Object_RAM+$380).w ; load Obj04 (water surface) at $FFFFB380
 
move.w #$60,(Object_RAM+$380+x_pos).w ; set horizontal offset
 
move.b #4,(Object_RAM+$3C0).w ; load Obj04 (water surface) at $FFFFB3C0
 
move.w #$120,(Object_RAM+$3C0+x_pos).w ; set different horizontal offset
 
+
 
cmpi.b #$D,(Current_Zone).w ; check if zone == CPZ
 
bne.s + ; branch if not
 
move.b #$7C,(Object_RAM+$340).w ; load Obj7C (CPZ pylon) at $FFFFB340
 
+
 
cmpi.b #$A,(Current_Zone).w ; check if zone == OOZ
 
bne.s Level_ClrHUD ; branch if not
 
move.b #7,(Object_RAM+$380).w ; load Obj07 (OOZ oil) at $FFFFB380
 
  
JmpTo_LevelSizeLoad:
+
; Contains an array of pointers to the secondary collision index data for
jmp LevelSizeLoad
+
; each level. 1 pointer for each level, pointing the secondary collision
</asm>
+
; index.
 +
; ---------------------------------------------------------------------------
 +
Off_ColS: zoneOrderedTable 4,1
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l Off_Level ; 1
 +
zoneTableEntry.l ColP_MTZ ; 2
 +
zoneTableEntry.l Off_Level ; 3
 +
zoneTableEntry.l ColP_MTZ ; 4
 +
zoneTableEntry.l ColP_MTZ ; 5
 +
zoneTableEntry.l ColS_WFZSCZ ; 6
 +
zoneTableEntry.l ColS_EHZHTZ ; 7
 +
zoneTableEntry.l ColP_OOZ ; 8
 +
zoneTableEntry.l Off_Level ; 9
 +
zoneTableEntry.l ColP_OOZ ; 10
 +
zoneTableEntry.l ColP_MCZ ; 11
 +
zoneTableEntry.l ColS_CNZ ; 12
 +
zoneTableEntry.l ColS_CPZDEZ ; 13
 +
zoneTableEntry.l ColS_CPZDEZ ; 14
 +
zoneTableEntry.l ColS_ARZ ; 15
 +
zoneTableEntry.l ColS_WFZSCZ ; 16
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
Now we find:
+
To:
<asm>
+
<syntaxhighlight lang="asm">
sub_9EF4:
+
CollisionData: zoneOrderedTable 4,2
tst.b ($FFFFF660).w
+
zoneTableEntry.l ColP_EHZHTZ ;00
beq.w return_A0BE
+
zoneTableEntry.l ColS_EHZHTZ
bsr.w Pal_FadeFrom
+
zoneTableEntry.l ColP_EHZHTZ ;01
lea (VDP_control_port).l,a6
+
zoneTableEntry.l ColS_EHZHTZ
move.w #$8004,(a6)
+
zoneTableEntry.l ColP_EHZHTZ ;02
move.w #$8230,(a6)
+
zoneTableEntry.l ColS_EHZHTZ
move.w #$8407,(a6)
+
zoneTableEntry.l ColP_EHZHTZ ;03
move.w #$9001,(a6)
+
zoneTableEntry.l ColS_EHZHTZ
move.w #$9200,(a6)
+
zoneTableEntry.l ColP_MTZ    ;04
move.w #$8B03,(a6)
+
zoneTableEntry.l ColP_MTZ
move.w #$8700,(a6)
+
zoneTableEntry.l ColP_MTZ    ;05
clr.b (Water_move).w
+
zoneTableEntry.l ColP_MTZ
move.w #$8C81,(a6)
+
zoneTableEntry.l ColP_WFZSCZ ;06
bsr.w JmpTo_ClearScreen
+
zoneTableEntry.l ColS_WFZSCZ
</asm>
+
zoneTableEntry.l ColP_EHZHTZ ;07
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;08
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;09
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_OOZ    ;0A
 +
zoneTableEntry.l ColP_OOZ
 +
zoneTableEntry.l ColP_MCZ    ;0B
 +
zoneTableEntry.l ColP_MCZ
 +
zoneTableEntry.l ColP_CNZ    ;0C
 +
zoneTableEntry.l ColS_CNZ
 +
zoneTableEntry.l ColP_CPZDEZ ;0D
 +
zoneTableEntry.l ColS_CPZDEZ
 +
zoneTableEntry.l ColP_CPZDEZ ;0E
 +
zoneTableEntry.l ColS_CPZDEZ
 +
zoneTableEntry.l ColP_ARZ    ;0F
 +
zoneTableEntry.l ColS_ARZ
 +
zoneTableEntry.l ColP_WFZSCZ ;10
 +
zoneTableEntry.l ColS_WFZSCZ
 +
zoneTableEntry.l ColP_EHZHTZ ;11
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;12
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;13
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;14
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;15
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;16
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;17
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;18
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;19
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;1A
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;1B
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;1C
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;1D
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;1E
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;1F
 +
zoneTableEntry.l ColS_EHZHTZ
 +
zoneTableEntry.l ColP_EHZHTZ ;20
 +
zoneTableEntry.l ColS_EHZHTZ
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
and change it to:
+
==Extending Rings Index==
<asm>
+
Instead of doing the word-offset table, we will make a dynamic call routine, like collisions.
JmpTo_Pal_FadeFrom:
+
Of course, we won´t work with compressed ring placement.
jmp Pal_FadeFrom
 
  
sub_9EF4:
+
We find, initially:
tst.b ($FFFFF660).w
+
<syntaxhighlight lang="asm">
beq.w return_A0BE
+
; loc_172A4:
bsr.w JmpTo_Pal_FadeFrom
+
RingsManager_Setup:
lea (VDP_control_port).l,a6
+
clearRAM Ring_Positions,(Ring_Positions_End-Ring_Positions)
move.w #$8004,(a6)
+
; d0 = 0
move.w #$8230,(a6)
+
lea (Ring_consumption_table).w,a1
move.w #$8407,(a6)
 
move.w #$9001,(a6)
 
move.w #$9200,(a6)
 
move.w #$8B03,(a6)
 
move.w #$8700,(a6)
 
clr.b (Water_move).w
 
move.w #$8C81,(a6)
 
bsr.w JmpTo_ClearScreen
 
</asm>
 
  
now we want to find:
+
move.w #bytesToLcnt(Ring_consumption_table_End-Ring_consumption_table-$40),d1 ; coding error, that '-$40' shouldn't be there
<asm>
+
- move.l d0,(a1)+ ; only half of Ring_consumption_table is cleared
loc_9FE6:
+
dbf d1,-
bsr.w JmpTo_ClearScreen
 
bsr.w sub_B262
 
bsr.w Pal_FadeTo
 
move.w #$18E,d0
 
btst #6,(Graphics_Flags).w
 
beq.s loc_A002
 
move.w #$144,d0
 
</asm>
 
  
and change it to:
+
moveq #0,d5
<asm>
+
moveq #0,d0
loc_9FE6:
+
move.w (Current_ZoneAndAct).w,d0
bsr.w JmpTo_ClearScreen
+
ror.b #1,d0
bsr.w sub_B262
+
lsr.w #6,d0
bsr.w JmpTo_Pal_FadeTo
+
lea (Off_Rings).l,a1
move.w #$18E,d0
+
move.w (a1,d0.w),d0
btst #6,(Graphics_Flags).w
+
lea (a1,d0.w),a1
beq.s loc_A002
+
lea (Ring_Positions+6).w,a2 ; first ring is left blank
move.w #$144,d0
+
; loc_172E0:
jmp loc_A002
+
RingsMgr_NextRowOrCol:
 +
</syntaxhighlight>
  
JmpTo_Pal_FadeTo:
+
And change it to:
jmp Pal_FadeTo
+
<syntaxhighlight lang="asm">
</asm>
+
; loc_172A4:
 +
RingsManager_Setup:
 +
jmp CarregarAneis
 +
rts
  
now we want to find:
+
; loc_172E0:
<asm>
+
RingsMgr_NextRowOrCol:
loc_A002:
+
</syntaxhighlight>
move.b #$18,(Delay_Time).w
 
bsr.w DelayProgram
 
dbf d0,loc_A002
 
bsr.w Pal_FadeFrom
 
lea (off_B2CA).l,a1
 
addq.w #1,($FFFFFF4C).w
 
move.w ($FFFFFF4C).w,d0
 
lsl.w #2,d0
 
move.l (a1,d0.w),d0
 
bpl.s loc_9FE6
 
bsr.w Pal_FadeFrom
 
bsr.w JmpTo_ClearScreen
 
</asm>
 
  
and we want to to change it to:
+
Now, we put the following routine at a good place:
<asm>
+
<syntaxhighlight lang="asm">
loc_A002:
+
align $40
move.b #$18,(Delay_Time).w
 
bsr.w DelayProgram
 
dbf d0,loc_A002
 
bsr.w JmpTo_Pal_FadeFrom
 
lea (off_B2CA).l,a1
 
addq.w #1,($FFFFFF4C).w
 
move.w ($FFFFFF4C).w,d0
 
lsl.w #2,d0
 
move.l (a1,d0.w),d0
 
bpl.s loc_9FE6
 
bsr.w JmpTo_Pal_FadeFrom
 
bsr.w JmpTo_ClearScreen
 
</asm>
 
  
now we find:
+
CarregarAneis:
<asm>
+
clearRAM Ring_Positions,$600
bcs.s Obj17_Main
+
; d0 = 0
moveq #0,d6
+
lea (Ring_consumption_table).w,a1
; loc_10372:
+
move.w #bytesToLcnt($40),d1
Obj17_MakeHelix:
+
- move.l d0,(a1)+
bsr.w SingleObjLoad2
+
dbf d1,-
</asm>
 
  
and change it to:
+
moveq #0,d5
<asm>
+
moveq #0,d0
bcs.s JumpTo_Obj17_Main
+
; convert zone/act data for an useable format, sequential
moveq #0,d6
+
move.w (Current_ZoneAndAct).w,d0
jmp Obj17_MakeHelix
 
 
 
JumpTo_Obj17_Main:
 
jmp Obj17_Main
 
JumpTo_SingleObjLoad2:
 
jmp SingleObjLoad2
 
 
 
; loc_10372:
 
Obj17_MakeHelix:
 
bsr.w JumpTo_SingleObjLoad2
 
</asm>
 
 
 
after that, your rom will build correctly for jump issues, but for addressing, that's different.
 
 
 
==Fixing Addressing==
 
Find:
 
<asm>
 
loc_A5A6:
 
bsr.s sub_A58C
 
subq.w #1,objoff_3C(a0)
 
bpl.s return_A5E6
 
move.w #2,objoff_3C(a0)
 
move.w objoff_32(a0),d0
 
cmpi.w #$1C,d0
 
bcc.s loc_A5E8
 
addq.w #1,objoff_32(a0)
 
move.w ($FFFFF750).w,d1
 
move.w off_A5FC(pc,d1.w),d1
 
lea off_A5FC(pc,d1.w),a1
 
move.b (a1,d0.w),mapping_frame(a0)
 
add.w d0,d0
 
add.w d0,d0
 
move.l word_A656(pc,d0.w),d1
 
move.w d1,y_pos(a0)
 
swap d1
 
move.w d1,x_pos(a0)
 
</asm>
 
 
 
and replace it with:
 
<asm>
 
loc_A5A6:
 
bsr.s sub_A58C
 
subq.w #1,objoff_3C(a0)
 
bpl.s return_A5E6
 
move.w #2,objoff_3C(a0)
 
move.w objoff_32(a0),d0
 
cmpi.w #$1C,d0
 
bcc.s loc_A5E8
 
addq.w #1,objoff_32(a0)
 
move.w ($FFFFF750).w,d1
 
move.w off_A5FC(pc,d1.w),d1
 
lea off_A5FC(pc,d1.w),a1
 
move.b (a1,d0.w),mapping_frame(a0)
 
add.w d0,d0
 
add.w d0,d0
 
jmp loc2_A5A6
 
</asm>
 
  
Now find:
+
ror.b #1,d0
<asm>
+
lsr.w #6,d0 ;this yields an 8-byte jump.
loc_A6C6:
+
add.l d0,d0
subq.w #1,objoff_3C(a0)
 
bmi.s loc_A720
 
tst.b (Super_Sonic_flag).w
 
beq.s return_A70A
 
subq.b #1,objoff_31(a0)
 
bpl.s return_A70A
 
addq.b #3,objoff_31(a0)
 
move.w objoff_32(a0),d0
 
addq.w #4,objoff_32(a0)
 
cmpi.w #$78,d0
 
bcc.s return_A70A
 
cmpi.w #$C,d0
 
bcs.s loc_A70C
 
bsr.w loc_A594
 
move.l word_A766(pc,d0.w),d1
 
move.w d1,y_pos(a0)
 
swap d1
 
move.w d1,x_pos(a0)
 
lsr.w #2,d0
 
move.b byte_A748(pc,d0.w),mapping_frame(a0)
 
</asm>
 
  
and replace it with:
+
movea.l RingData(pc,d0.l),a1 ; this allows ring data anywhere in the ROM.
<asm>
+
lea (Ring_Positions).w,a2
loc_A6C6:
+
jmp RingsMgr_NextRowOrCol
subq.w #1,objoff_3C(a0)
 
bmi.s loc_A720
 
tst.b (Super_Sonic_flag).w
 
beq.s return_A70A
 
subq.b #1,objoff_31(a0)
 
bpl.s return_A70A
 
addq.b #3,objoff_31(a0)
 
move.w objoff_32(a0),d0
 
addq.w #4,objoff_32(a0)
 
cmpi.w #$78,d0
 
bcc.s return_A70A
 
cmpi.w #$C,d0
 
bcs.s loc_A70C
 
bsr.w loc_A594
 
jmp loc2_A6C6
 
</asm>
 
 
 
Then find:
 
<asm>
 
loc_A70C:
 
move.l word_A766(pc,d0.w),d0
 
lea (MainCharacter).w,a1 ; a1=character
 
move.w d0,y_pos(a1)
 
swap d0
 
move.w d0,x_pos(a1)
 
 
rts
 
rts
</asm>
+
 +
RingData: zoneOrderedTable 4,2
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;00
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;01
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;02
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;03
 +
zoneTableEntry.l Rings_MTZ_1
 +
zoneTableEntry.l Rings_MTZ_2 ;04
 +
zoneTableEntry.l Rings_MTZ_3
 +
zoneTableEntry.l Rings_MTZ_3 ;05
 +
zoneTableEntry.l Rings_WFZ_1
 +
zoneTableEntry.l Rings_WFZ_1 ;06
 +
zoneTableEntry.l Rings_HTZ_1
 +
zoneTableEntry.l Rings_HTZ_2 ;07
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;08
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;09
 +
zoneTableEntry.l Rings_OOZ_1
 +
zoneTableEntry.l Rings_OOZ_2 ;0A
 +
zoneTableEntry.l Rings_MCZ_1
 +
zoneTableEntry.l Rings_MCZ_2 ;0B
 +
zoneTableEntry.l Rings_CNZ_1
 +
zoneTableEntry.l Rings_CNZ_2 ;0C
 +
zoneTableEntry.l Rings_CPZ_1
 +
zoneTableEntry.l Rings_CPZ_2 ;0D
 +
zoneTableEntry.l Rings_DEZ_1
 +
zoneTableEntry.l Rings_DEZ_1 ;0E
 +
zoneTableEntry.l Rings_ARZ_1
 +
zoneTableEntry.l Rings_ARZ_2 ;0F
 +
zoneTableEntry.l Rings_SCZ_1
 +
zoneTableEntry.l Rings_SCZ_1 ;10
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;11
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;12
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;13
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;14
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;15
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;16
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;17
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;18
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;19
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;1A
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;1B
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;1C
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;1D
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;1E
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;1F
 +
zoneTableEntry.l Rings_EHZ_1
 +
zoneTableEntry.l Rings_EHZ_2 ;20
 +
    zoneTableEnd
  
and replace it with:
+
align $80
<asm>
+
</syntaxhighlight>
loc_A70C:
 
jmp loc2_A70C
 
</asm>
 
  
Now find:
+
You can put this before PalPointers, if you relocated that table as described before.
<asm>
 
loc_285D2:
 
moveq #7,d1
 
moveq #0,d4
 
lea (byte_28726).l,a2
 
movea.l a0,a1
 
move.w x_pos(a0),d2
 
move.w y_pos(a0),d3
 
bset #7,status(a0)
 
bra.s loc_285F4
 
</asm>
 
  
and replace it with:
+
This routine directly calls the desired ring placement, with no need of attaching them to the table, like the word-offset index does.
<asm>
 
loc_285D2:
 
moveq #7,d1
 
moveq #0,d4
 
jmp loc2_285D2
 
</asm>
 
  
Then find:
+
==Extending the object index==
<asm>
 
loc_286A2:
 
move.w d1,objoff_36(a0)
 
add.w objoff_34(a0),d1
 
lea byte_28726(pc,d1.w),a1
 
move.b (a1)+,d0
 
ext.w d0
 
add.w objoff_32(a0),d0
 
move.w d0,x_pos(a0)
 
move.b (a1)+,d0
 
ext.w d0
 
add.w objoff_30(a0),d0
 
move.w d0,y_pos(a0)
 
move.b (a1)+,mapping_frame(a0)
 
</asm>
 
  
and change it to:
+
We will make a similar extension for objects. Look for:
<asm>
+
<syntaxhighlight lang="asm">
loc_286A2:
+
; loc_17AB8
move.w d1,objoff_36(a0)
+
ObjectsManager_Init:
add.w objoff_34(a0),d1
+
addq.b #2,(Obj_placement_routine).w
jmp loc2_286A2
+
move.w (Current_ZoneAndAct).w,d0 ; If level == $0F01 (ARZ 2)...
</asm>
+
ror.b #1,d0 ; then this yields $0F80...
 +
lsr.w #6,d0 ; and this yields $003E.
 +
lea (Off_Objects).l,a0 ; Next, we load the first pointer in the object layout list pointer index,
 +
movea.l a0,a1 ; then copy it for quicker use later.
 +
adda.w (a0,d0.w),a0 ; (Point1 * 2) + $003E
 +
tst.w (Two_player_mode).w ; skip if not in 2-player vs mode
 +
beq.s +
 +
cmpi.b #casino_night_zone,(Current_Zone).w ; skip if not Casino Night Zone
 +
bne.s +
 +
lea (Objects_CNZ1_2P).l,a0 ; CNZ 1 2-player object layout
 +
tst.b (Current_Act).w ; skip if not past act 1
 +
beq.s +
 +
lea (Objects_CNZ2_2P).l,a0 ; CNZ 2 2-player object layout
 +
+
 +
</syntaxhighlight>
  
Now add this to the end of your ROM:
+
And change that to:
<asm>
+
<syntaxhighlight lang="asm">
; ===========================================================================
+
; loc_17AB8
 
+
ObjectsManager_Init:
loc2_A5A6:
+
jmp CarregarObjetos
move.l word_A656(pc,d0.w),d1
 
move.w d1,y_pos(a0)
 
swap d1
 
move.w d1,x_pos(a0)
 
; ===========================================================================
 
 
 
word_A656:
 
dc.w  $A0,  $70,  $B0, $70,  $B6,  $71,  $BC, $72
 
dc.w  $C4,  $74,  $C8, $75,  $CA,  $76,  $CC, $77; 8
 
dc.w  $CE,  $78,  $D0, $79,  $D2,  $7A,  $D4, $7B; 16
 
dc.w  $D6,  $7C,  $D9, $7E,  $DC,  $81,  $DE, $84; 24
 
dc.w  $E1,  $87,  $E4, $8B,  $E7,  $8F,  $EC, $94; 32
 
dc.w  $F0,  $99,  $F5, $9D,  $F9,  $A4, $100, $AC; 40
 
dc.w  $108,  $B8, $112, $C4, $11F,  $D3, $12C, $FA; 48
 
; ===========================================================================
 
 
 
loc2_A6C6:
 
move.l word_A766(pc,d0.w),d1
 
move.w d1,y_pos(a0)
 
swap d1
 
move.w d1,x_pos(a0)
 
lsr.w #2,d0
 
move.b byte_A748(pc,d0.w),mapping_frame(a0)
 
; ===========================================================================
 
 
 
loc2_A70C:
 
move.l word_A766(pc,d0.w),d0
 
lea (MainCharacter).w,a1 ; a1=character
 
move.w d0,y_pos(a1)
 
swap d0
 
move.w d0,x_pos(a1)
 
 
rts
 
rts
; ===========================================================================
 
  
byte_A748:
+
loc_17AF0:
dc.b $12,$12,$12,$12,$12,$12,$12,$13,$13,$13,$13,$13,$13,$14,$14,$14
+
+
dc.b $14,$15,$15,$15,$16,$16,$16,$16,$16,$16,$16,$16,$16,  0; 16
+
</syntaxhighlight>
; ===========================================================================
 
  
word_A766:
+
Now, put this routine into a good place. If you relocated PalPointers like described before, put this before PalPointers:
dc.w  $C0
+
<syntaxhighlight lang="asm">
dc.w  $90 ; 1
+
align $40
dc.w  $B0 ; 2
+
dc.w  $91 ; 3
+
CarregarObjetos:
dc.w  $A8 ; 4
+
addq.b #2,(Obj_placement_routine).w
dc.w  $92 ; 5
 
dc.w  $9B ; 6
 
dc.w  $96 ; 7
 
dc.w  $99 ; 8
 
dc.w  $98 ; 9
 
dc.w  $98 ; 10
 
dc.w  $99 ; 11
 
dc.w  $99 ; 12
 
dc.w  $9A ; 13
 
dc.w  $9B ; 14
 
dc.w  $9C ; 15
 
dc.w  $9F ; 16
 
dc.w  $9E ; 17
 
dc.w  $A4 ; 18
 
dc.w  $A0 ; 19
 
dc.w  $AC ; 20
 
dc.w  $A2 ; 21
 
dc.w  $B7 ; 22
 
dc.w  $A5 ; 23
 
dc.w  $C4 ; 24
 
dc.w  $A8 ; 25
 
dc.w  $D3 ; 26
 
dc.w  $AB ; 27
 
dc.w  $DE ; 28
 
dc.w  $AE ; 29
 
dc.w  $E8 ; 30
 
dc.w  $B0 ; 31
 
dc.w  $EF ; 32
 
dc.w  $B2 ; 33
 
dc.w  $F4 ; 34
 
dc.w  $B5 ; 35
 
dc.w  $F9 ; 36
 
dc.w  $B8 ; 37
 
dc.w  $FC ; 38
 
dc.w  $BB ; 39
 
dc.w  $FE ; 40
 
dc.w  $BE ; 41
 
dc.w  $FF ; 42
 
dc.w  $C0 ; 43
 
dc.w  $100 ; 44
 
dc.w  $C2 ; 45
 
dc.w  $101 ; 46
 
dc.w  $C5 ; 47
 
dc.w  $102 ; 48
 
dc.w  $C8 ; 49
 
dc.w  $102 ; 50
 
dc.w  $CC ; 51
 
dc.w  $101 ; 52
 
dc.w  $D1 ; 53
 
dc.w  $FD ; 54
 
dc.w  $D7 ; 55
 
dc.w  $F9 ; 56
 
dc.w  $DE ; 57
 
dc.w   $F9 ; 58
 
dc.w  $118 ; 59
 
; ===========================================================================
 
  
loc2_285D2:
+
moveq #0,d0
lea (byte_28726).l,a2
+
move.w (Current_ZoneAndAct).w,d0 ; If level == $0F (ARZ)...
 +
ror.b #1,d0
 +
lsr.w #6,d0
 +
add.l d0,d0
 +
movea.l ObjPosData(pc,d0.l),a0
 
movea.l a0,a1
 
movea.l a0,a1
move.w x_pos(a0),d2
+
move.w y_pos(a0),d3
+
tst.w (Two_player_mode).w ; skip if not in 2-player vs mode
bset #7,status(a0)
+
beq.s +
bra.s JmpTo_loc_285F4
+
cmpi.b #$C,(Current_Zone).w ; skip if not Casino Night Zone
 +
bne.s +
 +
lea (Objects_CNZ1_2P).l,a0 ; CNZ 1 2-player object layout
 +
tst.b (Current_Act).w ; skip if not past act 1
 +
beq.s +
 +
lea (Objects_CNZ2_2P).l,a0 ; CNZ 2 2-player object layout
  
JmpTo_loc_285F4
+
+:
jmp loc_285F4
+
jmp loc_17AF0
; ===========================================================================
+
rts
 +
 +
ObjPosData: zoneOrderedTable 4,2
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;00
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;01
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;02
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;03
 +
zoneTableEntry.l Objects_MTZ_1
 +
zoneTableEntry.l Objects_MTZ_2 ;04
 +
zoneTableEntry.l Objects_MTZ_3
 +
zoneTableEntry.l Objects_MTZ_3 ;05
 +
zoneTableEntry.l Objects_WFZ_1
 +
zoneTableEntry.l Objects_WFZ_1 ;06
 +
zoneTableEntry.l Objects_HTZ_1
 +
zoneTableEntry.l Objects_HTZ_2 ;07
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;08
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;09
 +
zoneTableEntry.l Objects_OOZ_1
 +
zoneTableEntry.l Objects_OOZ_2 ;0A
 +
zoneTableEntry.l Objects_MCZ_1
 +
zoneTableEntry.l Objects_MCZ_2 ;0B
 +
zoneTableEntry.l Objects_CNZ_1
 +
zoneTableEntry.l Objects_CNZ_2 ;0C
 +
zoneTableEntry.l Objects_CPZ_1
 +
zoneTableEntry.l Objects_CPZ_2 ;0D
 +
zoneTableEntry.l Objects_DEZ_1
 +
zoneTableEntry.l Objects_DEZ_1 ;0E
 +
zoneTableEntry.l Objects_ARZ_1
 +
zoneTableEntry.l Objects_ARZ_2 ;0F
 +
zoneTableEntry.l Objects_SCZ_1
 +
zoneTableEntry.l Objects_SCZ_1 ;10
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;11
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;12
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;13
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;14
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;15
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;16
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;17
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;18
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;19
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;1A
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;1B
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;1C
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;1D
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;1E
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;1F
 +
zoneTableEntry.l Objects_EHZ_1
 +
zoneTableEntry.l Objects_EHZ_2 ;20
 +
  zoneTableEnd
 +
align $80
 +
</syntaxhighlight>
  
loc2_286A2
+
==Extending tiles and patterns index==
lea byte_28726(pc,d1.w),a1 ; addressing not needed
+
Find:
move.b (a1)+,d0
+
<syntaxhighlight lang="asm">
ext.w d0
+
;----------------------------------------------------------------------------------
add.w objoff_32(a0),d0
+
; EHZ 16x16 block mappings (Kosinski compression) ; was: (Kozinski compression)
move.w d0,x_pos(a0)
+
BM16_EHZ: BINCLUDE "mappings/16x16/EHZ.bin"
move.b (a1)+,d0
+
;-----------------------------------------------------------------------------------
ext.w d0
+
; EHZ/HTZ main level patterns (Kosinski compression)
add.w objoff_30(a0),d0
+
; ArtKoz_95C24:
move.w d0,y_pos(a0)
+
ArtKos_EHZ: BINCLUDE "art/kosinski/EHZ_HTZ.bin"
move.b (a1)+,mapping_frame(a0)
+
;-----------------------------------------------------------------------------------
; ===========================================================================
+
; HTZ 16x16 block mappings (Kosinski compression)
 +
BM16_HTZ: BINCLUDE "mappings/16x16/HTZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; HTZ pattern suppliment to EHZ level patterns (Kosinski compression)
 +
; ArtKoz_98AB4:
 +
ArtKos_HTZ: BINCLUDE "art/kosinski/HTZ_Supp.bin"
 +
;-----------------------------------------------------------------------------------
 +
; EHZ/HTZ 128x128 block mappings (Kosinski compression)
 +
BM128_EHZ: BINCLUDE "mappings/128x128/EHZ_HTZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; MTZ 16x16 block mappings (Kosinski compression)
 +
BM16_MTZ: BINCLUDE "mappings/16x16/MTZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; MTZ main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_MTZ: BINCLUDE "art/kosinski/MTZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; MTZ 128x128 block mappings (Kosinski compression)
 +
BM128_MTZ: BINCLUDE "mappings/128x128/MTZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; OOZ 16x16 block mappings (Kosinski compression)
 +
BM16_OOZ: BINCLUDE "mappings/16x16/OOZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; OOZ main level patterns (Kosinski compression)
 +
; ArtKoz_A4204:
 +
ArtKos_OOZ: BINCLUDE "art/kosinski/OOZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; OOZ 128x128 block mappings (Kosinski compression)
 +
BM128_OOZ: BINCLUDE "mappings/128x128/OOZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; MCZ 16x16 block mappings (Kosinski compression)
 +
BM16_MCZ: BINCLUDE "mappings/16x16/MCZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; MCZ main level patterns (Kosinski compression)
 +
; ArtKoz_A9D74:
 +
ArtKos_MCZ: BINCLUDE "art/kosinski/MCZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; MCZ 128x128 block mappings (Kosinski compression)
 +
BM128_MCZ: BINCLUDE "mappings/128x128/MCZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; CNZ 16x16 block mappings (Kosinski compression)
 +
BM16_CNZ: BINCLUDE "mappings/16x16/CNZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; CNZ main level patterns (Kosinski compression)
 +
; ArtKoz_B0894:
 +
ArtKos_CNZ: BINCLUDE "art/kosinski/CNZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; CNZ 128x128 block mappings (Kosinski compression)
 +
BM128_CNZ: BINCLUDE "mappings/128x128/CNZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; CPZ/DEZ 16x16 block mappings (Kosinski compression)
 +
BM16_CPZ: BINCLUDE "mappings/16x16/CPZ_DEZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; CPZ/DEZ main level patterns (Kosinski compression)
 +
; ArtKoz_B6174:
 +
ArtKos_CPZ: BINCLUDE "art/kosinski/CPZ_DEZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; CPZ/DEZ 128x128 block mappings (Kosinski compression)
 +
BM128_CPZ: BINCLUDE "mappings/128x128/CPZ_DEZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; ARZ 16x16 block mappings (Kosinski compression)
 +
BM16_ARZ: BINCLUDE "mappings/16x16/ARZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; ARZ main level patterns (Kosinski compression)
 +
; ArtKoz_BCC24:
 +
ArtKos_ARZ: BINCLUDE "art/kosinski/ARZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; ARZ 128x128 block mappings (Kosinski compression)
 +
BM128_ARZ: BINCLUDE "mappings/128x128/ARZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; WFZ/SCZ 16x16 block mappings (Kosinski compression)
 +
BM16_WFZ: BINCLUDE "mappings/16x16/WFZ_SCZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; WFZ/SCZ main level patterns (Kosinski compression)
 +
; ArtKoz_C5004:
 +
ArtKos_SCZ: BINCLUDE "art/kosinski/WFZ_SCZ.bin"
 +
;-----------------------------------------------------------------------------------
 +
; WFZ pattern suppliment to SCZ tiles (Kosinski compression)
 +
; ArtKoz_C7EC4:
 +
ArtKos_WFZ: BINCLUDE "art/kosinski/WFZ_Supp.bin"
 +
;-----------------------------------------------------------------------------------
 +
; WFZ/SCZ 128x128 block mappings (Kosinski compression)
 +
BM128_WFZ: BINCLUDE "mappings/128x128/WFZ_SCZ.bin"
 +
</syntaxhighlight>
  
byte_28726:
+
then add this to the end:
dc.b  0,$B8,  0,$32,$CE,  4,$48,  0,  8,$32,$32, $C,  0,$48,$10,$CE; 16
+
<syntaxhighlight lang="asm">
dc.b $32,$14,$B8,  0,$18,$CE,$CE,$1C, $D,$B8,  1,$3F,$DA,  5,$48, $C; 32
+
;-----------------------------------------------------------------------------------
dc.b  9,$27,$3C, $D,$F3,$48,$11,$C1,$26,$15,$B8,$F4,$19,$D9,$C4,$1D; 48
+
; Lev_11 16x16 block mappings (Kosinski compression)
dc.b $19,$BC,  2,$46,$E9,  6,$46,$17, $A,$19,$44, $E,$E7,$44,$12,$BA; 64
+
BM16_Lev_11: BINCLUDE "mappings/16x16/Lev_11.bin"
dc.b $17,$16,$BA,$E9,$1A,$E7,$BC,$1E,$27,$C4,  3,$48,$F4,  7,$3F,$26; 80
+
;-----------------------------------------------------------------------------------
dc.b  $B, $D,$48, $F,$D9,$3C,$13,$B8, $C,$17,$C1,$DA,$1B,$F3,$B8,$1F; 96
+
; Lev_11 main level patterns (Kosinski compression)
; ===========================================================================
+
; ArtKoz_9DB64:
</asm>
+
ArtKos_Lev_11: BINCLUDE "art/kosinski/Lev_11.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_11 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_11: BINCLUDE "mappings/128x128/Lev_11.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_12 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_12: BINCLUDE "mappings/16x16/Lev_12.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_12 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_12: BINCLUDE "art/kosinski/Lev_12.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_12 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_12: BINCLUDE "mappings/128x128/Lev_12.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_13 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_13: BINCLUDE "mappings/16x16/Lev_13.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_13 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_13: BINCLUDE "art/kosinski/Lev_13.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_13 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_13: BINCLUDE "mappings/128x128/Lev_13.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_14 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_14: BINCLUDE "mappings/16x16/Lev_14.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_14 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_14: BINCLUDE "art/kosinski/Lev_14.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_14 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_14: BINCLUDE "mappings/128x128/Lev_14.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_15 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_15: BINCLUDE "mappings/16x16/Lev_15.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_15 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_15: BINCLUDE "art/kosinski/Lev_15.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_15 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_15: BINCLUDE "mappings/128x128/Lev_15.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_16 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_16: BINCLUDE "mappings/16x16/Lev_16.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_16 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_16: BINCLUDE "art/kosinski/Lev_16.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_16 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_16: BINCLUDE "mappings/128x128/Lev_16.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_17 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_17: BINCLUDE "mappings/16x16/Lev_17.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_17 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_17: BINCLUDE "art/kosinski/Lev_17.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_17 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_17: BINCLUDE "mappings/128x128/Lev_17.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_18 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_18: BINCLUDE "mappings/16x16/Lev_18.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_18 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_18: BINCLUDE "art/kosinski/Lev_18.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_18 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_18: BINCLUDE "mappings/128x128/Lev_18.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_19 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_19: BINCLUDE "mappings/16x16/Lev_19.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_19 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_19: BINCLUDE "art/kosinski/Lev_19.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_19 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_19: BINCLUDE "mappings/128x128/Lev_19.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1A 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_1A: BINCLUDE "mappings/16x16/Lev_1A.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1A main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_1A: BINCLUDE "art/kosinski/Lev_1A.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1A 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_1A: BINCLUDE "mappings/128x128/Lev_1A.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1B 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_1B: BINCLUDE "mappings/16x16/Lev_1B.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1B main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_1B: BINCLUDE "art/kosinski/Lev_1B.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1B 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_1B: BINCLUDE "mappings/128x128/Lev_1B.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1C 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_1C: BINCLUDE "mappings/16x16/Lev_1C.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1C main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_1C: BINCLUDE "art/kosinski/Lev_1C.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1C 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_1C: BINCLUDE "mappings/128x128/Lev_1C.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1D 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_1D: BINCLUDE "mappings/16x16/Lev_1D.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1D main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_1D: BINCLUDE "art/kosinski/Lev_1D.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1D 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_1D: BINCLUDE "mappings/128x128/Lev_1D.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1E 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_1E: BINCLUDE "mappings/16x16/Lev_1E.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1E main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_1E: BINCLUDE "art/kosinski/Lev_1E.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1E 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_1E: BINCLUDE "mappings/128x128/Lev_1E.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1F 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_1F: BINCLUDE "mappings/16x16/Lev_1F.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1F main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_1F: BINCLUDE "art/kosinski/Lev_1F.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_1F 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_1F: BINCLUDE "mappings/128x128/Lev_1F.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_20 16x16 block mappings (Kosinski compression)
 +
BM16_Lev_20: BINCLUDE "mappings/16x16/Lev_20.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_20 main level patterns (Kosinski compression)
 +
; ArtKoz_9DB64:
 +
ArtKos_Lev_20: BINCLUDE "art/kosinski/Lev_20.bin"
 +
;-----------------------------------------------------------------------------------
 +
; Lev_20 128x128 block mappings (Kosinski compression)
 +
BM128_Lev_20: BINCLUDE "mappings/128x128/Lev_20.bin"
 +
</syntaxhighlight>
  
Then delete any index pasted here to prevent a double defined error while building.
+
Then add optional pattern supplements to suit your hack's needs.
  
==Extending the demo list==
+
Now find:
now we will prepare everything so that we can put in new demo files for our new levels.
+
<syntaxhighlight lang="asm">
 +
LevelArtPointers:
 +
levartptrs PLCID_Ehz1,    PLCID_Ehz2,      PalID_EHZ,  ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;  0 ; EHZ  ; EMERALD HILL ZONE
 +
levartptrs PLCID_Miles1up, PLCID_MilesLife, PalID_EHZ2, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;  1 ; LEV1 ; LEVEL 1 (UNUSED)
 +
levartptrs PLCID_Tails1up, PLCID_TailsLife, PalID_WZ,  ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;  2 ; LEV2 ; LEVEL 2 (UNUSED)
 +
levartptrs PLCID_Unused1,  PLCID_Unused2,  PalID_EHZ3, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;  3 ; LEV3 ; LEVEL 3 (UNUSED)
 +
levartptrs PLCID_Mtz1,    PLCID_Mtz2,      PalID_MTZ,  ArtKos_MTZ, BM16_MTZ, BM128_MTZ ;  4 ; MTZ  ; METROPOLIS ZONE ACTS 1 & 2
 +
levartptrs PLCID_Mtz1,    PLCID_Mtz2,      PalID_MTZ,  ArtKos_MTZ, BM16_MTZ, BM128_MTZ ;  5 ; MTZ3 ; METROPOLIS ZONE ACT 3
 +
levartptrs PLCID_Wfz1,    PLCID_Wfz2,      PalID_WFZ,  ArtKos_SCZ, BM16_WFZ, BM128_WFZ ;  6 ; WFZ  ; WING FORTRESS ZONE
 +
levartptrs PLCID_Htz1,    PLCID_Htz2,      PalID_HTZ,  ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;  7 ; HTZ  ; HILL TOP ZONE
 +
levartptrs PLCID_Hpz1,    PLCID_Hpz2,      PalID_HPZ,  BM16_OOZ,  BM16_OOZ,  BM16_OOZ ;  8 ; HPZ  ; HIDDEN PALACE ZONE (UNUSED)
 +
levartptrs PLCID_Unused3,  PLCID_Unused4,  PalID_EHZ4, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;  9 ; LEV9 ; LEVEL 9 (UNUSED)
 +
levartptrs PLCID_Ooz1,    PLCID_Ooz2,      PalID_OOZ,  ArtKos_OOZ, BM16_OOZ, BM128_OOZ ;  $A ; OOZ  ; OIL OCEAN ZONE
 +
levartptrs PLCID_Mcz1,    PLCID_Mcz2,      PalID_MCZ,  ArtKos_MCZ, BM16_MCZ, BM128_MCZ ;  $B ; MCZ  ; MYSTIC CAVE ZONE
 +
levartptrs PLCID_Cnz1,    PLCID_Cnz2,      PalID_CNZ,  ArtKos_CNZ, BM16_CNZ, BM128_CNZ ;  $C ; CNZ  ; CASINO NIGHT ZONE
 +
levartptrs PLCID_Cpz1,    PLCID_Cpz2,      PalID_CPZ,  ArtKos_CPZ, BM16_CPZ, BM128_CPZ ;  $D ; CPZ  ; CHEMICAL PLANT ZONE
 +
levartptrs PLCID_Dez1,    PLCID_Dez2,      PalID_DEZ,  ArtKos_CPZ, BM16_CPZ, BM128_CPZ ;  $E ; DEZ  ; DEATH EGG ZONE
 +
levartptrs PLCID_Arz1,    PLCID_Arz2,      PalID_ARZ,  ArtKos_ARZ, BM16_ARZ, BM128_ARZ ;  $F ; ARZ  ; AQUATIC RUIN ZONE
 +
levartptrs PLCID_Scz1,    PLCID_Scz2,      PalID_SCZ,  ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; $10 ; SCZ  ; SKY CHASE ZONE
 +
</syntaxhighlight>
  
find:
+
then add this to the end:
<asm>; off_4948:
+
<syntaxhighlight lang="asm">
DemoScriptPointers:
+
levartptrs  $26,  $27,  $15, ArtKos_Lev_11, BM16_Lev_11, BM128_Lev_11 ;   0 ; Lev_11  ; LEV_11 ZONE
dc.l Demo_EHZ ; $00
+
levartptrs  $28,  $29,  $16, ArtKos_Lev_12, BM16_Lev_12, BM128_Lev_12 ;  0 ; Lev_12  ; LEV_12 ZONE
dc.l Demo_EHZ ; $01
+
levartptrs  $2A,  $2B,  $17, ArtKos_Lev_13, BM16_Lev_13, BM128_Lev_13 ;   0 ; Lev_13  ; LEV_13 ZONE
dc.l Demo_EHZ ; $02
+
levartptrs  $2C,  $2D,  $18, ArtKos_Lev_14, BM16_Lev_14, BM128_Lev_14 ;  0 ; Lev_14  ; LEV_14 ZONE
dc.l Demo_EHZ ; $03
+
levartptrs  $2E,  $2F,  $19, ArtKos_Lev_15, BM16_Lev_15, BM128_Lev_15 ;   0 ; Lev_15  ; LEV_15 ZONE
dc.l Demo_EHZ ; $04
+
levartptrs  $30,  $31,  $1A, ArtKos_Lev_16, BM16_Lev_16, BM128_Lev_16 ;  0 ; Lev_16  ; LEV_16 ZONE
dc.l Demo_EHZ ; $05
+
levartptrs  $32,  $33,  $1B, ArtKos_Lev_17, BM16_Lev_17, BM128_Lev_17 ;   0 ; Lev_17  ; LEV_17 ZONE
dc.l Demo_EHZ ; $06
+
levartptrs  $34,  $35,  $1C, ArtKos_Lev_18, BM16_Lev_18, BM128_Lev_18 ;  0 ; Lev_18  ; LEV_18 ZONE
dc.l Demo_EHZ ; $07
+
levartptrs  $36,  $37,  $1D, ArtKos_Lev_19, BM16_Lev_19, BM128_Lev_19 ;   0 ; Lev_19  ; LEV_19 ZONE
dc.l Demo_EHZ ; $08
+
levartptrs  $38,  $39,  $1E, ArtKos_Lev_1A, BM16_Lev_1A, BM128_Lev_1A ;  0 ; Lev_1A  ; LEV_1A ZONE
dc.l Demo_EHZ ; $09
+
levartptrs  $3A,  $3B,  $1F, ArtKos_Lev_1B, BM16_Lev_1B, BM128_Lev_1B ;  0 ; Lev_1B  ; LEV_1B ZONE
dc.l Demo_EHZ ; $0A
+
levartptrs  $3C,  $3D,  $20, ArtKos_Lev_1C, BM16_Lev_1C, BM128_Lev_1C ;  0 ; Lev_1C  ; LEV_1C ZONE
dc.l Demo_EHZ ; $0B
+
levartptrs  $3E,  $3F,  $21, ArtKos_Lev_1D, BM16_Lev_1D, BM128_Lev_1D ;  0 ; Lev_1D  ; LEV_1D ZONE
dc.l Demo_CNZ ; $0C
+
levartptrs  $40,  $41,  $22, ArtKos_Lev_1E, BM16_Lev_1E, BM128_Lev_1E ;   0 ; Lev_1E  ; LEV_1E ZONE
dc.l Demo_CPZ ; $0D
+
levartptrs  $42,  $43,  $23, ArtKos_Lev_1F, BM16_Lev_1F, BM128_Lev_1F ;   0 ; Lev_1F  ; LEV_1F ZONE
dc.l Demo_EHZ ; $0E
+
levartptrs  $44,  $45,  $24, ArtKos_Lev_20, BM16_Lev_20, BM128_Lev_20 ;  0 ; Lev_20  ; LEV_20 ZONE
dc.l Demo_ARZ ; $0F
+
</syntaxhighlight>
dc.l Demo_EHZ ; $10
 
</asm>
 
  
and insert after it:
+
After this is added, you possibly need to add loading queries to the texture load index. Create the .bin files and you're finished.
<asm>
 
dc.l Demo_EHZ ; $11
 
dc.l Demo_EHZ ; $12
 
dc.l Demo_EHZ ; $13
 
dc.l Demo_EHZ ; $14
 
dc.l Demo_EHZ ; $15
 
dc.l Demo_EHZ ; $16
 
dc.l Demo_EHZ ; $17
 
dc.l Demo_EHZ ; $18
 
dc.l Demo_EHZ ; $19
 
dc.l Demo_EHZ ; $1A
 
dc.l Demo_EHZ ; $1B
 
dc.l Demo_EHZ ; $1C
 
dc.l Demo_EHZ ; $1D
 
dc.l Demo_EHZ ; $1E
 
dc.l Demo_EHZ ; $1F
 
dc.l Demo_EHZ ; $20
 
</asm>
 
  
==Extending the Collision index==
+
==Extending level and tile layout indexes==
You would want solidity in your new zones, wouldn't you?  Here we will extend the solidity list so that our extra levels can have solid ground for that blue hedgehog to walk on.
+
Now you need to extend the layout index and we're done extending most level essentials.
 
 
lets start off by extending the primary collision index.  find:
 
<asm>
 
Off_ColP:
 
dc.l ColP_EHZHTZ
 
dc.l Off_Level ; 1
 
dc.l ColP_MTZ ; 2
 
dc.l Off_Level ; 3
 
dc.l ColP_MTZ ; 4
 
dc.l ColP_MTZ ; 5
 
dc.l ColP_WFZSCZ ; 6
 
dc.l ColP_EHZHTZ ; 7
 
dc.l ColP_OOZ ; 8
 
dc.l Off_Level ; 9
 
dc.l ColP_OOZ ; 10
 
dc.l ColP_MCZ ; 11
 
dc.l ColP_CNZ ; 12
 
dc.l ColP_CPZDEZ ; 13
 
dc.l ColP_CPZDEZ ; 14
 
dc.l ColP_ARZ ; 15
 
dc.l ColP_WFZSCZ ; 16
 
</asm>
 
 
 
and replace it with:
 
<asm>
 
Off_ColP:
 
dc.l ColP_EHZHTZ ;00
 
dc.l ColP_EHZHTZ ;01
 
dc.l ColP_MTZ ;02
 
dc.l ColP_MTZ ;03
 
dc.l ColP_MTZ ;04
 
dc.l ColP_MTZ ;05
 
dc.l ColP_WFZSCZ ;06
 
dc.l ColP_EHZHTZ ;07
 
dc.l ColP_OOZ ;08
 
dc.l ColP_OOZ ;09
 
dc.l ColP_OOZ ;0A
 
dc.l ColP_MCZ ;0B
 
dc.l ColP_CNZ ;0C
 
dc.l ColP_CPZDEZ ;0D
 
dc.l ColP_CPZDEZ ;0E
 
dc.l ColP_ARZ ;0F
 
dc.l ColP_WFZSCZ ;10
 
dc.l ColP_Lev11 ;11
 
dc.l ColP_Lev12 ;12
 
dc.l ColP_Lev13 ;13
 
dc.l ColP_Lev14 ;14
 
dc.l ColP_Lev15 ;15
 
dc.l ColP_Lev16 ;16
 
dc.l ColP_Lev17 ;17
 
dc.l ColP_Lev18 ;18
 
dc.l ColP_Lev19 ;19
 
dc.l ColP_Lev1A ;1A
 
dc.l ColP_Lev1B ;1B
 
dc.l ColP_Lev1C ;1C
 
dc.l ColP_Lev1D ;1D
 
dc.l ColP_Lev1E ;1E
 
dc.l ColP_Lev1F ;1F
 
dc.l ColP_Lev20 ;20
 
</asm>
 
 
 
now we will extend the secondary collision index. find:
 
<asm>
 
Off_ColS:
 
dc.l ColS_EHZHTZ
 
dc.l Off_Level ; 1
 
dc.l ColP_MTZ ; 2
 
dc.l Off_Level ; 3
 
dc.l ColP_MTZ ; 4
 
dc.l ColP_MTZ ; 5
 
dc.l ColS_WFZSCZ ; 6
 
dc.l ColS_EHZHTZ ; 7
 
dc.l ColP_OOZ ; 8
 
dc.l Off_Level ; 9
 
dc.l ColP_OOZ ; 10
 
dc.l ColP_MCZ ; 11
 
dc.l ColS_CNZ ; 12
 
dc.l ColS_CPZDEZ ; 13
 
dc.l ColS_CPZDEZ ; 14
 
dc.l ColS_ARZ ; 15
 
dc.l ColS_WFZSCZ ; 16
 
</asm>
 
 
 
we will replace it with:
 
<asm>
 
Off_ColS:
 
dc.l ColS_EHZHTZ ;00
 
dc.l ColP_EHZHTZ ;01
 
dc.l ColP_MTZ ;02
 
dc.l Off_Level ;03
 
dc.l ColP_MTZ ;04
 
dc.l ColP_MTZ ;05
 
dc.l ColS_WFZSCZ ;06
 
dc.l ColS_EHZHTZ ;07
 
dc.l ColP_OOZ ;08
 
dc.l Off_Level ;09
 
dc.l ColP_OOZ ;0A
 
dc.l ColP_MCZ ;0B
 
dc.l ColS_CNZ ;0C
 
dc.l ColS_CPZDEZ ;0D
 
dc.l ColS_CPZDEZ ;0E
 
dc.l ColS_ARZ ;0F
 
dc.l ColS_WFZSCZ ;10
 
dc.l ColS_Lev11 ;11
 
dc.l ColS_Lev12 ;12
 
dc.l ColS_Lev13 ;13
 
dc.l ColS_Lev14 ;14
 
dc.l ColS_Lev15 ;15
 
dc.l ColS_Lev16 ;16
 
dc.l ColS_Lev17 ;17
 
dc.l ColS_Lev18 ;18
 
dc.l ColS_Lev19 ;19
 
dc.l ColS_Lev1A ;1A
 
dc.l ColS_Lev1B ;1B
 
dc.l ColS_Lev1C ;1C
 
dc.l ColS_Lev1D ;1D
 
dc.l ColS_Lev1E ;1E
 
dc.l ColS_Lev1F ;1F
 
dc.l ColS_Lev20 ;20
 
</asm>
 
 
 
Now, in order to fix a bug that makes collision swaps more buggy than a savestate loaded from another game, we need to do some splitting and moving.
 
  
 
Find:
 
Find:
<asm>
+
<syntaxhighlight lang="asm">
LoadCollisionIndexes:
+
Off_Level: zoneOrderedOffsetTable 2,2
moveq #0,d0
+
zoneOffsetTableEntry.w Level_EHZ1
move.b (Current_Zone).w,d0
+
zoneOffsetTableEntry.w Level_EHZ2 ; 1
lsl.w #2,d0
+
zoneOffsetTableEntry.w Level_EHZ1 ; 2
move.l #Primary_Collision,(Collision_addr).w
+
zoneOffsetTableEntry.w Level_EHZ1 ; 3
move.w d0,-(sp)
+
zoneOffsetTableEntry.w Level_EHZ1 ; 4
movea.l Off_ColP(pc,d0.w),a0
+
zoneOffsetTableEntry.w Level_EHZ1 ; 5
lea (Primary_Collision).w,a1
+
zoneOffsetTableEntry.w Level_EHZ1 ; 6
bsr.w KosDec
+
zoneOffsetTableEntry.w Level_EHZ1 ; 7
move.w (sp)+,d0
+
zoneOffsetTableEntry.w Level_MTZ1 ; 8
movea.l Off_ColS(pc,d0.w),a0
+
zoneOffsetTableEntry.w Level_MTZ2 ; 9
lea (Secondary_Collision).w,a1
+
zoneOffsetTableEntry.w Level_MTZ3 ; 10
bra.w KosDec
+
zoneOffsetTableEntry.w Level_MTZ3 ; 11
</asm>
+
zoneOffsetTableEntry.w Level_WFZ ; 12
 +
zoneOffsetTableEntry.w Level_WFZ ; 13
 +
zoneOffsetTableEntry.w Level_HTZ1 ; 14
 +
zoneOffsetTableEntry.w Level_HTZ2 ; 15
 +
zoneOffsetTableEntry.w Level_OOZ1 ; 16
 +
zoneOffsetTableEntry.w Level_OOZ1 ; 17
 +
zoneOffsetTableEntry.w Level_EHZ1 ; 18
 +
zoneOffsetTableEntry.w Level_EHZ1 ; 19
 +
zoneOffsetTableEntry.w Level_OOZ1 ; 20
 +
zoneOffsetTableEntry.w Level_OOZ2 ; 21
 +
zoneOffsetTableEntry.w Level_MCZ1 ; 22
 +
zoneOffsetTableEntry.w Level_MCZ2 ; 23
 +
zoneOffsetTableEntry.w Level_CNZ1 ; 24
 +
zoneOffsetTableEntry.w Level_CNZ2 ; 25
 +
zoneOffsetTableEntry.w Level_CPZ1 ; 26
 +
zoneOffsetTableEntry.w Level_CPZ2 ; 27
 +
zoneOffsetTableEntry.w Level_DEZ ; 28
 +
zoneOffsetTableEntry.w Level_DEZ ; 29
 +
zoneOffsetTableEntry.w Level_ARZ1 ; 30
 +
zoneOffsetTableEntry.w Level_ARZ2 ; 31
 +
zoneOffsetTableEntry.w Level_SCZ ; 32
 +
zoneOffsetTableEntry.w Level_SCZ ; 33
 +
</syntaxhighlight>
  
and replace it with:
+
and add this to the end:
<asm>
+
<syntaxhighlight lang="asm">
moveq #0,d0
+
zoneOffsetTableEntry.w Level_Lev11_1
move.b (Current_Zone).w,d0
+
zoneOffsetTableEntry.w Level_Lev11_2
lsl.w #2,d0
+
zoneOffsetTableEntry.w Level_Lev12_1
move.l #Primary_Collision,(Collision_addr).w
+
zoneOffsetTableEntry.w Level_Lev12_2
move.w d0,-(sp)
+
zoneOffsetTableEntry.w Level_Lev13_1
movea.l Off_ColP(pc,d0.w),a0
+
zoneOffsetTableEntry.w Level_Lev13_2
lea (Primary_Collision).w,a1
+
zoneOffsetTableEntry.w Level_Lev14_1
bsr.w KosDec
+
zoneOffsetTableEntry.w Level_Lev14_2
move.w (sp)+,d0
+
zoneOffsetTableEntry.w Level_Lev15_1
jsr LoadSecondaryCollisionIndexes
+
zoneOffsetTableEntry.w Level_Lev15_2
</asm>
+
zoneOffsetTableEntry.w Level_Lev16_1
 +
zoneOffsetTableEntry.w Level_Lev16_2
 +
zoneOffsetTableEntry.w Level_Lev17_1
 +
zoneOffsetTableEntry.w Level_Lev17_2
 +
zoneOffsetTableEntry.w Level_Lev18_1
 +
zoneOffsetTableEntry.w Level_Lev18_2
 +
zoneOffsetTableEntry.w Level_Lev19_1
 +
zoneOffsetTableEntry.w Level_Lev19_2
 +
zoneOffsetTableEntry.w Level_Lev1A_1
 +
zoneOffsetTableEntry.w Level_Lev1A_2
 +
zoneOffsetTableEntry.w Level_Lev1B_1
 +
zoneOffsetTableEntry.w Level_Lev1B_2
 +
zoneOffsetTableEntry.w Level_Lev1C_1
 +
zoneOffsetTableEntry.w Level_Lev1C_2
 +
zoneOffsetTableEntry.w Level_Lev1D_1
 +
zoneOffsetTableEntry.w Level_Lev1D_2
 +
zoneOffsetTableEntry.w Level_Lev1E_1
 +
zoneOffsetTableEntry.w Level_Lev1E_2
 +
zoneOffsetTableEntry.w Level_Lev1F_1
 +
zoneOffsetTableEntry.w Level_Lev1F_2
 +
zoneOffsetTableEntry.w Level_Lev20_1
 +
zoneOffsetTableEntry.w Level_Lev20_2
 +
</syntaxhighlight>
  
Then go to the end of the ROM and add the following:
+
Then find:
<asm>
+
<syntaxhighlight lang="asm">
LoadSecondaryCollisionIndexes:
+
;---------------------------------------------------------------------------------------
movea.l Off_ColS(pc,d0.w),a0
+
; EHZ act 1 level layout (Kosinski compression)
lea (Secondary_Collision).w,a1
+
Level_EHZ1: BINCLUDE "level/layout/EHZ_1.bin"
bra.w JmpTo3_KosDec
+
;---------------------------------------------------------------------------------------
 +
; EHZ act 2 level layout (Kosinski compression)
 +
Level_EHZ2: BINCLUDE "level/layout/EHZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; MTZ act 1 level layout (Kosinski compression)
 +
Level_MTZ1: BINCLUDE "level/layout/MTZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; MTZ act 2 level layout (Kosinski compression)
 +
Level_MTZ2: BINCLUDE "level/layout/MTZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; MTZ act 3 level layout (Kosinski compression)
 +
Level_MTZ3: BINCLUDE "level/layout/MTZ_3.bin"
 +
;---------------------------------------------------------------------------------------
 +
; WFZ level layout (Kosinski compression)
 +
Level_WFZ: BINCLUDE "level/layout/WFZ.bin"
 +
;---------------------------------------------------------------------------------------
 +
; HTZ act 1 level layout (Kosinski compression)
 +
Level_HTZ1: BINCLUDE "level/layout/HTZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; HTZ act 2 level layout (Kosinski compression)
 +
Level_HTZ2: BINCLUDE "level/layout/HTZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; OOZ act 1 level layout (Kosinski compression)
 +
Level_OOZ1: BINCLUDE "level/layout/OOZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; OOZ act 2 level layout (Kosinski compression)
 +
Level_OOZ2: BINCLUDE "level/layout/OOZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; MCZ act 1 level layout (Kosinski compression)
 +
Level_MCZ1: BINCLUDE "level/layout/MCZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; MCZ act 2 level layout (Kosinski compression)
 +
Level_MCZ2: BINCLUDE "level/layout/MCZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; CNZ act 1 level layout (Kosinski compression)
 +
Level_CNZ1: BINCLUDE "level/layout/CNZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; CNZ act 2 level layout (Kosinski compression)
 +
Level_CNZ2: BINCLUDE "level/layout/CNZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; CPZ act 1 level layout (Kosinski compression)
 +
Level_CPZ1: BINCLUDE "level/layout/CPZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; CPZ act 2 level layout (Kosinski compression)
 +
Level_CPZ2: BINCLUDE "level/layout/CPZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; DEZ level layout (Kosinski compression)
 +
Level_DEZ: BINCLUDE "level/layout/DEZ.bin"
 +
;---------------------------------------------------------------------------------------
 +
; ARZ act 1 level layout (Kosinski compression)
 +
Level_ARZ1: BINCLUDE "level/layout/ARZ_1.bin"
 +
;---------------------------------------------------------------------------------------
 +
; ARZ act 2 level layout (Kosinski compression)
 +
Level_ARZ2: BINCLUDE "level/layout/ARZ_2.bin"
 +
;---------------------------------------------------------------------------------------
 +
; SCZ level layout (Kosinski compression)
 +
Level_SCZ: BINCLUDE "level/layout/SCZ.bin"
 +
</syntaxhighlight>
  
JmpTo3_KosDec:
+
then add this at the end:
jmp KosDec
+
<syntaxhighlight lang="asm">
</asm>
 
 
 
then Off_ColS index directly below that location.
 
 
 
next we need to define the symbols (duh).  find:
 
<asm>
 
; WFZ/SCZ secondary 16x16 collision index (Kozinski compression)
 
ColS_WFZSCZ: BINCLUDE "collision/WFZ and SCZ secondary 16x16 collision index.bin"
 
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
</asm>
+
; Lev11 act 1 level layout (Kosinski compression)
and we will insert the new collision entries after that as follows:
+
Level_Lev11_1: BINCLUDE "level/layout/Lev11_1.bin"
<asm>
 
; new level primary 16x16 collision index (Kozinski compression)
 
ColP_Lev11: BINCLUDE "collision/Lev11 primary 16x16 collision index.bin"
 
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev11 act 2 level layout (Kosinski compression)
ColS_Lev11: BINCLUDE "collision/Lev11 secondary 16x16 collision index.bin"
+
Level_Lev11_2: BINCLUDE "level/layout/Lev11_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev12_1 level layout (Kosinski compression)
ColP_Lev12: BINCLUDE "collision/Lev12 primary 16x16 collision index.bin"
+
Level_Lev12_1: BINCLUDE "level/layout/Lev12_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev12_2 level layout (Kosinski compression)
ColS_Lev12: BINCLUDE "collision/Lev12 secondary 16x16 collision index.bin"
+
Level_Lev12_1: BINCLUDE "level/layout/Lev12_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev13_1 level layout (Kosinski compression)
ColP_Lev13: BINCLUDE "collision/Lev13 primary 16x16 collision index.bin"
+
Level_Lev13_1: BINCLUDE "level/layout/Lev13_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev13_2 level layout (Kosinski compression)
ColS_Lev13: BINCLUDE "collision/Lev13 secondary 16x16 collision index.bin"
+
Level_Lev13_2: BINCLUDE "level/layout/Lev13_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev14_1 level layout (Kosinski compression)
ColP_Lev14: BINCLUDE "collision/Lev14 primary 16x16 collision index.bin"
+
Level_Lev14_1: BINCLUDE "level/layout/Lev14_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev14_2 level layout (Kosinski compression)
ColS_Lev14: BINCLUDE "collision/Lev14 secondary 16x16 collision index.bin"
+
Level_Lev14_2: BINCLUDE "level/layout/Lev14_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev15_1 level layout (Kosinski compression)
ColP_Lev15: BINCLUDE "collision/Lev15 primary 16x16 collision index.bin"
+
Level_Lev15_1: BINCLUDE "level/layout/Lev15_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev15_2 level layout (Kosinski compression)
ColS_Lev15: BINCLUDE "collision/Lev15 secondary 16x16 collision index.bin"
+
Level_Lev15_2: BINCLUDE "level/layout/Lev15_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev16_1 level layout (Kosinski compression)
ColP_Lev16: BINCLUDE "collision/Lev16 primary 16x16 collision index.bin"
+
Level_Lev16_1: BINCLUDE "level/layout/Lev16_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev16_2 level layout (Kosinski compression)
ColS_Lev16: BINCLUDE "collision/Lev16 secondary 16x16 collision index.bin"
+
Level_Lev16_2: BINCLUDE "level/layout/Lev16_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev17_1 level layout (Kosinski compression)
ColP_Lev17: BINCLUDE "collision/Lev17 primary 16x16 collision index.bin"
+
Level_Lev17_1: BINCLUDE "level/layout/Lev17_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev17_2 level layout (Kosinski compression)
ColS_Lev17: BINCLUDE "collision/Lev17 secondary 16x16 collision index.bin"
+
Level_Lev17_2: BINCLUDE "level/layout/Lev17_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev18_1 level layout (Kosinski compression)
ColP_Lev18: BINCLUDE "collision/Lev18 primary 16x16 collision index.bin"
+
Level_Lev18_1: BINCLUDE "level/layout/Lev18_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev18_2 level layout (Kosinski compression)
ColS_Lev18: BINCLUDE "collision/Lev18 secondary 16x16 collision index.bin"
+
Level_Lev18_2: BINCLUDE "level/layout/Lev18_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev19_1 level layout (Kosinski compression)
ColP_Lev19: BINCLUDE "collision/Lev19 primary 16x16 collision index.bin"
+
Level_Lev19_1: BINCLUDE "level/layout/Lev19_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev19_2 level layout (Kosinski compression)
ColS_Lev19: BINCLUDE "collision/Lev19 secondary 16x16 collision index.bin"
+
Level_Lev19_2: BINCLUDE "level/layout/Lev19_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev1A_1 level layout (Kosinski compression)
ColP_Lev1A: BINCLUDE "collision/Lev1A primary 16x16 collision index.bin"
+
Level_Lev1A_1: BINCLUDE "level/layout/Lev1A_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev1A_2 level layout (Kosinski compression)
ColS_Lev1A: BINCLUDE "collision/Lev1A secondary 16x16 collision index.bin"
+
Level_Lev1A_2: BINCLUDE "level/layout/Lev1A_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev1B_1 level layout (Kosinski compression)
ColP_Lev1B: BINCLUDE "collision/Lev1B primary 16x16 collision index.bin"
+
Level_Lev1B_1: BINCLUDE "level/layout/Lev1B_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev1B_2 level layout (Kosinski compression)
ColS_Lev1B: BINCLUDE "collision/Lev1B secondary 16x16 collision index.bin"
+
Level_Lev1B_2: BINCLUDE "level/layout/Lev1B_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev1C_1 level layout (Kosinski compression)
ColP_Lev1C: BINCLUDE "collision/Lev1C primary 16x16 collision index.bin"
+
Level_Lev1C_1: BINCLUDE "level/layout/Lev1C_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev1C_2 level layout (Kosinski compression)
ColS_Lev1C: BINCLUDE "collision/Lev1C secondary 16x16 collision index.bin"
+
Level_Lev1C_2: BINCLUDE "level/layout/Lev1C_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev1D_1 level layout (Kosinski compression)
ColP_Lev1D: BINCLUDE "collision/Lev1D primary 16x16 collision index.bin"
+
Level_Lev1D_1: BINCLUDE "level/layout/Lev1D_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev1D_2 level layout (Kosinski compression)
ColS_Lev1D: BINCLUDE "collision/Lev1D secondary 16x16 collision index.bin"
+
Level_Lev1D_2: BINCLUDE "level/layout/Lev1D_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev1E_1 level layout (Kosinski compression)
ColP_Lev1E: BINCLUDE "collision/Lev1E primary 16x16 collision index.bin"
+
Level_Lev1E_1: BINCLUDE "level/layout/Lev1E_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev1E_2 level layout (Kosinski compression)
ColS_Lev1E: BINCLUDE "collision/Lev1E secondary 16x16 collision index.bin"
+
Level_Lev1E_2: BINCLUDE "level/layout/Lev1E_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev1F_1 level layout (Kosinski compression)
ColP_Lev1F: BINCLUDE "collision/Lev1F primary 16x16 collision index.bin"
+
Level_Lev1F_1: BINCLUDE "level/layout/Lev1F_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev1F_2 level layout (Kosinski compression)
ColS_Lev1F: BINCLUDE "collision/Lev1F secondary 16x16 collision index.bin"
+
Level_Lev1F_2: BINCLUDE "level/layout/Lev1F_2.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level primary 16x16 collision index (Kozinski compression)
+
; Lev20_1 level layout (Kosinski compression)
ColP_Lev20: BINCLUDE "collision/Lev20 primary 16x16 collision index.bin"
+
Level_Lev20_1: BINCLUDE "level/layout/Lev20_1.bin"
 
;---------------------------------------------------------------------------------------
 
;---------------------------------------------------------------------------------------
; new level secondary 16x16 collision index (Kozinski compression)
+
; Lev20_2 level layout (Kosinski compression)
ColS_Lev20: BINCLUDE "collision/Lev20 secondary 16x16 collision index.bin"
+
Level_Lev20_2: BINCLUDE "level/layout/Lev20_2.bin"
;---------------------------------------------------------------------------------------
+
</syntaxhighlight>
</asm>
+
 
 +
Now create the .bin files.
  
==Extending Rings Index==
+
==Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)==
Now we add rings to our new levels.
+
just being able to use sign posts in your new levels can be boring after a while, so we will make those changes so that we can put custom bosses in our new levels, actually extending the sprite pointer list is not within the scope of the tutorial, though highly recommended.
  
Find:
+
find:
<asm>
+
<syntaxhighlight lang="asm">
Off_Rings:
+
; sub_4BD2:
dc.w Rings_EHZ_1 - Off_Rings ; 0  $00
+
SetLevelEndType:
dc.w Rings_EHZ_2 - Off_Rings ; 1
+
move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost
dc.w Rings_Lev1_1 - Off_Rings ; 2  $01
+
tst.w (Two_player_mode).w ; is it two-player competitive mode?
dc.w Rings_Lev1_2 - Off_Rings ; 3
+
bne.s LevelEnd_SetSignpost ; if yes, branch
dc.w Rings_Lev2_1 - Off_Rings ; 4  $02
+
nosignpost.w emerald_hill_zone_act_2
dc.w Rings_Lev2_2 - Off_Rings ; 5
+
nosignpost.w metropolis_zone_act_3
dc.w Rings_Lev3_1 - Off_Rings ; 6  $03
+
nosignpost.w wing_fortress_zone_act_1
dc.w Rings_Lev3_2 - Off_Rings ; 7
+
nosignpost.w hill_top_zone_act_2
dc.w Rings_MTZ_1 - Off_Rings ; 8  $04
+
nosignpost.w oil_ocean_zone_act_2
dc.w Rings_MTZ_2 - Off_Rings ; 9
+
nosignpost.s mystic_cave_zone_act_2
dc.w Rings_MTZ_3 - Off_Rings ; 10 $05
+
nosignpost.s casino_night_zone_act_2
dc.w Rings_MTZ_4 - Off_Rings ; 11
+
nosignpost.s chemical_plant_zone_act_2
dc.w Rings_WFZ_1 - Off_Rings ; 12 $06
+
nosignpost.s death_egg_zone_act_1
dc.w Rings_WFZ_2 - Off_Rings ; 13
+
nosignpost.s aquatic_ruin_zone_act_2
dc.w Rings_HTZ_1 - Off_Rings ; 14 $07
+
nosignpost.s sky_chase_zone_act_1
dc.w Rings_HTZ_2 - Off_Rings ; 15
+
</syntaxhighlight>
dc.w Rings_HPZ_1 - Off_Rings ; 16 $08
+
we will change it to:
dc.w Rings_HPZ_2 - Off_Rings ; 17
+
<syntaxhighlight lang="asm">
dc.w Rings_Lev9_1 - Off_Rings ; 18 $09
+
SetLevelEndType:
dc.w Rings_Lev9_2 - Off_Rings ; 19
+
move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost
dc.w Rings_OOZ_1 - Off_Rings ; 20 $0A
+
tst.w (Two_player_mode).w ; is it two-player competitive mode?
dc.w Rings_OOZ_2 - Off_Rings ; 21
+
bne.w LevelEnd_SetSignpost ; if yes, branch
dc.w Rings_MCZ_1 - Off_Rings ; 22 $0B
+
nosignpost.w emerald_hill_zone_act_2
dc.w Rings_MCZ_2 - Off_Rings ; 23
+
nosignpost.w metropolis_zone_act_3
dc.w Rings_CNZ_1 - Off_Rings ; 24 $0C
+
nosignpost.w wing_fortress_zone_act_1
dc.w Rings_CNZ_2 - Off_Rings ; 25
+
nosignpost.w hill_top_zone_act_2
dc.w Rings_CPZ_1 - Off_Rings ; 26 $0D
+
nosignpost.w oil_ocean_zone_act_2
dc.w Rings_CPZ_2 - Off_Rings ; 27
+
nosignpost.w mystic_cave_zone_act_2
dc.w Rings_DEZ_1 - Off_Rings ; 28 $0E
+
nosignpost.w casino_night_zone_act_2
dc.w Rings_DEZ_2 - Off_Rings ; 29
+
nosignpost.w chemical_plant_zone_act_2
dc.w Rings_ARZ_1 - Off_Rings ; 30 $0F
+
nosignpost.w death_egg_zone_act_1
dc.w Rings_ARZ_2 - Off_Rings ; 31
+
nosignpost.w aquatic_ruin_zone_act_2
dc.w Rings_SCZ_1 - Off_Rings ; 32 $10
+
nosignpost.w sky_chase_zone_act_1
dc.w Rings_SCZ_2 - Off_Rings ; 33
+
nosignpost.w $1101
</asm>
+
nosignpost.w $1201
 +
nosignpost.w $1301
 +
nosignpost.w $1401
 +
nosignpost.w $1501
 +
nosignpost.w $1601
 +
nosignpost.s $1701
 +
nosignpost.s $1801
 +
nosignpost.s $1901
 +
nosignpost.s $1A01
 +
nosignpost.s $1B01
 +
nosignpost.s $1C01
 +
nosignpost.s $1D01
 +
nosignpost.s $1E01
 +
nosignpost.s $1F01
 +
nosignpost.s $2001
  
and add this to the end:
+
; loc_4C40:
<asm>
+
LevelEnd_SetSignpost:
dc.w Rings_Lev_11_1 - Off_Rings ; 34 $11
+
move.w #1,(Level_Has_Signpost).w ; set level type to signpost
dc.w Rings_Lev_11_2 - Off_Rings ; 35
+
+ rts
dc.w Rings_Lev_12_1 - Off_Rings ; 36 $12
+
</syntaxhighlight>
dc.w Rings_Lev_12_2 - Off_Rings ; 37
 
dc.w Rings_Lev_13_1 - Off_Rings ; 38 $13
 
dc.w Rings_Lev_13_2 - Off_Rings ; 39
 
dc.w Rings_Lev_14_1 - Off_Rings ; 40 $14
 
dc.w Rings_Lev_14_2 - Off_Rings ; 41
 
dc.w Rings_Lev_15_1 - Off_Rings ; 42 $15
 
dc.w Rings_Lev_15_2 - Off_Rings ; 43
 
dc.w Rings_Lev_16_1 - Off_Rings ; 44 $16
 
dc.w Rings_Lev_16_2 - Off_Rings ; 45
 
dc.w Rings_Lev_17_1 - Off_Rings ; 46 $17
 
dc.w Rings_Lev_17_2 - Off_Rings ; 47
 
dc.w Rings_Lev_18_1 - Off_Rings ; 48 $18
 
dc.w Rings_Lev_18_2 - Off_Rings ; 49
 
dc.w Rings_Lev_19_1 - Off_Rings ; 50 $19
 
dc.w Rings_Lev_19_2 - Off_Rings ; 51
 
dc.w Rings_Lev_1A_1 - Off_Rings ; 52 $1A
 
dc.w Rings_Lev_1A_2 - Off_Rings ; 53
 
dc.w Rings_Lev_1B_1 - Off_Rings ; 54 $1B
 
dc.w Rings_Lev_1B_2 - Off_Rings ; 55
 
dc.w Rings_Lev_1C_1 - Off_Rings ; 56 $1C
 
dc.w Rings_Lev_1C_2 - Off_Rings ; 57
 
dc.w Rings_Lev_1D_1 - Off_Rings ; 58 $1D
 
dc.w Rings_Lev_1D_2 - Off_Rings ; 59
 
dc.w Rings_Lev_1E_1 - Off_Rings ; 60 $1E
 
dc.w Rings_Lev_1E_2 - Off_Rings ; 61
 
dc.w Rings_Lev_1F_1 - Off_Rings ; 62 $1F
 
dc.w Rings_Lev_1F_2 - Off_Rings ; 63
 
dc.w Rings_Lev_20_1 - Off_Rings ; 64 $20
 
dc.w Rings_Lev_20_2 - Off_Rings ; 65
 
</asm>
 
  
Now find:
+
==Extend Level Size Array==
<asm>
+
our levels need a size, right?  This part of the guide gives us just that.
Rings_EHZ_1: BINCLUDE "level/rings/EHZ_1.bin"
 
Rings_EHZ_2: BINCLUDE "level/rings/EHZ_2.bin"
 
Rings_Lev1_1: BINCLUDE "level/rings/01_1.bin"
 
Rings_Lev1_2: BINCLUDE "level/rings/01_2.bin"
 
Rings_Lev2_1: BINCLUDE "level/rings/02_1.bin"
 
Rings_Lev2_2: BINCLUDE "level/rings/02_2.bin"
 
Rings_Lev3_1: BINCLUDE "level/rings/03_1.bin"
 
Rings_Lev3_2: BINCLUDE "level/rings/03_2.bin"
 
Rings_MTZ_1: BINCLUDE "level/rings/MTZ_1.bin"
 
Rings_MTZ_2: BINCLUDE "level/rings/MTZ_2.bin"
 
Rings_MTZ_3: BINCLUDE "level/rings/MTZ_3.bin"
 
Rings_MTZ_4: BINCLUDE "level/rings/MTZ_4.bin"
 
Rings_HTZ_1: BINCLUDE "level/rings/HTZ_1.bin"
 
Rings_HTZ_2: BINCLUDE "level/rings/HTZ_2.bin"
 
Rings_HPZ_1: BINCLUDE "level/rings/HPZ_1.bin"
 
Rings_HPZ_2: BINCLUDE "level/rings/HPZ_2.bin"
 
Rings_Lev9_1: BINCLUDE "level/rings/09_1.bin"
 
Rings_Lev9_2: BINCLUDE "level/rings/09_2.bin"
 
Rings_OOZ_1: BINCLUDE "level/rings/OOZ_1.bin"
 
Rings_OOZ_2: BINCLUDE "level/rings/OOZ_2.bin"
 
Rings_MCZ_1: BINCLUDE "level/rings/MCZ_1.bin"
 
Rings_MCZ_2: BINCLUDE "level/rings/MCZ_2.bin"
 
Rings_CNZ_1: BINCLUDE "level/rings/CNZ_1.bin"
 
Rings_CNZ_2: BINCLUDE "level/rings/CNZ_2.bin"
 
Rings_CPZ_1: BINCLUDE "level/rings/CPZ_1.bin"
 
Rings_CPZ_2: BINCLUDE "level/rings/CPZ_2.bin"
 
Rings_DEZ_1: BINCLUDE "level/rings/DEZ_1.bin"
 
Rings_DEZ_2: BINCLUDE "level/rings/DEZ_2.bin"
 
Rings_WFZ_1: BINCLUDE "level/rings/WFZ_1.bin"
 
Rings_WFZ_2: BINCLUDE "level/rings/WFZ_2.bin"
 
Rings_ARZ_1: BINCLUDE "level/rings/ARZ_1.bin"
 
Rings_ARZ_2: BINCLUDE "level/rings/ARZ_2.bin"
 
Rings_SCZ_1: BINCLUDE "level/rings/SCZ_1.bin"
 
Rings_SCZ_2: BINCLUDE "level/rings/SCZ_2.bin"
 
</asm>
 
  
and add this to the end:
+
what we need to find is:
<asm>
+
<syntaxhighlight lang="asm">
Rings_Lev_11_1: BINCLUDE "level/rings/Lev_11_1.bin"
+
LevelSize: zoneOrderedTable 2,8 ; WrdArr_LvlSize
Rings_Lev_11_2: BINCLUDE "level/rings/Lev_11_2.bin"
+
zoneTableEntry.w $0, $29A0, $0, $320 ; EHZ act 1
Rings_Lev_12_1: BINCLUDE "level/rings/Lev_12_1.bin"
+
zoneTableEntry.w $0, $2940, $0, $420 ; EHZ act 2
Rings_Lev_12_2: BINCLUDE "level/rings/Lev_12_2.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720 ; $01
Rings_Lev_13_1: BINCLUDE "level/rings/Lev_13_1.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720
Rings_Lev_13_2: BINCLUDE "level/rings/Lev_13_2.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720 ; $02
Rings_Lev_14_1: BINCLUDE "level/rings/Lev_14_1.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720
Rings_Lev_14_2: BINCLUDE "level/rings/Lev_14_2.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720 ; $03
Rings_Lev_15_1: BINCLUDE "level/rings/Lev_15_1.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720
Rings_Lev_15_2: BINCLUDE "level/rings/Lev_15_2.bin"
+
zoneTableEntry.w $0, $2280, -$100, $800 ; MTZ act 1
Rings_Lev_16_1: BINCLUDE "level/rings/Lev_16_1.bin"
+
zoneTableEntry.w $0, $1E80, -$100, $800 ; MTZ act 2
Rings_Lev_16_2: BINCLUDE "level/rings/Lev_16_2.bin"
+
zoneTableEntry.w $0, $2A80, -$100, $800 ; MTZ act 3
Rings_Lev_17_1: BINCLUDE "level/rings/Lev_17_1.bin"
+
zoneTableEntry.w $0, $3FFF, -$100, $800
Rings_Lev_17_2: BINCLUDE "level/rings/Lev_17_2.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720 ; WFZ
Rings_Lev_18_1: BINCLUDE "level/rings/Lev_18_1.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720
Rings_Lev_18_2: BINCLUDE "level/rings/Lev_18_2.bin"
+
zoneTableEntry.w $0, $2800, $0, $720 ; HTZ act 1
Rings_Lev_19_1: BINCLUDE "level/rings/Lev_19_1.bin"
+
zoneTableEntry.w $0, $3280, $0, $720 ; HTZ act 2
Rings_Lev_19_2: BINCLUDE "level/rings/Lev_19_2.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720 ; $08
Rings_Lev_1A_1: BINCLUDE "level/rings/Lev_1A_1.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720
Rings_Lev_1A_2: BINCLUDE "level/rings/Lev_1A_2.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720 ; $09
Rings_Lev_1B_1: BINCLUDE "level/rings/Lev_1B_1.bin"
+
zoneTableEntry.w $0, $3FFF, $0, $720
Rings_Lev_1B_2: BINCLUDE "level/rings/Lev_1B_2.bin"
+
zoneTableEntry.w $0, $2F80, $0, $680 ; OOZ act 1
Rings_Lev_1C_1: BINCLUDE "level/rings/Lev_1C_1.bin"
+
zoneTableEntry.w $0, $2D00, $0, $680 ; OOZ act 2
Rings_Lev_1C_2: BINCLUDE "level/rings/Lev_1C_2.bin"
+
zoneTableEntry.w $0, $2380, $3C0, $720 ; MCZ act 1
Rings_Lev_1D_1: BINCLUDE "level/rings/Lev_1D_1.bin"
+
zoneTableEntry.w $0, $3FFF, $60, $720 ; MCZ act 2
Rings_Lev_1D_2: BINCLUDE "level/rings/Lev_1D_2.bin"
+
zoneTableEntry.w $0, $27A0, $0, $720 ; CNZ act 1
Rings_Lev_1E_1: BINCLUDE "level/rings/Lev_1E_1.bin"
+
zoneTableEntry.w $0, $2A80, $0, $720 ; CNZ act 2
Rings_Lev_1E_2: BINCLUDE "level/rings/Lev_1E_2.bin"
+
zoneTableEntry.w $0, $2780, $0, $720 ; CPZ act 1
Rings_Lev_1F_1: BINCLUDE "level/rings/Lev_1F_1.bin"
+
zoneTableEntry.w $0, $2A80, $0, $720 ; CPZ act 2
Rings_Lev_1F_2: BINCLUDE "level/rings/Lev_1F_2.bin"
+
zoneTableEntry.w $0, $1000, $C8, $C8 ; DEZ
Rings_Lev_20_1: BINCLUDE "level/rings/Lev_20_1.bin"
+
zoneTableEntry.w $0, $1000,  $C8, $C8
Rings_Lev_20_2: BINCLUDE "level/rings/Lev_20_2.bin"
+
zoneTableEntry.w $0, $28C0, $200, $600 ; ARZ act 1
</asm>
+
zoneTableEntry.w $0, $3FFF, $180, $710 ; ARZ act 2
 +
zoneTableEntry.w $0, $3FFF, $0, $000 ; SCZ
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
Create the necessary blank files then edit them as needed.
+
and we will change it to:
 +
<syntaxhighlight lang="asm">
 +
LevelSize: zoneOrderedTable 2,8 ; WrdArr_LvlSize
 +
zoneTableEntry.w $0, $29A0, $0, $320 ; EHZ act 1
 +
zoneTableEntry.w $0, $2940, $0, $420 ; EHZ act 2
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $01
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $02
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $03
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $2280, -$100, $800 ; MTZ act 1
 +
zoneTableEntry.w $0, $1E80, -$100, $800 ; MTZ act 2
 +
zoneTableEntry.w $0, $2A80, -$100, $800 ; MTZ act 3
 +
zoneTableEntry.w $0, $3FFF, -$100, $800
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; WFZ
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $2800, $0, $720 ; HTZ act 1
 +
zoneTableEntry.w $0, $3280, $0, $720 ; HTZ act 2
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $08
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $09
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $2F80, $0, $680 ; OOZ act 1
 +
zoneTableEntry.w $0, $2D00, $0, $680 ; OOZ act 2
 +
zoneTableEntry.w $0, $2380, $3C0, $720 ; MCZ act 1
 +
zoneTableEntry.w $0, $3FFF, $60, $720 ; MCZ act 2
 +
zoneTableEntry.w $0, $27A0, $0, $720 ; CNZ act 1
 +
zoneTableEntry.w $0, $2A80, $0, $720 ; CNZ act 2
 +
zoneTableEntry.w $0, $2780, $0, $720 ; CPZ act 1
 +
zoneTableEntry.w $0, $2A80, $0, $720 ; CPZ act 2
 +
zoneTableEntry.w $0, $1000, $C8, $C8 ; DEZ
 +
zoneTableEntry.w $0, $1000,  $C8, $C8
 +
zoneTableEntry.w $0, $28C0, $200, $600 ; ARZ act 1
 +
zoneTableEntry.w $0, $3FFF, $180, $710 ; ARZ act 2
 +
zoneTableEntry.w $0, $3FFF, $0, $000 ; SCZ
 +
zoneTableEntry.w $0, $3FFF, $0, $720
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $11 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $12 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $13 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $14 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $15 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $16 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $17 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $18 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $19 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1A ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1B ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1C ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1D ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1E ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1F ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ; $20 ;one of our new levels (act 1)
 +
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
==Extending the object index==
+
==Extending the Start Location Index==
This is similar to extending the ring index.
+
Sonic has to start somewhere right?
  
Find:
+
Find this:
<asm>
+
<syntaxhighlight lang="asm">
Off_Objects:
+
StartLocations: zoneOrderedTable 2,4 ; WrdArr_StartLoc
dc.w Objects_EHZ_1 - Off_Objects ; $00
+
zoneTableBinEntry 2, "startpos/EHZ_1.bin" ; $00
dc.w Objects_EHZ_2 - Off_Objects ; 1
+
zoneTableBinEntry 2, "startpos/EHZ_2.bin"
dc.w Objects_Null3 - Off_Objects ; $01
+
zoneTableEntry.w $60, $28F ; $01
dc.w Objects_Null3 - Off_Objects ; 3
+
zoneTableEntry.w $60, $2AF
dc.w Objects_Null3 - Off_Objects ; $02
+
zoneTableEntry.w $60, $1AC ; $02
dc.w Objects_Null3 - Off_Objects ; 5
+
zoneTableEntry.w $60, $1AC
dc.w Objects_Null3 - Off_Objects ; $03
+
zoneTableEntry.w $60, $28F ; $03
dc.w Objects_Null3 - Off_Objects ; 7
+
zoneTableEntry.w $60, $2AF
dc.w Objects_MTZ_1 - Off_Objects ; $04
+
zoneTableBinEntry 2, "startpos/MTZ_1.bin" ; $04
dc.w Objects_MTZ_2 - Off_Objects ; 9
+
zoneTableBinEntry 2, "startpos/MTZ_2.bin"
dc.w Objects_MTZ_3 - Off_Objects ; 10 $05
+
zoneTableBinEntry 2, "startpos/MTZ_3.bin" ; $05
dc.w Objects_MTZ_3 - Off_Objects ; 11
+
zoneTableEntry.w $60, $2AF
dc.w Objects_WFZ_1 - Off_Objects ; 12 $06
+
zoneTableBinEntry 2, "startpos/WFZ.bin" ; $06
dc.w Objects_WFZ_2 - Off_Objects ; 13
+
zoneTableEntry.w $1E0, $4CC
dc.w Objects_HTZ_1 - Off_Objects ; 14 $07
+
zoneTableBinEntry 2, "startpos/HTZ_1.bin" ; $07
dc.w Objects_HTZ_2 - Off_Objects ; 15
+
zoneTableBinEntry 2, "startpos/HTZ_2.bin"
dc.w Objects_HPZ_1 - Off_Objects ; 16 $08
+
zoneTableEntry.w $230, $1AC ; $08
dc.w Objects_HPZ_2 - Off_Objects ; 17
+
zoneTableEntry.w $230, $1AC
dc.w Objects_Null3 - Off_Objects ; 18 $09
+
zoneTableEntry.w $60, $28F ; $09
dc.w Objects_Null3 - Off_Objects ; 19
+
zoneTableEntry.w $60, $2AF
dc.w Objects_OOZ_1 - Off_Objects ; 20 $0A
+
zoneTableBinEntry 2, "startpos/OOZ_1.bin" ; $0A
dc.w Objects_OOZ_2 - Off_Objects ; 21
+
zoneTableBinEntry 2, "startpos/OOZ_2.bin"
dc.w Objects_MCZ_1 - Off_Objects ; 22 $0B
+
zoneTableBinEntry 2, "startpos/MCZ_1.bin" ; $0B
dc.w Objects_MCZ_2 - Off_Objects ; 23
+
zoneTableBinEntry 2, "startpos/MCZ_2.bin"
dc.w Objects_CNZ_1 - Off_Objects ; 24 $0C
+
zoneTableBinEntry 2, "startpos/CNZ_1.bin" ; $0C
dc.w Objects_CNZ_2 - Off_Objects ; 25
+
zoneTableBinEntry 2, "startpos/CNZ_2.bin"
dc.w Objects_CPZ_1 - Off_Objects ; 26 $0D
+
zoneTableBinEntry 2, "startpos/CPZ_1.bin" ; $0D
dc.w Objects_CPZ_2 - Off_Objects ; 27
+
zoneTableBinEntry 2, "startpos/CPZ_2.bin"
dc.w Objects_DEZ_1 - Off_Objects ; 28 $0E
+
zoneTableBinEntry 2, "startpos/DEZ.bin" ; $0E
dc.w Objects_DEZ_2 - Off_Objects ; 29
+
zoneTableEntry.w $60, $12D
dc.w Objects_ARZ_1 - Off_Objects ; 30 $0F
+
zoneTableBinEntry 2, "startpos/ARZ_1.bin" ; $0F
dc.w Objects_ARZ_2 - Off_Objects ; 31
+
zoneTableBinEntry 2, "startpos/ARZ_2.bin"
dc.w Objects_SCZ_1 - Off_Objects ; 32 $10
+
zoneTableBinEntry 2, "startpos/SCZ.bin" ; $10
dc.w Objects_SCZ_2 - Off_Objects ; 33
+
zoneTableEntry.w $140, $70
</asm>
+
</syntaxhighlight>
  
 
then add this to the end:
 
then add this to the end:
<asm>
+
<syntaxhighlight lang="asm">
dc.w Objects_Lev_11_1 - Off_Objects ; 34 $11
+
zoneTableEntry.w 0, 0 ; $11
dc.w Objects_Lev_11_2 - Off_Objects ; 35
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_12_1 - Off_Objects ; 36 $12
+
zoneTableEntry.w 0, 0 ; $12
dc.w Objects_Lev_12_2 - Off_Objects ; 17
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_13_1 - Off_Objects ; 38 $13
+
zoneTableEntry.w 0, 0 ; $13
dc.w Objects_Lev_13_2 - Off_Objects ; 39
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_14_1 - Off_Objects ; 40 $14
+
zoneTableEntry.w 0, 0 ; $14
dc.w Objects_Lev_14_2 - Off_Objects ; 41
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_15_1 - Off_Objects ; 42 $15
+
zoneTableEntry.w 0, 0 ; $15
dc.w Objects_Lev_15_2 - Off_Objects ; 43
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_16_1 - Off_Objects ; 44 $16
+
zoneTableEntry.w 0, 0 ; $16
dc.w Objects_Lev_16_2 - Off_Objects ; 45
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_17_1 - Off_Objects ; 46 $17
+
zoneTableEntry.w 0, 0 ; $17
dc.w Objects_Lev_17_2 - Off_Objects ; 47
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_18_1 - Off_Objects ; 48 $18
+
zoneTableEntry.w 0, 0 ; $18
dc.w Objects_Lev_18_2 - Off_Objects ; 49
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_19_1 - Off_Objects ; 50 $19
+
zoneTableEntry.w 0, 0 ; $19
dc.w Objects_Lev_19_2 - Off_Objects ; 51
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_1A_1 - Off_Objects ; 52 $1A
+
zoneTableEntry.w 0, 0 ; $1A
dc.w Objects_Lev_1A_2 - Off_Objects ; 53
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_1B_1 - Off_Objects ; 54 $1B
+
zoneTableEntry.w 0, 0 ; $1B
dc.w Objects_Lev_1B_2 - Off_Objects ; 55
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_1C_1 - Off_Objects ; 56 $1C
+
zoneTableEntry.w 0, 0 ; $1C
dc.w Objects_Lev_1C_2 - Off_Objects ; 57
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_1D_1 - Off_Objects ; 58 $1D
+
zoneTableEntry.w 0, 0 ; $1D
dc.w Objects_Lev_1D_2 - Off_Objects ; 59
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_1E_1 - Off_Objects ; 60 $1E
+
zoneTableEntry.w 0, 0 ; $1E
dc.w Objects_Lev_1E_2 - Off_Objects ; 61
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_1F_1 - Off_Objects ; 62 $1F
+
zoneTableEntry.w 0, 0 ; $1F
dc.w Objects_Lev_1F_2 - Off_Objects ; 63
+
zoneTableEntry.w 0, 0
dc.w Objects_Lev_20_1 - Off_Objects ; 64 $20
+
zoneTableEntry.w 0, 0 ; $20
dc.w Objects_Lev_20_2 - Off_Objects ; 65
+
zoneTableEntry.w 0, 0
</asm>
+
</syntaxhighlight>
  
Then find:
+
then replace the 0s with the desired x and y co-ordinance.
<asm>
 
;Objects_Null1: ; unused
 
BINCLUDE "level/objects/Null_1.bin"
 
  
Objects_EHZ_1: BINCLUDE "level/objects/EHZ_1.bin"
+
==Extending the Debug Mode Object List==
Objects_EHZ_2: BINCLUDE "level/objects/EHZ_2.bin"
+
Yes, we might want this too for when you are testing your level environment as well as to hide an easter egg for the player, so find:
Objects_MTZ_1: BINCLUDE "level/objects/MTZ_1.bin"
+
<syntaxhighlight lang="asm">
Objects_MTZ_2: BINCLUDE "level/objects/MTZ_2.bin"
+
JmpTbl_DbgObjLists: zoneOrderedOffsetTable 2,1
Objects_MTZ_3: BINCLUDE "level/objects/MTZ_3.bin"
+
zoneOffsetTableEntry.w DbgObjList_EHZ ; 0
Objects_WFZ_1: BINCLUDE "level/objects/WFZ_1.bin"
+
zoneOffsetTableEntry.w DbgObjList_Def ; 1
Objects_WFZ_2: BINCLUDE "level/objects/WFZ_2.bin"
+
zoneOffsetTableEntry.w DbgObjList_Def ; 2
Objects_HTZ_1: BINCLUDE "level/objects/HTZ_1.bin"
+
zoneOffsetTableEntry.w DbgObjList_Def ; 3
Objects_HTZ_2: BINCLUDE "level/objects/HTZ_2.bin"
+
zoneOffsetTableEntry.w DbgObjList_MTZ ; 4
Objects_HPZ_1: BINCLUDE "level/objects/HPZ_1.bin"
+
zoneOffsetTableEntry.w DbgObjList_MTZ ; 5
Objects_HPZ_2: BINCLUDE "level/objects/HPZ_2.bin"
+
zoneOffsetTableEntry.w DbgObjList_WFZ ; 6
 +
zoneOffsetTableEntry.w DbgObjList_HTZ ; 7
 +
zoneOffsetTableEntry.w DbgObjList_OOZ ; 8
 +
zoneOffsetTableEntry.w DbgObjList_Def ; 9
 +
zoneOffsetTableEntry.w DbgObjList_OOZ ; $A
 +
zoneOffsetTableEntry.w DbgObjList_MCZ ; $B
 +
zoneOffsetTableEntry.w DbgObjList_CNZ ; $C
 +
zoneOffsetTableEntry.w DbgObjList_CPZ ; $D
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $E
 +
zoneOffsetTableEntry.w DbgObjList_ARZ ; $F
 +
zoneOffsetTableEntry.w DbgObjList_SCZ ; $10
 +
</syntaxhighlight>
 +
and add these to the end of it:
 +
<syntaxhighlight lang="asm">
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $11
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $12
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $13
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $14
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $15
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $16
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $17
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $18
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $19
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $1A
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $1B
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $1C
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $1D
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $1E
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $1F
 +
zoneOffsetTableEntry.w DbgObjList_Def ; $20
 +
</syntaxhighlight>
  
;Objects_Null2: ; unused
+
==Extending Initial Camera Index==
BINCLUDE "level/objects/Null_2.bin"
+
Apparently, the Disassembly issues warinings if you don't extend this index, though, making new entries is insanely easy so this really isnt a problem, so find:
 +
<syntaxhighlight lang="asm">
 +
; off_C296:
 +
InitCam_Index: zoneOrderedOffsetTable 2,1
 +
zoneOffsetTableEntry.w InitCam_EHZ
 +
zoneOffsetTableEntry.w InitCam_Null0 ; 1
 +
zoneOffsetTableEntry.w InitCam_WZ ; 2
 +
zoneOffsetTableEntry.w InitCam_Null0 ; 3
 +
zoneOffsetTableEntry.w InitCam_Std ; 4 MTZ
 +
zoneOffsetTableEntry.w InitCam_Std ; 5 MTZ3
 +
zoneOffsetTableEntry.w InitCam_Null1 ; 6
 +
zoneOffsetTableEntry.w InitCam_HTZ ; 7
 +
zoneOffsetTableEntry.w InitCam_HPZ ; 8
 +
zoneOffsetTableEntry.w InitCam_Null2 ; 9
 +
zoneOffsetTableEntry.w InitCam_OOZ ; 10
 +
zoneOffsetTableEntry.w InitCam_MCZ ; 11
 +
zoneOffsetTableEntry.w InitCam_CNZ ; 12
 +
zoneOffsetTableEntry.w InitCam_CPZ ; 13
 +
zoneOffsetTableEntry.w InitCam_Null3 ; 14
 +
zoneOffsetTableEntry.w InitCam_ARZ ; 15
 +
zoneOffsetTableEntry.w InitCam_SCZ ; 16
 +
</syntaxhighlight>
 +
and add these at the bottom:
 +
<syntaxhighlight lang="asm">
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
zoneOffsetTableEntry.w InitCam_Std
 +
</syntaxhighlight>
  
Objects_OOZ_1: BINCLUDE "level/objects/OOZ_1.bin"
+
==Extending the Software Scrolling Index==
Objects_OOZ_2: BINCLUDE "level/objects/OOZ_2.bin"
+
levels in a sonic game have a software scroll manager, so we need to add that to our new levels, so find:
Objects_MCZ_1: BINCLUDE "level/objects/MCZ_1.bin"
+
<syntaxhighlight lang="asm">
Objects_MCZ_2: BINCLUDE "level/objects/MCZ_2.bin"
+
SwScrl_Index: zoneOrderedOffsetTable 2,1 ; JmpTbl_SwScrlMgr
Objects_CNZ_1: BINCLUDE "level/objects/CNZ_1.bin"
+
zoneOffsetTableEntry.w SwScrl_EHZ ; $00
Objects_CNZ_2: BINCLUDE "level/objects/CNZ_2.bin"
+
zoneOffsetTableEntry.w SwScrl_Minimal ; $01
Objects_CPZ_1: BINCLUDE "level/objects/CPZ_1.bin"
+
zoneOffsetTableEntry.w SwScrl_Lev2 ; $02
Objects_CPZ_2: BINCLUDE "level/objects/CPZ_2.bin"
+
zoneOffsetTableEntry.w SwScrl_Minimal ; $03
Objects_DEZ_1: BINCLUDE "level/objects/DEZ_1.bin"
+
zoneOffsetTableEntry.w SwScrl_MTZ ; $04
Objects_DEZ_2: BINCLUDE "level/objects/DEZ_2.bin"
+
zoneOffsetTableEntry.w SwScrl_MTZ ; $05
Objects_ARZ_1: BINCLUDE "level/objects/ARZ_1.bin"
+
zoneOffsetTableEntry.w SwScrl_WFZ ; $06
Objects_ARZ_2: BINCLUDE "level/objects/ARZ_2.bin"
+
zoneOffsetTableEntry.w SwScrl_HTZ ; $07
Objects_SCZ_1: BINCLUDE "level/objects/SCZ_1.bin"
+
zoneOffsetTableEntry.w SwScrl_HPZ ; $08
Objects_SCZ_2: BINCLUDE "level/objects/SCZ_2.bin"
+
zoneOffsetTableEntry.w SwScrl_OOZ ; $0A
Objects_Null3: BINCLUDE "level/objects/Null_3.bin"
+
zoneOffsetTableEntry.w SwScrl_MCZ ; $0B
 +
zoneOffsetTableEntry.w SwScrl_CNZ ; $0C
 +
zoneOffsetTableEntry.w SwScrl_CPZ ; $0D
 +
zoneOffsetTableEntry.w SwScrl_DEZ ; $0E
 +
zoneOffsetTableEntry.w SwScrl_ARZ ; $0F
 +
zoneOffsetTableEntry.w SwScrl_SCZ ; $10
 +
</syntaxhighlight>
 +
and add these at the bottom:
 +
<syntaxhighlight lang="asm">
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $11
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $12
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $13
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $14
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $15
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $16
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $17
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $18
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $19
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $1A
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $1B
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $1C
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $1D
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $1E
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $1F
 +
zoneOffsetTableEntry.w SwScrl_Minimal ; $20
 +
</syntaxhighlight>
  
;Objects_Null4: ; unused
+
==Extending the Dynamic Level Event Index==
BINCLUDE "level/objects/Null_4.bin"
+
The Dynamic Level Event Index points the zones to their scripts, which decide what happens, when, so lets find:
;Objects_Null5: ; unused
+
<syntaxhighlight lang="asm">
BINCLUDE "level/objects/Null_5.bin"
+
; off_E636:
;Objects_Null6: ; unused
+
DynamicLevelEventIndex: zoneOrderedOffsetTable 2,1
BINCLUDE "level/objects/Null_6.bin"
+
zoneOffsetTableEntry.w LevEvents_EHZ ;  0 ; EHZ
</asm>
+
zoneOffsetTableEntry.w LevEvents_001 ;  1 ; LEV1
 +
zoneOffsetTableEntry.w LevEvents_002 ;  2 ; LEV2
 +
zoneOffsetTableEntry.w LevEvents_003 ;  3 ; LEV3
 +
zoneOffsetTableEntry.w LevEvents_MTZ ;  4 ; MTZ
 +
zoneOffsetTableEntry.w LevEvents_MTZ3 ;  5 ; MTZ3
 +
zoneOffsetTableEntry.w LevEvents_WFZ ;  6 ; WFZ
 +
zoneOffsetTableEntry.w LevEvents_HTZ ;  7 ; HTZ
 +
zoneOffsetTableEntry.w LevEvents_HPZ ;  8 ; HPZ
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_OOZ ;  $A ; OOZ
 +
zoneOffsetTableEntry.w LevEvents_MCZ ;  $B ; MCZ
 +
zoneOffsetTableEntry.w LevEvents_CNZ ;  $C ; CNZ
 +
zoneOffsetTableEntry.w LevEvents_CPZ ;  $D ; CPZ
 +
zoneOffsetTableEntry.w LevEvents_DEZ ;  $E ; DEZ
 +
zoneOffsetTableEntry.w LevEvents_ARZ ;  $F ; ARZ
 +
zoneOffsetTableEntry.w LevEvents_SCZ ; $10 ; SCZ
 +
</syntaxhighlight>
 +
and add these at the bottom:
 +
<syntaxhighlight lang="asm">
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;   9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;   9 ; LEV9
 +
zoneOffsetTableEntry.w LevEvents_009 ;  9 ; LEV9
 +
</syntaxhighlight>
  
then add this to the end:
+
I chose the entries from Lev09 because it is a good placeholder for until your wrote your own script for your new zones.
 +
==Extending the Animals==
 +
Whenever you destroy an enemy out pops an animal that hops or flies away, so likely if you don't extend this index, you will not get an animal, but likely a game crash instead, so find:
 +
<syntaxhighlight lang="asm">
 +
Obj28_ZoneAnimals: zoneOrderedTable 1,2
  
<asm>
+
zoneAnimals macro first,second
Objects_Lev_11_1: BINCLUDE "level/objects/Lev_11_1.bin"
+
zoneTableEntry.b (Obj28_Properties_first - Obj28_Properties) / 8
Objects_Lev_11_2: BINCLUDE "level/objects/Lev_11_2.bin"
+
zoneTableEntry.b (Obj28_Properties_second - Obj28_Properties) / 8
Objects_Lev_12_1: BINCLUDE "level/objects/Lev_12_1.bin"
+
    endm
Objects_Lev_12_2: BINCLUDE "level/objects/Lev_12_2.bin"
+
; This table declares what animals will appear in the zone.
Objects_Lev_13_1: BINCLUDE "level/objects/Lev_13_1.bin"
+
; When an enemy is destroyed, a random animal is chosen from the 2 selected animals.
Objects_Lev_13_2: BINCLUDE "level/objects/Lev_13_2.bin"
+
; Note: you must also load the corresponding art in the PLCs.
Objects_Lev_14_1: BINCLUDE "level/objects/Lev_14_1.bin"
+
zoneAnimals.b Squirrel, Bird ; EHZ
Objects_Lev_14_2: BINCLUDE "level/objects/Lev_14_2.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 1
Objects_Lev_15_1: BINCLUDE "level/objects/Lev_15_1.bin"
+
zoneAnimals.b Squirrel, Bird ; WZ
Objects_Lev_15_2: BINCLUDE "level/objects/Lev_15_2.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 3
Objects_Lev_16_1: BINCLUDE "level/objects/Lev_16_1.bin"
+
zoneAnimals.b Beaver, Eagle ; MTZ
Objects_Lev_16_2: BINCLUDE "level/objects/Lev_16_2.bin"
+
zoneAnimals.b Beaver, Eagle ; MTZ
Objects_Lev_17_1: BINCLUDE "level/objects/Lev_17_1.bin"
+
zoneAnimals.b Beaver, Eagle ; WFZ
Objects_Lev_17_2: BINCLUDE "level/objects/Lev_17_2.bin"
+
zoneAnimals.b Beaver, Eagle ; HTZ
Objects_Lev_18_1: BINCLUDE "level/objects/Lev_18_1.bin"
+
zoneAnimals.b Mouse, Seal ; HPZ
Objects_Lev_18_2: BINCLUDE "level/objects/Lev_18_2.bin"
+
zoneAnimals.b Mouse, Seal ; Zone 9
Objects_Lev_19_1: BINCLUDE "level/objects/Lev_19_1.bin"
+
zoneAnimals.b Penguin, Seal ; OOZ
Objects_Lev_19_2: BINCLUDE "level/objects/Lev_19_2.bin"
+
zoneAnimals.b Mouse, Chicken ; MCZ
Objects_Lev_1A_1: BINCLUDE "level/objects/Lev_1A_1.bin"
+
zoneAnimals.b Bear, Bird ; CNZ
Objects_Lev_1A_2: BINCLUDE "level/objects/Lev_1A_2.bin"
+
zoneAnimals.b Rabbit, Eagle ; CPZ
Objects_Lev_1B_1: BINCLUDE "level/objects/Lev_1B_1.bin"
+
zoneAnimals.b Pig, Chicken ; DEZ
Objects_Lev_1B_2: BINCLUDE "level/objects/Lev_1B_2.bin"
+
zoneAnimals.b Penguin, Bird ; ARZ
Objects_Lev_1C_1: BINCLUDE "level/objects/Lev_1C_1.bin"
+
zoneAnimals.b Turtle, Chicken ; SCZ
Objects_Lev_1C_2: BINCLUDE "level/objects/Lev_1C_2.bin"
+
</syntaxhighlight>
Objects_Lev_1D_1: BINCLUDE "level/objects/Lev_1D_1.bin"
+
and add these at the bottom:
Objects_Lev_1D_2: BINCLUDE "level/objects/Lev_1D_2.bin"
+
<syntaxhighlight lang="asm">
Objects_Lev_1E_1: BINCLUDE "level/objects/Lev_1E_1.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 11
Objects_Lev_1E_2: BINCLUDE "level/objects/Lev_1E_2.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 12
Objects_Lev_1F_1: BINCLUDE "level/objects/Lev_1F_1.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 13
Objects_Lev_1F_2: BINCLUDE "level/objects/Lev_1F_2.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 14
Objects_Lev_20_1: BINCLUDE "level/objects/Lev_20_1.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 15
Objects_Lev_20_2: BINCLUDE "level/objects/Lev_20_2.bin"
+
zoneAnimals.b Squirrel, Bird ; Zone 16
</asm>
+
zoneAnimals.b Squirrel, Bird ; Zone 17
 +
zoneAnimals.b Squirrel, Bird ; Zone 18
 +
zoneAnimals.b Squirrel, Bird ; Zone 19
 +
zoneAnimals.b Squirrel, Bird ; Zone 1A
 +
zoneAnimals.b Squirrel, Bird ; Zone 1B
 +
zoneAnimals.b Squirrel, Bird ; Zone 1C
 +
zoneAnimals.b Squirrel, Bird ; Zone 1D
 +
zoneAnimals.b Squirrel, Bird ; Zone 1E
 +
zoneAnimals.b Squirrel, Bird ; Zone 1F
 +
zoneAnimals.b Squirrel, Bird ; Zone 20
 +
</syntaxhighlight>
 +
Change the animals to whatever you please, or add new ones by adding new custom mappings and extending this code:
 +
<syntaxhighlight lang="asm">
 +
; This table declares the speed and mappings of each animal.
 +
Rabbit: obj28decl -$200,-$400,Obj28_MapUnc_11EAC
 +
Chicken: obj28decl -$200,-$300,Obj28_MapUnc_11E1C
 +
Penguin: obj28decl -$180,-$300,Obj28_MapUnc_11EAC
 +
Seal: obj28decl -$140,-$180,Obj28_MapUnc_11E88
 +
Pig: obj28decl -$1C0,-$300,Obj28_MapUnc_11E64
 +
Bird: obj28decl -$300,-$400,Obj28_MapUnc_11E1C
 +
Squirrel: obj28decl -$280,-$380,Obj28_MapUnc_11E40
 +
Eagle: obj28decl -$280,-$300,Obj28_MapUnc_11E1C
 +
Mouse: obj28decl -$200,-$380,Obj28_MapUnc_11E40
 +
Beaver: obj28decl -$2C0,-$300,Obj28_MapUnc_11E40
 +
Turtle: obj28decl -$140,-$200,Obj28_MapUnc_11E40
 +
Bear: obj28decl -$200,-$300,Obj28_MapUnc_11E40
  
==Extending tiles and patterns index==
+
; The following tables tell the properties of animals based on their subtype.
  
==Extending level and tile layout indexes==
+
; word_11950:
 +
Obj28_Speeds:
 +
dc.w -$440, -$400
 +
dc.w -$440, -$400 ; 2
 +
dc.w -$440, -$400 ; 4
 +
dc.w -$300, -$400 ; 6
 +
dc.w -$300, -$400 ; 8
 +
dc.w -$180, -$300 ; 10
 +
dc.w -$180, -$300 ; 12
 +
dc.w -$140, -$180 ; 14
 +
dc.w -$1C0, -$300 ; 16
 +
dc.w -$200, -$300 ; 18
 +
dc.w -$280, -$380 ; 20
 +
; off_1197C:
 +
Obj28_Mappings:
 +
dc.l Obj28_MapUnc_11E1C
 +
dc.l Obj28_MapUnc_11E1C ; 1
 +
dc.l Obj28_MapUnc_11E1C ; 2
 +
dc.l Obj28_MapUnc_11EAC ; 3
 +
dc.l Obj28_MapUnc_11EAC ; 4
 +
dc.l Obj28_MapUnc_11EAC ; 5
 +
dc.l Obj28_MapUnc_11EAC ; 6
 +
dc.l Obj28_MapUnc_11E88 ; 7
 +
dc.l Obj28_MapUnc_11E64 ; 8
 +
dc.l Obj28_MapUnc_11E1C ; 9
 +
dc.l Obj28_MapUnc_11E40 ; 10
 +
; word_119A8:
 +
Obj28_ArtLocations:
 +
dc.w  ArtTile_ArtNem_S1EndFlicky ;  0 Flicky
 +
dc.w  ArtTile_ArtNem_S1EndFlicky ;  1 Flicky
 +
dc.w  ArtTile_ArtNem_S1EndFlicky ;  2 Flicky
 +
dc.w  ArtTile_ArtNem_S1EndRabbit ;  3 Rabbit
 +
dc.w  ArtTile_ArtNem_S1EndRabbit ;  4 Rabbit
 +
dc.w  ArtTile_ArtNem_S1EndPenguin ;  5 Penguin
 +
dc.w  ArtTile_ArtNem_S1EndPenguin ;  6 Penguin
 +
dc.w  ArtTile_ArtNem_S1EndSeal ;  7 Seal
 +
dc.w  ArtTile_ArtNem_S1EndPig ;  8 Pig
 +
dc.w  ArtTile_ArtNem_S1EndChicken ;  9 Chicken
 +
dc.w  ArtTile_ArtNem_S1EndSquirrel ; 10 Squirrel
 +
</syntaxhighlight>
 +
Now we need to determine the PLC that loads our animals now that our zones now have them, so find:
 +
<syntaxhighlight lang="asm">
 +
;byte_13F62:
 +
Animal_PLCTable: zoneOrderedTable 1,1
 +
zoneTableEntry.b PLCID_EhzAnimals ; $0
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1
 +
zoneTableEntry.b PLCID_EhzAnimals ; $2
 +
zoneTableEntry.b PLCID_EhzAnimals ; $3
 +
zoneTableEntry.b PLCID_MtzAnimals ; $4
 +
zoneTableEntry.b PLCID_MtzAnimals ; $5
 +
zoneTableEntry.b PLCID_WfzAnimals ; $6
 +
zoneTableEntry.b PLCID_HtzAnimals ; $7
 +
zoneTableEntry.b PLCID_HpzAnimals ; $8
 +
zoneTableEntry.b PLCID_HpzAnimals ; $9
 +
zoneTableEntry.b PLCID_OozAnimals ; $A
 +
zoneTableEntry.b PLCID_MczAnimals ; $B
 +
zoneTableEntry.b PLCID_CnzAnimals ; $C
 +
zoneTableEntry.b PLCID_CpzAnimals ; $D
 +
zoneTableEntry.b PLCID_DezAnimals ; $E
 +
zoneTableEntry.b PLCID_ArzAnimals ; $F
 +
zoneTableEntry.b PLCID_SczAnimals ; $10
 +
</syntaxhighlight>
 +
and add these at the bottom:
 +
<syntaxhighlight lang="asm">
 +
zoneTableEntry.b PLCID_EhzAnimals ; $11
 +
zoneTableEntry.b PLCID_EhzAnimals ; $12
 +
zoneTableEntry.b PLCID_EhzAnimals ; $13
 +
zoneTableEntry.b PLCID_EhzAnimals ; $14
 +
zoneTableEntry.b PLCID_EhzAnimals ; $15
 +
zoneTableEntry.b PLCID_EhzAnimals ; $16
 +
zoneTableEntry.b PLCID_EhzAnimals ; $17
 +
zoneTableEntry.b PLCID_EhzAnimals ; $18
 +
zoneTableEntry.b PLCID_EhzAnimals ; $19
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1A
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1B
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1C
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1D
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1E
 +
zoneTableEntry.b PLCID_EhzAnimals ; $1F
 +
zoneTableEntry.b PLCID_EhzAnimals ; $20
 +
</syntaxhighlight>
  
==Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)==
+
==Extending the Level Order==
 +
The game needs to know what order to play the zones in, not just know how big they are and where you start, right? so lets find:
 +
<syntaxhighlight lang="asm">
 +
LevelOrder: zoneOrderedTable 2,2 ; WrdArr_LevelOrder
 +
zoneTableEntry.w  emerald_hill_zone_act_2
 +
zoneTableEntry.w  chemical_plant_zone_act_1 ; 1
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 2
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 3
 +
zoneTableEntry.w  wood_zone_act_2 ; 4
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 5
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 6
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 7
 +
zoneTableEntry.w  metropolis_zone_act_2 ; 8
 +
zoneTableEntry.w  metropolis_zone_act_3 ; 9
 +
zoneTableEntry.w  sky_chase_zone_act_1 ; 10
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 11
 +
zoneTableEntry.w  death_egg_zone_act_1 ; 12
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 13
 +
zoneTableEntry.w  hill_top_zone_act_2 ; 14
 +
zoneTableEntry.w  mystic_cave_zone_act_1 ; 15
 +
zoneTableEntry.w  hidden_palace_zone_act_2 ; 16
 +
zoneTableEntry.w  oil_ocean_zone_act_1 ; 17
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 18
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 19
 +
zoneTableEntry.w  oil_ocean_zone_act_2 ; 20
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 21
 +
zoneTableEntry.w  mystic_cave_zone_act_2 ; 22
 +
zoneTableEntry.w  oil_ocean_zone_act_1 ; 23
 +
zoneTableEntry.w  casino_night_zone_act_2 ; 24
 +
zoneTableEntry.w  hill_top_zone_act_1 ; 25
 +
zoneTableEntry.w  chemical_plant_zone_act_2 ; 26
 +
zoneTableEntry.w  aquatic_ruin_zone_act_1 ; 27
 +
zoneTableEntry.w  $FFFF ; 28
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 29
 +
zoneTableEntry.w  aquatic_ruin_zone_act_2 ; 30
 +
zoneTableEntry.w  casino_night_zone_act_1 ; 31
 +
zoneTableEntry.w  wing_fortress_zone_act_1 ; 32
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 33
 +
    zoneTableEnd
  
==Extend Level Size Array==
+
;word_1433C:
 +
LevelOrder_2P: zoneOrderedTable 2,2 ; WrdArr_LevelOrder_2P
 +
zoneTableEntry.w  emerald_hill_zone_act_2
 +
zoneTableEntry.w  casino_night_zone_act_1 ; 1
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 2
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 3
 +
zoneTableEntry.w  wood_zone_act_2 ; 4
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 5
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 6
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 7
 +
zoneTableEntry.w  metropolis_zone_act_2 ; 8
 +
zoneTableEntry.w  metropolis_zone_act_3 ; 9
 +
zoneTableEntry.w  sky_chase_zone_act_1 ; 10
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 11
 +
zoneTableEntry.w  death_egg_zone_act_1 ; 12
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 13
 +
zoneTableEntry.w  hill_top_zone_act_2 ; 14
 +
zoneTableEntry.w  mystic_cave_zone_act_1 ; 15
 +
zoneTableEntry.w  hidden_palace_zone_act_2 ; 16
 +
zoneTableEntry.w  oil_ocean_zone_act_1 ; 17
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 18
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 19
 +
zoneTableEntry.w  oil_ocean_zone_act_2 ; 20
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 21
 +
zoneTableEntry.w  mystic_cave_zone_act_2 ; 22
 +
zoneTableEntry.w  $FFFF ; 23
 +
zoneTableEntry.w  casino_night_zone_act_2 ; 24
 +
zoneTableEntry.w  mystic_cave_zone_act_1 ; 25
 +
zoneTableEntry.w  chemical_plant_zone_act_2 ; 26
 +
zoneTableEntry.w  aquatic_ruin_zone_act_1 ; 27
 +
zoneTableEntry.w  $FFFF ; 28
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 29
 +
zoneTableEntry.w  aquatic_ruin_zone_act_2 ; 30
 +
zoneTableEntry.w  casino_night_zone_act_1 ; 31
 +
zoneTableEntry.w  wing_fortress_zone_act_1 ; 32
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 33
 +
    zoneTableEnd
 +
</syntaxhighlight>
 +
and add change them to read:
 +
<syntaxhighlight lang="asm">
 +
LevelOrder: zoneOrderedTable 2,2 ; WrdArr_LevelOrder
 +
zoneTableEntry.w  emerald_hill_zone_act_2
 +
zoneTableEntry.w  chemical_plant_zone_act_1 ; 1
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 2
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 3
 +
zoneTableEntry.w  wood_zone_act_2 ; 4
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 5
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 6
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 7
 +
zoneTableEntry.w  metropolis_zone_act_2 ; 8
 +
zoneTableEntry.w  metropolis_zone_act_3 ; 9
 +
zoneTableEntry.w  sky_chase_zone_act_1 ; 10
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 11
 +
zoneTableEntry.w  death_egg_zone_act_1 ; 12
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 13
 +
zoneTableEntry.w  hill_top_zone_act_2 ; 14
 +
zoneTableEntry.w  mystic_cave_zone_act_1 ; 15
 +
zoneTableEntry.w  hidden_palace_zone_act_2 ; 16
 +
zoneTableEntry.w  oil_ocean_zone_act_1 ; 17
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 18
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 19
 +
zoneTableEntry.w  oil_ocean_zone_act_2 ; 20
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 21
 +
zoneTableEntry.w  mystic_cave_zone_act_2 ; 22
 +
zoneTableEntry.w  oil_ocean_zone_act_1 ; 23
 +
zoneTableEntry.w  casino_night_zone_act_2 ; 24
 +
zoneTableEntry.w  hill_top_zone_act_1 ; 25
 +
zoneTableEntry.w  chemical_plant_zone_act_2 ; 26
 +
zoneTableEntry.w  aquatic_ruin_zone_act_1 ; 27
 +
zoneTableEntry.w  $FFFF ; 28
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 29
 +
zoneTableEntry.w  aquatic_ruin_zone_act_2 ; 30
 +
zoneTableEntry.w  casino_night_zone_act_1 ; 31
 +
zoneTableEntry.w  wing_fortress_zone_act_1 ; 32
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 33
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
    zoneTableEnd
  
==Extending the Start Location Index==
+
;word_1433C:
 +
LevelOrder_2P: zoneOrderedTable 2,2 ; WrdArr_LevelOrder_2P
 +
zoneTableEntry.w  emerald_hill_zone_act_2
 +
zoneTableEntry.w  casino_night_zone_act_1 ; 1
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 2
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 3
 +
zoneTableEntry.w  wood_zone_act_2 ; 4
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 5
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 6
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 7
 +
zoneTableEntry.w  metropolis_zone_act_2 ; 8
 +
zoneTableEntry.w  metropolis_zone_act_3 ; 9
 +
zoneTableEntry.w  sky_chase_zone_act_1 ; 10
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 11
 +
zoneTableEntry.w  death_egg_zone_act_1 ; 12
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 13
 +
zoneTableEntry.w  hill_top_zone_act_2 ; 14
 +
zoneTableEntry.w  mystic_cave_zone_act_1 ; 15
 +
zoneTableEntry.w  hidden_palace_zone_act_2 ; 16
 +
zoneTableEntry.w  oil_ocean_zone_act_1 ; 17
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 18
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 19
 +
zoneTableEntry.w  oil_ocean_zone_act_2 ; 20
 +
zoneTableEntry.w  metropolis_zone_act_1 ; 21
 +
zoneTableEntry.w  mystic_cave_zone_act_2 ; 22
 +
zoneTableEntry.w  $FFFF ; 23
 +
zoneTableEntry.w  casino_night_zone_act_2 ; 24
 +
zoneTableEntry.w  mystic_cave_zone_act_1 ; 25
 +
zoneTableEntry.w  chemical_plant_zone_act_2 ; 26
 +
zoneTableEntry.w  aquatic_ruin_zone_act_1 ; 27
 +
zoneTableEntry.w  $FFFF ; 28
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 29
 +
zoneTableEntry.w  aquatic_ruin_zone_act_2 ; 30
 +
zoneTableEntry.w  casino_night_zone_act_1 ; 31
 +
zoneTableEntry.w  wing_fortress_zone_act_1 ; 32
 +
zoneTableEntry.w  emerald_hill_zone_act_1 ; 33
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
zoneTableEntry.w  emerald_hill_zone_act_1
 +
    zoneTableEnd
 +
</syntaxhighlight>
  
 
==Notes==
 
==Notes==
 +
All new .bin files need to be created in order for the ROM to build. If something doesn't load correctly (besides new animated patterns that you have just made by youself, only major things like ROM crashes) please don't hesitate to ask for help and/or get it working and edit this article. (Like the title cards being broken for levels past $10)
 +
 +
{{S2Howtos}}
 +
|Extend the level index past $10 in Sonic 2]]

Latest revision as of 12:05, 7 April 2021

Initial Notes and Revisions Done

(Original guide by kramlat, current revision that fixes major bugs and extends properly by GARY 'M 9)

(Updated again by kramlat, adding back custom titlecard mappings howto, due to guide being unfinished, thus finally fixing the "ZONE ZONE" bug. Replace all the empty levels with your new ones.)

(Updated by silent.creature, fixing some code within the procedures)

(Updated by kramlat, moved to the current GIT disassembly)

WARNING: Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you port the Sonic 1 sound driver or the Sonic 2 clone driver V2 first before proceeding. A lot of major data shifting will occur in this tutorial and it will make the rom size a lot bigger than it was before. This will break the Sonic 2 or even Sonic 2 beta sound driver; thus, you definitely want Sonic 1 sound driver due to the fact that it can take the shifting and still work properly. However, if you are using Xenowhirl's 2007 Sonic 2 disassembly, it is not necessary to port any other sound driver, since it uses disassembled Z80 code which automatically references the correct locations and can thus work properly even if there are massive location shifts.

EDIT: If you are using the svn/hg/git version, this should not be a problem because those have the sound driver disassembled and macros to keep the driver properly aligned. For this reason, we will now be using that instead of the xenowhirl one we used in the past.

You probably noticed that all the indexes in the game stop at $10 and when you try to extend them, by extending the Main Level Load Blocks index, you get weird glitches and crashes. It means you haven't extended all the indexes that need to be extended.

We will initially extend the indexes for $20 zones, but we show that this can be extended to any number between $11 and $7F. (I didn't tried $80 and more because of the ROM cartridge size, but I think it is possible.) You will see frequently the variable-label NumberOfZones, just to explain this. Please define it or substitute it to its desired value.

Extending the Titlecard index

Extending Main Configuration indexes

Updating TitleCard Data

We need to allocate more card indexes for our new zone. To do this, we find:

; word_13CD4:
Obj34_TitleCardData:
	titlecardobjdata  8,   0, $80, $1B, $240, $120, $B8	; zone name
	titlecardobjdata $A, $11, $40, $1C,  $28, $148, $D0	; "ZONE"
	titlecardobjdata $C, $12, $18, $1C,  $68, $188, $D0	; act number
	titlecardobjdata  2,   0,   0,   0,    0,    0,   0	; blue background
	titlecardobjdata  4, $15, $48,   8, $2A8, $168,$120	; bottom yellow part
	titlecardobjdata  6, $16,   8, $15,  $80,  $F0, $F0	; left red part
Obj34_TitleCardData_End:

and change this to:

; word_13CD4:
Obj34_TitleCardData:
	titlecardobjdata  8,   0,	      $80, $1B, $240, $120, $B8	; zone name
	titlecardobjdata $A, NumberOfZones+1, $40, $1C,  $28, $148, $D0	; "ZONE"
	titlecardobjdata $C, NumberOfZones+2, $18, $1C,  $68, $188, $D0	; act number
	titlecardobjdata  2,   0,		0,   0,    0,    0,   0	; blue background
	titlecardobjdata  4, NumberOfZones+5, $48,   8, $2A8, $168,$120	; bottom yellow part
	titlecardobjdata  6, NumberOfZones+6,	8, $15,  $80,  $F0, $F0	; left red part
Obj34_TitleCardData_End:

Where NumberOfZones is the total number of zones you want in the game. As we said before, we will work with $20 zones. The best place for it, is in s2.constants.asm

Fixing Act Number Handler

Now, find:

Obj34_ActNumber:	; the act number, coming in
	jsr	Obj34_Wait(pc)
	move.b	(Current_Zone).w,d0	; get the current zone
	cmpi.b	#sky_chase_zone,d0	; is it Sky Chase?
	beq.s	BranchTo9_DeleteObject	; if yes, branch
	cmpi.b	#wing_fortress_zone,d0	; is it Wing Fortress?
	beq.s	BranchTo9_DeleteObject	; if yes, branch
	cmpi.b	#death_egg_zone,d0	; is it Death Egg Zone?
	beq.s	BranchTo9_DeleteObject	; if yes, branch
	move.b	(Current_Act).w,d1	; get the current act
	addi.b	#$12,d1			; add $12 to it (this is the index of the "1" frame in the mappings)
	cmpi.b	#metropolis_zone_2,d0	; are we in Metropolis Zone Act 3?
	bne.s	+			; if not, branch
	moveq	#$14,d1			; use the "3" frame instead

and change it to:

Obj34_ActNumber:	; the act number, coming in
	jsr	Obj34_Wait(pc)
	move.b	(Current_Zone).w,d0	; get the current zone
	cmpi.b	#sky_chase_zone,d0	; is it Sky Chase?
	beq.s	BranchTo9_DeleteObject	; if yes, branch
	cmpi.b	#wing_fortress_zone,d0	; is it Wing Fortress?
	beq.s	BranchTo9_DeleteObject	; if yes, branch
	cmpi.b	#death_egg_zone,d0	; is it Death Egg Zone?
	beq.s	BranchTo9_DeleteObject	; if yes, branch
	move.b	(Current_Act).w,d1	; get the current act
	addi.b	#NumberOfZones+2,d1	; Act number mappings (Act 1)
	cmpi.b	#metropolis_zone_2,d0	; are we in Metropolis Zone Act 3?
	bne.s	+			; if not, branch
	moveq	#NumberOfZones+4,d1	; Act number mappings (Act 3).  Used for drawing MTZ (0x05) titlecard only

Now we have the offset data of where to load the mappings for the titlecards shifted so that we can now start working on updating the mappings and not have that strange "ZONE ZONE" bug that GARY 'M 9 left behind and I intended to correct.

Adding new Art Load Cue Data to the TitleCards for New Zones

Next, another thing I wanted to see others correct. this time, I will explain why I changed byte_15820 into a 16-bit relative offset index as opposed to it staying as a byte-by-byte relative offset that does not point correctly, and to appropriately handle the string data in word_15832, as well as allow that string data to be properly represented. This time I will make it even clearer too.

Next off, in this part of the hack the first thing before converting to a better manageable datatype, we want to replace the byte_15820 handler with a better one.

Look for:

; loc_157D2:
LoadTitleCard:
	bsr.s	LoadTitleCard0
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	move.b	Off_TitleCardLetters(pc,d0.w),d0
	lea	TitleCardLetters(pc),a0
	lea	(a0,d0.w),a0
	move.l	#vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0

and we want to replace it with:

; loc_157D2:
LoadTitleCard:
	bsr.s	LoadTitleCard0
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	add.w	d0,d0
	move.w	Off_TitleCardLetters(pc,d0.w),d0
	lea	Off_TitleCardLetters(pc,d0.w),a0
	move.l	#vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0

That takes care of the loader, now time to update the string data.

find:

; byte_15820:
Off_TitleCardLetters:
	dc.b TitleCardLetters_EHZ - TitleCardLetters	; 0
	dc.b TitleCardLetters_EHZ - TitleCardLetters	; 1
	dc.b TitleCardLetters_EHZ - TitleCardLetters	; 2
	dc.b TitleCardLetters_EHZ - TitleCardLetters	; 3
	dc.b TitleCardLetters_MTZ - TitleCardLetters	; 4
	dc.b TitleCardLetters_MTZ - TitleCardLetters	; 5
	dc.b TitleCardLetters_WFZ - TitleCardLetters	; 6
	dc.b TitleCardLetters_HTZ - TitleCardLetters	; 7
	dc.b TitleCardLetters_HPZ - TitleCardLetters	; 8
	dc.b TitleCardLetters_EHZ - TitleCardLetters	; 9
	dc.b TitleCardLetters_OOZ - TitleCardLetters	; A
	dc.b TitleCardLetters_MCZ - TitleCardLetters	; B
	dc.b TitleCardLetters_CNZ - TitleCardLetters	; C
	dc.b TitleCardLetters_CPZ - TitleCardLetters	; D
	dc.b TitleCardLetters_DEZ - TitleCardLetters	; E
	dc.b TitleCardLetters_ARZ - TitleCardLetters	; F
	dc.b TitleCardLetters_SCZ - TitleCardLetters	; 10
	even

 ; temporarily remap characters to title card letter format
 ; Characters are encoded as Aa, Bb, Cc, etc. through a macro
 charset 'A',0	; can't have an embedded 0 in a string
 charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4"
 charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4"
 charset '.',"\x5A"

; Defines which letters load for the continue screen
; Each letter occurs only once, and  the letters ENOZ (i.e. ZONE) aren't loaded here
; However, this is hidden by the titleLetters macro, and normal titles can be used
; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here)

; word_15832:
TitleCardLetters:

TitleCardLetters_EHZ:
	titleLetters	"EMERALD HILL"
TitleCardLetters_MTZ:
	titleLetters	"METROPOLIS"
TitleCardLetters_HTZ:
	titleLetters	"HILL TOP"
TitleCardLetters_HPZ:
	titleLetters	"HIDDEN PALACE"
TitleCardLetters_OOZ:
	titleLetters	"OIL OCEAN"
TitleCardLetters_MCZ:
	titleLetters	"MYSTIC CAVE"
TitleCardLetters_CNZ:
	titleLetters	"CASINO NIGHT"
TitleCardLetters_CPZ:
	titleLetters	"CHEMICAL PLANT"
TitleCardLetters_ARZ:
	titleLetters	"AQUATIC RUIN"
TitleCardLetters_SCZ:
	titleLetters	"SKY CHASE"
TitleCardLetters_WFZ:
	titleLetters	"WING FORTRESS"
TitleCardLetters_DEZ:
	titleLetters	"DEATH EGG"

 charset ; revert character set

and replace it with:

;byte_15820
Off_TitleCardLetters:	offsetTable
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 00
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 01
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 02
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 03
	offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 04
	offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 05
	offsetTableEntry.w TitleCardLetters_WFZ ; WFZ Titlecard 06
	offsetTableEntry.w TitleCardLetters_HTZ ; HTZ Titlecard 07
	offsetTableEntry.w TitleCardLetters_HPZ ; HPZ Titlecard 08
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 09
	offsetTableEntry.w TitleCardLetters_OOZ ; OOZ Titlecard 0A
	offsetTableEntry.w TitleCardLetters_MCZ ; MCZ Titlecard 0B
	offsetTableEntry.w TitleCardLetters_CNZ ; CNZ Titlecard 0C
	offsetTableEntry.w TitleCardLetters_CPZ ; CPZ Titlecard 0D
	offsetTableEntry.w TitleCardLetters_DEZ ; DEZ Titlecard 0E
	offsetTableEntry.w TitleCardLetters_ARZ ; ARZ Titlecard 0F
	offsetTableEntry.w TitleCardLetters_SCZ ; SCZ Titlecard 10
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 11
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 12
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 13
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 14
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 15
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 16
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 17
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 18
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 19
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1A
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1B
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1C
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1D
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1E
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1F
	offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 20

 ; temporarily remap characters to title card letter format
 ; Characters are encoded as Aa, Bb, Cc, etc. through a macro
 charset 'A',0	; can't have an embedded 0 in a string
 charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4"
 charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4"
 charset '.',"\x5A"

; Defines which letters load for the continue screen
; Each letter occurs only once, and  the letters ENOZ (i.e. ZONE) aren't loaded here
; However, this is hidden by the titleLetters macro, and normal titles can be used
; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here)

; word_15832:
TitleCardLetters:

TitleCardLetters_EHZ:
	titleLetters	"EMERALD HILL"
TitleCardLetters_MTZ:
	titleLetters	"METROPOLIS"
TitleCardLetters_HTZ:
	titleLetters	"HILL TOP"
TitleCardLetters_HPZ:
	titleLetters	"HIDDEN PALACE"
TitleCardLetters_OOZ:
	titleLetters	"OIL OCEAN"
TitleCardLetters_MCZ:
	titleLetters	"MYSTIC CAVE"
TitleCardLetters_CNZ:
	titleLetters	"CASINO NIGHT"
TitleCardLetters_CPZ:
	titleLetters	"CHEMICAL PLANT"
TitleCardLetters_ARZ:
	titleLetters	"AQUATIC RUIN"
TitleCardLetters_SCZ:
	titleLetters	"SKY CHASE"
TitleCardLetters_WFZ:
	titleLetters	"WING FORTRESS"
TitleCardLetters_DEZ:
	titleLetters	"DEATH EGG"

 charset ; revert character set

Point Fix: This data manager, as implemented, doesn't work with a byte-string data. If you tried to use that byte-string data, you've noticed weird names. For example, Emerald Hill became Emepqrs T?rr.

This adds the basic card configuration to our new levels. You can freely edit the entries of this table to suit your needs.

Extending TitleCard Sprite Mappings

Now, find:

; -------------------------------------------------------------------------------
; sprite mappings
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA:	offsetTable
	offsetTableEntry.w word_147E8
	offsetTableEntry.w word_147E8
	offsetTableEntry.w word_147E8
	offsetTableEntry.w word_147E8
	offsetTableEntry.w word_14842
	offsetTableEntry.w word_14842
	offsetTableEntry.w word_14B24
	offsetTableEntry.w word_14894
	offsetTableEntry.w word_148CE
	offsetTableEntry.w word_147E8
	offsetTableEntry.w word_14930
	offsetTableEntry.w word_14972
	offsetTableEntry.w word_149C4
	offsetTableEntry.w word_14A1E
	offsetTableEntry.w word_14B86
	offsetTableEntry.w word_14A88
	offsetTableEntry.w word_14AE2
	offsetTableEntry.w word_14BC8
	offsetTableEntry.w word_14BEA
	offsetTableEntry.w word_14BF4
	offsetTableEntry.w word_14BFE
	offsetTableEntry.w word_14C08
	offsetTableEntry.w word_14C32
word_147E8:	dc.w $B
	dc.w 5,	$8580, $82C0, $FFC3
	dc.w 9,	$85DE, $82EF, $FFD0
	dc.w 5,	$8580, $82C0, $FFE8
	dc.w 5,	$85E4, $82F2, $FFF8
	dc.w 5,	$85E8, $82F4, 8
	dc.w 5,	$85EC, $82F6, $18
	dc.w 5,	$85F0, $82F8, $28
	dc.w 5,	$85F4, $82FA, $48
	dc.w 1,	$85F8, $82FC, $58
	dc.w 5,	$85EC, $82F6, $60
	dc.w 5,	$85EC, $82F6, $70
word_14842:	dc.w $A
	dc.w 9,	$85DE, $82EF, $FFE0
	dc.w 5,	$8580, $82C0, $FFF8
	dc.w 5,	$85E4, $82F2, 8
	dc.w 5,	$85E8, $82F4, $18
	dc.w 5,	$8588, $82C4, $28
	dc.w 5,	$85EC, $82F6, $38
	dc.w 5,	$8588, $82C4, $48
	dc.w 5,	$85F0, $82F8, $58
	dc.w 1,	$85F4, $82FA, $68
	dc.w 5,	$85F6, $82FB, $70
word_14894:	dc.w 7
	dc.w 5,	$85DE, $82EF, 8
	dc.w 1,	$85E2, $82F1, $18
	dc.w 5,	$85E4, $82F2, $20
	dc.w 5,	$85E4, $82F2, $30
	dc.w 5,	$85E8, $82F4, $51
	dc.w 5,	$8588, $82C4, $60
	dc.w 5,	$85EC, $82F6, $70
word_148CE:	dc.w $C
	dc.w 5,	$85DE, $82EF, $FFB8
	dc.w 1,	$85E2, $82F1, $FFC8
	dc.w 5,	$85E4, $82F2, $FFD0
	dc.w 5,	$85E4, $82F2, $FFE0
	dc.w 5,	$8580, $82C0, $FFF0
	dc.w 5,	$8584, $82C2, 0
	dc.w 5,	$85E8, $82F4, $20
	dc.w 5,	$85EC, $82F6, $30
	dc.w 5,	$85F0, $82F8, $40
	dc.w 5,	$85EC, $82F6, $50
	dc.w 5,	$85F4, $82FA, $60
	dc.w 5,	$8580, $82C0, $70
word_14930:	dc.w 8
	dc.w 5,	$8588, $82C4, $FFFB
	dc.w 1,	$85DE, $82EF, $B
	dc.w 5,	$85E0, $82F0, $13
	dc.w 5,	$8588, $82C4, $33
	dc.w 5,	$85E4, $82F2, $43
	dc.w 5,	$8580, $82C0, $53
	dc.w 5,	$85E8, $82F4, $60
	dc.w 5,	$8584, $82C2, $70
word_14972:	dc.w $A
	dc.w 9,	$85DE, $82EF, $FFD0
	dc.w 5,	$85E4, $82F2, $FFE8
	dc.w 5,	$85E8, $82F4, $FFF8
	dc.w 5,	$85EC, $82F6, 8
	dc.w 1,	$85F0, $82F8, $18
	dc.w 5,	$85F2, $82F9, $20
	dc.w 5,	$85F2, $82F9, $41
	dc.w 5,	$85F6, $82FB, $50
	dc.w 5,	$85FA, $82FD, $60
	dc.w 5,	$8580, $82C0, $70
word_149C4:	dc.w $B
	dc.w 5,	$85DE, $82EF, $FFD1
	dc.w 5,	$85E2, $82F1, $FFE0
	dc.w 5,	$85E6, $82F3, $FFF0
	dc.w 1,	$85EA, $82F5, 0
	dc.w 5,	$8584, $82C2, 8
	dc.w 5,	$8588, $82C4, $18
	dc.w 5,	$8584, $82C2, $38
	dc.w 1,	$85EA, $82F5, $48
	dc.w 5,	$85EC, $82F6, $50
	dc.w 5,	$85F0, $82F8, $60
	dc.w 5,	$85F4, $82FA, $70
word_14A1E:	dc.w $D
	dc.w 5,	$85DE, $82EF, $FFA4
	dc.w 5,	$85E2, $82F1, $FFB4
	dc.w 5,	$8580, $82C0, $FFC4
	dc.w 9,	$85E6, $82F3, $FFD1
	dc.w 1,	$85EC, $82F6, $FFE9
	dc.w 5,	$85DE, $82EF, $FFF1
	dc.w 5,	$85EE, $82F7, 0
	dc.w 5,	$85F2, $82F9, $10
	dc.w 5,	$85F6, $82FB, $31
	dc.w 5,	$85F2, $82F9, $41
	dc.w 5,	$85EE, $82F7, $50
	dc.w 5,	$8584, $82C2, $60
	dc.w 5,	$85FA, $82FD, $70
word_14A88:	dc.w $B
	dc.w 5,	$85DE, $82EF, $FFD2
	dc.w 5,	$85E2, $82F1, $FFE2
	dc.w 5,	$85E6, $82F3, $FFF2
	dc.w 5,	$85DE, $82EF, 0
	dc.w 5,	$85EA, $82F5, $10
	dc.w 1,	$85EE, $82F7, $20
	dc.w 5,	$85F0, $82F8, $28
	dc.w 5,	$85F4, $82FA, $48
	dc.w 5,	$85E6, $82F3, $58
	dc.w 1,	$85EE, $82F7, $68
	dc.w 5,	$8584, $82C2, $70
word_14AE2:	dc.w 8
	dc.w 5,	$85DE, $82EF, $FFF0
	dc.w 5,	$85E2, $82F1, 0
	dc.w 5,	$85E6, $82F3, $10
	dc.w 5,	$85EA, $82F5, $30
	dc.w 5,	$85EE, $82F7, $40
	dc.w 5,	$85F2, $82F9, $50
	dc.w 5,	$85DE, $82EF, $60
	dc.w 5,	$8580, $82C0, $70
word_14B24:	dc.w $C
	dc.w 9,	$85DE, $82EF, $FFB1
	dc.w 1,	$85E4, $82F2, $FFC8
	dc.w 5,	$8584, $82C2, $FFD0
	dc.w 5,	$85E6, $82F3, $FFE0
	dc.w 5,	$85EA, $82F5, 1
	dc.w 5,	$8588, $82C4, $10
	dc.w 5,	$85EE, $82F7, $20
	dc.w 5,	$85F2, $82F9, $30
	dc.w 5,	$85EE, $82F7, $40
	dc.w 5,	$8580, $82C0, $50
	dc.w 5,	$85F6, $82FB, $5F
	dc.w 5,	$85F6, $82FB, $6F
word_14B86:	dc.w 8
	dc.w 5,	$85DE, $82EF, $FFF2
	dc.w 5,	$8580, $82C0, 2
	dc.w 5,	$85E2, $82F1, $10
	dc.w 5,	$85E6, $82F3, $20
	dc.w 5,	$85EA, $82F5, $30
	dc.w 5,	$8580, $82C0, $51
	dc.w 5,	$85EE, $82F7, $60
	dc.w 5,	$85EE, $82F7, $70
word_14BC8:	dc.w 4
	dc.w 5,	$858C, $82C6, 1
	dc.w 5,	$8588, $82C4, $10
	dc.w 5,	$8584, $82C2, $20
	dc.w 5,	$8580, $82C0, $30
word_14BEA:	dc.w 1
	dc.w 7,	$A590, $A2C8, 0
word_14BF4:	dc.w 1
	dc.w $B, $A598,	$A2CC, 0
word_14BFE:	dc.w 1
	dc.w $B, $A5A4,	$A2D2, 0
word_14C08:	dc.w 5
	dc.w $D, $85B0,	$82D8, $FFB8
	dc.w $D, $85B8,	$82DC, $FFD8
	dc.w $D, $85C0,	$82E0, $FFF8
	dc.w $D, $85C8,	$82E4, $18
	dc.w 5,	$85D0, $82E8, $38
word_14C32:	dc.w 7
	dc.w $9003, $85D4, $82EA, 0
	dc.w $B003, $85D4, $82EA, 0
	dc.w $D003, $85D4, $82EA, 0
	dc.w $F003, $85D4, $82EA, 0
	dc.w $1003, $85D4, $82EA, 0
	dc.w $3003, $85D4, $82EA, 0
	dc.w $5003, $85D4, $82EA, 0

If you check the routine of Obj34, you will see this is called from anywhere it is in the ROM. Thus, we can shift this data to another place we can edit it without any code interference. I can suggest you two locations for editing: the first is the end of the disassembly. The second is the end of the header. We will use here the end of disassembly. We will replace it with:

word_14BC8: ;keep this line to prevent errors
	dc.w 4 ; number of letters
	dc.w 5, $858C, $82C6,     0 ;Z
	dc.w 5, $8588, $82C4,   $10 ;O
	dc.w 5, $8584, $82C2,   $20 ;N
	dc.w 5, $8580, $82C0,   $30 ;E
word_14BEA: ;keep this line to prevent errors
	dc.w $1 ; number of digits
	dc.w 7, $A590, $A2C8,     0 ;1
word_14BF4: ;keep this line to prevent errors
	dc.w $1 ; number of digits
	dc.w $B, $A598, $A2CC,    0 ;2
word_14BFE: ;keep this line to prevent errors
	dc.w $1 ; number of digits
	dc.w $B, $A5A4, $A2D2,    0 ;3

for compatibility woth other mappings in the area and put this at the end of your disassembly:

; -------------------------------------------------------------------------------
; sprite mappings
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA:	offsetTable
	offsetTableEntry.w Titlecard_EHZ ; EHZ 00 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 01 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 02 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 03 
	offsetTableEntry.w Titlecard_MTZ ; MTZ 04
	offsetTableEntry.w Titlecard_MTZ ; MTZ 05
	offsetTableEntry.w Titlecard_WFZ ; WFZ 06
	offsetTableEntry.w Titlecard_HTZ ; HTZ 07
	offsetTableEntry.w Titlecard_HPZ ; HPZ 08
	offsetTableEntry.w Titlecard_EHZ ; EHZ 09 
	offsetTableEntry.w Titlecard_OOZ ; OOZ 0A
	offsetTableEntry.w Titlecard_MCZ ; MCZ 0B
	offsetTableEntry.w Titlecard_CNZ ; CNZ 0C
	offsetTableEntry.w Titlecard_CPZ ; CPZ 0D
	offsetTableEntry.w Titlecard_DEZ ; DEZ 0E
	offsetTableEntry.w Titlecard_ARZ ; ARZ 0F
	offsetTableEntry.w Titlecard_SCZ ; SCZ 10
	offsetTableEntry.w Titlecard_EHZ ; EHZ 11 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 12 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 13 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 14 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 15 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 16 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 17 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 18 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 19 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 1A 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 1B 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 1C 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 1D 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 1E 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 1F 
	offsetTableEntry.w Titlecard_EHZ ; EHZ 20 
	offsetTableEntry.w T_ZONE	 ; "ZONE"
	offsetTableEntry.w T_ACT1	 ; "1"
	offsetTableEntry.w T_ACT2	 ; "2"
	offsetTableEntry.w T_ACT3	 ; "3"
	offsetTableEntry.w T_STH	 ; "SONIC THE HEDGEHOG"
	offsetTableEntry.w T_STRIPEDGE	 ; ">"

TitleCard_EHZ:
	dc.w 11 ; number of letters
	dc.w 5,	$8580, $82C0, $FFC3 ;E
	dc.w 9,	$85DE, $82EF, $FFD0 ;M
	dc.w 5, $8580, $82C0, $FFE8 ;E
	dc.w 5, $85E4, $82F2, $FFF8 ;R
	dc.w 5, $85E8, $82F4,     8 ;A
	dc.w 5, $85EC, $82F6,   $18 ;L
	dc.w 5, $85F0, $82F8,   $28 ;D
 
	dc.w 5, $85F4, $82FA,   $48 ;H
	dc.w 1, $85F8, $82F2,   $58 ;I
	dc.w 5, $85EC, $82F6,   $60 ;L
	dc.w 5, $85EC, $82F6,   $70 ;L
 
 
TitleCard_MTZ:
	dc.w 10 ; number of letters
	dc.w 9, $85DE, $82EF, $FFE0 ;M
	dc.w 5, $8580, $82C0, $FFF8 ;E
	dc.w 5, $85E4, $82F2,     8 ;T
	dc.w 5, $85E8, $82F4,   $18 ;R
	dc.w 5, $8588, $82C4,   $28 ;O
	dc.w 5, $85EC, $82F6,   $38 ;P
	dc.w 5, $8588, $82C4,   $48 ;O
	dc.w 5, $85F0, $82F8,   $58 ;L
	dc.w 1, $85F4, $82FA,   $68 ;I
	dc.w 5, $85F6, $82FB,   $70 ;S
 
TitleCard_WFZ:
	dc.w 12 ; number of letters
	dc.w 9, $85DE, $82EF, $FFB0 ;W
	dc.w 1, $85E4, $82F2, $FFC8 ;I
	dc.w 5, $8584, $82C2, $FFD0 ;N
	dc.w 5, $85E6, $82F3, $FFE0 ;G
 
	dc.w 5, $85EA, $82F5,     0 ;F
	dc.w 5, $8588, $82C4,   $10 ;O
	dc.w 5, $85EE, $82F7,   $20 ;R
	dc.w 5, $85F2, $82F9,   $30 ;T
	dc.w 5, $85EE, $82F7,   $40 ;R
	dc.w 5, $8580, $82C0,   $50 ;E
	dc.w 5, $85F6, $82FB,   $60 ;S
	dc.w 5, $85F6, $82FB,   $70 ;S
 
TitleCard_HTZ:
	dc.w 7 ; number of letters
	dc.w 5, $85DE, $82EF,     8 ;H
	dc.w 1, $85E2, $82F1,   $18 ;I
	dc.w 5, $85E4, $82F2,   $20 ;L
	dc.w 5, $85E4, $82F2,   $30 ;L
 
	dc.w 5, $85E8, $82F4,   $50 ;T
	dc.w 5, $8588, $82C4,   $60 ;O
	dc.w 5, $85EC, $82F6,   $70 ;P
 
TitleCard_HPZ:
	dc.w 12 ; number of letters
	dc.w 5, $85DE, $82EF, $FFB8 ;H
	dc.w 1, $85E2, $82F1, $FFC8 ;I
	dc.w 5, $85E4, $82F2, $FFD0 ;D
	dc.w 5, $85E4, $82F2, $FFE0 ;D
	dc.w 5, $8580, $82C0, $FFF0 ;E
	dc.w 5, $8584, $82C4,     0 ;N
 
	dc.w 5, $85E8, $82F4,   $20 ;P
	dc.w 5, $85EC, $82F6,   $30 ;A
	dc.w 5, $85F0, $82F8,   $40 ;L
	dc.w 5, $85EC, $82F6,   $50 ;A
	dc.w 5, $85F4, $82FA,   $60 ;C
	dc.w 5, $8580, $82C0,   $70 ;E
 
TitleCard_OOZ:
	dc.w 8 ; number of letters
	dc.w 5, $8588, $82C4, $FFF8 ;O
	dc.w 1, $85DE, $82EF,     8 ;I
	dc.w 5, $85E0, $82F0,   $10 ;L
 
	dc.w 5, $8588, $82C4,   $30 ;O
	dc.w 5, $85E4, $82F2,   $40 ;C
	dc.w 5, $8580, $82C0,   $50 ;E
	dc.w 5, $85E8, $82F4,   $60 ;A
	dc.w 5, $8584, $82C2,   $70 ;N
 
TitleCard_MCZ:
	dc.w 10 ; number of letters
	dc.w 9, $85DE, $82EF, $FFD0 ;M
	dc.w 5, $85E4, $82F2, $FFE8 ;Y
	dc.w 5, $85E8, $82F4, $FFF8 ;S
	dc.w 5, $85EC, $82F6,     8 ;T
	dc.w 1, $85F0, $82F8,   $18 ;I
	dc.w 5, $85F2, $82F9,   $20 ;C
 
	dc.w 5, $85F2, $82F9,   $40 ;C
	dc.w 5, $85F6, $82FB,   $50 ;A
	dc.w 5, $85FA, $82FD,   $60 ;V
	dc.w 5, $8580, $82C0,   $70 ;E
 
TitleCard_CNZ:
	dc.w 11 ; number of letters
	dc.w 5, $85DE, $82EF, $FFD0 ;C
	dc.w 5, $85E2, $82F1, $FFE0 ;A
	dc.w 5, $85E6, $82F3, $FFF0 ;S
	dc.w 1, $85EA, $82F5,     0 ;I
	dc.w 5, $8584, $82C2,     8 ;N
	dc.w 5, $8588, $82C4,   $18 ;O
 
	dc.w 5, $8584, $82C2,   $38 ;N
	dc.w 1, $85EA, $82F5,   $48 ;I
	dc.w 5, $85EC, $82F6,   $50 ;G
	dc.w 5, $85F0, $82F8,   $60 ;H
	dc.w 5, $85F4, $82FA,   $70 ;T
 
TitleCard_CPZ:
	dc.w 13 ; number of letters
	dc.w 5, $85DE, $82EF, $FFA0 ;C
	dc.w 5, $85E2, $82F1, $FFB0 ;H
	dc.w 5, $8580, $82C0, $FFC0 ;E
	dc.w 9, $85E6, $82F3, $FFD0 ;M
	dc.w 1, $85EC, $82F6, $FFE8 ;I
	dc.w 5, $85DE, $82EF, $FFF0 ;C
	dc.w 5, $85EE, $82F7,     0 ;A
	dc.w 5, $85F2, $82F9,   $10 ;L
 
	dc.w 5, $85F6, $82FB,   $30 ;P
	dc.w 5, $85F2, $82F9,   $40 ;L
	dc.w 5, $85EE, $82F7,   $50 ;A
	dc.w 5, $8584, $82C2,   $60 ;N
	dc.w 5, $85FA, $82FD,   $70 ;T
 
TitleCard_DEZ:
	dc.w 8 ; number of letters
	dc.w 5, $85DE, $82EF, $FFF0 ;D
	dc.w 5, $8580, $82C0,     0 ;E
	dc.w 5, $85E2, $82F1,   $10 ;A
	dc.w 5, $85E6, $82F3,   $20 ;T
	dc.w 5, $85EA, $82F5,   $30 ;H
 
	dc.w 5, $8580, $82C0,   $50 ;E
	dc.w 5, $85EE, $82F7,   $60 ;G
	dc.w 5, $85EE, $82F7,   $70 ;G
 
TitleCard_ARZ:
	dc.w 11 ; number of letters
	dc.w 5, $85DE, $82EF, $FFD0 ;A
	dc.w 5, $85E2, $82F1, $FFE0 ;Q
	dc.w 5, $85E6, $82F3, $FFF0 ;U
	dc.w 5, $85DE, $82EF,     0 ;A
	dc.w 5, $85EA, $82F5,   $10 ;T
	dc.w 1, $85EE, $82F7,   $20 ;I
	dc.w 5, $85F0, $82F8,   $28 ;C
 
	dc.w 5, $85F4, $82FA,   $48 ;R
	dc.w 5, $85E6, $82F3,   $58 ;U
	dc.w 1, $85EE, $82F7,   $68 ;I
	dc.w 5, $8584, $82C2,   $70 ;N
 
TitleCard_SCZ:
	dc.w 8 ; number of letters
	dc.w 5, $85DE, $82EF, $FFF0 ;S
	dc.w 5, $85E2, $82F1,     0 ;K
	dc.w 5, $85E6, $82F3,   $10 ;Y
 
	dc.w 5, $85EA, $82F5,   $30 ;C
	dc.w 5, $85EE, $82F7,   $40 ;H
	dc.w 5, $85F2, $82F7,   $50 ;A
	dc.w 5, $85DE, $82EF,   $60 ;S
	dc.w 5, $8580, $82C0,   $70 ;E
 
T_ZONE:
	dc.w 4 ; number of letters
	dc.w 5, $858C, $82C6,     0 ;Z
	dc.w 5, $8588, $82C4,   $10 ;O
	dc.w 5, $8584, $82C2,   $20 ;N
	dc.w 5, $8580, $82C0,   $30 ;E
 
T_ACT1:
	dc.w $1 ; number of digits
	dc.w 7, $A590, $A2C8,     0 ;1
 
T_ACT2:
	dc.w $1 ; number of digits
	dc.w $B, $A598, $A2CC,    0 ;2
 
T_ACT3:
	dc.w $1 ; number of digits
	dc.w $B, $A5A4, $A2D2,    0 ;3
 
T_STH:
	dc.w $5 ; number of tiles (what they say is below)
	dc.w $D, $85B0, $82DE, $FFB8 ;SONI
	dc.w $D, $85B8, $82DC, $FFD8 ;C TH
	dc.w $D, $85C0, $82E0, $FFF8 ;E HE
	dc.w $D, $85C8, $82E4,   $18 ;DGEH
	dc.w $5, $85D0, $82E8,   $38 ;OG
 
T_STRIPEDGE:
	dc.w $7 ; number of tiles (to display strip edge)
	dc.w $9003, $85D4, $82EA, 0 ;>
	dc.w $B003, $85D4, $82EA, 0 ;>
	dc.w $D003, $85D4, $82EA, 0 ;>
	dc.w $F003, $85D4, $82EA, 0 ;>
	dc.w $1003, $85D4, $82EA, 0 ;>
	dc.w $3003, $85D4, $82EA, 0 ;>
	dc.w $5003, $85D4, $82EA, 0 ;>
; ==================================================================

To avoid alignment problems, add this line before and after the code above:

    align $200

Extending the Palette Cycle information

Now we want to locate:

; off_19F4:
PalCycle: zoneOrderedOffsetTable 2,1
	zoneOffsetTableEntry.w PalCycle_EHZ	; 0
	zoneOffsetTableEntry.w PalCycle_Null	; 1
	zoneOffsetTableEntry.w PalCycle_WZ	; 2
	zoneOffsetTableEntry.w PalCycle_Null	; 3
	zoneOffsetTableEntry.w PalCycle_MTZ	; 4
	zoneOffsetTableEntry.w PalCycle_MTZ	; 5
	zoneOffsetTableEntry.w PalCycle_WFZ	; 6
	zoneOffsetTableEntry.w PalCycle_HTZ	; 7
	zoneOffsetTableEntry.w PalCycle_HPZ	; 8
	zoneOffsetTableEntry.w PalCycle_Null	; 9
	zoneOffsetTableEntry.w PalCycle_OOZ	; 10
	zoneOffsetTableEntry.w PalCycle_MCZ	; 11
	zoneOffsetTableEntry.w PalCycle_CNZ	; 12
	zoneOffsetTableEntry.w PalCycle_CPZ	; 13
	zoneOffsetTableEntry.w PalCycle_CPZ	; 14
	zoneOffsetTableEntry.w PalCycle_ARZ	; 15
	zoneOffsetTableEntry.w PalCycle_WFZ	; 16
    zoneTableEnd

and replace it with:

; off_19F4:
PalCycle: zoneOrderedOffsetTable 2,1
	zoneOffsetTableEntry.w PalCycle_EHZ	; 00
	zoneOffsetTableEntry.w PalCycle_Null	; 01
	zoneOffsetTableEntry.w PalCycle_WZ	; 02
	zoneOffsetTableEntry.w PalCycle_Null	; 03
	zoneOffsetTableEntry.w PalCycle_MTZ	; 04
	zoneOffsetTableEntry.w PalCycle_MTZ	; 05
	zoneOffsetTableEntry.w PalCycle_WFZ	; 06
	zoneOffsetTableEntry.w PalCycle_HTZ	; 07
	zoneOffsetTableEntry.w PalCycle_HPZ	; 08
	zoneOffsetTableEntry.w PalCycle_Null	; 09
	zoneOffsetTableEntry.w PalCycle_OOZ	; 0A
	zoneOffsetTableEntry.w PalCycle_MCZ	; 0B
	zoneOffsetTableEntry.w PalCycle_CNZ	; 0C
	zoneOffsetTableEntry.w PalCycle_CPZ	; 0D
	zoneOffsetTableEntry.w PalCycle_CPZ	; 0E
	zoneOffsetTableEntry.w PalCycle_ARZ	; 0F
	zoneOffsetTableEntry.w PalCycle_WFZ	; 10
	zoneOffsetTableEntry.w PalCycle_Null	; 11
	zoneOffsetTableEntry.w PalCycle_Null	; 12
	zoneOffsetTableEntry.w PalCycle_Null	; 13
	zoneOffsetTableEntry.w PalCycle_Null	; 14
	zoneOffsetTableEntry.w PalCycle_Null	; 15
	zoneOffsetTableEntry.w PalCycle_Null	; 16
	zoneOffsetTableEntry.w PalCycle_Null	; 17
	zoneOffsetTableEntry.w PalCycle_Null	; 18
	zoneOffsetTableEntry.w PalCycle_Null	; 19
	zoneOffsetTableEntry.w PalCycle_Null	; 1A
	zoneOffsetTableEntry.w PalCycle_Null	; 1B
	zoneOffsetTableEntry.w PalCycle_Null	; 1C
	zoneOffsetTableEntry.w PalCycle_Null	; 1D
	zoneOffsetTableEntry.w PalCycle_Null	; 1E
	zoneOffsetTableEntry.w PalCycle_Null	; 1F
	zoneOffsetTableEntry.w PalCycle_Null	; 20
    zoneTableEnd

That inserts empty slots for the cycling palettes of out new levels.

Extending the static palette list

Next we locate:

;----------------------------------------------------------------------------
; Palette pointers
; (PALETTE DESCRIPTOR ARRAY)
; This struct array defines the palette to use for each level.
;----------------------------------------------------------------------------

palptr	macro	ptr,lineno
	dc.l ptr	; Pointer to palette
	dc.w (Normal_palette+lineno*palette_line_size)&$FFFF	; Location in ram to load palette into
	dc.w bytesToLcnt(ptr_End-ptr)	; Size of palette in (bytes / 4)
	endm

PalPointers:
PalPtr_SEGA:	palptr Pal_SEGA,  0
PalPtr_Title:	palptr Pal_Title, 1
PalPtr_MenuB:	palptr Pal_MenuB, 0
PalPtr_BGND:	palptr Pal_BGND,  0
PalPtr_EHZ:	palptr Pal_EHZ,   1
PalPtr_EHZ2:	palptr Pal_EHZ,   1
PalPtr_WZ:	palptr Pal_WZ,    1
PalPtr_EHZ3:	palptr Pal_EHZ,   1
PalPtr_MTZ:	palptr Pal_MTZ,   1
PalPtr_MTZ2:	palptr Pal_MTZ,   1
PalPtr_WFZ:	palptr Pal_WFZ,   1
PalPtr_HTZ:	palptr Pal_HTZ,   1
PalPtr_HPZ:	palptr Pal_HPZ,   1
PalPtr_EHZ4:	palptr Pal_EHZ,   1
PalPtr_OOZ:	palptr Pal_OOZ,   1
PalPtr_MCZ:	palptr Pal_MCZ,   1
PalPtr_CNZ:	palptr Pal_CNZ,   1
PalPtr_CPZ:	palptr Pal_CPZ,   1
PalPtr_DEZ:	palptr Pal_DEZ,   1
PalPtr_ARZ:	palptr Pal_ARZ,   1
PalPtr_SCZ:	palptr Pal_SCZ,   1
PalPtr_HPZ_U:	palptr Pal_HPZ_U, 0
PalPtr_CPZ_U:	palptr Pal_CPZ_U, 0
PalPtr_ARZ_U:	palptr Pal_ARZ_U, 0
PalPtr_SS:	palptr Pal_SS,    0
PalPtr_MCZ_B:	palptr Pal_MCZ_B, 1
PalPtr_CNZ_B:	palptr Pal_CNZ_B, 1
PalPtr_SS1:	palptr Pal_SS1,   3
PalPtr_SS2:	palptr Pal_SS2,   3
PalPtr_SS3:	palptr Pal_SS3,   3
PalPtr_SS4:	palptr Pal_SS4,   3
PalPtr_SS5:	palptr Pal_SS5,   3
PalPtr_SS6:	palptr Pal_SS6,   3
PalPtr_SS7:	palptr Pal_SS7,   3
PalPtr_SS1_2p:	palptr Pal_SS1_2p,3
PalPtr_SS2_2p:	palptr Pal_SS2_2p,3
PalPtr_SS3_2p:	palptr Pal_SS3_2p,3
PalPtr_OOZ_B:	palptr Pal_OOZ_B, 1
PalPtr_Menu:	palptr Pal_Menu,  0
PalPtr_Result:	palptr Pal_Result,0

; ----------------------------------------------------------------------------

We all know that the palettes are directly addressed here. It means the index above can detect palettes anywhere in the ROM. This label, PalPointers, is called directly. We can, then, move this table to any location we want it in the ROM. Put this after:

    EndOfHeader:

And after this table, put the following line to avoid alignment errors:

    align $200

You can add more indexes to this table this way:

	palptr Palette,   Normal_palette_line2, $17

for a normal level palette, and, for a underwater level palette, you will add the normal palette for that level and its underwater palette.

	palptr UnderwaterPalette,   Normal_palette_line, $1F

You must only have attention when adding more palettes to don't overflow the palette index (yes, it is possible to have 255 palettes...).

Extending Zone Procedures and Scripts

Now we need to add the zone scripts.

Find:

PLC_DYNANM: zoneOrderedOffsetTable 2,2		; Zone ID
	zoneOffsetTableEntry.w Dynamic_Normal	; $00
	zoneOffsetTableEntry.w Animated_EHZ

	zoneOffsetTableEntry.w Dynamic_Null	; $01
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $02
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $03
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Normal	; $04
	zoneOffsetTableEntry.w Animated_MTZ

	zoneOffsetTableEntry.w Dynamic_Normal	; $05
	zoneOffsetTableEntry.w Animated_MTZ

	zoneOffsetTableEntry.w Dynamic_Null	; $06
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_HTZ	; $07
	zoneOffsetTableEntry.w Animated_HTZ

	zoneOffsetTableEntry.w Dynamic_Normal	; $08
	zoneOffsetTableEntry.w Animated_HPZ

	zoneOffsetTableEntry.w Dynamic_Null	; $09
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Normal	; $0A
	zoneOffsetTableEntry.w Animated_OOZ

	zoneOffsetTableEntry.w Dynamic_Null	; $0B
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_CNZ	; $0C
	zoneOffsetTableEntry.w Animated_CNZ

	zoneOffsetTableEntry.w Dynamic_Normal	; $0D
	zoneOffsetTableEntry.w Animated_CPZ

	zoneOffsetTableEntry.w Dynamic_Normal	; $0E
	zoneOffsetTableEntry.w Animated_DEZ

	zoneOffsetTableEntry.w Dynamic_ARZ	; $0F
	zoneOffsetTableEntry.w Animated_ARZ

	zoneOffsetTableEntry.w Dynamic_Null	; $10
	zoneOffsetTableEntry.w Animated_Null
    zoneTableEnd

and add to the end of it just before zoneTableEnd:

	zoneOffsetTableEntry.w Dynamic_Null	; $11
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $12
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $13
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $14
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $15
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $16
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $17
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $18
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $19
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $1A
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $1B
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $1C
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $1D
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $1E
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $1F
	zoneOffsetTableEntry.w Animated_Null

	zoneOffsetTableEntry.w Dynamic_Null	; $20
	zoneOffsetTableEntry.w Animated_Null

This creates scripts for the new levels. To make complex animations (like the HPZ pulsing ball) you will need to create a Anim*level*.bin and add it to the Anim*level*.bin files and add it to the animated pattern mappings. See the section below.

Extending Animated Pattern Mappings

Find:

AnimPatMaps: zoneOrderedOffsetTable 2,1
	zoneOffsetTableEntry.w APM_EHZ		;  0
	zoneOffsetTableEntry.w APM_Null		;  1
	zoneOffsetTableEntry.w APM_Null		;  2
	zoneOffsetTableEntry.w APM_Null		;  3
	zoneOffsetTableEntry.w APM_MTZ		;  4
	zoneOffsetTableEntry.w APM_MTZ		;  5
	zoneOffsetTableEntry.w APM_Null		;  6
	zoneOffsetTableEntry.w APM_EHZ		;  7
	zoneOffsetTableEntry.w APM_HPZ		;  8
	zoneOffsetTableEntry.w APM_Null		;  9
	zoneOffsetTableEntry.w APM_OOZ		; $A
	zoneOffsetTableEntry.w APM_Null		; $B
	zoneOffsetTableEntry.w APM_CNZ		; $C
	zoneOffsetTableEntry.w APM_CPZ		; $D
	zoneOffsetTableEntry.w APM_DEZ		; $E
	zoneOffsetTableEntry.w APM_ARZ		; $F
	zoneOffsetTableEntry.w APM_Null		;$10
    zoneTableEnd

then add this to the end of this index, just before zoneTableEnd:

	zoneOffsetTableEntry.w APM_Null		;$11
	zoneOffsetTableEntry.w APM_Null		;$12
	zoneOffsetTableEntry.w APM_Null		;$13
	zoneOffsetTableEntry.w APM_Null		;$14
	zoneOffsetTableEntry.w APM_Null		;$15
	zoneOffsetTableEntry.w APM_Null		;$16
	zoneOffsetTableEntry.w APM_Null		;$17
	zoneOffsetTableEntry.w APM_Null		;$18
	zoneOffsetTableEntry.w APM_Null		;$19
	zoneOffsetTableEntry.w APM_Null		;$1A
	zoneOffsetTableEntry.w APM_Null		;$1B
	zoneOffsetTableEntry.w APM_Null		;$1C
	zoneOffsetTableEntry.w APM_Null		;$1D
	zoneOffsetTableEntry.w APM_Null		;$1E
	zoneOffsetTableEntry.w APM_Null		;$1F
	zoneOffsetTableEntry.w APM_Null		;$20

then edit and change as needed. Add the new .bin files to below here:

; byte_40372:
APM_EHZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$4 ,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$5 ,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$8 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$C ,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$9 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$D ,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$10,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$14,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$11,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$15,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$6 ,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$3 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$7 ,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$A ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$E ,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$B ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$F ,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$12,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$16,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$13,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$17,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$18,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1A,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$19,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1B,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1E,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1F,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_Checkers+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_Checkers+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$0,1,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$1,1,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$0,1,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$1,1,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$0,1,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$1,1,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$0,1,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$1,1,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$0,1,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$1,1,0,3,1)
APM_EHZ_End:



; byte_403EE:
APM_MTZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,1,0,1,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,1,0,1,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,1,0,1,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,1,0,1,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,1,0,1,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,1,0,1,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,1,0,1,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,1,0,1,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,1,0,1,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,1,0,1,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,1,0,1,0)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,1,0,1,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Lava+$0    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$1    ,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Lava+$2    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$3    ,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Lava+$4    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$5    ,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Lava+$8    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$9    ,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Lava+$6    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$7    ,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Lava+$A    ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$B    ,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1)
APM_MTZ_End:



; byte_404C2:
APM_HPZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0)
    else
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0)

    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0)
    else
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0)
    else
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0)
    else
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0)
    else
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0)
    else
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
    else
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
    endif
APM_HPZ_End:



; byte_405B6:
APM_OOZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$0,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$2,0,0,0,1)
	dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$1,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$3,0,0,0,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$1,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$3,0,0,3,1)
	
    if gameRevision<2
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
    else
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0)
	dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
    endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$1,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$9,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$3,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$B,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$5,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$D,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$7,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$F,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$1,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$9,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$3,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$B,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$5,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$D,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$7,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$F,0,0,2,1)
APM_OOZ_End:



; byte_4061A:
APM_CNZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$4,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$5,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$C,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$D,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$6,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$7,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$E,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$F,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$4,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$5,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$C,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$D,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$6,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$7,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$E,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$F,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$4,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$5,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$C,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$D,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$6,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$7,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$E,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$F,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$4,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$5,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$C,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$D,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$6,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$7,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$E,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$F,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$4,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$5,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$C,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$D,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$6,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$7,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$E,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$F,0,0,3,1)
APM_CNZ_End:



; byte_406BE:
APM_CNZ2P:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$4,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$5,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$C,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$D,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$6,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$7,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$E,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$F,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$4,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$5,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$C,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$D,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$6,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$7,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$E,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$F,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$4,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$5,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$C,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$D,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$6,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$7,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$E,0,0,0,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$F,0,0,0,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$4,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$5,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$C,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$D,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$6,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$7,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$E,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$F,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$4,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$5,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$C,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$D,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$6,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$7,0,0,3,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$E,0,0,3,1)
	dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$F,0,0,3,1)
APM_CNZ2P_End:



; byte_40762:
APM_CPZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0)
APM_CPZ_End:



; byte_4076E:
APM_DEZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0)
APM_DEZ_End:



; byte_4077A:
APM_ARZ:	begin_animpat
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1  ,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3  ,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1  ,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2  ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3  ,0,0,2,1)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,1)
	
	;These are invalid animation entries for waterfalls (bug in original game):
		if 1==1
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,1)
		else
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,1)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,1)
		endif
	
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1  ,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3  ,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1  ,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2  ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3  ,0,0,2,0)
	
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,0)
	
	;These are invalid animation entries for waterfalls (bug in original game):
		if 1==1
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,0)
		else
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,0)
	dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,0)
		endif
APM_ARZ_End:



; byte_407BE:
APM_Null:	dc.w   0

and fit this table to suit your needs, creating the necessary load queries for them. (If so, you need to know what you're doing here.)

Extending the 1 Player and 2 Player music playlists

To avoid some code-breaking problems (branches), we will fix this using a different way.

Go to EndOfHeader. If you are really following this tutorial, you've put a PalPointers table there. You will add between those two labels the following procedure:

DefineLevelBGM:
	moveq    #0,d0
	move.b    (Current_Zone).w,d0
	lea    (NormalMusicList).l,a1
	tst.w    (Two_Player_Mode).w
	beq.s    PlayNormalMusic
	lea    (MusicList2PMode).l,a1

PlayNormalMusic:
	move.b    (a1,d0.w),d0
	move.w    d0,(Level_Music).w
	bsr.w    JTR_PlayMusic
	move.b	#ObjID_TitleCard,(TitleCard+id).w ; <-- we need this, or there won't even be a title card, and if we remove it to remove the titlecard, we get a refresh glitch with sonic standing on air.
	jmp    Level_TtlCard
	rts

JTR_PlayMusic:
	jmp    PlayMusic
	rts

NormalMusicList:
    dc.b    MusID_EHZ    ;00
    dc.b    MusID_EHZ    ;01
    dc.b    MusID_EHZ    ;02
    dc.b    MusID_EHZ    ;03
    dc.b    MusID_MTZ    ;04
    dc.b    MusID_MTZ    ;05
    dc.b    MusID_WFZ    ;06
    dc.b    MusID_HTZ    ;07
    dc.b    MusID_HPZ    ;08
    dc.b    MusID_EHZ    ;09
    dc.b    MusID_OOZ    ;0A
    dc.b    MusID_MCZ    ;0B
    dc.b    MusID_CNZ    ;0C
    dc.b    MusID_CPZ    ;0D
    dc.b    MusID_DEZ    ;0E
    dc.b    MusID_ARZ    ;0F
    dc.b    MusID_SCZ    ;10
    dc.b    MusID_EHZ    ;11
    dc.b    MusID_EHZ    ;12
    dc.b    MusID_EHZ    ;13
    dc.b    MusID_EHZ    ;14
    dc.b    MusID_EHZ    ;15
    dc.b    MusID_EHZ    ;16
    dc.b    MusID_EHZ    ;17
    dc.b    MusID_EHZ    ;18
    dc.b    MusID_EHZ    ;19
    dc.b    MusID_EHZ    ;1A
    dc.b    MusID_EHZ    ;1B
    dc.b    MusID_EHZ    ;1C
    dc.b    MusID_EHZ    ;1D
    dc.b    MusID_EHZ    ;1E
    dc.b    MusID_EHZ    ;1F
    dc.b    MusID_EHZ    ;20

    align 4

MusicList2PMode:
    dc.b    MusID_EHZ_2P ;00
    dc.b    MusID_EHZ    ;01
    dc.b    MusID_EHZ    ;02
    dc.b    MusID_EHZ    ;03
    dc.b    MusID_MTZ    ;04
    dc.b    MusID_MTZ    ;05
    dc.b    MusID_WFZ    ;06
    dc.b    MusID_HTZ    ;07
    dc.b    MusID_HPZ    ;08
    dc.b    MusID_EHZ    ;09
    dc.b    MusID_OOZ    ;0A
    dc.b    MusID_MCZ_2P ;0B
    dc.b    MusID_CNZ_2P ;0C
    dc.b    MusID_CPZ    ;0D
    dc.b    MusID_DEZ    ;0E
    dc.b    MusID_ARZ    ;0F
    dc.b    MusID_SCZ    ;10
    dc.b    MusID_EHZ    ;11
    dc.b    MusID_EHZ    ;12
    dc.b    MusID_EHZ    ;13
    dc.b    MusID_EHZ    ;14
    dc.b    MusID_EHZ    ;15
    dc.b    MusID_EHZ    ;16
    dc.b    MusID_EHZ    ;17
    dc.b    MusID_EHZ    ;18
    dc.b    MusID_EHZ    ;19
    dc.b    MusID_EHZ    ;1A
    dc.b    MusID_EHZ    ;1B
    dc.b    MusID_EHZ    ;1C
    dc.b    MusID_EHZ    ;1D
    dc.b    MusID_EHZ    ;1E
    dc.b    MusID_EHZ    ;1F
    dc.b    MusID_EHZ    ;20

    align $200

I decided to enumerate the music ids because it is likely you either extended the existing sound driver, or installed a new one if you added this many zones and you would likely want to not have to worry about fixing the music.

Now, go to Level_GetBGM. You will see this:

; loc_40AE:
Level_GetBgm:
	tst.w	(Demo_mode_flag).w
	bmi.s	+
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lea	MusicList(pc),a1
	tst.w	(Two_player_mode).w
	beq.s	Level_PlayBgm
	lea	MusicList2(pc),a1

and replace it with:

; loc_40AE:
Level_GetBgm:
	tst.w	(Demo_mode_flag).w
	bmi.s	+
	jmp    DefineLevelBGM

Extending the demo list

now we will prepare everything so that we can put in new demo files for our new levels.

find:

; off_4948:
; ---------------------------------------------------------------------------
; DEMO SCRIPT POINTERS

; Contains an array of pointers to the script controlling the players actions
; to use for each level.
; ---------------------------------------------------------------------------
; off_4948:
DemoScriptPointers: zoneOrderedTable 4,1
	zoneTableEntry.l Demo_EHZ	; $00
	zoneTableEntry.l Demo_EHZ	; $01
	zoneTableEntry.l Demo_EHZ	; $02
	zoneTableEntry.l Demo_EHZ	; $03
	zoneTableEntry.l Demo_EHZ	; $04
	zoneTableEntry.l Demo_EHZ	; $05
	zoneTableEntry.l Demo_EHZ	; $06
	zoneTableEntry.l Demo_EHZ	; $07
	zoneTableEntry.l Demo_EHZ	; $08
	zoneTableEntry.l Demo_EHZ	; $09
	zoneTableEntry.l Demo_EHZ	; $0A
	zoneTableEntry.l Demo_EHZ	; $0B
	zoneTableEntry.l Demo_CNZ	; $0C
	zoneTableEntry.l Demo_CPZ	; $0D
	zoneTableEntry.l Demo_EHZ	; $0E
	zoneTableEntry.l Demo_ARZ	; $0F
	zoneTableEntry.l Demo_EHZ	; $10

and insert after it:

	zoneTableEntry.l Demo_EHZ	; $11
	zoneTableEntry.l Demo_EHZ	; $12
	zoneTableEntry.l Demo_EHZ	; $13
	zoneTableEntry.l Demo_EHZ	; $14
	zoneTableEntry.l Demo_EHZ	; $15
	zoneTableEntry.l Demo_EHZ	; $16
	zoneTableEntry.l Demo_EHZ	; $17
	zoneTableEntry.l Demo_EHZ	; $18
	zoneTableEntry.l Demo_EHZ	; $19
	zoneTableEntry.l Demo_EHZ	; $1A
	zoneTableEntry.l Demo_EHZ	; $1B
	zoneTableEntry.l Demo_EHZ	; $1C
	zoneTableEntry.l Demo_EHZ	; $1D
	zoneTableEntry.l Demo_EHZ	; $1E
	zoneTableEntry.l Demo_EHZ	; $1F
	zoneTableEntry.l Demo_EHZ	; $20

Extending the Collision index

You would want solidity in your new zones, wouldn't you? Here we will extend the solidity list so that our extra levels can have solid ground for that blue hedgehog to walk on.

Well. We will fit, first, the collision procedure. This way, we can merge both tables into only one.

Find:

LoadCollisionIndexes:
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lsl.w	#2,d0
	move.l	#Primary_Collision,(Collision_addr).w
	move.w	d0,-(sp)
	movea.l	Off_ColP(pc,d0.w),a0
	lea	(Primary_Collision).w,a1
	bsr.w	KosDec
	move.w	(sp)+,d0
	movea.l	Off_ColS(pc,d0.w),a0
	lea	(Secondary_Collision).w,a1
	bra.w	KosDec

Now, replace it with this:

LoadCollisionIndexes:
	moveq	#0,d0
	move.b	(Current_Zone).w,d0
	lsl.w	#3,d0			;change to lsl.w #3,d0 to make the offset 8 instead of 4
	move.l	#Primary_Collision,(Collision_addr).w
	move.w	d0,-(sp)		;without this line, CPZ and ARZ solidity will be a little wonky
	movea.l	CollisionData(pc,d0.w),a0
	lea	(Primary_Collision).w,a1
	bsr.w	KosDec
	move.w	(sp)+,d0		;without this line, CPZ and ARZ solidity will be a little wonky
	movea.l	CollisionData+4(pc,d0.w),a0
	lea	(Secondary_Collision).w,a1
	bsr.w	KosDec

I saw no point in leaving the old indexes as dummies here, since that just eats up rom space so I just went to deleting them in the merge.

Change:

; ---------------------------------------------------------------------------
; Pointers to primary collision indexes

; Contains an array of pointers to the primary collision index data for each
; level. 1 pointer for each level, pointing the primary collision index.
; ---------------------------------------------------------------------------
Off_ColP: zoneOrderedTable 4,1
	zoneTableEntry.l ColP_EHZHTZ
	zoneTableEntry.l Off_Level	; 1
	zoneTableEntry.l ColP_MTZ	; 2
	zoneTableEntry.l Off_Level	; 3
	zoneTableEntry.l ColP_MTZ	; 4
	zoneTableEntry.l ColP_MTZ	; 5
	zoneTableEntry.l ColP_WFZSCZ	; 6
	zoneTableEntry.l ColP_EHZHTZ	; 7
	zoneTableEntry.l ColP_OOZ	; 8
	zoneTableEntry.l Off_Level	; 9
	zoneTableEntry.l ColP_OOZ	; 10
	zoneTableEntry.l ColP_MCZ	; 11
	zoneTableEntry.l ColP_CNZ	; 12
	zoneTableEntry.l ColP_CPZDEZ	; 13
	zoneTableEntry.l ColP_CPZDEZ	; 14
	zoneTableEntry.l ColP_ARZ	; 15
	zoneTableEntry.l ColP_WFZSCZ	; 16
    zoneTableEnd

; ---------------------------------------------------------------------------
; Pointers to secondary collision indexes

; Contains an array of pointers to the secondary collision index data for
; each level. 1 pointer for each level, pointing the secondary collision
; index.
; ---------------------------------------------------------------------------
Off_ColS: zoneOrderedTable 4,1
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l Off_Level	; 1
	zoneTableEntry.l ColP_MTZ	; 2
	zoneTableEntry.l Off_Level	; 3
	zoneTableEntry.l ColP_MTZ	; 4
	zoneTableEntry.l ColP_MTZ	; 5
	zoneTableEntry.l ColS_WFZSCZ	; 6
	zoneTableEntry.l ColS_EHZHTZ	; 7
	zoneTableEntry.l ColP_OOZ	; 8
	zoneTableEntry.l Off_Level	; 9
	zoneTableEntry.l ColP_OOZ	; 10
	zoneTableEntry.l ColP_MCZ	; 11
	zoneTableEntry.l ColS_CNZ	; 12
	zoneTableEntry.l ColS_CPZDEZ	; 13
	zoneTableEntry.l ColS_CPZDEZ	; 14
	zoneTableEntry.l ColS_ARZ	; 15
	zoneTableEntry.l ColS_WFZSCZ	; 16
    zoneTableEnd

To:

CollisionData: zoneOrderedTable 4,2
	zoneTableEntry.l ColP_EHZHTZ ;00
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;01
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;02
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;03
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_MTZ    ;04
	zoneTableEntry.l ColP_MTZ
	zoneTableEntry.l ColP_MTZ    ;05
	zoneTableEntry.l ColP_MTZ
	zoneTableEntry.l ColP_WFZSCZ ;06
	zoneTableEntry.l ColS_WFZSCZ
	zoneTableEntry.l ColP_EHZHTZ ;07
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;08
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;09
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_OOZ    ;0A
	zoneTableEntry.l ColP_OOZ
	zoneTableEntry.l ColP_MCZ    ;0B
	zoneTableEntry.l ColP_MCZ
	zoneTableEntry.l ColP_CNZ    ;0C
	zoneTableEntry.l ColS_CNZ
	zoneTableEntry.l ColP_CPZDEZ ;0D
	zoneTableEntry.l ColS_CPZDEZ
	zoneTableEntry.l ColP_CPZDEZ ;0E
	zoneTableEntry.l ColS_CPZDEZ
	zoneTableEntry.l ColP_ARZ    ;0F
	zoneTableEntry.l ColS_ARZ
	zoneTableEntry.l ColP_WFZSCZ ;10
	zoneTableEntry.l ColS_WFZSCZ
	zoneTableEntry.l ColP_EHZHTZ ;11
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;12
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;13
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;14
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;15
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;16
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;17
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;18
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;19
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;1A
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;1B
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;1C
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;1D
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;1E
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;1F
	zoneTableEntry.l ColS_EHZHTZ
	zoneTableEntry.l ColP_EHZHTZ ;20
	zoneTableEntry.l ColS_EHZHTZ
    zoneTableEnd

Extending Rings Index

Instead of doing the word-offset table, we will make a dynamic call routine, like collisions. Of course, we won´t work with compressed ring placement.

We find, initially:

; loc_172A4:
RingsManager_Setup:
	clearRAM Ring_Positions,(Ring_Positions_End-Ring_Positions)
	; d0 = 0
	lea	(Ring_consumption_table).w,a1

	move.w	#bytesToLcnt(Ring_consumption_table_End-Ring_consumption_table-$40),d1	; coding error, that '-$40' shouldn't be there
-	move.l	d0,(a1)+	; only half of Ring_consumption_table is cleared
	dbf	d1,-

	moveq	#0,d5
	moveq	#0,d0
	move.w	(Current_ZoneAndAct).w,d0
	ror.b	#1,d0
	lsr.w	#6,d0
	lea	(Off_Rings).l,a1
	move.w	(a1,d0.w),d0
	lea	(a1,d0.w),a1
	lea	(Ring_Positions+6).w,a2	; first ring is left blank
; loc_172E0:
RingsMgr_NextRowOrCol:

And change it to:

; loc_172A4:
RingsManager_Setup:
	jmp	CarregarAneis
	rts

; loc_172E0:
RingsMgr_NextRowOrCol:

Now, we put the following routine at a good place:

	align $40

CarregarAneis:
	clearRAM Ring_Positions,$600
	; d0 = 0
	lea	(Ring_consumption_table).w,a1
	move.w	#bytesToLcnt($40),d1
-	move.l	d0,(a1)+
	dbf	d1,-

	moveq	#0,d5
	moveq	#0,d0
	; convert zone/act data for an useable format, sequential
	move.w	(Current_ZoneAndAct).w,d0

	ror.b	#1,d0
	lsr.w	#6,d0	;this yields an 8-byte jump.
	add.l d0,d0

	movea.l	RingData(pc,d0.l),a1	; this allows ring data anywhere in the ROM.
	lea	(Ring_Positions).w,a2
	jmp	RingsMgr_NextRowOrCol
	rts
	
RingData: zoneOrderedTable 4,2
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;00
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;01
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;02
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;03
	zoneTableEntry.l	Rings_MTZ_1
	zoneTableEntry.l	Rings_MTZ_2	;04
	zoneTableEntry.l	Rings_MTZ_3
	zoneTableEntry.l	Rings_MTZ_3	;05
	zoneTableEntry.l	Rings_WFZ_1
	zoneTableEntry.l	Rings_WFZ_1	;06
	zoneTableEntry.l	Rings_HTZ_1
	zoneTableEntry.l	Rings_HTZ_2	;07
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;08
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;09
	zoneTableEntry.l	Rings_OOZ_1
	zoneTableEntry.l	Rings_OOZ_2	;0A
	zoneTableEntry.l	Rings_MCZ_1
	zoneTableEntry.l	Rings_MCZ_2	;0B
	zoneTableEntry.l	Rings_CNZ_1
	zoneTableEntry.l	Rings_CNZ_2	;0C
	zoneTableEntry.l	Rings_CPZ_1
	zoneTableEntry.l	Rings_CPZ_2	;0D
	zoneTableEntry.l	Rings_DEZ_1
	zoneTableEntry.l	Rings_DEZ_1	;0E
	zoneTableEntry.l	Rings_ARZ_1
	zoneTableEntry.l	Rings_ARZ_2	;0F
	zoneTableEntry.l	Rings_SCZ_1
	zoneTableEntry.l	Rings_SCZ_1	;10
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;11
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;12
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;13
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;14
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;15
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;16
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;17
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;18
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;19
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;1A
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;1B
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;1C
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;1D
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;1E
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;1F
	zoneTableEntry.l	Rings_EHZ_1
	zoneTableEntry.l	Rings_EHZ_2	;20
    zoneTableEnd

	align $80

You can put this before PalPointers, if you relocated that table as described before.

This routine directly calls the desired ring placement, with no need of attaching them to the table, like the word-offset index does.

Extending the object index

We will make a similar extension for objects. Look for:

; loc_17AB8
ObjectsManager_Init:
	addq.b	#2,(Obj_placement_routine).w
	move.w	(Current_ZoneAndAct).w,d0 ; If level == $0F01 (ARZ 2)...
	ror.b	#1,d0			; then this yields $0F80...
	lsr.w	#6,d0			; and this yields $003E.
	lea	(Off_Objects).l,a0	; Next, we load the first pointer in the object layout list pointer index,
	movea.l	a0,a1			; then copy it for quicker use later.
	adda.w	(a0,d0.w),a0		; (Point1 * 2) + $003E
	tst.w	(Two_player_mode).w	; skip if not in 2-player vs mode
	beq.s	+
	cmpi.b	#casino_night_zone,(Current_Zone).w	; skip if not Casino Night Zone
	bne.s	+
	lea	(Objects_CNZ1_2P).l,a0	; CNZ 1 2-player object layout
	tst.b	(Current_Act).w		; skip if not past act 1
	beq.s	+
	lea	(Objects_CNZ2_2P).l,a0	; CNZ 2 2-player object layout
+

And change that to:

; loc_17AB8
ObjectsManager_Init:
	jmp	CarregarObjetos
	rts

loc_17AF0:
+

Now, put this routine into a good place. If you relocated PalPointers like described before, put this before PalPointers:

	align $40
	
CarregarObjetos:
	addq.b	#2,(Obj_placement_routine).w

	moveq	#0,d0
	move.w	(Current_ZoneAndAct).w,d0	; If level == $0F (ARZ)...
	ror.b	#1,d0
	lsr.w	#6,d0
	add.l	d0,d0
	movea.l	ObjPosData(pc,d0.l),a0
	movea.l	a0,a1
	
	tst.w	(Two_player_mode).w	; skip if not in 2-player vs mode
	beq.s	+
	cmpi.b	#$C,(Current_Zone).w	; skip if not Casino Night Zone
	bne.s	+
	lea	(Objects_CNZ1_2P).l,a0	; CNZ 1 2-player object layout
	tst.b	(Current_Act).w		; skip if not past act 1
	beq.s	+
	lea	(Objects_CNZ2_2P).l,a0	; CNZ 2 2-player object layout

+:
	jmp	loc_17AF0
	rts
	
ObjPosData: zoneOrderedTable 4,2
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;00
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;01
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;02
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;03
	zoneTableEntry.l	Objects_MTZ_1
	zoneTableEntry.l	Objects_MTZ_2	;04
	zoneTableEntry.l	Objects_MTZ_3
	zoneTableEntry.l	Objects_MTZ_3	;05
	zoneTableEntry.l	Objects_WFZ_1
	zoneTableEntry.l	Objects_WFZ_1	;06
	zoneTableEntry.l	Objects_HTZ_1
	zoneTableEntry.l	Objects_HTZ_2	;07
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;08
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;09
	zoneTableEntry.l	Objects_OOZ_1
	zoneTableEntry.l	Objects_OOZ_2	;0A
	zoneTableEntry.l	Objects_MCZ_1
	zoneTableEntry.l	Objects_MCZ_2	;0B
	zoneTableEntry.l	Objects_CNZ_1
	zoneTableEntry.l	Objects_CNZ_2	;0C
	zoneTableEntry.l	Objects_CPZ_1
	zoneTableEntry.l	Objects_CPZ_2	;0D
	zoneTableEntry.l	Objects_DEZ_1
	zoneTableEntry.l	Objects_DEZ_1	;0E
	zoneTableEntry.l	Objects_ARZ_1
	zoneTableEntry.l	Objects_ARZ_2	;0F
	zoneTableEntry.l	Objects_SCZ_1
	zoneTableEntry.l	Objects_SCZ_1	;10
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;11
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;12
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;13
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;14
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;15
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;16
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;17
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;18
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;19
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;1A
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;1B
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;1C
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;1D
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;1E
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;1F
	zoneTableEntry.l	Objects_EHZ_1
	zoneTableEntry.l	Objects_EHZ_2	;20
   zoneTableEnd
	align $80

Extending tiles and patterns index

Find:

;----------------------------------------------------------------------------------
; EHZ 16x16 block mappings (Kosinski compression) ; was: (Kozinski compression)
BM16_EHZ:	BINCLUDE	"mappings/16x16/EHZ.bin"
;-----------------------------------------------------------------------------------
; EHZ/HTZ main level patterns (Kosinski compression)
; ArtKoz_95C24:
ArtKos_EHZ:	BINCLUDE	"art/kosinski/EHZ_HTZ.bin"
;-----------------------------------------------------------------------------------
; HTZ 16x16 block mappings (Kosinski compression)
BM16_HTZ:	BINCLUDE	"mappings/16x16/HTZ.bin"
;-----------------------------------------------------------------------------------
; HTZ pattern suppliment to EHZ level patterns (Kosinski compression)
; ArtKoz_98AB4:
ArtKos_HTZ:	BINCLUDE	"art/kosinski/HTZ_Supp.bin"
;-----------------------------------------------------------------------------------
; EHZ/HTZ 128x128 block mappings (Kosinski compression)
BM128_EHZ:	BINCLUDE	"mappings/128x128/EHZ_HTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ 16x16 block mappings (Kosinski compression)
BM16_MTZ:	BINCLUDE	"mappings/16x16/MTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_MTZ:	BINCLUDE	"art/kosinski/MTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ 128x128 block mappings (Kosinski compression)
BM128_MTZ:	BINCLUDE	"mappings/128x128/MTZ.bin"
;-----------------------------------------------------------------------------------
; OOZ 16x16 block mappings (Kosinski compression)
BM16_OOZ:	BINCLUDE	"mappings/16x16/OOZ.bin"
;-----------------------------------------------------------------------------------
; OOZ main level patterns (Kosinski compression)
; ArtKoz_A4204:
ArtKos_OOZ:	BINCLUDE	"art/kosinski/OOZ.bin"
;-----------------------------------------------------------------------------------
; OOZ 128x128 block mappings (Kosinski compression)
BM128_OOZ:	BINCLUDE	"mappings/128x128/OOZ.bin"
;-----------------------------------------------------------------------------------
; MCZ 16x16 block mappings (Kosinski compression)
BM16_MCZ:	BINCLUDE	"mappings/16x16/MCZ.bin"
;-----------------------------------------------------------------------------------
; MCZ main level patterns (Kosinski compression)
; ArtKoz_A9D74:
ArtKos_MCZ:	BINCLUDE	"art/kosinski/MCZ.bin"
;-----------------------------------------------------------------------------------
; MCZ 128x128 block mappings (Kosinski compression)
BM128_MCZ:	BINCLUDE	"mappings/128x128/MCZ.bin"
;-----------------------------------------------------------------------------------
; CNZ 16x16 block mappings (Kosinski compression)
BM16_CNZ:	BINCLUDE	"mappings/16x16/CNZ.bin"
;-----------------------------------------------------------------------------------
; CNZ main level patterns (Kosinski compression)
; ArtKoz_B0894:
ArtKos_CNZ:	BINCLUDE	"art/kosinski/CNZ.bin"
;-----------------------------------------------------------------------------------
; CNZ 128x128 block mappings (Kosinski compression)
BM128_CNZ:	BINCLUDE	"mappings/128x128/CNZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ 16x16 block mappings (Kosinski compression)
BM16_CPZ:	BINCLUDE	"mappings/16x16/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ main level patterns (Kosinski compression)
; ArtKoz_B6174:
ArtKos_CPZ:	BINCLUDE	"art/kosinski/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ 128x128 block mappings (Kosinski compression)
BM128_CPZ:	BINCLUDE	"mappings/128x128/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; ARZ 16x16 block mappings (Kosinski compression)
BM16_ARZ:	BINCLUDE	"mappings/16x16/ARZ.bin"
;-----------------------------------------------------------------------------------
; ARZ main level patterns (Kosinski compression)
; ArtKoz_BCC24:
ArtKos_ARZ:	BINCLUDE	"art/kosinski/ARZ.bin"
;-----------------------------------------------------------------------------------
; ARZ 128x128 block mappings (Kosinski compression)
BM128_ARZ:	BINCLUDE	"mappings/128x128/ARZ.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ 16x16 block mappings (Kosinski compression)
BM16_WFZ:	BINCLUDE	"mappings/16x16/WFZ_SCZ.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ main level patterns (Kosinski compression)
; ArtKoz_C5004:
ArtKos_SCZ:	BINCLUDE	"art/kosinski/WFZ_SCZ.bin"
;-----------------------------------------------------------------------------------
; WFZ pattern suppliment to SCZ tiles (Kosinski compression)
; ArtKoz_C7EC4:
ArtKos_WFZ:	BINCLUDE	"art/kosinski/WFZ_Supp.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ 128x128 block mappings (Kosinski compression)
BM128_WFZ:	BINCLUDE	"mappings/128x128/WFZ_SCZ.bin"

then add this to the end:

;-----------------------------------------------------------------------------------
; Lev_11 16x16 block mappings (Kosinski compression)
BM16_Lev_11:	BINCLUDE	"mappings/16x16/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_11 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_11:	BINCLUDE	"art/kosinski/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_11 128x128 block mappings (Kosinski compression)
BM128_Lev_11:	BINCLUDE	"mappings/128x128/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_12 16x16 block mappings (Kosinski compression)
BM16_Lev_12:	BINCLUDE	"mappings/16x16/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_12 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_12:	BINCLUDE	"art/kosinski/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_12 128x128 block mappings (Kosinski compression)
BM128_Lev_12:	BINCLUDE	"mappings/128x128/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_13 16x16 block mappings (Kosinski compression)
BM16_Lev_13:	BINCLUDE	"mappings/16x16/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_13 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_13:	BINCLUDE	"art/kosinski/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_13 128x128 block mappings (Kosinski compression)
BM128_Lev_13:	BINCLUDE	"mappings/128x128/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_14 16x16 block mappings (Kosinski compression)
BM16_Lev_14:	BINCLUDE	"mappings/16x16/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_14 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_14:	BINCLUDE	"art/kosinski/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_14 128x128 block mappings (Kosinski compression)
BM128_Lev_14:	BINCLUDE	"mappings/128x128/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_15 16x16 block mappings (Kosinski compression)
BM16_Lev_15:	BINCLUDE	"mappings/16x16/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_15 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_15:	BINCLUDE	"art/kosinski/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_15 128x128 block mappings (Kosinski compression)
BM128_Lev_15:	BINCLUDE	"mappings/128x128/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_16 16x16 block mappings (Kosinski compression)
BM16_Lev_16:	BINCLUDE	"mappings/16x16/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_16 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_16:	BINCLUDE	"art/kosinski/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_16 128x128 block mappings (Kosinski compression)
BM128_Lev_16:	BINCLUDE	"mappings/128x128/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_17 16x16 block mappings (Kosinski compression)
BM16_Lev_17:	BINCLUDE	"mappings/16x16/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_17 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_17:	BINCLUDE	"art/kosinski/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_17 128x128 block mappings (Kosinski compression)
BM128_Lev_17:	BINCLUDE	"mappings/128x128/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_18 16x16 block mappings (Kosinski compression)
BM16_Lev_18:	BINCLUDE	"mappings/16x16/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_18 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_18:	BINCLUDE	"art/kosinski/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_18 128x128 block mappings (Kosinski compression)
BM128_Lev_18:	BINCLUDE	"mappings/128x128/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_19 16x16 block mappings (Kosinski compression)
BM16_Lev_19:	BINCLUDE	"mappings/16x16/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_19 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_19:	BINCLUDE	"art/kosinski/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_19 128x128 block mappings (Kosinski compression)
BM128_Lev_19:	BINCLUDE	"mappings/128x128/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_1A 16x16 block mappings (Kosinski compression)
BM16_Lev_1A:	BINCLUDE	"mappings/16x16/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1A main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1A:	BINCLUDE	"art/kosinski/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1A 128x128 block mappings (Kosinski compression)
BM128_Lev_1A:	BINCLUDE	"mappings/128x128/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1B 16x16 block mappings (Kosinski compression)
BM16_Lev_1B:	BINCLUDE	"mappings/16x16/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1B main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1B:	BINCLUDE	"art/kosinski/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1B 128x128 block mappings (Kosinski compression)
BM128_Lev_1B:	BINCLUDE	"mappings/128x128/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1C 16x16 block mappings (Kosinski compression)
BM16_Lev_1C:	BINCLUDE	"mappings/16x16/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1C main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1C:	BINCLUDE	"art/kosinski/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1C 128x128 block mappings (Kosinski compression)
BM128_Lev_1C:	BINCLUDE	"mappings/128x128/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1D 16x16 block mappings (Kosinski compression)
BM16_Lev_1D:	BINCLUDE	"mappings/16x16/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1D main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1D:	BINCLUDE	"art/kosinski/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1D 128x128 block mappings (Kosinski compression)
BM128_Lev_1D:	BINCLUDE	"mappings/128x128/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1E 16x16 block mappings (Kosinski compression)
BM16_Lev_1E:	BINCLUDE	"mappings/16x16/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1E main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1E:	BINCLUDE	"art/kosinski/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1E 128x128 block mappings (Kosinski compression)
BM128_Lev_1E:	BINCLUDE	"mappings/128x128/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1F 16x16 block mappings (Kosinski compression)
BM16_Lev_1F:	BINCLUDE	"mappings/16x16/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_1F main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1F:	BINCLUDE	"art/kosinski/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_1F 128x128 block mappings (Kosinski compression)
BM128_Lev_1F:	BINCLUDE	"mappings/128x128/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_20 16x16 block mappings (Kosinski compression)
BM16_Lev_20:	BINCLUDE	"mappings/16x16/Lev_20.bin"
;-----------------------------------------------------------------------------------
; Lev_20 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_20:	BINCLUDE	"art/kosinski/Lev_20.bin"
;-----------------------------------------------------------------------------------
; Lev_20 128x128 block mappings (Kosinski compression)
BM128_Lev_20:	BINCLUDE	"mappings/128x128/Lev_20.bin"

Then add optional pattern supplements to suit your hack's needs.

Now find:

LevelArtPointers:
	levartptrs PLCID_Ehz1,     PLCID_Ehz2,      PalID_EHZ,  ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   0 ; EHZ  ; EMERALD HILL ZONE
	levartptrs PLCID_Miles1up, PLCID_MilesLife, PalID_EHZ2, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   1 ; LEV1 ; LEVEL 1 (UNUSED)
	levartptrs PLCID_Tails1up, PLCID_TailsLife, PalID_WZ,   ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   2 ; LEV2 ; LEVEL 2 (UNUSED)
	levartptrs PLCID_Unused1,  PLCID_Unused2,   PalID_EHZ3, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   3 ; LEV3 ; LEVEL 3 (UNUSED)
	levartptrs PLCID_Mtz1,     PLCID_Mtz2,      PalID_MTZ,  ArtKos_MTZ, BM16_MTZ, BM128_MTZ ;   4 ; MTZ  ; METROPOLIS ZONE ACTS 1 & 2
	levartptrs PLCID_Mtz1,     PLCID_Mtz2,      PalID_MTZ,  ArtKos_MTZ, BM16_MTZ, BM128_MTZ ;   5 ; MTZ3 ; METROPOLIS ZONE ACT 3
	levartptrs PLCID_Wfz1,     PLCID_Wfz2,      PalID_WFZ,  ArtKos_SCZ, BM16_WFZ, BM128_WFZ ;   6 ; WFZ  ; WING FORTRESS ZONE
	levartptrs PLCID_Htz1,     PLCID_Htz2,      PalID_HTZ,  ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   7 ; HTZ  ; HILL TOP ZONE
	levartptrs PLCID_Hpz1,     PLCID_Hpz2,      PalID_HPZ,  BM16_OOZ,   BM16_OOZ,  BM16_OOZ ;   8 ; HPZ  ; HIDDEN PALACE ZONE (UNUSED)
	levartptrs PLCID_Unused3,  PLCID_Unused4,   PalID_EHZ4, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ;   9 ; LEV9 ; LEVEL 9 (UNUSED)
	levartptrs PLCID_Ooz1,     PLCID_Ooz2,      PalID_OOZ,  ArtKos_OOZ, BM16_OOZ, BM128_OOZ ;  $A ; OOZ  ; OIL OCEAN ZONE
	levartptrs PLCID_Mcz1,     PLCID_Mcz2,      PalID_MCZ,  ArtKos_MCZ, BM16_MCZ, BM128_MCZ ;  $B ; MCZ  ; MYSTIC CAVE ZONE
	levartptrs PLCID_Cnz1,     PLCID_Cnz2,      PalID_CNZ,  ArtKos_CNZ, BM16_CNZ, BM128_CNZ ;  $C ; CNZ  ; CASINO NIGHT ZONE
	levartptrs PLCID_Cpz1,     PLCID_Cpz2,      PalID_CPZ,  ArtKos_CPZ, BM16_CPZ, BM128_CPZ ;  $D ; CPZ  ; CHEMICAL PLANT ZONE
	levartptrs PLCID_Dez1,     PLCID_Dez2,      PalID_DEZ,  ArtKos_CPZ, BM16_CPZ, BM128_CPZ ;  $E ; DEZ  ; DEATH EGG ZONE
	levartptrs PLCID_Arz1,     PLCID_Arz2,      PalID_ARZ,  ArtKos_ARZ, BM16_ARZ, BM128_ARZ ;  $F ; ARZ  ; AQUATIC RUIN ZONE
	levartptrs PLCID_Scz1,     PLCID_Scz2,      PalID_SCZ,  ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; $10 ; SCZ  ; SKY CHASE ZONE

then add this to the end:

	levartptrs   $26,  $27,  $15, ArtKos_Lev_11, BM16_Lev_11, BM128_Lev_11 ;   0 ; Lev_11  ; LEV_11 ZONE
	levartptrs   $28,  $29,  $16, ArtKos_Lev_12, BM16_Lev_12, BM128_Lev_12 ;   0 ; Lev_12  ; LEV_12 ZONE
	levartptrs   $2A,  $2B,  $17, ArtKos_Lev_13, BM16_Lev_13, BM128_Lev_13 ;   0 ; Lev_13  ; LEV_13 ZONE
	levartptrs   $2C,  $2D,  $18, ArtKos_Lev_14, BM16_Lev_14, BM128_Lev_14 ;   0 ; Lev_14  ; LEV_14 ZONE
	levartptrs   $2E,  $2F,  $19, ArtKos_Lev_15, BM16_Lev_15, BM128_Lev_15 ;   0 ; Lev_15  ; LEV_15 ZONE
	levartptrs   $30,  $31,  $1A, ArtKos_Lev_16, BM16_Lev_16, BM128_Lev_16 ;   0 ; Lev_16  ; LEV_16 ZONE
	levartptrs   $32,  $33,  $1B, ArtKos_Lev_17, BM16_Lev_17, BM128_Lev_17 ;   0 ; Lev_17  ; LEV_17 ZONE
	levartptrs   $34,  $35,  $1C, ArtKos_Lev_18, BM16_Lev_18, BM128_Lev_18 ;   0 ; Lev_18  ; LEV_18 ZONE
	levartptrs   $36,  $37,  $1D, ArtKos_Lev_19, BM16_Lev_19, BM128_Lev_19 ;   0 ; Lev_19  ; LEV_19 ZONE
	levartptrs   $38,  $39,  $1E, ArtKos_Lev_1A, BM16_Lev_1A, BM128_Lev_1A ;   0 ; Lev_1A  ; LEV_1A ZONE
	levartptrs   $3A,  $3B,  $1F, ArtKos_Lev_1B, BM16_Lev_1B, BM128_Lev_1B ;   0 ; Lev_1B  ; LEV_1B ZONE
	levartptrs   $3C,  $3D,  $20, ArtKos_Lev_1C, BM16_Lev_1C, BM128_Lev_1C ;   0 ; Lev_1C  ; LEV_1C ZONE
	levartptrs   $3E,  $3F,  $21, ArtKos_Lev_1D, BM16_Lev_1D, BM128_Lev_1D ;   0 ; Lev_1D  ; LEV_1D ZONE
	levartptrs   $40,  $41,  $22, ArtKos_Lev_1E, BM16_Lev_1E, BM128_Lev_1E ;   0 ; Lev_1E  ; LEV_1E ZONE
	levartptrs   $42,  $43,  $23, ArtKos_Lev_1F, BM16_Lev_1F, BM128_Lev_1F ;   0 ; Lev_1F  ; LEV_1F ZONE
	levartptrs   $44,  $45,  $24, ArtKos_Lev_20, BM16_Lev_20, BM128_Lev_20 ;   0 ; Lev_20  ; LEV_20 ZONE

After this is added, you possibly need to add loading queries to the texture load index. Create the .bin files and you're finished.

Extending level and tile layout indexes

Now you need to extend the layout index and we're done extending most level essentials.

Find:

Off_Level: zoneOrderedOffsetTable 2,2
	zoneOffsetTableEntry.w Level_EHZ1
	zoneOffsetTableEntry.w Level_EHZ2	; 1
	zoneOffsetTableEntry.w Level_EHZ1	; 2
	zoneOffsetTableEntry.w Level_EHZ1	; 3
	zoneOffsetTableEntry.w Level_EHZ1	; 4
	zoneOffsetTableEntry.w Level_EHZ1	; 5
	zoneOffsetTableEntry.w Level_EHZ1	; 6
	zoneOffsetTableEntry.w Level_EHZ1	; 7
	zoneOffsetTableEntry.w Level_MTZ1	; 8
	zoneOffsetTableEntry.w Level_MTZ2	; 9
	zoneOffsetTableEntry.w Level_MTZ3	; 10
	zoneOffsetTableEntry.w Level_MTZ3	; 11
	zoneOffsetTableEntry.w Level_WFZ	; 12
	zoneOffsetTableEntry.w Level_WFZ	; 13
	zoneOffsetTableEntry.w Level_HTZ1	; 14
	zoneOffsetTableEntry.w Level_HTZ2	; 15
	zoneOffsetTableEntry.w Level_OOZ1	; 16
	zoneOffsetTableEntry.w Level_OOZ1	; 17
	zoneOffsetTableEntry.w Level_EHZ1	; 18
	zoneOffsetTableEntry.w Level_EHZ1	; 19
	zoneOffsetTableEntry.w Level_OOZ1	; 20
	zoneOffsetTableEntry.w Level_OOZ2	; 21
	zoneOffsetTableEntry.w Level_MCZ1	; 22
	zoneOffsetTableEntry.w Level_MCZ2	; 23
	zoneOffsetTableEntry.w Level_CNZ1	; 24
	zoneOffsetTableEntry.w Level_CNZ2	; 25
	zoneOffsetTableEntry.w Level_CPZ1	; 26
	zoneOffsetTableEntry.w Level_CPZ2	; 27
	zoneOffsetTableEntry.w Level_DEZ	; 28
	zoneOffsetTableEntry.w Level_DEZ	; 29
	zoneOffsetTableEntry.w Level_ARZ1	; 30
	zoneOffsetTableEntry.w Level_ARZ2	; 31
	zoneOffsetTableEntry.w Level_SCZ	; 32
	zoneOffsetTableEntry.w Level_SCZ	; 33

and add this to the end:

	zoneOffsetTableEntry.w Level_Lev11_1
	zoneOffsetTableEntry.w Level_Lev11_2
	zoneOffsetTableEntry.w Level_Lev12_1
	zoneOffsetTableEntry.w Level_Lev12_2
	zoneOffsetTableEntry.w Level_Lev13_1
	zoneOffsetTableEntry.w Level_Lev13_2
	zoneOffsetTableEntry.w Level_Lev14_1
	zoneOffsetTableEntry.w Level_Lev14_2
	zoneOffsetTableEntry.w Level_Lev15_1
	zoneOffsetTableEntry.w Level_Lev15_2
	zoneOffsetTableEntry.w Level_Lev16_1
	zoneOffsetTableEntry.w Level_Lev16_2
	zoneOffsetTableEntry.w Level_Lev17_1
	zoneOffsetTableEntry.w Level_Lev17_2
	zoneOffsetTableEntry.w Level_Lev18_1
	zoneOffsetTableEntry.w Level_Lev18_2
	zoneOffsetTableEntry.w Level_Lev19_1
	zoneOffsetTableEntry.w Level_Lev19_2
	zoneOffsetTableEntry.w Level_Lev1A_1
	zoneOffsetTableEntry.w Level_Lev1A_2
	zoneOffsetTableEntry.w Level_Lev1B_1
	zoneOffsetTableEntry.w Level_Lev1B_2
	zoneOffsetTableEntry.w Level_Lev1C_1
	zoneOffsetTableEntry.w Level_Lev1C_2
	zoneOffsetTableEntry.w Level_Lev1D_1
	zoneOffsetTableEntry.w Level_Lev1D_2
	zoneOffsetTableEntry.w Level_Lev1E_1
	zoneOffsetTableEntry.w Level_Lev1E_2
	zoneOffsetTableEntry.w Level_Lev1F_1
	zoneOffsetTableEntry.w Level_Lev1F_2
	zoneOffsetTableEntry.w Level_Lev20_1
	zoneOffsetTableEntry.w Level_Lev20_2

Then find:

;---------------------------------------------------------------------------------------
; EHZ act 1 level layout (Kosinski compression)
Level_EHZ1:	BINCLUDE	"level/layout/EHZ_1.bin"
;---------------------------------------------------------------------------------------
; EHZ act 2 level layout (Kosinski compression)
Level_EHZ2:	BINCLUDE	"level/layout/EHZ_2.bin"
;---------------------------------------------------------------------------------------
; MTZ act 1 level layout (Kosinski compression)
Level_MTZ1:	BINCLUDE	"level/layout/MTZ_1.bin"
;---------------------------------------------------------------------------------------
; MTZ act 2 level layout (Kosinski compression)
Level_MTZ2:	BINCLUDE	"level/layout/MTZ_2.bin"
;---------------------------------------------------------------------------------------
; MTZ act 3 level layout (Kosinski compression)
Level_MTZ3:	BINCLUDE	"level/layout/MTZ_3.bin"
;---------------------------------------------------------------------------------------
; WFZ level layout (Kosinski compression)
Level_WFZ:	BINCLUDE	"level/layout/WFZ.bin"
;---------------------------------------------------------------------------------------
; HTZ act 1 level layout (Kosinski compression)
Level_HTZ1:	BINCLUDE	"level/layout/HTZ_1.bin"
;---------------------------------------------------------------------------------------
; HTZ act 2 level layout (Kosinski compression)
Level_HTZ2:	BINCLUDE	"level/layout/HTZ_2.bin"
;---------------------------------------------------------------------------------------
; OOZ act 1 level layout (Kosinski compression)
Level_OOZ1:	BINCLUDE	"level/layout/OOZ_1.bin"
;---------------------------------------------------------------------------------------
; OOZ act 2 level layout (Kosinski compression)
Level_OOZ2:	BINCLUDE	"level/layout/OOZ_2.bin"
;---------------------------------------------------------------------------------------
; MCZ act 1 level layout (Kosinski compression)
Level_MCZ1:	BINCLUDE	"level/layout/MCZ_1.bin"
;---------------------------------------------------------------------------------------
; MCZ act 2 level layout (Kosinski compression)
Level_MCZ2:	BINCLUDE	"level/layout/MCZ_2.bin"
;---------------------------------------------------------------------------------------
; CNZ act 1 level layout (Kosinski compression)
Level_CNZ1:	BINCLUDE	"level/layout/CNZ_1.bin"
;---------------------------------------------------------------------------------------
; CNZ act 2 level layout (Kosinski compression)
Level_CNZ2:	BINCLUDE	"level/layout/CNZ_2.bin"
;---------------------------------------------------------------------------------------
; CPZ act 1 level layout (Kosinski compression)
Level_CPZ1:	BINCLUDE	"level/layout/CPZ_1.bin"
;---------------------------------------------------------------------------------------
; CPZ act 2 level layout (Kosinski compression)
Level_CPZ2:	BINCLUDE	"level/layout/CPZ_2.bin"
;---------------------------------------------------------------------------------------
; DEZ level layout (Kosinski compression)
Level_DEZ:	BINCLUDE	"level/layout/DEZ.bin"
;---------------------------------------------------------------------------------------
; ARZ act 1 level layout (Kosinski compression)
Level_ARZ1:	BINCLUDE	"level/layout/ARZ_1.bin"
;---------------------------------------------------------------------------------------
; ARZ act 2 level layout (Kosinski compression)
Level_ARZ2:	BINCLUDE	"level/layout/ARZ_2.bin"
;---------------------------------------------------------------------------------------
; SCZ level layout (Kosinski compression)
Level_SCZ:	BINCLUDE	"level/layout/SCZ.bin"

then add this at the end:

;---------------------------------------------------------------------------------------
; Lev11 act 1 level layout (Kosinski compression)
Level_Lev11_1:	BINCLUDE	"level/layout/Lev11_1.bin"
;---------------------------------------------------------------------------------------
; Lev11 act 2 level layout (Kosinski compression)
Level_Lev11_2:	BINCLUDE	"level/layout/Lev11_2.bin"
;---------------------------------------------------------------------------------------
; Lev12_1 level layout (Kosinski compression)
Level_Lev12_1:	BINCLUDE	"level/layout/Lev12_1.bin"
;---------------------------------------------------------------------------------------
; Lev12_2 level layout (Kosinski compression)
Level_Lev12_1:	BINCLUDE	"level/layout/Lev12_2.bin"
;---------------------------------------------------------------------------------------
; Lev13_1 level layout (Kosinski compression)
Level_Lev13_1:	BINCLUDE	"level/layout/Lev13_1.bin"
;---------------------------------------------------------------------------------------
; Lev13_2 level layout (Kosinski compression)
Level_Lev13_2:	BINCLUDE	"level/layout/Lev13_2.bin"
;---------------------------------------------------------------------------------------
; Lev14_1 level layout (Kosinski compression)
Level_Lev14_1:	BINCLUDE	"level/layout/Lev14_1.bin"
;---------------------------------------------------------------------------------------
; Lev14_2 level layout (Kosinski compression)
Level_Lev14_2:	BINCLUDE	"level/layout/Lev14_2.bin"
;---------------------------------------------------------------------------------------
; Lev15_1 level layout (Kosinski compression)
Level_Lev15_1:	BINCLUDE	"level/layout/Lev15_1.bin"
;---------------------------------------------------------------------------------------
; Lev15_2 level layout (Kosinski compression)
Level_Lev15_2:	BINCLUDE	"level/layout/Lev15_2.bin"
;---------------------------------------------------------------------------------------
; Lev16_1 level layout (Kosinski compression)
Level_Lev16_1:	BINCLUDE	"level/layout/Lev16_1.bin"
;---------------------------------------------------------------------------------------
; Lev16_2 level layout (Kosinski compression)
Level_Lev16_2:	BINCLUDE	"level/layout/Lev16_2.bin"
;---------------------------------------------------------------------------------------
; Lev17_1 level layout (Kosinski compression)
Level_Lev17_1:	BINCLUDE	"level/layout/Lev17_1.bin"
;---------------------------------------------------------------------------------------
; Lev17_2 level layout (Kosinski compression)
Level_Lev17_2:	BINCLUDE	"level/layout/Lev17_2.bin"
;---------------------------------------------------------------------------------------
; Lev18_1 level layout (Kosinski compression)
Level_Lev18_1:	BINCLUDE	"level/layout/Lev18_1.bin"
;---------------------------------------------------------------------------------------
; Lev18_2 level layout (Kosinski compression)
Level_Lev18_2:	BINCLUDE	"level/layout/Lev18_2.bin"
;---------------------------------------------------------------------------------------
; Lev19_1 level layout (Kosinski compression)
Level_Lev19_1:	BINCLUDE	"level/layout/Lev19_1.bin"
;---------------------------------------------------------------------------------------
; Lev19_2 level layout (Kosinski compression)
Level_Lev19_2:	BINCLUDE	"level/layout/Lev19_2.bin"
;---------------------------------------------------------------------------------------
; Lev1A_1 level layout (Kosinski compression)
Level_Lev1A_1:	BINCLUDE	"level/layout/Lev1A_1.bin"
;---------------------------------------------------------------------------------------
; Lev1A_2 level layout (Kosinski compression)
Level_Lev1A_2:	BINCLUDE	"level/layout/Lev1A_2.bin"
;---------------------------------------------------------------------------------------
; Lev1B_1 level layout (Kosinski compression)
Level_Lev1B_1: BINCLUDE	"level/layout/Lev1B_1.bin"
;---------------------------------------------------------------------------------------
; Lev1B_2 level layout (Kosinski compression)
Level_Lev1B_2:	BINCLUDE	"level/layout/Lev1B_2.bin"
;---------------------------------------------------------------------------------------
; Lev1C_1 level layout (Kosinski compression)
Level_Lev1C_1:	BINCLUDE	"level/layout/Lev1C_1.bin"
;---------------------------------------------------------------------------------------
; Lev1C_2 level layout (Kosinski compression)
Level_Lev1C_2:	BINCLUDE	"level/layout/Lev1C_2.bin"
;---------------------------------------------------------------------------------------
; Lev1D_1 level layout (Kosinski compression)
Level_Lev1D_1:	BINCLUDE	"level/layout/Lev1D_1.bin"
;---------------------------------------------------------------------------------------
; Lev1D_2 level layout (Kosinski compression)
Level_Lev1D_2:	BINCLUDE	"level/layout/Lev1D_2.bin"
;---------------------------------------------------------------------------------------
; Lev1E_1 level layout (Kosinski compression)
Level_Lev1E_1:	BINCLUDE	"level/layout/Lev1E_1.bin"
;---------------------------------------------------------------------------------------
; Lev1E_2 level layout (Kosinski compression)
Level_Lev1E_2:	BINCLUDE	"level/layout/Lev1E_2.bin"
;---------------------------------------------------------------------------------------
; Lev1F_1 level layout (Kosinski compression)
Level_Lev1F_1:	BINCLUDE	"level/layout/Lev1F_1.bin"
;---------------------------------------------------------------------------------------
; Lev1F_2 level layout (Kosinski compression)
Level_Lev1F_2:	BINCLUDE	"level/layout/Lev1F_2.bin"
;---------------------------------------------------------------------------------------
; Lev20_1 level layout (Kosinski compression)
Level_Lev20_1:	BINCLUDE	"level/layout/Lev20_1.bin"
;---------------------------------------------------------------------------------------
; Lev20_2 level layout (Kosinski compression)
Level_Lev20_2:	BINCLUDE	"level/layout/Lev20_2.bin"

Now create the .bin files.

Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)

just being able to use sign posts in your new levels can be boring after a while, so we will make those changes so that we can put custom bosses in our new levels, actually extending the sprite pointer list is not within the scope of the tutorial, though highly recommended.

find:

; sub_4BD2:
SetLevelEndType:
	move.w	#0,(Level_Has_Signpost).w	; set level type to non-signpost
	tst.w	(Two_player_mode).w	; is it two-player competitive mode?
	bne.s	LevelEnd_SetSignpost	; if yes, branch
	nosignpost.w emerald_hill_zone_act_2
	nosignpost.w metropolis_zone_act_3
	nosignpost.w wing_fortress_zone_act_1
	nosignpost.w hill_top_zone_act_2
	nosignpost.w oil_ocean_zone_act_2
	nosignpost.s mystic_cave_zone_act_2
	nosignpost.s casino_night_zone_act_2
	nosignpost.s chemical_plant_zone_act_2
	nosignpost.s death_egg_zone_act_1
	nosignpost.s aquatic_ruin_zone_act_2
	nosignpost.s sky_chase_zone_act_1

we will change it to:

SetLevelEndType:
	move.w	#0,(Level_Has_Signpost).w	; set level type to non-signpost
	tst.w	(Two_player_mode).w	; is it two-player competitive mode?
	bne.w	LevelEnd_SetSignpost	; if yes, branch
	nosignpost.w emerald_hill_zone_act_2
	nosignpost.w metropolis_zone_act_3
	nosignpost.w wing_fortress_zone_act_1
	nosignpost.w hill_top_zone_act_2
	nosignpost.w oil_ocean_zone_act_2
	nosignpost.w mystic_cave_zone_act_2
	nosignpost.w casino_night_zone_act_2
	nosignpost.w chemical_plant_zone_act_2
	nosignpost.w death_egg_zone_act_1
	nosignpost.w aquatic_ruin_zone_act_2
	nosignpost.w sky_chase_zone_act_1
	nosignpost.w $1101
	nosignpost.w $1201
	nosignpost.w $1301
	nosignpost.w $1401
	nosignpost.w $1501
	nosignpost.w $1601
	nosignpost.s $1701
	nosignpost.s $1801
	nosignpost.s $1901
	nosignpost.s $1A01
	nosignpost.s $1B01
	nosignpost.s $1C01
	nosignpost.s $1D01
	nosignpost.s $1E01
	nosignpost.s $1F01
	nosignpost.s $2001

; loc_4C40:
LevelEnd_SetSignpost:
	move.w	#1,(Level_Has_Signpost).w	; set level type to signpost
+	rts

Extend Level Size Array

our levels need a size, right? This part of the guide gives us just that.

what we need to find is:

LevelSize: zoneOrderedTable 2,8	; WrdArr_LvlSize
	zoneTableEntry.w	$0,	$29A0,	$0,	$320	; EHZ act 1
	zoneTableEntry.w	$0,	$2940,	$0,	$420	; EHZ act 2
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $01
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $02
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $03
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$2280,	-$100,	$800	; MTZ act 1
	zoneTableEntry.w	$0,	$1E80,	-$100,	$800	; MTZ act 2
	zoneTableEntry.w	$0,	$2A80,	-$100,	$800	; MTZ act 3
	zoneTableEntry.w	$0,	$3FFF,	-$100,	$800
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; WFZ
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$2800,	$0,	$720	; HTZ act 1
	zoneTableEntry.w	$0,	$3280,	$0,	$720	; HTZ act 2
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $08
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $09
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$2F80,	$0,	$680	; OOZ act 1
	zoneTableEntry.w	$0,	$2D00,	$0,	$680	; OOZ act 2
	zoneTableEntry.w	$0,	$2380,	$3C0,	$720	; MCZ act 1
	zoneTableEntry.w	$0,	$3FFF,	$60,	$720	; MCZ act 2
	zoneTableEntry.w	$0,	$27A0,	$0,	$720	; CNZ act 1
	zoneTableEntry.w	$0,	$2A80,	$0,	$720	; CNZ act 2
	zoneTableEntry.w	$0,	$2780,	$0,	$720	; CPZ act 1
	zoneTableEntry.w	$0,	$2A80,	$0,	$720	; CPZ act 2
	zoneTableEntry.w	$0,	$1000,	$C8,	 $C8	; DEZ
	zoneTableEntry.w	$0,	$1000,  $C8,	 $C8
	zoneTableEntry.w	$0,	$28C0,	$200,	$600	; ARZ act 1
	zoneTableEntry.w	$0,	$3FFF,	$180,	$710	; ARZ act 2
	zoneTableEntry.w	$0,	$3FFF,	$0,	$000	; SCZ
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
    zoneTableEnd

and we will change it to:

LevelSize: zoneOrderedTable 2,8	; WrdArr_LvlSize
	zoneTableEntry.w	$0,	$29A0,	$0,	$320	; EHZ act 1
	zoneTableEntry.w	$0,	$2940,	$0,	$420	; EHZ act 2
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $01
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $02
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $03
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$2280,	-$100,	$800	; MTZ act 1
	zoneTableEntry.w	$0,	$1E80,	-$100,	$800	; MTZ act 2
	zoneTableEntry.w	$0,	$2A80,	-$100,	$800	; MTZ act 3
	zoneTableEntry.w	$0,	$3FFF,	-$100,	$800
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; WFZ
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$2800,	$0,	$720	; HTZ act 1
	zoneTableEntry.w	$0,	$3280,	$0,	$720	; HTZ act 2
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $08
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $09
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$2F80,	$0,	$680	; OOZ act 1
	zoneTableEntry.w	$0,	$2D00,	$0,	$680	; OOZ act 2
	zoneTableEntry.w	$0,	$2380,	$3C0,	$720	; MCZ act 1
	zoneTableEntry.w	$0,	$3FFF,	$60,	$720	; MCZ act 2
	zoneTableEntry.w	$0,	$27A0,	$0,	$720	; CNZ act 1
	zoneTableEntry.w	$0,	$2A80,	$0,	$720	; CNZ act 2
	zoneTableEntry.w	$0,	$2780,	$0,	$720	; CPZ act 1
	zoneTableEntry.w	$0,	$2A80,	$0,	$720	; CPZ act 2
	zoneTableEntry.w	$0,	$1000,	$C8,	 $C8	; DEZ
	zoneTableEntry.w	$0,	$1000,  $C8,	 $C8
	zoneTableEntry.w	$0,	$28C0,	$200,	$600	; ARZ act 1
	zoneTableEntry.w	$0,	$3FFF,	$180,	$710	; ARZ act 2
	zoneTableEntry.w	$0,	$3FFF,	$0,	$000	; SCZ
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $11 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $12 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $13 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $14 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $15 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $16 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $17 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $18 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $19 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $1A ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $1B ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $1C ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $1D ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $1E ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $1F ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720	; $20 ;one of our new levels (act 1)
	zoneTableEntry.w	$0,	$3FFF,	$0,	$720		;one of our new levels (act 2)
    zoneTableEnd

Extending the Start Location Index

Sonic has to start somewhere right?

Find this:

StartLocations: zoneOrderedTable 2,4	; WrdArr_StartLoc
	zoneTableBinEntry	2, "startpos/EHZ_1.bin"	; $00
	zoneTableBinEntry	2, "startpos/EHZ_2.bin"
	zoneTableEntry.w	$60,	$28F		; $01
	zoneTableEntry.w	$60,	$2AF
	zoneTableEntry.w	$60,	$1AC		; $02
	zoneTableEntry.w	$60,	$1AC
	zoneTableEntry.w	$60,	$28F		; $03
	zoneTableEntry.w	$60,	$2AF
	zoneTableBinEntry	2, "startpos/MTZ_1.bin"	; $04
	zoneTableBinEntry	2, "startpos/MTZ_2.bin"
	zoneTableBinEntry	2, "startpos/MTZ_3.bin"	; $05
	zoneTableEntry.w	$60,	$2AF
	zoneTableBinEntry	2, "startpos/WFZ.bin"	; $06
	zoneTableEntry.w	$1E0,	$4CC
	zoneTableBinEntry	2, "startpos/HTZ_1.bin"	; $07
	zoneTableBinEntry	2, "startpos/HTZ_2.bin"
	zoneTableEntry.w	$230,	$1AC		; $08
	zoneTableEntry.w	$230,	$1AC
	zoneTableEntry.w	$60,	$28F		; $09
	zoneTableEntry.w	$60,	$2AF
	zoneTableBinEntry	2, "startpos/OOZ_1.bin"	; $0A
	zoneTableBinEntry	2, "startpos/OOZ_2.bin"
	zoneTableBinEntry	2, "startpos/MCZ_1.bin"	; $0B
	zoneTableBinEntry	2, "startpos/MCZ_2.bin"
	zoneTableBinEntry	2, "startpos/CNZ_1.bin"	; $0C
	zoneTableBinEntry	2, "startpos/CNZ_2.bin"
	zoneTableBinEntry	2, "startpos/CPZ_1.bin"	; $0D
	zoneTableBinEntry	2, "startpos/CPZ_2.bin"
	zoneTableBinEntry	2, "startpos/DEZ.bin"	; $0E
	zoneTableEntry.w	$60,	$12D
	zoneTableBinEntry	2, "startpos/ARZ_1.bin"	; $0F
	zoneTableBinEntry	2, "startpos/ARZ_2.bin"
	zoneTableBinEntry	2, "startpos/SCZ.bin"	; $10
	zoneTableEntry.w	$140,	$70

then add this to the end:

	zoneTableEntry.w	0,	0	; $11
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $12
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $13
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $14
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $15
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $16
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $17
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $18
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $19
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $1A
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $1B
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $1C
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $1D
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $1E
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $1F
	zoneTableEntry.w	0,	0
	zoneTableEntry.w	0,	0	; $20
	zoneTableEntry.w	0,	0

then replace the 0s with the desired x and y co-ordinance.

Extending the Debug Mode Object List

Yes, we might want this too for when you are testing your level environment as well as to hide an easter egg for the player, so find:

JmpTbl_DbgObjLists: zoneOrderedOffsetTable 2,1
	zoneOffsetTableEntry.w DbgObjList_EHZ	; 0
	zoneOffsetTableEntry.w DbgObjList_Def	; 1
	zoneOffsetTableEntry.w DbgObjList_Def	; 2
	zoneOffsetTableEntry.w DbgObjList_Def	; 3
	zoneOffsetTableEntry.w DbgObjList_MTZ	; 4
	zoneOffsetTableEntry.w DbgObjList_MTZ	; 5
	zoneOffsetTableEntry.w DbgObjList_WFZ	; 6
	zoneOffsetTableEntry.w DbgObjList_HTZ	; 7
	zoneOffsetTableEntry.w DbgObjList_OOZ	; 8
	zoneOffsetTableEntry.w DbgObjList_Def	; 9
	zoneOffsetTableEntry.w DbgObjList_OOZ	; $A
	zoneOffsetTableEntry.w DbgObjList_MCZ	; $B
	zoneOffsetTableEntry.w DbgObjList_CNZ	; $C
	zoneOffsetTableEntry.w DbgObjList_CPZ	; $D
	zoneOffsetTableEntry.w DbgObjList_Def	; $E
	zoneOffsetTableEntry.w DbgObjList_ARZ	; $F
	zoneOffsetTableEntry.w DbgObjList_SCZ	; $10

and add these to the end of it:

	zoneOffsetTableEntry.w DbgObjList_Def	; $11
	zoneOffsetTableEntry.w DbgObjList_Def	; $12
	zoneOffsetTableEntry.w DbgObjList_Def	; $13
	zoneOffsetTableEntry.w DbgObjList_Def	; $14
	zoneOffsetTableEntry.w DbgObjList_Def	; $15
	zoneOffsetTableEntry.w DbgObjList_Def	; $16
	zoneOffsetTableEntry.w DbgObjList_Def	; $17
	zoneOffsetTableEntry.w DbgObjList_Def	; $18
	zoneOffsetTableEntry.w DbgObjList_Def	; $19
	zoneOffsetTableEntry.w DbgObjList_Def	; $1A
	zoneOffsetTableEntry.w DbgObjList_Def	; $1B
	zoneOffsetTableEntry.w DbgObjList_Def	; $1C
	zoneOffsetTableEntry.w DbgObjList_Def	; $1D
	zoneOffsetTableEntry.w DbgObjList_Def	; $1E
	zoneOffsetTableEntry.w DbgObjList_Def	; $1F
	zoneOffsetTableEntry.w DbgObjList_Def	; $20

Extending Initial Camera Index

Apparently, the Disassembly issues warinings if you don't extend this index, though, making new entries is insanely easy so this really isnt a problem, so find:

; off_C296:
InitCam_Index: zoneOrderedOffsetTable 2,1
	zoneOffsetTableEntry.w InitCam_EHZ
	zoneOffsetTableEntry.w InitCam_Null0	; 1
	zoneOffsetTableEntry.w InitCam_WZ	; 2
	zoneOffsetTableEntry.w InitCam_Null0	; 3
	zoneOffsetTableEntry.w InitCam_Std	; 4 MTZ
	zoneOffsetTableEntry.w InitCam_Std	; 5 MTZ3
	zoneOffsetTableEntry.w InitCam_Null1	; 6
	zoneOffsetTableEntry.w InitCam_HTZ	; 7
	zoneOffsetTableEntry.w InitCam_HPZ	; 8
	zoneOffsetTableEntry.w InitCam_Null2	; 9
	zoneOffsetTableEntry.w InitCam_OOZ	; 10
	zoneOffsetTableEntry.w InitCam_MCZ	; 11
	zoneOffsetTableEntry.w InitCam_CNZ	; 12
	zoneOffsetTableEntry.w InitCam_CPZ	; 13
	zoneOffsetTableEntry.w InitCam_Null3	; 14
	zoneOffsetTableEntry.w InitCam_ARZ	; 15
	zoneOffsetTableEntry.w InitCam_SCZ	; 16

and add these at the bottom:

	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std
	zoneOffsetTableEntry.w InitCam_Std

Extending the Software Scrolling Index

levels in a sonic game have a software scroll manager, so we need to add that to our new levels, so find:

SwScrl_Index: zoneOrderedOffsetTable 2,1	; JmpTbl_SwScrlMgr
	zoneOffsetTableEntry.w SwScrl_EHZ	; $00
	zoneOffsetTableEntry.w SwScrl_Minimal	; $01
	zoneOffsetTableEntry.w SwScrl_Lev2	; $02
	zoneOffsetTableEntry.w SwScrl_Minimal	; $03
	zoneOffsetTableEntry.w SwScrl_MTZ	; $04
	zoneOffsetTableEntry.w SwScrl_MTZ	; $05
	zoneOffsetTableEntry.w SwScrl_WFZ	; $06
	zoneOffsetTableEntry.w SwScrl_HTZ	; $07
	zoneOffsetTableEntry.w SwScrl_HPZ	; $08
	zoneOffsetTableEntry.w SwScrl_OOZ	; $0A
	zoneOffsetTableEntry.w SwScrl_MCZ	; $0B
	zoneOffsetTableEntry.w SwScrl_CNZ	; $0C
	zoneOffsetTableEntry.w SwScrl_CPZ	; $0D
	zoneOffsetTableEntry.w SwScrl_DEZ	; $0E
	zoneOffsetTableEntry.w SwScrl_ARZ	; $0F
	zoneOffsetTableEntry.w SwScrl_SCZ	; $10

and add these at the bottom:

	zoneOffsetTableEntry.w SwScrl_Minimal	; $11
	zoneOffsetTableEntry.w SwScrl_Minimal	; $12
	zoneOffsetTableEntry.w SwScrl_Minimal	; $13
	zoneOffsetTableEntry.w SwScrl_Minimal	; $14
	zoneOffsetTableEntry.w SwScrl_Minimal	; $15
	zoneOffsetTableEntry.w SwScrl_Minimal	; $16
	zoneOffsetTableEntry.w SwScrl_Minimal	; $17
	zoneOffsetTableEntry.w SwScrl_Minimal	; $18
	zoneOffsetTableEntry.w SwScrl_Minimal	; $19
	zoneOffsetTableEntry.w SwScrl_Minimal	; $1A
	zoneOffsetTableEntry.w SwScrl_Minimal	; $1B
	zoneOffsetTableEntry.w SwScrl_Minimal	; $1C
	zoneOffsetTableEntry.w SwScrl_Minimal	; $1D
	zoneOffsetTableEntry.w SwScrl_Minimal	; $1E
	zoneOffsetTableEntry.w SwScrl_Minimal	; $1F
	zoneOffsetTableEntry.w SwScrl_Minimal	; $20

Extending the Dynamic Level Event Index

The Dynamic Level Event Index points the zones to their scripts, which decide what happens, when, so lets find:

; off_E636:
DynamicLevelEventIndex: zoneOrderedOffsetTable 2,1
	zoneOffsetTableEntry.w LevEvents_EHZ	;   0 ; EHZ 
	zoneOffsetTableEntry.w LevEvents_001	;   1 ; LEV1
	zoneOffsetTableEntry.w LevEvents_002	;   2 ; LEV2
	zoneOffsetTableEntry.w LevEvents_003	;   3 ; LEV3
	zoneOffsetTableEntry.w LevEvents_MTZ	;   4 ; MTZ 
	zoneOffsetTableEntry.w LevEvents_MTZ3	;   5 ; MTZ3
	zoneOffsetTableEntry.w LevEvents_WFZ	;   6 ; WFZ 
	zoneOffsetTableEntry.w LevEvents_HTZ	;   7 ; HTZ 
	zoneOffsetTableEntry.w LevEvents_HPZ	;   8 ; HPZ 
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_OOZ	;  $A ; OOZ 
	zoneOffsetTableEntry.w LevEvents_MCZ	;  $B ; MCZ 
	zoneOffsetTableEntry.w LevEvents_CNZ	;  $C ; CNZ 
	zoneOffsetTableEntry.w LevEvents_CPZ	;  $D ; CPZ 
	zoneOffsetTableEntry.w LevEvents_DEZ	;  $E ; DEZ 
	zoneOffsetTableEntry.w LevEvents_ARZ	;  $F ; ARZ 
	zoneOffsetTableEntry.w LevEvents_SCZ	; $10 ; SCZ

and add these at the bottom:

	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9
	zoneOffsetTableEntry.w LevEvents_009	;   9 ; LEV9

I chose the entries from Lev09 because it is a good placeholder for until your wrote your own script for your new zones.

Extending the Animals

Whenever you destroy an enemy out pops an animal that hops or flies away, so likely if you don't extend this index, you will not get an animal, but likely a game crash instead, so find:

Obj28_ZoneAnimals:	zoneOrderedTable 1,2

zoneAnimals macro first,second
	zoneTableEntry.b (Obj28_Properties_first - Obj28_Properties) / 8
	zoneTableEntry.b (Obj28_Properties_second - Obj28_Properties) / 8
    endm
	; This table declares what animals will appear in the zone.
	; When an enemy is destroyed, a random animal is chosen from the 2 selected animals.
	; Note: you must also load the corresponding art in the PLCs.
	zoneAnimals.b Squirrel,	Bird	; EHZ
	zoneAnimals.b Squirrel,	Bird	; Zone 1
	zoneAnimals.b Squirrel,	Bird	; WZ
	zoneAnimals.b Squirrel,	Bird	; Zone 3
	zoneAnimals.b Beaver,	Eagle	; MTZ
	zoneAnimals.b Beaver,	Eagle	; MTZ
	zoneAnimals.b Beaver,	Eagle	; WFZ
	zoneAnimals.b Beaver,	Eagle	; HTZ
	zoneAnimals.b Mouse,	Seal	; HPZ
	zoneAnimals.b Mouse,	Seal	; Zone 9
	zoneAnimals.b Penguin,	Seal	; OOZ
	zoneAnimals.b Mouse,	Chicken	; MCZ
	zoneAnimals.b Bear,	Bird	; CNZ
	zoneAnimals.b Rabbit,	Eagle	; CPZ
	zoneAnimals.b Pig,	Chicken	; DEZ
	zoneAnimals.b Penguin,	Bird	; ARZ
	zoneAnimals.b Turtle,	Chicken	; SCZ

and add these at the bottom:

	zoneAnimals.b Squirrel,	Bird	; Zone 11
	zoneAnimals.b Squirrel,	Bird	; Zone 12
	zoneAnimals.b Squirrel,	Bird	; Zone 13
	zoneAnimals.b Squirrel,	Bird	; Zone 14
	zoneAnimals.b Squirrel,	Bird	; Zone 15
	zoneAnimals.b Squirrel,	Bird	; Zone 16
	zoneAnimals.b Squirrel,	Bird	; Zone 17
	zoneAnimals.b Squirrel,	Bird	; Zone 18
	zoneAnimals.b Squirrel,	Bird	; Zone 19
	zoneAnimals.b Squirrel,	Bird	; Zone 1A
	zoneAnimals.b Squirrel,	Bird	; Zone 1B
	zoneAnimals.b Squirrel,	Bird	; Zone 1C
	zoneAnimals.b Squirrel,	Bird	; Zone 1D
	zoneAnimals.b Squirrel,	Bird	; Zone 1E
	zoneAnimals.b Squirrel,	Bird	; Zone 1F
	zoneAnimals.b Squirrel,	Bird	; Zone 20

Change the animals to whatever you please, or add new ones by adding new custom mappings and extending this code:

		; This table declares the speed and mappings of each animal.
Rabbit:		obj28decl -$200,-$400,Obj28_MapUnc_11EAC
Chicken:	obj28decl -$200,-$300,Obj28_MapUnc_11E1C
Penguin:	obj28decl -$180,-$300,Obj28_MapUnc_11EAC
Seal:		obj28decl -$140,-$180,Obj28_MapUnc_11E88
Pig:		obj28decl -$1C0,-$300,Obj28_MapUnc_11E64
Bird:		obj28decl -$300,-$400,Obj28_MapUnc_11E1C
Squirrel:	obj28decl -$280,-$380,Obj28_MapUnc_11E40
Eagle:		obj28decl -$280,-$300,Obj28_MapUnc_11E1C
Mouse:		obj28decl -$200,-$380,Obj28_MapUnc_11E40
Beaver:		obj28decl -$2C0,-$300,Obj28_MapUnc_11E40
Turtle:		obj28decl -$140,-$200,Obj28_MapUnc_11E40
Bear:		obj28decl -$200,-$300,Obj28_MapUnc_11E40

	; The following tables tell the properties of animals based on their subtype.

; word_11950:
Obj28_Speeds:
	dc.w -$440, -$400
	dc.w -$440, -$400	; 2
	dc.w -$440, -$400	; 4
	dc.w -$300, -$400	; 6
	dc.w -$300, -$400	; 8
	dc.w -$180, -$300	; 10
	dc.w -$180, -$300	; 12
	dc.w -$140, -$180	; 14
	dc.w -$1C0, -$300	; 16
	dc.w -$200, -$300	; 18
	dc.w -$280, -$380	; 20
; off_1197C:
Obj28_Mappings:
	dc.l Obj28_MapUnc_11E1C
	dc.l Obj28_MapUnc_11E1C	; 1
	dc.l Obj28_MapUnc_11E1C	; 2
	dc.l Obj28_MapUnc_11EAC	; 3
	dc.l Obj28_MapUnc_11EAC	; 4
	dc.l Obj28_MapUnc_11EAC	; 5
	dc.l Obj28_MapUnc_11EAC	; 6
	dc.l Obj28_MapUnc_11E88	; 7
	dc.l Obj28_MapUnc_11E64	; 8
	dc.l Obj28_MapUnc_11E1C	; 9
	dc.l Obj28_MapUnc_11E40	; 10
; word_119A8:
Obj28_ArtLocations:
	dc.w  ArtTile_ArtNem_S1EndFlicky	;  0	Flicky
	dc.w  ArtTile_ArtNem_S1EndFlicky	;  1	Flicky
	dc.w  ArtTile_ArtNem_S1EndFlicky	;  2	Flicky
	dc.w  ArtTile_ArtNem_S1EndRabbit	;  3	Rabbit
	dc.w  ArtTile_ArtNem_S1EndRabbit	;  4	Rabbit
	dc.w  ArtTile_ArtNem_S1EndPenguin	;  5	Penguin
	dc.w  ArtTile_ArtNem_S1EndPenguin	;  6	Penguin
	dc.w  ArtTile_ArtNem_S1EndSeal		;  7	Seal
	dc.w  ArtTile_ArtNem_S1EndPig		;  8	Pig
	dc.w  ArtTile_ArtNem_S1EndChicken	;  9	Chicken
	dc.w  ArtTile_ArtNem_S1EndSquirrel	; 10	Squirrel

Now we need to determine the PLC that loads our animals now that our zones now have them, so find:

;byte_13F62:
Animal_PLCTable: zoneOrderedTable 1,1
	zoneTableEntry.b PLCID_EhzAnimals	; $0
	zoneTableEntry.b PLCID_EhzAnimals	; $1
	zoneTableEntry.b PLCID_EhzAnimals	; $2
	zoneTableEntry.b PLCID_EhzAnimals	; $3
	zoneTableEntry.b PLCID_MtzAnimals	; $4
	zoneTableEntry.b PLCID_MtzAnimals	; $5
	zoneTableEntry.b PLCID_WfzAnimals	; $6
	zoneTableEntry.b PLCID_HtzAnimals	; $7
	zoneTableEntry.b PLCID_HpzAnimals	; $8
	zoneTableEntry.b PLCID_HpzAnimals	; $9
	zoneTableEntry.b PLCID_OozAnimals	; $A
	zoneTableEntry.b PLCID_MczAnimals	; $B
	zoneTableEntry.b PLCID_CnzAnimals	; $C
	zoneTableEntry.b PLCID_CpzAnimals	; $D
	zoneTableEntry.b PLCID_DezAnimals	; $E
	zoneTableEntry.b PLCID_ArzAnimals	; $F
	zoneTableEntry.b PLCID_SczAnimals	; $10

and add these at the bottom:

	zoneTableEntry.b PLCID_EhzAnimals	; $11
	zoneTableEntry.b PLCID_EhzAnimals	; $12
	zoneTableEntry.b PLCID_EhzAnimals	; $13
	zoneTableEntry.b PLCID_EhzAnimals	; $14
	zoneTableEntry.b PLCID_EhzAnimals	; $15
	zoneTableEntry.b PLCID_EhzAnimals	; $16
	zoneTableEntry.b PLCID_EhzAnimals	; $17
	zoneTableEntry.b PLCID_EhzAnimals	; $18
	zoneTableEntry.b PLCID_EhzAnimals	; $19
	zoneTableEntry.b PLCID_EhzAnimals	; $1A
	zoneTableEntry.b PLCID_EhzAnimals	; $1B
	zoneTableEntry.b PLCID_EhzAnimals	; $1C
	zoneTableEntry.b PLCID_EhzAnimals	; $1D
	zoneTableEntry.b PLCID_EhzAnimals	; $1E
	zoneTableEntry.b PLCID_EhzAnimals	; $1F
	zoneTableEntry.b PLCID_EhzAnimals	; $20

Extending the Level Order

The game needs to know what order to play the zones in, not just know how big they are and where you start, right? so lets find:

LevelOrder: zoneOrderedTable 2,2	; WrdArr_LevelOrder
	zoneTableEntry.w  emerald_hill_zone_act_2
	zoneTableEntry.w  chemical_plant_zone_act_1	; 1
	zoneTableEntry.w  emerald_hill_zone_act_1	; 2
	zoneTableEntry.w  emerald_hill_zone_act_1	; 3
	zoneTableEntry.w  wood_zone_act_2		; 4
	zoneTableEntry.w  metropolis_zone_act_1		; 5
	zoneTableEntry.w  emerald_hill_zone_act_1	; 6
	zoneTableEntry.w  emerald_hill_zone_act_1	; 7
	zoneTableEntry.w  metropolis_zone_act_2		; 8
	zoneTableEntry.w  metropolis_zone_act_3		; 9
	zoneTableEntry.w  sky_chase_zone_act_1		; 10
	zoneTableEntry.w  emerald_hill_zone_act_1	; 11
	zoneTableEntry.w  death_egg_zone_act_1		; 12
	zoneTableEntry.w  emerald_hill_zone_act_1	; 13
	zoneTableEntry.w  hill_top_zone_act_2		; 14
	zoneTableEntry.w  mystic_cave_zone_act_1	; 15
	zoneTableEntry.w  hidden_palace_zone_act_2 	; 16
	zoneTableEntry.w  oil_ocean_zone_act_1		; 17
	zoneTableEntry.w  emerald_hill_zone_act_1	; 18
	zoneTableEntry.w  emerald_hill_zone_act_1	; 19
	zoneTableEntry.w  oil_ocean_zone_act_2		; 20
	zoneTableEntry.w  metropolis_zone_act_1		; 21
	zoneTableEntry.w  mystic_cave_zone_act_2	; 22
	zoneTableEntry.w  oil_ocean_zone_act_1		; 23
	zoneTableEntry.w  casino_night_zone_act_2	; 24
	zoneTableEntry.w  hill_top_zone_act_1		; 25
	zoneTableEntry.w  chemical_plant_zone_act_2	; 26
	zoneTableEntry.w  aquatic_ruin_zone_act_1	; 27
	zoneTableEntry.w  $FFFF				; 28
	zoneTableEntry.w  emerald_hill_zone_act_1	; 29
	zoneTableEntry.w  aquatic_ruin_zone_act_2	; 30
	zoneTableEntry.w  casino_night_zone_act_1	; 31
	zoneTableEntry.w  wing_fortress_zone_act_1 	; 32
	zoneTableEntry.w  emerald_hill_zone_act_1	; 33
    zoneTableEnd

;word_1433C:
LevelOrder_2P: zoneOrderedTable 2,2	; WrdArr_LevelOrder_2P
	zoneTableEntry.w  emerald_hill_zone_act_2
	zoneTableEntry.w  casino_night_zone_act_1	; 1
	zoneTableEntry.w  emerald_hill_zone_act_1	; 2
	zoneTableEntry.w  emerald_hill_zone_act_1	; 3
	zoneTableEntry.w  wood_zone_act_2		; 4
	zoneTableEntry.w  metropolis_zone_act_1		; 5
	zoneTableEntry.w  emerald_hill_zone_act_1	; 6
	zoneTableEntry.w  emerald_hill_zone_act_1	; 7
	zoneTableEntry.w  metropolis_zone_act_2		; 8
	zoneTableEntry.w  metropolis_zone_act_3		; 9
	zoneTableEntry.w  sky_chase_zone_act_1		; 10
	zoneTableEntry.w  emerald_hill_zone_act_1	; 11
	zoneTableEntry.w  death_egg_zone_act_1		; 12
	zoneTableEntry.w  emerald_hill_zone_act_1	; 13
	zoneTableEntry.w  hill_top_zone_act_2		; 14
	zoneTableEntry.w  mystic_cave_zone_act_1	; 15
	zoneTableEntry.w  hidden_palace_zone_act_2 	; 16
	zoneTableEntry.w  oil_ocean_zone_act_1		; 17
	zoneTableEntry.w  emerald_hill_zone_act_1	; 18
	zoneTableEntry.w  emerald_hill_zone_act_1	; 19
	zoneTableEntry.w  oil_ocean_zone_act_2		; 20
	zoneTableEntry.w  metropolis_zone_act_1		; 21
	zoneTableEntry.w  mystic_cave_zone_act_2	; 22
	zoneTableEntry.w  $FFFF				; 23
	zoneTableEntry.w  casino_night_zone_act_2	; 24
	zoneTableEntry.w  mystic_cave_zone_act_1	; 25
	zoneTableEntry.w  chemical_plant_zone_act_2 	; 26
	zoneTableEntry.w  aquatic_ruin_zone_act_1	; 27
	zoneTableEntry.w  $FFFF				; 28
	zoneTableEntry.w  emerald_hill_zone_act_1	; 29
	zoneTableEntry.w  aquatic_ruin_zone_act_2	; 30
	zoneTableEntry.w  casino_night_zone_act_1	; 31
	zoneTableEntry.w  wing_fortress_zone_act_1 	; 32
	zoneTableEntry.w  emerald_hill_zone_act_1	; 33
    zoneTableEnd

and add change them to read:

LevelOrder: zoneOrderedTable 2,2	; WrdArr_LevelOrder
	zoneTableEntry.w  emerald_hill_zone_act_2
	zoneTableEntry.w  chemical_plant_zone_act_1	; 1
	zoneTableEntry.w  emerald_hill_zone_act_1	; 2
	zoneTableEntry.w  emerald_hill_zone_act_1	; 3
	zoneTableEntry.w  wood_zone_act_2		; 4
	zoneTableEntry.w  metropolis_zone_act_1		; 5
	zoneTableEntry.w  emerald_hill_zone_act_1	; 6
	zoneTableEntry.w  emerald_hill_zone_act_1	; 7
	zoneTableEntry.w  metropolis_zone_act_2		; 8
	zoneTableEntry.w  metropolis_zone_act_3		; 9
	zoneTableEntry.w  sky_chase_zone_act_1		; 10
	zoneTableEntry.w  emerald_hill_zone_act_1	; 11
	zoneTableEntry.w  death_egg_zone_act_1		; 12
	zoneTableEntry.w  emerald_hill_zone_act_1	; 13
	zoneTableEntry.w  hill_top_zone_act_2		; 14
	zoneTableEntry.w  mystic_cave_zone_act_1	; 15
	zoneTableEntry.w  hidden_palace_zone_act_2 	; 16
	zoneTableEntry.w  oil_ocean_zone_act_1		; 17
	zoneTableEntry.w  emerald_hill_zone_act_1	; 18
	zoneTableEntry.w  emerald_hill_zone_act_1	; 19
	zoneTableEntry.w  oil_ocean_zone_act_2		; 20
	zoneTableEntry.w  metropolis_zone_act_1		; 21
	zoneTableEntry.w  mystic_cave_zone_act_2	; 22
	zoneTableEntry.w  oil_ocean_zone_act_1		; 23
	zoneTableEntry.w  casino_night_zone_act_2	; 24
	zoneTableEntry.w  hill_top_zone_act_1		; 25
	zoneTableEntry.w  chemical_plant_zone_act_2	; 26
	zoneTableEntry.w  aquatic_ruin_zone_act_1	; 27
	zoneTableEntry.w  $FFFF				; 28
	zoneTableEntry.w  emerald_hill_zone_act_1	; 29
	zoneTableEntry.w  aquatic_ruin_zone_act_2	; 30
	zoneTableEntry.w  casino_night_zone_act_1	; 31
	zoneTableEntry.w  wing_fortress_zone_act_1 	; 32
	zoneTableEntry.w  emerald_hill_zone_act_1	; 33
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
    zoneTableEnd

;word_1433C:
LevelOrder_2P: zoneOrderedTable 2,2	; WrdArr_LevelOrder_2P
	zoneTableEntry.w  emerald_hill_zone_act_2
	zoneTableEntry.w  casino_night_zone_act_1	; 1
	zoneTableEntry.w  emerald_hill_zone_act_1	; 2
	zoneTableEntry.w  emerald_hill_zone_act_1	; 3
	zoneTableEntry.w  wood_zone_act_2		; 4
	zoneTableEntry.w  metropolis_zone_act_1		; 5
	zoneTableEntry.w  emerald_hill_zone_act_1	; 6
	zoneTableEntry.w  emerald_hill_zone_act_1	; 7
	zoneTableEntry.w  metropolis_zone_act_2		; 8
	zoneTableEntry.w  metropolis_zone_act_3		; 9
	zoneTableEntry.w  sky_chase_zone_act_1		; 10
	zoneTableEntry.w  emerald_hill_zone_act_1	; 11
	zoneTableEntry.w  death_egg_zone_act_1		; 12
	zoneTableEntry.w  emerald_hill_zone_act_1	; 13
	zoneTableEntry.w  hill_top_zone_act_2		; 14
	zoneTableEntry.w  mystic_cave_zone_act_1	; 15
	zoneTableEntry.w  hidden_palace_zone_act_2 	; 16
	zoneTableEntry.w  oil_ocean_zone_act_1		; 17
	zoneTableEntry.w  emerald_hill_zone_act_1	; 18
	zoneTableEntry.w  emerald_hill_zone_act_1	; 19
	zoneTableEntry.w  oil_ocean_zone_act_2		; 20
	zoneTableEntry.w  metropolis_zone_act_1		; 21
	zoneTableEntry.w  mystic_cave_zone_act_2	; 22
	zoneTableEntry.w  $FFFF				; 23
	zoneTableEntry.w  casino_night_zone_act_2	; 24
	zoneTableEntry.w  mystic_cave_zone_act_1	; 25
	zoneTableEntry.w  chemical_plant_zone_act_2 	; 26
	zoneTableEntry.w  aquatic_ruin_zone_act_1	; 27
	zoneTableEntry.w  $FFFF				; 28
	zoneTableEntry.w  emerald_hill_zone_act_1	; 29
	zoneTableEntry.w  aquatic_ruin_zone_act_2	; 30
	zoneTableEntry.w  casino_night_zone_act_1	; 31
	zoneTableEntry.w  wing_fortress_zone_act_1 	; 32
	zoneTableEntry.w  emerald_hill_zone_act_1	; 33
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
	zoneTableEntry.w  emerald_hill_zone_act_1
    zoneTableEnd

Notes

All new .bin files need to be created in order for the ROM to build. If something doesn't load correctly (besides new animated patterns that you have just made by youself, only major things like ROM crashes) please don't hesitate to ask for help and/or get it working and edit this article. (Like the title cards being broken for levels past $10)

SCHG How-To Guide: Sonic the Hedgehog 2 (16-bit)
Fixing Bugs
Fix Demo Playback | Fix a Race Condition with Pattern Load Cues | Fix Super Sonic Bugs | Use Correct Height When Roll Jumping | Fix Jump Height Bug When Exiting Water | Fix Screen Boundary Spin Dash Bug | Correct Drowning Bugs | Fix Camera Y Position for Tails | Fix Tails Subanimation Error | Fix Tails' Respawn Speeds | Fix Accidental Deletion of Scattered Rings | Fix Ring Timers | Fix Rexon Crash | Fix Monitor Collision Bug | Fix EHZ Deformation Bug | Correct CPZ Boss Attack Behavior | Fix Bug in ARZ Boss Arrow's Platform Behavior | Fix ARZ Boss Walking on Air Glitch | Fix ARZ Boss Sprite Behavior | Fix Multiple CNZ Boss Bugs | Fix HTZ Background Scrolling Mountains | Fix OOZ Launcher Speed Up Glitch | Fix DEZ Giant Mech Collision Glitch | Fix Boss Deconstruction Behavior | Fix Speed Bugs | Fix 14 Continues Cheat | Fix Debug Mode Crash | Fix 99+ Lives | Fix Sonic 2's Sega Screen
Design Choices
Remove the Air Speed Cap | Disable Floor Collision While Dying | Modify Super Sonic Transformation Methods & Behavior | Enable/Disable Tails in Certain Levels | Collide with Water After Being Hurt | Retain Rings When Returning at a Star Post | Improve the Fade In\Fade Out Progression Routines | Fix Scattered Rings' Underwater Physics | Insert LZ Water Ripple Effect | Restore Lost CPZ Boss Feature | Prevent SCZ Tornado Spin Dash Death | Improve ObjectMove Subroutines | Port S3K Rings Manager | Port S3K Object Manager | Port S3K Priority Manager | Edit Level Order with ASM‎ | Alter Ring Requirements in Special Stages | Make Special Stage Characters Use Normal DPLCs | Speed Up Ring Loss Process | Change spike behaviour in Sonic 2
Adding Features
Create Insta-kill and High Jump Monitors | Create Clone and Special Stage Monitors | Port Knuckles
Sound Features
Expand Music Index to Start at $00 | Port Sonic 1 Sound Driver | Port Sonic 2 Clone Driver | Port Sonic 3 Sound Driver | Port Flamewing's Sonic 3 & Knuckles Sound Driver | Expand the Music Index to Start at $00 (Sonic 2 Clone Driver Version) | Play Different Songs Per Act
Extending the Game
Extend the Level Index Past $10 | Extend the Level Select | Extend Water Tables | Add Extra Characters | Free Up 2 Universal SSTs

|Extend the level index past $10 in Sonic 2]]