Actions

SCHG How-to

Extend the level index past $10 in Sonic 2

From Sonic Retro

Revision as of 18:09, 30 January 2009 by Schala (talk | contribs)

(Original guide by kram, current revision that fixes major bugs and extends properly by GARY 'M 9) (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.)

WARNING: Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you 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.

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.

Extending the Titlecard index

First we find:

<asm> Obj34_TitleCardData: dc.b 8, 0, $80, $1B dc.w $240, $120, $B8

dc.b $A, $11, $40, $1C dc.w $28, $148, $D0

dc.b $C, $12, $18, $1C dc.w $68, $188, $D0

dc.b 2, 0, 0, 0 dc.w 0, 0, 0

dc.b 4, $15, $48, 8 dc.w $2A8, $168,$120

dc.b 6, $16, 8, $15 dc.w $80, $F0, $F0 </asm>

and change it to: <asm> Obj34_TitleCardData: dc.b 8, 0, $80, $1B ; this is the zone string start index and placement dc.w $240, $120, $B8

dc.b $A, $21, $40, $1C ; "ZONE" string index number and placement dc.w $28, $148, $D0

dc.b $C, $22, $18, $1C ; act number start index and placement dc.w $68, $188, $D0

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 dc.w $2A8, $168,$120

dc.b 6, $26, 8, $15 ; red "Sonic The Hedgehog" string and placement dc.w $80, $F0, $F0 </asm>

next, find: <asm>

   jsr       sub_13D10(pc)
   move.b    (Current_Zone).w,d0
   cmpi.b    #$10,d0
   beq.s     BranchTo9_DeleteObject
   cmpi.b    #6,d0
   beq.s     BranchTo9_DeleteObject
   cmpi.b    #$E,d0
   beq.s     BranchTo9_DeleteObject
   move.b    (Current_Act).w,d1
   addi.b    #$12,d1
   cmpi.b    #5,d0
   bne.s     loc_13E18
   moveq     #$14,d1

</asm>

and change it to: <asm>

   jsr       sub_13D10(pc)
   move.b    (Current_Zone).w,d0
   cmpi.b    #$10,d0
   beq.s     BranchTo9_DeleteObject
   cmpi.b    #6,d0
   beq.s     BranchTo9_DeleteObject
   cmpi.b    #$E,d0
   beq.s     BranchTo9_DeleteObject
   move.b    (Current_Act).w,d1
   addi.b    #$22,d1                  ; Act number mappings (Act 1)
   cmpi.b    #5,d0
   bne.s     loc_13E18
   moveq     #$24,d1                  ; Act number mappings (Act 3).  Used for drawing MTZ (0x05) titlecard only

</asm>

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.

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: <asm>

loc_157D2

LoadTitleCard: bsr.s LoadTitleCard0 moveq #0,d0 move.b (Current_Zone).w,d0 move.b byte_15820(pc,d0.w),d0 lea word_15832(pc),a0 lea (a0,d0.w),a0 move.l #$7BC00002,d0 </asm>

and we want to replace it with: <asm>

loc_157D2

LoadTitleCard: bsr.s LoadTitleCard0 moveq #0,d0 move.b (Current_Zone).w,d0 add.w d0,d0 move.w Off_Titlecardtext(pc,d0.w),d0 lea Off_Titlecardtext(pc,d0.w),a0 move.l #$7BC00002,d0 </asm>

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

find: <asm>

unknown

byte_15820: dc.b 0, 0, 0, 0,$10,$10,$98,$20,$2C, 0,$3C,$46,$58,$68,$A8,$7A dc.b $8A, 0 ; 16

unknown

word_15832: dc.w $2A06,$3804, 4,$2604, $C04,$1804,$1C02,$FFFF dc.w $2A06,$4004,$3804,$3004,$2604,$1C02,$3C04,$FFFF; 8 dc.w $1804,$1C02,$2604,$4004,$3004,$FFFF,$1804,$1C02; 16 dc.w $C04,$3004, 4,$2604, $804,$FFFF,$1C02,$2604; 24 dc.w $804, 4,$FFFF,$2A06,$5604,$3C04,$4004,$1C02; 32 dc.w $804, 4,$4804,$FFFF, $804, 4,$3C04,$1C02; 40 dc.w $1404,$1804,$4004,$FFFF, $804,$1804,$2A06,$1C02; 48 dc.w 4,$2604,$3004,$4004,$FFFF, 4,$3404,$4404; 56 dc.w $4004,$1C02, $804,$3804,$FFFF,$3C04,$2204,$5604; 64 dc.w $804,$1804, 4,$FFFF,$4C06,$1C02,$1404,$1004; 72 dc.w $3804,$4004,$3C04,$FFFF, $C04, 4,$4004,$1804; 80 dc.w $1404,$FFFF ; 88 </asm>

and replace it with: <asm>

byte_15820

Off_Titlecardtext: dc.w Text_EHZ-Off_Titlecardtext ; EHZ Titlecard 00 dc.w Text_LZ-Off_Titlecardtext  ; LZ Titlecard 01 dc.w Text_WZ-Off_Titlecardtext  ; WZ Titlecard 02 dc.w Text_DHZ-Off_Titlecardtext ; DHZ Titlecard 03 dc.w Text_MTZ-Off_Titlecardtext ; MTZ Titlecard 04 dc.w Text_MTZ-Off_Titlecardtext ; MTZ Titlecard 05 dc.w Text_WFZ-Off_Titlecardtext ; WFZ Titlecard 06 dc.w Text_HTZ-Off_Titlecardtext ; HTZ Titlecard 07 dc.w Text_HPZ-Off_Titlecardtext ; HPZ Titlecard 08 dc.w Text_GCZ-Off_Titlecardtext ; GCZ Titlecard 09 dc.w Text_OOZ-Off_Titlecardtext ; OOZ Titlecard 0A dc.w Text_MCZ-Off_Titlecardtext ; MCZ Titlecard 0B dc.w Text_CNZ-Off_Titlecardtext ; CNZ Titlecard 0C dc.w Text_CPZ-Off_Titlecardtext ; CPZ Titlecard 0D dc.w Text_DEZ-Off_Titlecardtext ; DEZ Titlecard 0E dc.w Text_ARZ-Off_Titlecardtext ; ARZ Titlecard 0F dc.w Text_SCZ-Off_Titlecardtext ; SCZ Titlecard 10 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 11 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 12 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 13 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 14 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 15 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 16 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 17 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 18 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 19 dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1A dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1B dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1C dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1D dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1E dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 1F dc.w Text_NZ-Off_Titlecardtext  ; NZ Titlecard 20

word_15832

Text_EHZ: dc.b $2A,$38,$00,$26,$0C,$18,$1C ; 'MRALDHI' dc.w $FFFF ; '<EOF>' Text_LZ: dc.b $26,$00,$04,$56,$38,$1C,$40,$18 ; 'LABYRITH' dc.w $FFFF ; '<EOF>' Text_WZ: dc.b $4C,$0C ; 'WD' dc.w $FFFF ; '<EOF>' Text_DHZ: dc.b $0C,$44,$3C,$40,$18,$1C,$26 ; 'DUSTHIL' dc.w $FFFF ; '<EOF>' Text_MTZ: dc.b $2A,$40,$38,$30,$26,$1C,$3C ; 'MTRPLIS' dc.w $FFFF ; '<EOF>' Text_WFZ: dc.b $4C,$1C,$14,$10,$38,$40,$3C ; 'WIGFRTS' dc.w $FFFF ; '<EOF>' Text_HTZ: dc.b $18,$1C,$26,$40,$30 ; 'HILTP' dc.w $FFFF ; '<EOF>' Text_HPZ: dc.b $18,$1C,$0C,$30,$00,$26,$08 ; 'HIDPALCE' dc.w $FFFF ; '<EOF>' Text_GCZ: dc.b $14,$08,$1C,$0C,$40,$56 ; 'GCIDTY' dc.w $FFFF ; '<EOF>' Text_OOZ: dc.b $1C,$26,$08,$00 ; 'ILCAN' dc.w $FFFF ; '<EOF>' Text_MCZ: dc.b $2A,$56,$3C,$40,$1C,$08,$00,$48 ; 'MYSTICAV' dc.w $FFFF ; '<EOF>' Text_CNZ: dc.b $08,$00,$3C,$1C,$14,$18,$40 ; 'CASIGHT' 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.

find: <asm>

-------------------------------------------------------------------------------
sprite mappings
-------------------------------------------------------------------------------

Obj34_MapUnc_147BA: BINCLUDE "mappings/sprite/obj34.bin"

-------------------------------------------------------------------------------

</asm>

and replace it with: <asm>

-------------------------------------------------------------------------------
sprite mappings
-------------------------------------------------------------------------------

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

Titlecard_EHZ: dc.w $b ; number of letters dc.w $0005, $8580, $82C0, $FFC0 ;E dc.w $0009, $85DE, $82EF, $FFD0 ;M dc.w $0005, $8580, $82C0, $FFE8 ;E dc.w $0005, $85E4, $82F2, $FFF8 ;R dc.w $0005, $85E8, $82F4, $0008 ;A dc.w $0005, $85EC, $82F6, $0018 ;L dc.w $0005, $85F0, $82F8, $0028 ;D

dc.w $0005, $85F4, $82FA, $0048 ;H 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 dc.w $0005, $85DE, $82EF, $FFE8 ;L dc.w $0005, $85E2, $82F1, $FFF8 ;A 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 dc.w $0009, $85DE, $82EF, $0008 ;W dc.w $0005, $8588, $82C4, $0010 ;O dc.w $0005, $8588, $82C4, $0020 ;O dc.w $0005, $85E4, $82F2, $0030 ;D


Titlecard_DHZ: dc.w $8 ; number of letters 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 dc.w $0001, $85F2, $82F9, $0048 ;I dc.w $0005, $85F4, $82FA, $0050 ;L dc.w $0005, $85F4, $82FA, $0060 ;L

Titlecard_MTZ: dc.w $a ; number of letters dc.w $0009, $85DE, $82EF, $FFE8 ;M dc.w $0005, $8580, $82C0, $FFF8 ;E dc.w $0005, $85E4, $82F2, $0008 ;T dc.w $0005, $85E8, $82F4, $0018 ;R 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 dc.w $0009, $85DE, $82EF, $FFB0 ;W dc.w $0001, $85E4, $82F2, $FFC8 ;I dc.w $0005, $8584, $82C2, $FFD0 ;N dc.w $0005, $85E6, $82F3, $FFE0 ;G

dc.w $0005, $85EA, $82F5, $0000 ;F dc.w $0005, $8588, $82C4, $0010 ;O 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 dc.w $0005, $85DE, $82EF, $0008 ;H 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 dc.w $0005, $8588, $82C4, $0060 ;O dc.w $0005, $85EC, $82F6, $0070 ;P

Titlecard_HPZ: dc.w $c ; number of letters 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 dc.w $0005, $85EC, $82F6, $0030 ;A dc.w $0005, $85F0, $82F8, $0040 ;L 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 dc.w $0005, $85DE, $82EF, $FFB8 ;G dc.w $0005, $8580, $82C0, $FFC8 ;E dc.w $0005, $8584, $82C2, $FFD8 ;N 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 dc.w $0001, $85E6, $82F3, $0050 ;I dc.w $0005, $85EC, $82F6, $0058 ;T dc.w $0005, $85F0, $82F8, $0068 ;Y

Titlecard_OOZ: dc.w $8 ; number of letters 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 dc.w $0005, $85E4, $82F2, $0040 ;C 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 dc.w $0009, $85DE, $82EF, $FFD0 ;M dc.w $0005, $85E4, $82F2, $FFE8 ;Y dc.w $0005, $85E8, $82F4, $FFF8 ;S dc.w $0005, $85EC, $82F6, $0008 ;T dc.w $0001, $85F0, $82F8, $0018 ;I dc.w $0005, $85F2, $82F9, $0020 ;C

dc.w $0005, $85F2, $82F9, $0040 ;C dc.w $0005, $85F6, $82FB, $0050 ;A dc.w $0005, $85FA, $82FD, $0060 ;V dc.w $0005, $8580, $82C0, $0070 ;E

Titlecard_CNZ: dc.w $b ; number of letters dc.w $0005, $85DE, $82EF, $FFD0 ;C 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 dc.w $0001, $85EA, $82F5, $0048 ;I 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 dc.w $0005, $85DE, $82EF, $FFA0 ;C 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 dc.w $0005, $85F2, $82F9, $0040 ;L 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 dc.w $0005, $85DE, $82EF, $FFF0 ;D 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 dc.w $0005, $85EE, $82F7, $0060 ;G dc.w $0005, $85EE, $82F7, $0070 ;G

Titlecard_ARZ: dc.w $c ; number of letters dc.w $0005, $85DE, $82EF, $FFD0 ;A 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 dc.w $0005, $85E6, $82F3, $0058 ;U dc.w $0001, $85EE, $82F7, $0068 ;I dc.w $0005, $8584, $82C2, $0070 ;N

Titlecard_SCZ: dc.w $8 ; number of letters dc.w $0005, $85DE, $82EF, $FFF0 ;S dc.w $0005, $85E2, $82F1, $0000 ;K dc.w $0005, $85E6, $82F3, $0010 ;Y

dc.w $0005, $85EA, $82F5, $0030 ;C dc.w $0005, $85EE, $82F7, $0040 ;H 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 dc.w $0005, $8584, $82C2, $0048 ;N dc.w $0005, $8580, $82C0, $0058 ;E dc.w $0009, $85DE, $82EF, $0068 ;W

T_ZONE: dc.w $4 ; number of letters dc.w $0005, $858C, $82C6, $0000 ;Z dc.w $0005, $8588, $82C4, $0010 ;O dc.w $0005, $8584, $82C2, $0020 ;N dc.w $0005, $8580, $82C0, $0030 ;E


T_ACT1: dc.w $1 ; number of letters dc.w $0007, $A590, $A2C8, $0000 ;1

T_ACT2: dc.w $1 ; number of letters dc.w $000B, $A598, $A2CC, $0000 ;2

T_ACT3: dc.w $1 ; number of letters dc.w $000B, $A5A4, $A2D2, $0000 ;3

T_STH: dc.w $5 ; number of letters dc.w $000D, $85B0, $82DE, $FFB8 ;SONI 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 dc.w $9003, $85D4, $82EA, $0000 ;> 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 ;>

-------------------------------------------------------------------------------

</asm>

Extending the cycling palette information

Now we want to locate: <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: <asm>

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.

Extending the static palette list

Next we locate: <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

----------------------------------------------------------------------------

Pal_SEGA: BINCLUDE "art/palettes/Sega screen.bin" ; SEGA screen palette (Sonic and initial background) 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: <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 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

----------------------------------------------------------------------------

Pal_SEGA: BINCLUDE "art/palettes/Sega screen.bin" ; SEGA screen palette (Sonic and initial background) 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.

Extending Zone Procedures and Scripts

Now we need to add the zone scripts.

Find: <asm> PLC_DYNANM: ; Zone ID dc.w Dynamic_Normal-PLC_DYNANM ; $00 dc.w Animated_EHZ-PLC_DYNANM

dc.w Dynamic_Null-PLC_DYNANM ; $01 dc.w Animated_Null-PLC_DYNANM

dc.w Dynamic_Null-PLC_DYNANM ; $02 dc.w Animated_Null-PLC_DYNANM

dc.w Dynamic_Null-PLC_DYNANM ; $03 dc.w Animated_Null-PLC_DYNANM

dc.w Dynamic_Normal-PLC_DYNANM ; $04 dc.w Animated_MTZ-PLC_DYNANM

dc.w Dynamic_Normal-PLC_DYNANM ; $05 dc.w Animated_MTZ-PLC_DYNANM

dc.w Dynamic_Null-PLC_DYNANM ; $06 dc.w Animated_Null-PLC_DYNANM

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 dc.w Animated_Null-PLC_DYNANM

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 dc.w Animated_CNZ-PLC_DYNANM

dc.w Dynamic_Normal-PLC_DYNANM ; $0D dc.w Animated_CPZ-PLC_DYNANM

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 dc.w Animated_Null-PLC_DYNANM ; yes, level $11 </asm>

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 dc.w Animated_Null-PLC_DYNANM

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 dc.w Animated_Null-PLC_DYNANM

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 dc.w Animated_Null-PLC_DYNANM

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 dc.w Animated_Null-PLC_DYNANM

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 dc.w Animated_Null-PLC_DYNANM </asm>

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 <asm> 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 dc.w APM_Null - AnimPatMaps </asm>

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

byte_40372

APM16_EHZ: BINCLUDE "mappings/16x16/AnimEHZ.bin"

byte_403EE

APM16_MTZ: BINCLUDE "mappings/16x16/AnimMTZ.bin"

byte_404C2

APM_HPZ: BINCLUDE "mappings/16x16/AnimHPZ.bin"

byte_405B6

APM_OOZ: BINCLUDE "mappings/16x16/AnimOOZ.bin"

byte_4061A

APM_CNZ: BINCLUDE "mappings/16x16/AnimCNZ.bin"

byte_406BE

APM_CNZ2P: BINCLUDE "mappings/16x16/AnimCNZ2P.bin"

byte_40762

APM_CPZ: BINCLUDE "mappings/16x16/AnimCPZ.bin"

byte_4076E

APM_DEZ: BINCLUDE "mappings/16x16/AnimDEZ.bin"

byte_4077A

APM_ARZ: BINCLUDE "mappings/16x16/AnimARZ.bin"

byte_407BE

APM_Null: dc.w 0 </asm>

and then possibly create the nessisary load queries for them. (If so, you need to know what you're doing here.)

Extending the 1 Player and 2 Player music playlists

next we find: <asm>

loc_40AE

Level_GetBgm: tst.w (Demo_mode_flag).w bmi.s loc_4114 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 </asm>

and replace it with: <asm>

loc_40AE

Level_GetBgm: tst.w (Demo_mode_flag).w bmi.s loc_4114 moveq #0,d0 move.b (Current_Zone).w,d0 lea MusicList(pc),a1 tst.w (Two_player_mode).w beq.s Level_PlayBgm jsr Level_2PlayerBGMList </asm>


now we want to find: <asm>

----------------------------------------------------------------------------
1P Music Playlist
----------------------------------------------------------------------------
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: <asm>

----------------------------------------------------------------------------
2P Music Playlist
----------------------------------------------------------------------------
byte_3EB2

MusicList2: dc.b $C+$80 ; 00  ; EHZ 2P dc.b 2+$80 ; 01 dc.b 5+$80 ; 02 dc.b 4+$80 ; 03 dc.b 5+$80 ; 04 dc.b 5+$80 ; 05 dc.b $F+$80 ; 06 dc.b 6+$80 ; 07 dc.b $10+$80 ; 08 dc.b $D+$80 ; 09 dc.b 4+$80 ; 0A dc.b 3+$80 ; 0B ; MCZ 2P dc.b 8+$80 ; 0C ; CNZ 2P dc.b $E+$80 ; 0D dc.b $A+$80 ; 0E dc.b 7+$80 ; 0F dc.b $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: lea MusicList2(pc),a1 rts

----------------------------------------------------------------------------
1P Music Playlist
----------------------------------------------------------------------------
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: <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: <asm> loc_4114: moveq #3,d0 bsr.w PalLoad1 ; load Sonic's palette line bsr.w LevelSizeLoad bsr.w JmpTo_DeformBgLayer clr.w (Vscroll_Factor).w move.w #-$E0,($FFFFF61E).w

clearRAM Horiz_Scroll_Buf,$400

bsr.w sub_4E98 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: <asm> loc_4114: moveq #3,d0 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

bsr.w sub_4E98 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

JmpTo_LevelSizeLoad: jmp LevelSizeLoad </asm>

Now we find: <asm> sub_9EF4: tst.b ($FFFFF660).w beq.w return_A0BE bsr.w Pal_FadeFrom lea (VDP_control_port).l,a6 move.w #$8004,(a6) move.w #$8230,(a6) 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>

and change it to: <asm> JmpTo_Pal_FadeFrom: jmp Pal_FadeFrom

sub_9EF4: tst.b ($FFFFF660).w beq.w return_A0BE bsr.w JmpTo_Pal_FadeFrom lea (VDP_control_port).l,a6 move.w #$8004,(a6) move.w #$8230,(a6) 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: <asm> loc_9FE6: 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: <asm> loc_9FE6: bsr.w JmpTo_ClearScreen bsr.w sub_B262 bsr.w JmpTo_Pal_FadeTo move.w #$18E,d0 btst #6,(Graphics_Flags).w beq.s loc_A002 move.w #$144,d0 jmp loc_A002

JmpTo_Pal_FadeTo: jmp Pal_FadeTo </asm>

now we want to find: <asm> loc_A002: 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: <asm> loc_A002: 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: <asm> bcs.s Obj17_Main moveq #0,d6

loc_10372

Obj17_MakeHelix: bsr.w SingleObjLoad2 </asm>

and change it to: <asm> bcs.s JumpTo_Obj17_Main moveq #0,d6 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: <asm> loc_A6C6: 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: <asm> loc_A6C6: 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 </asm>

and replace it with: <asm> loc_A70C: jmp loc2_A70C </asm>

Now find: <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: <asm> loc_285D2: moveq #7,d1 moveq #0,d4 jmp loc2_285D2 </asm>

Then find: <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: <asm> loc_286A2: move.w d1,objoff_36(a0) add.w objoff_34(a0),d1 jmp loc2_286A2 </asm>

Now add this to the end of your ROM: <asm>

===========================================================================

loc2_A5A6: 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

===========================================================================

byte_A748: 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

===========================================================================

word_A766: dc.w $C0 dc.w $90 ; 1 dc.w $B0 ; 2 dc.w $91 ; 3 dc.w $A8 ; 4 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: 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 JmpTo_loc_285F4

JmpTo_loc_285F4 jmp loc_285F4

===========================================================================

loc2_286A2 lea byte_28726(pc,d1.w),a1 ; addressing not needed 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)

===========================================================================

byte_28726: dc.b 0,$B8, 0,$32,$CE, 4,$48, 0, 8,$32,$32, $C, 0,$48,$10,$CE; 16 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 dc.b $19,$BC, 2,$46,$E9, 6,$46,$17, $A,$19,$44, $E,$E7,$44,$12,$BA; 64 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

===========================================================================

</asm>

Then delete any index pasted here to prevent a double defined error while building.

Extending the demo list

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

find: <asm>; off_4948: DemoScriptPointers: dc.l Demo_EHZ ; $00 dc.l Demo_EHZ ; $01 dc.l Demo_EHZ ; $02 dc.l Demo_EHZ ; $03 dc.l Demo_EHZ ; $04 dc.l Demo_EHZ ; $05 dc.l Demo_EHZ ; $06 dc.l Demo_EHZ ; $07 dc.l Demo_EHZ ; $08 dc.l Demo_EHZ ; $09 dc.l Demo_EHZ ; $0A dc.l Demo_EHZ ; $0B dc.l Demo_CNZ ; $0C dc.l Demo_CPZ ; $0D dc.l Demo_EHZ ; $0E dc.l Demo_ARZ ; $0F dc.l Demo_EHZ ; $10 </asm>

and insert after it: <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

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.

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: <asm> 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 </asm>

and replace it with: <asm> 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 jsr LoadSecondaryCollisionIndexes </asm>

Then go to the end of the ROM and add the following: <asm> LoadSecondaryCollisionIndexes: movea.l Off_ColS(pc,d0.w),a0 lea (Secondary_Collision).w,a1 bra.w JmpTo3_KosDec

JmpTo3_KosDec: jmp KosDec </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> and we will insert the new collision entries after that as follows: <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)

ColS_Lev11: BINCLUDE "collision/Lev11 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev12: BINCLUDE "collision/Lev12 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev12: BINCLUDE "collision/Lev12 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev13: BINCLUDE "collision/Lev13 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev13: BINCLUDE "collision/Lev13 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev14: BINCLUDE "collision/Lev14 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev14: BINCLUDE "collision/Lev14 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev15: BINCLUDE "collision/Lev15 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev15: BINCLUDE "collision/Lev15 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev16: BINCLUDE "collision/Lev16 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev16: BINCLUDE "collision/Lev16 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev17: BINCLUDE "collision/Lev17 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev17: BINCLUDE "collision/Lev17 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev18: BINCLUDE "collision/Lev18 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev18: BINCLUDE "collision/Lev18 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev19: BINCLUDE "collision/Lev19 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev19: BINCLUDE "collision/Lev19 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev1A: BINCLUDE "collision/Lev1A primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev1A: BINCLUDE "collision/Lev1A secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev1B: BINCLUDE "collision/Lev1B primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev1B: BINCLUDE "collision/Lev1B secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev1C: BINCLUDE "collision/Lev1C primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev1C: BINCLUDE "collision/Lev1C secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev1D: BINCLUDE "collision/Lev1D primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev1D: BINCLUDE "collision/Lev1D secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev1E: BINCLUDE "collision/Lev1E primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev1E: BINCLUDE "collision/Lev1E secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev1F: BINCLUDE "collision/Lev1F primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev1F: BINCLUDE "collision/Lev1F secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level primary 16x16 collision index (Kozinski compression)

ColP_Lev20: BINCLUDE "collision/Lev20 primary 16x16 collision index.bin"

---------------------------------------------------------------------------------------
new level secondary 16x16 collision index (Kozinski compression)

ColS_Lev20: BINCLUDE "collision/Lev20 secondary 16x16 collision index.bin"

---------------------------------------------------------------------------------------

</asm>

Extending Rings Index

Now we add rings to our new levels.

Find: <asm> Off_Rings: dc.w Rings_EHZ_1 - Off_Rings ; 0 $00 dc.w Rings_EHZ_2 - Off_Rings ; 1 dc.w Rings_Lev1_1 - Off_Rings ; 2 $01 dc.w Rings_Lev1_2 - Off_Rings ; 3 dc.w Rings_Lev2_1 - Off_Rings ; 4 $02 dc.w Rings_Lev2_2 - Off_Rings ; 5 dc.w Rings_Lev3_1 - Off_Rings ; 6 $03 dc.w Rings_Lev3_2 - Off_Rings ; 7 dc.w Rings_MTZ_1 - Off_Rings ; 8 $04 dc.w Rings_MTZ_2 - Off_Rings ; 9 dc.w Rings_MTZ_3 - Off_Rings ; 10 $05 dc.w Rings_MTZ_4 - Off_Rings ; 11 dc.w Rings_WFZ_1 - Off_Rings ; 12 $06 dc.w Rings_WFZ_2 - Off_Rings ; 13 dc.w Rings_HTZ_1 - Off_Rings ; 14 $07 dc.w Rings_HTZ_2 - Off_Rings ; 15 dc.w Rings_HPZ_1 - Off_Rings ; 16 $08 dc.w Rings_HPZ_2 - Off_Rings ; 17 dc.w Rings_Lev9_1 - Off_Rings ; 18 $09 dc.w Rings_Lev9_2 - Off_Rings ; 19 dc.w Rings_OOZ_1 - Off_Rings ; 20 $0A dc.w Rings_OOZ_2 - Off_Rings ; 21 dc.w Rings_MCZ_1 - Off_Rings ; 22 $0B dc.w Rings_MCZ_2 - Off_Rings ; 23 dc.w Rings_CNZ_1 - Off_Rings ; 24 $0C dc.w Rings_CNZ_2 - Off_Rings ; 25 dc.w Rings_CPZ_1 - Off_Rings ; 26 $0D dc.w Rings_CPZ_2 - Off_Rings ; 27 dc.w Rings_DEZ_1 - Off_Rings ; 28 $0E dc.w Rings_DEZ_2 - Off_Rings ; 29 dc.w Rings_ARZ_1 - Off_Rings ; 30 $0F dc.w Rings_ARZ_2 - Off_Rings ; 31 dc.w Rings_SCZ_1 - Off_Rings ; 32 $10 dc.w Rings_SCZ_2 - Off_Rings ; 33 </asm>

and add this to the end: <asm> dc.w Rings_Lev_11_1 - Off_Rings ; 34 $11 dc.w Rings_Lev_11_2 - Off_Rings ; 35 dc.w Rings_Lev_12_1 - Off_Rings ; 36 $12 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: <asm> 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: <asm> Rings_Lev_11_1: BINCLUDE "level/rings/Lev_11_1.bin" Rings_Lev_11_2: BINCLUDE "level/rings/Lev_11_2.bin" Rings_Lev_12_1: BINCLUDE "level/rings/Lev_12_1.bin" Rings_Lev_12_2: BINCLUDE "level/rings/Lev_12_2.bin" Rings_Lev_13_1: BINCLUDE "level/rings/Lev_13_1.bin" Rings_Lev_13_2: BINCLUDE "level/rings/Lev_13_2.bin" Rings_Lev_14_1: BINCLUDE "level/rings/Lev_14_1.bin" Rings_Lev_14_2: BINCLUDE "level/rings/Lev_14_2.bin" Rings_Lev_15_1: BINCLUDE "level/rings/Lev_15_1.bin" Rings_Lev_15_2: BINCLUDE "level/rings/Lev_15_2.bin" Rings_Lev_16_1: BINCLUDE "level/rings/Lev_16_1.bin" Rings_Lev_16_2: BINCLUDE "level/rings/Lev_16_2.bin" Rings_Lev_17_1: BINCLUDE "level/rings/Lev_17_1.bin" Rings_Lev_17_2: BINCLUDE "level/rings/Lev_17_2.bin" Rings_Lev_18_1: BINCLUDE "level/rings/Lev_18_1.bin" Rings_Lev_18_2: BINCLUDE "level/rings/Lev_18_2.bin" Rings_Lev_19_1: BINCLUDE "level/rings/Lev_19_1.bin" Rings_Lev_19_2: BINCLUDE "level/rings/Lev_19_2.bin" Rings_Lev_1A_1: BINCLUDE "level/rings/Lev_1A_1.bin" Rings_Lev_1A_2: BINCLUDE "level/rings/Lev_1A_2.bin" Rings_Lev_1B_1: BINCLUDE "level/rings/Lev_1B_1.bin" Rings_Lev_1B_2: BINCLUDE "level/rings/Lev_1B_2.bin" Rings_Lev_1C_1: BINCLUDE "level/rings/Lev_1C_1.bin" Rings_Lev_1C_2: BINCLUDE "level/rings/Lev_1C_2.bin" Rings_Lev_1D_1: BINCLUDE "level/rings/Lev_1D_1.bin" Rings_Lev_1D_2: BINCLUDE "level/rings/Lev_1D_2.bin" Rings_Lev_1E_1: BINCLUDE "level/rings/Lev_1E_1.bin" Rings_Lev_1E_2: BINCLUDE "level/rings/Lev_1E_2.bin" Rings_Lev_1F_1: BINCLUDE "level/rings/Lev_1F_1.bin" Rings_Lev_1F_2: BINCLUDE "level/rings/Lev_1F_2.bin" Rings_Lev_20_1: BINCLUDE "level/rings/Lev_20_1.bin" Rings_Lev_20_2: BINCLUDE "level/rings/Lev_20_2.bin" </asm>

Create the necessary blank files then edit them as needed.

Extending the object index

This is similar to extending the ring index.

Find: <asm> Off_Objects: dc.w Objects_EHZ_1 - Off_Objects ; 0 $00 dc.w Objects_EHZ_2 - Off_Objects ; 1 dc.w Objects_Null3 - Off_Objects ; 2 $01 dc.w Objects_Null3 - Off_Objects ; 3 dc.w Objects_Null3 - Off_Objects ; 4 $02 dc.w Objects_Null3 - Off_Objects ; 5 dc.w Objects_Null3 - Off_Objects ; 6 $03 dc.w Objects_Null3 - Off_Objects ; 7 dc.w Objects_MTZ_1 - Off_Objects ; 8 $04 dc.w Objects_MTZ_2 - Off_Objects ; 9 dc.w Objects_MTZ_3 - Off_Objects ; 10 $05 dc.w Objects_MTZ_3 - Off_Objects ; 11 dc.w Objects_WFZ_1 - Off_Objects ; 12 $06 dc.w Objects_WFZ_2 - Off_Objects ; 13 dc.w Objects_HTZ_1 - Off_Objects ; 14 $07 dc.w Objects_HTZ_2 - Off_Objects ; 15 dc.w Objects_HPZ_1 - Off_Objects ; 16 $08 dc.w Objects_HPZ_2 - Off_Objects ; 17 dc.w Objects_Null3 - Off_Objects ; 18 $09 dc.w Objects_Null3 - Off_Objects ; 19 dc.w Objects_OOZ_1 - Off_Objects ; 20 $0A dc.w Objects_OOZ_2 - Off_Objects ; 21 dc.w Objects_MCZ_1 - Off_Objects ; 22 $0B dc.w Objects_MCZ_2 - Off_Objects ; 23 dc.w Objects_CNZ_1 - Off_Objects ; 24 $0C dc.w Objects_CNZ_2 - Off_Objects ; 25 dc.w Objects_CPZ_1 - Off_Objects ; 26 $0D dc.w Objects_CPZ_2 - Off_Objects ; 27 dc.w Objects_DEZ_1 - Off_Objects ; 28 $0E dc.w Objects_DEZ_2 - Off_Objects ; 29 dc.w Objects_ARZ_1 - Off_Objects ; 30 $0F dc.w Objects_ARZ_2 - Off_Objects ; 31 dc.w Objects_SCZ_1 - Off_Objects ; 32 $10 dc.w Objects_SCZ_2 - Off_Objects ; 33 </asm>

then add this to the end: <asm> dc.w Objects_Lev_11_1 - Off_Objects ; 34 $11 dc.w Objects_Lev_11_2 - Off_Objects ; 35 dc.w Objects_Lev_12_1 - Off_Objects ; 36 $12 dc.w Objects_Lev_12_2 - Off_Objects ; 17 dc.w Objects_Lev_13_1 - Off_Objects ; 38 $13 dc.w Objects_Lev_13_2 - Off_Objects ; 39 dc.w Objects_Lev_14_1 - Off_Objects ; 40 $14 dc.w Objects_Lev_14_2 - Off_Objects ; 41 dc.w Objects_Lev_15_1 - Off_Objects ; 42 $15 dc.w Objects_Lev_15_2 - Off_Objects ; 43 dc.w Objects_Lev_16_1 - Off_Objects ; 44 $16 dc.w Objects_Lev_16_2 - Off_Objects ; 45 dc.w Objects_Lev_17_1 - Off_Objects ; 46 $17 dc.w Objects_Lev_17_2 - Off_Objects ; 47 dc.w Objects_Lev_18_1 - Off_Objects ; 48 $18 dc.w Objects_Lev_18_2 - Off_Objects ; 49 dc.w Objects_Lev_19_1 - Off_Objects ; 50 $19 dc.w Objects_Lev_19_2 - Off_Objects ; 51 dc.w Objects_Lev_1A_1 - Off_Objects ; 52 $1A dc.w Objects_Lev_1A_2 - Off_Objects ; 53 dc.w Objects_Lev_1B_1 - Off_Objects ; 54 $1B dc.w Objects_Lev_1B_2 - Off_Objects ; 55 dc.w Objects_Lev_1C_1 - Off_Objects ; 56 $1C dc.w Objects_Lev_1C_2 - Off_Objects ; 57 dc.w Objects_Lev_1D_1 - Off_Objects ; 58 $1D dc.w Objects_Lev_1D_2 - Off_Objects ; 59 dc.w Objects_Lev_1E_1 - Off_Objects ; 60 $1E dc.w Objects_Lev_1E_2 - Off_Objects ; 61 dc.w Objects_Lev_1F_1 - Off_Objects ; 62 $1F dc.w Objects_Lev_1F_2 - Off_Objects ; 63 dc.w Objects_Lev_20_1 - Off_Objects ; 64 $20 dc.w Objects_Lev_20_2 - Off_Objects ; 65 </asm>

Then find: <asm>

Objects_Null1
 ; unused

BINCLUDE "level/objects/Null_1.bin"

Objects_EHZ_1: BINCLUDE "level/objects/EHZ_1.bin" Objects_EHZ_2: BINCLUDE "level/objects/EHZ_2.bin" Objects_MTZ_1: BINCLUDE "level/objects/MTZ_1.bin" Objects_MTZ_2: BINCLUDE "level/objects/MTZ_2.bin" Objects_MTZ_3: BINCLUDE "level/objects/MTZ_3.bin" Objects_WFZ_1: BINCLUDE "level/objects/WFZ_1.bin" Objects_WFZ_2: BINCLUDE "level/objects/WFZ_2.bin" Objects_HTZ_1: BINCLUDE "level/objects/HTZ_1.bin" Objects_HTZ_2: BINCLUDE "level/objects/HTZ_2.bin" Objects_HPZ_1: BINCLUDE "level/objects/HPZ_1.bin" Objects_HPZ_2: BINCLUDE "level/objects/HPZ_2.bin"

Objects_Null2
 ; unused

BINCLUDE "level/objects/Null_2.bin"

Objects_OOZ_1: BINCLUDE "level/objects/OOZ_1.bin" Objects_OOZ_2: BINCLUDE "level/objects/OOZ_2.bin" Objects_MCZ_1: BINCLUDE "level/objects/MCZ_1.bin" Objects_MCZ_2: BINCLUDE "level/objects/MCZ_2.bin" Objects_CNZ_1: BINCLUDE "level/objects/CNZ_1.bin" Objects_CNZ_2: BINCLUDE "level/objects/CNZ_2.bin" Objects_CPZ_1: BINCLUDE "level/objects/CPZ_1.bin" Objects_CPZ_2: BINCLUDE "level/objects/CPZ_2.bin" Objects_DEZ_1: BINCLUDE "level/objects/DEZ_1.bin" Objects_DEZ_2: BINCLUDE "level/objects/DEZ_2.bin" Objects_ARZ_1: BINCLUDE "level/objects/ARZ_1.bin" Objects_ARZ_2: BINCLUDE "level/objects/ARZ_2.bin" Objects_SCZ_1: BINCLUDE "level/objects/SCZ_1.bin" Objects_SCZ_2: BINCLUDE "level/objects/SCZ_2.bin" Objects_Null3: BINCLUDE "level/objects/Null_3.bin"

Objects_Null4
 ; unused

BINCLUDE "level/objects/Null_4.bin"

Objects_Null5
 ; unused

BINCLUDE "level/objects/Null_5.bin"

Objects_Null6
 ; unused

BINCLUDE "level/objects/Null_6.bin" </asm>

then add this to the end:

<asm> Objects_Lev_11_1: BINCLUDE "level/objects/Lev_11_1.bin" Objects_Lev_11_2: BINCLUDE "level/objects/Lev_11_2.bin" Objects_Lev_12_1: BINCLUDE "level/objects/Lev_12_1.bin" Objects_Lev_12_2: BINCLUDE "level/objects/Lev_12_2.bin" Objects_Lev_13_1: BINCLUDE "level/objects/Lev_13_1.bin" Objects_Lev_13_2: BINCLUDE "level/objects/Lev_13_2.bin" Objects_Lev_14_1: BINCLUDE "level/objects/Lev_14_1.bin" Objects_Lev_14_2: BINCLUDE "level/objects/Lev_14_2.bin" Objects_Lev_15_1: BINCLUDE "level/objects/Lev_15_1.bin" Objects_Lev_15_2: BINCLUDE "level/objects/Lev_15_2.bin" Objects_Lev_16_1: BINCLUDE "level/objects/Lev_16_1.bin" Objects_Lev_16_2: BINCLUDE "level/objects/Lev_16_2.bin" Objects_Lev_17_1: BINCLUDE "level/objects/Lev_17_1.bin" Objects_Lev_17_2: BINCLUDE "level/objects/Lev_17_2.bin" Objects_Lev_18_1: BINCLUDE "level/objects/Lev_18_1.bin" Objects_Lev_18_2: BINCLUDE "level/objects/Lev_18_2.bin" Objects_Lev_19_1: BINCLUDE "level/objects/Lev_19_1.bin" Objects_Lev_19_2: BINCLUDE "level/objects/Lev_19_2.bin" Objects_Lev_1A_1: BINCLUDE "level/objects/Lev_1A_1.bin" Objects_Lev_1A_2: BINCLUDE "level/objects/Lev_1A_2.bin" Objects_Lev_1B_1: BINCLUDE "level/objects/Lev_1B_1.bin" Objects_Lev_1B_2: BINCLUDE "level/objects/Lev_1B_2.bin" Objects_Lev_1C_1: BINCLUDE "level/objects/Lev_1C_1.bin" Objects_Lev_1C_2: BINCLUDE "level/objects/Lev_1C_2.bin" Objects_Lev_1D_1: BINCLUDE "level/objects/Lev_1D_1.bin" Objects_Lev_1D_2: BINCLUDE "level/objects/Lev_1D_2.bin" Objects_Lev_1E_1: BINCLUDE "level/objects/Lev_1E_1.bin" Objects_Lev_1E_2: BINCLUDE "level/objects/Lev_1E_2.bin" Objects_Lev_1F_1: BINCLUDE "level/objects/Lev_1F_1.bin" Objects_Lev_1F_2: BINCLUDE "level/objects/Lev_1F_2.bin" Objects_Lev_20_1: BINCLUDE "level/objects/Lev_20_1.bin" Objects_Lev_20_2: BINCLUDE "level/objects/Lev_20_2.bin" </asm>

Extending tiles and patterns index

Find: <asm>

----------------------------------------------------------------------------------
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" </asm>

then add this to the end: <asm>

-----------------------------------------------------------------------------------
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" </asm>

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

Now find: <asm> LevelArtPointers: levartptrs 4, 5, 4, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 0 ; EHZ  ; EMERALD HILL ZONE levartptrs 6, 7, 5, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 1 ; LEV1 ; LEVEL 1 (UNUSED) levartptrs 8, 9, 6, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 2 ; LEV2 ; LEVEL 2 (UNUSED) levartptrs $A, $B, 7, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 3 ; LEV3 ; LEVEL 3 (UNUSED) levartptrs $C, $D, 8, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ; 4 ; MTZ  ; METROPOLIS ZONE ACTS 1 & 2 levartptrs $C, $D, 8, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ; 5 ; MTZ3 ; METROPOLIS ZONE ACT 3 levartptrs $10,$11, $A, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; 6 ; WFZ  ; WING FORTRESS ZONE levartptrs $12,$13, $B, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 7 ; HTZ  ; HILL TOP ZONE levartptrs $14,$15, $C, BM16_OOZ, BM16_OOZ, BM16_OOZ ; 8 ; HPZ  ; HIDDEN PALACE ZONE (UNUSED) levartptrs $16,$17, $D, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 9 ; LEV9 ; LEVEL 9 (UNUSED) levartptrs $18,$19, $E, ArtKos_OOZ, BM16_OOZ, BM128_OOZ ; $A ; OOZ  ; OIL OCEAN ZONE levartptrs $1A,$1B, $F, ArtKos_MCZ, BM16_MCZ, BM128_MCZ ; $B ; MCZ  ; MYSTIC CAVE ZONE levartptrs $1C,$1D,$10, ArtKos_CNZ, BM16_CNZ, BM128_CNZ ; $C ; CNZ  ; CASINO NIGHT ZONE levartptrs $1E,$1F,$11, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ; $D ; CPZ  ; CHEMICAL PLANT ZONE levartptrs $20,$21,$12, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ; $E ; DEZ  ; DEATH EGG ZONE levartptrs $22,$23,$13, ArtKos_ARZ, BM16_ARZ, BM128_ARZ ; $F ; ARZ  ; AQUATIC RUIN ZONE levartptrs $24,$25,$14, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; $10 ; SCZ  ; SKY CHASE ZONE </asm>

then add this to the end: <asm> 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 </asm>

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

and add this to the end: <asm> dc.w Level_Lev11_1-Off_Level dc.w Level_Lev11_2-Off_Level dc.w Level_Lev12_1-Off_Level dc.w Level_Lev12_2-Off_Level dc.w Level_Lev13_1-Off_Level dc.w Level_Lev13_2-Off_Level dc.w Level_Lev14_1-Off_Level dc.w Level_Lev14_2-Off_Level dc.w Level_Lev15_1-Off_Level dc.w Level_Lev15_2-Off_Level dc.w Level_Lev16_1-Off_Level dc.w Level_Lev16_2-Off_Level dc.w Level_Lev17_1-Off_Level dc.w Level_Lev17_2-Off_Level dc.w Level_Lev18_1-Off_Level dc.w Level_Lev18_2-Off_Level dc.w Level_Lev19_1-Off_Level dc.w Level_Lev19_2-Off_Level dc.w Level_Lev1A_1-Off_Level dc.w Level_Lev1A_2-Off_Level dc.w Level_Lev1B_1-Off_Level dc.w Level_Lev1B_2-Off_Level dc.w Level_Lev1C_1-Off_Level dc.w Level_Lev1C_2-Off_Level dc.w Level_Lev1D_1-Off_Level dc.w Level_Lev1D_2-Off_Level dc.w Level_Lev1E_1-Off_Level dc.w Level_Lev1E_2-Off_Level dc.w Level_Lev1F_1-Off_Level dc.w Level_Lev1F_2-Off_Level dc.w Level_Lev20_1-Off_Level dc.w Level_Lev20_2-Off_Level </asm>

Then find: <asm>

---------------------------------------------------------------------------------------
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" </asm>

then add this at the end: <asm>

---------------------------------------------------------------------------------------
Lev_11 act 1 level layout (Kosinski compression)

Level_Lev_11_1: BINCLUDE "level/layout/Lev11_1.bin"

---------------------------------------------------------------------------------------
Lev_11 act 2 level layout (Kosinski compression)

Level_Lev_11_2: BINCLUDE "level/layout/Lev11_2.bin"

---------------------------------------------------------------------------------------
Lev_12_1 level layout (Kosinski compression)

Level_Lev_12_1: BINCLUDE "level/layout/Lev12_1.bin"

---------------------------------------------------------------------------------------
Lev_12_2 level layout (Kosinski compression)

Level_Lev_12_1: BINCLUDE "level/layout/Lev12_2.bin"

---------------------------------------------------------------------------------------
Lev_13_1 level layout (Kosinski compression)

Level_Lev_13_1: BINCLUDE "level/layout/Lev13_1.bin"

---------------------------------------------------------------------------------------
Lev_13_2 level layout (Kosinski compression)

Level_Lev_13_2: BINCLUDE "level/layout/Lev13_2.bin"

---------------------------------------------------------------------------------------
Lev_14_1 level layout (Kosinski compression)

Level_Lev_14_1: BINCLUDE "level/layout/Lev14_1.bin"

---------------------------------------------------------------------------------------
Lev_14_2 level layout (Kosinski compression)

Level_Lev_14_2: BINCLUDE "level/layout/Lev14_2.bin"

---------------------------------------------------------------------------------------
Lev_15_1 level layout (Kosinski compression)

Level_Lev_15_1: BINCLUDE "level/layout/Lev15_1.bin"

---------------------------------------------------------------------------------------
Lev_15_2 level layout (Kosinski compression)

Level_Lev_15_2: BINCLUDE "level/layout/Lev15_2.bin"

---------------------------------------------------------------------------------------
Lev_16_1 level layout (Kosinski compression)

Level_Lev_16_1: BINCLUDE "level/layout/Lev16_1.bin"

---------------------------------------------------------------------------------------
Lev_16_2 level layout (Kosinski compression)

Level_Lev_16_2: BINCLUDE "level/layout/Lev16_2.bin"

---------------------------------------------------------------------------------------
Lev_17_1 level layout (Kosinski compression)

Level_Lev_17_1: BINCLUDE "level/layout/Lev17_1.bin"

---------------------------------------------------------------------------------------
Lev_17_2 level layout (Kosinski compression)

Level_Lev_17_2: BINCLUDE "level/layout/Lev17_2.bin"

---------------------------------------------------------------------------------------
Lev_18_1 level layout (Kosinski compression)

Level_Lev_18_1: BINCLUDE "level/layout/Lev18_1.bin"

---------------------------------------------------------------------------------------
Lev_18_2 level layout (Kosinski compression)

Level_Lev_18_2: BINCLUDE "level/layout/Lev18_2.bin"

---------------------------------------------------------------------------------------
Lev_19_1 level layout (Kosinski compression)

Level_Lev_19_1: BINCLUDE "level/layout/Lev19_1.bin"

---------------------------------------------------------------------------------------
Lev_19_2 level layout (Kosinski compression)

Level_Lev_19_2: BINCLUDE "level/layout/Lev19_2.bin"

---------------------------------------------------------------------------------------
Lev_1A_1 level layout (Kosinski compression)

Level_Lev_1A_1: BINCLUDE "level/layout/Lev1A_1.bin"

---------------------------------------------------------------------------------------
Lev_1A_2 level layout (Kosinski compression)

Level_Lev_1A_2: BINCLUDE "level/layout/Lev1A_2.bin"

---------------------------------------------------------------------------------------
Lev_1B_1 level layout (Kosinski compression)

Level_Lev_1B_1: BINCLUDE "level/layout/Lev1B_1.bin"

---------------------------------------------------------------------------------------
Lev_1B_2 level layout (Kosinski compression)

Level_Lev_1B_2: BINCLUDE "level/layout/Lev1B_2.bin"

---------------------------------------------------------------------------------------
Lev_1C_1 level layout (Kosinski compression)

Level_Lev_1C_1: BINCLUDE "level/layout/Lev1C_1.bin"

---------------------------------------------------------------------------------------
Lev_1C_2 level layout (Kosinski compression)

Level_Lev_1C_2: BINCLUDE "level/layout/Lev1C_2.bin"

---------------------------------------------------------------------------------------
Lev_1D_1 level layout (Kosinski compression)

Level_Lev_1D_1: BINCLUDE "level/layout/Lev1D_1.bin"

---------------------------------------------------------------------------------------
Lev_1D_2 level layout (Kosinski compression)

Level_Lev_1D_2: BINCLUDE "level/layout/Lev1D_2.bin"

---------------------------------------------------------------------------------------
Lev_1E_1 level layout (Kosinski compression)

Level_Lev_1E_1: BINCLUDE "level/layout/Lev1E_1.bin"

---------------------------------------------------------------------------------------
Lev_1E_2 level layout (Kosinski compression)

Level_Lev_1E_2: BINCLUDE "level/layout/Lev1E_2.bin"

---------------------------------------------------------------------------------------
Lev_1F_1 level layout (Kosinski compression)

Level_Lev_1F_1: BINCLUDE "level/layout/Lev1F_1.bin"

---------------------------------------------------------------------------------------
Lev_1F_2 level layout (Kosinski compression)

Level_Lev_1F_2: BINCLUDE "level/layout/Lev1F_2.bin"

---------------------------------------------------------------------------------------
Lev_20_1 level layout (Kosinski compression)

Level_Lev_20_1: BINCLUDE "level/layout/Lev20_1.bin"

---------------------------------------------------------------------------------------
Lev_20_2 level layout (Kosinski compression)

Level_Lev_20_2: BINCLUDE "level/layout/Lev20_2.bin" </asm>

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: <asm>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 cmpi.w #$001,(Current_ZoneAndAct).w beq.w return_4C46 ; if EHZ2, return cmpi.w #$500,(Current_ZoneAndAct).w beq.w return_4C46 ; if MTZ3, return cmpi.w #$600,(Current_ZoneAndAct).w beq.w return_4C46 ; if WFZ, return cmpi.w #$701,(Current_ZoneAndAct).w beq.w return_4C46 ; if HTZ2, return cmpi.w #$A01,(Current_ZoneAndAct).w beq.w return_4C46 ; if OOZ2, return cmpi.w #$B01,(Current_ZoneAndAct).w beq.s return_4C46 ; if MCZ2, return cmpi.w #$C01,(Current_ZoneAndAct).w beq.s return_4C46 ; if CNZ2, return cmpi.w #$D01,(Current_ZoneAndAct).w beq.s return_4C46 ; if CPZ2, return cmpi.w #$E00,(Current_ZoneAndAct).w beq.s return_4C46 ; if DEZ, return cmpi.w #$F01,(Current_ZoneAndAct).w beq.s return_4C46 ; if ARZ2, return cmpi.w #$1000,(Current_ZoneAndAct).w beq.s return_4C46 ; if SCZ, return </asm> we will change it to: <asm> JmpTo_LevelEnd_SetSignpost jmp LevelEnd_SetSignpost

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 JmpTo_LevelEnd_SetSignpost ; if yes, branch cmpi.w #$001,(Current_ZoneAndAct).w beq.w return_4C46 ; if EHZ2, return cmpi.w #$101,(Current_ZoneAndAct).w beq.w return_4C46 ; if LZ2, return cmpi.w #$201,(Current_ZoneAndAct).w beq.w return_4C46 ; if WZ2, return cmpi.w #$301,(Current_ZoneAndAct).w beq.w return_4C46 ; if DHZ2, return cmpi.w #$500,(Current_ZoneAndAct).w beq.w return_4C46 ; if MTZ3, return cmpi.w #$600,(Current_ZoneAndAct).w beq.w return_4C46 ; if WFZ, return cmpi.w #$701,(Current_ZoneAndAct).w beq.w return_4C46 ; if HTZ2, return cmpi.w #$801,(Current_ZoneAndAct).w beq.w return_4C46 ; if HPZ2, return cmpi.w #$901,(Current_ZoneAndAct).w beq.w return_4C46 ; if GCZ2, return cmpi.w #$A01,(Current_ZoneAndAct).w beq.w return_4C46 ; if OOZ2, return bra.s SetLevelEndType2

return_4C46: rts

SetLevelEndType2: cmpi.w #$B01,(Current_ZoneAndAct).w beq.s return2_4C46 ; if MCZ2, return cmpi.w #$C01,(Current_ZoneAndAct).w beq.s return2_4C46 ; if CNZ2, return cmpi.w #$D01,(Current_ZoneAndAct).w beq.s return2_4C46 ; if CPZ2, return cmpi.w #$E00,(Current_ZoneAndAct).w beq.s return2_4C46 ; if DEZ, return cmpi.w #$F01,(Current_ZoneAndAct).w beq.s return2_4C46 ; if ARZ2, return cmpi.w #$1000,(Current_ZoneAndAct).w beq.s return2_4C46 ; if SCZ, return cmpi.w #$1000,(Current_ZoneAndAct).w beq.s return2_4C46 ; if SCZ, return cmpi.w #$1101,(Current_ZoneAndAct).w beq.s return2_4C46 ; if one of our new levels in act 2, return cmpi.w #$1201,(Current_ZoneAndAct).w beq.s return2_4C46 ; if one of our new levels in act 2, return cmpi.w #$1301,(Current_ZoneAndAct).w beq.s return2_4C46 ; if one of our new levels in act 2, return cmpi.w #$1401,(Current_ZoneAndAct).w bra.s SetLevelEndType3

return2_4C46: rts

SetLevelEndType3: beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1501,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1601,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1701,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1801,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1901,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1A01,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1B01,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1C01,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1D01,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1E01,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$1F01,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return cmpi.w #$2001,(Current_ZoneAndAct).w beq.s return3_4C46 ; if one of our new levels in act 2, return

loc_4C40

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

return3_4C46: rts </asm>

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: <asm> WrdArr_LvlSize: dc.w $0, $29A0, $0, $320 ; $00  ; EHZ act 2 dc.w $0, $2940, $0, $420 ; EHZ act 2 dc.w $0, $3FFF, $0, $720 ; $01 dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $02 dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $03 dc.w $0, $3FFF, $0, $720 dc.w $0, $2280, -$100, $800 ; $04 ; MTZ act 1 dc.w $0, $1E80, -$100, $800 ; MTZ act 2 dc.w $0, $2A80, -$100, $800 ; $05 ; MTZ act 3 dc.w $0, $3FFF, -$100, $800 dc.w $0, $3FFF, $0, $720 ; $06 ; WFZ dc.w $0, $3FFF, $0, $720 dc.w $0, $2800, $0, $720 ; $07 ; HTZ act 1 dc.w $0, $3280, $0, $720 ; HTZ act 2 dc.w $0, $3FFF, $0, $720 ; $08 dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $09 dc.w $0, $3FFF, $0, $720 dc.w $0, $2F80, $0, $680 ; $0A ; OOZ act 1 dc.w $0, $2D00, $0, $680 ; OOZ act 2 dc.w $0, $2380, $3C0, $720 ; $0B ; MCZ act 1 dc.w $0, $3FFF, $60, $720 ; MCZ act 2 dc.w $0, $27A0, $0, $720 ; $0C ; CNZ act 1 dc.w $0, $2A80, $0, $720 ; CNZ act 2 dc.w $0, $2780, $0, $720 ; $0D ; CPZ act 1 dc.w $0, $2A80, $0, $720 ; CPZ act 2 dc.w $0, $1000, $C8, $C8 ; $0F ; DEZ dc.w $0, $1000, $C8, $C8 dc.w $0, $28C0, $200, $600 ; $10 ; ARZ act 1 dc.w $0, $3FFF, $180, $710 ; ARZ act 2 dc.w $0, $3FFF, $0, $000 ; $11 ; SCZ dc.w $0, $3FFF, $0, $720 </asm>

and we will change it to: <asm> WrdArr_LvlSize: dc.w $0, $29A0, $0, $320 ; $00  ; EHZ act 2 dc.w $0, $2940, $0, $420 ; EHZ act 2 dc.w $0, $3FFF, $0, $720 ; $01 dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $02 dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $03 dc.w $0, $3FFF, $0, $720 dc.w $0, $2280, -$100, $800 ; $04 ; MTZ act 1 dc.w $0, $1E80, -$100, $800 ; MTZ act 2 dc.w $0, $2A80, -$100, $800 ; $05 ; MTZ act 3 dc.w $0, $3FFF, -$100, $800 dc.w $0, $3FFF, $0, $720 ; $06 ; WFZ dc.w $0, $3FFF, $0, $720 dc.w $0, $2800, $0, $720 ; $07 ; HTZ act 1 dc.w $0, $3280, $0, $720 ; HTZ act 2 dc.w $0, $3FFF, $0, $720 ; $08 dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $09 dc.w $0, $3FFF, $0, $720 dc.w $0, $2F80, $0, $680 ; $0A ; OOZ act 1 dc.w $0, $2D00, $0, $680 ; OOZ act 2 dc.w $0, $2380, $3C0, $720 ; $0B ; MCZ act 1 dc.w $0, $3FFF, $60, $720 ; MCZ act 2 dc.w $0, $27A0, $0, $720 ; $0C ; CNZ act 1 dc.w $0, $2A80, $0, $720 ; CNZ act 2 dc.w $0, $2780, $0, $720 ; $0D ; CPZ act 1 dc.w $0, $2A80, $0, $720 ; CPZ act 2 dc.w $0, $1000, $C8, $C8 ; $0E ; DEZ dc.w $0, $1000, $C8, $C8 dc.w $0, $28C0, $200, $600 ; $0F ; ARZ act 1 dc.w $0, $3FFF, $180, $710 ; ARZ act 2 dc.w $0, $3FFF, $0, $000 ; $10 ; SCZ dc.w $0, $3FFF, $0, $720 dc.w $0, $3FFF, $0, $720 ; $11 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $12 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $13 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $14 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $15 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $16 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $17 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $18 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $19 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $1A ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $1B ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $1C ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $1D ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $1E ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $1F ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) dc.w $0, $3FFF, $0, $720 ; $20 ;one of our new levels (act 1) dc.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) </asm>

Extending the Start Location Index

Sonic has to start somewhere right?

Find this: <asm> WrdArr_StartLoc: dc.w $60, $28F ; $00 dc.w $60, $2AF dc.w $60, $28F ; $01 dc.w $60, $2AF dc.w $60, $1AC ; $02 dc.w $60, $1AC dc.w $60, $28F ; $03 dc.w $60, $2AF dc.w $60, $28C ; $04 dc.w $60, $5EC dc.w $60, $20C ; $05 dc.w $60, $2AF dc.w $60, $4CC ; $06 dc.w $1E0, $4CC dc.w $60, $3EF ; $07 dc.w $60, $6AF dc.w $230, $1AC ; $08 dc.w $230, $1AC dc.w $60, $28F ; $09 dc.w $60, $2AF dc.w $60, $6AC ; $0A dc.w $60, $56C dc.w $60, $6AC ; $0B dc.w $60, $5AC dc.w $60, $2AC ; $0C dc.w $60, $58C dc.w $60, $1EC ; $0D dc.w $60, $12C dc.w $60, $12D ; $0E dc.w $60, $12D dc.w $60, $37E ; $0F dc.w $60, $37E dc.w $120, $70 ; $10 dc.w $140, $70 </asm>

then add this to the end: <asm> dc.w 0, 0 ; $11 dc.w 0, 0 dc.w 0, 0 ; $12 dc.w 0, 0 dc.w 0, 0 ; $13 dc.w 0, 0 dc.w 0, 0 ; $14 dc.w 0, 0 dc.w 0, 0 ; $15 dc.w 0, 0 dc.w 0, 0 ; $16 dc.w 0, 0 dc.w 0, 0 ; $17 dc.w 0, 0 dc.w 0, 0 ; $18 dc.w 0, 0 dc.w 0, 0 ; $19 dc.w 0, 0 dc.w 0, 0 ; $1A dc.w 0, 0 dc.w 0, 0 ; $1B dc.w 0, 0 dc.w 0, 0 ; $1C dc.w 0, 0 dc.w 0, 0 ; $1D dc.w 0, 0 dc.w 0, 0 ; $1E dc.w 0, 0 dc.w 0, 0 ; $1F dc.w 0, 0 dc.w 0, 0 ; $20 dc.w 0, 0 </asm>

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

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)