Difference between revisions of "Extend the level index past $10 in Sonic 2"
From Sonic Retro
(→Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)) |
(→Initial Notes and Revisions Done) |
||
(180 intermediate revisions by 12 users not shown) | |||
Line 1: | Line 1: | ||
− | '' | + | ==Initial Notes and Revisions Done== |
+ | ''(Original guide by [[User:Kramlat|kramlat]], current revision that fixes major bugs and extends properly by [[GARY 'M 9]])'' | ||
+ | ''(Updated again by [[User:Kramlat|kramlat]], adding back custom titlecard mappings howto, due to guide being unfinished, thus finally fixing the "ZONE ZONE" bug. Replace all the empty levels with your new ones.)'' | ||
+ | ''(Updated by [[silent.creature]], fixing some code within the procedures)'' | ||
− | + | ''(Updated by [[User:Kramlat|kramlat]], moved to the current GIT disassembly)'' | |
− | + | '''WARNING:''' Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you [[SCHG_How-to:Port_Sonic_1's_Sound_Driver_to_Sonic_2|port the Sonic 1 sound driver]] or the Sonic 2 clone driver V2 first before proceeding. A lot of major data shifting will occur in this tutorial and it '''will''' make the rom size a '''lot''' bigger than it was before. This '''will''' break the Sonic 2 or even Sonic 2 beta sound driver; thus, you definitely want Sonic 1 sound driver due to the fact that it can take the shifting and still work properly. | |
− | first | + | However, if you are using Xenowhirl's 2007 Sonic 2 disassembly, it is not necessary to port any other sound driver, since it uses disassembled Z80 code which automatically references the correct locations and can thus work properly even if there are massive location shifts. |
− | + | '''EDIT:''' If you are using the svn/hg/git version, this should not be a problem because those have the sound driver disassembled and macros to keep the driver properly aligned. For this reason, we will now be using that instead of the xenowhirl one we used in the past. | |
− | |||
− | |||
− | |||
− | |||
− | + | You probably noticed that all the indexes in the game stop at $10 and when you try to extend them, by extending the Main Level Load Blocks index, you get weird glitches and crashes. It means you haven't extended all the indexes that need to be extended. | |
− | |||
− | + | We will initially extend the indexes for $20 zones, but we show that this can be extended to any number between $11 and $7F. (I didn't tried $80 and more because of the ROM cartridge size, but I think it is possible.) You will see frequently the variable-label ''NumberOfZones'', just to explain this. Please define it or substitute it to its desired value. | |
− | |||
− | + | ==Extending the Titlecard index== | |
− | + | ===Extending Main Configuration indexes=== | |
+ | ====Updating TitleCard Data==== | ||
+ | We need to allocate more card indexes for our new zone. To do this, we find: | ||
− | + | <syntaxhighlight lang="asm"> | |
− | + | ; word_13CD4: | |
+ | Obj34_TitleCardData: | ||
+ | titlecardobjdata 8, 0, $80, $1B, $240, $120, $B8 ; zone name | ||
+ | titlecardobjdata $A, $11, $40, $1C, $28, $148, $D0 ; "ZONE" | ||
+ | titlecardobjdata $C, $12, $18, $1C, $68, $188, $D0 ; act number | ||
+ | titlecardobjdata 2, 0, 0, 0, 0, 0, 0 ; blue background | ||
+ | titlecardobjdata 4, $15, $48, 8, $2A8, $168,$120 ; bottom yellow part | ||
+ | titlecardobjdata 6, $16, 8, $15, $80, $F0, $F0 ; left red part | ||
+ | Obj34_TitleCardData_End: | ||
+ | </syntaxhighlight> | ||
− | + | and change this to: | |
− | + | <syntaxhighlight lang="asm"> | |
− | |||
− | |||
− | |||
− | |||
− | <asm> | ||
; word_13CD4: | ; word_13CD4: | ||
Obj34_TitleCardData: | Obj34_TitleCardData: | ||
− | + | titlecardobjdata 8, 0, $80, $1B, $240, $120, $B8 ; zone name | |
− | + | titlecardobjdata $A, NumberOfZones+1, $40, $1C, $28, $148, $D0 ; "ZONE" | |
+ | titlecardobjdata $C, NumberOfZones+2, $18, $1C, $68, $188, $D0 ; act number | ||
+ | titlecardobjdata 2, 0, 0, 0, 0, 0, 0 ; blue background | ||
+ | titlecardobjdata 4, NumberOfZones+5, $48, 8, $2A8, $168,$120 ; bottom yellow part | ||
+ | titlecardobjdata 6, NumberOfZones+6, 8, $15, $80, $F0, $F0 ; left red part | ||
+ | Obj34_TitleCardData_End: | ||
+ | </syntaxhighlight> | ||
− | + | Where ''NumberOfZones'' is the total number of zones you want in the game. As we said before, we will work with $20 zones. The best place for it, is in '''s2.constants.asm''' | |
− | |||
− | + | ====Fixing Act Number Handler==== | |
− | + | Now, find: | |
+ | <syntaxhighlight lang="asm"> | ||
+ | Obj34_ActNumber: ; the act number, coming in | ||
+ | jsr Obj34_Wait(pc) | ||
+ | move.b (Current_Zone).w,d0 ; get the current zone | ||
+ | cmpi.b #sky_chase_zone,d0 ; is it Sky Chase? | ||
+ | beq.s BranchTo9_DeleteObject ; if yes, branch | ||
+ | cmpi.b #wing_fortress_zone,d0 ; is it Wing Fortress? | ||
+ | beq.s BranchTo9_DeleteObject ; if yes, branch | ||
+ | cmpi.b #death_egg_zone,d0 ; is it Death Egg Zone? | ||
+ | beq.s BranchTo9_DeleteObject ; if yes, branch | ||
+ | move.b (Current_Act).w,d1 ; get the current act | ||
+ | addi.b #$12,d1 ; add $12 to it (this is the index of the "1" frame in the mappings) | ||
+ | cmpi.b #metropolis_zone_2,d0 ; are we in Metropolis Zone Act 3? | ||
+ | bne.s + ; if not, branch | ||
+ | moveq #$14,d1 ; use the "3" frame instead | ||
+ | </syntaxhighlight> | ||
− | + | and change it to: | |
− | + | <syntaxhighlight lang="asm"> | |
− | + | Obj34_ActNumber: ; the act number, coming in | |
− | + | jsr Obj34_Wait(pc) | |
− | + | move.b (Current_Zone).w,d0 ; get the current zone | |
+ | cmpi.b #sky_chase_zone,d0 ; is it Sky Chase? | ||
+ | beq.s BranchTo9_DeleteObject ; if yes, branch | ||
+ | cmpi.b #wing_fortress_zone,d0 ; is it Wing Fortress? | ||
+ | beq.s BranchTo9_DeleteObject ; if yes, branch | ||
+ | cmpi.b #death_egg_zone,d0 ; is it Death Egg Zone? | ||
+ | beq.s BranchTo9_DeleteObject ; if yes, branch | ||
+ | move.b (Current_Act).w,d1 ; get the current act | ||
+ | addi.b #NumberOfZones+2,d1 ; Act number mappings (Act 1) | ||
+ | cmpi.b #metropolis_zone_2,d0 ; are we in Metropolis Zone Act 3? | ||
+ | bne.s + ; if not, branch | ||
+ | moveq #NumberOfZones+4,d1 ; Act number mappings (Act 3). Used for drawing MTZ (0x05) titlecard only | ||
+ | </syntaxhighlight> | ||
− | + | Now we have the offset data of where to load the mappings for the titlecards shifted so that we can now start working on updating the mappings and not have that strange "ZONE ZONE" bug that [[GARY 'M 9]] left behind and I intended to correct. | |
− | |||
− | |||
− | + | ====Adding new Art Load Cue Data to the TitleCards for New Zones==== | |
− | + | Next, another thing I wanted to see others correct. this time, I will explain why I changed byte_15820 into a 16-bit relative offset index as opposed to it staying as a byte-by-byte relative offset that does not point correctly, and to appropriately handle the string data in word_15832, as well as allow that string data to be properly represented. This time I will make it even clearer too. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Next off, in this part of the hack the first thing before converting to a better manageable datatype, we want to replace the byte_15820 handler with a better one. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Look for: | |
− | + | <syntaxhighlight lang="asm"> | |
− | |||
− | <asm> | ||
; loc_157D2: | ; loc_157D2: | ||
LoadTitleCard: | LoadTitleCard: | ||
Line 99: | Line 100: | ||
moveq #0,d0 | moveq #0,d0 | ||
move.b (Current_Zone).w,d0 | move.b (Current_Zone).w,d0 | ||
− | move.b | + | move.b Off_TitleCardLetters(pc,d0.w),d0 |
− | lea | + | lea TitleCardLetters(pc),a0 |
lea (a0,d0.w),a0 | lea (a0,d0.w),a0 | ||
− | move.l # | + | move.l #vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0 |
− | </ | + | </syntaxhighlight> |
− | and replace it with: | + | and we want to replace it with: |
− | <asm> | + | <syntaxhighlight lang="asm"> |
; loc_157D2: | ; loc_157D2: | ||
LoadTitleCard: | LoadTitleCard: | ||
Line 113: | Line 114: | ||
move.b (Current_Zone).w,d0 | move.b (Current_Zone).w,d0 | ||
add.w d0,d0 | add.w d0,d0 | ||
− | move.w | + | move.w Off_TitleCardLetters(pc,d0.w),d0 |
− | lea | + | lea Off_TitleCardLetters(pc,d0.w),a0 |
− | move.l # | + | move.l #vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0 |
− | </asm> | + | </syntaxhighlight> |
+ | |||
+ | That takes care of the loader, now time to update the string data. | ||
+ | |||
+ | find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; byte_15820: | ||
+ | Off_TitleCardLetters: | ||
+ | dc.b TitleCardLetters_EHZ - TitleCardLetters ; 0 | ||
+ | dc.b TitleCardLetters_EHZ - TitleCardLetters ; 1 | ||
+ | dc.b TitleCardLetters_EHZ - TitleCardLetters ; 2 | ||
+ | dc.b TitleCardLetters_EHZ - TitleCardLetters ; 3 | ||
+ | dc.b TitleCardLetters_MTZ - TitleCardLetters ; 4 | ||
+ | dc.b TitleCardLetters_MTZ - TitleCardLetters ; 5 | ||
+ | dc.b TitleCardLetters_WFZ - TitleCardLetters ; 6 | ||
+ | dc.b TitleCardLetters_HTZ - TitleCardLetters ; 7 | ||
+ | dc.b TitleCardLetters_HPZ - TitleCardLetters ; 8 | ||
+ | dc.b TitleCardLetters_EHZ - TitleCardLetters ; 9 | ||
+ | dc.b TitleCardLetters_OOZ - TitleCardLetters ; A | ||
+ | dc.b TitleCardLetters_MCZ - TitleCardLetters ; B | ||
+ | dc.b TitleCardLetters_CNZ - TitleCardLetters ; C | ||
+ | dc.b TitleCardLetters_CPZ - TitleCardLetters ; D | ||
+ | dc.b TitleCardLetters_DEZ - TitleCardLetters ; E | ||
+ | dc.b TitleCardLetters_ARZ - TitleCardLetters ; F | ||
+ | dc.b TitleCardLetters_SCZ - TitleCardLetters ; 10 | ||
+ | even | ||
+ | |||
+ | ; temporarily remap characters to title card letter format | ||
+ | ; Characters are encoded as Aa, Bb, Cc, etc. through a macro | ||
+ | charset 'A',0 ; can't have an embedded 0 in a string | ||
+ | charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4" | ||
+ | charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4" | ||
+ | charset '.',"\x5A" | ||
+ | |||
+ | ; Defines which letters load for the continue screen | ||
+ | ; Each letter occurs only once, and the letters ENOZ (i.e. ZONE) aren't loaded here | ||
+ | ; However, this is hidden by the titleLetters macro, and normal titles can be used | ||
+ | ; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here) | ||
+ | |||
+ | ; word_15832: | ||
+ | TitleCardLetters: | ||
+ | |||
+ | TitleCardLetters_EHZ: | ||
+ | titleLetters "EMERALD HILL" | ||
+ | TitleCardLetters_MTZ: | ||
+ | titleLetters "METROPOLIS" | ||
+ | TitleCardLetters_HTZ: | ||
+ | titleLetters "HILL TOP" | ||
+ | TitleCardLetters_HPZ: | ||
+ | titleLetters "HIDDEN PALACE" | ||
+ | TitleCardLetters_OOZ: | ||
+ | titleLetters "OIL OCEAN" | ||
+ | TitleCardLetters_MCZ: | ||
+ | titleLetters "MYSTIC CAVE" | ||
+ | TitleCardLetters_CNZ: | ||
+ | titleLetters "CASINO NIGHT" | ||
+ | TitleCardLetters_CPZ: | ||
+ | titleLetters "CHEMICAL PLANT" | ||
+ | TitleCardLetters_ARZ: | ||
+ | titleLetters "AQUATIC RUIN" | ||
+ | TitleCardLetters_SCZ: | ||
+ | titleLetters "SKY CHASE" | ||
+ | TitleCardLetters_WFZ: | ||
+ | titleLetters "WING FORTRESS" | ||
+ | TitleCardLetters_DEZ: | ||
+ | titleLetters "DEATH EGG" | ||
+ | |||
+ | charset ; revert character set | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | and replace it with: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ;byte_15820 | ||
+ | Off_TitleCardLetters: offsetTable | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 00 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 01 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 02 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 03 | ||
+ | offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 04 | ||
+ | offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 05 | ||
+ | offsetTableEntry.w TitleCardLetters_WFZ ; WFZ Titlecard 06 | ||
+ | offsetTableEntry.w TitleCardLetters_HTZ ; HTZ Titlecard 07 | ||
+ | offsetTableEntry.w TitleCardLetters_HPZ ; HPZ Titlecard 08 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 09 | ||
+ | offsetTableEntry.w TitleCardLetters_OOZ ; OOZ Titlecard 0A | ||
+ | offsetTableEntry.w TitleCardLetters_MCZ ; MCZ Titlecard 0B | ||
+ | offsetTableEntry.w TitleCardLetters_CNZ ; CNZ Titlecard 0C | ||
+ | offsetTableEntry.w TitleCardLetters_CPZ ; CPZ Titlecard 0D | ||
+ | offsetTableEntry.w TitleCardLetters_DEZ ; DEZ Titlecard 0E | ||
+ | offsetTableEntry.w TitleCardLetters_ARZ ; ARZ Titlecard 0F | ||
+ | offsetTableEntry.w TitleCardLetters_SCZ ; SCZ Titlecard 10 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 11 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 12 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 13 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 14 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 15 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 16 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 17 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 18 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 19 | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1A | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1B | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1C | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1D | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1E | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1F | ||
+ | offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 20 | ||
+ | |||
+ | ; temporarily remap characters to title card letter format | ||
+ | ; Characters are encoded as Aa, Bb, Cc, etc. through a macro | ||
+ | charset 'A',0 ; can't have an embedded 0 in a string | ||
+ | charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4" | ||
+ | charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4" | ||
+ | charset '.',"\x5A" | ||
+ | |||
+ | ; Defines which letters load for the continue screen | ||
+ | ; Each letter occurs only once, and the letters ENOZ (i.e. ZONE) aren't loaded here | ||
+ | ; However, this is hidden by the titleLetters macro, and normal titles can be used | ||
+ | ; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here) | ||
+ | ; word_15832: | ||
+ | TitleCardLetters: | ||
+ | |||
+ | TitleCardLetters_EHZ: | ||
+ | titleLetters "EMERALD HILL" | ||
+ | TitleCardLetters_MTZ: | ||
+ | titleLetters "METROPOLIS" | ||
+ | TitleCardLetters_HTZ: | ||
+ | titleLetters "HILL TOP" | ||
+ | TitleCardLetters_HPZ: | ||
+ | titleLetters "HIDDEN PALACE" | ||
+ | TitleCardLetters_OOZ: | ||
+ | titleLetters "OIL OCEAN" | ||
+ | TitleCardLetters_MCZ: | ||
+ | titleLetters "MYSTIC CAVE" | ||
+ | TitleCardLetters_CNZ: | ||
+ | titleLetters "CASINO NIGHT" | ||
+ | TitleCardLetters_CPZ: | ||
+ | titleLetters "CHEMICAL PLANT" | ||
+ | TitleCardLetters_ARZ: | ||
+ | titleLetters "AQUATIC RUIN" | ||
+ | TitleCardLetters_SCZ: | ||
+ | titleLetters "SKY CHASE" | ||
+ | TitleCardLetters_WFZ: | ||
+ | titleLetters "WING FORTRESS" | ||
+ | TitleCardLetters_DEZ: | ||
+ | titleLetters "DEATH EGG" | ||
+ | |||
+ | charset ; revert character set | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ''Point Fix'': This data manager, as implemented, doesn't work with a byte-string data. If you tried to use that byte-string data, you've noticed weird names. For example, Emerald Hill became Emepqrs T?rr. | ||
+ | |||
+ | This adds the basic card configuration to our new levels. You can freely edit the entries of this table to suit your needs. | ||
+ | |||
+ | ===Extending TitleCard Sprite Mappings=== | ||
+ | Now, find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; ------------------------------------------------------------------------------- | ||
+ | ; sprite mappings | ||
+ | ; ------------------------------------------------------------------------------- | ||
+ | Obj34_MapUnc_147BA: offsetTable | ||
+ | offsetTableEntry.w word_147E8 | ||
+ | offsetTableEntry.w word_147E8 | ||
+ | offsetTableEntry.w word_147E8 | ||
+ | offsetTableEntry.w word_147E8 | ||
+ | offsetTableEntry.w word_14842 | ||
+ | offsetTableEntry.w word_14842 | ||
+ | offsetTableEntry.w word_14B24 | ||
+ | offsetTableEntry.w word_14894 | ||
+ | offsetTableEntry.w word_148CE | ||
+ | offsetTableEntry.w word_147E8 | ||
+ | offsetTableEntry.w word_14930 | ||
+ | offsetTableEntry.w word_14972 | ||
+ | offsetTableEntry.w word_149C4 | ||
+ | offsetTableEntry.w word_14A1E | ||
+ | offsetTableEntry.w word_14B86 | ||
+ | offsetTableEntry.w word_14A88 | ||
+ | offsetTableEntry.w word_14AE2 | ||
+ | offsetTableEntry.w word_14BC8 | ||
+ | offsetTableEntry.w word_14BEA | ||
+ | offsetTableEntry.w word_14BF4 | ||
+ | offsetTableEntry.w word_14BFE | ||
+ | offsetTableEntry.w word_14C08 | ||
+ | offsetTableEntry.w word_14C32 | ||
+ | word_147E8: dc.w $B | ||
+ | dc.w 5, $8580, $82C0, $FFC3 | ||
+ | dc.w 9, $85DE, $82EF, $FFD0 | ||
+ | dc.w 5, $8580, $82C0, $FFE8 | ||
+ | dc.w 5, $85E4, $82F2, $FFF8 | ||
+ | dc.w 5, $85E8, $82F4, 8 | ||
+ | dc.w 5, $85EC, $82F6, $18 | ||
+ | dc.w 5, $85F0, $82F8, $28 | ||
+ | dc.w 5, $85F4, $82FA, $48 | ||
+ | dc.w 1, $85F8, $82FC, $58 | ||
+ | dc.w 5, $85EC, $82F6, $60 | ||
+ | dc.w 5, $85EC, $82F6, $70 | ||
+ | word_14842: dc.w $A | ||
+ | dc.w 9, $85DE, $82EF, $FFE0 | ||
+ | dc.w 5, $8580, $82C0, $FFF8 | ||
+ | dc.w 5, $85E4, $82F2, 8 | ||
+ | dc.w 5, $85E8, $82F4, $18 | ||
+ | dc.w 5, $8588, $82C4, $28 | ||
+ | dc.w 5, $85EC, $82F6, $38 | ||
+ | dc.w 5, $8588, $82C4, $48 | ||
+ | dc.w 5, $85F0, $82F8, $58 | ||
+ | dc.w 1, $85F4, $82FA, $68 | ||
+ | dc.w 5, $85F6, $82FB, $70 | ||
+ | word_14894: dc.w 7 | ||
+ | dc.w 5, $85DE, $82EF, 8 | ||
+ | dc.w 1, $85E2, $82F1, $18 | ||
+ | dc.w 5, $85E4, $82F2, $20 | ||
+ | dc.w 5, $85E4, $82F2, $30 | ||
+ | dc.w 5, $85E8, $82F4, $51 | ||
+ | dc.w 5, $8588, $82C4, $60 | ||
+ | dc.w 5, $85EC, $82F6, $70 | ||
+ | word_148CE: dc.w $C | ||
+ | dc.w 5, $85DE, $82EF, $FFB8 | ||
+ | dc.w 1, $85E2, $82F1, $FFC8 | ||
+ | dc.w 5, $85E4, $82F2, $FFD0 | ||
+ | dc.w 5, $85E4, $82F2, $FFE0 | ||
+ | dc.w 5, $8580, $82C0, $FFF0 | ||
+ | dc.w 5, $8584, $82C2, 0 | ||
+ | dc.w 5, $85E8, $82F4, $20 | ||
+ | dc.w 5, $85EC, $82F6, $30 | ||
+ | dc.w 5, $85F0, $82F8, $40 | ||
+ | dc.w 5, $85EC, $82F6, $50 | ||
+ | dc.w 5, $85F4, $82FA, $60 | ||
+ | dc.w 5, $8580, $82C0, $70 | ||
+ | word_14930: dc.w 8 | ||
+ | dc.w 5, $8588, $82C4, $FFFB | ||
+ | dc.w 1, $85DE, $82EF, $B | ||
+ | dc.w 5, $85E0, $82F0, $13 | ||
+ | dc.w 5, $8588, $82C4, $33 | ||
+ | dc.w 5, $85E4, $82F2, $43 | ||
+ | dc.w 5, $8580, $82C0, $53 | ||
+ | dc.w 5, $85E8, $82F4, $60 | ||
+ | dc.w 5, $8584, $82C2, $70 | ||
+ | word_14972: dc.w $A | ||
+ | dc.w 9, $85DE, $82EF, $FFD0 | ||
+ | dc.w 5, $85E4, $82F2, $FFE8 | ||
+ | dc.w 5, $85E8, $82F4, $FFF8 | ||
+ | dc.w 5, $85EC, $82F6, 8 | ||
+ | dc.w 1, $85F0, $82F8, $18 | ||
+ | dc.w 5, $85F2, $82F9, $20 | ||
+ | dc.w 5, $85F2, $82F9, $41 | ||
+ | dc.w 5, $85F6, $82FB, $50 | ||
+ | dc.w 5, $85FA, $82FD, $60 | ||
+ | dc.w 5, $8580, $82C0, $70 | ||
+ | word_149C4: dc.w $B | ||
+ | dc.w 5, $85DE, $82EF, $FFD1 | ||
+ | dc.w 5, $85E2, $82F1, $FFE0 | ||
+ | dc.w 5, $85E6, $82F3, $FFF0 | ||
+ | dc.w 1, $85EA, $82F5, 0 | ||
+ | dc.w 5, $8584, $82C2, 8 | ||
+ | dc.w 5, $8588, $82C4, $18 | ||
+ | dc.w 5, $8584, $82C2, $38 | ||
+ | dc.w 1, $85EA, $82F5, $48 | ||
+ | dc.w 5, $85EC, $82F6, $50 | ||
+ | dc.w 5, $85F0, $82F8, $60 | ||
+ | dc.w 5, $85F4, $82FA, $70 | ||
+ | word_14A1E: dc.w $D | ||
+ | dc.w 5, $85DE, $82EF, $FFA4 | ||
+ | dc.w 5, $85E2, $82F1, $FFB4 | ||
+ | dc.w 5, $8580, $82C0, $FFC4 | ||
+ | dc.w 9, $85E6, $82F3, $FFD1 | ||
+ | dc.w 1, $85EC, $82F6, $FFE9 | ||
+ | dc.w 5, $85DE, $82EF, $FFF1 | ||
+ | dc.w 5, $85EE, $82F7, 0 | ||
+ | dc.w 5, $85F2, $82F9, $10 | ||
+ | dc.w 5, $85F6, $82FB, $31 | ||
+ | dc.w 5, $85F2, $82F9, $41 | ||
+ | dc.w 5, $85EE, $82F7, $50 | ||
+ | dc.w 5, $8584, $82C2, $60 | ||
+ | dc.w 5, $85FA, $82FD, $70 | ||
+ | word_14A88: dc.w $B | ||
+ | dc.w 5, $85DE, $82EF, $FFD2 | ||
+ | dc.w 5, $85E2, $82F1, $FFE2 | ||
+ | dc.w 5, $85E6, $82F3, $FFF2 | ||
+ | dc.w 5, $85DE, $82EF, 0 | ||
+ | dc.w 5, $85EA, $82F5, $10 | ||
+ | dc.w 1, $85EE, $82F7, $20 | ||
+ | dc.w 5, $85F0, $82F8, $28 | ||
+ | dc.w 5, $85F4, $82FA, $48 | ||
+ | dc.w 5, $85E6, $82F3, $58 | ||
+ | dc.w 1, $85EE, $82F7, $68 | ||
+ | dc.w 5, $8584, $82C2, $70 | ||
+ | word_14AE2: dc.w 8 | ||
+ | dc.w 5, $85DE, $82EF, $FFF0 | ||
+ | dc.w 5, $85E2, $82F1, 0 | ||
+ | dc.w 5, $85E6, $82F3, $10 | ||
+ | dc.w 5, $85EA, $82F5, $30 | ||
+ | dc.w 5, $85EE, $82F7, $40 | ||
+ | dc.w 5, $85F2, $82F9, $50 | ||
+ | dc.w 5, $85DE, $82EF, $60 | ||
+ | dc.w 5, $8580, $82C0, $70 | ||
+ | word_14B24: dc.w $C | ||
+ | dc.w 9, $85DE, $82EF, $FFB1 | ||
+ | dc.w 1, $85E4, $82F2, $FFC8 | ||
+ | dc.w 5, $8584, $82C2, $FFD0 | ||
+ | dc.w 5, $85E6, $82F3, $FFE0 | ||
+ | dc.w 5, $85EA, $82F5, 1 | ||
+ | dc.w 5, $8588, $82C4, $10 | ||
+ | dc.w 5, $85EE, $82F7, $20 | ||
+ | dc.w 5, $85F2, $82F9, $30 | ||
+ | dc.w 5, $85EE, $82F7, $40 | ||
+ | dc.w 5, $8580, $82C0, $50 | ||
+ | dc.w 5, $85F6, $82FB, $5F | ||
+ | dc.w 5, $85F6, $82FB, $6F | ||
+ | word_14B86: dc.w 8 | ||
+ | dc.w 5, $85DE, $82EF, $FFF2 | ||
+ | dc.w 5, $8580, $82C0, 2 | ||
+ | dc.w 5, $85E2, $82F1, $10 | ||
+ | dc.w 5, $85E6, $82F3, $20 | ||
+ | dc.w 5, $85EA, $82F5, $30 | ||
+ | dc.w 5, $8580, $82C0, $51 | ||
+ | dc.w 5, $85EE, $82F7, $60 | ||
+ | dc.w 5, $85EE, $82F7, $70 | ||
+ | word_14BC8: dc.w 4 | ||
+ | dc.w 5, $858C, $82C6, 1 | ||
+ | dc.w 5, $8588, $82C4, $10 | ||
+ | dc.w 5, $8584, $82C2, $20 | ||
+ | dc.w 5, $8580, $82C0, $30 | ||
+ | word_14BEA: dc.w 1 | ||
+ | dc.w 7, $A590, $A2C8, 0 | ||
+ | word_14BF4: dc.w 1 | ||
+ | dc.w $B, $A598, $A2CC, 0 | ||
+ | word_14BFE: dc.w 1 | ||
+ | dc.w $B, $A5A4, $A2D2, 0 | ||
+ | word_14C08: dc.w 5 | ||
+ | dc.w $D, $85B0, $82D8, $FFB8 | ||
+ | dc.w $D, $85B8, $82DC, $FFD8 | ||
+ | dc.w $D, $85C0, $82E0, $FFF8 | ||
+ | dc.w $D, $85C8, $82E4, $18 | ||
+ | dc.w 5, $85D0, $82E8, $38 | ||
+ | word_14C32: dc.w 7 | ||
+ | dc.w $9003, $85D4, $82EA, 0 | ||
+ | dc.w $B003, $85D4, $82EA, 0 | ||
+ | dc.w $D003, $85D4, $82EA, 0 | ||
+ | dc.w $F003, $85D4, $82EA, 0 | ||
+ | dc.w $1003, $85D4, $82EA, 0 | ||
+ | dc.w $3003, $85D4, $82EA, 0 | ||
+ | dc.w $5003, $85D4, $82EA, 0 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | If you check the routine of Obj34, you will see this is called from anywhere it is in the ROM. Thus, we can shift this data to another place we can edit it without any code interference. I can suggest you two locations for editing: the first is the end of the disassembly. The second is the end of the header. We will use here the end of disassembly. We will replace it with: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | word_14BC8: ;keep this line to prevent errors | ||
+ | dc.w 4 ; number of letters | ||
+ | dc.w 5, $858C, $82C6, 0 ;Z | ||
+ | dc.w 5, $8588, $82C4, $10 ;O | ||
+ | dc.w 5, $8584, $82C2, $20 ;N | ||
+ | dc.w 5, $8580, $82C0, $30 ;E | ||
+ | word_14BEA: ;keep this line to prevent errors | ||
+ | dc.w $1 ; number of digits | ||
+ | dc.w 7, $A590, $A2C8, 0 ;1 | ||
+ | word_14BF4: ;keep this line to prevent errors | ||
+ | dc.w $1 ; number of digits | ||
+ | dc.w $B, $A598, $A2CC, 0 ;2 | ||
+ | word_14BFE: ;keep this line to prevent errors | ||
+ | dc.w $1 ; number of digits | ||
+ | dc.w $B, $A5A4, $A2D2, 0 ;3 | ||
+ | </syntaxhighlight> | ||
+ | for compatibility woth other mappings in the area and put this at the end of your disassembly: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; ------------------------------------------------------------------------------- | ||
+ | ; sprite mappings | ||
+ | ; ------------------------------------------------------------------------------- | ||
+ | Obj34_MapUnc_147BA: offsetTable | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 00 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 01 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 02 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 03 | ||
+ | offsetTableEntry.w Titlecard_MTZ ; MTZ 04 | ||
+ | offsetTableEntry.w Titlecard_MTZ ; MTZ 05 | ||
+ | offsetTableEntry.w Titlecard_WFZ ; WFZ 06 | ||
+ | offsetTableEntry.w Titlecard_HTZ ; HTZ 07 | ||
+ | offsetTableEntry.w Titlecard_HPZ ; HPZ 08 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 09 | ||
+ | offsetTableEntry.w Titlecard_OOZ ; OOZ 0A | ||
+ | offsetTableEntry.w Titlecard_MCZ ; MCZ 0B | ||
+ | offsetTableEntry.w Titlecard_CNZ ; CNZ 0C | ||
+ | offsetTableEntry.w Titlecard_CPZ ; CPZ 0D | ||
+ | offsetTableEntry.w Titlecard_DEZ ; DEZ 0E | ||
+ | offsetTableEntry.w Titlecard_ARZ ; ARZ 0F | ||
+ | offsetTableEntry.w Titlecard_SCZ ; SCZ 10 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 11 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 12 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 13 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 14 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 15 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 16 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 17 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 18 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 19 | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 1A | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 1B | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 1C | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 1D | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 1E | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 1F | ||
+ | offsetTableEntry.w Titlecard_EHZ ; EHZ 20 | ||
+ | offsetTableEntry.w T_ZONE ; "ZONE" | ||
+ | offsetTableEntry.w T_ACT1 ; "1" | ||
+ | offsetTableEntry.w T_ACT2 ; "2" | ||
+ | offsetTableEntry.w T_ACT3 ; "3" | ||
+ | offsetTableEntry.w T_STH ; "SONIC THE HEDGEHOG" | ||
+ | offsetTableEntry.w T_STRIPEDGE ; ">" | ||
+ | |||
+ | TitleCard_EHZ: | ||
+ | dc.w 11 ; number of letters | ||
+ | dc.w 5, $8580, $82C0, $FFC3 ;E | ||
+ | dc.w 9, $85DE, $82EF, $FFD0 ;M | ||
+ | dc.w 5, $8580, $82C0, $FFE8 ;E | ||
+ | dc.w 5, $85E4, $82F2, $FFF8 ;R | ||
+ | dc.w 5, $85E8, $82F4, 8 ;A | ||
+ | dc.w 5, $85EC, $82F6, $18 ;L | ||
+ | dc.w 5, $85F0, $82F8, $28 ;D | ||
+ | |||
+ | dc.w 5, $85F4, $82FA, $48 ;H | ||
+ | dc.w 1, $85F8, $82F2, $58 ;I | ||
+ | dc.w 5, $85EC, $82F6, $60 ;L | ||
+ | dc.w 5, $85EC, $82F6, $70 ;L | ||
+ | |||
+ | |||
+ | TitleCard_MTZ: | ||
+ | dc.w 10 ; number of letters | ||
+ | dc.w 9, $85DE, $82EF, $FFE0 ;M | ||
+ | dc.w 5, $8580, $82C0, $FFF8 ;E | ||
+ | dc.w 5, $85E4, $82F2, 8 ;T | ||
+ | dc.w 5, $85E8, $82F4, $18 ;R | ||
+ | dc.w 5, $8588, $82C4, $28 ;O | ||
+ | dc.w 5, $85EC, $82F6, $38 ;P | ||
+ | dc.w 5, $8588, $82C4, $48 ;O | ||
+ | dc.w 5, $85F0, $82F8, $58 ;L | ||
+ | dc.w 1, $85F4, $82FA, $68 ;I | ||
+ | dc.w 5, $85F6, $82FB, $70 ;S | ||
+ | |||
+ | TitleCard_WFZ: | ||
+ | dc.w 12 ; number of letters | ||
+ | dc.w 9, $85DE, $82EF, $FFB0 ;W | ||
+ | dc.w 1, $85E4, $82F2, $FFC8 ;I | ||
+ | dc.w 5, $8584, $82C2, $FFD0 ;N | ||
+ | dc.w 5, $85E6, $82F3, $FFE0 ;G | ||
+ | |||
+ | dc.w 5, $85EA, $82F5, 0 ;F | ||
+ | dc.w 5, $8588, $82C4, $10 ;O | ||
+ | dc.w 5, $85EE, $82F7, $20 ;R | ||
+ | dc.w 5, $85F2, $82F9, $30 ;T | ||
+ | dc.w 5, $85EE, $82F7, $40 ;R | ||
+ | dc.w 5, $8580, $82C0, $50 ;E | ||
+ | dc.w 5, $85F6, $82FB, $60 ;S | ||
+ | dc.w 5, $85F6, $82FB, $70 ;S | ||
+ | |||
+ | TitleCard_HTZ: | ||
+ | dc.w 7 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, 8 ;H | ||
+ | dc.w 1, $85E2, $82F1, $18 ;I | ||
+ | dc.w 5, $85E4, $82F2, $20 ;L | ||
+ | dc.w 5, $85E4, $82F2, $30 ;L | ||
+ | |||
+ | dc.w 5, $85E8, $82F4, $50 ;T | ||
+ | dc.w 5, $8588, $82C4, $60 ;O | ||
+ | dc.w 5, $85EC, $82F6, $70 ;P | ||
+ | |||
+ | TitleCard_HPZ: | ||
+ | dc.w 12 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, $FFB8 ;H | ||
+ | dc.w 1, $85E2, $82F1, $FFC8 ;I | ||
+ | dc.w 5, $85E4, $82F2, $FFD0 ;D | ||
+ | dc.w 5, $85E4, $82F2, $FFE0 ;D | ||
+ | dc.w 5, $8580, $82C0, $FFF0 ;E | ||
+ | dc.w 5, $8584, $82C4, 0 ;N | ||
+ | |||
+ | dc.w 5, $85E8, $82F4, $20 ;P | ||
+ | dc.w 5, $85EC, $82F6, $30 ;A | ||
+ | dc.w 5, $85F0, $82F8, $40 ;L | ||
+ | dc.w 5, $85EC, $82F6, $50 ;A | ||
+ | dc.w 5, $85F4, $82FA, $60 ;C | ||
+ | dc.w 5, $8580, $82C0, $70 ;E | ||
+ | |||
+ | TitleCard_OOZ: | ||
+ | dc.w 8 ; number of letters | ||
+ | dc.w 5, $8588, $82C4, $FFF8 ;O | ||
+ | dc.w 1, $85DE, $82EF, 8 ;I | ||
+ | dc.w 5, $85E0, $82F0, $10 ;L | ||
+ | |||
+ | dc.w 5, $8588, $82C4, $30 ;O | ||
+ | dc.w 5, $85E4, $82F2, $40 ;C | ||
+ | dc.w 5, $8580, $82C0, $50 ;E | ||
+ | dc.w 5, $85E8, $82F4, $60 ;A | ||
+ | dc.w 5, $8584, $82C2, $70 ;N | ||
+ | |||
+ | TitleCard_MCZ: | ||
+ | dc.w 10 ; number of letters | ||
+ | dc.w 9, $85DE, $82EF, $FFD0 ;M | ||
+ | dc.w 5, $85E4, $82F2, $FFE8 ;Y | ||
+ | dc.w 5, $85E8, $82F4, $FFF8 ;S | ||
+ | dc.w 5, $85EC, $82F6, 8 ;T | ||
+ | dc.w 1, $85F0, $82F8, $18 ;I | ||
+ | dc.w 5, $85F2, $82F9, $20 ;C | ||
+ | |||
+ | dc.w 5, $85F2, $82F9, $40 ;C | ||
+ | dc.w 5, $85F6, $82FB, $50 ;A | ||
+ | dc.w 5, $85FA, $82FD, $60 ;V | ||
+ | dc.w 5, $8580, $82C0, $70 ;E | ||
+ | |||
+ | TitleCard_CNZ: | ||
+ | dc.w 11 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, $FFD0 ;C | ||
+ | dc.w 5, $85E2, $82F1, $FFE0 ;A | ||
+ | dc.w 5, $85E6, $82F3, $FFF0 ;S | ||
+ | dc.w 1, $85EA, $82F5, 0 ;I | ||
+ | dc.w 5, $8584, $82C2, 8 ;N | ||
+ | dc.w 5, $8588, $82C4, $18 ;O | ||
+ | |||
+ | dc.w 5, $8584, $82C2, $38 ;N | ||
+ | dc.w 1, $85EA, $82F5, $48 ;I | ||
+ | dc.w 5, $85EC, $82F6, $50 ;G | ||
+ | dc.w 5, $85F0, $82F8, $60 ;H | ||
+ | dc.w 5, $85F4, $82FA, $70 ;T | ||
+ | |||
+ | TitleCard_CPZ: | ||
+ | dc.w 13 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, $FFA0 ;C | ||
+ | dc.w 5, $85E2, $82F1, $FFB0 ;H | ||
+ | dc.w 5, $8580, $82C0, $FFC0 ;E | ||
+ | dc.w 9, $85E6, $82F3, $FFD0 ;M | ||
+ | dc.w 1, $85EC, $82F6, $FFE8 ;I | ||
+ | dc.w 5, $85DE, $82EF, $FFF0 ;C | ||
+ | dc.w 5, $85EE, $82F7, 0 ;A | ||
+ | dc.w 5, $85F2, $82F9, $10 ;L | ||
+ | |||
+ | dc.w 5, $85F6, $82FB, $30 ;P | ||
+ | dc.w 5, $85F2, $82F9, $40 ;L | ||
+ | dc.w 5, $85EE, $82F7, $50 ;A | ||
+ | dc.w 5, $8584, $82C2, $60 ;N | ||
+ | dc.w 5, $85FA, $82FD, $70 ;T | ||
+ | |||
+ | TitleCard_DEZ: | ||
+ | dc.w 8 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, $FFF0 ;D | ||
+ | dc.w 5, $8580, $82C0, 0 ;E | ||
+ | dc.w 5, $85E2, $82F1, $10 ;A | ||
+ | dc.w 5, $85E6, $82F3, $20 ;T | ||
+ | dc.w 5, $85EA, $82F5, $30 ;H | ||
+ | |||
+ | dc.w 5, $8580, $82C0, $50 ;E | ||
+ | dc.w 5, $85EE, $82F7, $60 ;G | ||
+ | dc.w 5, $85EE, $82F7, $70 ;G | ||
+ | |||
+ | TitleCard_ARZ: | ||
+ | dc.w 11 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, $FFD0 ;A | ||
+ | dc.w 5, $85E2, $82F1, $FFE0 ;Q | ||
+ | dc.w 5, $85E6, $82F3, $FFF0 ;U | ||
+ | dc.w 5, $85DE, $82EF, 0 ;A | ||
+ | dc.w 5, $85EA, $82F5, $10 ;T | ||
+ | dc.w 1, $85EE, $82F7, $20 ;I | ||
+ | dc.w 5, $85F0, $82F8, $28 ;C | ||
+ | |||
+ | dc.w 5, $85F4, $82FA, $48 ;R | ||
+ | dc.w 5, $85E6, $82F3, $58 ;U | ||
+ | dc.w 1, $85EE, $82F7, $68 ;I | ||
+ | dc.w 5, $8584, $82C2, $70 ;N | ||
+ | |||
+ | TitleCard_SCZ: | ||
+ | dc.w 8 ; number of letters | ||
+ | dc.w 5, $85DE, $82EF, $FFF0 ;S | ||
+ | dc.w 5, $85E2, $82F1, 0 ;K | ||
+ | dc.w 5, $85E6, $82F3, $10 ;Y | ||
+ | |||
+ | dc.w 5, $85EA, $82F5, $30 ;C | ||
+ | dc.w 5, $85EE, $82F7, $40 ;H | ||
+ | dc.w 5, $85F2, $82F7, $50 ;A | ||
+ | dc.w 5, $85DE, $82EF, $60 ;S | ||
+ | dc.w 5, $8580, $82C0, $70 ;E | ||
+ | |||
+ | T_ZONE: | ||
+ | dc.w 4 ; number of letters | ||
+ | dc.w 5, $858C, $82C6, 0 ;Z | ||
+ | dc.w 5, $8588, $82C4, $10 ;O | ||
+ | dc.w 5, $8584, $82C2, $20 ;N | ||
+ | dc.w 5, $8580, $82C0, $30 ;E | ||
+ | |||
+ | T_ACT1: | ||
+ | dc.w $1 ; number of digits | ||
+ | dc.w 7, $A590, $A2C8, 0 ;1 | ||
+ | |||
+ | T_ACT2: | ||
+ | dc.w $1 ; number of digits | ||
+ | dc.w $B, $A598, $A2CC, 0 ;2 | ||
+ | |||
+ | T_ACT3: | ||
+ | dc.w $1 ; number of digits | ||
+ | dc.w $B, $A5A4, $A2D2, 0 ;3 | ||
+ | |||
+ | T_STH: | ||
+ | dc.w $5 ; number of tiles (what they say is below) | ||
+ | dc.w $D, $85B0, $82DE, $FFB8 ;SONI | ||
+ | dc.w $D, $85B8, $82DC, $FFD8 ;C TH | ||
+ | dc.w $D, $85C0, $82E0, $FFF8 ;E HE | ||
+ | dc.w $D, $85C8, $82E4, $18 ;DGEH | ||
+ | dc.w $5, $85D0, $82E8, $38 ;OG | ||
+ | |||
+ | T_STRIPEDGE: | ||
+ | dc.w $7 ; number of tiles (to display strip edge) | ||
+ | dc.w $9003, $85D4, $82EA, 0 ;> | ||
+ | dc.w $B003, $85D4, $82EA, 0 ;> | ||
+ | dc.w $D003, $85D4, $82EA, 0 ;> | ||
+ | dc.w $F003, $85D4, $82EA, 0 ;> | ||
+ | dc.w $1003, $85D4, $82EA, 0 ;> | ||
+ | dc.w $3003, $85D4, $82EA, 0 ;> | ||
+ | dc.w $5003, $85D4, $82EA, 0 ;> | ||
+ | ; ================================================================== | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | To avoid alignment problems, add this line before and after the code above: | ||
+ | |||
+ | <syntaxhighlight lang="asm"> | ||
+ | align $200 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the Palette Cycle information== | ||
+ | Now we want to locate: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; off_19F4: | ||
+ | PalCycle: zoneOrderedOffsetTable 2,1 | ||
+ | zoneOffsetTableEntry.w PalCycle_EHZ ; 0 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1 | ||
+ | zoneOffsetTableEntry.w PalCycle_WZ ; 2 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 3 | ||
+ | zoneOffsetTableEntry.w PalCycle_MTZ ; 4 | ||
+ | zoneOffsetTableEntry.w PalCycle_MTZ ; 5 | ||
+ | zoneOffsetTableEntry.w PalCycle_WFZ ; 6 | ||
+ | zoneOffsetTableEntry.w PalCycle_HTZ ; 7 | ||
+ | zoneOffsetTableEntry.w PalCycle_HPZ ; 8 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 9 | ||
+ | zoneOffsetTableEntry.w PalCycle_OOZ ; 10 | ||
+ | zoneOffsetTableEntry.w PalCycle_MCZ ; 11 | ||
+ | zoneOffsetTableEntry.w PalCycle_CNZ ; 12 | ||
+ | zoneOffsetTableEntry.w PalCycle_CPZ ; 13 | ||
+ | zoneOffsetTableEntry.w PalCycle_CPZ ; 14 | ||
+ | zoneOffsetTableEntry.w PalCycle_ARZ ; 15 | ||
+ | zoneOffsetTableEntry.w PalCycle_WFZ ; 16 | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | and replace it with: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; off_19F4: | ||
+ | PalCycle: zoneOrderedOffsetTable 2,1 | ||
+ | zoneOffsetTableEntry.w PalCycle_EHZ ; 00 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 01 | ||
+ | zoneOffsetTableEntry.w PalCycle_WZ ; 02 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 03 | ||
+ | zoneOffsetTableEntry.w PalCycle_MTZ ; 04 | ||
+ | zoneOffsetTableEntry.w PalCycle_MTZ ; 05 | ||
+ | zoneOffsetTableEntry.w PalCycle_WFZ ; 06 | ||
+ | zoneOffsetTableEntry.w PalCycle_HTZ ; 07 | ||
+ | zoneOffsetTableEntry.w PalCycle_HPZ ; 08 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 09 | ||
+ | zoneOffsetTableEntry.w PalCycle_OOZ ; 0A | ||
+ | zoneOffsetTableEntry.w PalCycle_MCZ ; 0B | ||
+ | zoneOffsetTableEntry.w PalCycle_CNZ ; 0C | ||
+ | zoneOffsetTableEntry.w PalCycle_CPZ ; 0D | ||
+ | zoneOffsetTableEntry.w PalCycle_CPZ ; 0E | ||
+ | zoneOffsetTableEntry.w PalCycle_ARZ ; 0F | ||
+ | zoneOffsetTableEntry.w PalCycle_WFZ ; 10 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 11 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 12 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 13 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 14 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 15 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 16 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 17 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 18 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 19 | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1A | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1B | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1C | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1D | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1E | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 1F | ||
+ | zoneOffsetTableEntry.w PalCycle_Null ; 20 | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | That inserts empty slots for the cycling palettes of out new levels. | ||
+ | |||
+ | ==Extending the static palette list== | ||
Next we locate: | Next we locate: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | ; | + | ;---------------------------------------------------------------------------- |
− | + | ; Palette pointers | |
− | dc. | + | ; (PALETTE DESCRIPTOR ARRAY) |
− | + | ; This struct array defines the palette to use for each level. | |
− | + | ;---------------------------------------------------------------------------- | |
− | + | ||
− | + | palptr macro ptr,lineno | |
− | + | dc.l ptr ; Pointer to palette | |
− | + | dc.w (Normal_palette+lineno*palette_line_size)&$FFFF ; Location in ram to load palette into | |
− | + | dc.w bytesToLcnt(ptr_End-ptr) ; Size of palette in (bytes / 4) | |
− | + | endm | |
− | + | ||
− | + | PalPointers: | |
− | + | PalPtr_SEGA: palptr Pal_SEGA, 0 | |
− | + | PalPtr_Title: palptr Pal_Title, 1 | |
− | + | PalPtr_MenuB: palptr Pal_MenuB, 0 | |
− | + | PalPtr_BGND: palptr Pal_BGND, 0 | |
− | + | PalPtr_EHZ: palptr Pal_EHZ, 1 | |
− | + | PalPtr_EHZ2: palptr Pal_EHZ, 1 | |
+ | PalPtr_WZ: palptr Pal_WZ, 1 | ||
+ | PalPtr_EHZ3: palptr Pal_EHZ, 1 | ||
+ | PalPtr_MTZ: palptr Pal_MTZ, 1 | ||
+ | PalPtr_MTZ2: palptr Pal_MTZ, 1 | ||
+ | PalPtr_WFZ: palptr Pal_WFZ, 1 | ||
+ | PalPtr_HTZ: palptr Pal_HTZ, 1 | ||
+ | PalPtr_HPZ: palptr Pal_HPZ, 1 | ||
+ | PalPtr_EHZ4: palptr Pal_EHZ, 1 | ||
+ | PalPtr_OOZ: palptr Pal_OOZ, 1 | ||
+ | PalPtr_MCZ: palptr Pal_MCZ, 1 | ||
+ | PalPtr_CNZ: palptr Pal_CNZ, 1 | ||
+ | PalPtr_CPZ: palptr Pal_CPZ, 1 | ||
+ | PalPtr_DEZ: palptr Pal_DEZ, 1 | ||
+ | PalPtr_ARZ: palptr Pal_ARZ, 1 | ||
+ | PalPtr_SCZ: palptr Pal_SCZ, 1 | ||
+ | PalPtr_HPZ_U: palptr Pal_HPZ_U, 0 | ||
+ | PalPtr_CPZ_U: palptr Pal_CPZ_U, 0 | ||
+ | PalPtr_ARZ_U: palptr Pal_ARZ_U, 0 | ||
+ | PalPtr_SS: palptr Pal_SS, 0 | ||
+ | PalPtr_MCZ_B: palptr Pal_MCZ_B, 1 | ||
+ | PalPtr_CNZ_B: palptr Pal_CNZ_B, 1 | ||
+ | PalPtr_SS1: palptr Pal_SS1, 3 | ||
+ | PalPtr_SS2: palptr Pal_SS2, 3 | ||
+ | PalPtr_SS3: palptr Pal_SS3, 3 | ||
+ | PalPtr_SS4: palptr Pal_SS4, 3 | ||
+ | PalPtr_SS5: palptr Pal_SS5, 3 | ||
+ | PalPtr_SS6: palptr Pal_SS6, 3 | ||
+ | PalPtr_SS7: palptr Pal_SS7, 3 | ||
+ | PalPtr_SS1_2p: palptr Pal_SS1_2p,3 | ||
+ | PalPtr_SS2_2p: palptr Pal_SS2_2p,3 | ||
+ | PalPtr_SS3_2p: palptr Pal_SS3_2p,3 | ||
+ | PalPtr_OOZ_B: palptr Pal_OOZ_B, 1 | ||
+ | PalPtr_Menu: palptr Pal_Menu, 0 | ||
+ | PalPtr_Result: palptr Pal_Result,0 | ||
+ | |||
+ | ; ---------------------------------------------------------------------------- | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | We all know that the palettes are directly addressed here. It means the index above can detect palettes anywhere in the ROM. | ||
+ | This label, PalPointers, is called directly. We can, then, move this table to any location we want it in the ROM. Put this after: | ||
+ | |||
+ | <syntaxhighlight lang="asm"> | ||
+ | EndOfHeader: | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | And after this table, put the following line to avoid alignment errors: | ||
+ | |||
+ | <syntaxhighlight lang="asm"> | ||
+ | align $200 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | You can add more indexes to this table this way: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | palptr Palette, Normal_palette_line2, $17 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | for a normal level palette, and, for a underwater level palette, you will add the normal palette for that level and its underwater palette. | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | palptr UnderwaterPalette, Normal_palette_line, $1F | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | You must only have attention when adding more palettes to don't overflow the palette index (yes, it is possible to have 255 palettes...). | ||
+ | |||
+ | ==Extending Zone Procedures and Scripts== | ||
+ | Now we need to add the zone scripts. | ||
+ | |||
+ | Find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | PLC_DYNANM: zoneOrderedOffsetTable 2,2 ; Zone ID | ||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $00 | ||
+ | zoneOffsetTableEntry.w Animated_EHZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Null ; $01 | ||
+ | zoneOffsetTableEntry.w Animated_Null | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Null ; $02 | ||
+ | zoneOffsetTableEntry.w Animated_Null | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Null ; $03 | ||
+ | zoneOffsetTableEntry.w Animated_Null | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $04 | ||
+ | zoneOffsetTableEntry.w Animated_MTZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $05 | ||
+ | zoneOffsetTableEntry.w Animated_MTZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Null ; $06 | ||
+ | zoneOffsetTableEntry.w Animated_Null | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_HTZ ; $07 | ||
+ | zoneOffsetTableEntry.w Animated_HTZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $08 | ||
+ | zoneOffsetTableEntry.w Animated_HPZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Null ; $09 | ||
+ | zoneOffsetTableEntry.w Animated_Null | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $0A | ||
+ | zoneOffsetTableEntry.w Animated_OOZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Null ; $0B | ||
+ | zoneOffsetTableEntry.w Animated_Null | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_CNZ ; $0C | ||
+ | zoneOffsetTableEntry.w Animated_CNZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $0D | ||
+ | zoneOffsetTableEntry.w Animated_CPZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_Normal ; $0E | ||
+ | zoneOffsetTableEntry.w Animated_DEZ | ||
+ | |||
+ | zoneOffsetTableEntry.w Dynamic_ARZ ; $0F | ||
+ | zoneOffsetTableEntry.w Animated_ARZ | ||
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $10 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | zoneTableEnd | |
− | + | </syntaxhighlight> | |
− | + | ||
− | + | and add to the end of it just before zoneTableEnd: | |
− | + | <syntaxhighlight lang="asm"> | |
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $11 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | ||
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $12 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | ||
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $13 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | ||
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $14 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | ||
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $15 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | ||
− | + | zoneOffsetTableEntry.w Dynamic_Null ; $16 | |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $17 |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $18 |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $19 |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $1A |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $1B |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $1C |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $1D |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $1E |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $1F |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | |||
− | ; | + | zoneOffsetTableEntry.w Dynamic_Null ; $20 |
− | + | zoneOffsetTableEntry.w Animated_Null | |
− | + | </syntaxhighlight> | |
− | + | This creates scripts for the new levels. To make complex animations (like the HPZ pulsing ball) you will need to create a Anim*level*.bin and add it to the Anim*level*.bin files and add it to the animated pattern mappings. See the section below. | |
− | |||
− | |||
− | |||
− | ; | + | ==Extending Animated Pattern Mappings== |
− | + | Find: | |
− | + | <syntaxhighlight lang="asm"> | |
+ | AnimPatMaps: zoneOrderedOffsetTable 2,1 | ||
+ | zoneOffsetTableEntry.w APM_EHZ ; 0 | ||
+ | zoneOffsetTableEntry.w APM_Null ; 1 | ||
+ | zoneOffsetTableEntry.w APM_Null ; 2 | ||
+ | zoneOffsetTableEntry.w APM_Null ; 3 | ||
+ | zoneOffsetTableEntry.w APM_MTZ ; 4 | ||
+ | zoneOffsetTableEntry.w APM_MTZ ; 5 | ||
+ | zoneOffsetTableEntry.w APM_Null ; 6 | ||
+ | zoneOffsetTableEntry.w APM_EHZ ; 7 | ||
+ | zoneOffsetTableEntry.w APM_HPZ ; 8 | ||
+ | zoneOffsetTableEntry.w APM_Null ; 9 | ||
+ | zoneOffsetTableEntry.w APM_OOZ ; $A | ||
+ | zoneOffsetTableEntry.w APM_Null ; $B | ||
+ | zoneOffsetTableEntry.w APM_CNZ ; $C | ||
+ | zoneOffsetTableEntry.w APM_CPZ ; $D | ||
+ | zoneOffsetTableEntry.w APM_DEZ ; $E | ||
+ | zoneOffsetTableEntry.w APM_ARZ ; $F | ||
+ | zoneOffsetTableEntry.w APM_Null ;$10 | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
− | ; | + | then add this to the end of this index, just before zoneTableEnd: |
− | + | <syntaxhighlight lang="asm"> | |
− | + | zoneOffsetTableEntry.w APM_Null ;$11 | |
− | + | zoneOffsetTableEntry.w APM_Null ;$12 | |
+ | zoneOffsetTableEntry.w APM_Null ;$13 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$14 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$15 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$16 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$17 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$18 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$19 | ||
+ | zoneOffsetTableEntry.w APM_Null ;$1A | ||
+ | zoneOffsetTableEntry.w APM_Null ;$1B | ||
+ | zoneOffsetTableEntry.w APM_Null ;$1C | ||
+ | zoneOffsetTableEntry.w APM_Null ;$1D | ||
+ | zoneOffsetTableEntry.w APM_Null ;$1E | ||
+ | zoneOffsetTableEntry.w APM_Null ;$1F | ||
+ | zoneOffsetTableEntry.w APM_Null ;$20 | ||
+ | </syntaxhighlight> | ||
− | ; | + | then edit and change as needed. Add the new .bin files to below here: |
− | + | <syntaxhighlight lang="asm"> | |
− | dc.w | + | ; byte_40372: |
+ | APM_EHZ: begin_animpat | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$4 ,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$5 ,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$8 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$C ,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$9 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$D ,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$10,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$14,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$11,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$15,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$6 ,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$3 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$7 ,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$A ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$E ,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$B ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$F ,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$12,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$16,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$13,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$17,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$18,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1A,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$19,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1B,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1E,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1F,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_Checkers+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_Checkers+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$0,1,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$1,1,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$0,1,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$1,1,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$0,1,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$1,1,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$0,1,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$1,1,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$0,1,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$1,1,0,3,1) | ||
+ | APM_EHZ_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | ; byte_403EE: |
− | + | APM_MTZ: begin_animpat | |
− | dc.w $ | + | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,1,0,1,0) |
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,1,0,1,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,1,0,1,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,1,0,1,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,1,0,1,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,1,0,1,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,1,0,1,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,1,0,1,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,1,0,1,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,1,0,1,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,1,0,1,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,1,0,1,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Lava+$0 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$1 ,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Lava+$2 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$3 ,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Lava+$4 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$5 ,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Lava+$8 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$9 ,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Lava+$6 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$7 ,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Lava+$A ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$B ,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1) | ||
+ | APM_MTZ_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | ; byte_404C2: |
− | + | APM_HPZ: begin_animpat | |
− | dc.w $ | + | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0) |
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0) | ||
− | + | if gameRevision<2 | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | |
− | dc.w $ | + | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) |
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | endif | ||
+ | APM_HPZ_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | ; byte_405B6: |
− | + | APM_OOZ: begin_animpat | |
− | dc.w $ | + | dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$0,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$2,0,0,0,1) |
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$1,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$3,0,0,0,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$1,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$3,0,0,3,1) | ||
+ | |||
+ | if gameRevision<2 | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0) | ||
+ | else | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0) | ||
+ | endif | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$1,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$9,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$3,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$B,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$5,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$D,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$7,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$F,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$1,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$9,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$3,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$B,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$5,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$D,0,0,2,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$7,0,0,2,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$F,0,0,2,1) | ||
+ | APM_OOZ_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | ; byte_4061A: |
− | + | APM_CNZ: begin_animpat | |
− | dc.w $ | + | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$4,0,0,0,0) |
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$5,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$C,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$D,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$6,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$7,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$E,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$F,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$4,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$5,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$C,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$D,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$6,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$7,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$E,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$F,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$4,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$5,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$C,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$D,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$6,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$7,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$E,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$F,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$4,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$5,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$C,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$D,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$6,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$7,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$E,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$F,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$4,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$5,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$C,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$D,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$6,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$7,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$E,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$F,0,0,3,1) | ||
+ | APM_CNZ_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | ; byte_406BE: |
− | + | APM_CNZ2P: begin_animpat | |
− | dc.w $ | + | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$4,0,0,0,0) |
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$5,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$C,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$D,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$6,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$7,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$E,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$F,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$4,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$5,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$C,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$D,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$6,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$7,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$E,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$F,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$4,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$5,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$C,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$D,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$6,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$7,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$E,0,0,0,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$F,0,0,0,0) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$4,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$5,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$C,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$D,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$6,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$7,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$E,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$F,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$4,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$5,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$C,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$D,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$6,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$7,0,0,3,1) | ||
+ | |||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$E,0,0,3,1) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$F,0,0,3,1) | ||
+ | APM_CNZ2P_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ; byte_40762: | |
− | + | APM_CPZ: begin_animpat | |
+ | dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0) | ||
+ | dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0) | ||
+ | APM_CPZ_End: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ; byte_4076E: | |
− | + | APM_DEZ: begin_animpat | |
− | ; | + | dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0) |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0) | |
− | dc.w | + | APM_DEZ_End: |
− | dc.w | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ; | + | ; byte_4077A: |
− | + | APM_ARZ: begin_animpat | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1 ,0,0,2,1) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3 ,0,0,2,1) | |
− | + | ||
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1 ,0,0,2,1) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3 ,0,0,2,1) | |
− | + | ||
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,1) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,1) | |
− | + | ||
− | + | ;These are invalid animation entries for waterfalls (bug in original game): | |
− | + | if 1==1 | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,1) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,1) | |
− | + | else | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,1) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,1) | |
− | + | endif | |
− | + | ||
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1 ,0,0,2,0) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3 ,0,0,2,0) | |
− | + | ||
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1 ,0,0,2,0) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3 ,0,0,2,0) | |
− | + | ||
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,0) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,0) | |
− | + | ||
− | + | ;These are invalid animation entries for waterfalls (bug in original game): | |
− | + | if 1==1 | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,0) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,0) | |
− | + | else | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,0) | |
− | + | dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,0) | |
− | + | endif | |
− | + | APM_ARZ_End: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ; byte_407BE: | |
+ | APM_Null: dc.w 0 | ||
+ | </syntaxhighlight> | ||
+ | and fit this table to suit your needs, creating the necessary load queries for them. (If so, you need to know what you're doing here.) | ||
==Extending the 1 Player and 2 Player music playlists== | ==Extending the 1 Player and 2 Player music playlists== | ||
− | + | To avoid some code-breaking problems (branches), we will fix this using a different way. | |
− | <asm> | + | |
+ | Go to EndOfHeader. If you are really following this tutorial, you've put a PalPointers table there. You will add between those two labels the following procedure: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | DefineLevelBGM: | ||
+ | moveq #0,d0 | ||
+ | move.b (Current_Zone).w,d0 | ||
+ | lea (NormalMusicList).l,a1 | ||
+ | tst.w (Two_Player_Mode).w | ||
+ | beq.s PlayNormalMusic | ||
+ | lea (MusicList2PMode).l,a1 | ||
+ | |||
+ | PlayNormalMusic: | ||
+ | move.b (a1,d0.w),d0 | ||
+ | move.w d0,(Level_Music).w | ||
+ | bsr.w JTR_PlayMusic | ||
+ | move.b #ObjID_TitleCard,(TitleCard+id).w ; <-- we need this, or there won't even be a title card, and if we remove it to remove the titlecard, we get a refresh glitch with sonic standing on air. | ||
+ | jmp Level_TtlCard | ||
+ | rts | ||
+ | |||
+ | JTR_PlayMusic: | ||
+ | jmp PlayMusic | ||
+ | rts | ||
+ | |||
+ | NormalMusicList: | ||
+ | dc.b MusID_EHZ ;00 | ||
+ | dc.b MusID_EHZ ;01 | ||
+ | dc.b MusID_EHZ ;02 | ||
+ | dc.b MusID_EHZ ;03 | ||
+ | dc.b MusID_MTZ ;04 | ||
+ | dc.b MusID_MTZ ;05 | ||
+ | dc.b MusID_WFZ ;06 | ||
+ | dc.b MusID_HTZ ;07 | ||
+ | dc.b MusID_HPZ ;08 | ||
+ | dc.b MusID_EHZ ;09 | ||
+ | dc.b MusID_OOZ ;0A | ||
+ | dc.b MusID_MCZ ;0B | ||
+ | dc.b MusID_CNZ ;0C | ||
+ | dc.b MusID_CPZ ;0D | ||
+ | dc.b MusID_DEZ ;0E | ||
+ | dc.b MusID_ARZ ;0F | ||
+ | dc.b MusID_SCZ ;10 | ||
+ | dc.b MusID_EHZ ;11 | ||
+ | dc.b MusID_EHZ ;12 | ||
+ | dc.b MusID_EHZ ;13 | ||
+ | dc.b MusID_EHZ ;14 | ||
+ | dc.b MusID_EHZ ;15 | ||
+ | dc.b MusID_EHZ ;16 | ||
+ | dc.b MusID_EHZ ;17 | ||
+ | dc.b MusID_EHZ ;18 | ||
+ | dc.b MusID_EHZ ;19 | ||
+ | dc.b MusID_EHZ ;1A | ||
+ | dc.b MusID_EHZ ;1B | ||
+ | dc.b MusID_EHZ ;1C | ||
+ | dc.b MusID_EHZ ;1D | ||
+ | dc.b MusID_EHZ ;1E | ||
+ | dc.b MusID_EHZ ;1F | ||
+ | dc.b MusID_EHZ ;20 | ||
+ | |||
+ | align 4 | ||
+ | |||
+ | MusicList2PMode: | ||
+ | dc.b MusID_EHZ_2P ;00 | ||
+ | dc.b MusID_EHZ ;01 | ||
+ | dc.b MusID_EHZ ;02 | ||
+ | dc.b MusID_EHZ ;03 | ||
+ | dc.b MusID_MTZ ;04 | ||
+ | dc.b MusID_MTZ ;05 | ||
+ | dc.b MusID_WFZ ;06 | ||
+ | dc.b MusID_HTZ ;07 | ||
+ | dc.b MusID_HPZ ;08 | ||
+ | dc.b MusID_EHZ ;09 | ||
+ | dc.b MusID_OOZ ;0A | ||
+ | dc.b MusID_MCZ_2P ;0B | ||
+ | dc.b MusID_CNZ_2P ;0C | ||
+ | dc.b MusID_CPZ ;0D | ||
+ | dc.b MusID_DEZ ;0E | ||
+ | dc.b MusID_ARZ ;0F | ||
+ | dc.b MusID_SCZ ;10 | ||
+ | dc.b MusID_EHZ ;11 | ||
+ | dc.b MusID_EHZ ;12 | ||
+ | dc.b MusID_EHZ ;13 | ||
+ | dc.b MusID_EHZ ;14 | ||
+ | dc.b MusID_EHZ ;15 | ||
+ | dc.b MusID_EHZ ;16 | ||
+ | dc.b MusID_EHZ ;17 | ||
+ | dc.b MusID_EHZ ;18 | ||
+ | dc.b MusID_EHZ ;19 | ||
+ | dc.b MusID_EHZ ;1A | ||
+ | dc.b MusID_EHZ ;1B | ||
+ | dc.b MusID_EHZ ;1C | ||
+ | dc.b MusID_EHZ ;1D | ||
+ | dc.b MusID_EHZ ;1E | ||
+ | dc.b MusID_EHZ ;1F | ||
+ | dc.b MusID_EHZ ;20 | ||
+ | |||
+ | align $200 | ||
+ | </syntaxhighlight> | ||
+ | I decided to enumerate the music ids because it is likely you either extended the existing sound driver, or installed a new one if you added this many zones and you would likely want to not have to worry about fixing the music. | ||
+ | |||
+ | Now, go to Level_GetBGM. You will see this: | ||
+ | <syntaxhighlight lang="asm"> | ||
; loc_40AE: | ; loc_40AE: | ||
Level_GetBgm: | Level_GetBgm: | ||
tst.w (Demo_mode_flag).w | tst.w (Demo_mode_flag).w | ||
− | bmi.s | + | bmi.s + |
moveq #0,d0 | moveq #0,d0 | ||
move.b (Current_Zone).w,d0 | move.b (Current_Zone).w,d0 | ||
Line 593: | Line 1,683: | ||
beq.s Level_PlayBgm | beq.s Level_PlayBgm | ||
lea MusicList2(pc),a1 | lea MusicList2(pc),a1 | ||
− | </ | + | </syntaxhighlight> |
and replace it with: | and replace it with: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
; loc_40AE: | ; loc_40AE: | ||
Level_GetBgm: | Level_GetBgm: | ||
tst.w (Demo_mode_flag).w | tst.w (Demo_mode_flag).w | ||
− | bmi.s | + | bmi.s + |
+ | jmp DefineLevelBGM | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the demo list== | ||
+ | now we will prepare everything so that we can put in new demo files for our new levels. | ||
+ | |||
+ | find: | ||
+ | <syntaxhighlight lang="asm">; off_4948: | ||
+ | ; --------------------------------------------------------------------------- | ||
+ | ; DEMO SCRIPT POINTERS | ||
+ | |||
+ | ; Contains an array of pointers to the script controlling the players actions | ||
+ | ; to use for each level. | ||
+ | ; --------------------------------------------------------------------------- | ||
+ | ; off_4948: | ||
+ | DemoScriptPointers: zoneOrderedTable 4,1 | ||
+ | zoneTableEntry.l Demo_EHZ ; $00 | ||
+ | zoneTableEntry.l Demo_EHZ ; $01 | ||
+ | zoneTableEntry.l Demo_EHZ ; $02 | ||
+ | zoneTableEntry.l Demo_EHZ ; $03 | ||
+ | zoneTableEntry.l Demo_EHZ ; $04 | ||
+ | zoneTableEntry.l Demo_EHZ ; $05 | ||
+ | zoneTableEntry.l Demo_EHZ ; $06 | ||
+ | zoneTableEntry.l Demo_EHZ ; $07 | ||
+ | zoneTableEntry.l Demo_EHZ ; $08 | ||
+ | zoneTableEntry.l Demo_EHZ ; $09 | ||
+ | zoneTableEntry.l Demo_EHZ ; $0A | ||
+ | zoneTableEntry.l Demo_EHZ ; $0B | ||
+ | zoneTableEntry.l Demo_CNZ ; $0C | ||
+ | zoneTableEntry.l Demo_CPZ ; $0D | ||
+ | zoneTableEntry.l Demo_EHZ ; $0E | ||
+ | zoneTableEntry.l Demo_ARZ ; $0F | ||
+ | zoneTableEntry.l Demo_EHZ ; $10 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | and insert after it: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneTableEntry.l Demo_EHZ ; $11 | ||
+ | zoneTableEntry.l Demo_EHZ ; $12 | ||
+ | zoneTableEntry.l Demo_EHZ ; $13 | ||
+ | zoneTableEntry.l Demo_EHZ ; $14 | ||
+ | zoneTableEntry.l Demo_EHZ ; $15 | ||
+ | zoneTableEntry.l Demo_EHZ ; $16 | ||
+ | zoneTableEntry.l Demo_EHZ ; $17 | ||
+ | zoneTableEntry.l Demo_EHZ ; $18 | ||
+ | zoneTableEntry.l Demo_EHZ ; $19 | ||
+ | zoneTableEntry.l Demo_EHZ ; $1A | ||
+ | zoneTableEntry.l Demo_EHZ ; $1B | ||
+ | zoneTableEntry.l Demo_EHZ ; $1C | ||
+ | zoneTableEntry.l Demo_EHZ ; $1D | ||
+ | zoneTableEntry.l Demo_EHZ ; $1E | ||
+ | zoneTableEntry.l Demo_EHZ ; $1F | ||
+ | zoneTableEntry.l Demo_EHZ ; $20 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the Collision index== | ||
+ | You would want solidity in your new zones, wouldn't you? Here we will extend the solidity list so that our extra levels can have solid ground for that blue hedgehog to walk on. | ||
+ | |||
+ | Well. We will fit, first, the collision procedure. This way, we can merge both tables into only one. | ||
+ | |||
+ | Find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | LoadCollisionIndexes: | ||
moveq #0,d0 | moveq #0,d0 | ||
move.b (Current_Zone).w,d0 | move.b (Current_Zone).w,d0 | ||
− | lea | + | lsl.w #2,d0 |
− | + | move.l #Primary_Collision,(Collision_addr).w | |
− | + | move.w d0,-(sp) | |
− | + | movea.l Off_ColP(pc,d0.w),a0 | |
− | </ | + | lea (Primary_Collision).w,a1 |
+ | bsr.w KosDec | ||
+ | move.w (sp)+,d0 | ||
+ | movea.l Off_ColS(pc,d0.w),a0 | ||
+ | lea (Secondary_Collision).w,a1 | ||
+ | bra.w KosDec | ||
+ | </syntaxhighlight> | ||
+ | Now, replace it with this: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | LoadCollisionIndexes: | ||
+ | moveq #0,d0 | ||
+ | move.b (Current_Zone).w,d0 | ||
+ | lsl.w #3,d0 ;change to lsl.w #3,d0 to make the offset 8 instead of 4 | ||
+ | move.l #Primary_Collision,(Collision_addr).w | ||
+ | move.w d0,-(sp) ;without this line, CPZ and ARZ solidity will be a little wonky | ||
+ | movea.l CollisionData(pc,d0.w),a0 | ||
+ | lea (Primary_Collision).w,a1 | ||
+ | bsr.w KosDec | ||
+ | move.w (sp)+,d0 ;without this line, CPZ and ARZ solidity will be a little wonky | ||
+ | movea.l CollisionData+4(pc,d0.w),a0 | ||
+ | lea (Secondary_Collision).w,a1 | ||
+ | bsr.w KosDec | ||
+ | </syntaxhighlight> | ||
− | + | I saw no point in leaving the old indexes as dummies here, since that just eats up rom space so I just went to deleting them in the merge. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Change: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | ;--------------------------------------------------------------------------- | + | ; --------------------------------------------------------------------------- |
− | + | ; Pointers to primary collision indexes | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ; Contains an array of pointers to the primary collision index data for each | |
− | + | ; level. 1 pointer for each level, pointing the primary collision index. | |
− | + | ; --------------------------------------------------------------------------- | |
+ | Off_ColP: zoneOrderedTable 4,1 | ||
+ | zoneTableEntry.l ColP_EHZHTZ | ||
+ | zoneTableEntry.l Off_Level ; 1 | ||
+ | zoneTableEntry.l ColP_MTZ ; 2 | ||
+ | zoneTableEntry.l Off_Level ; 3 | ||
+ | zoneTableEntry.l ColP_MTZ ; 4 | ||
+ | zoneTableEntry.l ColP_MTZ ; 5 | ||
+ | zoneTableEntry.l ColP_WFZSCZ ; 6 | ||
+ | zoneTableEntry.l ColP_EHZHTZ ; 7 | ||
+ | zoneTableEntry.l ColP_OOZ ; 8 | ||
+ | zoneTableEntry.l Off_Level ; 9 | ||
+ | zoneTableEntry.l ColP_OOZ ; 10 | ||
+ | zoneTableEntry.l ColP_MCZ ; 11 | ||
+ | zoneTableEntry.l ColP_CNZ ; 12 | ||
+ | zoneTableEntry.l ColP_CPZDEZ ; 13 | ||
+ | zoneTableEntry.l ColP_CPZDEZ ; 14 | ||
+ | zoneTableEntry.l ColP_ARZ ; 15 | ||
+ | zoneTableEntry.l ColP_WFZSCZ ; 16 | ||
+ | zoneTableEnd | ||
− | ; | + | ; --------------------------------------------------------------------------- |
− | ; | + | ; Pointers to secondary collision indexes |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ; Contains an array of pointers to the secondary collision index data for | |
+ | ; each level. 1 pointer for each level, pointing the secondary collision | ||
+ | ; index. | ||
+ | ; --------------------------------------------------------------------------- | ||
+ | Off_ColS: zoneOrderedTable 4,1 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l Off_Level ; 1 | ||
+ | zoneTableEntry.l ColP_MTZ ; 2 | ||
+ | zoneTableEntry.l Off_Level ; 3 | ||
+ | zoneTableEntry.l ColP_MTZ ; 4 | ||
+ | zoneTableEntry.l ColP_MTZ ; 5 | ||
+ | zoneTableEntry.l ColS_WFZSCZ ; 6 | ||
+ | zoneTableEntry.l ColS_EHZHTZ ; 7 | ||
+ | zoneTableEntry.l ColP_OOZ ; 8 | ||
+ | zoneTableEntry.l Off_Level ; 9 | ||
+ | zoneTableEntry.l ColP_OOZ ; 10 | ||
+ | zoneTableEntry.l ColP_MCZ ; 11 | ||
+ | zoneTableEntry.l ColS_CNZ ; 12 | ||
+ | zoneTableEntry.l ColS_CPZDEZ ; 13 | ||
+ | zoneTableEntry.l ColS_CPZDEZ ; 14 | ||
+ | zoneTableEntry.l ColS_ARZ ; 15 | ||
+ | zoneTableEntry.l ColS_WFZSCZ ; 16 | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
+ | To: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | CollisionData: zoneOrderedTable 4,2 | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;00 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;01 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;02 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;03 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_MTZ ;04 | ||
+ | zoneTableEntry.l ColP_MTZ | ||
+ | zoneTableEntry.l ColP_MTZ ;05 | ||
+ | zoneTableEntry.l ColP_MTZ | ||
+ | zoneTableEntry.l ColP_WFZSCZ ;06 | ||
+ | zoneTableEntry.l ColS_WFZSCZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;07 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;08 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;09 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_OOZ ;0A | ||
+ | zoneTableEntry.l ColP_OOZ | ||
+ | zoneTableEntry.l ColP_MCZ ;0B | ||
+ | zoneTableEntry.l ColP_MCZ | ||
+ | zoneTableEntry.l ColP_CNZ ;0C | ||
+ | zoneTableEntry.l ColS_CNZ | ||
+ | zoneTableEntry.l ColP_CPZDEZ ;0D | ||
+ | zoneTableEntry.l ColS_CPZDEZ | ||
+ | zoneTableEntry.l ColP_CPZDEZ ;0E | ||
+ | zoneTableEntry.l ColS_CPZDEZ | ||
+ | zoneTableEntry.l ColP_ARZ ;0F | ||
+ | zoneTableEntry.l ColS_ARZ | ||
+ | zoneTableEntry.l ColP_WFZSCZ ;10 | ||
+ | zoneTableEntry.l ColS_WFZSCZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;11 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;12 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;13 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;14 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;15 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;16 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;17 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;18 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;19 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;1A | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;1B | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;1C | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;1D | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;1E | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;1F | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEntry.l ColP_EHZHTZ ;20 | ||
+ | zoneTableEntry.l ColS_EHZHTZ | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
− | == | + | ==Extending Rings Index== |
− | + | Instead of doing the word-offset table, we will make a dynamic call routine, like collisions. | |
+ | Of course, we won´t work with compressed ring placement. | ||
− | + | We find, initially: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | ; loc_172A4: | |
− | + | RingsManager_Setup: | |
− | + | clearRAM Ring_Positions,(Ring_Positions_End-Ring_Positions) | |
− | + | ; d0 = 0 | |
− | + | lea (Ring_consumption_table).w,a1 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | move.w #bytesToLcnt(Ring_consumption_table_End-Ring_consumption_table-$40),d1 ; coding error, that '-$40' shouldn't be there | |
− | + | - move.l d0,(a1)+ ; only half of Ring_consumption_table is cleared | |
− | + | dbf d1,- | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | moveq #0,d5 | |
− | + | moveq #0,d0 | |
− | + | move.w (Current_ZoneAndAct).w,d0 | |
− | + | ror.b #1,d0 | |
− | + | lsr.w #6,d0 | |
− | move.w ( | + | lea (Off_Rings).l,a1 |
− | + | move.w (a1,d0.w),d0 | |
− | + | lea (a1,d0.w),a1 | |
− | + | lea (Ring_Positions+6).w,a2 ; first ring is left blank | |
− | lea ( | + | ; loc_172E0: |
− | move.w | + | RingsMgr_NextRowOrCol: |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
− | + | And change it to: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | ; loc_172A4: | |
− | + | RingsManager_Setup: | |
− | + | jmp CarregarAneis | |
− | + | rts | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ; loc_172E0: | |
− | + | RingsMgr_NextRowOrCol: | |
+ | </syntaxhighlight> | ||
− | + | Now, we put the following routine at a good place: | |
− | < | + | <syntaxhighlight lang="asm"> |
+ | align $40 | ||
− | + | CarregarAneis: | |
− | + | clearRAM Ring_Positions,$600 | |
− | + | ; d0 = 0 | |
− | + | lea (Ring_consumption_table).w,a1 | |
− | + | move.w #bytesToLcnt($40),d1 | |
− | + | - move.l d0,(a1)+ | |
− | + | dbf d1,- | |
− | lea ( | ||
− | move | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | moveq #0,d5 | |
− | + | moveq #0,d0 | |
− | + | ; convert zone/act data for an useable format, sequential | |
− | + | move.w (Current_ZoneAndAct).w,d0 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | moveq #0, | ||
− | |||
− | |||
− | |||
− | move | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ror.b #1,d0 | |
− | + | lsr.w #6,d0 ;this yields an 8-byte jump. | |
− | + | add.l d0,d0 | |
− | + | movea.l RingData(pc,d0.l),a1 ; this allows ring data anywhere in the ROM. | |
− | + | lea (Ring_Positions).w,a2 | |
− | + | jmp RingsMgr_NextRowOrCol | |
− | + | rts | |
− | + | ||
− | + | RingData: zoneOrderedTable 4,2 | |
− | + | zoneTableEntry.l Rings_EHZ_1 | |
− | + | zoneTableEntry.l Rings_EHZ_2 ;00 | |
− | + | zoneTableEntry.l Rings_EHZ_1 | |
− | + | zoneTableEntry.l Rings_EHZ_2 ;01 | |
− | + | zoneTableEntry.l Rings_EHZ_1 | |
− | + | zoneTableEntry.l Rings_EHZ_2 ;02 | |
− | + | zoneTableEntry.l Rings_EHZ_1 | |
− | + | zoneTableEntry.l Rings_EHZ_2 ;03 | |
− | + | zoneTableEntry.l Rings_MTZ_1 | |
− | + | zoneTableEntry.l Rings_MTZ_2 ;04 | |
− | + | zoneTableEntry.l Rings_MTZ_3 | |
− | + | zoneTableEntry.l Rings_MTZ_3 ;05 | |
+ | zoneTableEntry.l Rings_WFZ_1 | ||
+ | zoneTableEntry.l Rings_WFZ_1 ;06 | ||
+ | zoneTableEntry.l Rings_HTZ_1 | ||
+ | zoneTableEntry.l Rings_HTZ_2 ;07 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;08 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;09 | ||
+ | zoneTableEntry.l Rings_OOZ_1 | ||
+ | zoneTableEntry.l Rings_OOZ_2 ;0A | ||
+ | zoneTableEntry.l Rings_MCZ_1 | ||
+ | zoneTableEntry.l Rings_MCZ_2 ;0B | ||
+ | zoneTableEntry.l Rings_CNZ_1 | ||
+ | zoneTableEntry.l Rings_CNZ_2 ;0C | ||
+ | zoneTableEntry.l Rings_CPZ_1 | ||
+ | zoneTableEntry.l Rings_CPZ_2 ;0D | ||
+ | zoneTableEntry.l Rings_DEZ_1 | ||
+ | zoneTableEntry.l Rings_DEZ_1 ;0E | ||
+ | zoneTableEntry.l Rings_ARZ_1 | ||
+ | zoneTableEntry.l Rings_ARZ_2 ;0F | ||
+ | zoneTableEntry.l Rings_SCZ_1 | ||
+ | zoneTableEntry.l Rings_SCZ_1 ;10 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;11 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;12 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;13 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;14 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;15 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;16 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;17 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;18 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;19 | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;1A | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;1B | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;1C | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;1D | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;1E | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;1F | ||
+ | zoneTableEntry.l Rings_EHZ_1 | ||
+ | zoneTableEntry.l Rings_EHZ_2 ;20 | ||
+ | zoneTableEnd | ||
− | + | align $80 | |
− | < | + | </syntaxhighlight> |
− | |||
− | |||
− | + | You can put this before PalPointers, if you relocated that table as described before. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | This routine directly calls the desired ring placement, with no need of attaching them to the table, like the word-offset index does. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ==Extending the object index== | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | We will make a similar extension for objects. Look for: | |
− | + | <syntaxhighlight lang="asm"> | |
− | </ | + | ; loc_17AB8 |
+ | ObjectsManager_Init: | ||
+ | addq.b #2,(Obj_placement_routine).w | ||
+ | move.w (Current_ZoneAndAct).w,d0 ; If level == $0F01 (ARZ 2)... | ||
+ | ror.b #1,d0 ; then this yields $0F80... | ||
+ | lsr.w #6,d0 ; and this yields $003E. | ||
+ | lea (Off_Objects).l,a0 ; Next, we load the first pointer in the object layout list pointer index, | ||
+ | movea.l a0,a1 ; then copy it for quicker use later. | ||
+ | adda.w (a0,d0.w),a0 ; (Point1 * 2) + $003E | ||
+ | tst.w (Two_player_mode).w ; skip if not in 2-player vs mode | ||
+ | beq.s + | ||
+ | cmpi.b #casino_night_zone,(Current_Zone).w ; skip if not Casino Night Zone | ||
+ | bne.s + | ||
+ | lea (Objects_CNZ1_2P).l,a0 ; CNZ 1 2-player object layout | ||
+ | tst.b (Current_Act).w ; skip if not past act 1 | ||
+ | beq.s + | ||
+ | lea (Objects_CNZ2_2P).l,a0 ; CNZ 2 2-player object layout | ||
+ | + | ||
+ | </syntaxhighlight> | ||
− | + | And change that to: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | ; loc_17AB8 | |
− | + | ObjectsManager_Init: | |
− | + | jmp CarregarObjetos | |
− | + | rts | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | loc_17AF0: | |
− | + | + | |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
− | + | Now, put this routine into a good place. If you relocated PalPointers like described before, put this before PalPointers: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | align $40 | |
− | + | ||
− | + | CarregarObjetos: | |
− | + | addq.b #2,(Obj_placement_routine).w | |
− | |||
− | |||
− | + | moveq #0,d0 | |
− | + | move.w (Current_ZoneAndAct).w,d0 ; If level == $0F (ARZ)... | |
− | + | ror.b #1,d0 | |
− | + | lsr.w #6,d0 | |
− | + | add.l d0,d0 | |
+ | movea.l ObjPosData(pc,d0.l),a0 | ||
+ | movea.l a0,a1 | ||
+ | |||
+ | tst.w (Two_player_mode).w ; skip if not in 2-player vs mode | ||
+ | beq.s + | ||
+ | cmpi.b #$C,(Current_Zone).w ; skip if not Casino Night Zone | ||
+ | bne.s + | ||
+ | lea (Objects_CNZ1_2P).l,a0 ; CNZ 1 2-player object layout | ||
+ | tst.b (Current_Act).w ; skip if not past act 1 | ||
+ | beq.s + | ||
+ | lea (Objects_CNZ2_2P).l,a0 ; CNZ 2 2-player object layout | ||
− | + | +: | |
− | jmp | + | jmp loc_17AF0 |
− | + | rts | |
− | + | ||
+ | ObjPosData: zoneOrderedTable 4,2 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;00 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;01 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;02 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;03 | ||
+ | zoneTableEntry.l Objects_MTZ_1 | ||
+ | zoneTableEntry.l Objects_MTZ_2 ;04 | ||
+ | zoneTableEntry.l Objects_MTZ_3 | ||
+ | zoneTableEntry.l Objects_MTZ_3 ;05 | ||
+ | zoneTableEntry.l Objects_WFZ_1 | ||
+ | zoneTableEntry.l Objects_WFZ_1 ;06 | ||
+ | zoneTableEntry.l Objects_HTZ_1 | ||
+ | zoneTableEntry.l Objects_HTZ_2 ;07 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;08 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;09 | ||
+ | zoneTableEntry.l Objects_OOZ_1 | ||
+ | zoneTableEntry.l Objects_OOZ_2 ;0A | ||
+ | zoneTableEntry.l Objects_MCZ_1 | ||
+ | zoneTableEntry.l Objects_MCZ_2 ;0B | ||
+ | zoneTableEntry.l Objects_CNZ_1 | ||
+ | zoneTableEntry.l Objects_CNZ_2 ;0C | ||
+ | zoneTableEntry.l Objects_CPZ_1 | ||
+ | zoneTableEntry.l Objects_CPZ_2 ;0D | ||
+ | zoneTableEntry.l Objects_DEZ_1 | ||
+ | zoneTableEntry.l Objects_DEZ_1 ;0E | ||
+ | zoneTableEntry.l Objects_ARZ_1 | ||
+ | zoneTableEntry.l Objects_ARZ_2 ;0F | ||
+ | zoneTableEntry.l Objects_SCZ_1 | ||
+ | zoneTableEntry.l Objects_SCZ_1 ;10 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;11 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;12 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;13 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;14 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;15 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;16 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;17 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;18 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;19 | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;1A | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;1B | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;1C | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;1D | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;1E | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;1F | ||
+ | zoneTableEntry.l Objects_EHZ_1 | ||
+ | zoneTableEntry.l Objects_EHZ_2 ;20 | ||
+ | zoneTableEnd | ||
+ | align $80 | ||
+ | </syntaxhighlight> | ||
− | ; | + | ==Extending tiles and patterns index== |
− | + | Find: | |
− | + | <syntaxhighlight lang="asm"> | |
− | </ | + | ;---------------------------------------------------------------------------------- |
+ | ; EHZ 16x16 block mappings (Kosinski compression) ; was: (Kozinski compression) | ||
+ | BM16_EHZ: BINCLUDE "mappings/16x16/EHZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; EHZ/HTZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_95C24: | ||
+ | ArtKos_EHZ: BINCLUDE "art/kosinski/EHZ_HTZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; HTZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_HTZ: BINCLUDE "mappings/16x16/HTZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; HTZ pattern suppliment to EHZ level patterns (Kosinski compression) | ||
+ | ; ArtKoz_98AB4: | ||
+ | ArtKos_HTZ: BINCLUDE "art/kosinski/HTZ_Supp.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; EHZ/HTZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_EHZ: BINCLUDE "mappings/128x128/EHZ_HTZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; MTZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_MTZ: BINCLUDE "mappings/16x16/MTZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; MTZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_MTZ: BINCLUDE "art/kosinski/MTZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; MTZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_MTZ: BINCLUDE "mappings/128x128/MTZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; OOZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_OOZ: BINCLUDE "mappings/16x16/OOZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; OOZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_A4204: | ||
+ | ArtKos_OOZ: BINCLUDE "art/kosinski/OOZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; OOZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_OOZ: BINCLUDE "mappings/128x128/OOZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; MCZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_MCZ: BINCLUDE "mappings/16x16/MCZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; MCZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_A9D74: | ||
+ | ArtKos_MCZ: BINCLUDE "art/kosinski/MCZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; MCZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_MCZ: BINCLUDE "mappings/128x128/MCZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; CNZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_CNZ: BINCLUDE "mappings/16x16/CNZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; CNZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_B0894: | ||
+ | ArtKos_CNZ: BINCLUDE "art/kosinski/CNZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; CNZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_CNZ: BINCLUDE "mappings/128x128/CNZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; CPZ/DEZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_CPZ: BINCLUDE "mappings/16x16/CPZ_DEZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; CPZ/DEZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_B6174: | ||
+ | ArtKos_CPZ: BINCLUDE "art/kosinski/CPZ_DEZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; CPZ/DEZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_CPZ: BINCLUDE "mappings/128x128/CPZ_DEZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; ARZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_ARZ: BINCLUDE "mappings/16x16/ARZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; ARZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_BCC24: | ||
+ | ArtKos_ARZ: BINCLUDE "art/kosinski/ARZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; ARZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_ARZ: BINCLUDE "mappings/128x128/ARZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; WFZ/SCZ 16x16 block mappings (Kosinski compression) | ||
+ | BM16_WFZ: BINCLUDE "mappings/16x16/WFZ_SCZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; WFZ/SCZ main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_C5004: | ||
+ | ArtKos_SCZ: BINCLUDE "art/kosinski/WFZ_SCZ.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; WFZ pattern suppliment to SCZ tiles (Kosinski compression) | ||
+ | ; ArtKoz_C7EC4: | ||
+ | ArtKos_WFZ: BINCLUDE "art/kosinski/WFZ_Supp.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; WFZ/SCZ 128x128 block mappings (Kosinski compression) | ||
+ | BM128_WFZ: BINCLUDE "mappings/128x128/WFZ_SCZ.bin" | ||
+ | </syntaxhighlight> | ||
− | + | then add this to the end: | |
+ | <syntaxhighlight lang="asm"> | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_11 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_11: BINCLUDE "mappings/16x16/Lev_11.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_11 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_11: BINCLUDE "art/kosinski/Lev_11.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_11 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_11: BINCLUDE "mappings/128x128/Lev_11.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_12 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_12: BINCLUDE "mappings/16x16/Lev_12.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_12 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_12: BINCLUDE "art/kosinski/Lev_12.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_12 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_12: BINCLUDE "mappings/128x128/Lev_12.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_13 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_13: BINCLUDE "mappings/16x16/Lev_13.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_13 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_13: BINCLUDE "art/kosinski/Lev_13.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_13 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_13: BINCLUDE "mappings/128x128/Lev_13.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_14 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_14: BINCLUDE "mappings/16x16/Lev_14.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_14 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_14: BINCLUDE "art/kosinski/Lev_14.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_14 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_14: BINCLUDE "mappings/128x128/Lev_14.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_15 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_15: BINCLUDE "mappings/16x16/Lev_15.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_15 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_15: BINCLUDE "art/kosinski/Lev_15.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_15 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_15: BINCLUDE "mappings/128x128/Lev_15.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_16 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_16: BINCLUDE "mappings/16x16/Lev_16.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_16 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_16: BINCLUDE "art/kosinski/Lev_16.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_16 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_16: BINCLUDE "mappings/128x128/Lev_16.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_17 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_17: BINCLUDE "mappings/16x16/Lev_17.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_17 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_17: BINCLUDE "art/kosinski/Lev_17.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_17 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_17: BINCLUDE "mappings/128x128/Lev_17.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_18 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_18: BINCLUDE "mappings/16x16/Lev_18.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_18 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_18: BINCLUDE "art/kosinski/Lev_18.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_18 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_18: BINCLUDE "mappings/128x128/Lev_18.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_19 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_19: BINCLUDE "mappings/16x16/Lev_19.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_19 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_19: BINCLUDE "art/kosinski/Lev_19.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_19 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_19: BINCLUDE "mappings/128x128/Lev_19.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1A 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_1A: BINCLUDE "mappings/16x16/Lev_1A.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1A main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_1A: BINCLUDE "art/kosinski/Lev_1A.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1A 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_1A: BINCLUDE "mappings/128x128/Lev_1A.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1B 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_1B: BINCLUDE "mappings/16x16/Lev_1B.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1B main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_1B: BINCLUDE "art/kosinski/Lev_1B.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1B 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_1B: BINCLUDE "mappings/128x128/Lev_1B.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1C 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_1C: BINCLUDE "mappings/16x16/Lev_1C.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1C main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_1C: BINCLUDE "art/kosinski/Lev_1C.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1C 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_1C: BINCLUDE "mappings/128x128/Lev_1C.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1D 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_1D: BINCLUDE "mappings/16x16/Lev_1D.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1D main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_1D: BINCLUDE "art/kosinski/Lev_1D.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1D 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_1D: BINCLUDE "mappings/128x128/Lev_1D.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1E 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_1E: BINCLUDE "mappings/16x16/Lev_1E.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1E main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_1E: BINCLUDE "art/kosinski/Lev_1E.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1E 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_1E: BINCLUDE "mappings/128x128/Lev_1E.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1F 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_1F: BINCLUDE "mappings/16x16/Lev_1F.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1F main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_1F: BINCLUDE "art/kosinski/Lev_1F.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_1F 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_1F: BINCLUDE "mappings/128x128/Lev_1F.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_20 16x16 block mappings (Kosinski compression) | ||
+ | BM16_Lev_20: BINCLUDE "mappings/16x16/Lev_20.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_20 main level patterns (Kosinski compression) | ||
+ | ; ArtKoz_9DB64: | ||
+ | ArtKos_Lev_20: BINCLUDE "art/kosinski/Lev_20.bin" | ||
+ | ;----------------------------------------------------------------------------------- | ||
+ | ; Lev_20 128x128 block mappings (Kosinski compression) | ||
+ | BM128_Lev_20: BINCLUDE "mappings/128x128/Lev_20.bin" | ||
+ | </syntaxhighlight> | ||
− | + | Then add optional pattern supplements to suit your hack's needs. | |
− | |||
− | find: | + | Now find: |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | LevelArtPointers: | |
− | + | levartptrs PLCID_Ehz1, PLCID_Ehz2, PalID_EHZ, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 0 ; EHZ ; EMERALD HILL ZONE | |
− | + | levartptrs PLCID_Miles1up, PLCID_MilesLife, PalID_EHZ2, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 1 ; LEV1 ; LEVEL 1 (UNUSED) | |
− | + | levartptrs PLCID_Tails1up, PLCID_TailsLife, PalID_WZ, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 2 ; LEV2 ; LEVEL 2 (UNUSED) | |
− | + | levartptrs PLCID_Unused1, PLCID_Unused2, PalID_EHZ3, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 3 ; LEV3 ; LEVEL 3 (UNUSED) | |
− | + | levartptrs PLCID_Mtz1, PLCID_Mtz2, PalID_MTZ, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ; 4 ; MTZ ; METROPOLIS ZONE ACTS 1 & 2 | |
− | + | levartptrs PLCID_Mtz1, PLCID_Mtz2, PalID_MTZ, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ; 5 ; MTZ3 ; METROPOLIS ZONE ACT 3 | |
− | + | levartptrs PLCID_Wfz1, PLCID_Wfz2, PalID_WFZ, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; 6 ; WFZ ; WING FORTRESS ZONE | |
− | + | levartptrs PLCID_Htz1, PLCID_Htz2, PalID_HTZ, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 7 ; HTZ ; HILL TOP ZONE | |
− | + | levartptrs PLCID_Hpz1, PLCID_Hpz2, PalID_HPZ, BM16_OOZ, BM16_OOZ, BM16_OOZ ; 8 ; HPZ ; HIDDEN PALACE ZONE (UNUSED) | |
− | + | levartptrs PLCID_Unused3, PLCID_Unused4, PalID_EHZ4, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 9 ; LEV9 ; LEVEL 9 (UNUSED) | |
− | + | levartptrs PLCID_Ooz1, PLCID_Ooz2, PalID_OOZ, ArtKos_OOZ, BM16_OOZ, BM128_OOZ ; $A ; OOZ ; OIL OCEAN ZONE | |
− | + | levartptrs PLCID_Mcz1, PLCID_Mcz2, PalID_MCZ, ArtKos_MCZ, BM16_MCZ, BM128_MCZ ; $B ; MCZ ; MYSTIC CAVE ZONE | |
− | + | levartptrs PLCID_Cnz1, PLCID_Cnz2, PalID_CNZ, ArtKos_CNZ, BM16_CNZ, BM128_CNZ ; $C ; CNZ ; CASINO NIGHT ZONE | |
− | + | levartptrs PLCID_Cpz1, PLCID_Cpz2, PalID_CPZ, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ; $D ; CPZ ; CHEMICAL PLANT ZONE | |
− | + | levartptrs PLCID_Dez1, PLCID_Dez2, PalID_DEZ, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ; $E ; DEZ ; DEATH EGG ZONE | |
− | + | levartptrs PLCID_Arz1, PLCID_Arz2, PalID_ARZ, ArtKos_ARZ, BM16_ARZ, BM128_ARZ ; $F ; ARZ ; AQUATIC RUIN ZONE | |
− | + | levartptrs PLCID_Scz1, PLCID_Scz2, PalID_SCZ, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; $10 ; SCZ ; SKY CHASE ZONE | |
− | </ | + | </syntaxhighlight> |
− | + | then add this to the end: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | levartptrs $26, $27, $15, ArtKos_Lev_11, BM16_Lev_11, BM128_Lev_11 ; 0 ; Lev_11 ; LEV_11 ZONE | |
− | + | levartptrs $28, $29, $16, ArtKos_Lev_12, BM16_Lev_12, BM128_Lev_12 ; 0 ; Lev_12 ; LEV_12 ZONE | |
− | + | levartptrs $2A, $2B, $17, ArtKos_Lev_13, BM16_Lev_13, BM128_Lev_13 ; 0 ; Lev_13 ; LEV_13 ZONE | |
− | + | levartptrs $2C, $2D, $18, ArtKos_Lev_14, BM16_Lev_14, BM128_Lev_14 ; 0 ; Lev_14 ; LEV_14 ZONE | |
− | + | levartptrs $2E, $2F, $19, ArtKos_Lev_15, BM16_Lev_15, BM128_Lev_15 ; 0 ; Lev_15 ; LEV_15 ZONE | |
− | + | levartptrs $30, $31, $1A, ArtKos_Lev_16, BM16_Lev_16, BM128_Lev_16 ; 0 ; Lev_16 ; LEV_16 ZONE | |
− | + | levartptrs $32, $33, $1B, ArtKos_Lev_17, BM16_Lev_17, BM128_Lev_17 ; 0 ; Lev_17 ; LEV_17 ZONE | |
− | + | levartptrs $34, $35, $1C, ArtKos_Lev_18, BM16_Lev_18, BM128_Lev_18 ; 0 ; Lev_18 ; LEV_18 ZONE | |
− | + | levartptrs $36, $37, $1D, ArtKos_Lev_19, BM16_Lev_19, BM128_Lev_19 ; 0 ; Lev_19 ; LEV_19 ZONE | |
− | + | levartptrs $38, $39, $1E, ArtKos_Lev_1A, BM16_Lev_1A, BM128_Lev_1A ; 0 ; Lev_1A ; LEV_1A ZONE | |
− | + | levartptrs $3A, $3B, $1F, ArtKos_Lev_1B, BM16_Lev_1B, BM128_Lev_1B ; 0 ; Lev_1B ; LEV_1B ZONE | |
− | + | levartptrs $3C, $3D, $20, ArtKos_Lev_1C, BM16_Lev_1C, BM128_Lev_1C ; 0 ; Lev_1C ; LEV_1C ZONE | |
− | + | levartptrs $3E, $3F, $21, ArtKos_Lev_1D, BM16_Lev_1D, BM128_Lev_1D ; 0 ; Lev_1D ; LEV_1D ZONE | |
− | + | levartptrs $40, $41, $22, ArtKos_Lev_1E, BM16_Lev_1E, BM128_Lev_1E ; 0 ; Lev_1E ; LEV_1E ZONE | |
− | + | levartptrs $42, $43, $23, ArtKos_Lev_1F, BM16_Lev_1F, BM128_Lev_1F ; 0 ; Lev_1F ; LEV_1F ZONE | |
− | + | levartptrs $44, $45, $24, ArtKos_Lev_20, BM16_Lev_20, BM128_Lev_20 ; 0 ; Lev_20 ; LEV_20 ZONE | |
− | </ | + | </syntaxhighlight> |
− | + | After this is added, you possibly need to add loading queries to the texture load index. Create the .bin files and you're finished. | |
− | |||
− | + | ==Extending level and tile layout indexes== | |
− | + | Now you need to extend the layout index and we're done extending most level essentials. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Find: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | Off_Level: zoneOrderedOffsetTable 2,2 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 | |
− | + | zoneOffsetTableEntry.w Level_EHZ2 ; 1 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 2 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 3 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 4 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 5 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 6 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 7 | |
− | + | zoneOffsetTableEntry.w Level_MTZ1 ; 8 | |
− | + | zoneOffsetTableEntry.w Level_MTZ2 ; 9 | |
− | + | zoneOffsetTableEntry.w Level_MTZ3 ; 10 | |
− | + | zoneOffsetTableEntry.w Level_MTZ3 ; 11 | |
− | + | zoneOffsetTableEntry.w Level_WFZ ; 12 | |
− | + | zoneOffsetTableEntry.w Level_WFZ ; 13 | |
− | + | zoneOffsetTableEntry.w Level_HTZ1 ; 14 | |
− | + | zoneOffsetTableEntry.w Level_HTZ2 ; 15 | |
− | + | zoneOffsetTableEntry.w Level_OOZ1 ; 16 | |
− | + | zoneOffsetTableEntry.w Level_OOZ1 ; 17 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 18 | |
− | + | zoneOffsetTableEntry.w Level_EHZ1 ; 19 | |
− | + | zoneOffsetTableEntry.w Level_OOZ1 ; 20 | |
− | + | zoneOffsetTableEntry.w Level_OOZ2 ; 21 | |
− | + | zoneOffsetTableEntry.w Level_MCZ1 ; 22 | |
− | + | zoneOffsetTableEntry.w Level_MCZ2 ; 23 | |
− | + | zoneOffsetTableEntry.w Level_CNZ1 ; 24 | |
− | + | zoneOffsetTableEntry.w Level_CNZ2 ; 25 | |
− | + | zoneOffsetTableEntry.w Level_CPZ1 ; 26 | |
− | + | zoneOffsetTableEntry.w Level_CPZ2 ; 27 | |
− | + | zoneOffsetTableEntry.w Level_DEZ ; 28 | |
− | + | zoneOffsetTableEntry.w Level_DEZ ; 29 | |
− | + | zoneOffsetTableEntry.w Level_ARZ1 ; 30 | |
− | + | zoneOffsetTableEntry.w Level_ARZ2 ; 31 | |
− | + | zoneOffsetTableEntry.w Level_SCZ ; 32 | |
− | </ | + | zoneOffsetTableEntry.w Level_SCZ ; 33 |
+ | </syntaxhighlight> | ||
− | + | and add this to the end: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | zoneOffsetTableEntry.w Level_Lev11_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev11_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev12_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev12_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev13_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev13_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev14_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev14_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev15_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev15_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev16_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev16_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev17_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev17_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev18_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev18_2 | |
− | + | zoneOffsetTableEntry.w Level_Lev19_1 | |
− | + | zoneOffsetTableEntry.w Level_Lev19_2 | |
− | </ | + | zoneOffsetTableEntry.w Level_Lev1A_1 |
+ | zoneOffsetTableEntry.w Level_Lev1A_2 | ||
+ | zoneOffsetTableEntry.w Level_Lev1B_1 | ||
+ | zoneOffsetTableEntry.w Level_Lev1B_2 | ||
+ | zoneOffsetTableEntry.w Level_Lev1C_1 | ||
+ | zoneOffsetTableEntry.w Level_Lev1C_2 | ||
+ | zoneOffsetTableEntry.w Level_Lev1D_1 | ||
+ | zoneOffsetTableEntry.w Level_Lev1D_2 | ||
+ | zoneOffsetTableEntry.w Level_Lev1E_1 | ||
+ | zoneOffsetTableEntry.w Level_Lev1E_2 | ||
+ | zoneOffsetTableEntry.w Level_Lev1F_1 | ||
+ | zoneOffsetTableEntry.w Level_Lev1F_2 | ||
+ | zoneOffsetTableEntry.w Level_Lev20_1 | ||
+ | zoneOffsetTableEntry.w Level_Lev20_2 | ||
+ | </syntaxhighlight> | ||
− | + | Then find: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; EHZ act 1 level layout (Kosinski compression) | |
− | + | Level_EHZ1: BINCLUDE "level/layout/EHZ_1.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; EHZ act 2 level layout (Kosinski compression) | |
− | + | Level_EHZ2: BINCLUDE "level/layout/EHZ_2.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; MTZ act 1 level layout (Kosinski compression) | |
− | + | Level_MTZ1: BINCLUDE "level/layout/MTZ_1.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; MTZ act 2 level layout (Kosinski compression) | |
− | + | Level_MTZ2: BINCLUDE "level/layout/MTZ_2.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; MTZ act 3 level layout (Kosinski compression) | |
− | + | Level_MTZ3: BINCLUDE "level/layout/MTZ_3.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; WFZ level layout (Kosinski compression) | |
− | + | Level_WFZ: BINCLUDE "level/layout/WFZ.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; HTZ act 1 level layout (Kosinski compression) | |
− | + | Level_HTZ1: BINCLUDE "level/layout/HTZ_1.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; HTZ act 2 level layout (Kosinski compression) | |
− | + | Level_HTZ2: BINCLUDE "level/layout/HTZ_2.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; OOZ act 1 level layout (Kosinski compression) | |
− | + | Level_OOZ1: BINCLUDE "level/layout/OOZ_1.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; OOZ act 2 level layout (Kosinski compression) | |
− | + | Level_OOZ2: BINCLUDE "level/layout/OOZ_2.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | + | ; MCZ act 1 level layout (Kosinski compression) | |
− | + | Level_MCZ1: BINCLUDE "level/layout/MCZ_1.bin" | |
− | + | ;--------------------------------------------------------------------------------------- | |
− | </ | + | ; MCZ act 2 level layout (Kosinski compression) |
+ | Level_MCZ2: BINCLUDE "level/layout/MCZ_2.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; CNZ act 1 level layout (Kosinski compression) | ||
+ | Level_CNZ1: BINCLUDE "level/layout/CNZ_1.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; CNZ act 2 level layout (Kosinski compression) | ||
+ | Level_CNZ2: BINCLUDE "level/layout/CNZ_2.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; CPZ act 1 level layout (Kosinski compression) | ||
+ | Level_CPZ1: BINCLUDE "level/layout/CPZ_1.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; CPZ act 2 level layout (Kosinski compression) | ||
+ | Level_CPZ2: BINCLUDE "level/layout/CPZ_2.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; DEZ level layout (Kosinski compression) | ||
+ | Level_DEZ: BINCLUDE "level/layout/DEZ.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; ARZ act 1 level layout (Kosinski compression) | ||
+ | Level_ARZ1: BINCLUDE "level/layout/ARZ_1.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; ARZ act 2 level layout (Kosinski compression) | ||
+ | Level_ARZ2: BINCLUDE "level/layout/ARZ_2.bin" | ||
+ | ;--------------------------------------------------------------------------------------- | ||
+ | ; SCZ level layout (Kosinski compression) | ||
+ | Level_SCZ: BINCLUDE "level/layout/SCZ.bin" | ||
+ | </syntaxhighlight> | ||
− | + | then add this at the end: | |
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | |||
− | |||
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | + | ; Lev11 act 1 level layout (Kosinski compression) | |
− | + | Level_Lev11_1: BINCLUDE "level/layout/Lev11_1.bin" | |
− | |||
− | ; | ||
− | |||
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev11 act 2 level layout (Kosinski compression) |
− | + | Level_Lev11_2: BINCLUDE "level/layout/Lev11_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev12_1 level layout (Kosinski compression) |
− | + | Level_Lev12_1: BINCLUDE "level/layout/Lev12_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev12_2 level layout (Kosinski compression) |
− | + | Level_Lev12_1: BINCLUDE "level/layout/Lev12_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev13_1 level layout (Kosinski compression) |
− | + | Level_Lev13_1: BINCLUDE "level/layout/Lev13_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev13_2 level layout (Kosinski compression) |
− | + | Level_Lev13_2: BINCLUDE "level/layout/Lev13_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev14_1 level layout (Kosinski compression) |
− | + | Level_Lev14_1: BINCLUDE "level/layout/Lev14_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev14_2 level layout (Kosinski compression) |
− | + | Level_Lev14_2: BINCLUDE "level/layout/Lev14_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev15_1 level layout (Kosinski compression) |
− | + | Level_Lev15_1: BINCLUDE "level/layout/Lev15_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev15_2 level layout (Kosinski compression) |
− | + | Level_Lev15_2: BINCLUDE "level/layout/Lev15_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev16_1 level layout (Kosinski compression) |
− | + | Level_Lev16_1: BINCLUDE "level/layout/Lev16_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev16_2 level layout (Kosinski compression) |
− | + | Level_Lev16_2: BINCLUDE "level/layout/Lev16_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev17_1 level layout (Kosinski compression) |
− | + | Level_Lev17_1: BINCLUDE "level/layout/Lev17_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev17_2 level layout (Kosinski compression) |
− | + | Level_Lev17_2: BINCLUDE "level/layout/Lev17_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev18_1 level layout (Kosinski compression) |
− | + | Level_Lev18_1: BINCLUDE "level/layout/Lev18_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev18_2 level layout (Kosinski compression) |
− | + | Level_Lev18_2: BINCLUDE "level/layout/Lev18_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev19_1 level layout (Kosinski compression) |
− | + | Level_Lev19_1: BINCLUDE "level/layout/Lev19_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev19_2 level layout (Kosinski compression) |
− | + | Level_Lev19_2: BINCLUDE "level/layout/Lev19_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1A_1 level layout (Kosinski compression) |
− | + | Level_Lev1A_1: BINCLUDE "level/layout/Lev1A_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1A_2 level layout (Kosinski compression) |
− | + | Level_Lev1A_2: BINCLUDE "level/layout/Lev1A_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1B_1 level layout (Kosinski compression) |
− | + | Level_Lev1B_1: BINCLUDE "level/layout/Lev1B_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1B_2 level layout (Kosinski compression) |
− | + | Level_Lev1B_2: BINCLUDE "level/layout/Lev1B_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1C_1 level layout (Kosinski compression) |
− | + | Level_Lev1C_1: BINCLUDE "level/layout/Lev1C_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1C_2 level layout (Kosinski compression) |
− | + | Level_Lev1C_2: BINCLUDE "level/layout/Lev1C_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1D_1 level layout (Kosinski compression) |
− | + | Level_Lev1D_1: BINCLUDE "level/layout/Lev1D_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1D_2 level layout (Kosinski compression) |
− | + | Level_Lev1D_2: BINCLUDE "level/layout/Lev1D_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1E_1 level layout (Kosinski compression) |
− | + | Level_Lev1E_1: BINCLUDE "level/layout/Lev1E_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1E_2 level layout (Kosinski compression) |
− | + | Level_Lev1E_2: BINCLUDE "level/layout/Lev1E_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1F_1 level layout (Kosinski compression) |
− | + | Level_Lev1F_1: BINCLUDE "level/layout/Lev1F_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev1F_2 level layout (Kosinski compression) |
− | + | Level_Lev1F_2: BINCLUDE "level/layout/Lev1F_2.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev20_1 level layout (Kosinski compression) |
− | + | Level_Lev20_1: BINCLUDE "level/layout/Lev20_1.bin" | |
;--------------------------------------------------------------------------------------- | ;--------------------------------------------------------------------------------------- | ||
− | ; | + | ; Lev20_2 level layout (Kosinski compression) |
− | + | Level_Lev20_2: BINCLUDE "level/layout/Lev20_2.bin" | |
− | + | </syntaxhighlight> | |
− | </ | + | |
+ | Now create the .bin files. | ||
==Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)== | ==Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)== | ||
Line 1,309: | Line 2,745: | ||
find: | find: | ||
− | <asm>SetLevelEndType: | + | <syntaxhighlight lang="asm"> |
+ | ; sub_4BD2: | ||
+ | SetLevelEndType: | ||
move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost | move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost | ||
tst.w (Two_player_mode).w ; is it two-player competitive mode? | tst.w (Two_player_mode).w ; is it two-player competitive mode? | ||
bne.s LevelEnd_SetSignpost ; if yes, branch | bne.s LevelEnd_SetSignpost ; if yes, branch | ||
− | + | nosignpost.w emerald_hill_zone_act_2 | |
− | + | nosignpost.w metropolis_zone_act_3 | |
− | + | nosignpost.w wing_fortress_zone_act_1 | |
− | + | nosignpost.w hill_top_zone_act_2 | |
− | + | nosignpost.w oil_ocean_zone_act_2 | |
− | + | nosignpost.s mystic_cave_zone_act_2 | |
− | + | nosignpost.s casino_night_zone_act_2 | |
− | + | nosignpost.s chemical_plant_zone_act_2 | |
− | + | nosignpost.s death_egg_zone_act_1 | |
− | + | nosignpost.s aquatic_ruin_zone_act_2 | |
− | + | nosignpost.s sky_chase_zone_act_1 | |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
we will change it to: | we will change it to: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
SetLevelEndType: | SetLevelEndType: | ||
move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost | move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost | ||
tst.w (Two_player_mode).w ; is it two-player competitive mode? | tst.w (Two_player_mode).w ; is it two-player competitive mode? | ||
− | bne. | + | bne.w LevelEnd_SetSignpost ; if yes, branch |
− | + | nosignpost.w emerald_hill_zone_act_2 | |
− | + | nosignpost.w metropolis_zone_act_3 | |
− | + | nosignpost.w wing_fortress_zone_act_1 | |
− | + | nosignpost.w hill_top_zone_act_2 | |
− | + | nosignpost.w oil_ocean_zone_act_2 | |
− | + | nosignpost.w mystic_cave_zone_act_2 | |
− | + | nosignpost.w casino_night_zone_act_2 | |
− | + | nosignpost.w chemical_plant_zone_act_2 | |
− | + | nosignpost.w death_egg_zone_act_1 | |
− | + | nosignpost.w aquatic_ruin_zone_act_2 | |
− | + | nosignpost.w sky_chase_zone_act_1 | |
− | + | nosignpost.w $1101 | |
− | + | nosignpost.w $1201 | |
− | + | nosignpost.w $1301 | |
− | + | nosignpost.w $1401 | |
− | + | nosignpost.w $1501 | |
− | + | nosignpost.w $1601 | |
− | + | nosignpost.s $1701 | |
− | + | nosignpost.s $1801 | |
− | + | nosignpost.s $1901 | |
− | + | nosignpost.s $1A01 | |
− | + | nosignpost.s $1B01 | |
− | + | nosignpost.s $1C01 | |
− | + | nosignpost.s $1D01 | |
− | + | nosignpost.s $1E01 | |
− | + | nosignpost.s $1F01 | |
− | + | nosignpost.s $2001 | |
− | + | ||
− | + | ; loc_4C40: | |
− | + | LevelEnd_SetSignpost: | |
− | + | move.w #1,(Level_Has_Signpost).w ; set level type to signpost | |
− | + | + rts | |
− | + | </syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </ | ||
==Extend Level Size Array== | ==Extend Level Size Array== | ||
Line 1,414: | Line 2,807: | ||
what we need to find is: | what we need to find is: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | WrdArr_LvlSize | + | LevelSize: zoneOrderedTable 2,8 ; WrdArr_LvlSize |
− | + | zoneTableEntry.w $0, $29A0, $0, $320 ; EHZ act 1 | |
− | + | zoneTableEntry.w $0, $2940, $0, $420 ; EHZ act 2 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $01 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $02 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $03 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $2280, -$100, $800 ; MTZ act 1 | |
− | + | zoneTableEntry.w $0, $1E80, -$100, $800 ; MTZ act 2 | |
− | + | zoneTableEntry.w $0, $2A80, -$100, $800 ; MTZ act 3 | |
− | + | zoneTableEntry.w $0, $3FFF, -$100, $800 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; WFZ | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $2800, $0, $720 ; HTZ act 1 | |
− | + | zoneTableEntry.w $0, $3280, $0, $720 ; HTZ act 2 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $08 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $09 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $2F80, $0, $680 ; OOZ act 1 | |
− | + | zoneTableEntry.w $0, $2D00, $0, $680 ; OOZ act 2 | |
− | + | zoneTableEntry.w $0, $2380, $3C0, $720 ; MCZ act 1 | |
− | + | zoneTableEntry.w $0, $3FFF, $60, $720 ; MCZ act 2 | |
− | + | zoneTableEntry.w $0, $27A0, $0, $720 ; CNZ act 1 | |
− | + | zoneTableEntry.w $0, $2A80, $0, $720 ; CNZ act 2 | |
− | + | zoneTableEntry.w $0, $2780, $0, $720 ; CPZ act 1 | |
− | + | zoneTableEntry.w $0, $2A80, $0, $720 ; CPZ act 2 | |
− | + | zoneTableEntry.w $0, $1000, $C8, $C8 ; DEZ | |
− | + | zoneTableEntry.w $0, $1000, $C8, $C8 | |
− | + | zoneTableEntry.w $0, $28C0, $200, $600 ; ARZ act 1 | |
− | + | zoneTableEntry.w $0, $3FFF, $180, $710 ; ARZ act 2 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $000 ; SCZ | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | </ | + | zoneTableEnd |
+ | </syntaxhighlight> | ||
and we will change it to: | and we will change it to: | ||
− | <asm> | + | <syntaxhighlight lang="asm"> |
− | WrdArr_LvlSize | + | LevelSize: zoneOrderedTable 2,8 ; WrdArr_LvlSize |
− | + | zoneTableEntry.w $0, $29A0, $0, $320 ; EHZ act 1 | |
− | + | zoneTableEntry.w $0, $2940, $0, $420 ; EHZ act 2 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $01 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $02 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $03 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $2280, -$100, $800 ; MTZ act 1 | |
− | + | zoneTableEntry.w $0, $1E80, -$100, $800 ; MTZ act 2 | |
− | + | zoneTableEntry.w $0, $2A80, -$100, $800 ; MTZ act 3 | |
− | + | zoneTableEntry.w $0, $3FFF, -$100, $800 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; WFZ | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $2800, $0, $720 ; HTZ act 1 | |
− | + | zoneTableEntry.w $0, $3280, $0, $720 ; HTZ act 2 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $08 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $09 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $2F80, $0, $680 ; OOZ act 1 | |
− | + | zoneTableEntry.w $0, $2D00, $0, $680 ; OOZ act 2 | |
− | + | zoneTableEntry.w $0, $2380, $3C0, $720 ; MCZ act 1 | |
− | + | zoneTableEntry.w $0, $3FFF, $60, $720 ; MCZ act 2 | |
− | + | zoneTableEntry.w $0, $27A0, $0, $720 ; CNZ act 1 | |
− | + | zoneTableEntry.w $0, $2A80, $0, $720 ; CNZ act 2 | |
− | + | zoneTableEntry.w $0, $2780, $0, $720 ; CPZ act 1 | |
− | + | zoneTableEntry.w $0, $2A80, $0, $720 ; CPZ act 2 | |
− | + | zoneTableEntry.w $0, $1000, $C8, $C8 ; DEZ | |
− | + | zoneTableEntry.w $0, $1000, $C8, $C8 | |
− | + | zoneTableEntry.w $0, $28C0, $200, $600 ; ARZ act 1 | |
− | + | zoneTableEntry.w $0, $3FFF, $180, $710 ; ARZ act 2 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $000 ; SCZ | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $11 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $12 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $13 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $14 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $15 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $16 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $17 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $18 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $19 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $1A ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $1B ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $1C ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $1D ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $1E ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $1F ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ; $20 ;one of our new levels (act 1) | |
− | + | zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2) | |
− | </asm> | + | zoneTableEnd |
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the Start Location Index== | ||
+ | Sonic has to start somewhere right? | ||
+ | |||
+ | Find this: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | StartLocations: zoneOrderedTable 2,4 ; WrdArr_StartLoc | ||
+ | zoneTableBinEntry 2, "startpos/EHZ_1.bin" ; $00 | ||
+ | zoneTableBinEntry 2, "startpos/EHZ_2.bin" | ||
+ | zoneTableEntry.w $60, $28F ; $01 | ||
+ | zoneTableEntry.w $60, $2AF | ||
+ | zoneTableEntry.w $60, $1AC ; $02 | ||
+ | zoneTableEntry.w $60, $1AC | ||
+ | zoneTableEntry.w $60, $28F ; $03 | ||
+ | zoneTableEntry.w $60, $2AF | ||
+ | zoneTableBinEntry 2, "startpos/MTZ_1.bin" ; $04 | ||
+ | zoneTableBinEntry 2, "startpos/MTZ_2.bin" | ||
+ | zoneTableBinEntry 2, "startpos/MTZ_3.bin" ; $05 | ||
+ | zoneTableEntry.w $60, $2AF | ||
+ | zoneTableBinEntry 2, "startpos/WFZ.bin" ; $06 | ||
+ | zoneTableEntry.w $1E0, $4CC | ||
+ | zoneTableBinEntry 2, "startpos/HTZ_1.bin" ; $07 | ||
+ | zoneTableBinEntry 2, "startpos/HTZ_2.bin" | ||
+ | zoneTableEntry.w $230, $1AC ; $08 | ||
+ | zoneTableEntry.w $230, $1AC | ||
+ | zoneTableEntry.w $60, $28F ; $09 | ||
+ | zoneTableEntry.w $60, $2AF | ||
+ | zoneTableBinEntry 2, "startpos/OOZ_1.bin" ; $0A | ||
+ | zoneTableBinEntry 2, "startpos/OOZ_2.bin" | ||
+ | zoneTableBinEntry 2, "startpos/MCZ_1.bin" ; $0B | ||
+ | zoneTableBinEntry 2, "startpos/MCZ_2.bin" | ||
+ | zoneTableBinEntry 2, "startpos/CNZ_1.bin" ; $0C | ||
+ | zoneTableBinEntry 2, "startpos/CNZ_2.bin" | ||
+ | zoneTableBinEntry 2, "startpos/CPZ_1.bin" ; $0D | ||
+ | zoneTableBinEntry 2, "startpos/CPZ_2.bin" | ||
+ | zoneTableBinEntry 2, "startpos/DEZ.bin" ; $0E | ||
+ | zoneTableEntry.w $60, $12D | ||
+ | zoneTableBinEntry 2, "startpos/ARZ_1.bin" ; $0F | ||
+ | zoneTableBinEntry 2, "startpos/ARZ_2.bin" | ||
+ | zoneTableBinEntry 2, "startpos/SCZ.bin" ; $10 | ||
+ | zoneTableEntry.w $140, $70 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | then add this to the end: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneTableEntry.w 0, 0 ; $11 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $12 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $13 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $14 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $15 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $16 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $17 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $18 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $19 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $1A | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $1B | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $1C | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $1D | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $1E | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $1F | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | zoneTableEntry.w 0, 0 ; $20 | ||
+ | zoneTableEntry.w 0, 0 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | then replace the 0s with the desired x and y co-ordinance. | ||
+ | |||
+ | ==Extending the Debug Mode Object List== | ||
+ | Yes, we might want this too for when you are testing your level environment as well as to hide an easter egg for the player, so find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | JmpTbl_DbgObjLists: zoneOrderedOffsetTable 2,1 | ||
+ | zoneOffsetTableEntry.w DbgObjList_EHZ ; 0 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; 1 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; 2 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; 3 | ||
+ | zoneOffsetTableEntry.w DbgObjList_MTZ ; 4 | ||
+ | zoneOffsetTableEntry.w DbgObjList_MTZ ; 5 | ||
+ | zoneOffsetTableEntry.w DbgObjList_WFZ ; 6 | ||
+ | zoneOffsetTableEntry.w DbgObjList_HTZ ; 7 | ||
+ | zoneOffsetTableEntry.w DbgObjList_OOZ ; 8 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; 9 | ||
+ | zoneOffsetTableEntry.w DbgObjList_OOZ ; $A | ||
+ | zoneOffsetTableEntry.w DbgObjList_MCZ ; $B | ||
+ | zoneOffsetTableEntry.w DbgObjList_CNZ ; $C | ||
+ | zoneOffsetTableEntry.w DbgObjList_CPZ ; $D | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $E | ||
+ | zoneOffsetTableEntry.w DbgObjList_ARZ ; $F | ||
+ | zoneOffsetTableEntry.w DbgObjList_SCZ ; $10 | ||
+ | </syntaxhighlight> | ||
+ | and add these to the end of it: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $11 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $12 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $13 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $14 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $15 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $16 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $17 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $18 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $19 | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $1A | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $1B | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $1C | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $1D | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $1E | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $1F | ||
+ | zoneOffsetTableEntry.w DbgObjList_Def ; $20 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending Initial Camera Index== | ||
+ | Apparently, the Disassembly issues warinings if you don't extend this index, though, making new entries is insanely easy so this really isnt a problem, so find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; off_C296: | ||
+ | InitCam_Index: zoneOrderedOffsetTable 2,1 | ||
+ | zoneOffsetTableEntry.w InitCam_EHZ | ||
+ | zoneOffsetTableEntry.w InitCam_Null0 ; 1 | ||
+ | zoneOffsetTableEntry.w InitCam_WZ ; 2 | ||
+ | zoneOffsetTableEntry.w InitCam_Null0 ; 3 | ||
+ | zoneOffsetTableEntry.w InitCam_Std ; 4 MTZ | ||
+ | zoneOffsetTableEntry.w InitCam_Std ; 5 MTZ3 | ||
+ | zoneOffsetTableEntry.w InitCam_Null1 ; 6 | ||
+ | zoneOffsetTableEntry.w InitCam_HTZ ; 7 | ||
+ | zoneOffsetTableEntry.w InitCam_HPZ ; 8 | ||
+ | zoneOffsetTableEntry.w InitCam_Null2 ; 9 | ||
+ | zoneOffsetTableEntry.w InitCam_OOZ ; 10 | ||
+ | zoneOffsetTableEntry.w InitCam_MCZ ; 11 | ||
+ | zoneOffsetTableEntry.w InitCam_CNZ ; 12 | ||
+ | zoneOffsetTableEntry.w InitCam_CPZ ; 13 | ||
+ | zoneOffsetTableEntry.w InitCam_Null3 ; 14 | ||
+ | zoneOffsetTableEntry.w InitCam_ARZ ; 15 | ||
+ | zoneOffsetTableEntry.w InitCam_SCZ ; 16 | ||
+ | </syntaxhighlight> | ||
+ | and add these at the bottom: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | zoneOffsetTableEntry.w InitCam_Std | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the Software Scrolling Index== | ||
+ | levels in a sonic game have a software scroll manager, so we need to add that to our new levels, so find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | SwScrl_Index: zoneOrderedOffsetTable 2,1 ; JmpTbl_SwScrlMgr | ||
+ | zoneOffsetTableEntry.w SwScrl_EHZ ; $00 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $01 | ||
+ | zoneOffsetTableEntry.w SwScrl_Lev2 ; $02 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $03 | ||
+ | zoneOffsetTableEntry.w SwScrl_MTZ ; $04 | ||
+ | zoneOffsetTableEntry.w SwScrl_MTZ ; $05 | ||
+ | zoneOffsetTableEntry.w SwScrl_WFZ ; $06 | ||
+ | zoneOffsetTableEntry.w SwScrl_HTZ ; $07 | ||
+ | zoneOffsetTableEntry.w SwScrl_HPZ ; $08 | ||
+ | zoneOffsetTableEntry.w SwScrl_OOZ ; $0A | ||
+ | zoneOffsetTableEntry.w SwScrl_MCZ ; $0B | ||
+ | zoneOffsetTableEntry.w SwScrl_CNZ ; $0C | ||
+ | zoneOffsetTableEntry.w SwScrl_CPZ ; $0D | ||
+ | zoneOffsetTableEntry.w SwScrl_DEZ ; $0E | ||
+ | zoneOffsetTableEntry.w SwScrl_ARZ ; $0F | ||
+ | zoneOffsetTableEntry.w SwScrl_SCZ ; $10 | ||
+ | </syntaxhighlight> | ||
+ | and add these at the bottom: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $11 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $12 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $13 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $14 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $15 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $16 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $17 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $18 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $19 | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $1A | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $1B | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $1C | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $1D | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $1E | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $1F | ||
+ | zoneOffsetTableEntry.w SwScrl_Minimal ; $20 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the Dynamic Level Event Index== | ||
+ | The Dynamic Level Event Index points the zones to their scripts, which decide what happens, when, so lets find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; off_E636: | ||
+ | DynamicLevelEventIndex: zoneOrderedOffsetTable 2,1 | ||
+ | zoneOffsetTableEntry.w LevEvents_EHZ ; 0 ; EHZ | ||
+ | zoneOffsetTableEntry.w LevEvents_001 ; 1 ; LEV1 | ||
+ | zoneOffsetTableEntry.w LevEvents_002 ; 2 ; LEV2 | ||
+ | zoneOffsetTableEntry.w LevEvents_003 ; 3 ; LEV3 | ||
+ | zoneOffsetTableEntry.w LevEvents_MTZ ; 4 ; MTZ | ||
+ | zoneOffsetTableEntry.w LevEvents_MTZ3 ; 5 ; MTZ3 | ||
+ | zoneOffsetTableEntry.w LevEvents_WFZ ; 6 ; WFZ | ||
+ | zoneOffsetTableEntry.w LevEvents_HTZ ; 7 ; HTZ | ||
+ | zoneOffsetTableEntry.w LevEvents_HPZ ; 8 ; HPZ | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_OOZ ; $A ; OOZ | ||
+ | zoneOffsetTableEntry.w LevEvents_MCZ ; $B ; MCZ | ||
+ | zoneOffsetTableEntry.w LevEvents_CNZ ; $C ; CNZ | ||
+ | zoneOffsetTableEntry.w LevEvents_CPZ ; $D ; CPZ | ||
+ | zoneOffsetTableEntry.w LevEvents_DEZ ; $E ; DEZ | ||
+ | zoneOffsetTableEntry.w LevEvents_ARZ ; $F ; ARZ | ||
+ | zoneOffsetTableEntry.w LevEvents_SCZ ; $10 ; SCZ | ||
+ | </syntaxhighlight> | ||
+ | and add these at the bottom: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | I chose the entries from Lev09 because it is a good placeholder for until your wrote your own script for your new zones. | ||
+ | ==Extending the Animals== | ||
+ | Whenever you destroy an enemy out pops an animal that hops or flies away, so likely if you don't extend this index, you will not get an animal, but likely a game crash instead, so find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | Obj28_ZoneAnimals: zoneOrderedTable 1,2 | ||
+ | |||
+ | zoneAnimals macro first,second | ||
+ | zoneTableEntry.b (Obj28_Properties_first - Obj28_Properties) / 8 | ||
+ | zoneTableEntry.b (Obj28_Properties_second - Obj28_Properties) / 8 | ||
+ | endm | ||
+ | ; This table declares what animals will appear in the zone. | ||
+ | ; When an enemy is destroyed, a random animal is chosen from the 2 selected animals. | ||
+ | ; Note: you must also load the corresponding art in the PLCs. | ||
+ | zoneAnimals.b Squirrel, Bird ; EHZ | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1 | ||
+ | zoneAnimals.b Squirrel, Bird ; WZ | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 3 | ||
+ | zoneAnimals.b Beaver, Eagle ; MTZ | ||
+ | zoneAnimals.b Beaver, Eagle ; MTZ | ||
+ | zoneAnimals.b Beaver, Eagle ; WFZ | ||
+ | zoneAnimals.b Beaver, Eagle ; HTZ | ||
+ | zoneAnimals.b Mouse, Seal ; HPZ | ||
+ | zoneAnimals.b Mouse, Seal ; Zone 9 | ||
+ | zoneAnimals.b Penguin, Seal ; OOZ | ||
+ | zoneAnimals.b Mouse, Chicken ; MCZ | ||
+ | zoneAnimals.b Bear, Bird ; CNZ | ||
+ | zoneAnimals.b Rabbit, Eagle ; CPZ | ||
+ | zoneAnimals.b Pig, Chicken ; DEZ | ||
+ | zoneAnimals.b Penguin, Bird ; ARZ | ||
+ | zoneAnimals.b Turtle, Chicken ; SCZ | ||
+ | </syntaxhighlight> | ||
+ | and add these at the bottom: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 11 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 12 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 13 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 14 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 15 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 16 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 17 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 18 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 19 | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1A | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1B | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1C | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1D | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1E | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 1F | ||
+ | zoneAnimals.b Squirrel, Bird ; Zone 20 | ||
+ | </syntaxhighlight> | ||
+ | Change the animals to whatever you please, or add new ones by adding new custom mappings and extending this code: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ; This table declares the speed and mappings of each animal. | ||
+ | Rabbit: obj28decl -$200,-$400,Obj28_MapUnc_11EAC | ||
+ | Chicken: obj28decl -$200,-$300,Obj28_MapUnc_11E1C | ||
+ | Penguin: obj28decl -$180,-$300,Obj28_MapUnc_11EAC | ||
+ | Seal: obj28decl -$140,-$180,Obj28_MapUnc_11E88 | ||
+ | Pig: obj28decl -$1C0,-$300,Obj28_MapUnc_11E64 | ||
+ | Bird: obj28decl -$300,-$400,Obj28_MapUnc_11E1C | ||
+ | Squirrel: obj28decl -$280,-$380,Obj28_MapUnc_11E40 | ||
+ | Eagle: obj28decl -$280,-$300,Obj28_MapUnc_11E1C | ||
+ | Mouse: obj28decl -$200,-$380,Obj28_MapUnc_11E40 | ||
+ | Beaver: obj28decl -$2C0,-$300,Obj28_MapUnc_11E40 | ||
+ | Turtle: obj28decl -$140,-$200,Obj28_MapUnc_11E40 | ||
+ | Bear: obj28decl -$200,-$300,Obj28_MapUnc_11E40 | ||
+ | |||
+ | ; The following tables tell the properties of animals based on their subtype. | ||
+ | |||
+ | ; word_11950: | ||
+ | Obj28_Speeds: | ||
+ | dc.w -$440, -$400 | ||
+ | dc.w -$440, -$400 ; 2 | ||
+ | dc.w -$440, -$400 ; 4 | ||
+ | dc.w -$300, -$400 ; 6 | ||
+ | dc.w -$300, -$400 ; 8 | ||
+ | dc.w -$180, -$300 ; 10 | ||
+ | dc.w -$180, -$300 ; 12 | ||
+ | dc.w -$140, -$180 ; 14 | ||
+ | dc.w -$1C0, -$300 ; 16 | ||
+ | dc.w -$200, -$300 ; 18 | ||
+ | dc.w -$280, -$380 ; 20 | ||
+ | ; off_1197C: | ||
+ | Obj28_Mappings: | ||
+ | dc.l Obj28_MapUnc_11E1C | ||
+ | dc.l Obj28_MapUnc_11E1C ; 1 | ||
+ | dc.l Obj28_MapUnc_11E1C ; 2 | ||
+ | dc.l Obj28_MapUnc_11EAC ; 3 | ||
+ | dc.l Obj28_MapUnc_11EAC ; 4 | ||
+ | dc.l Obj28_MapUnc_11EAC ; 5 | ||
+ | dc.l Obj28_MapUnc_11EAC ; 6 | ||
+ | dc.l Obj28_MapUnc_11E88 ; 7 | ||
+ | dc.l Obj28_MapUnc_11E64 ; 8 | ||
+ | dc.l Obj28_MapUnc_11E1C ; 9 | ||
+ | dc.l Obj28_MapUnc_11E40 ; 10 | ||
+ | ; word_119A8: | ||
+ | Obj28_ArtLocations: | ||
+ | dc.w ArtTile_ArtNem_S1EndFlicky ; 0 Flicky | ||
+ | dc.w ArtTile_ArtNem_S1EndFlicky ; 1 Flicky | ||
+ | dc.w ArtTile_ArtNem_S1EndFlicky ; 2 Flicky | ||
+ | dc.w ArtTile_ArtNem_S1EndRabbit ; 3 Rabbit | ||
+ | dc.w ArtTile_ArtNem_S1EndRabbit ; 4 Rabbit | ||
+ | dc.w ArtTile_ArtNem_S1EndPenguin ; 5 Penguin | ||
+ | dc.w ArtTile_ArtNem_S1EndPenguin ; 6 Penguin | ||
+ | dc.w ArtTile_ArtNem_S1EndSeal ; 7 Seal | ||
+ | dc.w ArtTile_ArtNem_S1EndPig ; 8 Pig | ||
+ | dc.w ArtTile_ArtNem_S1EndChicken ; 9 Chicken | ||
+ | dc.w ArtTile_ArtNem_S1EndSquirrel ; 10 Squirrel | ||
+ | </syntaxhighlight> | ||
+ | Now we need to determine the PLC that loads our animals now that our zones now have them, so find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | ;byte_13F62: | ||
+ | Animal_PLCTable: zoneOrderedTable 1,1 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $0 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $2 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $3 | ||
+ | zoneTableEntry.b PLCID_MtzAnimals ; $4 | ||
+ | zoneTableEntry.b PLCID_MtzAnimals ; $5 | ||
+ | zoneTableEntry.b PLCID_WfzAnimals ; $6 | ||
+ | zoneTableEntry.b PLCID_HtzAnimals ; $7 | ||
+ | zoneTableEntry.b PLCID_HpzAnimals ; $8 | ||
+ | zoneTableEntry.b PLCID_HpzAnimals ; $9 | ||
+ | zoneTableEntry.b PLCID_OozAnimals ; $A | ||
+ | zoneTableEntry.b PLCID_MczAnimals ; $B | ||
+ | zoneTableEntry.b PLCID_CnzAnimals ; $C | ||
+ | zoneTableEntry.b PLCID_CpzAnimals ; $D | ||
+ | zoneTableEntry.b PLCID_DezAnimals ; $E | ||
+ | zoneTableEntry.b PLCID_ArzAnimals ; $F | ||
+ | zoneTableEntry.b PLCID_SczAnimals ; $10 | ||
+ | </syntaxhighlight> | ||
+ | and add these at the bottom: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $11 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $12 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $13 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $14 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $15 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $16 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $17 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $18 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $19 | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1A | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1B | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1C | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1D | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1E | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $1F | ||
+ | zoneTableEntry.b PLCID_EhzAnimals ; $20 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Extending the Level Order== | ||
+ | The game needs to know what order to play the zones in, not just know how big they are and where you start, right? so lets find: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | LevelOrder: zoneOrderedTable 2,2 ; WrdArr_LevelOrder | ||
+ | zoneTableEntry.w emerald_hill_zone_act_2 | ||
+ | zoneTableEntry.w chemical_plant_zone_act_1 ; 1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 2 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 3 | ||
+ | zoneTableEntry.w wood_zone_act_2 ; 4 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 5 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 6 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 7 | ||
+ | zoneTableEntry.w metropolis_zone_act_2 ; 8 | ||
+ | zoneTableEntry.w metropolis_zone_act_3 ; 9 | ||
+ | zoneTableEntry.w sky_chase_zone_act_1 ; 10 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 11 | ||
+ | zoneTableEntry.w death_egg_zone_act_1 ; 12 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 13 | ||
+ | zoneTableEntry.w hill_top_zone_act_2 ; 14 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_1 ; 15 | ||
+ | zoneTableEntry.w hidden_palace_zone_act_2 ; 16 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_1 ; 17 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 18 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 19 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_2 ; 20 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 21 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_2 ; 22 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_1 ; 23 | ||
+ | zoneTableEntry.w casino_night_zone_act_2 ; 24 | ||
+ | zoneTableEntry.w hill_top_zone_act_1 ; 25 | ||
+ | zoneTableEntry.w chemical_plant_zone_act_2 ; 26 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27 | ||
+ | zoneTableEntry.w $FFFF ; 28 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 29 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30 | ||
+ | zoneTableEntry.w casino_night_zone_act_1 ; 31 | ||
+ | zoneTableEntry.w wing_fortress_zone_act_1 ; 32 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 33 | ||
+ | zoneTableEnd | ||
+ | |||
+ | ;word_1433C: | ||
+ | LevelOrder_2P: zoneOrderedTable 2,2 ; WrdArr_LevelOrder_2P | ||
+ | zoneTableEntry.w emerald_hill_zone_act_2 | ||
+ | zoneTableEntry.w casino_night_zone_act_1 ; 1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 2 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 3 | ||
+ | zoneTableEntry.w wood_zone_act_2 ; 4 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 5 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 6 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 7 | ||
+ | zoneTableEntry.w metropolis_zone_act_2 ; 8 | ||
+ | zoneTableEntry.w metropolis_zone_act_3 ; 9 | ||
+ | zoneTableEntry.w sky_chase_zone_act_1 ; 10 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 11 | ||
+ | zoneTableEntry.w death_egg_zone_act_1 ; 12 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 13 | ||
+ | zoneTableEntry.w hill_top_zone_act_2 ; 14 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_1 ; 15 | ||
+ | zoneTableEntry.w hidden_palace_zone_act_2 ; 16 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_1 ; 17 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 18 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 19 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_2 ; 20 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 21 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_2 ; 22 | ||
+ | zoneTableEntry.w $FFFF ; 23 | ||
+ | zoneTableEntry.w casino_night_zone_act_2 ; 24 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_1 ; 25 | ||
+ | zoneTableEntry.w chemical_plant_zone_act_2 ; 26 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27 | ||
+ | zoneTableEntry.w $FFFF ; 28 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 29 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30 | ||
+ | zoneTableEntry.w casino_night_zone_act_1 ; 31 | ||
+ | zoneTableEntry.w wing_fortress_zone_act_1 ; 32 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 33 | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
+ | and add change them to read: | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | LevelOrder: zoneOrderedTable 2,2 ; WrdArr_LevelOrder | ||
+ | zoneTableEntry.w emerald_hill_zone_act_2 | ||
+ | zoneTableEntry.w chemical_plant_zone_act_1 ; 1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 2 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 3 | ||
+ | zoneTableEntry.w wood_zone_act_2 ; 4 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 5 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 6 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 7 | ||
+ | zoneTableEntry.w metropolis_zone_act_2 ; 8 | ||
+ | zoneTableEntry.w metropolis_zone_act_3 ; 9 | ||
+ | zoneTableEntry.w sky_chase_zone_act_1 ; 10 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 11 | ||
+ | zoneTableEntry.w death_egg_zone_act_1 ; 12 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 13 | ||
+ | zoneTableEntry.w hill_top_zone_act_2 ; 14 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_1 ; 15 | ||
+ | zoneTableEntry.w hidden_palace_zone_act_2 ; 16 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_1 ; 17 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 18 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 19 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_2 ; 20 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 21 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_2 ; 22 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_1 ; 23 | ||
+ | zoneTableEntry.w casino_night_zone_act_2 ; 24 | ||
+ | zoneTableEntry.w hill_top_zone_act_1 ; 25 | ||
+ | zoneTableEntry.w chemical_plant_zone_act_2 ; 26 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27 | ||
+ | zoneTableEntry.w $FFFF ; 28 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 29 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30 | ||
+ | zoneTableEntry.w casino_night_zone_act_1 ; 31 | ||
+ | zoneTableEntry.w wing_fortress_zone_act_1 ; 32 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 33 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEnd | ||
+ | |||
+ | ;word_1433C: | ||
+ | LevelOrder_2P: zoneOrderedTable 2,2 ; WrdArr_LevelOrder_2P | ||
+ | zoneTableEntry.w emerald_hill_zone_act_2 | ||
+ | zoneTableEntry.w casino_night_zone_act_1 ; 1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 2 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 3 | ||
+ | zoneTableEntry.w wood_zone_act_2 ; 4 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 5 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 6 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 7 | ||
+ | zoneTableEntry.w metropolis_zone_act_2 ; 8 | ||
+ | zoneTableEntry.w metropolis_zone_act_3 ; 9 | ||
+ | zoneTableEntry.w sky_chase_zone_act_1 ; 10 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 11 | ||
+ | zoneTableEntry.w death_egg_zone_act_1 ; 12 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 13 | ||
+ | zoneTableEntry.w hill_top_zone_act_2 ; 14 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_1 ; 15 | ||
+ | zoneTableEntry.w hidden_palace_zone_act_2 ; 16 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_1 ; 17 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 18 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 19 | ||
+ | zoneTableEntry.w oil_ocean_zone_act_2 ; 20 | ||
+ | zoneTableEntry.w metropolis_zone_act_1 ; 21 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_2 ; 22 | ||
+ | zoneTableEntry.w $FFFF ; 23 | ||
+ | zoneTableEntry.w casino_night_zone_act_2 ; 24 | ||
+ | zoneTableEntry.w mystic_cave_zone_act_1 ; 25 | ||
+ | zoneTableEntry.w chemical_plant_zone_act_2 ; 26 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27 | ||
+ | zoneTableEntry.w $FFFF ; 28 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 29 | ||
+ | zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30 | ||
+ | zoneTableEntry.w casino_night_zone_act_1 ; 31 | ||
+ | zoneTableEntry.w wing_fortress_zone_act_1 ; 32 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 ; 33 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEntry.w emerald_hill_zone_act_1 | ||
+ | zoneTableEnd | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Notes== | ||
+ | All new .bin files need to be created in order for the ROM to build. If something doesn't load correctly (besides new animated patterns that you have just made by youself, only major things like ROM crashes) please don't hesitate to ask for help and/or get it working and edit this article. (Like the title cards being broken for levels past $10) | ||
+ | |||
+ | {{S2Howtos}} | ||
+ | |Extend the level index past $10 in Sonic 2]] |
Latest revision as of 12:05, 7 April 2021
Contents
- 1 Initial Notes and Revisions Done
- 2 Extending the Titlecard index
- 3 Extending the Palette Cycle information
- 4 Extending the static palette list
- 5 Extending Zone Procedures and Scripts
- 6 Extending Animated Pattern Mappings
- 7 Extending the 1 Player and 2 Player music playlists
- 8 Extending the demo list
- 9 Extending the Collision index
- 10 Extending Rings Index
- 11 Extending the object index
- 12 Extending tiles and patterns index
- 13 Extending level and tile layout indexes
- 14 Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)
- 15 Extend Level Size Array
- 16 Extending the Start Location Index
- 17 Extending the Debug Mode Object List
- 18 Extending Initial Camera Index
- 19 Extending the Software Scrolling Index
- 20 Extending the Dynamic Level Event Index
- 21 Extending the Animals
- 22 Extending the Level Order
- 23 Notes
Initial Notes and Revisions Done
(Original guide by kramlat, current revision that fixes major bugs and extends properly by GARY 'M 9)
(Updated again by kramlat, adding back custom titlecard mappings howto, due to guide being unfinished, thus finally fixing the "ZONE ZONE" bug. Replace all the empty levels with your new ones.)
(Updated by silent.creature, fixing some code within the procedures)
(Updated by kramlat, moved to the current GIT disassembly)
WARNING: Unless you are working with Xenowhirl's 2007 Sonic 2 disassembly, I strongly recommend you port the Sonic 1 sound driver or the Sonic 2 clone driver V2 first before proceeding. A lot of major data shifting will occur in this tutorial and it will make the rom size a lot bigger than it was before. This will break the Sonic 2 or even Sonic 2 beta sound driver; thus, you definitely want Sonic 1 sound driver due to the fact that it can take the shifting and still work properly. However, if you are using Xenowhirl's 2007 Sonic 2 disassembly, it is not necessary to port any other sound driver, since it uses disassembled Z80 code which automatically references the correct locations and can thus work properly even if there are massive location shifts.
EDIT: If you are using the svn/hg/git version, this should not be a problem because those have the sound driver disassembled and macros to keep the driver properly aligned. For this reason, we will now be using that instead of the xenowhirl one we used in the past.
You probably noticed that all the indexes in the game stop at $10 and when you try to extend them, by extending the Main Level Load Blocks index, you get weird glitches and crashes. It means you haven't extended all the indexes that need to be extended.
We will initially extend the indexes for $20 zones, but we show that this can be extended to any number between $11 and $7F. (I didn't tried $80 and more because of the ROM cartridge size, but I think it is possible.) You will see frequently the variable-label NumberOfZones, just to explain this. Please define it or substitute it to its desired value.
Extending the Titlecard index
Extending Main Configuration indexes
Updating TitleCard Data
We need to allocate more card indexes for our new zone. To do this, we find:
; word_13CD4:
Obj34_TitleCardData:
titlecardobjdata 8, 0, $80, $1B, $240, $120, $B8 ; zone name
titlecardobjdata $A, $11, $40, $1C, $28, $148, $D0 ; "ZONE"
titlecardobjdata $C, $12, $18, $1C, $68, $188, $D0 ; act number
titlecardobjdata 2, 0, 0, 0, 0, 0, 0 ; blue background
titlecardobjdata 4, $15, $48, 8, $2A8, $168,$120 ; bottom yellow part
titlecardobjdata 6, $16, 8, $15, $80, $F0, $F0 ; left red part
Obj34_TitleCardData_End:
and change this to:
; word_13CD4:
Obj34_TitleCardData:
titlecardobjdata 8, 0, $80, $1B, $240, $120, $B8 ; zone name
titlecardobjdata $A, NumberOfZones+1, $40, $1C, $28, $148, $D0 ; "ZONE"
titlecardobjdata $C, NumberOfZones+2, $18, $1C, $68, $188, $D0 ; act number
titlecardobjdata 2, 0, 0, 0, 0, 0, 0 ; blue background
titlecardobjdata 4, NumberOfZones+5, $48, 8, $2A8, $168,$120 ; bottom yellow part
titlecardobjdata 6, NumberOfZones+6, 8, $15, $80, $F0, $F0 ; left red part
Obj34_TitleCardData_End:
Where NumberOfZones is the total number of zones you want in the game. As we said before, we will work with $20 zones. The best place for it, is in s2.constants.asm
Fixing Act Number Handler
Now, find:
Obj34_ActNumber: ; the act number, coming in
jsr Obj34_Wait(pc)
move.b (Current_Zone).w,d0 ; get the current zone
cmpi.b #sky_chase_zone,d0 ; is it Sky Chase?
beq.s BranchTo9_DeleteObject ; if yes, branch
cmpi.b #wing_fortress_zone,d0 ; is it Wing Fortress?
beq.s BranchTo9_DeleteObject ; if yes, branch
cmpi.b #death_egg_zone,d0 ; is it Death Egg Zone?
beq.s BranchTo9_DeleteObject ; if yes, branch
move.b (Current_Act).w,d1 ; get the current act
addi.b #$12,d1 ; add $12 to it (this is the index of the "1" frame in the mappings)
cmpi.b #metropolis_zone_2,d0 ; are we in Metropolis Zone Act 3?
bne.s + ; if not, branch
moveq #$14,d1 ; use the "3" frame instead
and change it to:
Obj34_ActNumber: ; the act number, coming in
jsr Obj34_Wait(pc)
move.b (Current_Zone).w,d0 ; get the current zone
cmpi.b #sky_chase_zone,d0 ; is it Sky Chase?
beq.s BranchTo9_DeleteObject ; if yes, branch
cmpi.b #wing_fortress_zone,d0 ; is it Wing Fortress?
beq.s BranchTo9_DeleteObject ; if yes, branch
cmpi.b #death_egg_zone,d0 ; is it Death Egg Zone?
beq.s BranchTo9_DeleteObject ; if yes, branch
move.b (Current_Act).w,d1 ; get the current act
addi.b #NumberOfZones+2,d1 ; Act number mappings (Act 1)
cmpi.b #metropolis_zone_2,d0 ; are we in Metropolis Zone Act 3?
bne.s + ; if not, branch
moveq #NumberOfZones+4,d1 ; Act number mappings (Act 3). Used for drawing MTZ (0x05) titlecard only
Now we have the offset data of where to load the mappings for the titlecards shifted so that we can now start working on updating the mappings and not have that strange "ZONE ZONE" bug that GARY 'M 9 left behind and I intended to correct.
Adding new Art Load Cue Data to the TitleCards for New Zones
Next, another thing I wanted to see others correct. this time, I will explain why I changed byte_15820 into a 16-bit relative offset index as opposed to it staying as a byte-by-byte relative offset that does not point correctly, and to appropriately handle the string data in word_15832, as well as allow that string data to be properly represented. This time I will make it even clearer too.
Next off, in this part of the hack the first thing before converting to a better manageable datatype, we want to replace the byte_15820 handler with a better one.
Look for:
; loc_157D2:
LoadTitleCard:
bsr.s LoadTitleCard0
moveq #0,d0
move.b (Current_Zone).w,d0
move.b Off_TitleCardLetters(pc,d0.w),d0
lea TitleCardLetters(pc),a0
lea (a0,d0.w),a0
move.l #vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0
and we want to replace it with:
; loc_157D2:
LoadTitleCard:
bsr.s LoadTitleCard0
moveq #0,d0
move.b (Current_Zone).w,d0
add.w d0,d0
move.w Off_TitleCardLetters(pc,d0.w),d0
lea Off_TitleCardLetters(pc,d0.w),a0
move.l #vdpComm(tiles_to_bytes(ArtTile_LevelName),VRAM,WRITE),d0
That takes care of the loader, now time to update the string data.
find:
; byte_15820:
Off_TitleCardLetters:
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 0
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 1
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 2
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 3
dc.b TitleCardLetters_MTZ - TitleCardLetters ; 4
dc.b TitleCardLetters_MTZ - TitleCardLetters ; 5
dc.b TitleCardLetters_WFZ - TitleCardLetters ; 6
dc.b TitleCardLetters_HTZ - TitleCardLetters ; 7
dc.b TitleCardLetters_HPZ - TitleCardLetters ; 8
dc.b TitleCardLetters_EHZ - TitleCardLetters ; 9
dc.b TitleCardLetters_OOZ - TitleCardLetters ; A
dc.b TitleCardLetters_MCZ - TitleCardLetters ; B
dc.b TitleCardLetters_CNZ - TitleCardLetters ; C
dc.b TitleCardLetters_CPZ - TitleCardLetters ; D
dc.b TitleCardLetters_DEZ - TitleCardLetters ; E
dc.b TitleCardLetters_ARZ - TitleCardLetters ; F
dc.b TitleCardLetters_SCZ - TitleCardLetters ; 10
even
; temporarily remap characters to title card letter format
; Characters are encoded as Aa, Bb, Cc, etc. through a macro
charset 'A',0 ; can't have an embedded 0 in a string
charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4"
charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4"
charset '.',"\x5A"
; Defines which letters load for the continue screen
; Each letter occurs only once, and the letters ENOZ (i.e. ZONE) aren't loaded here
; However, this is hidden by the titleLetters macro, and normal titles can be used
; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here)
; word_15832:
TitleCardLetters:
TitleCardLetters_EHZ:
titleLetters "EMERALD HILL"
TitleCardLetters_MTZ:
titleLetters "METROPOLIS"
TitleCardLetters_HTZ:
titleLetters "HILL TOP"
TitleCardLetters_HPZ:
titleLetters "HIDDEN PALACE"
TitleCardLetters_OOZ:
titleLetters "OIL OCEAN"
TitleCardLetters_MCZ:
titleLetters "MYSTIC CAVE"
TitleCardLetters_CNZ:
titleLetters "CASINO NIGHT"
TitleCardLetters_CPZ:
titleLetters "CHEMICAL PLANT"
TitleCardLetters_ARZ:
titleLetters "AQUATIC RUIN"
TitleCardLetters_SCZ:
titleLetters "SKY CHASE"
TitleCardLetters_WFZ:
titleLetters "WING FORTRESS"
TitleCardLetters_DEZ:
titleLetters "DEATH EGG"
charset ; revert character set
and replace it with:
;byte_15820
Off_TitleCardLetters: offsetTable
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 00
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 01
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 02
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 03
offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 04
offsetTableEntry.w TitleCardLetters_MTZ ; MTZ Titlecard 05
offsetTableEntry.w TitleCardLetters_WFZ ; WFZ Titlecard 06
offsetTableEntry.w TitleCardLetters_HTZ ; HTZ Titlecard 07
offsetTableEntry.w TitleCardLetters_HPZ ; HPZ Titlecard 08
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 09
offsetTableEntry.w TitleCardLetters_OOZ ; OOZ Titlecard 0A
offsetTableEntry.w TitleCardLetters_MCZ ; MCZ Titlecard 0B
offsetTableEntry.w TitleCardLetters_CNZ ; CNZ Titlecard 0C
offsetTableEntry.w TitleCardLetters_CPZ ; CPZ Titlecard 0D
offsetTableEntry.w TitleCardLetters_DEZ ; DEZ Titlecard 0E
offsetTableEntry.w TitleCardLetters_ARZ ; ARZ Titlecard 0F
offsetTableEntry.w TitleCardLetters_SCZ ; SCZ Titlecard 10
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 11
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 12
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 13
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 14
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 15
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 16
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 17
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 18
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 19
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1A
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1B
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1C
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1D
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1E
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 1F
offsetTableEntry.w TitleCardLetters_EHZ ; EHZ Titlecard 20
; temporarily remap characters to title card letter format
; Characters are encoded as Aa, Bb, Cc, etc. through a macro
charset 'A',0 ; can't have an embedded 0 in a string
charset 'B',"\4\8\xC\4\x10\x14\x18\x1C\x1E\x22\x26\x2A\4\4\x30\x34\x38\x3C\x40\x44\x48\x4C\x52\x56\4"
charset 'a',"\4\4\4\4\4\4\4\4\2\4\4\4\6\4\4\4\4\4\4\4\4\4\6\4\4"
charset '.',"\x5A"
; Defines which letters load for the continue screen
; Each letter occurs only once, and the letters ENOZ (i.e. ZONE) aren't loaded here
; However, this is hidden by the titleLetters macro, and normal titles can be used
; (the macro is defined near SpecialStage_ResultsLetters, which uses it before here)
; word_15832:
TitleCardLetters:
TitleCardLetters_EHZ:
titleLetters "EMERALD HILL"
TitleCardLetters_MTZ:
titleLetters "METROPOLIS"
TitleCardLetters_HTZ:
titleLetters "HILL TOP"
TitleCardLetters_HPZ:
titleLetters "HIDDEN PALACE"
TitleCardLetters_OOZ:
titleLetters "OIL OCEAN"
TitleCardLetters_MCZ:
titleLetters "MYSTIC CAVE"
TitleCardLetters_CNZ:
titleLetters "CASINO NIGHT"
TitleCardLetters_CPZ:
titleLetters "CHEMICAL PLANT"
TitleCardLetters_ARZ:
titleLetters "AQUATIC RUIN"
TitleCardLetters_SCZ:
titleLetters "SKY CHASE"
TitleCardLetters_WFZ:
titleLetters "WING FORTRESS"
TitleCardLetters_DEZ:
titleLetters "DEATH EGG"
charset ; revert character set
Point Fix: This data manager, as implemented, doesn't work with a byte-string data. If you tried to use that byte-string data, you've noticed weird names. For example, Emerald Hill became Emepqrs T?rr.
This adds the basic card configuration to our new levels. You can freely edit the entries of this table to suit your needs.
Extending TitleCard Sprite Mappings
Now, find:
; -------------------------------------------------------------------------------
; sprite mappings
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA: offsetTable
offsetTableEntry.w word_147E8
offsetTableEntry.w word_147E8
offsetTableEntry.w word_147E8
offsetTableEntry.w word_147E8
offsetTableEntry.w word_14842
offsetTableEntry.w word_14842
offsetTableEntry.w word_14B24
offsetTableEntry.w word_14894
offsetTableEntry.w word_148CE
offsetTableEntry.w word_147E8
offsetTableEntry.w word_14930
offsetTableEntry.w word_14972
offsetTableEntry.w word_149C4
offsetTableEntry.w word_14A1E
offsetTableEntry.w word_14B86
offsetTableEntry.w word_14A88
offsetTableEntry.w word_14AE2
offsetTableEntry.w word_14BC8
offsetTableEntry.w word_14BEA
offsetTableEntry.w word_14BF4
offsetTableEntry.w word_14BFE
offsetTableEntry.w word_14C08
offsetTableEntry.w word_14C32
word_147E8: dc.w $B
dc.w 5, $8580, $82C0, $FFC3
dc.w 9, $85DE, $82EF, $FFD0
dc.w 5, $8580, $82C0, $FFE8
dc.w 5, $85E4, $82F2, $FFF8
dc.w 5, $85E8, $82F4, 8
dc.w 5, $85EC, $82F6, $18
dc.w 5, $85F0, $82F8, $28
dc.w 5, $85F4, $82FA, $48
dc.w 1, $85F8, $82FC, $58
dc.w 5, $85EC, $82F6, $60
dc.w 5, $85EC, $82F6, $70
word_14842: dc.w $A
dc.w 9, $85DE, $82EF, $FFE0
dc.w 5, $8580, $82C0, $FFF8
dc.w 5, $85E4, $82F2, 8
dc.w 5, $85E8, $82F4, $18
dc.w 5, $8588, $82C4, $28
dc.w 5, $85EC, $82F6, $38
dc.w 5, $8588, $82C4, $48
dc.w 5, $85F0, $82F8, $58
dc.w 1, $85F4, $82FA, $68
dc.w 5, $85F6, $82FB, $70
word_14894: dc.w 7
dc.w 5, $85DE, $82EF, 8
dc.w 1, $85E2, $82F1, $18
dc.w 5, $85E4, $82F2, $20
dc.w 5, $85E4, $82F2, $30
dc.w 5, $85E8, $82F4, $51
dc.w 5, $8588, $82C4, $60
dc.w 5, $85EC, $82F6, $70
word_148CE: dc.w $C
dc.w 5, $85DE, $82EF, $FFB8
dc.w 1, $85E2, $82F1, $FFC8
dc.w 5, $85E4, $82F2, $FFD0
dc.w 5, $85E4, $82F2, $FFE0
dc.w 5, $8580, $82C0, $FFF0
dc.w 5, $8584, $82C2, 0
dc.w 5, $85E8, $82F4, $20
dc.w 5, $85EC, $82F6, $30
dc.w 5, $85F0, $82F8, $40
dc.w 5, $85EC, $82F6, $50
dc.w 5, $85F4, $82FA, $60
dc.w 5, $8580, $82C0, $70
word_14930: dc.w 8
dc.w 5, $8588, $82C4, $FFFB
dc.w 1, $85DE, $82EF, $B
dc.w 5, $85E0, $82F0, $13
dc.w 5, $8588, $82C4, $33
dc.w 5, $85E4, $82F2, $43
dc.w 5, $8580, $82C0, $53
dc.w 5, $85E8, $82F4, $60
dc.w 5, $8584, $82C2, $70
word_14972: dc.w $A
dc.w 9, $85DE, $82EF, $FFD0
dc.w 5, $85E4, $82F2, $FFE8
dc.w 5, $85E8, $82F4, $FFF8
dc.w 5, $85EC, $82F6, 8
dc.w 1, $85F0, $82F8, $18
dc.w 5, $85F2, $82F9, $20
dc.w 5, $85F2, $82F9, $41
dc.w 5, $85F6, $82FB, $50
dc.w 5, $85FA, $82FD, $60
dc.w 5, $8580, $82C0, $70
word_149C4: dc.w $B
dc.w 5, $85DE, $82EF, $FFD1
dc.w 5, $85E2, $82F1, $FFE0
dc.w 5, $85E6, $82F3, $FFF0
dc.w 1, $85EA, $82F5, 0
dc.w 5, $8584, $82C2, 8
dc.w 5, $8588, $82C4, $18
dc.w 5, $8584, $82C2, $38
dc.w 1, $85EA, $82F5, $48
dc.w 5, $85EC, $82F6, $50
dc.w 5, $85F0, $82F8, $60
dc.w 5, $85F4, $82FA, $70
word_14A1E: dc.w $D
dc.w 5, $85DE, $82EF, $FFA4
dc.w 5, $85E2, $82F1, $FFB4
dc.w 5, $8580, $82C0, $FFC4
dc.w 9, $85E6, $82F3, $FFD1
dc.w 1, $85EC, $82F6, $FFE9
dc.w 5, $85DE, $82EF, $FFF1
dc.w 5, $85EE, $82F7, 0
dc.w 5, $85F2, $82F9, $10
dc.w 5, $85F6, $82FB, $31
dc.w 5, $85F2, $82F9, $41
dc.w 5, $85EE, $82F7, $50
dc.w 5, $8584, $82C2, $60
dc.w 5, $85FA, $82FD, $70
word_14A88: dc.w $B
dc.w 5, $85DE, $82EF, $FFD2
dc.w 5, $85E2, $82F1, $FFE2
dc.w 5, $85E6, $82F3, $FFF2
dc.w 5, $85DE, $82EF, 0
dc.w 5, $85EA, $82F5, $10
dc.w 1, $85EE, $82F7, $20
dc.w 5, $85F0, $82F8, $28
dc.w 5, $85F4, $82FA, $48
dc.w 5, $85E6, $82F3, $58
dc.w 1, $85EE, $82F7, $68
dc.w 5, $8584, $82C2, $70
word_14AE2: dc.w 8
dc.w 5, $85DE, $82EF, $FFF0
dc.w 5, $85E2, $82F1, 0
dc.w 5, $85E6, $82F3, $10
dc.w 5, $85EA, $82F5, $30
dc.w 5, $85EE, $82F7, $40
dc.w 5, $85F2, $82F9, $50
dc.w 5, $85DE, $82EF, $60
dc.w 5, $8580, $82C0, $70
word_14B24: dc.w $C
dc.w 9, $85DE, $82EF, $FFB1
dc.w 1, $85E4, $82F2, $FFC8
dc.w 5, $8584, $82C2, $FFD0
dc.w 5, $85E6, $82F3, $FFE0
dc.w 5, $85EA, $82F5, 1
dc.w 5, $8588, $82C4, $10
dc.w 5, $85EE, $82F7, $20
dc.w 5, $85F2, $82F9, $30
dc.w 5, $85EE, $82F7, $40
dc.w 5, $8580, $82C0, $50
dc.w 5, $85F6, $82FB, $5F
dc.w 5, $85F6, $82FB, $6F
word_14B86: dc.w 8
dc.w 5, $85DE, $82EF, $FFF2
dc.w 5, $8580, $82C0, 2
dc.w 5, $85E2, $82F1, $10
dc.w 5, $85E6, $82F3, $20
dc.w 5, $85EA, $82F5, $30
dc.w 5, $8580, $82C0, $51
dc.w 5, $85EE, $82F7, $60
dc.w 5, $85EE, $82F7, $70
word_14BC8: dc.w 4
dc.w 5, $858C, $82C6, 1
dc.w 5, $8588, $82C4, $10
dc.w 5, $8584, $82C2, $20
dc.w 5, $8580, $82C0, $30
word_14BEA: dc.w 1
dc.w 7, $A590, $A2C8, 0
word_14BF4: dc.w 1
dc.w $B, $A598, $A2CC, 0
word_14BFE: dc.w 1
dc.w $B, $A5A4, $A2D2, 0
word_14C08: dc.w 5
dc.w $D, $85B0, $82D8, $FFB8
dc.w $D, $85B8, $82DC, $FFD8
dc.w $D, $85C0, $82E0, $FFF8
dc.w $D, $85C8, $82E4, $18
dc.w 5, $85D0, $82E8, $38
word_14C32: dc.w 7
dc.w $9003, $85D4, $82EA, 0
dc.w $B003, $85D4, $82EA, 0
dc.w $D003, $85D4, $82EA, 0
dc.w $F003, $85D4, $82EA, 0
dc.w $1003, $85D4, $82EA, 0
dc.w $3003, $85D4, $82EA, 0
dc.w $5003, $85D4, $82EA, 0
If you check the routine of Obj34, you will see this is called from anywhere it is in the ROM. Thus, we can shift this data to another place we can edit it without any code interference. I can suggest you two locations for editing: the first is the end of the disassembly. The second is the end of the header. We will use here the end of disassembly. We will replace it with:
word_14BC8: ;keep this line to prevent errors
dc.w 4 ; number of letters
dc.w 5, $858C, $82C6, 0 ;Z
dc.w 5, $8588, $82C4, $10 ;O
dc.w 5, $8584, $82C2, $20 ;N
dc.w 5, $8580, $82C0, $30 ;E
word_14BEA: ;keep this line to prevent errors
dc.w $1 ; number of digits
dc.w 7, $A590, $A2C8, 0 ;1
word_14BF4: ;keep this line to prevent errors
dc.w $1 ; number of digits
dc.w $B, $A598, $A2CC, 0 ;2
word_14BFE: ;keep this line to prevent errors
dc.w $1 ; number of digits
dc.w $B, $A5A4, $A2D2, 0 ;3
for compatibility woth other mappings in the area and put this at the end of your disassembly:
; -------------------------------------------------------------------------------
; sprite mappings
; -------------------------------------------------------------------------------
Obj34_MapUnc_147BA: offsetTable
offsetTableEntry.w Titlecard_EHZ ; EHZ 00
offsetTableEntry.w Titlecard_EHZ ; EHZ 01
offsetTableEntry.w Titlecard_EHZ ; EHZ 02
offsetTableEntry.w Titlecard_EHZ ; EHZ 03
offsetTableEntry.w Titlecard_MTZ ; MTZ 04
offsetTableEntry.w Titlecard_MTZ ; MTZ 05
offsetTableEntry.w Titlecard_WFZ ; WFZ 06
offsetTableEntry.w Titlecard_HTZ ; HTZ 07
offsetTableEntry.w Titlecard_HPZ ; HPZ 08
offsetTableEntry.w Titlecard_EHZ ; EHZ 09
offsetTableEntry.w Titlecard_OOZ ; OOZ 0A
offsetTableEntry.w Titlecard_MCZ ; MCZ 0B
offsetTableEntry.w Titlecard_CNZ ; CNZ 0C
offsetTableEntry.w Titlecard_CPZ ; CPZ 0D
offsetTableEntry.w Titlecard_DEZ ; DEZ 0E
offsetTableEntry.w Titlecard_ARZ ; ARZ 0F
offsetTableEntry.w Titlecard_SCZ ; SCZ 10
offsetTableEntry.w Titlecard_EHZ ; EHZ 11
offsetTableEntry.w Titlecard_EHZ ; EHZ 12
offsetTableEntry.w Titlecard_EHZ ; EHZ 13
offsetTableEntry.w Titlecard_EHZ ; EHZ 14
offsetTableEntry.w Titlecard_EHZ ; EHZ 15
offsetTableEntry.w Titlecard_EHZ ; EHZ 16
offsetTableEntry.w Titlecard_EHZ ; EHZ 17
offsetTableEntry.w Titlecard_EHZ ; EHZ 18
offsetTableEntry.w Titlecard_EHZ ; EHZ 19
offsetTableEntry.w Titlecard_EHZ ; EHZ 1A
offsetTableEntry.w Titlecard_EHZ ; EHZ 1B
offsetTableEntry.w Titlecard_EHZ ; EHZ 1C
offsetTableEntry.w Titlecard_EHZ ; EHZ 1D
offsetTableEntry.w Titlecard_EHZ ; EHZ 1E
offsetTableEntry.w Titlecard_EHZ ; EHZ 1F
offsetTableEntry.w Titlecard_EHZ ; EHZ 20
offsetTableEntry.w T_ZONE ; "ZONE"
offsetTableEntry.w T_ACT1 ; "1"
offsetTableEntry.w T_ACT2 ; "2"
offsetTableEntry.w T_ACT3 ; "3"
offsetTableEntry.w T_STH ; "SONIC THE HEDGEHOG"
offsetTableEntry.w T_STRIPEDGE ; ">"
TitleCard_EHZ:
dc.w 11 ; number of letters
dc.w 5, $8580, $82C0, $FFC3 ;E
dc.w 9, $85DE, $82EF, $FFD0 ;M
dc.w 5, $8580, $82C0, $FFE8 ;E
dc.w 5, $85E4, $82F2, $FFF8 ;R
dc.w 5, $85E8, $82F4, 8 ;A
dc.w 5, $85EC, $82F6, $18 ;L
dc.w 5, $85F0, $82F8, $28 ;D
dc.w 5, $85F4, $82FA, $48 ;H
dc.w 1, $85F8, $82F2, $58 ;I
dc.w 5, $85EC, $82F6, $60 ;L
dc.w 5, $85EC, $82F6, $70 ;L
TitleCard_MTZ:
dc.w 10 ; number of letters
dc.w 9, $85DE, $82EF, $FFE0 ;M
dc.w 5, $8580, $82C0, $FFF8 ;E
dc.w 5, $85E4, $82F2, 8 ;T
dc.w 5, $85E8, $82F4, $18 ;R
dc.w 5, $8588, $82C4, $28 ;O
dc.w 5, $85EC, $82F6, $38 ;P
dc.w 5, $8588, $82C4, $48 ;O
dc.w 5, $85F0, $82F8, $58 ;L
dc.w 1, $85F4, $82FA, $68 ;I
dc.w 5, $85F6, $82FB, $70 ;S
TitleCard_WFZ:
dc.w 12 ; number of letters
dc.w 9, $85DE, $82EF, $FFB0 ;W
dc.w 1, $85E4, $82F2, $FFC8 ;I
dc.w 5, $8584, $82C2, $FFD0 ;N
dc.w 5, $85E6, $82F3, $FFE0 ;G
dc.w 5, $85EA, $82F5, 0 ;F
dc.w 5, $8588, $82C4, $10 ;O
dc.w 5, $85EE, $82F7, $20 ;R
dc.w 5, $85F2, $82F9, $30 ;T
dc.w 5, $85EE, $82F7, $40 ;R
dc.w 5, $8580, $82C0, $50 ;E
dc.w 5, $85F6, $82FB, $60 ;S
dc.w 5, $85F6, $82FB, $70 ;S
TitleCard_HTZ:
dc.w 7 ; number of letters
dc.w 5, $85DE, $82EF, 8 ;H
dc.w 1, $85E2, $82F1, $18 ;I
dc.w 5, $85E4, $82F2, $20 ;L
dc.w 5, $85E4, $82F2, $30 ;L
dc.w 5, $85E8, $82F4, $50 ;T
dc.w 5, $8588, $82C4, $60 ;O
dc.w 5, $85EC, $82F6, $70 ;P
TitleCard_HPZ:
dc.w 12 ; number of letters
dc.w 5, $85DE, $82EF, $FFB8 ;H
dc.w 1, $85E2, $82F1, $FFC8 ;I
dc.w 5, $85E4, $82F2, $FFD0 ;D
dc.w 5, $85E4, $82F2, $FFE0 ;D
dc.w 5, $8580, $82C0, $FFF0 ;E
dc.w 5, $8584, $82C4, 0 ;N
dc.w 5, $85E8, $82F4, $20 ;P
dc.w 5, $85EC, $82F6, $30 ;A
dc.w 5, $85F0, $82F8, $40 ;L
dc.w 5, $85EC, $82F6, $50 ;A
dc.w 5, $85F4, $82FA, $60 ;C
dc.w 5, $8580, $82C0, $70 ;E
TitleCard_OOZ:
dc.w 8 ; number of letters
dc.w 5, $8588, $82C4, $FFF8 ;O
dc.w 1, $85DE, $82EF, 8 ;I
dc.w 5, $85E0, $82F0, $10 ;L
dc.w 5, $8588, $82C4, $30 ;O
dc.w 5, $85E4, $82F2, $40 ;C
dc.w 5, $8580, $82C0, $50 ;E
dc.w 5, $85E8, $82F4, $60 ;A
dc.w 5, $8584, $82C2, $70 ;N
TitleCard_MCZ:
dc.w 10 ; number of letters
dc.w 9, $85DE, $82EF, $FFD0 ;M
dc.w 5, $85E4, $82F2, $FFE8 ;Y
dc.w 5, $85E8, $82F4, $FFF8 ;S
dc.w 5, $85EC, $82F6, 8 ;T
dc.w 1, $85F0, $82F8, $18 ;I
dc.w 5, $85F2, $82F9, $20 ;C
dc.w 5, $85F2, $82F9, $40 ;C
dc.w 5, $85F6, $82FB, $50 ;A
dc.w 5, $85FA, $82FD, $60 ;V
dc.w 5, $8580, $82C0, $70 ;E
TitleCard_CNZ:
dc.w 11 ; number of letters
dc.w 5, $85DE, $82EF, $FFD0 ;C
dc.w 5, $85E2, $82F1, $FFE0 ;A
dc.w 5, $85E6, $82F3, $FFF0 ;S
dc.w 1, $85EA, $82F5, 0 ;I
dc.w 5, $8584, $82C2, 8 ;N
dc.w 5, $8588, $82C4, $18 ;O
dc.w 5, $8584, $82C2, $38 ;N
dc.w 1, $85EA, $82F5, $48 ;I
dc.w 5, $85EC, $82F6, $50 ;G
dc.w 5, $85F0, $82F8, $60 ;H
dc.w 5, $85F4, $82FA, $70 ;T
TitleCard_CPZ:
dc.w 13 ; number of letters
dc.w 5, $85DE, $82EF, $FFA0 ;C
dc.w 5, $85E2, $82F1, $FFB0 ;H
dc.w 5, $8580, $82C0, $FFC0 ;E
dc.w 9, $85E6, $82F3, $FFD0 ;M
dc.w 1, $85EC, $82F6, $FFE8 ;I
dc.w 5, $85DE, $82EF, $FFF0 ;C
dc.w 5, $85EE, $82F7, 0 ;A
dc.w 5, $85F2, $82F9, $10 ;L
dc.w 5, $85F6, $82FB, $30 ;P
dc.w 5, $85F2, $82F9, $40 ;L
dc.w 5, $85EE, $82F7, $50 ;A
dc.w 5, $8584, $82C2, $60 ;N
dc.w 5, $85FA, $82FD, $70 ;T
TitleCard_DEZ:
dc.w 8 ; number of letters
dc.w 5, $85DE, $82EF, $FFF0 ;D
dc.w 5, $8580, $82C0, 0 ;E
dc.w 5, $85E2, $82F1, $10 ;A
dc.w 5, $85E6, $82F3, $20 ;T
dc.w 5, $85EA, $82F5, $30 ;H
dc.w 5, $8580, $82C0, $50 ;E
dc.w 5, $85EE, $82F7, $60 ;G
dc.w 5, $85EE, $82F7, $70 ;G
TitleCard_ARZ:
dc.w 11 ; number of letters
dc.w 5, $85DE, $82EF, $FFD0 ;A
dc.w 5, $85E2, $82F1, $FFE0 ;Q
dc.w 5, $85E6, $82F3, $FFF0 ;U
dc.w 5, $85DE, $82EF, 0 ;A
dc.w 5, $85EA, $82F5, $10 ;T
dc.w 1, $85EE, $82F7, $20 ;I
dc.w 5, $85F0, $82F8, $28 ;C
dc.w 5, $85F4, $82FA, $48 ;R
dc.w 5, $85E6, $82F3, $58 ;U
dc.w 1, $85EE, $82F7, $68 ;I
dc.w 5, $8584, $82C2, $70 ;N
TitleCard_SCZ:
dc.w 8 ; number of letters
dc.w 5, $85DE, $82EF, $FFF0 ;S
dc.w 5, $85E2, $82F1, 0 ;K
dc.w 5, $85E6, $82F3, $10 ;Y
dc.w 5, $85EA, $82F5, $30 ;C
dc.w 5, $85EE, $82F7, $40 ;H
dc.w 5, $85F2, $82F7, $50 ;A
dc.w 5, $85DE, $82EF, $60 ;S
dc.w 5, $8580, $82C0, $70 ;E
T_ZONE:
dc.w 4 ; number of letters
dc.w 5, $858C, $82C6, 0 ;Z
dc.w 5, $8588, $82C4, $10 ;O
dc.w 5, $8584, $82C2, $20 ;N
dc.w 5, $8580, $82C0, $30 ;E
T_ACT1:
dc.w $1 ; number of digits
dc.w 7, $A590, $A2C8, 0 ;1
T_ACT2:
dc.w $1 ; number of digits
dc.w $B, $A598, $A2CC, 0 ;2
T_ACT3:
dc.w $1 ; number of digits
dc.w $B, $A5A4, $A2D2, 0 ;3
T_STH:
dc.w $5 ; number of tiles (what they say is below)
dc.w $D, $85B0, $82DE, $FFB8 ;SONI
dc.w $D, $85B8, $82DC, $FFD8 ;C TH
dc.w $D, $85C0, $82E0, $FFF8 ;E HE
dc.w $D, $85C8, $82E4, $18 ;DGEH
dc.w $5, $85D0, $82E8, $38 ;OG
T_STRIPEDGE:
dc.w $7 ; number of tiles (to display strip edge)
dc.w $9003, $85D4, $82EA, 0 ;>
dc.w $B003, $85D4, $82EA, 0 ;>
dc.w $D003, $85D4, $82EA, 0 ;>
dc.w $F003, $85D4, $82EA, 0 ;>
dc.w $1003, $85D4, $82EA, 0 ;>
dc.w $3003, $85D4, $82EA, 0 ;>
dc.w $5003, $85D4, $82EA, 0 ;>
; ==================================================================
To avoid alignment problems, add this line before and after the code above:
align $200
Extending the Palette Cycle information
Now we want to locate:
; off_19F4:
PalCycle: zoneOrderedOffsetTable 2,1
zoneOffsetTableEntry.w PalCycle_EHZ ; 0
zoneOffsetTableEntry.w PalCycle_Null ; 1
zoneOffsetTableEntry.w PalCycle_WZ ; 2
zoneOffsetTableEntry.w PalCycle_Null ; 3
zoneOffsetTableEntry.w PalCycle_MTZ ; 4
zoneOffsetTableEntry.w PalCycle_MTZ ; 5
zoneOffsetTableEntry.w PalCycle_WFZ ; 6
zoneOffsetTableEntry.w PalCycle_HTZ ; 7
zoneOffsetTableEntry.w PalCycle_HPZ ; 8
zoneOffsetTableEntry.w PalCycle_Null ; 9
zoneOffsetTableEntry.w PalCycle_OOZ ; 10
zoneOffsetTableEntry.w PalCycle_MCZ ; 11
zoneOffsetTableEntry.w PalCycle_CNZ ; 12
zoneOffsetTableEntry.w PalCycle_CPZ ; 13
zoneOffsetTableEntry.w PalCycle_CPZ ; 14
zoneOffsetTableEntry.w PalCycle_ARZ ; 15
zoneOffsetTableEntry.w PalCycle_WFZ ; 16
zoneTableEnd
and replace it with:
; off_19F4:
PalCycle: zoneOrderedOffsetTable 2,1
zoneOffsetTableEntry.w PalCycle_EHZ ; 00
zoneOffsetTableEntry.w PalCycle_Null ; 01
zoneOffsetTableEntry.w PalCycle_WZ ; 02
zoneOffsetTableEntry.w PalCycle_Null ; 03
zoneOffsetTableEntry.w PalCycle_MTZ ; 04
zoneOffsetTableEntry.w PalCycle_MTZ ; 05
zoneOffsetTableEntry.w PalCycle_WFZ ; 06
zoneOffsetTableEntry.w PalCycle_HTZ ; 07
zoneOffsetTableEntry.w PalCycle_HPZ ; 08
zoneOffsetTableEntry.w PalCycle_Null ; 09
zoneOffsetTableEntry.w PalCycle_OOZ ; 0A
zoneOffsetTableEntry.w PalCycle_MCZ ; 0B
zoneOffsetTableEntry.w PalCycle_CNZ ; 0C
zoneOffsetTableEntry.w PalCycle_CPZ ; 0D
zoneOffsetTableEntry.w PalCycle_CPZ ; 0E
zoneOffsetTableEntry.w PalCycle_ARZ ; 0F
zoneOffsetTableEntry.w PalCycle_WFZ ; 10
zoneOffsetTableEntry.w PalCycle_Null ; 11
zoneOffsetTableEntry.w PalCycle_Null ; 12
zoneOffsetTableEntry.w PalCycle_Null ; 13
zoneOffsetTableEntry.w PalCycle_Null ; 14
zoneOffsetTableEntry.w PalCycle_Null ; 15
zoneOffsetTableEntry.w PalCycle_Null ; 16
zoneOffsetTableEntry.w PalCycle_Null ; 17
zoneOffsetTableEntry.w PalCycle_Null ; 18
zoneOffsetTableEntry.w PalCycle_Null ; 19
zoneOffsetTableEntry.w PalCycle_Null ; 1A
zoneOffsetTableEntry.w PalCycle_Null ; 1B
zoneOffsetTableEntry.w PalCycle_Null ; 1C
zoneOffsetTableEntry.w PalCycle_Null ; 1D
zoneOffsetTableEntry.w PalCycle_Null ; 1E
zoneOffsetTableEntry.w PalCycle_Null ; 1F
zoneOffsetTableEntry.w PalCycle_Null ; 20
zoneTableEnd
That inserts empty slots for the cycling palettes of out new levels.
Extending the static palette list
Next we locate:
;----------------------------------------------------------------------------
; Palette pointers
; (PALETTE DESCRIPTOR ARRAY)
; This struct array defines the palette to use for each level.
;----------------------------------------------------------------------------
palptr macro ptr,lineno
dc.l ptr ; Pointer to palette
dc.w (Normal_palette+lineno*palette_line_size)&$FFFF ; Location in ram to load palette into
dc.w bytesToLcnt(ptr_End-ptr) ; Size of palette in (bytes / 4)
endm
PalPointers:
PalPtr_SEGA: palptr Pal_SEGA, 0
PalPtr_Title: palptr Pal_Title, 1
PalPtr_MenuB: palptr Pal_MenuB, 0
PalPtr_BGND: palptr Pal_BGND, 0
PalPtr_EHZ: palptr Pal_EHZ, 1
PalPtr_EHZ2: palptr Pal_EHZ, 1
PalPtr_WZ: palptr Pal_WZ, 1
PalPtr_EHZ3: palptr Pal_EHZ, 1
PalPtr_MTZ: palptr Pal_MTZ, 1
PalPtr_MTZ2: palptr Pal_MTZ, 1
PalPtr_WFZ: palptr Pal_WFZ, 1
PalPtr_HTZ: palptr Pal_HTZ, 1
PalPtr_HPZ: palptr Pal_HPZ, 1
PalPtr_EHZ4: palptr Pal_EHZ, 1
PalPtr_OOZ: palptr Pal_OOZ, 1
PalPtr_MCZ: palptr Pal_MCZ, 1
PalPtr_CNZ: palptr Pal_CNZ, 1
PalPtr_CPZ: palptr Pal_CPZ, 1
PalPtr_DEZ: palptr Pal_DEZ, 1
PalPtr_ARZ: palptr Pal_ARZ, 1
PalPtr_SCZ: palptr Pal_SCZ, 1
PalPtr_HPZ_U: palptr Pal_HPZ_U, 0
PalPtr_CPZ_U: palptr Pal_CPZ_U, 0
PalPtr_ARZ_U: palptr Pal_ARZ_U, 0
PalPtr_SS: palptr Pal_SS, 0
PalPtr_MCZ_B: palptr Pal_MCZ_B, 1
PalPtr_CNZ_B: palptr Pal_CNZ_B, 1
PalPtr_SS1: palptr Pal_SS1, 3
PalPtr_SS2: palptr Pal_SS2, 3
PalPtr_SS3: palptr Pal_SS3, 3
PalPtr_SS4: palptr Pal_SS4, 3
PalPtr_SS5: palptr Pal_SS5, 3
PalPtr_SS6: palptr Pal_SS6, 3
PalPtr_SS7: palptr Pal_SS7, 3
PalPtr_SS1_2p: palptr Pal_SS1_2p,3
PalPtr_SS2_2p: palptr Pal_SS2_2p,3
PalPtr_SS3_2p: palptr Pal_SS3_2p,3
PalPtr_OOZ_B: palptr Pal_OOZ_B, 1
PalPtr_Menu: palptr Pal_Menu, 0
PalPtr_Result: palptr Pal_Result,0
; ----------------------------------------------------------------------------
We all know that the palettes are directly addressed here. It means the index above can detect palettes anywhere in the ROM. This label, PalPointers, is called directly. We can, then, move this table to any location we want it in the ROM. Put this after:
EndOfHeader:
And after this table, put the following line to avoid alignment errors:
align $200
You can add more indexes to this table this way:
palptr Palette, Normal_palette_line2, $17
for a normal level palette, and, for a underwater level palette, you will add the normal palette for that level and its underwater palette.
palptr UnderwaterPalette, Normal_palette_line, $1F
You must only have attention when adding more palettes to don't overflow the palette index (yes, it is possible to have 255 palettes...).
Extending Zone Procedures and Scripts
Now we need to add the zone scripts.
Find:
PLC_DYNANM: zoneOrderedOffsetTable 2,2 ; Zone ID
zoneOffsetTableEntry.w Dynamic_Normal ; $00
zoneOffsetTableEntry.w Animated_EHZ
zoneOffsetTableEntry.w Dynamic_Null ; $01
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $02
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $03
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Normal ; $04
zoneOffsetTableEntry.w Animated_MTZ
zoneOffsetTableEntry.w Dynamic_Normal ; $05
zoneOffsetTableEntry.w Animated_MTZ
zoneOffsetTableEntry.w Dynamic_Null ; $06
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_HTZ ; $07
zoneOffsetTableEntry.w Animated_HTZ
zoneOffsetTableEntry.w Dynamic_Normal ; $08
zoneOffsetTableEntry.w Animated_HPZ
zoneOffsetTableEntry.w Dynamic_Null ; $09
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Normal ; $0A
zoneOffsetTableEntry.w Animated_OOZ
zoneOffsetTableEntry.w Dynamic_Null ; $0B
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_CNZ ; $0C
zoneOffsetTableEntry.w Animated_CNZ
zoneOffsetTableEntry.w Dynamic_Normal ; $0D
zoneOffsetTableEntry.w Animated_CPZ
zoneOffsetTableEntry.w Dynamic_Normal ; $0E
zoneOffsetTableEntry.w Animated_DEZ
zoneOffsetTableEntry.w Dynamic_ARZ ; $0F
zoneOffsetTableEntry.w Animated_ARZ
zoneOffsetTableEntry.w Dynamic_Null ; $10
zoneOffsetTableEntry.w Animated_Null
zoneTableEnd
and add to the end of it just before zoneTableEnd:
zoneOffsetTableEntry.w Dynamic_Null ; $11
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $12
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $13
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $14
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $15
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $16
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $17
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $18
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $19
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $1A
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $1B
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $1C
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $1D
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $1E
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $1F
zoneOffsetTableEntry.w Animated_Null
zoneOffsetTableEntry.w Dynamic_Null ; $20
zoneOffsetTableEntry.w Animated_Null
This creates scripts for the new levels. To make complex animations (like the HPZ pulsing ball) you will need to create a Anim*level*.bin and add it to the Anim*level*.bin files and add it to the animated pattern mappings. See the section below.
Extending Animated Pattern Mappings
Find:
AnimPatMaps: zoneOrderedOffsetTable 2,1
zoneOffsetTableEntry.w APM_EHZ ; 0
zoneOffsetTableEntry.w APM_Null ; 1
zoneOffsetTableEntry.w APM_Null ; 2
zoneOffsetTableEntry.w APM_Null ; 3
zoneOffsetTableEntry.w APM_MTZ ; 4
zoneOffsetTableEntry.w APM_MTZ ; 5
zoneOffsetTableEntry.w APM_Null ; 6
zoneOffsetTableEntry.w APM_EHZ ; 7
zoneOffsetTableEntry.w APM_HPZ ; 8
zoneOffsetTableEntry.w APM_Null ; 9
zoneOffsetTableEntry.w APM_OOZ ; $A
zoneOffsetTableEntry.w APM_Null ; $B
zoneOffsetTableEntry.w APM_CNZ ; $C
zoneOffsetTableEntry.w APM_CPZ ; $D
zoneOffsetTableEntry.w APM_DEZ ; $E
zoneOffsetTableEntry.w APM_ARZ ; $F
zoneOffsetTableEntry.w APM_Null ;$10
zoneTableEnd
then add this to the end of this index, just before zoneTableEnd:
zoneOffsetTableEntry.w APM_Null ;$11
zoneOffsetTableEntry.w APM_Null ;$12
zoneOffsetTableEntry.w APM_Null ;$13
zoneOffsetTableEntry.w APM_Null ;$14
zoneOffsetTableEntry.w APM_Null ;$15
zoneOffsetTableEntry.w APM_Null ;$16
zoneOffsetTableEntry.w APM_Null ;$17
zoneOffsetTableEntry.w APM_Null ;$18
zoneOffsetTableEntry.w APM_Null ;$19
zoneOffsetTableEntry.w APM_Null ;$1A
zoneOffsetTableEntry.w APM_Null ;$1B
zoneOffsetTableEntry.w APM_Null ;$1C
zoneOffsetTableEntry.w APM_Null ;$1D
zoneOffsetTableEntry.w APM_Null ;$1E
zoneOffsetTableEntry.w APM_Null ;$1F
zoneOffsetTableEntry.w APM_Null ;$20
then edit and change as needed. Add the new .bin files to below here:
; byte_40372:
APM_EHZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$4 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$5 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$8 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$C ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$9 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$D ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$10,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$14,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$11,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$15,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$6 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$3 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$7 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$A ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$E ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$B ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$F ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$12,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$16,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$13,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$17,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$18,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1A,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$19,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1B,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1E,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZMountains+$1D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_EHZMountains+$1F,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_Checkers+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_Checkers+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$0,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$0,1,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_EHZPulseBall+$1,1,0,2,0),make_block_tile(ArtTile_ArtKos_Checkers+$1,1,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$0,1,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers1+$1,1,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$0,1,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers2+$1,1,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$0,1,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_Flowers3+$1,1,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$0,1,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_Flowers4+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_Flowers4+$1,1,0,3,1)
APM_EHZ_End:
; byte_403EE:
APM_MTZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$0,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$1,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$2,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$3,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$4,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_1+$5,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$0,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$1,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$2,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$3,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$4,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,0,0,1,0),make_block_tile(ArtTile_ArtUnc_MTZAnimBack_2+$5,1,0,1,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$0 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$1 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$2 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$3 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$4 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$5 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$8 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$9 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$6 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$7 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Lava+$A ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Lava+$B ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$E,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$F,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$C,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$D,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$A,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$B,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$8,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$9,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$6,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$7,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$4,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$5,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$2,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$3,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$0,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_MTZCylinder+$1,0,0,3,1)
APM_MTZ_End:
; byte_404C2:
APM_HPZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0)
else
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,3,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,3,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,3,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,3,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,3,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,3,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,3,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$2,0,0,2,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$4,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$6,0,0,2,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_1+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$2,0,0,2,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$4,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$6,0,0,2,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_2+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$2,0,0,2,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$1,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$4,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$3,0,0,2,0),make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$6,0,0,2,0)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$5,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_HPZPulseOrb_3+$7,0,0,2,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
endif
APM_HPZ_End:
; byte_405B6:
APM_OOZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$0,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$2,0,0,0,1)
dc.w make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$1,0,0,0,1),make_block_tile(ArtTile_ArtUnc_OOZPulseBall+$3,0,0,0,1)
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$1,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_OOZSquareBall1+$3,0,0,3,1)
if gameRevision<2
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,0,0)
else
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$0,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$2,0,0,3,0)
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$1,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_OOZSquareBall2+$3,0,0,3,0),make_block_tile(ArtTile_ArtKos_LevelArt+$0,0,0,2,0)
endif
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$1,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$9,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$3,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$B,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$5,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$D,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$7,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil1+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil1+$F,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$1,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$8,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$9,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$3,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$A,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$B,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$4,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$5,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$D,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$6,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$7,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Oil2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Oil2+$F,0,0,2,1)
APM_OOZ_End:
; byte_4061A:
APM_CNZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$4,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$5,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$C,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$D,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$6,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$7,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$E,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1+$F,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$4,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$5,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$C,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$D,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$6,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$7,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$E,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2+$F,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$4,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$5,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$C,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$D,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$6,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$7,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$E,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3+$F,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$4,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$5,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$C,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$D,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$6,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$7,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$E,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2+$F,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$4,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$5,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$C,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$D,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$6,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$7,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$E,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1+$F,0,0,3,1)
APM_CNZ_End:
; byte_406BE:
APM_CNZ2P: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$4,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$5,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$C,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$D,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$6,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$7,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$E,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_1_2p+$F,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$4,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$5,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$C,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$D,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$6,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$7,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$E,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_2_2p+$F,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$0,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$4,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$1,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$5,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$8,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$C,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$9,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$D,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$2,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$6,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$3,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$7,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$A,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$E,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$B,0,0,0,0),make_block_tile(ArtTile_ArtUnc_CNZSlotPics_3_2p+$F,0,0,0,0)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$4,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$5,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$C,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$D,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$6,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$7,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$E,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_2_2p+$F,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$0,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$4,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$1,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$5,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$8,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$C,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$9,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$D,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$2,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$6,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$3,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$7,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$A,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$E,0,0,3,1)
dc.w make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$B,0,0,3,1),make_block_tile(ArtTile_ArtUnc_CNZFlipTiles_1_2p+$F,0,0,3,1)
APM_CNZ2P_End:
; byte_40762:
APM_CPZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_CPZAnimBack+$1,0,0,2,0)
APM_CPZ_End:
; byte_4076E:
APM_DEZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_DEZAnimBack+$1,0,0,2,0)
APM_DEZ_End:
; byte_4077A:
APM_ARZ: begin_animpat
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2 ,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3 ,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,1)
;These are invalid animation entries for waterfalls (bug in original game):
if 1==1
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,1)
else
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,1)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,1),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,1)
endif
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$1 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall3+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall3+$3 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$0 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$1 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall2+$2 ,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall2+$3 ,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_1+$3,0,0,2,0)
;These are invalid animation entries for waterfalls (bug in original game):
if 1==1
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$C,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$D,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$E,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$F,0,0,2,0)
else
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$0,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$1,0,0,2,0)
dc.w make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$2,0,0,2,0),make_block_tile(ArtTile_ArtUnc_Waterfall1_2+$3,0,0,2,0)
endif
APM_ARZ_End:
; byte_407BE:
APM_Null: dc.w 0
and fit this table to suit your needs, creating the necessary load queries for them. (If so, you need to know what you're doing here.)
Extending the 1 Player and 2 Player music playlists
To avoid some code-breaking problems (branches), we will fix this using a different way.
Go to EndOfHeader. If you are really following this tutorial, you've put a PalPointers table there. You will add between those two labels the following procedure:
DefineLevelBGM:
moveq #0,d0
move.b (Current_Zone).w,d0
lea (NormalMusicList).l,a1
tst.w (Two_Player_Mode).w
beq.s PlayNormalMusic
lea (MusicList2PMode).l,a1
PlayNormalMusic:
move.b (a1,d0.w),d0
move.w d0,(Level_Music).w
bsr.w JTR_PlayMusic
move.b #ObjID_TitleCard,(TitleCard+id).w ; <-- we need this, or there won't even be a title card, and if we remove it to remove the titlecard, we get a refresh glitch with sonic standing on air.
jmp Level_TtlCard
rts
JTR_PlayMusic:
jmp PlayMusic
rts
NormalMusicList:
dc.b MusID_EHZ ;00
dc.b MusID_EHZ ;01
dc.b MusID_EHZ ;02
dc.b MusID_EHZ ;03
dc.b MusID_MTZ ;04
dc.b MusID_MTZ ;05
dc.b MusID_WFZ ;06
dc.b MusID_HTZ ;07
dc.b MusID_HPZ ;08
dc.b MusID_EHZ ;09
dc.b MusID_OOZ ;0A
dc.b MusID_MCZ ;0B
dc.b MusID_CNZ ;0C
dc.b MusID_CPZ ;0D
dc.b MusID_DEZ ;0E
dc.b MusID_ARZ ;0F
dc.b MusID_SCZ ;10
dc.b MusID_EHZ ;11
dc.b MusID_EHZ ;12
dc.b MusID_EHZ ;13
dc.b MusID_EHZ ;14
dc.b MusID_EHZ ;15
dc.b MusID_EHZ ;16
dc.b MusID_EHZ ;17
dc.b MusID_EHZ ;18
dc.b MusID_EHZ ;19
dc.b MusID_EHZ ;1A
dc.b MusID_EHZ ;1B
dc.b MusID_EHZ ;1C
dc.b MusID_EHZ ;1D
dc.b MusID_EHZ ;1E
dc.b MusID_EHZ ;1F
dc.b MusID_EHZ ;20
align 4
MusicList2PMode:
dc.b MusID_EHZ_2P ;00
dc.b MusID_EHZ ;01
dc.b MusID_EHZ ;02
dc.b MusID_EHZ ;03
dc.b MusID_MTZ ;04
dc.b MusID_MTZ ;05
dc.b MusID_WFZ ;06
dc.b MusID_HTZ ;07
dc.b MusID_HPZ ;08
dc.b MusID_EHZ ;09
dc.b MusID_OOZ ;0A
dc.b MusID_MCZ_2P ;0B
dc.b MusID_CNZ_2P ;0C
dc.b MusID_CPZ ;0D
dc.b MusID_DEZ ;0E
dc.b MusID_ARZ ;0F
dc.b MusID_SCZ ;10
dc.b MusID_EHZ ;11
dc.b MusID_EHZ ;12
dc.b MusID_EHZ ;13
dc.b MusID_EHZ ;14
dc.b MusID_EHZ ;15
dc.b MusID_EHZ ;16
dc.b MusID_EHZ ;17
dc.b MusID_EHZ ;18
dc.b MusID_EHZ ;19
dc.b MusID_EHZ ;1A
dc.b MusID_EHZ ;1B
dc.b MusID_EHZ ;1C
dc.b MusID_EHZ ;1D
dc.b MusID_EHZ ;1E
dc.b MusID_EHZ ;1F
dc.b MusID_EHZ ;20
align $200
I decided to enumerate the music ids because it is likely you either extended the existing sound driver, or installed a new one if you added this many zones and you would likely want to not have to worry about fixing the music.
Now, go to Level_GetBGM. You will see this:
; loc_40AE:
Level_GetBgm:
tst.w (Demo_mode_flag).w
bmi.s +
moveq #0,d0
move.b (Current_Zone).w,d0
lea MusicList(pc),a1
tst.w (Two_player_mode).w
beq.s Level_PlayBgm
lea MusicList2(pc),a1
and replace it with:
; loc_40AE:
Level_GetBgm:
tst.w (Demo_mode_flag).w
bmi.s +
jmp DefineLevelBGM
Extending the demo list
now we will prepare everything so that we can put in new demo files for our new levels.
find:
; off_4948:
; ---------------------------------------------------------------------------
; DEMO SCRIPT POINTERS
; Contains an array of pointers to the script controlling the players actions
; to use for each level.
; ---------------------------------------------------------------------------
; off_4948:
DemoScriptPointers: zoneOrderedTable 4,1
zoneTableEntry.l Demo_EHZ ; $00
zoneTableEntry.l Demo_EHZ ; $01
zoneTableEntry.l Demo_EHZ ; $02
zoneTableEntry.l Demo_EHZ ; $03
zoneTableEntry.l Demo_EHZ ; $04
zoneTableEntry.l Demo_EHZ ; $05
zoneTableEntry.l Demo_EHZ ; $06
zoneTableEntry.l Demo_EHZ ; $07
zoneTableEntry.l Demo_EHZ ; $08
zoneTableEntry.l Demo_EHZ ; $09
zoneTableEntry.l Demo_EHZ ; $0A
zoneTableEntry.l Demo_EHZ ; $0B
zoneTableEntry.l Demo_CNZ ; $0C
zoneTableEntry.l Demo_CPZ ; $0D
zoneTableEntry.l Demo_EHZ ; $0E
zoneTableEntry.l Demo_ARZ ; $0F
zoneTableEntry.l Demo_EHZ ; $10
and insert after it:
zoneTableEntry.l Demo_EHZ ; $11
zoneTableEntry.l Demo_EHZ ; $12
zoneTableEntry.l Demo_EHZ ; $13
zoneTableEntry.l Demo_EHZ ; $14
zoneTableEntry.l Demo_EHZ ; $15
zoneTableEntry.l Demo_EHZ ; $16
zoneTableEntry.l Demo_EHZ ; $17
zoneTableEntry.l Demo_EHZ ; $18
zoneTableEntry.l Demo_EHZ ; $19
zoneTableEntry.l Demo_EHZ ; $1A
zoneTableEntry.l Demo_EHZ ; $1B
zoneTableEntry.l Demo_EHZ ; $1C
zoneTableEntry.l Demo_EHZ ; $1D
zoneTableEntry.l Demo_EHZ ; $1E
zoneTableEntry.l Demo_EHZ ; $1F
zoneTableEntry.l Demo_EHZ ; $20
Extending the Collision index
You would want solidity in your new zones, wouldn't you? Here we will extend the solidity list so that our extra levels can have solid ground for that blue hedgehog to walk on.
Well. We will fit, first, the collision procedure. This way, we can merge both tables into only one.
Find:
LoadCollisionIndexes:
moveq #0,d0
move.b (Current_Zone).w,d0
lsl.w #2,d0
move.l #Primary_Collision,(Collision_addr).w
move.w d0,-(sp)
movea.l Off_ColP(pc,d0.w),a0
lea (Primary_Collision).w,a1
bsr.w KosDec
move.w (sp)+,d0
movea.l Off_ColS(pc,d0.w),a0
lea (Secondary_Collision).w,a1
bra.w KosDec
Now, replace it with this:
LoadCollisionIndexes:
moveq #0,d0
move.b (Current_Zone).w,d0
lsl.w #3,d0 ;change to lsl.w #3,d0 to make the offset 8 instead of 4
move.l #Primary_Collision,(Collision_addr).w
move.w d0,-(sp) ;without this line, CPZ and ARZ solidity will be a little wonky
movea.l CollisionData(pc,d0.w),a0
lea (Primary_Collision).w,a1
bsr.w KosDec
move.w (sp)+,d0 ;without this line, CPZ and ARZ solidity will be a little wonky
movea.l CollisionData+4(pc,d0.w),a0
lea (Secondary_Collision).w,a1
bsr.w KosDec
I saw no point in leaving the old indexes as dummies here, since that just eats up rom space so I just went to deleting them in the merge.
Change:
; ---------------------------------------------------------------------------
; Pointers to primary collision indexes
; Contains an array of pointers to the primary collision index data for each
; level. 1 pointer for each level, pointing the primary collision index.
; ---------------------------------------------------------------------------
Off_ColP: zoneOrderedTable 4,1
zoneTableEntry.l ColP_EHZHTZ
zoneTableEntry.l Off_Level ; 1
zoneTableEntry.l ColP_MTZ ; 2
zoneTableEntry.l Off_Level ; 3
zoneTableEntry.l ColP_MTZ ; 4
zoneTableEntry.l ColP_MTZ ; 5
zoneTableEntry.l ColP_WFZSCZ ; 6
zoneTableEntry.l ColP_EHZHTZ ; 7
zoneTableEntry.l ColP_OOZ ; 8
zoneTableEntry.l Off_Level ; 9
zoneTableEntry.l ColP_OOZ ; 10
zoneTableEntry.l ColP_MCZ ; 11
zoneTableEntry.l ColP_CNZ ; 12
zoneTableEntry.l ColP_CPZDEZ ; 13
zoneTableEntry.l ColP_CPZDEZ ; 14
zoneTableEntry.l ColP_ARZ ; 15
zoneTableEntry.l ColP_WFZSCZ ; 16
zoneTableEnd
; ---------------------------------------------------------------------------
; Pointers to secondary collision indexes
; Contains an array of pointers to the secondary collision index data for
; each level. 1 pointer for each level, pointing the secondary collision
; index.
; ---------------------------------------------------------------------------
Off_ColS: zoneOrderedTable 4,1
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l Off_Level ; 1
zoneTableEntry.l ColP_MTZ ; 2
zoneTableEntry.l Off_Level ; 3
zoneTableEntry.l ColP_MTZ ; 4
zoneTableEntry.l ColP_MTZ ; 5
zoneTableEntry.l ColS_WFZSCZ ; 6
zoneTableEntry.l ColS_EHZHTZ ; 7
zoneTableEntry.l ColP_OOZ ; 8
zoneTableEntry.l Off_Level ; 9
zoneTableEntry.l ColP_OOZ ; 10
zoneTableEntry.l ColP_MCZ ; 11
zoneTableEntry.l ColS_CNZ ; 12
zoneTableEntry.l ColS_CPZDEZ ; 13
zoneTableEntry.l ColS_CPZDEZ ; 14
zoneTableEntry.l ColS_ARZ ; 15
zoneTableEntry.l ColS_WFZSCZ ; 16
zoneTableEnd
To:
CollisionData: zoneOrderedTable 4,2
zoneTableEntry.l ColP_EHZHTZ ;00
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;01
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;02
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;03
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_MTZ ;04
zoneTableEntry.l ColP_MTZ
zoneTableEntry.l ColP_MTZ ;05
zoneTableEntry.l ColP_MTZ
zoneTableEntry.l ColP_WFZSCZ ;06
zoneTableEntry.l ColS_WFZSCZ
zoneTableEntry.l ColP_EHZHTZ ;07
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;08
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;09
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_OOZ ;0A
zoneTableEntry.l ColP_OOZ
zoneTableEntry.l ColP_MCZ ;0B
zoneTableEntry.l ColP_MCZ
zoneTableEntry.l ColP_CNZ ;0C
zoneTableEntry.l ColS_CNZ
zoneTableEntry.l ColP_CPZDEZ ;0D
zoneTableEntry.l ColS_CPZDEZ
zoneTableEntry.l ColP_CPZDEZ ;0E
zoneTableEntry.l ColS_CPZDEZ
zoneTableEntry.l ColP_ARZ ;0F
zoneTableEntry.l ColS_ARZ
zoneTableEntry.l ColP_WFZSCZ ;10
zoneTableEntry.l ColS_WFZSCZ
zoneTableEntry.l ColP_EHZHTZ ;11
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;12
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;13
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;14
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;15
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;16
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;17
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;18
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;19
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;1A
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;1B
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;1C
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;1D
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;1E
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;1F
zoneTableEntry.l ColS_EHZHTZ
zoneTableEntry.l ColP_EHZHTZ ;20
zoneTableEntry.l ColS_EHZHTZ
zoneTableEnd
Extending Rings Index
Instead of doing the word-offset table, we will make a dynamic call routine, like collisions. Of course, we won´t work with compressed ring placement.
We find, initially:
; loc_172A4:
RingsManager_Setup:
clearRAM Ring_Positions,(Ring_Positions_End-Ring_Positions)
; d0 = 0
lea (Ring_consumption_table).w,a1
move.w #bytesToLcnt(Ring_consumption_table_End-Ring_consumption_table-$40),d1 ; coding error, that '-$40' shouldn't be there
- move.l d0,(a1)+ ; only half of Ring_consumption_table is cleared
dbf d1,-
moveq #0,d5
moveq #0,d0
move.w (Current_ZoneAndAct).w,d0
ror.b #1,d0
lsr.w #6,d0
lea (Off_Rings).l,a1
move.w (a1,d0.w),d0
lea (a1,d0.w),a1
lea (Ring_Positions+6).w,a2 ; first ring is left blank
; loc_172E0:
RingsMgr_NextRowOrCol:
And change it to:
; loc_172A4:
RingsManager_Setup:
jmp CarregarAneis
rts
; loc_172E0:
RingsMgr_NextRowOrCol:
Now, we put the following routine at a good place:
align $40
CarregarAneis:
clearRAM Ring_Positions,$600
; d0 = 0
lea (Ring_consumption_table).w,a1
move.w #bytesToLcnt($40),d1
- move.l d0,(a1)+
dbf d1,-
moveq #0,d5
moveq #0,d0
; convert zone/act data for an useable format, sequential
move.w (Current_ZoneAndAct).w,d0
ror.b #1,d0
lsr.w #6,d0 ;this yields an 8-byte jump.
add.l d0,d0
movea.l RingData(pc,d0.l),a1 ; this allows ring data anywhere in the ROM.
lea (Ring_Positions).w,a2
jmp RingsMgr_NextRowOrCol
rts
RingData: zoneOrderedTable 4,2
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;00
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;01
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;02
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;03
zoneTableEntry.l Rings_MTZ_1
zoneTableEntry.l Rings_MTZ_2 ;04
zoneTableEntry.l Rings_MTZ_3
zoneTableEntry.l Rings_MTZ_3 ;05
zoneTableEntry.l Rings_WFZ_1
zoneTableEntry.l Rings_WFZ_1 ;06
zoneTableEntry.l Rings_HTZ_1
zoneTableEntry.l Rings_HTZ_2 ;07
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;08
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;09
zoneTableEntry.l Rings_OOZ_1
zoneTableEntry.l Rings_OOZ_2 ;0A
zoneTableEntry.l Rings_MCZ_1
zoneTableEntry.l Rings_MCZ_2 ;0B
zoneTableEntry.l Rings_CNZ_1
zoneTableEntry.l Rings_CNZ_2 ;0C
zoneTableEntry.l Rings_CPZ_1
zoneTableEntry.l Rings_CPZ_2 ;0D
zoneTableEntry.l Rings_DEZ_1
zoneTableEntry.l Rings_DEZ_1 ;0E
zoneTableEntry.l Rings_ARZ_1
zoneTableEntry.l Rings_ARZ_2 ;0F
zoneTableEntry.l Rings_SCZ_1
zoneTableEntry.l Rings_SCZ_1 ;10
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;11
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;12
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;13
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;14
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;15
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;16
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;17
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;18
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;19
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;1A
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;1B
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;1C
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;1D
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;1E
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;1F
zoneTableEntry.l Rings_EHZ_1
zoneTableEntry.l Rings_EHZ_2 ;20
zoneTableEnd
align $80
You can put this before PalPointers, if you relocated that table as described before.
This routine directly calls the desired ring placement, with no need of attaching them to the table, like the word-offset index does.
Extending the object index
We will make a similar extension for objects. Look for:
; loc_17AB8
ObjectsManager_Init:
addq.b #2,(Obj_placement_routine).w
move.w (Current_ZoneAndAct).w,d0 ; If level == $0F01 (ARZ 2)...
ror.b #1,d0 ; then this yields $0F80...
lsr.w #6,d0 ; and this yields $003E.
lea (Off_Objects).l,a0 ; Next, we load the first pointer in the object layout list pointer index,
movea.l a0,a1 ; then copy it for quicker use later.
adda.w (a0,d0.w),a0 ; (Point1 * 2) + $003E
tst.w (Two_player_mode).w ; skip if not in 2-player vs mode
beq.s +
cmpi.b #casino_night_zone,(Current_Zone).w ; skip if not Casino Night Zone
bne.s +
lea (Objects_CNZ1_2P).l,a0 ; CNZ 1 2-player object layout
tst.b (Current_Act).w ; skip if not past act 1
beq.s +
lea (Objects_CNZ2_2P).l,a0 ; CNZ 2 2-player object layout
+
And change that to:
; loc_17AB8
ObjectsManager_Init:
jmp CarregarObjetos
rts
loc_17AF0:
+
Now, put this routine into a good place. If you relocated PalPointers like described before, put this before PalPointers:
align $40
CarregarObjetos:
addq.b #2,(Obj_placement_routine).w
moveq #0,d0
move.w (Current_ZoneAndAct).w,d0 ; If level == $0F (ARZ)...
ror.b #1,d0
lsr.w #6,d0
add.l d0,d0
movea.l ObjPosData(pc,d0.l),a0
movea.l a0,a1
tst.w (Two_player_mode).w ; skip if not in 2-player vs mode
beq.s +
cmpi.b #$C,(Current_Zone).w ; skip if not Casino Night Zone
bne.s +
lea (Objects_CNZ1_2P).l,a0 ; CNZ 1 2-player object layout
tst.b (Current_Act).w ; skip if not past act 1
beq.s +
lea (Objects_CNZ2_2P).l,a0 ; CNZ 2 2-player object layout
+:
jmp loc_17AF0
rts
ObjPosData: zoneOrderedTable 4,2
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;00
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;01
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;02
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;03
zoneTableEntry.l Objects_MTZ_1
zoneTableEntry.l Objects_MTZ_2 ;04
zoneTableEntry.l Objects_MTZ_3
zoneTableEntry.l Objects_MTZ_3 ;05
zoneTableEntry.l Objects_WFZ_1
zoneTableEntry.l Objects_WFZ_1 ;06
zoneTableEntry.l Objects_HTZ_1
zoneTableEntry.l Objects_HTZ_2 ;07
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;08
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;09
zoneTableEntry.l Objects_OOZ_1
zoneTableEntry.l Objects_OOZ_2 ;0A
zoneTableEntry.l Objects_MCZ_1
zoneTableEntry.l Objects_MCZ_2 ;0B
zoneTableEntry.l Objects_CNZ_1
zoneTableEntry.l Objects_CNZ_2 ;0C
zoneTableEntry.l Objects_CPZ_1
zoneTableEntry.l Objects_CPZ_2 ;0D
zoneTableEntry.l Objects_DEZ_1
zoneTableEntry.l Objects_DEZ_1 ;0E
zoneTableEntry.l Objects_ARZ_1
zoneTableEntry.l Objects_ARZ_2 ;0F
zoneTableEntry.l Objects_SCZ_1
zoneTableEntry.l Objects_SCZ_1 ;10
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;11
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;12
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;13
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;14
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;15
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;16
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;17
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;18
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;19
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;1A
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;1B
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;1C
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;1D
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;1E
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;1F
zoneTableEntry.l Objects_EHZ_1
zoneTableEntry.l Objects_EHZ_2 ;20
zoneTableEnd
align $80
Extending tiles and patterns index
Find:
;----------------------------------------------------------------------------------
; EHZ 16x16 block mappings (Kosinski compression) ; was: (Kozinski compression)
BM16_EHZ: BINCLUDE "mappings/16x16/EHZ.bin"
;-----------------------------------------------------------------------------------
; EHZ/HTZ main level patterns (Kosinski compression)
; ArtKoz_95C24:
ArtKos_EHZ: BINCLUDE "art/kosinski/EHZ_HTZ.bin"
;-----------------------------------------------------------------------------------
; HTZ 16x16 block mappings (Kosinski compression)
BM16_HTZ: BINCLUDE "mappings/16x16/HTZ.bin"
;-----------------------------------------------------------------------------------
; HTZ pattern suppliment to EHZ level patterns (Kosinski compression)
; ArtKoz_98AB4:
ArtKos_HTZ: BINCLUDE "art/kosinski/HTZ_Supp.bin"
;-----------------------------------------------------------------------------------
; EHZ/HTZ 128x128 block mappings (Kosinski compression)
BM128_EHZ: BINCLUDE "mappings/128x128/EHZ_HTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ 16x16 block mappings (Kosinski compression)
BM16_MTZ: BINCLUDE "mappings/16x16/MTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_MTZ: BINCLUDE "art/kosinski/MTZ.bin"
;-----------------------------------------------------------------------------------
; MTZ 128x128 block mappings (Kosinski compression)
BM128_MTZ: BINCLUDE "mappings/128x128/MTZ.bin"
;-----------------------------------------------------------------------------------
; OOZ 16x16 block mappings (Kosinski compression)
BM16_OOZ: BINCLUDE "mappings/16x16/OOZ.bin"
;-----------------------------------------------------------------------------------
; OOZ main level patterns (Kosinski compression)
; ArtKoz_A4204:
ArtKos_OOZ: BINCLUDE "art/kosinski/OOZ.bin"
;-----------------------------------------------------------------------------------
; OOZ 128x128 block mappings (Kosinski compression)
BM128_OOZ: BINCLUDE "mappings/128x128/OOZ.bin"
;-----------------------------------------------------------------------------------
; MCZ 16x16 block mappings (Kosinski compression)
BM16_MCZ: BINCLUDE "mappings/16x16/MCZ.bin"
;-----------------------------------------------------------------------------------
; MCZ main level patterns (Kosinski compression)
; ArtKoz_A9D74:
ArtKos_MCZ: BINCLUDE "art/kosinski/MCZ.bin"
;-----------------------------------------------------------------------------------
; MCZ 128x128 block mappings (Kosinski compression)
BM128_MCZ: BINCLUDE "mappings/128x128/MCZ.bin"
;-----------------------------------------------------------------------------------
; CNZ 16x16 block mappings (Kosinski compression)
BM16_CNZ: BINCLUDE "mappings/16x16/CNZ.bin"
;-----------------------------------------------------------------------------------
; CNZ main level patterns (Kosinski compression)
; ArtKoz_B0894:
ArtKos_CNZ: BINCLUDE "art/kosinski/CNZ.bin"
;-----------------------------------------------------------------------------------
; CNZ 128x128 block mappings (Kosinski compression)
BM128_CNZ: BINCLUDE "mappings/128x128/CNZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ 16x16 block mappings (Kosinski compression)
BM16_CPZ: BINCLUDE "mappings/16x16/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ main level patterns (Kosinski compression)
; ArtKoz_B6174:
ArtKos_CPZ: BINCLUDE "art/kosinski/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; CPZ/DEZ 128x128 block mappings (Kosinski compression)
BM128_CPZ: BINCLUDE "mappings/128x128/CPZ_DEZ.bin"
;-----------------------------------------------------------------------------------
; ARZ 16x16 block mappings (Kosinski compression)
BM16_ARZ: BINCLUDE "mappings/16x16/ARZ.bin"
;-----------------------------------------------------------------------------------
; ARZ main level patterns (Kosinski compression)
; ArtKoz_BCC24:
ArtKos_ARZ: BINCLUDE "art/kosinski/ARZ.bin"
;-----------------------------------------------------------------------------------
; ARZ 128x128 block mappings (Kosinski compression)
BM128_ARZ: BINCLUDE "mappings/128x128/ARZ.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ 16x16 block mappings (Kosinski compression)
BM16_WFZ: BINCLUDE "mappings/16x16/WFZ_SCZ.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ main level patterns (Kosinski compression)
; ArtKoz_C5004:
ArtKos_SCZ: BINCLUDE "art/kosinski/WFZ_SCZ.bin"
;-----------------------------------------------------------------------------------
; WFZ pattern suppliment to SCZ tiles (Kosinski compression)
; ArtKoz_C7EC4:
ArtKos_WFZ: BINCLUDE "art/kosinski/WFZ_Supp.bin"
;-----------------------------------------------------------------------------------
; WFZ/SCZ 128x128 block mappings (Kosinski compression)
BM128_WFZ: BINCLUDE "mappings/128x128/WFZ_SCZ.bin"
then add this to the end:
;-----------------------------------------------------------------------------------
; Lev_11 16x16 block mappings (Kosinski compression)
BM16_Lev_11: BINCLUDE "mappings/16x16/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_11 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_11: BINCLUDE "art/kosinski/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_11 128x128 block mappings (Kosinski compression)
BM128_Lev_11: BINCLUDE "mappings/128x128/Lev_11.bin"
;-----------------------------------------------------------------------------------
; Lev_12 16x16 block mappings (Kosinski compression)
BM16_Lev_12: BINCLUDE "mappings/16x16/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_12 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_12: BINCLUDE "art/kosinski/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_12 128x128 block mappings (Kosinski compression)
BM128_Lev_12: BINCLUDE "mappings/128x128/Lev_12.bin"
;-----------------------------------------------------------------------------------
; Lev_13 16x16 block mappings (Kosinski compression)
BM16_Lev_13: BINCLUDE "mappings/16x16/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_13 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_13: BINCLUDE "art/kosinski/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_13 128x128 block mappings (Kosinski compression)
BM128_Lev_13: BINCLUDE "mappings/128x128/Lev_13.bin"
;-----------------------------------------------------------------------------------
; Lev_14 16x16 block mappings (Kosinski compression)
BM16_Lev_14: BINCLUDE "mappings/16x16/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_14 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_14: BINCLUDE "art/kosinski/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_14 128x128 block mappings (Kosinski compression)
BM128_Lev_14: BINCLUDE "mappings/128x128/Lev_14.bin"
;-----------------------------------------------------------------------------------
; Lev_15 16x16 block mappings (Kosinski compression)
BM16_Lev_15: BINCLUDE "mappings/16x16/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_15 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_15: BINCLUDE "art/kosinski/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_15 128x128 block mappings (Kosinski compression)
BM128_Lev_15: BINCLUDE "mappings/128x128/Lev_15.bin"
;-----------------------------------------------------------------------------------
; Lev_16 16x16 block mappings (Kosinski compression)
BM16_Lev_16: BINCLUDE "mappings/16x16/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_16 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_16: BINCLUDE "art/kosinski/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_16 128x128 block mappings (Kosinski compression)
BM128_Lev_16: BINCLUDE "mappings/128x128/Lev_16.bin"
;-----------------------------------------------------------------------------------
; Lev_17 16x16 block mappings (Kosinski compression)
BM16_Lev_17: BINCLUDE "mappings/16x16/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_17 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_17: BINCLUDE "art/kosinski/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_17 128x128 block mappings (Kosinski compression)
BM128_Lev_17: BINCLUDE "mappings/128x128/Lev_17.bin"
;-----------------------------------------------------------------------------------
; Lev_18 16x16 block mappings (Kosinski compression)
BM16_Lev_18: BINCLUDE "mappings/16x16/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_18 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_18: BINCLUDE "art/kosinski/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_18 128x128 block mappings (Kosinski compression)
BM128_Lev_18: BINCLUDE "mappings/128x128/Lev_18.bin"
;-----------------------------------------------------------------------------------
; Lev_19 16x16 block mappings (Kosinski compression)
BM16_Lev_19: BINCLUDE "mappings/16x16/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_19 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_19: BINCLUDE "art/kosinski/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_19 128x128 block mappings (Kosinski compression)
BM128_Lev_19: BINCLUDE "mappings/128x128/Lev_19.bin"
;-----------------------------------------------------------------------------------
; Lev_1A 16x16 block mappings (Kosinski compression)
BM16_Lev_1A: BINCLUDE "mappings/16x16/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1A main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1A: BINCLUDE "art/kosinski/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1A 128x128 block mappings (Kosinski compression)
BM128_Lev_1A: BINCLUDE "mappings/128x128/Lev_1A.bin"
;-----------------------------------------------------------------------------------
; Lev_1B 16x16 block mappings (Kosinski compression)
BM16_Lev_1B: BINCLUDE "mappings/16x16/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1B main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1B: BINCLUDE "art/kosinski/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1B 128x128 block mappings (Kosinski compression)
BM128_Lev_1B: BINCLUDE "mappings/128x128/Lev_1B.bin"
;-----------------------------------------------------------------------------------
; Lev_1C 16x16 block mappings (Kosinski compression)
BM16_Lev_1C: BINCLUDE "mappings/16x16/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1C main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1C: BINCLUDE "art/kosinski/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1C 128x128 block mappings (Kosinski compression)
BM128_Lev_1C: BINCLUDE "mappings/128x128/Lev_1C.bin"
;-----------------------------------------------------------------------------------
; Lev_1D 16x16 block mappings (Kosinski compression)
BM16_Lev_1D: BINCLUDE "mappings/16x16/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1D main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1D: BINCLUDE "art/kosinski/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1D 128x128 block mappings (Kosinski compression)
BM128_Lev_1D: BINCLUDE "mappings/128x128/Lev_1D.bin"
;-----------------------------------------------------------------------------------
; Lev_1E 16x16 block mappings (Kosinski compression)
BM16_Lev_1E: BINCLUDE "mappings/16x16/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1E main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1E: BINCLUDE "art/kosinski/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1E 128x128 block mappings (Kosinski compression)
BM128_Lev_1E: BINCLUDE "mappings/128x128/Lev_1E.bin"
;-----------------------------------------------------------------------------------
; Lev_1F 16x16 block mappings (Kosinski compression)
BM16_Lev_1F: BINCLUDE "mappings/16x16/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_1F main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_1F: BINCLUDE "art/kosinski/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_1F 128x128 block mappings (Kosinski compression)
BM128_Lev_1F: BINCLUDE "mappings/128x128/Lev_1F.bin"
;-----------------------------------------------------------------------------------
; Lev_20 16x16 block mappings (Kosinski compression)
BM16_Lev_20: BINCLUDE "mappings/16x16/Lev_20.bin"
;-----------------------------------------------------------------------------------
; Lev_20 main level patterns (Kosinski compression)
; ArtKoz_9DB64:
ArtKos_Lev_20: BINCLUDE "art/kosinski/Lev_20.bin"
;-----------------------------------------------------------------------------------
; Lev_20 128x128 block mappings (Kosinski compression)
BM128_Lev_20: BINCLUDE "mappings/128x128/Lev_20.bin"
Then add optional pattern supplements to suit your hack's needs.
Now find:
LevelArtPointers:
levartptrs PLCID_Ehz1, PLCID_Ehz2, PalID_EHZ, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 0 ; EHZ ; EMERALD HILL ZONE
levartptrs PLCID_Miles1up, PLCID_MilesLife, PalID_EHZ2, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 1 ; LEV1 ; LEVEL 1 (UNUSED)
levartptrs PLCID_Tails1up, PLCID_TailsLife, PalID_WZ, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 2 ; LEV2 ; LEVEL 2 (UNUSED)
levartptrs PLCID_Unused1, PLCID_Unused2, PalID_EHZ3, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 3 ; LEV3 ; LEVEL 3 (UNUSED)
levartptrs PLCID_Mtz1, PLCID_Mtz2, PalID_MTZ, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ; 4 ; MTZ ; METROPOLIS ZONE ACTS 1 & 2
levartptrs PLCID_Mtz1, PLCID_Mtz2, PalID_MTZ, ArtKos_MTZ, BM16_MTZ, BM128_MTZ ; 5 ; MTZ3 ; METROPOLIS ZONE ACT 3
levartptrs PLCID_Wfz1, PLCID_Wfz2, PalID_WFZ, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; 6 ; WFZ ; WING FORTRESS ZONE
levartptrs PLCID_Htz1, PLCID_Htz2, PalID_HTZ, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 7 ; HTZ ; HILL TOP ZONE
levartptrs PLCID_Hpz1, PLCID_Hpz2, PalID_HPZ, BM16_OOZ, BM16_OOZ, BM16_OOZ ; 8 ; HPZ ; HIDDEN PALACE ZONE (UNUSED)
levartptrs PLCID_Unused3, PLCID_Unused4, PalID_EHZ4, ArtKos_EHZ, BM16_EHZ, BM128_EHZ ; 9 ; LEV9 ; LEVEL 9 (UNUSED)
levartptrs PLCID_Ooz1, PLCID_Ooz2, PalID_OOZ, ArtKos_OOZ, BM16_OOZ, BM128_OOZ ; $A ; OOZ ; OIL OCEAN ZONE
levartptrs PLCID_Mcz1, PLCID_Mcz2, PalID_MCZ, ArtKos_MCZ, BM16_MCZ, BM128_MCZ ; $B ; MCZ ; MYSTIC CAVE ZONE
levartptrs PLCID_Cnz1, PLCID_Cnz2, PalID_CNZ, ArtKos_CNZ, BM16_CNZ, BM128_CNZ ; $C ; CNZ ; CASINO NIGHT ZONE
levartptrs PLCID_Cpz1, PLCID_Cpz2, PalID_CPZ, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ; $D ; CPZ ; CHEMICAL PLANT ZONE
levartptrs PLCID_Dez1, PLCID_Dez2, PalID_DEZ, ArtKos_CPZ, BM16_CPZ, BM128_CPZ ; $E ; DEZ ; DEATH EGG ZONE
levartptrs PLCID_Arz1, PLCID_Arz2, PalID_ARZ, ArtKos_ARZ, BM16_ARZ, BM128_ARZ ; $F ; ARZ ; AQUATIC RUIN ZONE
levartptrs PLCID_Scz1, PLCID_Scz2, PalID_SCZ, ArtKos_SCZ, BM16_WFZ, BM128_WFZ ; $10 ; SCZ ; SKY CHASE ZONE
then add this to the end:
levartptrs $26, $27, $15, ArtKos_Lev_11, BM16_Lev_11, BM128_Lev_11 ; 0 ; Lev_11 ; LEV_11 ZONE
levartptrs $28, $29, $16, ArtKos_Lev_12, BM16_Lev_12, BM128_Lev_12 ; 0 ; Lev_12 ; LEV_12 ZONE
levartptrs $2A, $2B, $17, ArtKos_Lev_13, BM16_Lev_13, BM128_Lev_13 ; 0 ; Lev_13 ; LEV_13 ZONE
levartptrs $2C, $2D, $18, ArtKos_Lev_14, BM16_Lev_14, BM128_Lev_14 ; 0 ; Lev_14 ; LEV_14 ZONE
levartptrs $2E, $2F, $19, ArtKos_Lev_15, BM16_Lev_15, BM128_Lev_15 ; 0 ; Lev_15 ; LEV_15 ZONE
levartptrs $30, $31, $1A, ArtKos_Lev_16, BM16_Lev_16, BM128_Lev_16 ; 0 ; Lev_16 ; LEV_16 ZONE
levartptrs $32, $33, $1B, ArtKos_Lev_17, BM16_Lev_17, BM128_Lev_17 ; 0 ; Lev_17 ; LEV_17 ZONE
levartptrs $34, $35, $1C, ArtKos_Lev_18, BM16_Lev_18, BM128_Lev_18 ; 0 ; Lev_18 ; LEV_18 ZONE
levartptrs $36, $37, $1D, ArtKos_Lev_19, BM16_Lev_19, BM128_Lev_19 ; 0 ; Lev_19 ; LEV_19 ZONE
levartptrs $38, $39, $1E, ArtKos_Lev_1A, BM16_Lev_1A, BM128_Lev_1A ; 0 ; Lev_1A ; LEV_1A ZONE
levartptrs $3A, $3B, $1F, ArtKos_Lev_1B, BM16_Lev_1B, BM128_Lev_1B ; 0 ; Lev_1B ; LEV_1B ZONE
levartptrs $3C, $3D, $20, ArtKos_Lev_1C, BM16_Lev_1C, BM128_Lev_1C ; 0 ; Lev_1C ; LEV_1C ZONE
levartptrs $3E, $3F, $21, ArtKos_Lev_1D, BM16_Lev_1D, BM128_Lev_1D ; 0 ; Lev_1D ; LEV_1D ZONE
levartptrs $40, $41, $22, ArtKos_Lev_1E, BM16_Lev_1E, BM128_Lev_1E ; 0 ; Lev_1E ; LEV_1E ZONE
levartptrs $42, $43, $23, ArtKos_Lev_1F, BM16_Lev_1F, BM128_Lev_1F ; 0 ; Lev_1F ; LEV_1F ZONE
levartptrs $44, $45, $24, ArtKos_Lev_20, BM16_Lev_20, BM128_Lev_20 ; 0 ; Lev_20 ; LEV_20 ZONE
After this is added, you possibly need to add loading queries to the texture load index. Create the .bin files and you're finished.
Extending level and tile layout indexes
Now you need to extend the layout index and we're done extending most level essentials.
Find:
Off_Level: zoneOrderedOffsetTable 2,2
zoneOffsetTableEntry.w Level_EHZ1
zoneOffsetTableEntry.w Level_EHZ2 ; 1
zoneOffsetTableEntry.w Level_EHZ1 ; 2
zoneOffsetTableEntry.w Level_EHZ1 ; 3
zoneOffsetTableEntry.w Level_EHZ1 ; 4
zoneOffsetTableEntry.w Level_EHZ1 ; 5
zoneOffsetTableEntry.w Level_EHZ1 ; 6
zoneOffsetTableEntry.w Level_EHZ1 ; 7
zoneOffsetTableEntry.w Level_MTZ1 ; 8
zoneOffsetTableEntry.w Level_MTZ2 ; 9
zoneOffsetTableEntry.w Level_MTZ3 ; 10
zoneOffsetTableEntry.w Level_MTZ3 ; 11
zoneOffsetTableEntry.w Level_WFZ ; 12
zoneOffsetTableEntry.w Level_WFZ ; 13
zoneOffsetTableEntry.w Level_HTZ1 ; 14
zoneOffsetTableEntry.w Level_HTZ2 ; 15
zoneOffsetTableEntry.w Level_OOZ1 ; 16
zoneOffsetTableEntry.w Level_OOZ1 ; 17
zoneOffsetTableEntry.w Level_EHZ1 ; 18
zoneOffsetTableEntry.w Level_EHZ1 ; 19
zoneOffsetTableEntry.w Level_OOZ1 ; 20
zoneOffsetTableEntry.w Level_OOZ2 ; 21
zoneOffsetTableEntry.w Level_MCZ1 ; 22
zoneOffsetTableEntry.w Level_MCZ2 ; 23
zoneOffsetTableEntry.w Level_CNZ1 ; 24
zoneOffsetTableEntry.w Level_CNZ2 ; 25
zoneOffsetTableEntry.w Level_CPZ1 ; 26
zoneOffsetTableEntry.w Level_CPZ2 ; 27
zoneOffsetTableEntry.w Level_DEZ ; 28
zoneOffsetTableEntry.w Level_DEZ ; 29
zoneOffsetTableEntry.w Level_ARZ1 ; 30
zoneOffsetTableEntry.w Level_ARZ2 ; 31
zoneOffsetTableEntry.w Level_SCZ ; 32
zoneOffsetTableEntry.w Level_SCZ ; 33
and add this to the end:
zoneOffsetTableEntry.w Level_Lev11_1
zoneOffsetTableEntry.w Level_Lev11_2
zoneOffsetTableEntry.w Level_Lev12_1
zoneOffsetTableEntry.w Level_Lev12_2
zoneOffsetTableEntry.w Level_Lev13_1
zoneOffsetTableEntry.w Level_Lev13_2
zoneOffsetTableEntry.w Level_Lev14_1
zoneOffsetTableEntry.w Level_Lev14_2
zoneOffsetTableEntry.w Level_Lev15_1
zoneOffsetTableEntry.w Level_Lev15_2
zoneOffsetTableEntry.w Level_Lev16_1
zoneOffsetTableEntry.w Level_Lev16_2
zoneOffsetTableEntry.w Level_Lev17_1
zoneOffsetTableEntry.w Level_Lev17_2
zoneOffsetTableEntry.w Level_Lev18_1
zoneOffsetTableEntry.w Level_Lev18_2
zoneOffsetTableEntry.w Level_Lev19_1
zoneOffsetTableEntry.w Level_Lev19_2
zoneOffsetTableEntry.w Level_Lev1A_1
zoneOffsetTableEntry.w Level_Lev1A_2
zoneOffsetTableEntry.w Level_Lev1B_1
zoneOffsetTableEntry.w Level_Lev1B_2
zoneOffsetTableEntry.w Level_Lev1C_1
zoneOffsetTableEntry.w Level_Lev1C_2
zoneOffsetTableEntry.w Level_Lev1D_1
zoneOffsetTableEntry.w Level_Lev1D_2
zoneOffsetTableEntry.w Level_Lev1E_1
zoneOffsetTableEntry.w Level_Lev1E_2
zoneOffsetTableEntry.w Level_Lev1F_1
zoneOffsetTableEntry.w Level_Lev1F_2
zoneOffsetTableEntry.w Level_Lev20_1
zoneOffsetTableEntry.w Level_Lev20_2
Then find:
;---------------------------------------------------------------------------------------
; EHZ act 1 level layout (Kosinski compression)
Level_EHZ1: BINCLUDE "level/layout/EHZ_1.bin"
;---------------------------------------------------------------------------------------
; EHZ act 2 level layout (Kosinski compression)
Level_EHZ2: BINCLUDE "level/layout/EHZ_2.bin"
;---------------------------------------------------------------------------------------
; MTZ act 1 level layout (Kosinski compression)
Level_MTZ1: BINCLUDE "level/layout/MTZ_1.bin"
;---------------------------------------------------------------------------------------
; MTZ act 2 level layout (Kosinski compression)
Level_MTZ2: BINCLUDE "level/layout/MTZ_2.bin"
;---------------------------------------------------------------------------------------
; MTZ act 3 level layout (Kosinski compression)
Level_MTZ3: BINCLUDE "level/layout/MTZ_3.bin"
;---------------------------------------------------------------------------------------
; WFZ level layout (Kosinski compression)
Level_WFZ: BINCLUDE "level/layout/WFZ.bin"
;---------------------------------------------------------------------------------------
; HTZ act 1 level layout (Kosinski compression)
Level_HTZ1: BINCLUDE "level/layout/HTZ_1.bin"
;---------------------------------------------------------------------------------------
; HTZ act 2 level layout (Kosinski compression)
Level_HTZ2: BINCLUDE "level/layout/HTZ_2.bin"
;---------------------------------------------------------------------------------------
; OOZ act 1 level layout (Kosinski compression)
Level_OOZ1: BINCLUDE "level/layout/OOZ_1.bin"
;---------------------------------------------------------------------------------------
; OOZ act 2 level layout (Kosinski compression)
Level_OOZ2: BINCLUDE "level/layout/OOZ_2.bin"
;---------------------------------------------------------------------------------------
; MCZ act 1 level layout (Kosinski compression)
Level_MCZ1: BINCLUDE "level/layout/MCZ_1.bin"
;---------------------------------------------------------------------------------------
; MCZ act 2 level layout (Kosinski compression)
Level_MCZ2: BINCLUDE "level/layout/MCZ_2.bin"
;---------------------------------------------------------------------------------------
; CNZ act 1 level layout (Kosinski compression)
Level_CNZ1: BINCLUDE "level/layout/CNZ_1.bin"
;---------------------------------------------------------------------------------------
; CNZ act 2 level layout (Kosinski compression)
Level_CNZ2: BINCLUDE "level/layout/CNZ_2.bin"
;---------------------------------------------------------------------------------------
; CPZ act 1 level layout (Kosinski compression)
Level_CPZ1: BINCLUDE "level/layout/CPZ_1.bin"
;---------------------------------------------------------------------------------------
; CPZ act 2 level layout (Kosinski compression)
Level_CPZ2: BINCLUDE "level/layout/CPZ_2.bin"
;---------------------------------------------------------------------------------------
; DEZ level layout (Kosinski compression)
Level_DEZ: BINCLUDE "level/layout/DEZ.bin"
;---------------------------------------------------------------------------------------
; ARZ act 1 level layout (Kosinski compression)
Level_ARZ1: BINCLUDE "level/layout/ARZ_1.bin"
;---------------------------------------------------------------------------------------
; ARZ act 2 level layout (Kosinski compression)
Level_ARZ2: BINCLUDE "level/layout/ARZ_2.bin"
;---------------------------------------------------------------------------------------
; SCZ level layout (Kosinski compression)
Level_SCZ: BINCLUDE "level/layout/SCZ.bin"
then add this at the end:
;---------------------------------------------------------------------------------------
; Lev11 act 1 level layout (Kosinski compression)
Level_Lev11_1: BINCLUDE "level/layout/Lev11_1.bin"
;---------------------------------------------------------------------------------------
; Lev11 act 2 level layout (Kosinski compression)
Level_Lev11_2: BINCLUDE "level/layout/Lev11_2.bin"
;---------------------------------------------------------------------------------------
; Lev12_1 level layout (Kosinski compression)
Level_Lev12_1: BINCLUDE "level/layout/Lev12_1.bin"
;---------------------------------------------------------------------------------------
; Lev12_2 level layout (Kosinski compression)
Level_Lev12_1: BINCLUDE "level/layout/Lev12_2.bin"
;---------------------------------------------------------------------------------------
; Lev13_1 level layout (Kosinski compression)
Level_Lev13_1: BINCLUDE "level/layout/Lev13_1.bin"
;---------------------------------------------------------------------------------------
; Lev13_2 level layout (Kosinski compression)
Level_Lev13_2: BINCLUDE "level/layout/Lev13_2.bin"
;---------------------------------------------------------------------------------------
; Lev14_1 level layout (Kosinski compression)
Level_Lev14_1: BINCLUDE "level/layout/Lev14_1.bin"
;---------------------------------------------------------------------------------------
; Lev14_2 level layout (Kosinski compression)
Level_Lev14_2: BINCLUDE "level/layout/Lev14_2.bin"
;---------------------------------------------------------------------------------------
; Lev15_1 level layout (Kosinski compression)
Level_Lev15_1: BINCLUDE "level/layout/Lev15_1.bin"
;---------------------------------------------------------------------------------------
; Lev15_2 level layout (Kosinski compression)
Level_Lev15_2: BINCLUDE "level/layout/Lev15_2.bin"
;---------------------------------------------------------------------------------------
; Lev16_1 level layout (Kosinski compression)
Level_Lev16_1: BINCLUDE "level/layout/Lev16_1.bin"
;---------------------------------------------------------------------------------------
; Lev16_2 level layout (Kosinski compression)
Level_Lev16_2: BINCLUDE "level/layout/Lev16_2.bin"
;---------------------------------------------------------------------------------------
; Lev17_1 level layout (Kosinski compression)
Level_Lev17_1: BINCLUDE "level/layout/Lev17_1.bin"
;---------------------------------------------------------------------------------------
; Lev17_2 level layout (Kosinski compression)
Level_Lev17_2: BINCLUDE "level/layout/Lev17_2.bin"
;---------------------------------------------------------------------------------------
; Lev18_1 level layout (Kosinski compression)
Level_Lev18_1: BINCLUDE "level/layout/Lev18_1.bin"
;---------------------------------------------------------------------------------------
; Lev18_2 level layout (Kosinski compression)
Level_Lev18_2: BINCLUDE "level/layout/Lev18_2.bin"
;---------------------------------------------------------------------------------------
; Lev19_1 level layout (Kosinski compression)
Level_Lev19_1: BINCLUDE "level/layout/Lev19_1.bin"
;---------------------------------------------------------------------------------------
; Lev19_2 level layout (Kosinski compression)
Level_Lev19_2: BINCLUDE "level/layout/Lev19_2.bin"
;---------------------------------------------------------------------------------------
; Lev1A_1 level layout (Kosinski compression)
Level_Lev1A_1: BINCLUDE "level/layout/Lev1A_1.bin"
;---------------------------------------------------------------------------------------
; Lev1A_2 level layout (Kosinski compression)
Level_Lev1A_2: BINCLUDE "level/layout/Lev1A_2.bin"
;---------------------------------------------------------------------------------------
; Lev1B_1 level layout (Kosinski compression)
Level_Lev1B_1: BINCLUDE "level/layout/Lev1B_1.bin"
;---------------------------------------------------------------------------------------
; Lev1B_2 level layout (Kosinski compression)
Level_Lev1B_2: BINCLUDE "level/layout/Lev1B_2.bin"
;---------------------------------------------------------------------------------------
; Lev1C_1 level layout (Kosinski compression)
Level_Lev1C_1: BINCLUDE "level/layout/Lev1C_1.bin"
;---------------------------------------------------------------------------------------
; Lev1C_2 level layout (Kosinski compression)
Level_Lev1C_2: BINCLUDE "level/layout/Lev1C_2.bin"
;---------------------------------------------------------------------------------------
; Lev1D_1 level layout (Kosinski compression)
Level_Lev1D_1: BINCLUDE "level/layout/Lev1D_1.bin"
;---------------------------------------------------------------------------------------
; Lev1D_2 level layout (Kosinski compression)
Level_Lev1D_2: BINCLUDE "level/layout/Lev1D_2.bin"
;---------------------------------------------------------------------------------------
; Lev1E_1 level layout (Kosinski compression)
Level_Lev1E_1: BINCLUDE "level/layout/Lev1E_1.bin"
;---------------------------------------------------------------------------------------
; Lev1E_2 level layout (Kosinski compression)
Level_Lev1E_2: BINCLUDE "level/layout/Lev1E_2.bin"
;---------------------------------------------------------------------------------------
; Lev1F_1 level layout (Kosinski compression)
Level_Lev1F_1: BINCLUDE "level/layout/Lev1F_1.bin"
;---------------------------------------------------------------------------------------
; Lev1F_2 level layout (Kosinski compression)
Level_Lev1F_2: BINCLUDE "level/layout/Lev1F_2.bin"
;---------------------------------------------------------------------------------------
; Lev20_1 level layout (Kosinski compression)
Level_Lev20_1: BINCLUDE "level/layout/Lev20_1.bin"
;---------------------------------------------------------------------------------------
; Lev20_2 level layout (Kosinski compression)
Level_Lev20_2: BINCLUDE "level/layout/Lev20_2.bin"
Now create the .bin files.
Extending the definition of act 2 (setting up our new levels so that they can have bosses in other words)
just being able to use sign posts in your new levels can be boring after a while, so we will make those changes so that we can put custom bosses in our new levels, actually extending the sprite pointer list is not within the scope of the tutorial, though highly recommended.
find:
; sub_4BD2:
SetLevelEndType:
move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost
tst.w (Two_player_mode).w ; is it two-player competitive mode?
bne.s LevelEnd_SetSignpost ; if yes, branch
nosignpost.w emerald_hill_zone_act_2
nosignpost.w metropolis_zone_act_3
nosignpost.w wing_fortress_zone_act_1
nosignpost.w hill_top_zone_act_2
nosignpost.w oil_ocean_zone_act_2
nosignpost.s mystic_cave_zone_act_2
nosignpost.s casino_night_zone_act_2
nosignpost.s chemical_plant_zone_act_2
nosignpost.s death_egg_zone_act_1
nosignpost.s aquatic_ruin_zone_act_2
nosignpost.s sky_chase_zone_act_1
we will change it to:
SetLevelEndType:
move.w #0,(Level_Has_Signpost).w ; set level type to non-signpost
tst.w (Two_player_mode).w ; is it two-player competitive mode?
bne.w LevelEnd_SetSignpost ; if yes, branch
nosignpost.w emerald_hill_zone_act_2
nosignpost.w metropolis_zone_act_3
nosignpost.w wing_fortress_zone_act_1
nosignpost.w hill_top_zone_act_2
nosignpost.w oil_ocean_zone_act_2
nosignpost.w mystic_cave_zone_act_2
nosignpost.w casino_night_zone_act_2
nosignpost.w chemical_plant_zone_act_2
nosignpost.w death_egg_zone_act_1
nosignpost.w aquatic_ruin_zone_act_2
nosignpost.w sky_chase_zone_act_1
nosignpost.w $1101
nosignpost.w $1201
nosignpost.w $1301
nosignpost.w $1401
nosignpost.w $1501
nosignpost.w $1601
nosignpost.s $1701
nosignpost.s $1801
nosignpost.s $1901
nosignpost.s $1A01
nosignpost.s $1B01
nosignpost.s $1C01
nosignpost.s $1D01
nosignpost.s $1E01
nosignpost.s $1F01
nosignpost.s $2001
; loc_4C40:
LevelEnd_SetSignpost:
move.w #1,(Level_Has_Signpost).w ; set level type to signpost
+ rts
Extend Level Size Array
our levels need a size, right? This part of the guide gives us just that.
what we need to find is:
LevelSize: zoneOrderedTable 2,8 ; WrdArr_LvlSize
zoneTableEntry.w $0, $29A0, $0, $320 ; EHZ act 1
zoneTableEntry.w $0, $2940, $0, $420 ; EHZ act 2
zoneTableEntry.w $0, $3FFF, $0, $720 ; $01
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $02
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $03
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $2280, -$100, $800 ; MTZ act 1
zoneTableEntry.w $0, $1E80, -$100, $800 ; MTZ act 2
zoneTableEntry.w $0, $2A80, -$100, $800 ; MTZ act 3
zoneTableEntry.w $0, $3FFF, -$100, $800
zoneTableEntry.w $0, $3FFF, $0, $720 ; WFZ
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $2800, $0, $720 ; HTZ act 1
zoneTableEntry.w $0, $3280, $0, $720 ; HTZ act 2
zoneTableEntry.w $0, $3FFF, $0, $720 ; $08
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $09
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $2F80, $0, $680 ; OOZ act 1
zoneTableEntry.w $0, $2D00, $0, $680 ; OOZ act 2
zoneTableEntry.w $0, $2380, $3C0, $720 ; MCZ act 1
zoneTableEntry.w $0, $3FFF, $60, $720 ; MCZ act 2
zoneTableEntry.w $0, $27A0, $0, $720 ; CNZ act 1
zoneTableEntry.w $0, $2A80, $0, $720 ; CNZ act 2
zoneTableEntry.w $0, $2780, $0, $720 ; CPZ act 1
zoneTableEntry.w $0, $2A80, $0, $720 ; CPZ act 2
zoneTableEntry.w $0, $1000, $C8, $C8 ; DEZ
zoneTableEntry.w $0, $1000, $C8, $C8
zoneTableEntry.w $0, $28C0, $200, $600 ; ARZ act 1
zoneTableEntry.w $0, $3FFF, $180, $710 ; ARZ act 2
zoneTableEntry.w $0, $3FFF, $0, $000 ; SCZ
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEnd
and we will change it to:
LevelSize: zoneOrderedTable 2,8 ; WrdArr_LvlSize
zoneTableEntry.w $0, $29A0, $0, $320 ; EHZ act 1
zoneTableEntry.w $0, $2940, $0, $420 ; EHZ act 2
zoneTableEntry.w $0, $3FFF, $0, $720 ; $01
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $02
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $03
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $2280, -$100, $800 ; MTZ act 1
zoneTableEntry.w $0, $1E80, -$100, $800 ; MTZ act 2
zoneTableEntry.w $0, $2A80, -$100, $800 ; MTZ act 3
zoneTableEntry.w $0, $3FFF, -$100, $800
zoneTableEntry.w $0, $3FFF, $0, $720 ; WFZ
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $2800, $0, $720 ; HTZ act 1
zoneTableEntry.w $0, $3280, $0, $720 ; HTZ act 2
zoneTableEntry.w $0, $3FFF, $0, $720 ; $08
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $09
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $2F80, $0, $680 ; OOZ act 1
zoneTableEntry.w $0, $2D00, $0, $680 ; OOZ act 2
zoneTableEntry.w $0, $2380, $3C0, $720 ; MCZ act 1
zoneTableEntry.w $0, $3FFF, $60, $720 ; MCZ act 2
zoneTableEntry.w $0, $27A0, $0, $720 ; CNZ act 1
zoneTableEntry.w $0, $2A80, $0, $720 ; CNZ act 2
zoneTableEntry.w $0, $2780, $0, $720 ; CPZ act 1
zoneTableEntry.w $0, $2A80, $0, $720 ; CPZ act 2
zoneTableEntry.w $0, $1000, $C8, $C8 ; DEZ
zoneTableEntry.w $0, $1000, $C8, $C8
zoneTableEntry.w $0, $28C0, $200, $600 ; ARZ act 1
zoneTableEntry.w $0, $3FFF, $180, $710 ; ARZ act 2
zoneTableEntry.w $0, $3FFF, $0, $000 ; SCZ
zoneTableEntry.w $0, $3FFF, $0, $720
zoneTableEntry.w $0, $3FFF, $0, $720 ; $11 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $12 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $13 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $14 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $15 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $16 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $17 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $18 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $19 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1A ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1B ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1C ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1D ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1E ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $1F ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEntry.w $0, $3FFF, $0, $720 ; $20 ;one of our new levels (act 1)
zoneTableEntry.w $0, $3FFF, $0, $720 ;one of our new levels (act 2)
zoneTableEnd
Extending the Start Location Index
Sonic has to start somewhere right?
Find this:
StartLocations: zoneOrderedTable 2,4 ; WrdArr_StartLoc
zoneTableBinEntry 2, "startpos/EHZ_1.bin" ; $00
zoneTableBinEntry 2, "startpos/EHZ_2.bin"
zoneTableEntry.w $60, $28F ; $01
zoneTableEntry.w $60, $2AF
zoneTableEntry.w $60, $1AC ; $02
zoneTableEntry.w $60, $1AC
zoneTableEntry.w $60, $28F ; $03
zoneTableEntry.w $60, $2AF
zoneTableBinEntry 2, "startpos/MTZ_1.bin" ; $04
zoneTableBinEntry 2, "startpos/MTZ_2.bin"
zoneTableBinEntry 2, "startpos/MTZ_3.bin" ; $05
zoneTableEntry.w $60, $2AF
zoneTableBinEntry 2, "startpos/WFZ.bin" ; $06
zoneTableEntry.w $1E0, $4CC
zoneTableBinEntry 2, "startpos/HTZ_1.bin" ; $07
zoneTableBinEntry 2, "startpos/HTZ_2.bin"
zoneTableEntry.w $230, $1AC ; $08
zoneTableEntry.w $230, $1AC
zoneTableEntry.w $60, $28F ; $09
zoneTableEntry.w $60, $2AF
zoneTableBinEntry 2, "startpos/OOZ_1.bin" ; $0A
zoneTableBinEntry 2, "startpos/OOZ_2.bin"
zoneTableBinEntry 2, "startpos/MCZ_1.bin" ; $0B
zoneTableBinEntry 2, "startpos/MCZ_2.bin"
zoneTableBinEntry 2, "startpos/CNZ_1.bin" ; $0C
zoneTableBinEntry 2, "startpos/CNZ_2.bin"
zoneTableBinEntry 2, "startpos/CPZ_1.bin" ; $0D
zoneTableBinEntry 2, "startpos/CPZ_2.bin"
zoneTableBinEntry 2, "startpos/DEZ.bin" ; $0E
zoneTableEntry.w $60, $12D
zoneTableBinEntry 2, "startpos/ARZ_1.bin" ; $0F
zoneTableBinEntry 2, "startpos/ARZ_2.bin"
zoneTableBinEntry 2, "startpos/SCZ.bin" ; $10
zoneTableEntry.w $140, $70
then add this to the end:
zoneTableEntry.w 0, 0 ; $11
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $12
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $13
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $14
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $15
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $16
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $17
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $18
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $19
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $1A
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $1B
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $1C
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $1D
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $1E
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $1F
zoneTableEntry.w 0, 0
zoneTableEntry.w 0, 0 ; $20
zoneTableEntry.w 0, 0
then replace the 0s with the desired x and y co-ordinance.
Extending the Debug Mode Object List
Yes, we might want this too for when you are testing your level environment as well as to hide an easter egg for the player, so find:
JmpTbl_DbgObjLists: zoneOrderedOffsetTable 2,1
zoneOffsetTableEntry.w DbgObjList_EHZ ; 0
zoneOffsetTableEntry.w DbgObjList_Def ; 1
zoneOffsetTableEntry.w DbgObjList_Def ; 2
zoneOffsetTableEntry.w DbgObjList_Def ; 3
zoneOffsetTableEntry.w DbgObjList_MTZ ; 4
zoneOffsetTableEntry.w DbgObjList_MTZ ; 5
zoneOffsetTableEntry.w DbgObjList_WFZ ; 6
zoneOffsetTableEntry.w DbgObjList_HTZ ; 7
zoneOffsetTableEntry.w DbgObjList_OOZ ; 8
zoneOffsetTableEntry.w DbgObjList_Def ; 9
zoneOffsetTableEntry.w DbgObjList_OOZ ; $A
zoneOffsetTableEntry.w DbgObjList_MCZ ; $B
zoneOffsetTableEntry.w DbgObjList_CNZ ; $C
zoneOffsetTableEntry.w DbgObjList_CPZ ; $D
zoneOffsetTableEntry.w DbgObjList_Def ; $E
zoneOffsetTableEntry.w DbgObjList_ARZ ; $F
zoneOffsetTableEntry.w DbgObjList_SCZ ; $10
and add these to the end of it:
zoneOffsetTableEntry.w DbgObjList_Def ; $11
zoneOffsetTableEntry.w DbgObjList_Def ; $12
zoneOffsetTableEntry.w DbgObjList_Def ; $13
zoneOffsetTableEntry.w DbgObjList_Def ; $14
zoneOffsetTableEntry.w DbgObjList_Def ; $15
zoneOffsetTableEntry.w DbgObjList_Def ; $16
zoneOffsetTableEntry.w DbgObjList_Def ; $17
zoneOffsetTableEntry.w DbgObjList_Def ; $18
zoneOffsetTableEntry.w DbgObjList_Def ; $19
zoneOffsetTableEntry.w DbgObjList_Def ; $1A
zoneOffsetTableEntry.w DbgObjList_Def ; $1B
zoneOffsetTableEntry.w DbgObjList_Def ; $1C
zoneOffsetTableEntry.w DbgObjList_Def ; $1D
zoneOffsetTableEntry.w DbgObjList_Def ; $1E
zoneOffsetTableEntry.w DbgObjList_Def ; $1F
zoneOffsetTableEntry.w DbgObjList_Def ; $20
Extending Initial Camera Index
Apparently, the Disassembly issues warinings if you don't extend this index, though, making new entries is insanely easy so this really isnt a problem, so find:
; off_C296:
InitCam_Index: zoneOrderedOffsetTable 2,1
zoneOffsetTableEntry.w InitCam_EHZ
zoneOffsetTableEntry.w InitCam_Null0 ; 1
zoneOffsetTableEntry.w InitCam_WZ ; 2
zoneOffsetTableEntry.w InitCam_Null0 ; 3
zoneOffsetTableEntry.w InitCam_Std ; 4 MTZ
zoneOffsetTableEntry.w InitCam_Std ; 5 MTZ3
zoneOffsetTableEntry.w InitCam_Null1 ; 6
zoneOffsetTableEntry.w InitCam_HTZ ; 7
zoneOffsetTableEntry.w InitCam_HPZ ; 8
zoneOffsetTableEntry.w InitCam_Null2 ; 9
zoneOffsetTableEntry.w InitCam_OOZ ; 10
zoneOffsetTableEntry.w InitCam_MCZ ; 11
zoneOffsetTableEntry.w InitCam_CNZ ; 12
zoneOffsetTableEntry.w InitCam_CPZ ; 13
zoneOffsetTableEntry.w InitCam_Null3 ; 14
zoneOffsetTableEntry.w InitCam_ARZ ; 15
zoneOffsetTableEntry.w InitCam_SCZ ; 16
and add these at the bottom:
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
zoneOffsetTableEntry.w InitCam_Std
Extending the Software Scrolling Index
levels in a sonic game have a software scroll manager, so we need to add that to our new levels, so find:
SwScrl_Index: zoneOrderedOffsetTable 2,1 ; JmpTbl_SwScrlMgr
zoneOffsetTableEntry.w SwScrl_EHZ ; $00
zoneOffsetTableEntry.w SwScrl_Minimal ; $01
zoneOffsetTableEntry.w SwScrl_Lev2 ; $02
zoneOffsetTableEntry.w SwScrl_Minimal ; $03
zoneOffsetTableEntry.w SwScrl_MTZ ; $04
zoneOffsetTableEntry.w SwScrl_MTZ ; $05
zoneOffsetTableEntry.w SwScrl_WFZ ; $06
zoneOffsetTableEntry.w SwScrl_HTZ ; $07
zoneOffsetTableEntry.w SwScrl_HPZ ; $08
zoneOffsetTableEntry.w SwScrl_OOZ ; $0A
zoneOffsetTableEntry.w SwScrl_MCZ ; $0B
zoneOffsetTableEntry.w SwScrl_CNZ ; $0C
zoneOffsetTableEntry.w SwScrl_CPZ ; $0D
zoneOffsetTableEntry.w SwScrl_DEZ ; $0E
zoneOffsetTableEntry.w SwScrl_ARZ ; $0F
zoneOffsetTableEntry.w SwScrl_SCZ ; $10
and add these at the bottom:
zoneOffsetTableEntry.w SwScrl_Minimal ; $11
zoneOffsetTableEntry.w SwScrl_Minimal ; $12
zoneOffsetTableEntry.w SwScrl_Minimal ; $13
zoneOffsetTableEntry.w SwScrl_Minimal ; $14
zoneOffsetTableEntry.w SwScrl_Minimal ; $15
zoneOffsetTableEntry.w SwScrl_Minimal ; $16
zoneOffsetTableEntry.w SwScrl_Minimal ; $17
zoneOffsetTableEntry.w SwScrl_Minimal ; $18
zoneOffsetTableEntry.w SwScrl_Minimal ; $19
zoneOffsetTableEntry.w SwScrl_Minimal ; $1A
zoneOffsetTableEntry.w SwScrl_Minimal ; $1B
zoneOffsetTableEntry.w SwScrl_Minimal ; $1C
zoneOffsetTableEntry.w SwScrl_Minimal ; $1D
zoneOffsetTableEntry.w SwScrl_Minimal ; $1E
zoneOffsetTableEntry.w SwScrl_Minimal ; $1F
zoneOffsetTableEntry.w SwScrl_Minimal ; $20
Extending the Dynamic Level Event Index
The Dynamic Level Event Index points the zones to their scripts, which decide what happens, when, so lets find:
; off_E636:
DynamicLevelEventIndex: zoneOrderedOffsetTable 2,1
zoneOffsetTableEntry.w LevEvents_EHZ ; 0 ; EHZ
zoneOffsetTableEntry.w LevEvents_001 ; 1 ; LEV1
zoneOffsetTableEntry.w LevEvents_002 ; 2 ; LEV2
zoneOffsetTableEntry.w LevEvents_003 ; 3 ; LEV3
zoneOffsetTableEntry.w LevEvents_MTZ ; 4 ; MTZ
zoneOffsetTableEntry.w LevEvents_MTZ3 ; 5 ; MTZ3
zoneOffsetTableEntry.w LevEvents_WFZ ; 6 ; WFZ
zoneOffsetTableEntry.w LevEvents_HTZ ; 7 ; HTZ
zoneOffsetTableEntry.w LevEvents_HPZ ; 8 ; HPZ
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_OOZ ; $A ; OOZ
zoneOffsetTableEntry.w LevEvents_MCZ ; $B ; MCZ
zoneOffsetTableEntry.w LevEvents_CNZ ; $C ; CNZ
zoneOffsetTableEntry.w LevEvents_CPZ ; $D ; CPZ
zoneOffsetTableEntry.w LevEvents_DEZ ; $E ; DEZ
zoneOffsetTableEntry.w LevEvents_ARZ ; $F ; ARZ
zoneOffsetTableEntry.w LevEvents_SCZ ; $10 ; SCZ
and add these at the bottom:
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
zoneOffsetTableEntry.w LevEvents_009 ; 9 ; LEV9
I chose the entries from Lev09 because it is a good placeholder for until your wrote your own script for your new zones.
Extending the Animals
Whenever you destroy an enemy out pops an animal that hops or flies away, so likely if you don't extend this index, you will not get an animal, but likely a game crash instead, so find:
Obj28_ZoneAnimals: zoneOrderedTable 1,2
zoneAnimals macro first,second
zoneTableEntry.b (Obj28_Properties_first - Obj28_Properties) / 8
zoneTableEntry.b (Obj28_Properties_second - Obj28_Properties) / 8
endm
; This table declares what animals will appear in the zone.
; When an enemy is destroyed, a random animal is chosen from the 2 selected animals.
; Note: you must also load the corresponding art in the PLCs.
zoneAnimals.b Squirrel, Bird ; EHZ
zoneAnimals.b Squirrel, Bird ; Zone 1
zoneAnimals.b Squirrel, Bird ; WZ
zoneAnimals.b Squirrel, Bird ; Zone 3
zoneAnimals.b Beaver, Eagle ; MTZ
zoneAnimals.b Beaver, Eagle ; MTZ
zoneAnimals.b Beaver, Eagle ; WFZ
zoneAnimals.b Beaver, Eagle ; HTZ
zoneAnimals.b Mouse, Seal ; HPZ
zoneAnimals.b Mouse, Seal ; Zone 9
zoneAnimals.b Penguin, Seal ; OOZ
zoneAnimals.b Mouse, Chicken ; MCZ
zoneAnimals.b Bear, Bird ; CNZ
zoneAnimals.b Rabbit, Eagle ; CPZ
zoneAnimals.b Pig, Chicken ; DEZ
zoneAnimals.b Penguin, Bird ; ARZ
zoneAnimals.b Turtle, Chicken ; SCZ
and add these at the bottom:
zoneAnimals.b Squirrel, Bird ; Zone 11
zoneAnimals.b Squirrel, Bird ; Zone 12
zoneAnimals.b Squirrel, Bird ; Zone 13
zoneAnimals.b Squirrel, Bird ; Zone 14
zoneAnimals.b Squirrel, Bird ; Zone 15
zoneAnimals.b Squirrel, Bird ; Zone 16
zoneAnimals.b Squirrel, Bird ; Zone 17
zoneAnimals.b Squirrel, Bird ; Zone 18
zoneAnimals.b Squirrel, Bird ; Zone 19
zoneAnimals.b Squirrel, Bird ; Zone 1A
zoneAnimals.b Squirrel, Bird ; Zone 1B
zoneAnimals.b Squirrel, Bird ; Zone 1C
zoneAnimals.b Squirrel, Bird ; Zone 1D
zoneAnimals.b Squirrel, Bird ; Zone 1E
zoneAnimals.b Squirrel, Bird ; Zone 1F
zoneAnimals.b Squirrel, Bird ; Zone 20
Change the animals to whatever you please, or add new ones by adding new custom mappings and extending this code:
; This table declares the speed and mappings of each animal.
Rabbit: obj28decl -$200,-$400,Obj28_MapUnc_11EAC
Chicken: obj28decl -$200,-$300,Obj28_MapUnc_11E1C
Penguin: obj28decl -$180,-$300,Obj28_MapUnc_11EAC
Seal: obj28decl -$140,-$180,Obj28_MapUnc_11E88
Pig: obj28decl -$1C0,-$300,Obj28_MapUnc_11E64
Bird: obj28decl -$300,-$400,Obj28_MapUnc_11E1C
Squirrel: obj28decl -$280,-$380,Obj28_MapUnc_11E40
Eagle: obj28decl -$280,-$300,Obj28_MapUnc_11E1C
Mouse: obj28decl -$200,-$380,Obj28_MapUnc_11E40
Beaver: obj28decl -$2C0,-$300,Obj28_MapUnc_11E40
Turtle: obj28decl -$140,-$200,Obj28_MapUnc_11E40
Bear: obj28decl -$200,-$300,Obj28_MapUnc_11E40
; The following tables tell the properties of animals based on their subtype.
; word_11950:
Obj28_Speeds:
dc.w -$440, -$400
dc.w -$440, -$400 ; 2
dc.w -$440, -$400 ; 4
dc.w -$300, -$400 ; 6
dc.w -$300, -$400 ; 8
dc.w -$180, -$300 ; 10
dc.w -$180, -$300 ; 12
dc.w -$140, -$180 ; 14
dc.w -$1C0, -$300 ; 16
dc.w -$200, -$300 ; 18
dc.w -$280, -$380 ; 20
; off_1197C:
Obj28_Mappings:
dc.l Obj28_MapUnc_11E1C
dc.l Obj28_MapUnc_11E1C ; 1
dc.l Obj28_MapUnc_11E1C ; 2
dc.l Obj28_MapUnc_11EAC ; 3
dc.l Obj28_MapUnc_11EAC ; 4
dc.l Obj28_MapUnc_11EAC ; 5
dc.l Obj28_MapUnc_11EAC ; 6
dc.l Obj28_MapUnc_11E88 ; 7
dc.l Obj28_MapUnc_11E64 ; 8
dc.l Obj28_MapUnc_11E1C ; 9
dc.l Obj28_MapUnc_11E40 ; 10
; word_119A8:
Obj28_ArtLocations:
dc.w ArtTile_ArtNem_S1EndFlicky ; 0 Flicky
dc.w ArtTile_ArtNem_S1EndFlicky ; 1 Flicky
dc.w ArtTile_ArtNem_S1EndFlicky ; 2 Flicky
dc.w ArtTile_ArtNem_S1EndRabbit ; 3 Rabbit
dc.w ArtTile_ArtNem_S1EndRabbit ; 4 Rabbit
dc.w ArtTile_ArtNem_S1EndPenguin ; 5 Penguin
dc.w ArtTile_ArtNem_S1EndPenguin ; 6 Penguin
dc.w ArtTile_ArtNem_S1EndSeal ; 7 Seal
dc.w ArtTile_ArtNem_S1EndPig ; 8 Pig
dc.w ArtTile_ArtNem_S1EndChicken ; 9 Chicken
dc.w ArtTile_ArtNem_S1EndSquirrel ; 10 Squirrel
Now we need to determine the PLC that loads our animals now that our zones now have them, so find:
;byte_13F62:
Animal_PLCTable: zoneOrderedTable 1,1
zoneTableEntry.b PLCID_EhzAnimals ; $0
zoneTableEntry.b PLCID_EhzAnimals ; $1
zoneTableEntry.b PLCID_EhzAnimals ; $2
zoneTableEntry.b PLCID_EhzAnimals ; $3
zoneTableEntry.b PLCID_MtzAnimals ; $4
zoneTableEntry.b PLCID_MtzAnimals ; $5
zoneTableEntry.b PLCID_WfzAnimals ; $6
zoneTableEntry.b PLCID_HtzAnimals ; $7
zoneTableEntry.b PLCID_HpzAnimals ; $8
zoneTableEntry.b PLCID_HpzAnimals ; $9
zoneTableEntry.b PLCID_OozAnimals ; $A
zoneTableEntry.b PLCID_MczAnimals ; $B
zoneTableEntry.b PLCID_CnzAnimals ; $C
zoneTableEntry.b PLCID_CpzAnimals ; $D
zoneTableEntry.b PLCID_DezAnimals ; $E
zoneTableEntry.b PLCID_ArzAnimals ; $F
zoneTableEntry.b PLCID_SczAnimals ; $10
and add these at the bottom:
zoneTableEntry.b PLCID_EhzAnimals ; $11
zoneTableEntry.b PLCID_EhzAnimals ; $12
zoneTableEntry.b PLCID_EhzAnimals ; $13
zoneTableEntry.b PLCID_EhzAnimals ; $14
zoneTableEntry.b PLCID_EhzAnimals ; $15
zoneTableEntry.b PLCID_EhzAnimals ; $16
zoneTableEntry.b PLCID_EhzAnimals ; $17
zoneTableEntry.b PLCID_EhzAnimals ; $18
zoneTableEntry.b PLCID_EhzAnimals ; $19
zoneTableEntry.b PLCID_EhzAnimals ; $1A
zoneTableEntry.b PLCID_EhzAnimals ; $1B
zoneTableEntry.b PLCID_EhzAnimals ; $1C
zoneTableEntry.b PLCID_EhzAnimals ; $1D
zoneTableEntry.b PLCID_EhzAnimals ; $1E
zoneTableEntry.b PLCID_EhzAnimals ; $1F
zoneTableEntry.b PLCID_EhzAnimals ; $20
Extending the Level Order
The game needs to know what order to play the zones in, not just know how big they are and where you start, right? so lets find:
LevelOrder: zoneOrderedTable 2,2 ; WrdArr_LevelOrder
zoneTableEntry.w emerald_hill_zone_act_2
zoneTableEntry.w chemical_plant_zone_act_1 ; 1
zoneTableEntry.w emerald_hill_zone_act_1 ; 2
zoneTableEntry.w emerald_hill_zone_act_1 ; 3
zoneTableEntry.w wood_zone_act_2 ; 4
zoneTableEntry.w metropolis_zone_act_1 ; 5
zoneTableEntry.w emerald_hill_zone_act_1 ; 6
zoneTableEntry.w emerald_hill_zone_act_1 ; 7
zoneTableEntry.w metropolis_zone_act_2 ; 8
zoneTableEntry.w metropolis_zone_act_3 ; 9
zoneTableEntry.w sky_chase_zone_act_1 ; 10
zoneTableEntry.w emerald_hill_zone_act_1 ; 11
zoneTableEntry.w death_egg_zone_act_1 ; 12
zoneTableEntry.w emerald_hill_zone_act_1 ; 13
zoneTableEntry.w hill_top_zone_act_2 ; 14
zoneTableEntry.w mystic_cave_zone_act_1 ; 15
zoneTableEntry.w hidden_palace_zone_act_2 ; 16
zoneTableEntry.w oil_ocean_zone_act_1 ; 17
zoneTableEntry.w emerald_hill_zone_act_1 ; 18
zoneTableEntry.w emerald_hill_zone_act_1 ; 19
zoneTableEntry.w oil_ocean_zone_act_2 ; 20
zoneTableEntry.w metropolis_zone_act_1 ; 21
zoneTableEntry.w mystic_cave_zone_act_2 ; 22
zoneTableEntry.w oil_ocean_zone_act_1 ; 23
zoneTableEntry.w casino_night_zone_act_2 ; 24
zoneTableEntry.w hill_top_zone_act_1 ; 25
zoneTableEntry.w chemical_plant_zone_act_2 ; 26
zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27
zoneTableEntry.w $FFFF ; 28
zoneTableEntry.w emerald_hill_zone_act_1 ; 29
zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30
zoneTableEntry.w casino_night_zone_act_1 ; 31
zoneTableEntry.w wing_fortress_zone_act_1 ; 32
zoneTableEntry.w emerald_hill_zone_act_1 ; 33
zoneTableEnd
;word_1433C:
LevelOrder_2P: zoneOrderedTable 2,2 ; WrdArr_LevelOrder_2P
zoneTableEntry.w emerald_hill_zone_act_2
zoneTableEntry.w casino_night_zone_act_1 ; 1
zoneTableEntry.w emerald_hill_zone_act_1 ; 2
zoneTableEntry.w emerald_hill_zone_act_1 ; 3
zoneTableEntry.w wood_zone_act_2 ; 4
zoneTableEntry.w metropolis_zone_act_1 ; 5
zoneTableEntry.w emerald_hill_zone_act_1 ; 6
zoneTableEntry.w emerald_hill_zone_act_1 ; 7
zoneTableEntry.w metropolis_zone_act_2 ; 8
zoneTableEntry.w metropolis_zone_act_3 ; 9
zoneTableEntry.w sky_chase_zone_act_1 ; 10
zoneTableEntry.w emerald_hill_zone_act_1 ; 11
zoneTableEntry.w death_egg_zone_act_1 ; 12
zoneTableEntry.w emerald_hill_zone_act_1 ; 13
zoneTableEntry.w hill_top_zone_act_2 ; 14
zoneTableEntry.w mystic_cave_zone_act_1 ; 15
zoneTableEntry.w hidden_palace_zone_act_2 ; 16
zoneTableEntry.w oil_ocean_zone_act_1 ; 17
zoneTableEntry.w emerald_hill_zone_act_1 ; 18
zoneTableEntry.w emerald_hill_zone_act_1 ; 19
zoneTableEntry.w oil_ocean_zone_act_2 ; 20
zoneTableEntry.w metropolis_zone_act_1 ; 21
zoneTableEntry.w mystic_cave_zone_act_2 ; 22
zoneTableEntry.w $FFFF ; 23
zoneTableEntry.w casino_night_zone_act_2 ; 24
zoneTableEntry.w mystic_cave_zone_act_1 ; 25
zoneTableEntry.w chemical_plant_zone_act_2 ; 26
zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27
zoneTableEntry.w $FFFF ; 28
zoneTableEntry.w emerald_hill_zone_act_1 ; 29
zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30
zoneTableEntry.w casino_night_zone_act_1 ; 31
zoneTableEntry.w wing_fortress_zone_act_1 ; 32
zoneTableEntry.w emerald_hill_zone_act_1 ; 33
zoneTableEnd
and add change them to read:
LevelOrder: zoneOrderedTable 2,2 ; WrdArr_LevelOrder
zoneTableEntry.w emerald_hill_zone_act_2
zoneTableEntry.w chemical_plant_zone_act_1 ; 1
zoneTableEntry.w emerald_hill_zone_act_1 ; 2
zoneTableEntry.w emerald_hill_zone_act_1 ; 3
zoneTableEntry.w wood_zone_act_2 ; 4
zoneTableEntry.w metropolis_zone_act_1 ; 5
zoneTableEntry.w emerald_hill_zone_act_1 ; 6
zoneTableEntry.w emerald_hill_zone_act_1 ; 7
zoneTableEntry.w metropolis_zone_act_2 ; 8
zoneTableEntry.w metropolis_zone_act_3 ; 9
zoneTableEntry.w sky_chase_zone_act_1 ; 10
zoneTableEntry.w emerald_hill_zone_act_1 ; 11
zoneTableEntry.w death_egg_zone_act_1 ; 12
zoneTableEntry.w emerald_hill_zone_act_1 ; 13
zoneTableEntry.w hill_top_zone_act_2 ; 14
zoneTableEntry.w mystic_cave_zone_act_1 ; 15
zoneTableEntry.w hidden_palace_zone_act_2 ; 16
zoneTableEntry.w oil_ocean_zone_act_1 ; 17
zoneTableEntry.w emerald_hill_zone_act_1 ; 18
zoneTableEntry.w emerald_hill_zone_act_1 ; 19
zoneTableEntry.w oil_ocean_zone_act_2 ; 20
zoneTableEntry.w metropolis_zone_act_1 ; 21
zoneTableEntry.w mystic_cave_zone_act_2 ; 22
zoneTableEntry.w oil_ocean_zone_act_1 ; 23
zoneTableEntry.w casino_night_zone_act_2 ; 24
zoneTableEntry.w hill_top_zone_act_1 ; 25
zoneTableEntry.w chemical_plant_zone_act_2 ; 26
zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27
zoneTableEntry.w $FFFF ; 28
zoneTableEntry.w emerald_hill_zone_act_1 ; 29
zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30
zoneTableEntry.w casino_night_zone_act_1 ; 31
zoneTableEntry.w wing_fortress_zone_act_1 ; 32
zoneTableEntry.w emerald_hill_zone_act_1 ; 33
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEnd
;word_1433C:
LevelOrder_2P: zoneOrderedTable 2,2 ; WrdArr_LevelOrder_2P
zoneTableEntry.w emerald_hill_zone_act_2
zoneTableEntry.w casino_night_zone_act_1 ; 1
zoneTableEntry.w emerald_hill_zone_act_1 ; 2
zoneTableEntry.w emerald_hill_zone_act_1 ; 3
zoneTableEntry.w wood_zone_act_2 ; 4
zoneTableEntry.w metropolis_zone_act_1 ; 5
zoneTableEntry.w emerald_hill_zone_act_1 ; 6
zoneTableEntry.w emerald_hill_zone_act_1 ; 7
zoneTableEntry.w metropolis_zone_act_2 ; 8
zoneTableEntry.w metropolis_zone_act_3 ; 9
zoneTableEntry.w sky_chase_zone_act_1 ; 10
zoneTableEntry.w emerald_hill_zone_act_1 ; 11
zoneTableEntry.w death_egg_zone_act_1 ; 12
zoneTableEntry.w emerald_hill_zone_act_1 ; 13
zoneTableEntry.w hill_top_zone_act_2 ; 14
zoneTableEntry.w mystic_cave_zone_act_1 ; 15
zoneTableEntry.w hidden_palace_zone_act_2 ; 16
zoneTableEntry.w oil_ocean_zone_act_1 ; 17
zoneTableEntry.w emerald_hill_zone_act_1 ; 18
zoneTableEntry.w emerald_hill_zone_act_1 ; 19
zoneTableEntry.w oil_ocean_zone_act_2 ; 20
zoneTableEntry.w metropolis_zone_act_1 ; 21
zoneTableEntry.w mystic_cave_zone_act_2 ; 22
zoneTableEntry.w $FFFF ; 23
zoneTableEntry.w casino_night_zone_act_2 ; 24
zoneTableEntry.w mystic_cave_zone_act_1 ; 25
zoneTableEntry.w chemical_plant_zone_act_2 ; 26
zoneTableEntry.w aquatic_ruin_zone_act_1 ; 27
zoneTableEntry.w $FFFF ; 28
zoneTableEntry.w emerald_hill_zone_act_1 ; 29
zoneTableEntry.w aquatic_ruin_zone_act_2 ; 30
zoneTableEntry.w casino_night_zone_act_1 ; 31
zoneTableEntry.w wing_fortress_zone_act_1 ; 32
zoneTableEntry.w emerald_hill_zone_act_1 ; 33
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEntry.w emerald_hill_zone_act_1
zoneTableEnd
Notes
All new .bin files need to be created in order for the ROM to build. If something doesn't load correctly (besides new animated patterns that you have just made by youself, only major things like ROM crashes) please don't hesitate to ask for help and/or get it working and edit this article. (Like the title cards being broken for levels past $10)
|Extend the level index past $10 in Sonic 2]]