How To Change The Level Order in Sonic 2 SMS A Guide By Ravenfreak This guide assumes that you already downloaded the latest version of the disassembly from Sonic Retro's Github. You also just need your favorite text editor of choice for this guide. In order to change the level order, you must switch around quite a bit of data. For this guide I will be restoring the original level order, meaning Green Hills Zone will be the first zone and Underground Zone will be the fourth zone. First we'll change the Level Headers. Open up the file "level_headers.asm" located in the src folder. It should look like the following: Code: LevelHeaders: ;$55E5 .dw LevelHeaders_UGZ .dw LevelHeaders_SHZ .dw LevelHeaders_ALZ .dw LevelHeaders_GHZ .dw LevelHeaders_GMZ .dw LevelHeaders_SEZ .dw LevelHeaders_CEZ .dw LevelHeaders_UNK1 .dw LevelHeaders_UNK2 .dw LevelHeaders_Intro_Title LevelHeaders_UGZ: .dw LevelHeader_UGZ1 .dw LevelHeader_UGZ2 .dw LevelHeader_UGZ3 LevelHeaders_SHZ: .dw LevelHeader_SHZ1 .dw LevelHeader_SHZ2 .dw LevelHeader_SHZ3 LevelHeaders_ALZ: .dw LevelHeader_ALZ1 .dw LevelHeader_ALZ2 .dw LevelHeader_ALZ3 LevelHeaders_GHZ: .dw LevelHeader_GHZ1 .dw LevelHeader_GHZ2 .dw LevelHeader_GHZ3 LevelHeaders_GMZ: .dw LevelHeader_GMZ1 .dw LevelHeader_GMZ2 .dw LevelHeader_GMZ3 LevelHeaders_SEZ: .dw LevelHeader_SEZ1 .dw LevelHeader_SEZ2 .dw LevelHeader_SEZ3 LevelHeaders_CEZ: .dw LevelHeader_CEZ1 .dw LevelHeader_CEZ2 .dw LevelHeader_CEZ3 LevelHeaders_UNK1: .dw LevelHeader_5803 .dw LevelHeader_5819 .dw LevelHeader_5803 LevelHeaders_UNK2: .dw LevelHeader_SEZ1 .dw LevelHeader_SEZ2 .dw LevelHeader_SEZ3 LevelHeaders_Intro_Title: .dw LevelHeader_Intro .dw LevelHeader_Title .dw LevelHeader_Title ;LevelHeader_UGZ1: ;.db :Mappings32_UGZ ;bank number for 32x32 mappings ;.dw Mappings32_UGZ ;pointer to 32x32 mappings ;.db :Layout_UGZ1 ;bank number for level layout ;.dw Layout_UGZ1 ;level layout pointer ;.dw $00A8 ;level width in blocks ;.dw $FF58 ;2's comp level width in blocks ;.dw $0498 ;vertical offset into layout - i.e. the row ;that appears at the bottom of the screen when ;the player starts the level (7 * level width). ;.dw $0008 ;minimum camera x pos ;.dw $0008 ;minimum camera y pos ;.dw $1400 ;max camera x pos ;.dw $0210 ;max camera ypos ;.dw MultTable_168 ;pointer to block row offsets (must point to ;table of multiples of level width) LevelHeader_GHZ1: .db :Mappings32_GHZ .dw Mappings32_GHZ .db :Layout_GHZ1 .dw Layout_GHZ1 .dw $0100 .dw $FF00 .dw $0700 .dw $0008 .dw $0008 .dw $1F00 .dw $0110 .dw MultTable_256 LevelHeader_GHZ2: .db :Mappings32_GHZ .dw Mappings32_GHZ .db :Layout_GHZ2 .dw Layout_GHZ2 .dw $0100 .dw $FF00 .dw $0700 .dw $0008 .dw $0008 .dw $1F00 .dw $0110 .dw MultTable_256 LevelHeader_GHZ3: .db :Mappings32_GHZ .dw Mappings32_GHZ .db :Layout_GHZ3 .dw Layout_GHZ3 .dw $00A8 .dw $FF58 .dw $0498 .dw $0008 .dw $0008 .dw $1400 .dw $0210 .dw MultTable_168 LevelHeader_SHZ1: .db :Mappings32_SHZ1_3 .dw Mappings32_SHZ1_3 .db :Layout_SHZ1 .dw Layout_SHZ1 .dw $0060 .dw $FFA0 .dw $02A0 .dw $0008 .dw $0008 .dw $0B00 .dw $0410 .dw MultTable_96 LevelHeader_SHZ2: .db :Mappings32_SHZ2 .dw Mappings32_SHZ2 .db :Layout_SHZ2 .dw Layout_SHZ2 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_SHZ3: .db :Mappings32_SHZ1_3 .dw Mappings32_SHZ1_3 .db :Layout_SHZ3 .dw Layout_SHZ3 .dw $0060 .dw $FFA0 .dw $02A0 .dw $0008 .dw $0008 .dw $0B00 .dw $0210 .dw MultTable_96 LevelHeader_ALZ1: .db :Mappings32_ALZ .dw Mappings32_ALZ .db :Layout_ALZ1 .dw Layout_ALZ1 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_ALZ2: .db :Mappings32_ALZ2 .dw Mappings32_ALZ2 .db :Layout_ALZ2 .dw Layout_ALZ2 .dw $0048 .dw $FFB8 .dw $01F8 .dw $0008 .dw $0008 .dw $0800 .dw $0610 .dw MultTable_72 LevelHeader_ALZ3: .db :Mappings32_ALZ .dw Mappings32_ALZ .db :Layout_ALZ3 .dw Layout_ALZ3 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_UGZ1: .db :Mappings32_UGZ ;bank number for 32x32 mappings .dw Mappings32_UGZ ;pointer to 32x32 mappings .db :Layout_UGZ1 ;bank number for level layout .dw Layout_UGZ1 ;level layout pointer .dw $00A8 ;level width in blocks? .dw $FF58 ;2's comp level width in blocks .dw $0498 ;vertical offset into layout .dw $0008 ;minimum camera x pos .dw $0008 ;minimum camera y pos .dw $1400 ;max camera x pos .dw $0210 ;max camera ypos .dw MultTable_168 ;pointer to block row offsets LevelHeader_UGZ2: .db :Mappings32_UGZ .dw Mappings32_UGZ .db :Layout_UGZ2 .dw Layout_UGZ2 .dw $00A8 .dw $FF58 .dw $0498 .dw $0008 .dw $0008 .dw $1400 .dw $0210 .dw MultTable_168 LevelHeader_UGZ3: .db :Mappings32_UGZ .dw Mappings32_UGZ .db :Layout_UGZ3 .dw Layout_UGZ3 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_GMZ1: .db :Mappings32_GMZ .dw Mappings32_GMZ .db :Layout_GMZ1 .dw Layout_GMZ1 .dw $0060 .dw $FFA0 .dw $02A0 .dw $0008 .dw $0008 .dw $0B00 .dw $0410 .dw MultTable_96 LevelHeader_GMZ2: .db :Mappings32_GMZ .dw Mappings32_GMZ .db :Layout_GMZ2 .dw Layout_GMZ2 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_GMZ3: .db :Mappings32_GMZ .dw Mappings32_GMZ .db :Layout_GMZ3 .dw Layout_GMZ3 .dw $0028 .dw $FFD8 .dw $0118 .dw $0008 .dw $0008 .dw $0400 .dw $0510 .dw MultTable_40 LevelHeader_SEZ1: .db :Mappings32_SEZ1_3 .dw Mappings32_SEZ1_3 .db :Layout_SEZ1 .dw Layout_SEZ1 .dw $0028 .dw $FFD8 .dw $0118 .dw $0008 .dw $0008 .dw $0400 .dw $0B10 .dw MultTable_40 LevelHeader_SEZ2: .db :Mappings32_SEZ2 .dw Mappings32_SEZ2 .db :Layout_SEZ2 .dw Layout_SEZ2 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_SEZ3: .db :Mappings32_SEZ1_3 .dw Mappings32_SEZ1_3 .db :Layout_SEZ3 .dw Layout_SEZ3 .dw $0018 .dw $FFE8 .dw $00A8 .dw $0008 .dw $0008 .dw $0200 .dw $0E10 .dw MultTable_24 LevelHeader_CEZ1: .db :Mappings32_CEZ1_2 .dw Mappings32_CEZ1_2 .db :Layout_CEZ1 .dw Layout_CEZ1 .dw $00A8 .dw $FF58 .dw $0498 .dw $0008 .dw $0008 .dw $1400 .dw $0210 .dw MultTable_168 LevelHeader_CEZ2: .db :Mappings32_CEZ1_2 .dw Mappings32_CEZ1_2 .db :Layout_CEZ2 .dw Layout_CEZ2 .dw $0038 .dw $FFC8 .dw $0188 .dw $0008 .dw $0008 .dw $0600 .dw $0810 .dw MultTable_56 LevelHeader_CEZ3: .db :Mappings32_CEZ3 .dw Mappings32_CEZ3 .db :Layout_CEZ3 .dw Layout_CEZ3 .dw $0028 .dw $FFD8 .dw $0118 .dw $0008 .dw $0008 .dw $0400 .dw $0110 .dw MultTable_40 LevelHeader_5803: .db :Mappings32_Ending .dw Mappings32_Ending .db :Layout_Bad_Ending .dw Layout_Bad_Ending .dw $0020 .dw $FFE0 .dw $00E0 .dw $0008 .dw $0008 .dw $0300 .dw $0110 .dw MultTable_32 LevelHeader_5819: .db :Mappings32_Ending .dw Mappings32_Ending .db :Layout_Good_Ending .dw Layout_Good_Ending .dw $0020 .dw $FFE0 .dw $00E0 .dw $0008 .dw $0008 .dw $0300 .dw $0110 .dw MultTable_32 LevelHeader_Intro: .db :Mappings32_Intro .dw Mappings32_Intro .db :Layout_Intro .dw Layout_Intro .dw $0010 .dw $FFF0 .dw $0070 .dw $0008 .dw $0008 .dw $0100 .dw $0110 .dw MultTable_16 LevelHeader_Title: .db :Mappings32_Title .dw Mappings32_Title .db :Layout_Title .dw Layout_Title .dw $0010 .dw $FFF0 .dw $0070 .dw $0008 .dw $0008 .dw $0100 .dw $0110 .dw MultTable_16 The headers are the main bit of data that loads the level order. Since we want to switch UGZ and GHZ around, simply switch the two level headers around. Your new code should look like this: Code: LevelHeaders: ;$55E5 .dw LevelHeaders_GHZ .dw LevelHeaders_SHZ .dw LevelHeaders_ALZ .dw LevelHeaders_UGZ .dw LevelHeaders_GMZ .dw LevelHeaders_SEZ .dw LevelHeaders_CEZ .dw LevelHeaders_UNK1 .dw LevelHeaders_UNK2 .dw LevelHeaders_Intro_Title LevelHeaders_GHZ: .dw LevelHeader_GHZ1 .dw LevelHeader_GHZ2 .dw LevelHeader_GHZ3 LevelHeaders_SHZ: .dw LevelHeader_SHZ1 .dw LevelHeader_SHZ2 .dw LevelHeader_SHZ3 LevelHeaders_ALZ: .dw LevelHeader_ALZ1 .dw LevelHeader_ALZ2 .dw LevelHeader_ALZ3 LevelHeaders_UGZ: .dw LevelHeader_UGZ1 .dw LevelHeader_UGZ2 .dw LevelHeader_UGZ3 LevelHeaders_GMZ: .dw LevelHeader_GMZ1 .dw LevelHeader_GMZ2 .dw LevelHeader_GMZ3 LevelHeaders_SEZ: .dw LevelHeader_SEZ1 .dw LevelHeader_SEZ2 .dw LevelHeader_SEZ3 LevelHeaders_CEZ: .dw LevelHeader_CEZ1 .dw LevelHeader_CEZ2 .dw LevelHeader_CEZ3 LevelHeaders_UNK1: .dw LevelHeader_5803 .dw LevelHeader_5819 .dw LevelHeader_5803 LevelHeaders_UNK2: .dw LevelHeader_SEZ1 .dw LevelHeader_SEZ2 .dw LevelHeader_SEZ3 LevelHeaders_Intro_Title: .dw LevelHeader_Intro .dw LevelHeader_Title .dw LevelHeader_Title ;LevelHeader_UGZ1: ;.db :Mappings32_UGZ ;bank number for 32x32 mappings ;.dw Mappings32_UGZ ;pointer to 32x32 mappings ;.db :Layout_UGZ1 ;bank number for level layout ;.dw Layout_UGZ1 ;level layout pointer ;.dw $00A8 ;level width in blocks ;.dw $FF58 ;2's comp level width in blocks ;.dw $0498 ;vertical offset into layout - i.e. the row ;that appears at the bottom of the screen when ;the player starts the level (7 * level width). ;.dw $0008 ;minimum camera x pos ;.dw $0008 ;minimum camera y pos ;.dw $1400 ;max camera x pos ;.dw $0210 ;max camera ypos ;.dw MultTable_168 ;pointer to block row offsets (must point to ;table of multiples of level width) LevelHeader_GHZ1: .db :Mappings32_GHZ .dw Mappings32_GHZ .db :Layout_GHZ1 .dw Layout_GHZ1 .dw $0100 .dw $FF00 .dw $0700 .dw $0008 .dw $0008 .dw $1F00 .dw $0110 .dw MultTable_256 LevelHeader_GHZ2: .db :Mappings32_GHZ .dw Mappings32_GHZ .db :Layout_GHZ2 .dw Layout_GHZ2 .dw $0100 .dw $FF00 .dw $0700 .dw $0008 .dw $0008 .dw $1F00 .dw $0110 .dw MultTable_256 LevelHeader_GHZ3: .db :Mappings32_GHZ .dw Mappings32_GHZ .db :Layout_GHZ3 .dw Layout_GHZ3 .dw $00A8 .dw $FF58 .dw $0498 .dw $0008 .dw $0008 .dw $1400 .dw $0210 .dw MultTable_168 LevelHeader_SHZ1: .db :Mappings32_SHZ1_3 .dw Mappings32_SHZ1_3 .db :Layout_SHZ1 .dw Layout_SHZ1 .dw $0060 .dw $FFA0 .dw $02A0 .dw $0008 .dw $0008 .dw $0B00 .dw $0410 .dw MultTable_96 LevelHeader_SHZ2: .db :Mappings32_SHZ2 .dw Mappings32_SHZ2 .db :Layout_SHZ2 .dw Layout_SHZ2 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_SHZ3: .db :Mappings32_SHZ1_3 .dw Mappings32_SHZ1_3 .db :Layout_SHZ3 .dw Layout_SHZ3 .dw $0060 .dw $FFA0 .dw $02A0 .dw $0008 .dw $0008 .dw $0B00 .dw $0210 .dw MultTable_96 LevelHeader_ALZ1: .db :Mappings32_ALZ .dw Mappings32_ALZ .db :Layout_ALZ1 .dw Layout_ALZ1 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_ALZ2: .db :Mappings32_ALZ2 .dw Mappings32_ALZ2 .db :Layout_ALZ2 .dw Layout_ALZ2 .dw $0048 .dw $FFB8 .dw $01F8 .dw $0008 .dw $0008 .dw $0800 .dw $0610 .dw MultTable_72 LevelHeader_ALZ3: .db :Mappings32_ALZ .dw Mappings32_ALZ .db :Layout_ALZ3 .dw Layout_ALZ3 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_UGZ1: .db :Mappings32_UGZ ;bank number for 32x32 mappings .dw Mappings32_UGZ ;pointer to 32x32 mappings .db :Layout_UGZ1 ;bank number for level layout .dw Layout_UGZ1 ;level layout pointer .dw $00A8 ;level width in blocks? .dw $FF58 ;2's comp level width in blocks .dw $0498 ;vertical offset into layout .dw $0008 ;minimum camera x pos .dw $0008 ;minimum camera y pos .dw $1400 ;max camera x pos .dw $0210 ;max camera ypos .dw MultTable_168 ;pointer to block row offsets LevelHeader_UGZ2: .db :Mappings32_UGZ .dw Mappings32_UGZ .db :Layout_UGZ2 .dw Layout_UGZ2 .dw $00A8 .dw $FF58 .dw $0498 .dw $0008 .dw $0008 .dw $1400 .dw $0210 .dw MultTable_168 LevelHeader_UGZ3: .db :Mappings32_UGZ .dw Mappings32_UGZ .db :Layout_UGZ3 .dw Layout_UGZ3 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_GMZ1: .db :Mappings32_GMZ .dw Mappings32_GMZ .db :Layout_GMZ1 .dw Layout_GMZ1 .dw $0060 .dw $FFA0 .dw $02A0 .dw $0008 .dw $0008 .dw $0B00 .dw $0410 .dw MultTable_96 LevelHeader_GMZ2: .db :Mappings32_GMZ .dw Mappings32_GMZ .db :Layout_GMZ2 .dw Layout_GMZ2 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_GMZ3: .db :Mappings32_GMZ .dw Mappings32_GMZ .db :Layout_GMZ3 .dw Layout_GMZ3 .dw $0028 .dw $FFD8 .dw $0118 .dw $0008 .dw $0008 .dw $0400 .dw $0510 .dw MultTable_40 LevelHeader_SEZ1: .db :Mappings32_SEZ1_3 .dw Mappings32_SEZ1_3 .db :Layout_SEZ1 .dw Layout_SEZ1 .dw $0028 .dw $FFD8 .dw $0118 .dw $0008 .dw $0008 .dw $0400 .dw $0B10 .dw MultTable_40 LevelHeader_SEZ2: .db :Mappings32_SEZ2 .dw Mappings32_SEZ2 .db :Layout_SEZ2 .dw Layout_SEZ2 .dw $0080 .dw $FF80 .dw $0380 .dw $0008 .dw $0008 .dw $0F00 .dw $0310 .dw MultTable_128 LevelHeader_SEZ3: .db :Mappings32_SEZ1_3 .dw Mappings32_SEZ1_3 .db :Layout_SEZ3 .dw Layout_SEZ3 .dw $0018 .dw $FFE8 .dw $00A8 .dw $0008 .dw $0008 .dw $0200 .dw $0E10 .dw MultTable_24 LevelHeader_CEZ1: .db :Mappings32_CEZ1_2 .dw Mappings32_CEZ1_2 .db :Layout_CEZ1 .dw Layout_CEZ1 .dw $00A8 .dw $FF58 .dw $0498 .dw $0008 .dw $0008 .dw $1400 .dw $0210 .dw MultTable_168 LevelHeader_CEZ2: .db :Mappings32_CEZ1_2 .dw Mappings32_CEZ1_2 .db :Layout_CEZ2 .dw Layout_CEZ2 .dw $0038 .dw $FFC8 .dw $0188 .dw $0008 .dw $0008 .dw $0600 .dw $0810 .dw MultTable_56 LevelHeader_CEZ3: .db :Mappings32_CEZ3 .dw Mappings32_CEZ3 .db :Layout_CEZ3 .dw Layout_CEZ3 .dw $0028 .dw $FFD8 .dw $0118 .dw $0008 .dw $0008 .dw $0400 .dw $0110 .dw MultTable_40 LevelHeader_5803: .db :Mappings32_Ending .dw Mappings32_Ending .db :Layout_Bad_Ending .dw Layout_Bad_Ending .dw $0020 .dw $FFE0 .dw $00E0 .dw $0008 .dw $0008 .dw $0300 .dw $0110 .dw MultTable_32 LevelHeader_5819: .db :Mappings32_Ending .dw Mappings32_Ending .db :Layout_Good_Ending .dw Layout_Good_Ending .dw $0020 .dw $FFE0 .dw $00E0 .dw $0008 .dw $0008 .dw $0300 .dw $0110 .dw MultTable_32 LevelHeader_Intro: .db :Mappings32_Intro .dw Mappings32_Intro .db :Layout_Intro .dw Layout_Intro .dw $0010 .dw $FFF0 .dw $0070 .dw $0008 .dw $0008 .dw $0100 .dw $0110 .dw MultTable_16 LevelHeader_Title: .db :Mappings32_Title .dw Mappings32_Title .db :Layout_Title .dw Layout_Title .dw $0010 .dw $FFF0 .dw $0070 .dw $0008 .dw $0008 .dw $0100 .dw $0110 .dw MultTable_16 Go ahead and build your ROM. UGZ will be glitched out at this point but don't worry! It's because we still need to fix the zone tilesets! The game is still using UGZ's tiles, which is why they show up incorrectly. So now locate "zone_tilesets.asm" in the same folder, and open it up. It'll look like this: Code: ;Tileset header chains for each zone/act ;Under Ground Zone .db :Art_UGZ_Level_Tiles ;act1 .dw $2100 .dw Art_UGZ_Level_Tiles .dw Tileset_UGZ .db :Art_UGZ_Level_Tiles ;act2 .dw $2100 .dw Art_UGZ_Level_Tiles .dw Tileset_UGZ .db :Art_UGZ_Level_Tiles ;act3 .dw $2100 .dw Art_UGZ_Level_Tiles .dw Tileset_UGZ ;Sky High Zone .db :Art_SHZ_Level_Tiles .dw $2000 .dw Art_SHZ_Level_Tiles .dw Tileset_SHZ .db :Art_SHZ2_Level_Tiles .dw $2000 .dw Art_SHZ2_Level_Tiles .dw Tileset_SHZ .db :Art_SHZ_Level_Tiles .dw $2000 .dw Art_SHZ_Level_Tiles .dw Tileset_SHZ ;Aqua Lake Zone .db :Art_ALZ_Level_Tiles .dw $20C0 .dw Art_ALZ_Level_Tiles .dw Tileset_ALZ .db :Art_ALZ_Level_Tiles .dw $20C0 .dw Art_ALZ2_Level_Tiles .dw Tileset_ALZ .db :Art_ALZ_Level_Tiles .dw $20C0 .dw Art_ALZ_Level_Tiles .dw Tileset_ALZ ;Green Hills Zone .db :Art_GHZ_Level_Tiles .dw $2000 .dw Art_GHZ_Level_Tiles .dw Tileset_GHZ .db :Art_GHZ_Level_Tiles .dw $2000 .dw Art_GHZ_Level_Tiles .dw Tileset_GHZ .db :Art_GHZ_Level_Tiles .dw $2000 .dw Art_GHZ_Level_Tiles .dw Tileset_GHZ .db :Art_GMZ_Level_Tiles .dw $2000 .dw Art_GMZ_Level_Tiles .dw Tileset_GMZ .db :Art_GMZ_Level_Tiles .dw $2000 .dw Art_GMZ_Level_Tiles .dw Tileset_GMZ .db :Art_GMZ_Level_Tiles .dw $2000 .dw Art_GMZ_Level_Tiles .dw Tileset_GMZ .db :Art_SEZ_Level_Tiles .dw $2000 .dw Art_SEZ_Level_Tiles .dw Tileset_SEZ .db :Art_SEZ_Level_Tiles .dw $2000 .dw Art_SEZ2_Level_Tiles .dw Tileset_SEZ .db :Art_SEZ_Level_Tiles .dw $2000 .dw Art_SEZ_Level_Tiles .dw Tileset_SEZ .db :Art_CEZ_Level_Tiles .dw $2000 .dw Art_CEZ_Level_Tiles .dw Tileset_CEZ .db :Art_CEZ_Level_Tiles .dw $2000 .dw Art_CEZ_Level_Tiles .dw Tileset_CEZ .db :Art_CEZ3_Level_Tiles .dw $2000 .dw Art_CEZ3_Level_Tiles .dw Tileset_CEZ3 .db :Art_Ending_Tiles .dw $2000 .dw Art_Ending_Tiles .dw Tileset_UNK1 .db :Art_Ending_Tiles .dw $2000 .dw Art_Ending_Tiles .dw Tileset_UNK1 .db :Art_Ending_Tiles .dw $2000 .dw Art_Ending_Tiles .dw Tileset_UNK1 .db :Art_Intro_Sequence .dw $2000 .dw Art_Intro_Sequence .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro .db :Art_Intro_Sequence .dw $2000 .dw Art_Intro_Sequence .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro Tileset_UGZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_UGZ_Unknown .dw $0C40 .dw Art_UGZ_Unknown .db :Art_Minecart .dw $0D40 .dw Art_Minecart .db :Art_UGZ_Spikes .dw $10C0 .dw Art_UGZ_Spikes .db :Art_UGZ_Fireball .dw $1240 .dw Art_UGZ_Fireball .db :Art_Badnik_Motobug .dw $1300 .dw Art_Badnik_Motobug .db :Art_Badnik_Motobug + $80 ;mirror tiles .dw $1500 .dw Art_Badnik_Motobug .db :Art_Badnik_Newtron + $80 ;mirror tiles .dw $1700 .dw Art_Badnik_Newtron .db :Art_Badnik_Crab .dw $1A80 .dw Art_Badnik_Crab .db :Art_UGZ_Spikes .dw $1F40 .dw Art_UGZ_Spikes .db $FF Tileset_SHZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_SHZ_Log .dw $0C40 .dw Art_SHZ_Log .db :Art_SHZ_Moving_Platform .dw $0CC0 .dw Art_SHZ_Moving_Platform .db :Art_SHZ_Rock .dw $0DC0 .dw Art_SHZ_Rock .db :Art_Badnik_Turtle .dw $0F40 .dw Art_Badnik_Turtle .db :Art_Badnik_Turtle + $80 .dw $1240 .dw Art_Badnik_Turtle .db :Art_SHZ_Yellow_Bird .dw $1540 .dw Art_SHZ_Yellow_Bird .db :Art_Badnik_Newtron + $80 .dw $15C0 .dw Art_Badnik_Newtron .db :Art_SHZ_Glider .dw $1940 .dw Art_SHZ_Glider .db :Art_SHZ_Leaves .dw $1EC0 .dw Art_SHZ_Leaves .db $FF Tileset_ALZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_ALZ_Spike .dw $0C40 .dw Art_ALZ_Spike .db :Art_Badnik_Lobster .dw $0E40 .dw Art_Badnik_Lobster .db :Art_Badnik_Lobster + $80 .dw $1140 .dw Art_Badnik_Lobster .db :Art_Badnik_Crab .dw $1440 .dw Art_Badnik_Crab .db :Art_ALZ_Unknown2 .dw $1900 .dw Art_ALZ_Unknown2 .db :Art_ALZ_Unknown .dw $1980 .dw Art_ALZ_Unknown .db :Art_ALZ_Bubble .dw $1A00 .dw Art_ALZ_Bubble .db :Art_ALZ_Big_Bubble .dw $1C40 .dw Art_ALZ_Big_Bubble .db $FF Tileset_GHZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_GHZ_Moving_Platform .dw $0C40 .dw Art_GHZ_Moving_Platform .db :Art_Badnik_Motobug .dw $0D40 .dw Art_Badnik_Motobug .db :Art_Badnik_Motobug + $80 .dw $0F40 .dw Art_Badnik_Motobug .db :Art_Badnik_Newtron + $80 .dw $1140 .dw Art_Badnik_Newtron .db :Art_Badnik_Crab .dw $14C0 .dw Art_Badnik_Crab .db $FF Tileset_GMZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_GMZ_Moving_Platform .dw $0C40 .dw Art_GMZ_Moving_Platform .db :Art_Minecart .dw $0D40 .dw Art_Minecart .db :Art_Badnik_Burrobot .dw $10C0 .dw Art_Badnik_Burrobot .db :Art_Badnik_Burrobot + $80 .dw $1440 .dw Art_Badnik_Burrobot .db :Art_Badnik_Pig .dw $17C0 .dw Art_Badnik_Pig .db :Art_Badnik_Bomb .dw $1AC0 .dw Art_Badnik_Bomb .db :Art_Badnik_Bomb + $80 .dw $1CC0 .dw Art_Badnik_Bomb .db :Art_GMZ_Spikes .dw $1EC0 .dw Art_GMZ_Spikes .db $FF Tileset_SEZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_SEZ_Moving_Platform .dw $0C40 .dw Art_SEZ_Moving_Platform .db :Art_SEZ_Block .dw $0D40 .dw Art_SEZ_Block .db :Art_Badnik_Turtle .dw $0DC0 .dw Art_Badnik_Turtle .db :Art_Badnik_Turtle + $80 .dw $10C0 .dw Art_Badnik_Turtle .db :Art_Badnik_Bomb .dw $13C0 .dw Art_Badnik_Bomb .db :Art_Badnik_Bomb + $80 .dw $15C0 .dw Art_Badnik_Bomb .db :Art_Badnik_Crab .dw $17C0 .dw Art_Badnik_Crab .db $FF Tileset_CEZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_CEZ_Moving_Platform .dw $0C40 .dw Art_CEZ_Moving_Platform .db :Art_CEZ_Rock .dw $0D40 .dw Art_CEZ_Rock .db :Art_CEZ_Wheel .dw $0E40 .dw Art_CEZ_Wheel .db :Art_CEZ_Block .dw $1140 .dw Art_CEZ_Block .db :Art_Badnik_Fish .dw $1340 .dw Art_Badnik_Fish .db :Art_Badnik_Fish + $80 .dw $1400 .dw Art_Badnik_Fish .db :Art_Badnik_Crab .dw $14C0 .dw Art_Badnik_Crab .db :Art_Badnik_Turtle .dw $1980 .dw Art_Badnik_Turtle .db $FF Tileset_CEZ3: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_CEZ_Boss .dw $0C40 .dw Art_CEZ_Boss .db :Art_CEZ3_Cloud .dw $1F80 .dw Art_CEZ3_Cloud .db $FF Tileset_UNK1: .db :Art_Ending_Text .dw $0200 .dw Art_Ending_Text .db :Art_End .dw $0940 .dw Art_End .db :Art_Tails_Running + $80 .dw $0C80 .dw Art_Tails_Running .db :Art_Tails_Skid + $80 .dw $1700 .dw Art_Tails_Skid .db :Art_Tails_LookingUp + $80 .dw $18C0 .dw Art_Tails_LookingUp .db $FF Tileset_Intro: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db $FF As you can see, the first tile set that appears in the game is Underground Zone's. Makes sense, since it's the first level after all. You'll need to move UGZ and GHZ's tile set headers around, just like we did before with the level headers. So after moving them around, your code should look like the following. Code: ;Tileset header chains for each zone/act ;Under Ground Zone .db :Art_GHZ_Level_Tiles .dw $2000 .dw Art_GHZ_Level_Tiles .dw Tileset_GHZ .db :Art_GHZ_Level_Tiles .dw $2000 .dw Art_GHZ_Level_Tiles .dw Tileset_GHZ .db :Art_GHZ_Level_Tiles .dw $2000 .dw Art_GHZ_Level_Tiles .dw Tileset_GHZ ;Sky High Zone .db :Art_SHZ_Level_Tiles .dw $2000 .dw Art_SHZ_Level_Tiles .dw Tileset_SHZ .db :Art_SHZ2_Level_Tiles .dw $2000 .dw Art_SHZ2_Level_Tiles .dw Tileset_SHZ .db :Art_SHZ_Level_Tiles .dw $2000 .dw Art_SHZ_Level_Tiles .dw Tileset_SHZ ;Aqua Lake Zone .db :Art_ALZ_Level_Tiles .dw $20C0 .dw Art_ALZ_Level_Tiles .dw Tileset_ALZ .db :Art_ALZ_Level_Tiles .dw $20C0 .dw Art_ALZ2_Level_Tiles .dw Tileset_ALZ .db :Art_ALZ_Level_Tiles .dw $20C0 .dw Art_ALZ_Level_Tiles .dw Tileset_ALZ ;Green Hills Zone .db :Art_UGZ_Level_Tiles ;act1 .dw $2100 .dw Art_UGZ_Level_Tiles .dw Tileset_UGZ .db :Art_UGZ_Level_Tiles ;act2 .dw $2100 .dw Art_UGZ_Level_Tiles .dw Tileset_UGZ .db :Art_UGZ_Level_Tiles ;act3 .dw $2100 .dw Art_UGZ_Level_Tiles .dw Tileset_UGZ .db :Art_GMZ_Level_Tiles .dw $2000 .dw Art_GMZ_Level_Tiles .dw Tileset_GMZ .db :Art_GMZ_Level_Tiles .dw $2000 .dw Art_GMZ_Level_Tiles .dw Tileset_GMZ .db :Art_GMZ_Level_Tiles .dw $2000 .dw Art_GMZ_Level_Tiles .dw Tileset_GMZ .db :Art_SEZ_Level_Tiles .dw $2000 .dw Art_SEZ_Level_Tiles .dw Tileset_SEZ .db :Art_SEZ_Level_Tiles .dw $2000 .dw Art_SEZ2_Level_Tiles .dw Tileset_SEZ .db :Art_SEZ_Level_Tiles .dw $2000 .dw Art_SEZ_Level_Tiles .dw Tileset_SEZ .db :Art_CEZ_Level_Tiles .dw $2000 .dw Art_CEZ_Level_Tiles .dw Tileset_CEZ .db :Art_CEZ_Level_Tiles .dw $2000 .dw Art_CEZ_Level_Tiles .dw Tileset_CEZ .db :Art_CEZ3_Level_Tiles .dw $2000 .dw Art_CEZ3_Level_Tiles .dw Tileset_CEZ3 .db :Art_Ending_Tiles .dw $2000 .dw Art_Ending_Tiles .dw Tileset_UNK1 .db :Art_Ending_Tiles .dw $2000 .dw Art_Ending_Tiles .dw Tileset_UNK1 .db :Art_Ending_Tiles .dw $2000 .dw Art_Ending_Tiles .dw Tileset_UNK1 .db :Art_Intro_Sequence .dw $2000 .dw Art_Intro_Sequence .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro .db :Art_Intro_Sequence .dw $2000 .dw Art_Intro_Sequence .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro .db :Art_Beta_Title .dw $2000 .dw Art_Beta_Title .dw Tileset_Intro Tileset_UGZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_UGZ_Unknown .dw $0C40 .dw Art_UGZ_Unknown .db :Art_Minecart .dw $0D40 .dw Art_Minecart .db :Art_UGZ_Spikes .dw $10C0 .dw Art_UGZ_Spikes .db :Art_UGZ_Fireball .dw $1240 .dw Art_UGZ_Fireball .db :Art_Badnik_Motobug .dw $1300 .dw Art_Badnik_Motobug .db :Art_Badnik_Motobug + $80 ;mirror tiles .dw $1500 .dw Art_Badnik_Motobug .db :Art_Badnik_Newtron + $80 ;mirror tiles .dw $1700 .dw Art_Badnik_Newtron .db :Art_Badnik_Crab .dw $1A80 .dw Art_Badnik_Crab .db :Art_UGZ_Spikes .dw $1F40 .dw Art_UGZ_Spikes .db $FF Tileset_SHZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_SHZ_Log .dw $0C40 .dw Art_SHZ_Log .db :Art_SHZ_Moving_Platform .dw $0CC0 .dw Art_SHZ_Moving_Platform .db :Art_SHZ_Rock .dw $0DC0 .dw Art_SHZ_Rock .db :Art_Badnik_Turtle .dw $0F40 .dw Art_Badnik_Turtle .db :Art_Badnik_Turtle + $80 .dw $1240 .dw Art_Badnik_Turtle .db :Art_SHZ_Yellow_Bird .dw $1540 .dw Art_SHZ_Yellow_Bird .db :Art_Badnik_Newtron + $80 .dw $15C0 .dw Art_Badnik_Newtron .db :Art_SHZ_Glider .dw $1940 .dw Art_SHZ_Glider .db :Art_SHZ_Leaves .dw $1EC0 .dw Art_SHZ_Leaves .db $FF Tileset_ALZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_ALZ_Spike .dw $0C40 .dw Art_ALZ_Spike .db :Art_Badnik_Lobster .dw $0E40 .dw Art_Badnik_Lobster .db :Art_Badnik_Lobster + $80 .dw $1140 .dw Art_Badnik_Lobster .db :Art_Badnik_Crab .dw $1440 .dw Art_Badnik_Crab .db :Art_ALZ_Unknown2 .dw $1900 .dw Art_ALZ_Unknown2 .db :Art_ALZ_Unknown .dw $1980 .dw Art_ALZ_Unknown .db :Art_ALZ_Bubble .dw $1A00 .dw Art_ALZ_Bubble .db :Art_ALZ_Big_Bubble .dw $1C40 .dw Art_ALZ_Big_Bubble .db $FF Tileset_GHZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_GHZ_Moving_Platform .dw $0C40 .dw Art_GHZ_Moving_Platform .db :Art_Badnik_Motobug .dw $0D40 .dw Art_Badnik_Motobug .db :Art_Badnik_Motobug + $80 .dw $0F40 .dw Art_Badnik_Motobug .db :Art_Badnik_Newtron + $80 .dw $1140 .dw Art_Badnik_Newtron .db :Art_Badnik_Crab .dw $14C0 .dw Art_Badnik_Crab .db $FF Tileset_GMZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_GMZ_Moving_Platform .dw $0C40 .dw Art_GMZ_Moving_Platform .db :Art_Minecart .dw $0D40 .dw Art_Minecart .db :Art_Badnik_Burrobot .dw $10C0 .dw Art_Badnik_Burrobot .db :Art_Badnik_Burrobot + $80 .dw $1440 .dw Art_Badnik_Burrobot .db :Art_Badnik_Pig .dw $17C0 .dw Art_Badnik_Pig .db :Art_Badnik_Bomb .dw $1AC0 .dw Art_Badnik_Bomb .db :Art_Badnik_Bomb + $80 .dw $1CC0 .dw Art_Badnik_Bomb .db :Art_GMZ_Spikes .dw $1EC0 .dw Art_GMZ_Spikes .db $FF Tileset_SEZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_SEZ_Moving_Platform .dw $0C40 .dw Art_SEZ_Moving_Platform .db :Art_SEZ_Block .dw $0D40 .dw Art_SEZ_Block .db :Art_Badnik_Turtle .dw $0DC0 .dw Art_Badnik_Turtle .db :Art_Badnik_Turtle + $80 .dw $10C0 .dw Art_Badnik_Turtle .db :Art_Badnik_Bomb .dw $13C0 .dw Art_Badnik_Bomb .db :Art_Badnik_Bomb + $80 .dw $15C0 .dw Art_Badnik_Bomb .db :Art_Badnik_Crab .dw $17C0 .dw Art_Badnik_Crab .db $FF Tileset_CEZ: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db :Art_CEZ_Moving_Platform .dw $0C40 .dw Art_CEZ_Moving_Platform .db :Art_CEZ_Rock .dw $0D40 .dw Art_CEZ_Rock .db :Art_CEZ_Wheel .dw $0E40 .dw Art_CEZ_Wheel .db :Art_CEZ_Block .dw $1140 .dw Art_CEZ_Block .db :Art_Badnik_Fish .dw $1340 .dw Art_Badnik_Fish .db :Art_Badnik_Fish + $80 .dw $1400 .dw Art_Badnik_Fish .db :Art_Badnik_Crab .dw $14C0 .dw Art_Badnik_Crab .db :Art_Badnik_Turtle .dw $1980 .dw Art_Badnik_Turtle .db $FF Tileset_CEZ3: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_CEZ_Boss .dw $0C40 .dw Art_CEZ_Boss .db :Art_CEZ3_Cloud .dw $1F80 .dw Art_CEZ3_Cloud .db $FF Tileset_UNK1: .db :Art_Ending_Text .dw $0200 .dw Art_Ending_Text .db :Art_End .dw $0940 .dw Art_End .db :Art_Tails_Running + $80 .dw $0C80 .dw Art_Tails_Running .db :Art_Tails_Skid + $80 .dw $1700 .dw Art_Tails_Skid .db :Art_Tails_LookingUp + $80 .dw $18C0 .dw Art_Tails_LookingUp .db $FF Tileset_Intro: .db :Art_Icons_Numbers .dw $0200 .dw Art_Icons_Numbers .db :Art_Monitors_Generic .dw $09C0 .dw Art_Monitors_Generic .db :Art_Rings .dw $07C0 .dw Art_Rings .db :Art_Block_Fragment .dw $0C00 .dw Art_Block_Fragment .db $FF Now if you build the ROM, the correct tile set loads! Well it's still a bit glitched out, but this time the game is indeed using the right tiles! Next step, we'll fix the rings so that they show up correctly. For this step, open up the file "ring_art_pointers.asm", again located in the same folder. It'll look like this: Code: RingArtPointers: ;pointers for each level .dw RingArtPointers_UGZ .dw RingArtPointers_SHZ .dw RingArtPointers_ALZ .dw RingArtPointers_GHZ .dw RingArtPointers_GMZ .dw RingArtPointers_SEZ .dw RingArtPointers_CEZ ;same? .dw DATA_231A .dw RingArtPointers_CEZ ;same? .dw DATA_2320 ;pointers for each act RingArtPointers_UGZ: .dw RingArtPointers_UGZ1 .dw RingArtPointers_UGZ2 .dw RingArtPointers_UGZ3 RingArtPointers_SHZ: .dw RingArtPointers_SHZ1 .dw RingArtPointers_SHZ2 .dw RingArtPointers_SHZ3 RingArtPointers_ALZ: .dw RingArtPointers_ALZ1 .dw RingArtPointers_ALZ2 .dw RingArtPointers_ALZ3 RingArtPointers_GHZ: .dw RingArtPointers_GHZ1 .dw RingArtPointers_GHZ2 .dw RingArtPointers_GHZ3 RingArtPointers_GMZ: .dw RingArtPointers_GMZ1 .dw RingArtPointers_GMZ2 .dw RingArtPointers_GMZ3 As with everything else in the guide so far, simply switch UGZ and GHZ around. The new pointers should look like this: Code: RingArtPointers: ;pointers for each level .dw RingArtPointers_GHZ .dw RingArtPointers_SHZ .dw RingArtPointers_ALZ .dw RingArtPointers_UGZ .dw RingArtPointers_GMZ .dw RingArtPointers_SEZ .dw RingArtPointers_CEZ ;same? .dw DATA_231A .dw RingArtPointers_CEZ ;same? .dw DATA_2320 ;pointers for each act RingArtPointers_GHZ: .dw RingArtPointers_GHZ1 .dw RingArtPointers_GHZ2 .dw RingArtPointers_GHZ3 RingArtPointers_SHZ: .dw RingArtPointers_SHZ1 .dw RingArtPointers_SHZ2 .dw RingArtPointers_SHZ3 RingArtPointers_ALZ: .dw RingArtPointers_ALZ1 .dw RingArtPointers_ALZ2 .dw RingArtPointers_ALZ3 RingArtPointers_UGZ: .dw RingArtPointers_UGZ1 .dw RingArtPointers_UGZ2 .dw RingArtPointers_UGZ3 RingArtPointers_GMZ: .dw RingArtPointers_GMZ1 .dw RingArtPointers_GMZ2 .dw RingArtPointers_GMZ3 If you build your ROM, the rings should show up correctly now! But the objects themselves need to be edited as well. So now we'll move on to editing the object layout routines. So open the file "object_layout_routines.asm" which is also located in the same folder as the zone tile sets and level headers. Search for "Data_ObjectLayouts", this is the bit of code we'll be editing for this guide. Again you'll need to switch UGZ and GHZ's object layouts like we did with the other bits of data above. It should look like this: Code: Data_ObjectLayouts: ;$8135 .dw Data_ObjectLayout_UGZ .dw Data_ObjectLayout_SHZ .dw Data_ObjectLayout_ALZ .dw Data_ObjectLayout_GHZ .dw Data_ObjectLayout_GMZ .dw Data_ObjectLayout_SEZ .dw Data_ObjectLayout_CEZ .dw Data_ObjectLayout_CEZ .dw Data_ObjectLayout_CEZ .dw Data_ObjectLayout_CEZ Data_ObjectLayout_UGZ: ;$8149 .dw Data_ObjectLayout_UGZ1 .dw Data_ObjectLayout_UGZ2 .dw Data_ObjectLayout_UGZ3 Data_ObjectLayout_SHZ: ;$814F .dw Data_ObjectLayout_SHZ1 .dw Data_ObjectLayout_SHZ2 .dw Data_ObjectLayout_SHZ3 Data_ObjectLayout_ALZ: ;$8155 .dw Data_ObjectLayout_ALZ1 .dw Data_ObjectLayout_ALZ2 .dw Data_ObjectLayout_ALZ3 Data_ObjectLayout_GHZ: ;$815B .dw Data_ObjectLayout_GHZ1 .dw Data_ObjectLayout_GHZ2 .dw Data_ObjectLayout_GHZ3 Data_ObjectLayout_GMZ: ;$8161 .dw Data_ObjectLayout_GMZ1 .dw Data_ObjectLayout_GMZ2 .dw Data_ObjectLayout_GMZ3 Data_ObjectLayout_SEZ: ;$8167 .dw Data_ObjectLayout_SEZ1 .dw Data_ObjectLayout_SEZ2 .dw Data_ObjectLayout_SEZ3 Data_ObjectLayout_CEZ: ;$816D .dw Data_ObjectLayout_CEZ1 .dw Data_ObjectLayout_CEZ2 .dw Data_ObjectLayout_CEZ3 Data_ObjectLayout_UGZ1: ;$8173 .incbin "layout/ugz/object_layout_ugz1.bin" Data_ObjectLayout_UGZ2: ;$82C1 .incbin "layout/ugz/object_layout_ugz2.bin" Data_ObjectLayout_UGZ3: ;$840F .incbin "layout/ugz/object_layout_ugz3.bin" Data_ObjectLayout_SHZ1: ;$848E .incbin "layout/shz/object_layout_shz1.bin" Data_ObjectLayout_SHZ2: ;$84E9 .incbin "layout/shz/object_layout_shz2.bin" Data_ObjectLayout_SHZ3: ;$8568 .incbin "layout/shz/object_layout_shz3.bin" Data_ObjectLayout_ALZ1: ;$8584 .incbin "layout/alz/object_layout_alz1.bin" Data_ObjectLayout_ALZ2: ;$8666 .incbin "layout/alz/object_layout_alz2.bin" Data_ObjectLayout_ALZ3: ;$87BD .incbin "layout/alz/object_layout_alz3.bin" Data_ObjectLayout_GHZ1: ;$87F4 ;.incbin "layout/ghz/object_layout_ghz1.bin" .include "layout/ghz/object_layout_ghz1.asm" Data_ObjectLayout_GHZ2: ;$88C4 .incbin "layout/ghz/object_layout_ghz2.bin" Data_ObjectLayout_GHZ3: ;$8970 .incbin "layout/ghz/object_layout_ghz3.bin" Data_ObjectLayout_GMZ1: ;$8983 .incbin "layout/gmz/object_layout_gmz1.bin" Data_ObjectLayout_GMZ2: ;$8A4A .incbin "layout/gmz/object_layout_gmz2.bin" Data_ObjectLayout_GMZ3: ;$8AFF .incbin "layout/gmz/object_layout_gmz3.bin" Data_ObjectLayout_SEZ1: ;$8B24 .incbin "layout/sez/object_layout_sez1.bin" Data_ObjectLayout_SEZ2: ;$8BE2 .incbin "layout/sez/object_layout_sez2.bin" Data_ObjectLayout_SEZ3: ;$8C7C .incbin "layout/sez/object_layout_sez3.bin" Data_ObjectLayout_CEZ1: ;$8C8F .incbin "layout/cez/object_layout_cez1.bin" Data_ObjectLayout_CEZ2: ;$8D20 .incbin "layout/cez/object_layout_cez2.bin" Data_ObjectLayout_CEZ3: ;$8D8D .incbin "layout/cez/object_layout_cez3.bin" After switching the data around, your code should now look like the following: Code: Data_ObjectLayouts: ;$8135 .dw Data_ObjectLayout_GHZ .dw Data_ObjectLayout_SHZ .dw Data_ObjectLayout_ALZ .dw Data_ObjectLayout_UGZ .dw Data_ObjectLayout_GMZ .dw Data_ObjectLayout_SEZ .dw Data_ObjectLayout_CEZ .dw Data_ObjectLayout_CEZ .dw Data_ObjectLayout_CEZ .dw Data_ObjectLayout_CEZ Data_ObjectLayout_GHZ: ;$815B .dw Data_ObjectLayout_GHZ1 .dw Data_ObjectLayout_GHZ2 .dw Data_ObjectLayout_GHZ3 Data_ObjectLayout_SHZ: ;$814F .dw Data_ObjectLayout_SHZ1 .dw Data_ObjectLayout_SHZ2 .dw Data_ObjectLayout_SHZ3 Data_ObjectLayout_ALZ: ;$8155 .dw Data_ObjectLayout_ALZ1 .dw Data_ObjectLayout_ALZ2 .dw Data_ObjectLayout_ALZ3 Data_ObjectLayout_UGZ: ;$8149 .dw Data_ObjectLayout_UGZ1 .dw Data_ObjectLayout_UGZ2 .dw Data_ObjectLayout_UGZ3 Data_ObjectLayout_GMZ: ;$8161 .dw Data_ObjectLayout_GMZ1 .dw Data_ObjectLayout_GMZ2 .dw Data_ObjectLayout_GMZ3 Data_ObjectLayout_SEZ: ;$8167 .dw Data_ObjectLayout_SEZ1 .dw Data_ObjectLayout_SEZ2 .dw Data_ObjectLayout_SEZ3 Data_ObjectLayout_CEZ: ;$816D .dw Data_ObjectLayout_CEZ1 .dw Data_ObjectLayout_CEZ2 .dw Data_ObjectLayout_CEZ3 Data_ObjectLayout_UGZ1: ;$8173 .incbin "layout/ugz/object_layout_ugz1.bin" Data_ObjectLayout_UGZ2: ;$82C1 .incbin "layout/ugz/object_layout_ugz2.bin" Data_ObjectLayout_UGZ3: ;$840F .incbin "layout/ugz/object_layout_ugz3.bin" Data_ObjectLayout_SHZ1: ;$848E .incbin "layout/shz/object_layout_shz1.bin" Data_ObjectLayout_SHZ2: ;$84E9 .incbin "layout/shz/object_layout_shz2.bin" Data_ObjectLayout_SHZ3: ;$8568 .incbin "layout/shz/object_layout_shz3.bin" Data_ObjectLayout_ALZ1: ;$8584 .incbin "layout/alz/object_layout_alz1.bin" Data_ObjectLayout_ALZ2: ;$8666 .incbin "layout/alz/object_layout_alz2.bin" Data_ObjectLayout_ALZ3: ;$87BD .incbin "layout/alz/object_layout_alz3.bin" Data_ObjectLayout_GHZ1: ;$87F4 ;.incbin "layout/ghz/object_layout_ghz1.bin" .include "layout/ghz/object_layout_ghz1.asm" Data_ObjectLayout_GHZ2: ;$88C4 .incbin "layout/ghz/object_layout_ghz2.bin" Data_ObjectLayout_GHZ3: ;$8970 .incbin "layout/ghz/object_layout_ghz3.bin" Data_ObjectLayout_GMZ1: ;$8983 .incbin "layout/gmz/object_layout_gmz1.bin" Data_ObjectLayout_GMZ2: ;$8A4A .incbin "layout/gmz/object_layout_gmz2.bin" Data_ObjectLayout_GMZ3: ;$8AFF .incbin "layout/gmz/object_layout_gmz3.bin" Data_ObjectLayout_SEZ1: ;$8B24 .incbin "layout/sez/object_layout_sez1.bin" Data_ObjectLayout_SEZ2: ;$8BE2 .incbin "layout/sez/object_layout_sez2.bin" Data_ObjectLayout_SEZ3: ;$8C7C .incbin "layout/sez/object_layout_sez3.bin" Data_ObjectLayout_CEZ1: ;$8C8F .incbin "layout/cez/object_layout_cez1.bin" Data_ObjectLayout_CEZ2: ;$8D20 .incbin "layout/cez/object_layout_cez2.bin" Data_ObjectLayout_CEZ3: ;$8D8D .incbin "layout/cez/object_layout_cez3.bin" Now the object layouts will show up correctly! We're not done yet of course! Sonic still starts at the wrong position, the loops don't work, the title card is still Underground Zone's, UGZ's music still plays, and the game is still using UGZ's palette. So let's fix all those issues shall we? Let's start with Sonic's starting position. In order to fix this, open up "level_layout_intial_positions.asm". This tells the game where to place Sonic at the start of each level. When you open up the file, you are greeted with the following: Code: /**************************************************************** * Starting positions for screen & Sonic for each zone/act. * ****************************************************************/ ;------------------------------- ; pointers for each zone ;------------------------------- LevelLayout_Data_InitPos: ;$5401 .dw LevelLayout_Data_InitPos_UGZ .dw LevelLayout_Data_InitPos_SHZ .dw LevelLayout_Data_InitPos_ALZ .dw LevelLayout_Data_InitPos_GHZ .dw LevelLayout_Data_InitPos_GMZ .dw LevelLayout_Data_InitPos_SEZ .dw LevelLayout_Data_InitPos_CEZ .dw DATA_543F .dw DATA_5445 .dw DATA_544B ;------------------------------- ; pointers for each act ;------------------------------- LevelLayout_Data_InitPos_UGZ: ;$5415 .dw LevelLayout_Data_InitPos_UGZ1 .dw LevelLayout_Data_InitPos_UGZ2 .dw LevelLayout_Data_InitPos_UGZ3 LevelLayout_Data_InitPos_SHZ: ;$541B .dw LevelLayout_Data_InitPos_SHZ1 .dw LevelLayout_Data_InitPos_SHZ2 .dw LevelLayout_Data_InitPos_SHZ3 LevelLayout_Data_InitPos_ALZ: ;$5421 .dw LevelLayout_Data_InitPos_ALZ1 .dw LevelLayout_Data_InitPos_ALZ2 .dw LevelLayout_Data_InitPos_ALZ3 LevelLayout_Data_InitPos_GHZ: ;$5427 .dw LevelLayout_Data_InitPos_GHZ1 .dw LevelLayout_Data_InitPos_GHZ2 .dw LevelLayout_Data_InitPos_GHZ3 LevelLayout_Data_InitPos_GMZ: ;$542D .dw LevelLayout_Data_InitPos_GMZ1 .dw LevelLayout_Data_InitPos_GMZ2 .dw LevelLayout_Data_InitPos_GMZ3 LevelLayout_Data_InitPos_SEZ: ;$5433 .dw LevelLayout_Data_InitPos_SEZ1 .dw LevelLayout_Data_InitPos_SEZ2 .dw LevelLayout_Data_InitPos_SEZ3 LevelLayout_Data_InitPos_CEZ: ;$5439 .dw LevelLayout_Data_InitPos_CEZ1 .dw LevelLayout_Data_InitPos_CEZ2 .dw LevelLayout_Data_InitPos_CEZ3 DATA_543F: .dw DATA_54F9 .dw DATA_54F9 .dw DATA_54F9 DATA_5445: .dw DATA_5501 .dw DATA_5509 .dw DATA_5511 DATA_544B: .dw DATA_5519 .dw DATA_5521 .dw DATA_5529 ;------------------------------------- ; The position data ;-------------------------------------- ; ,-- Initial cam horiz. offset ; | ,- Intial cam vert. offset ; | | ,- Initial sprite horiz offset ; | | | ,- Initial sprite vert. offset ; |--------|---------|---------|---------| ; $00, $00, $30, $00, $88, $00, $A8, $00 LevelLayout_Data_InitPos_UGZ1: ;$5451 .db $00, $00, $30, $00, $88, $00, $A8, $00 LevelLayout_Data_InitPos_UGZ2: ;$5459 .db $00, $00, $70, $00, $84, $00, $08, $01 LevelLayout_Data_InitPos_UGZ3: ;$561 .db $00, $00, $10, $00, $84, $00, $88, $00 LevelLayout_Data_InitPos_SHZ1: ;$5469 .db $00, $00, $DE, $03, $80, $00, $4E, $04 LevelLayout_Data_InitPos_SHZ2: .db $00, $00, $75, $00, $72, $00, $EE, $00 LevelLayout_Data_InitPos_SHZ3: .db $00, $00, $20, $00, $80, $00, $A8, $00 LevelLayout_Data_InitPos_ALZ1: ;$5481 .db $00, $00, $E0, $00, $38, $00, $68, $01 LevelLayout_Data_InitPos_ALZ2: ;$5489 .db $00, $00, $18, $00, $88, $00, $A8, $00 LevelLayout_Data_InitPos_ALZ3: ;$5491 .db $00, $00, $30, $00, $48, $00, $A8, $00 LevelLayout_Data_InitPos_GHZ1: ;$5499 .db $00, $00, $80, $00, $70, $00, $08, $01 LevelLayout_Data_InitPos_GHZ2: ;$54A1 .db $00, $00, $E0, $00, $60, $00, $68, $01 LevelLayout_Data_InitPos_GHZ3: ;$54A9 .db $20, $00, $D8, $01, $A0, $00, $68, $02 LevelLayout_Data_InitPos_GMZ1: ;$54B1 .db $00, $00, $B0, $02, $50, $00, $28, $03 LevelLayout_Data_InitPos_GMZ2: ;$54B9 .db $00, $00, $78, $02, $90, $00, $08, $03 LevelLayout_Data_InitPos_GMZ3: ;$54C1 .db $00, $00, $08, $00, $90, $00, $58, $00 LevelLayout_Data_InitPos_SEZ1: ;$54C9 .db $00, $00, $E0, $0A, $90, $00, $68, $0B LevelLayout_Data_InitPos_SEZ2: ;$54D1 .db $A8, $00, $1E, $02, $24, $01, $AE, $02 LevelLayout_Data_InitPos_SEZ3: ;$54D9 .db $00, $00, $B8, $0D, $78, $00, $48, $0E LevelLayout_Data_InitPos_CEZ1: ;$54E1 .db $00, $00, $38, $00, $88, $00, $C8, $00 LevelLayout_Data_InitPos_CEZ2: ;$54E9 .db $70, $00, $9E, $07, $F4, $00, $2E, $08 LevelLayout_Data_InitPos_CEZ3: ;$54F1 .db $00, $00, $38, $00, $88, $00, $C8, $00 DATA_54F9 .db $00, $00, $00, $01, $B0, $00, $70, $01 DATA_5501 .db $80, $00, $00, $00, $80, $00, $80, $00 DATA_5509 .db $80, $00, $00, $00, $80, $00, $80, $00 DATA_5511 .db $80, $00, $00, $00, $80, $00, $80, $00 DATA_5519 .db $00, $00, $2C, $00, $70, $00, $8C, $00 DATA_5521 .db $00, $00, $2C, $00, $80, $00, $8C, $00 DATA_5529 .db $00, $00, $2C, $00, $80, $00, $8C, $00 At this point you should know that we're moving things around again. This time though, you need to move not only the pointers for the zone and acts, you also need to move the position data as well. Once you do so, your code should look like the following: Code: /**************************************************************** * Starting positions for screen & Sonic for each zone/act. * ****************************************************************/ ;------------------------------- ; pointers for each zone ;------------------------------- LevelLayout_Data_InitPos: ;$5401 .dw LevelLayout_Data_InitPos_GHZ .dw LevelLayout_Data_InitPos_SHZ .dw LevelLayout_Data_InitPos_ALZ .dw LevelLayout_Data_InitPos_UGZ .dw LevelLayout_Data_InitPos_GMZ .dw LevelLayout_Data_InitPos_SEZ .dw LevelLayout_Data_InitPos_CEZ .dw DATA_543F .dw DATA_5445 .dw DATA_544B ;------------------------------- ; pointers for each act ;------------------------------- LevelLayout_Data_InitPos_GHZ: ;$5427 .dw LevelLayout_Data_InitPos_GHZ1 .dw LevelLayout_Data_InitPos_GHZ2 .dw LevelLayout_Data_InitPos_GHZ3 LevelLayout_Data_InitPos_SHZ: ;$541B .dw LevelLayout_Data_InitPos_SHZ1 .dw LevelLayout_Data_InitPos_SHZ2 .dw LevelLayout_Data_InitPos_SHZ3 LevelLayout_Data_InitPos_ALZ: ;$5421 .dw LevelLayout_Data_InitPos_ALZ1 .dw LevelLayout_Data_InitPos_ALZ2 .dw LevelLayout_Data_InitPos_ALZ3 LevelLayout_Data_InitPos_UGZ: ;$5415 .dw LevelLayout_Data_InitPos_UGZ1 .dw LevelLayout_Data_InitPos_UGZ2 .dw LevelLayout_Data_InitPos_UGZ3 LevelLayout_Data_InitPos_GMZ: ;$542D .dw LevelLayout_Data_InitPos_GMZ1 .dw LevelLayout_Data_InitPos_GMZ2 .dw LevelLayout_Data_InitPos_GMZ3 LevelLayout_Data_InitPos_SEZ: ;$5433 .dw LevelLayout_Data_InitPos_SEZ1 .dw LevelLayout_Data_InitPos_SEZ2 .dw LevelLayout_Data_InitPos_SEZ3 LevelLayout_Data_InitPos_CEZ: ;$5439 .dw LevelLayout_Data_InitPos_CEZ1 .dw LevelLayout_Data_InitPos_CEZ2 .dw LevelLayout_Data_InitPos_CEZ3 DATA_543F: .dw DATA_54F9 .dw DATA_54F9 .dw DATA_54F9 DATA_5445: .dw DATA_5501 .dw DATA_5509 .dw DATA_5511 DATA_544B: .dw DATA_5519 .dw DATA_5521 .dw DATA_5529 ;------------------------------------- ; The position data ;-------------------------------------- ; ,-- Initial cam horiz. offset ; | ,- Intial cam vert. offset ; | | ,- Initial sprite horiz offset ; | | | ,- Initial sprite vert. offset ; |--------|---------|---------|---------| ; $00, $00, $30, $00, $88, $00, $A8, $00 LevelLayout_Data_InitPos_GHZ1: ;$5499 .db $00, $00, $80, $00, $70, $00, $08, $01 LevelLayout_Data_InitPos_GHZ2: ;$54A1 .db $00, $00, $E0, $00, $60, $00, $68, $01 LevelLayout_Data_InitPos_GHZ3: ;$54A9 .db $20, $00, $D8, $01, $A0, $00, $68, $02 LevelLayout_Data_InitPos_SHZ1: ;$5469 .db $00, $00, $DE, $03, $80, $00, $4E, $04 LevelLayout_Data_InitPos_SHZ2: .db $00, $00, $75, $00, $72, $00, $EE, $00 LevelLayout_Data_InitPos_SHZ3: .db $00, $00, $20, $00, $80, $00, $A8, $00 LevelLayout_Data_InitPos_ALZ1: ;$5481 .db $00, $00, $E0, $00, $38, $00, $68, $01 LevelLayout_Data_InitPos_ALZ2: ;$5489 .db $00, $00, $18, $00, $88, $00, $A8, $00 LevelLayout_Data_InitPos_ALZ3: ;$5491 .db $00, $00, $30, $00, $48, $00, $A8, $00 LevelLayout_Data_InitPos_UGZ1: ;$5451 .db $00, $00, $30, $00, $88, $00, $A8, $00 LevelLayout_Data_InitPos_UGZ2: ;$5459 .db $00, $00, $70, $00, $84, $00, $08, $01 LevelLayout_Data_InitPos_UGZ3: ;$561 .db $00, $00, $10, $00, $84, $00, $88, $00 LevelLayout_Data_InitPos_GMZ1: ;$54B1 .db $00, $00, $B0, $02, $50, $00, $28, $03 LevelLayout_Data_InitPos_GMZ2: ;$54B9 .db $00, $00, $78, $02, $90, $00, $08, $03 LevelLayout_Data_InitPos_GMZ3: ;$54C1 .db $00, $00, $08, $00, $90, $00, $58, $00 LevelLayout_Data_InitPos_SEZ1: ;$54C9 .db $00, $00, $E0, $0A, $90, $00, $68, $0B LevelLayout_Data_InitPos_SEZ2: ;$54D1 .db $A8, $00, $1E, $02, $24, $01, $AE, $02 LevelLayout_Data_InitPos_SEZ3: ;$54D9 .db $00, $00, $B8, $0D, $78, $00, $48, $0E LevelLayout_Data_InitPos_CEZ1: ;$54E1 .db $00, $00, $38, $00, $88, $00, $C8, $00 LevelLayout_Data_InitPos_CEZ2: ;$54E9 .db $70, $00, $9E, $07, $F4, $00, $2E, $08 LevelLayout_Data_InitPos_CEZ3: ;$54F1 .db $00, $00, $38, $00, $88, $00, $C8, $00 DATA_54F9 .db $00, $00, $00, $01, $B0, $00, $70, $01 DATA_5501 .db $80, $00, $00, $00, $80, $00, $80, $00 DATA_5509 .db $80, $00, $00, $00, $80, $00, $80, $00 DATA_5511 .db $80, $00, $00, $00, $80, $00, $80, $00 DATA_5519 .db $00, $00, $2C, $00, $70, $00, $8C, $00 DATA_5521 .db $00, $00, $2C, $00, $80, $00, $8C, $00 DATA_5529 .db $00, $00, $2C, $00, $80, $00, $8C, $00 We've switched lots of data around so far, but again we're not done! At this point Sonic starts in the correct position, the level layout and tile sets show up fine, same with object layouts. Now we just need to fix the music, loops, title card and palette. Let's fix the palette next in our guide! Now we need to open the main source file, which is simply called "s2.asm". It's also located in the src folder. Open it up and search for "LevelPaletteValues:". It should look like this: Code: .db $0E, $09 .db $0E, $09 .db $0E, $09 ;shz .db $0F, $05 .db $10, $06 .db $0F, $05 ;alz .db $11, $07 .db $12, $08 .db $11, $07 ;ghz .db $13, $04 .db $13, $04 .db $13, $04 Simply switch the first array with the array under the text ";ghz". Your new code should look like the following: Code: .db $13, $04 .db $13, $04 .db $13, $04 ;shz .db $0F, $05 .db $10, $06 .db $0F, $05 ;alz .db $11, $07 .db $12, $08 .db $11, $07 ;ghz .db $0E, $09 .db $0E, $09 .db $0E, $09 Build your ROM and the game should now load the correct palette! We're almost there folks! You almost have a fully working GHZ in place of UGZ and vice versa. Let's go ahead and fix the loops shall we? In the same file, make a search for "label_36B2:". This is the code that tells the game to load the loop motion data for GHZ. Since the loops are hard coded, this routine fetches the data to move Sonic in a loop otherwise he does nothing in loops! Look for this bit of code. Code: ld a, (CurrentLevel) ;check for GHZ cp $03 ret nz Change the "cp $03" to "cp $00" without the quotation marks. Save and build your rom. The loops should now function correctly! Next, let's change the music. To change the music, make a search for "ZoneMusicTracks_Start" in the same file. Simply switch UGZ and GHZ music track listing around. It should look like this afterwards. Code: .db $85, $85, $85 ;Under Ground Zone .db $86, $86, $86 ;Sky High Zone .db $81, $81, $81 ;Aqua Lake Zone .db $82, $82, $82 ;Green Hills Zone .db $83, $83, $83 ;Gimmick Mountain Zone .db $87, $87, $87 ;Scrambled Egg Zone .db $84, $84 ;Crystal Egg Zone .db $89 ;Boss/Crystal Egg Act 3 .db $91, $91, $91 ;End Credits Build your ROM and the music will be correct! GHZ and UGZ have officially been switched around! Now let's finish this off by switching the title cards around! Locate the file "titlecard_mappings.asm" which is located in the src folder. Once the file is opened, it should look like this: Code: .dw DATA_2A34 ;UGZ .dw DATA_2AA4 ;SHZ .dw DATA_29C4 ;ALZ .dw DATA_2904 ;GHZ .dw DATA_2B14 ;GMZ .dw DATA_2BF4 ;SEZ .dw DATA_2C64 ;CEZ DATA_28FE: ;mappings for act logo .dw DATA_2E04 .dw DATA_2E90 .dw DATA_2F1C Again like everything else that we switched around in the guide, you need to switch UGZ and GHZ's title card mappings around. So afterwards, the mappings should look like this: Code: .dw DATA_2904 ;UGZ .dw DATA_2AA4 ;SHZ .dw DATA_29C4 ;ALZ .dw DATA_2A34;GHZ .dw DATA_2B14 ;GMZ .dw DATA_2BF4 ;SEZ .dw DATA_2C64 ;CEZ DATA_28FE: ;mappings for act logo .dw DATA_2E04 .dw DATA_2E90 .dw DATA_2F1C Now the mappings show up correctly! However it'll still use UGZ's title card picture instead of GHZ's. Let's fix that by doing the following. Open up "S2.asm" if you don't already have it opened. Search for "TitleCard_PicturePointers:". It'll look like this: Code: _DATA_7761: ; Mappings ; | Tiles ; |------|-----| ;.dw $B806, $8000 ;.dw $B906, $89A0 ;.dw $BA06, $9410 ;.dw $BB06, $9DC0 ;.dw $BC06, $A446 ;.dw $BD06, $AC26 ;.dw $BE06, $B0A6 .dw UGZ_Title_Pic_Mappings, UGZ_Title_Pic_Art .dw SHZ_Title_Pic_Mappings, SHZ_Title_Pic_Art .dw ALZ_Title_Pic_Mappings, ALZ_Title_Pic_Art .dw GHZ_Title_Pic_Mappings, GHZ_Title_Pic_Art .dw GMZ_Title_Pic_Mappings, GMZ_Title_Pic_Art .dw SEZ_Title_Pic_Mappings, SEZ_Title_Pic_Art .dw CEZ_Title_Pic_Mappings, CEZ_Title_Pic_Art Switch UGZ_Title_Pic_Mappings, UGZ_Title_Pic_Art and GHZ_Title_Pic_Mappings, and GHZ_Title_Pic_Art around. Your new code should look like the following: Code: .dw GHZ_Title_Pic_Mappings, GHZ_Title_Pic_Art .dw SHZ_Title_Pic_Mappings, SHZ_Title_Pic_Art .dw ALZ_Title_Pic_Mappings, ALZ_Title_Pic_Art .dw UGZ_Title_Pic_Mappings, UGZ_Title_Pic_Art .dw GMZ_Title_Pic_Mappings, GMZ_Title_Pic_Art .dw SEZ_Title_Pic_Mappings, SEZ_Title_Pic_Art .dw CEZ_Title_Pic_Mappings, CEZ_Title_Pic_Art Now the pictures will load correctly, however the palette is wrong! So open the file "palettes.asm" located in the includes folder located in the src folder. Search for "Palette_TitleCard_UGZ.bin" and "Palette_TitleCard_GHZ.bin". Switch those two files around, and save the file. Now we just need to change the level select code! Locate the file "level_select.asm" located in the src file. Since the level select text uses ASCII characters, changing the text is simple. Locate "UNDER GROUND ZONE ACT-1" as well as "GREEN HILLS ZONE ACT-1". Switch the two lines of text around and make sure that the "ACT-1" text is aligned correctly otherwise it'll show up incorrectly. Next we're going to fix the level select so it loads the correct level. Locate the file "level_values.asm" located in the includes folder, which is located in the src folder. Simply change the value of UGZ to 3, and GHZ to 0. Build your rom and finally we're finished! You successfully switched the two levels around! Let me know if you run into any issues while following the guide. Please credit me if you use this, thank you! Also I must apologize for any typos, and the odd spacing as I've been writing this guide for about a hour. :V
It'd probably be better to just program in a level order routine like in the 16bit games that way you can move them around just by editing that table.