IPB

Welcome Guest ( Log In | Register )


 

Recent Changes | Random | Help | Special Pages | Upload
home | info | forums | svn | irc | podcast | about

SCHG How-to:Extend the level index past $10 in Sonic 2

From Sonic Retro

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

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.

Contents

Extending the Titlecard index

First we find:

 
; 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
 

and replace it with:

 
; 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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
	dc.b   0,  0	; 32
; 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
 

This extends the title card index to $20. All new banks or banks with value 0 will read EMERALD HILL ZONE until a text address is assigned and text is added with $FFFF after it to signal the end of the text string.

You will find a link to the archive with the extra data files (sprite 34 mappings included) at the end of the tutorial.

Extending the cycling palette information

Now we want to locate:

 
; 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
 

and replace it with:

 
; 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
 

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

Extending the static palette list

Next we locate:

 
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
 

and replace it with:

 
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
 

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:

 
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
 

and add to the end of it:

 
	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
 

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

Extending Animated Pattern Mappings

Find:

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

then add this to the end

 
	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
 

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

 
; 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
 

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:

 
; 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
 

and replace it with:

 
; 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
 


now we want to find:

 
;----------------------------------------------------------------------------
; 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
 

and replace it with:

 
;----------------------------------------------------------------------------
; 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
 

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:

 
GameModesArray: ;;
	bra.w	SegaScreen		; $00 SEGA screen mode
	bra.