How To Change The Level Order In Sonic 2 SMS

Discussion in 'Tutorials Archive' started by Ravenfreak, Aug 12, 2017.

  1. Ravenfreak

    Ravenfreak Still hacking the 8-bit titles Member

    Joined:
    Feb 10, 2010
    Messages:
    410
    Location:
    O'Fallon, MO
    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
     
  2. LuigiXHero

    LuigiXHero Well-Known Member Member

    Joined:
    Mar 22, 2014
    Messages:
    280
    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.