diff --git a/Overworld/ZCustomOverworld.asm b/Overworld/ZCustomOverworld.asm new file mode 100644 index 0000000..c49514c --- /dev/null +++ b/Overworld/ZCustomOverworld.asm @@ -0,0 +1,2462 @@ +; ============================================================================== +; Hooks +; ============================================================================== + +AnimatedTileGFXSet = $0FC0 + +org $008913 + Sound_LoadLightWorldSongBank: + +org $00D394 + DecompOwAnimatedTiles: + +org $00D4DB + GetAnimatedSpriteTile: + +org $00D4ED + GetAnimatedSpriteTile_variable: + +org $00DF4F + Do3To4High16Bit: + +org $00E19B + InitTilesets: + +org $00E556 + CopyFontToVram: + + +org $02ABBE + Overworld_FinishTransGfx_firstHalf: + +org $02AF19 + Overworld_LoadSubscreenAndSilenceSFX1: + +org $02FD0D + LoadSubscreenOverlay: + +org $02FD8A + LoadGearPalettes_bunny: + + +org $099EFC + Tagalong_Init: + +org $09AF89 + Sprite_ReinitWarpVortex: + +org $09C44E + Sprite_ResetAll: + +org $09C499 + Sprite_OverworldReloadAll: + + +org $0ED5A8 + Overworld_LoadPalettes: + +org $0ED618 + Palette_SetOwBgColor_Long: + + +org $1BEC77 + Palette_SpriteAux3: + +org $1BEC9E + Palette_MainSpr: + +org $1BECC5 + Palette_SpriteAux1: + +org $1BECE4 + Palette_SpriteAux2: + +org $1BED03 + Palette_Sword: + +org $1BED29 + Palette_Shield: + +org $1BED6E + Palette_MiscSpr: + +org $1BEDF9 + Palette_ArmorAndGloves: + +org $1BEE52 + Palette_Hud: + +org $1BEEC7 + Palette_OverworldBgMain: + +; ============================================================================== +; Fixing old hooks: +; ============================================================================== + +; Loads the transparent color under some load conditions +org $0BFEB6 + STA.l $7EC500 + +; Main Palette loading routine. +org $0ED5E7 + JSL $1BEEA8 ;Palette_OverworldBgAux3 + +; After leaving special areas like Zora's and the Master Sword area. +org $02E94A + JSL $0ED5A8 ; Overworld_LoadPalettes + +; ============================================================================== +; Custom Functions and Data +; ============================================================================== + +; Reserved ZS space. +; Avoid moving this at all costs. If you do, you will have to change where ZS +; saves this data as well and previous data will be lost or corrupted. +org $288000 ; $140000 +Pool: +{ + .BGColorTable ; $140000 + ; Valid values: + ; 555 color value $0000 to $7FFF. + + ; LW + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ; DW + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ; SW + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 + ;warnpc $288140 + + ; ZS is weird with SW areas, so we are marking the bridge one specifically so we can find it later. + org $288128 + .BGColorTable_Bridge + + + org $288140 ; $140140 + .EnableTable ; 0x20 + ; Valid values: + ; $00 - Disabled + ; $FF - Enabled + + org $288140 ; $140140 + .EnableBGColor + db $01 + + org $288141 ; $140141 + .EnableMainPalette + db $01 + + org $288142 ; $140142 + .EnableMosaic ; Unused for now. + db $01 + + org $288143 ; $140143 + .EnableAnimated + db $01 + + org $288144 ; $140144 + .EnableSubScreenOverlay + db $01 + + ; This is a reserved value that ZS will write to when it has applied the ASM. + ; That way the next time ZS loads the ROM it knows to read the custom values + ; instead of using the default ones. + org $288145 ; $140145 + .ZSAppliedASM + ;db $FF + + ; When non 0 this will cause rain to appear on all areas in the beginning phase. + ; Default is $FF + org $288146 ; $140146 + .EnableBeginningRain + db $FF + + ; When non 0 this will disable the ambiant sound that plays in the mire area after the event is triggered. + ; Default is $FF + org $288147 ; $140147 + .EnableRainMireEvent + db $FF + + ; The rest of these are extra bytes that can be used for anything else later on. + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;warnpc $288160 + + org $288160 ; $140160 + .MainPaletteTable ; 0xA0 + ; Valid values: + ; Main overworld palette index $00 to $05. + ; $00 is the normal light world palette. + ; $01 is the normal dark world palette. + ; $02 is the normal light world death mountain palette. + ; $03 is the normal dark world death mountain palette. + ; $04 is the Triforce room palette. + ; $05 is the title screen palette? + + ; LW + ;db $00, $00, $00, $02, $00, $20, $00, $20 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ; DW + ;db $01, $01, $01, $03, $01, $03, $01, $03 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ;db $01, $01, $01, $01, $01, $01, $01, $01 + ; SW + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $04, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;warnpc $288200 + + org $288200 ; $140200 + .MosaicTable ; 0xA0 + ; Valid values: + ; $01 to enable mosaic, $00 to disable. + + ; LW + ;db $01, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ; DW + ;db $01, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ; SW + ;db $01, $01, $00, $00, $00, $00, $00, $00 + ;db $01, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;db $00, $00, $00, $00, $00, $00, $00, $00 + ;warnpc $2882A0 + + org $2882A0 ; $1402A0 + .AnimatedTable ; 0xA0 + ; Valid values: + ; GFX index $00 to $FF. + ; In vanilla, $59 are the clouds and $5B are the regular water tiles. + + ; LW + ;db $5B, $5B, $5B, $59, $5B, $59, $5B, $59 + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ; DW + ;db $5B, $5B, $5B, $59, $5B, $59, $5B, $59 + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ; SW + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B + ;warnpc $288340 + + org $288340 ; $140340 + .OverlayTable ; 0x140 + ; Valid values: + ; Can be any value $00 to $FF but is stored as 2 bytes instead of one to help the code out below. + ; $FF is for no overlay area. + ; Hopefully no crazy person decides to expand their overworld to $FF areas. + + ; $0093 is the triforce room curtain overlay. + ; $0094 is the under the bridge overlay. + ; $0095 is the sky background overlay. + ; $0096 is the pyramid background overlay. + ; $0097 is the first fog overlay. + + ; $009C is the lava background overlay. + ; $009D is the second fog overlay. + ; $009E is the tree canopy overlay. + ; $009F is the rain overlay. + + ;LW + ;dw $009D, $00FF, $00FF, $0095, $00FF, $0095, $00FF, $0095 + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;DW + ;dw $009D, $00FF, $00FF, $009C, $00FF, $009C, $00FF, $009C + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $0096, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $009F, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;SP + ;dw $0097, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $0093, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF + ;warnpc $288480 +} + +; Debug addresses +; $00D8D5 ; W7 Animated tiles on warp. +!Func00D8D5 = $01 ; Disable +; $00DA63 ; W8 Enable/Disable subscreen. +!Func00DA63 = $01 +; $00EEBB ; Zeros out the BG color when mirror warping to the pyramid area. +!Func00EEBB = $01 ; Disable +; $00FF7C ; W9 BG scrolling for HC and the pyramid area. +!Func00FF7C = $01 + +; $028027 +; $029C0C +; $029D1E +; $029F82 + +; $0283EE ; E2 ; Changes the function that loads overworld properties when exiting a dungeon. Includes removing asm that plays music in certain areas and changing how animated tiles are loaded. +!Func0283EE = $01 ; Disable +; $028632 ; Changes a function that loads animated tiles under certain conditions. +!Func028632 = $01 ; Disable +; $029AA6 ; E1 ; Changes part of a function that changes the special BG color when leaving dungeons? not sure. +!Func029AA6 = $01 ; Disable +; $02AF58 ; T2 S2 W2 Main subscreen loading function. +!Func02AF58 = $01 +; $02B2D4 ; W1 turns on subscreen for pyramid. +!Func02B2D4 = $01 +; $02B3A1 ; W6 Activate subscreen durring pyramid warp. +!Func02B3A1 = $01 +; $02BC44 ; Controls overworld vertical subscreen movement for the pyramid BG. +!Func02BC44 = $01 +; $02C02D ; T4 Changes how the pyramid BG scrolls durring transition. +!Func02C02D = $01 +; $02C692 ; W3 Main palette loading routine. +!Func02C692 = $01 +; $02A4CD ; Rain animation code. +!Func02A4CD = $01 +; $02AADB ; T1 Mosaic +!Func02AADB = $01 +; $02ABB8 ; T3 transition animated and main palette. +!Func02ABB8 = $01 +; $0ABC5A ; Loads the animated tiles after the overworld map is closed. +!Func0ABC5A = $01 ; Disable +; $0AB8F5 ; Loads different animated tiles when returning from bird travel. +!Func0AB8F5 = $01 ; prob disable +; $0BFEC6 ; W5 Load overlay, fixed color, and BG color. +!Func0BFEC6 = $01 +; $0ED627 ; S1 W4 Transparent color durring warp and during special area enter. +!Func0ED627 = $01 +; $0ED8AE ; Resets the area special color after the screen flashes. +!Func0ED8AE = $01 ; Disable + +; Start of expanded space. +org $288480 ; $140480 +pushpc + +; ============================================================================== + +if !Func00D8D5 = 1 + +; Replaces a function that decompresses animated tiles in certain mirror warp conditions. +org $00D8D5 ; $0058D5 +Func00D8D5: +{ + PHX + + ; Load the animated tiles the area needs. + LDX.b $8A + + ; Do a 00 check just in case the data isn't present we don't get at crash. + LDA.l Pool_AnimatedTable, X : BNE .notZero + ; $5B is the defualt flower/water animated tiles value. + LDA.b #$5B + + .notZero + + ; The decompression function increases it by 1 so subtract 1 here. + DEC : TAY + + PLX + + JSL DecompOwAnimatedTiles + + RTL +} +;warnpc $00D8EE + +else + +; Undo the function above: +org $00D8D5 ; $0058D5 +db $A0, $58, $A5, $8A, $29, $BF, $C9, $03 +db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 +db $F0, $02, $A0, $5A, $22, $94, $D3, $00 +db $6B + +endif + +; ============================================================================== + +if !Func00DA63 = 1 + +; Sets the $1D Sub Screen Designation to either enable or disable BG for screens with special overlays. +org $00DA63 ; $005A63 +Func00DA63: +{ + JSL ActivateSubScreen + + ; From this point on it is the vanilla function. + PHB : PHK : PLB + + LDA.l $00D8F4, X : TAY + + LDA.w $D1B1, Y : STA.b $00 + LDA.w $D0D2, Y : STA.b $01 + LDA.w $CFF3, Y : STA.b $02 + STA.b $05 + + PLB + + REP #$31 ; Set A, X, and Y in 16bit mode. +1 no idea + + ; source address is determined above, number of tiles is 0x0040, base target address is $7F0000 + LDX.w #$0000 + LDY.w #$0040 + + LDA.b $00 + + JSR Do3To4High16Bit + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + RTL +} +;warnpc $00DABB + +else + +; Undo the function above: +org $00DA63 ; $005A63 +db $64, $1D, $A5, $8A, $F0, $24, $C9, $70 +db $F0, $20, $C9, $40, $F0, $1C, $C9, $5B +db $F0, $18, $C9, $03, $F0, $14, $C9, $05 +db $F0, $10, $C9, $07, $F0, $0C, $C9, $43 +db $F0, $08, $C9, $45, $F0, $04, $C9, $47 +db $D0, $04, $A9, $01, $85, $1D, $8B, $4B +db $AB, $BF, $F4, $D8, $00, $A8, $B9, $B1 +db $D1, $85, $00, $B9, $D2, $D0, $85, $01 +db $B9, $F3, $CF, $85, $02, $85, $05, $AB +db $C2, $31, $A2, $00, $00, $A0, $40, $00 +db $A5, $00, $20, $4F, $DF, $E2, $30, $6B + +endif + +pullpc +ActivateSubScreen: +{ + STZ.b $1D + + PHX + + REP #$20 ; Set A in 16bit mode + + LDA.b $8A : BNE .notForest + ; Check if we have the master sword. + LDA.l $7EF300 : AND.w #$0040 : BEQ .notForest + ; The forest canopy overlay + BRA .turnOn + + .notForest + + ; Check if we need to disable the rain in the misery mire. + LDA.l Pool_EnableRainMireEvent : BEQ .notMire + LDA.b $8A : CMP.w #$0070 : BNE .notMire + ; Has Misery Mire been triggered yet? + LDA.l $7EF2F0 : AND.w #$0020 : BNE .notMire + BRA .turnOn + + .notMire + + ; Check if we are in the beginning phase, if not, no rain. + ; If $7EF3C5 >= 0x02 + LDA.l $7EF3C5 : AND.w #$00FF : CMP.w #$0002 : BCS .noRain + BRA .turnOn + + .noRain + + ; Get the overlay value for this overworld area + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X : CMP.w #$00FF : BEQ .normal + ; If not $FF, assume we want an overlay. + + .turnOn + SEP #$20 ; Set A in 8bit mode + + ; Turn on BG1. + LDA.b #$01 : STA.b $1D + + .normal + + SEP #$20 ; Set A in 8bit mode + + PLX + + RTL +} +pushpc + +; ============================================================================== + +if !Func00EEBB = 1 + +; Zeros out the BG color when mirror warping to the pyramid area. +org $00EEBB ; $006EBB +Func00EEBB: +{ + ; TODO: probably not needed. + ; Check if we are warping to an area with the pyramid BG. + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X : CMP.w #$0096 : BNE .notHyruleCastle + ; This is annoying but I just needed a little bit of extra space. + JSL EraseBGColors + + .notHyruleCastle + + SEP #$20 ; Set A in 8bit mode + + LDA.b #$08 : STA.w $06BB + + STZ.w $06BA + + RTL +} +;warnpc $00EEE0 + +else + +; Undo the function above: +org $00EEBB ; $006EBB +db $A5, $8A, $C9, $1B, $00, $D0, $13, $A9 +db $00, $00, $8F, $00, $C3, $7E, $8F, $40 +db $C3, $7E, $8F, $00, $C5, $7E, $8F, $40 +db $C5. $7E, $E2, $20, $A9, $08, $8D, $BB +db $06, $9C, $BA, $06, $6B + +endif + +pullpc +EraseBGColors: +{ + LDA.w #$0000 : STA.l $7EC300 : STA.l $7EC340 : STA.l $7EC500 : STA.l $7EC540 + + RTL +} +pushpc + +; ============================================================================== + +if !Func00FF7C = 1 + +; Controls the BG scrolling for HC and the pyramid area. +org $00FF7C ; $007F7C +Func00FF7C: +{ + LDA.w $1C80 : ORA.w $1C90 : ORA.w $1CA0 : ORA.w $1CB0 : CMP.b $E2 : BNE .BRANCH_DELTA + SEP #$30 ; Set A, X, and Y in 8bit mode. + + STZ.b $9B + + INC.b $B0 + + JSL $0BFE70 ; $05FE70 IN ROM + + REP #$30 ; Set A, X, and Y in 16bit mode. + + ; Check if we are warping to an area with the pyramid BG. + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X : CMP.w #$0096 : BEQ .dont_align_bgs + LDA.b $E2 : STA.b $E0 : STA.w $0120 : STA.w $011E + LDA.b $E8 : STA.b $E6 : STA.w $0122 : STA.w $0124 + + .dont_align_bgs + .BRANCH_DELTA + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + RTL +} +;warnpc $00FFC0 ; This end point also uses up a null block at the end of the function. + +else + +; Undo the function above: +org $00FF7C ; $007F7C +db $AD, $80, $1C, $0D, $90, $1C, $0D, $A0 +db $1C, $0D, $B0, $1C, $C5, $E2, $D0, $28 +db $E2, $20, $64, $9B, $E6, $B0, $22, $70 +db $FE, $0B, $A5, $8A, $29, $3F, $C9, $1B +db $F0, $16, $C2, $20, $A5, $E2, $85, $E0 +db $8D, $20, $01, $8D, $1E, $01, $A5, $E8 +db $85, $E6, $8D, $22, $01, $8D, $24, $01 +db $E2, $30, $6B, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF + +endif + +; ============================================================================== + +if !Func0283EE = 1 + +; Replaces a bunch of calls to a shared function. +; Intro_SetupScreen: +org $028027 ; $010027 + JSR PreOverworld_LoadProperties_LoadMain_LoadMusicIfNeeded + +;warnpc $02802B + +; Dungeon_LoadSongBankIfNeeded: +org $029C0C ; $011C0C + JMP PreOverworld_LoadProperties_LoadMain_LoadMusicIfNeeded + +;warnpc $029C0F + +; Mirror_LoadMusic: +org $029D1E ; $011D1E + JSR PreOverworld_LoadProperties_LoadMain_LoadMusicIfNeeded + +;warnpc $029D21 + +; GanonEmerges_LOadPyramidArea: +org $029F82 ; $011F82 + JSR PreOverworld_LoadProperties_LoadMain_LoadMusicIfNeeded + +;warnpc $029F85 + +; Changes the function that loads overworld properties when exiting a dungeon. +; Includes removing asm that plays music in certain areas and changing how animated tiles are loaded. +; TODO: May need to add other funtionality here as well. +org $0283EE ; $0103EE +PreOverworld_LoadProperties_LoadMain: +{ + LDX.b #$F3 + + ; If the volume was set to half, set it back to full. + LDA.w $0132 : CMP.b #$F2 : BEQ .setToFull + ; If we're in the dark world + ; If area number is < 0x40 or >= 80 we are not in the dark world. + LDA.b $8A : CMP.b #$40 : BCC .setNormalSong + CMP.b #$80 : BCS .setNormalSong + ; Does Link have a moon pearl? + LDA.l $7EF357 : BNE .setNormalSong + ; If not, play the music that plays when you're a bunny in the Dark World. + LDX.b #$04 + + BRA .setToFull + + .setNormalSong + + LDX.b $8A + LDA.l $7F5B00, X : AND.b #$0F : TAX + + .setToFull + + ; The value written here will take effect during NMI. + STX.w $0132 + + ; Set the ambient sound. + ;LDX.b $8A + ;LDA.l $7F5B00, X : LSR #4 : STA.w $012D + + ; Load the animated tiles the area needs. + LDX.b $8A + + ; Do a 00 check just in case the data isn't present we don't get at crash. + LDA.l Pool_AnimatedTable, X : BNE .notZero + ; $5B is the defualt flower/water animated tiles value. + LDA.b #$5B + + .notZero + + ; The decompression function increases it by 1 so subtract 1 here. + DEC : TAY + + JSL DecompOwAnimatedTiles ; $5394 IN ROM + JSL InitTilesets ; $619B IN ROM; Decompress all other graphics + JSR Overworld_LoadAreaPalettes ; $014692 IN ROM; Load palettes for overworld + + LDX.b $8A + + LDA.l $7EFD40, X : STA.b $00 + + LDA.l $00FD1C, X + + JSL Overworld_LoadPalettes ; $0755A8 IN ROM; Load some other palettes + JSL Palette_SetOwBgColor_Long ; $075618 IN ROM; Sets the background color (changes depending on area) + + LDA.b $10 : CMP.b #$08 : BNE .specialArea2 + ; $01465F IN ROM; Copies $7EC300[0x200] to $7EC500[0x200] + JSR $C65F + + BRA .normalArea2 + + .specialArea2 + + ; apparently special overworld handles palettes a bit differently? + JSR $C6EB ; $0146EB IN ROM + + .normalArea2 + + JSL $0BFE70 ; $05FE70 IN ROM; Sets fixed colors and scroll values + + ; Something fixed color related + LDA.b #$00 : STA.l $7EC017 + + ; Sets up properties in the event a tagalong shows up + JSL Tagalong_Init + + ; TODO: investigate this. + LDA.b $8A : AND.b #$3F : BNE .notForestArea + LDA.b #$1E + + JSL GetAnimatedSpriteTile_variable + + .notForestArea + + LDA.b #$09 : STA.w $010C + + JSL Sprite_OverworldReloadAll ;09C499 + + ; Are we in the dark world? If so, there's no warp vortex there. + LDA.b $8A : AND.b #$40 : BNE .noWarpVortex + JSL Sprite_ReinitWarpVortex ; $04AF89 IN ROM + + .noWarpVortex + + ; Check if Blind disguised as a crystal maiden was following us when + ; we left the dungeon area + LDA.l $7EF3CC : CMP.b #$06 : BNE .notBlindGirl + ; If it is Blind, kill her! + LDA.b #$00 : STA.l $7EF3CC + + .notBlindGirl + + STZ.b $6C + STZ.b $3A + STZ.b $3C + STZ.b $50 + STZ.b $5E + STZ.w $0351 + + ; Reinitialize many of Link's gameplay variables + JSR $8B0C ; $010B0C IN ROM + + LDA.l $7EF357 : BNE .notBunny + LDA.l $7EF3CA : BEQ .notBunny + LDA.b #$01 : STA.w $02E0 : STA.b $56 + + LDA.b #$17 : STA.b $5D + + JSL LoadGearPalettes_bunny + + .notBunny + + ; Set screen to mode 1 with BG3 priority. + LDA.b #$09 : STA.b $94 + + LDA.b #$00 : STA.l $7EC005 + + STZ.w $046C + STZ.b $EE + STZ.w $0476 + + INC.b $11 + INC.b $16 + + STZ.w $0402 : STZ.w $0403 + + ; Alternate entry point. + .LoadMusicIfNeeded + + LDA.w $0136 : BEQ .no_music_load_needed + SEI + + ; Shut down NMI until music loads + STZ.w $4200 + + ; Stop all HDMA + STZ.w $420C + + STZ.w $0136 + + LDA.b #$FF : STA.w $2140 + + JSL Sound_LoadLightWorldSongBank + + ; Re-enable NMI and joypad + LDA.b #$81 : STA.w $4200 + + .no_music_load_needed + + ; PLACE CUSTOM GFX LOAD HERE! + JSL CheckForChangeGraphicsNormalLoadBoat + + RTS +} +;warnpc $02856A ; $01056A + +else + +; Undo the function above: +org $028027 ; $010027 + db $20, $4C, $85, $C2 + +org $029C0C ; $011C0C + db $4C, $4C, $85, $A5 + +org $029D1E ; $011D1E + db $20, $4C, $85 + +org $029F82 ; $011F82 + db $20, $4C, $85 + +org $0283EE ; $0103EE +db $A0, $58, $A2, $02, $A5, $8A, $C9, $03 +db $F0, $6F, $C9, $05, $F0, $6B, $C9, $07 +db $F0, $67, $A2, $09, $A5, $8A, $C9, $43 +db $F0, $5F, $C9, $45, $F0, $5B, $C9, $47 +db $F0, $57, $A0, $5A, $A5, $8A, $C9, $40 +db $B0, $3A, $A2, $07, $AF, $C5, $F3, $7E +db $C9, $03, $90, $02, $A2, $02, $A5, $A0 +db $C9, $E3, $F0, $3D, $C9, $18, $F0, $39 +db $C9, $2F, $F0, $35, $A5, $A0, $C9, $1F +db $D0, $06, $A5, $8A, $C9, $18, $F0, $29 +db $A2, $05, $AF, $00, $F3, $7E, $29, $40 +db $F0, $02, $A2, $02, $A5, $A0, $F0, $19 +db $C9, $E1, $F0, $15, $A2, $F3, $AD, $32 +db $01, $C9, $F2, $F0, $30, $A2, $02, $AF +db $C5, $F3, $7E, $C9, $02, $B0, $02, $A2 +db $03, $AF, $CA, $F3, $7E, $F0, $1E, $A2 +db $0D, $A5, $8A, $C9, $40, $F0, $0E, $C9 +db $43, $F0, $0A, $C9, $45, $F0, $06, $C9 +db $47, $F0, $02, $A2, $09, $AF, $57, $F3 +db $7E, $D0, $02, $A2, $04, $8E, $32, $01 +db $22, $94, $D3, $00, $22, $9B, $E1, $00 +db $20, $92, $C6, $A6, $8A, $BF, $40, $FD +db $7E, $85, $00, $BF, $1C, $FD, $00, $22 +db $A8, $D5, $0E, $22, $18, $D6, $0E, $A5 +db $10, $C9, $08, $D0, $05, $20, $5F, $C6 +db $80, $03, $20, $EB, $C6, $22, $70, $FE +db $0B, $A9, $00, $8F, $17, $C0, $7E, $22 +db $FC, $9E, $09, $A5, $8A, $29, $3F, $D0 +db $06, $A9, $1E, $22, $ED, $D4, $00, $A9 +db $09, $8D, $0C, $01, $22, $99, $C4, $09 +db $A5, $8A, $29, $40, $D0, $04, $22, $89 +db $AF, $09, $A2, $05, $AF, $C5, $F3, $7E +db $C9, $02, $B0, $02, $A2, $01, $8E, $2D +db $01, $AF, $CC, $F3, $7E, $C9, $06, $D0 +db $06, $A9, $00, $8F, $CC, $F3, $7E, $64 +db $6C, $64, $3A, $64, $3C, $64, $50, $64 +db $5E, $9C, $51, $03, $20, $0C, $8B, $AF +db $57, $F3, $7E, $D0, $15, $AF, $CA, $F3 +db $7E, $F0, $0F, $A9, $01, $8D, $E0, $02 +db $85, $56, $A9, $17, $85, $5D, $22, $DD +db $D6, $0E, $A9, $09, $85, $94, $A9, $00 +db $8F, $05, $C0, $7E, $9C, $6C, $04, $64 +db $EE, $9C, $76, $04, $E6, $11, $E6, $16 +db $9C, $02, $04, $9C, $03, $04, $AD, $36 +db $01, $F0, $18, $78, $9C, $00, $42, $9C +db $0C, $42, $9C, $36, $01, $A9, $FF, $8D +db $40, $21, $22, $13, $89, $00, $A9, $81 +db $8D, $00, $42, $60 + +endif + + +; ============================================================================== + +if !Func028632 = 1 + +; Changes a function that loads animated tiles under certain conditions. +org $028632 ; $010632 +Func028632: +{ + ; Load the animated tiles the area needs. + LDX.b $8A + + ; Do a 00 check just in case the data isn't present we don't get at crash. + LDA.l Pool_AnimatedTable, X : BNE .notZero + ; $5B is the defualt flower/water animated tiles value. + LDA.b #$5B + + .notZero + + ; The decompression function increases it by 1 so subtract 1 here. + DEC : TAY + + JSL DecompOwAnimatedTiles ; $5394 IN ROM + + LDA.b $11 : LSR A : TAX + + LDA.l $0285E2, X : STA.w $0AA3 + + LDA.l $0285F3, X : PHA + + JSL InitTilesets ; $619B IN ROM + JSR Overworld_LoadAreaPalettes ; $014692 IN ROM ; Load Palettes + + PLA : STA.b $00 + + LDX.b $8A + + LDA.l $00FD1C, X + + JSL Overworld_LoadPalettes ; $0755A8 IN ROM + + LDA.b #$01 : STA.w $0AB2 + + JSL Palette_Hud ; $0DEE52 IN ROM + + LDA.l $11 : BNE .BRANCH_4 + JSL CopyFontToVram ; $006556 IN ROM + + .BRANCH_4 + + JSR $C65F ; $01465F IN ROM + JSL $0BFE70 ; $05FE70 IN ROM + + LDA.l $8A : CMP.b #$80 : BCC .BRANCH_5 + JSL Palette_SetOwBgColor_Long ; $075618 IN ROM + + .BRANCH_5 + + LDA.b #$09 : STA.b $94 + + INC.b $B0 + + RTS +} +;warnpc $028697 + +else + +; Undo the function above: +org $028632 ; $010632 +db $A0, $58, $A5, $8A, $29, $BF, $C9, $03 +db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 +db $F0, $02, $A0, $5A, $22, $94, $D3, $00 +db $A5, $11, $4A, $AA, $BF, $E2, $85, $02 +db $8D, $A3, $0A, $BF, $F3, $85, $02, $48 +db $22, $9B, $E1, $00, $20, $92, $C6, $68 +db $85, $00, $A6, $8A, $BF, $1C, $FD, $00 +db $22, $A8, $D5, $0E, $A9, $01, $8D, $B2 +db $0A, $22, $52, $EE, $1B, $A5, $11, $D0 +db $04, $22, $56, $E5, $00, $20, $5F, $C6 +db $22, $70, $FE, $0B, $A5, $8A, $C9, $80 +db $90, $04, $22, $18, $D6, $0E, $A9, $09 +db $85, $94, $E6, $B0, $60 + +endif + +; ============================================================================== + +if !Func029AA6 = 1 + +; Changes part of a function that changes the special BG color when leaving dungeons? not sure. +org $029AA6 ; $011AA6 +Func029AA6: +{ + ; Setup fixed color values based on area number + LDX.w #$4C26 + LDY.w #$8C4C + + ; TODO: Wtf why is this 0x00? + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X + + ; Check for LW death mountain. + CMP.w #$0095 : BEQ .mountain + LDX.w #$4A26 : LDY.w #$874A + + ; Check for DW death mountain. + CMP.w #$009C : BEQ .mountain + BRA .other + + .mountain + + STX.b $9C : STY.b $9D + + .other + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + RTS +} +;warnpc $029AD3 + +else + +; Undo the function above: +org $029AA6 ; $011AA6 +db $A5, $8A, $C9, $03, $00, $F0, $1F, $C9 +db $05, $00, $F0, $1A, $C9, $07, $00, $F0 +db $15, $A2, $26, $4A, $A0, $4A, $87, $C9 +db $43, $00, $F0, $0A, $C9, $45, $00, $F0 +db $05, $C9, $47, $00, $D0, $04, $86, $9C +db $84, $9D, $E2, $30, $60 + +endif + +; ============================================================================== + +if !Func02AF58 = 1 + +; Main subscreen overlay loading function. Changed so that they will load +; from a table. This does not change the event overlays like the lost woods +; changing to the tree canopy, the master sword area or the misery mire rain. +; This also does not change the overlay for under the bridge because it shares +; an area with the master sword. +org $02AF58 ; $012F58 +Func02AF58: +{ + SEP #$20 ; Set A in 8bit mode + + ; Check to see if we are using the mirror so that our $A0 doesn't accidentally + ; persist and we trigger rain sounds when we don't want them. + LDA.b $11 : CMP.b #$23 : BEQ .mirrorWarp + CMP.b #$24 : BEQ .mirrorWarp + CMP.b #$2C : BEQ .mirrorWarp + ; We can't warp to or from a special area anyway so this is fine. + + REP #$20 ; Set A in 16bit mode + + ; Check to see if we are in a SW overworld area. + LDA.b $8A : CMP.w #$0080 : BCC .notExtendedArea + + ; $0182 is the exit room number used for getting to Zora's Domain. + LDA.b $A0 : CMP.w #$0182 : BNE .notZoraFalls + SEP #$20 ; Set A in 8bit mode + + ; Play rain (waterfall) sound. + LDA.b #$01 : STA.w $012D ; TODO: Write a patch to change/disable this. + + REP #$20 ; Set A in 16bit mode + + .notZoraFalls + + ; Check for exit rooms (the faked way of getting from one overworld area to another). + ; $0180 is the exit room number used for getting into the mastersword area. + LDA.b $A0 : CMP.w #$0180 : BNE .notMasterSwordArea + ; If the Master sword is retrieved, don't do the mist overlay. + LDA.l $7EF300 : AND.w #$0040 : BNE .masterSwordRecieved + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X : TAX + + .loadOverlayShortcut + + ; Save the overlay for later + PHX + + JMP .loadSubScreenOverlay + + .masterSwordRecieved + + ; TODO: Write a patch to change what overlay is loaded here? + BRA .noSubscreenOverlay + + .notMasterSwordArea + + ; TODO: Write a patch to change what overlay is loaded here? + ; The second mastersword/under the bridge area. + LDX.w #$0094 + + ; $0181 is the exit room number used for getting into the under the bridge area. + LDA.b $A0 : CMP.w #$0181 : BEQ .loadOverlayShortcut + ; TODO: Write a patch to change what overlay is loaded here? + ; The second Triforce room area. + LDX.w #$0093 + + ; $0189 is the exit room number used for getting to the Triforce room. + CMP.w #$0189 : BEQ .loadOverlayShortcut + .noSubscreenOverlay + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + STZ.b $1D + + INC.b $11 + + RTS + + .notExtendedArea + .mirrorWarp + + REP #$20 ; Set A in 16bit mode + + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X : TAX + + LDA.b $8A : BNE .notForest + ; Check if we have the master sword. + LDA.l $7EF300 : AND.w #$0040 : BEQ .notForest + ; TODO: Write a patch to change this? + ; The forest canopy overlay + LDX.w #$009E + + .notForest + + ; Check if we need to disable the rain in the misery mire + LDA.l Pool_EnableRainMireEvent : BEQ .notMire + LDA.b $8A : CMP.w #$0070 : BNE .notMire + ; Has Misery Mire been triggered yet? + LDA.l $7EF2F0 : AND.w #$0020 : BNE .notMire + ; The rain overlay + LDX.w #$009F + + SEP #$20 ; Set A in 8bit mode + + ; Load the rain sound effect. + ; This is done here because of some jank in the vanilla code in this function + ; a bit further down. Basically it loads the overlay's ambient sound instead + ; of the acutal areas, which only seems to benefit us here. + LDA.b #$01 : STA $012D + + REP #$20 ; Set A in 16bit mode + + .notMire + + ; Check if we are in the beginning phase, if not, no rain. + ; If $7EF3C5 >= 0x02 + LDA.l Pool_EnableBeginningRain : BEQ .noRain + LDA.l $7EF3C5 : AND.w #$00FF : CMP.w #$0002 : BCS .noRain + ; The rain overlay + LDX.w #$009F + + .noRain + + ; Store the overlay for later. + PHX + + ; If the value is 0xFF that means we didn't set any overlay so load the pyramid one by default. + CPX.w #$00FF : BNE .notFF + ; The pyramid background + LDX.w #$0096 + + .notFF + + ; $01300B ALTERNATE ENTRY POINT ; TODO: Verify this. If it is an alternate entry I can't find where it is referenced anywhere. + .loadSubScreenOverlay + STY.b $84 + + STX.b $8A : STX.b $8C + + LDA.b $84 : SEC : SBC.w #$0400 : AND.w #$0F80 : ASL A : XBA : STA.b $88 + + LDA.b $84 : SEC : SBC.w #$0010 : AND.w #$003E : LSR A : STA.b $86 + + STZ.w $0418 : STZ.w $0410 : STZ.w $0416 + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + ; Color +/- buffered register. + LDA.b #$82 : STA.b $99 + + ; Puts OBJ, BG2, and BG3 on the main screen + LDA.b #$16 : STA.b $1C + + ; Puts BG1 on the subscreen + LDA.b #$01 : STA.b $1D + + ; Pull the 16 bit overlay from earlier and just discard the high byte. + PLX : PLA + + ; One possible configuration for $2131 (CGADSUB) + LDA.b #$72 + + ; Comparing different screen types + CPX.b #$97 : BEQ .loadOverlay ; Fog 1 + CPX.b #$94 : BEQ .loadOverlay ; Master sword/bridge 2 + CPX.b #$93 : BEQ .loadOverlay ; Triforce room 2 + CPX.b #$9D : BEQ .loadOverlay ; Fog 2 + CPX.b #$9E : BEQ .loadOverlay ; Tree canopy + CPX.b #$9F : BEQ .loadOverlay ; Rain + ; alternative setting for CGADSUB (only background is enabled on subscreen) + LDA.b #$20 + + CPX.b #$95 : BEQ .loadOverlay ; Sky + CPX.b #$9C : BEQ .loadOverlay ; Lava + CPX.b #$96 : BEQ .loadOverlay ; Pyramid BG + LDX.b $11 + + CPX.b #$23 : BEQ .loadOverlay ; TODO: Investigate what these checks are for. + CPX.b #$2C : BEQ .loadOverlay + STZ.b $1D + + .loadOverlay + + ; apply the selected settings to CGADSUB's mirror ($9A) + STA.b $9A + + JSR LoadSubscreenOverlay + + ; This is the "under the bridge" area. + LDA.b $8C : CMP.b #$94 : BNE .notUnderBridge + ; All this is doing is setting the X coordinate of BG1 to 0x0100 + ; Rather than 0x0000. (this area usees the second half of the data only, similar to the master sword area. + LDA.b $E7 : ORA.b #$01 : STA.b $E7 + + .notUnderBridge + + REP #$20 ; Set A in 16bit mode + + ; We were pretending to be in a different area to load the subscreen + ; overlay, so we're restoring all those settings. + LDA.l $7EC213 : STA.b $8A + LDA.l $7EC215 : STA.b $84 + LDA.l $7EC217 : STA.b $88 + LDA.l $7EC219 : STA.b $86 + + LDA.l $7EC21B : STA.w $0418 + LDA.l $7EC21D : STA.w $0410 + LDA.l $7EC21F : STA.w $0416 + + SEP #$20 ; Set A in 8bit mode + + RTS +} +;warnpc $02B0D2 ; $0130D2 + +else + +; Undo the function above: +org $02AF58 ; $012F58 +db $A5, $8A, $C9, $80, $00, $90, $44, $A2 +db $97, $00, $A5, $A0, $C9, $80, $01, $D0 +db $12, $A2, $80, $00, $BF, $80, $F2, $7E +db $A2, $97, $00, $29, $40, $00, $D0, $24 +db $4C, $0B, $B0, $A2, $94, $00, $C9, $81 +db $01, $F0, $F5, $A2, $93, $00, $C9, $89 +db $01, $F0, $ED, $C9, $82, $01, $F0, $05 +db $C9, $83, $01, $D0, $07, $E2, $30, $A9 +db $01, $8D, $2D, $01, $E2, $30, $64, $1D +db $E6, $11, $60, $29, $3F, $00, $D0, $1B +db $A5, $8A, $29, $40, $00, $D0, $0F, $A2 +db $80, $00, $BF, $80, $F2, $7E, $A2, $9E +db $00, $29, $40, $00, $D0, $4D, $A2, $9D +db $00, $80, $48, $A2, $95, $00, $A5, $8A +db $C9, $03, $00, $F0, $3E, $C9, $05, $00 +db $F0, $39, $C9, $07, $00, $F0, $34, $A2 +db $9C, $00, $C9, $43, $00, $F0, $2C, $C9 +db $45, $00, $F0, $27, $C9, $47, $00, $F0 +db $22, $C9, $70, $00, $D0, $0B, $AF, $F0 +db $F2, $7E, $29, $20, $00, $D0, $14, $80 +db $0F, $A2, $96, $00, $AF, $C5, $F3, $7E +db $29, $FF, $00, $C9, $02, $00, $B0, $03 +db $A2, $9F, $00, $84, $84, $86, $8A, $86 +db $8C, $A5, $84, $38, $E9, $00, $04, $29 +db $80, $0F, $0A, $EB, $85, $88, $A5, $84 +db $38, $E9, $10, $00, $29, $3E, $00, $4A +db $85, $86, $9C, $18, $04, $9C, $10, $04 +db $9C, $16, $04, $E2, $30, $A9, $82, $85 +db $99, $A9, $16, $85, $1C, $A9, $01, $85 +db $1D, $DA, $A6, $8A, $BF, $00, $5B, $7F +db $4A, $4A, $4A, $4A, $8D, $2D, $01, $FA +db $A9, $72, $E0, $97, $F0, $39, $E0, $94 +db $F0, $35, $E0, $93, $F0, $31, $E0, $9D +db $F0, $2D, $E0, $9E, $F0, $29, $E0, $9F +db $F0, $25, $A9, $20, $E0, $95, $F0, $1F +db $E0, $9C, $F0, $1B, $AF, $13, $C2, $7E +db $AA, $A9, $20, $E0, $5B, $F0, $10, $E0 +db $1B, $D0, $0A, $A6, $11, $E0, $23, $F0 +db $06, $E0, $2C, $F0, $02, $64, $1D, $85 +db $9A, $20, $0D, $FD, $A5, $8C, $C9, $94 +db $D0, $06, $A5, $E7, $09, $01, $85, $E7 +db $C2, $20, $AF, $13, $C2, $7E, $85, $8A +db $AF, $15, $C2, $7E, $85, $84, $AF, $17 +db $C2, $7E, $85, $88, $AF, $19, $C2, $7E +db $85, $86, $AF, $1B, $C2, $7E, $8D, $18 +db $04, $AF, $1D, $C2, $7E, $8D, $10, $04 +db $AF, $1F, $C2, $7E, $8D, $16, $04, $E2 +db $20, $60 + +endif + +; ============================================================================== + +if !Func02B2D4 = 1 + +; Turns on the subscreen if the pyramid is loaded. +org $02B2D4 ; $0132D4 +Func02B2D4: +{ + JSR Overworld_LoadSubscreenAndSilenceSFX1 ; $012F19 IN ROM + + ; Just because we are a few bytes short. Actually jk I don't think this is needed at all. + ; It seems to be handled elsewhere. + ;JSL EnableSubScreenCheck + + RTL +} +;warnpc $02B2E6 ; $0132E6 + +else + +; Undo the function above: +org $02B2D4 ; $0132D4 +db $20, $19, $AF, $A5, $8A, $C9, $1B, $F0 +db $04, $C9, $5B, $D0, $04, $A9, $01, $85 +db $1D, $6B + +endif + +pullpc +EnableSubScreenCheck: +{ + REP #$20 ; Set A in 16bit mode + + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X + + CMP.w #$0096 : BNE .notPyramidOrCastle + SEP #$20 ; Set A in 8bit mode + LDA.b #$01 : STA.b $1D + + .notPyramidOrCastle + + SEP #$20 ; Set A in 8bit mode + + RTL +} +pushpc + +; ============================================================================== + +if !Func02B3A1 = 1 + +; Handles activating the subscreen and special BG color when warping to an area with the pyramid BG. +org $02B3A1 ; $0133A1 +Func02B3A1: +{ + ; Oh look at that we can just use this same function lucky us. + ; TODO: May not be needed anymore. + JSL EnableSubScreenCheck + + REP #$20 ; Set A in 16bit mode. + + LDX.b #$00 + + LDA.w #$7FFF + + ; TODO: Warp to pyramid bg fade bug is here. + .setBgPalettesToWhite + STA.l $7EC540, X + STA.l $7EC560, X + STA.l $7EC580, X + + STA.l $7EC5A0, X + STA.l $7EC5C0, X + STA.l $7EC5E0, X + + INX #2 : CPX.b #$20 : BNE .setBgPalettesToWhite + + ; Also set the background color to white. + STA.l $7EC500 + + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X + + ; This sets the color to transparent so that we don't see an additional + ; white layer on top of the pyramid bg. + CMP.w #$0096 : BNE .notPyramidOfPower + LDA.w #$0000 : STA.l $7EC500 : STA.l $7EC540 + + .notPyramidOfPower + + SEP #$20 ; Set A in 8bit mode + + JSL Sprite_ResetAll + JSL Sprite_OverworldReloadAll + JSL $07B107 ; $03B107 IN ROM + JSR $8B0C ; $010B0C IN ROM + + LDA.b #$14 : STA.b $5D + + LDA.b $8A : AND.b #$40 : BNE .darkWorld + JSL Sprite_ReinitWarpVortex + + .darkWorld + + RTL +} +;warnpc $02B40A ; $01340A + +else + +; Undo the function above: +org $02B3A1 ; $0133A1 +db $A5, $8A, $C9, $1B, $F0, $04, $C9, $5B +db $D0, $04, $A9, $01, $85, $1D, $C2, $20 +db $A2, $00, $A9, $FF, $7F, $9F, $40, $C5 +db $7E, $9F, $60, $C5, $7E, $9F, $80, $C5 +db $7E, $9F, $A0, $C5, $7E, $9F, $C0, $C5 +db $7E, $9F, $E0, $C5, $7E, $E8, $E8, $E0 +db $20, $D0, $E2, $8F, $00, $C5, $7E, $A5 +db $8A, $C9, $5B, $00, $D0, $0B, $A9, $00 +db $00, $8F, $00, $C5, $7E, $8F, $40, $C5 +db $7E, $E2, $20, $22, $4E, $C4, $09, $22 +db $99, $C4, $09, $22, $07, $B1, $07, $20 +db $0C, $8B, $A9, $14, $85, $5D, $A5, $8A +db $29, $40, $D0, $04, $22, $89, $AF, $09 +db $6B + +endif + +; ============================================================================== + +if !Func02BC44 = 1 + +; Controls overworld vertical subscreen movement for the pyramid BG. +org $02BC44 ; $013C44 +Func02BC44: +{ + ; TODO: I had a single nop here for some reason. Verify that we don't actually need it. + JSL ReadOverlayArray : CMP.w #$0096 : BNE .BRANCH_IOTA + JSL BGControl + BRA .BRANCH_IOTA + + ;warnpc $02BC60 ; $013C60 + + org $02BC60 ; $013C60 + .BRANCH_IOTA +} +;warnpc $02BC60 + +else + +; Undo the function above: +org $02BC44 ; $013C44 +db $A5, $8A, $29, $3F, $00, $C9, $1B, $00 +db $D0, $12, $A9, $00, $06, $C5, $E6, $90 +db $02, $85, $E6, $A9, $C0, $06, $C5, $E6 +db $B0, $02, $85, $E6 + +endif + +pullpc +ReadOverlayArray: +{ + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X + + RTL +} + +BGControl: +{ + ; TODO: These comparison values will need to be calulated somehow or set + ; depending on the area. Right now they are hardcoded to work with the + ; pyramid area. + + ; Check link's Y position. This will need to be changed per area and per need. + LDA.b $20 : CMP.w #$08E0 : BCC .startShowingMountains + ; Lock the position so that nothing shows through the trees + LDA.w #$06C0 : STA.b $E6 + + RTL + + .startShowingMountains + + ; Don't let the BG scroll down further than the "top" of the bg when walking up. + LDA.w #$0600 : CMP.b $E6 : BCC .dontLock ; #$0600 + STA.b $E6 + + .dontLock + + ; Don't let the BG scroll up further than the "bottom" of the bg when walking down. + LDA.w #$06C0 : CMP.b $E6 : BCS .dontLock2 ; #$06C0 + STA.b $E6 ; $TODO: I had this at $E2 for some reason. + + .dontLock2 + + RTL +} +pushpc + +; ============================================================================== + +if !Func02C02D = 1 + +; Changes how the pyramid BG scrolls durring transition. +org $02C02D ; $01402D +Func02C02D: +{ + PHA + JSL ReadOverlayArray2 + PLA + + CPY.b #$96 : BEQ .dontMoveBg1 + ; TODO: This may or not be needed. + ; It shifts the BG over by a half small area's width. I think this is to line up the + ; mountain with the tower in the distance at the appropriate location when coming into + ; the pyramid area from the right. + STA.b $E0, X + + .dontMoveBg1 +} +;warnpc $02C039 ; $014039 + +else + +; Undo the function above: +org $02C02D ; $01402D +db $A4, $8A, $C0, $1B, $F0, $06, $C0, $5B +db $F0, $02, $95, $E0 + +endif + +pullpc +ReadOverlayArray2: +{ + PHX + + ; A is already 16 bit here. + REP #$10 ; Set X and Y in 16bit mode. + + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X + TAY + + SEP #$10 ; Set X and Y in 8bit mode. + + PLX + + RTL +} +pushpc + +; ============================================================================== + +if !Func02C692 = 1 + +; Replaces a call to a shared function. Normally this is goes to .lightworld to change the main color palette manually but we change it here so that it just uses the same table as everything else. +org $02A07A ; $01207A + JSR Overworld_LoadAreaPalettes + +;warnpc $02A07D ; $01207D + +; The main overworld palette loading routine un-hardcoded to load the custom main palette. +org $02C692 ; $014692 +Overworld_LoadAreaPalettes: +{ + LDX.b $8A + LDA.l Pool_MainPaletteTable, X + + ; $0AB3 = 0 - LW 1 - DW, 2 - LW death mountain, 3 - DW death mountain, 4 - triforce room + STA.w $0AB3 + + STZ.w $0AA9 + + JSL Palette_MainSpr ; $0DEC9E IN ROM; load SP1 through SP4 + JSL Palette_MiscSpr ; $0DED6E IN ROM; load SP0 (2nd half) and SP6 (2nd half) + JSL Palette_SpriteAux1 ; $0DECC5 IN ROM; load SP5 (1st half) + JSL Palette_SpriteAux2 ; $0DECE4 IN ROM; load SP6 (1st half) + JSL Palette_Sword ; $0DED03 IN ROM; load SP5 (2nd half, 1st 3 colors), which is the sword palette + JSL Palette_Shield ; $0DED29 IN ROM; load SP5 (2nd half, next 4 colors), which is the shield + JSL Palette_ArmorAndGloves ; $0DEDF9 IN ROM; load SP7 (full) Link's whole palette, including Armor + + LDX.b #$01 + + ; Changes the Palette_SpriteAux3 load depending on if we are in the LW or not. Will probably need it own custom table? not sure. + LDA.l $7EF3CA : AND.b #$40 : BEQ .lightWorld2 + LDX.b #$03 + + .lightWorld2 + + STX.w $0AAC + + JSL Palette_SpriteAux3 ; $0DEC77 IN ROM; load SP0 (first half) (or SP7 (first half)) + JSL Palette_Hud ; $0DEE52 IN ROM; load BP0 and BP1 (first halves) + JSL Palette_OverworldBgMain ; $0DEEC7 IN ROM; load BP2 through BP5 (first halves) + + RTS +} +;warnpc $02C6EB ; $0146EB + +else + +; Undo the function above: +org $02A07A ; $01207A +db $20, $AD, $C6 + +org $02C692 ; $14692 +db $A2, $02, $A5, $8A, $29, $3F, $C9, $03 +db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 +db $F0, $02, $A2, $00, $A5, $8A, $29, $40 +db $F0, $01, $E8, $8E, $B3, $0A, $9C, $A9 +db $0A, $22, $9E, $EC, $1B, $22, $6E, $ED +db $1B, $22, $C5, $EC, $1B, $22, $E4, $EC +db $1B, $22, $03, $ED, $1B, $22, $29, $ED +db $1B, $22, $F9, $ED, $1B, $A2, $01, $AF +db $CA, $F3, $7E, $29, $40, $F0, $02, $A2 +db $03, $8E, $AC, $0A, $22, $77, $EC, $1B +db $22, $52, $EE, $1B, $22, $C7, $EE, $1B +db $60 + +endif + +; ============================================================================== + +if !Func02A4CD = 1 + +; Rain animation code. Just replaces a single check that checks for the +; misery mire to instead check the current overlay to see if it's rain. +org $02A4CD ; $0124CD +RainAnimation: +{ + LDA.b $8C : CMP.b #$9F : BEQ .rainOverlaySet + ; Check the progress indicator + LDA.l $7EF3C5 : CMP.b #$02 : BRA .skipMovement + .rainOverlaySet + + ; If misery mire has been opened already, we're done. + ;LDA.l $7EF2F0 : AND.b #$20 : BNE .skipMovement + ; Check the frame counter. + ; On the third frame do a flash of lightning. + LDA.b $1A + + CMP.b #$03 : BEQ .lightning ; On the 0x03rd frame, cue the lightning. + CMP.b #$05 : BEQ .normalLight ; On the 0x05th frame, normal light level. + CMP.b #$24 : BEQ .thunder ; On the 0x24th frame, cue the thunder. + CMP.b #$2C : BEQ .normalLight ; On the 0x2Cth frame, normal light level. + CMP.b #$58 : BEQ .lightning ; On the 0x58th frame, cue the lightning. + CMP.b #$5A : BNE .moveOverlay ; On the 0x5Ath frame, normal light level. + + .normalLight + + ; Keep the screen semi-dark. + LDA.b #$72 + + BRA .setBrightness + + .thunder + + ; Play the thunder sound when outdoors. + LDX.b #$36 : STX.w $012E + + .lightning + + LDA.b #$32 ; Make the screen flash with lightning. + + .setBrightness + + STA.b $9A + + .moveOverlay + + ; Overlay is only moved every 4th frame. + LDA.b $1A : AND.b #$03 : BNE .skipMovement + LDA.w $0494 : INC A : AND.b #$03 : STA.w $0494 : TAX + + LDA.b $E1 : CLC : ADC.l $02A46D, X : STA.b $E1 + LDA.b $E7 : CLC : ADC.l $02A471, X : STA.b $E7 + + .skipMovement + + RTL +} +;warnpc $02A52D ; $01252D + +else + +; Undo the function above: +org $02A4CD ; $0124CD +db $A5, $8A, $C9, $70, $F0, $08, $AF, $C5 +db $F3, $7E, $C9, $02, $B0, $51, $AF, $F0 +db $F2, $7E, $29, $20, $D0, $49, $A5, $1A +db $C9, $03, $F0, $1D, $C9, $05, $F0, $10 +db $C9, $24, $F0, $10, $C9, $2C, $F0, $08 +db $C9, $58, $F0, $0D, $C9, $5A, $D0, $0D +db $A9, $72, $80, $07, $A2, $36, $8E, $2E +db $01, $A9, $32, $85, $9A, $A5, $1A, $29 +db $03, $D0, $1C, $AD, $94, $04, $1A, $29 +db $03, $8D, $94, $04, $AA, $A5, $E1, $18 +db $7F, $6D, $A4, $02, $85, $E1, $A5, $E7 +db $18, $7F, $71, $A4, $02, $85, $E7, $6B + +endif + +; ============================================================================== + +if !Func02AADB = 1 + +; Main Mosaic Hook. Changes it to use a table instead of hardcoded to the woods areas. +org $02AADB ; $012ADB + JML MosaicAreaCheck + +;warnpc $02AADF ; $012ADF + +else + +; Undo the function above: +org $02AADB ; $012ADB +db $29, $3F, $F0, $06 + +endif + +pullpc +MosaicAreaCheck: +{ + PHB : PHK : PLB + + ; Check if the area we are in needs a mosaic. + TAX + LDA.l Pool_MosaicTable, X + + BEQ .noMosaic1 + PLB + JML $02AAE5 + + .noMosaic1 + + ; Check if the area we are going to needs a mosaic. + LDX.b $8A + LDA.l Pool_MosaicTable, X + + BEQ .noMosaic2 + PLB + JML $02AAE5 + + .noMosaic2 + + PLB + JML $02AAF4 +} +pushpc + +; ============================================================================== + +if !Func02ABB8 = 1 + +org $02ABB8 ; $012BB8 + JML CheckForChangeGraphicsTransitionLoad + +;warnpc $02ABBC ; $012BBC + +else + +; Undo the function above: +org $02ABB8 ; $012BB8 +db $A9, $09, $80, $02 + +endif + +; Loads the animated tiles after most of the transition gfx changes take place. +pullpc +CheckForChangeGraphicsTransitionLoad: +{ + PHB : PHK : PLB + + ; Are we currently in a mosaic? + LDA.b $11 : CMP.b #$0F : BEQ .mosaic + ; Are we entering a special area? + CMP.b #$1A : BEQ .mosaic + ; Are we leaving a special area? + CMP.b #$26 : BEQ .mosaic + ; Just a normal transition, Not a mosaic. + LDA.l Pool_EnableAnimated : BEQ .dontUpdateAnimated1 + ; Check to see if we need to update the animated tiles by checking what was previously loaded. + LDX.b $8A + LDA.l Pool_AnimatedTable, X : CMP.w AnimatedTileGFXSet : BEQ .dontUpdateAnimated1 + STA.w AnimatedTileGFXSet : DEC : TAY + + JSL DecompOwAnimatedTiles ; This forces the game to update the animated tiles when going from one area to another. + + .dontUpdateAnimated1 + + LDA.l Pool_EnableMainPalette : BEQ .dontUpdateMain1 + ; Check to see if we need to update the main palette by checking + ; what was previously loaded. + LDX.b $8A + LDA.l Pool_MainPaletteTable, X : CMP.w $0AB3 : BEQ .dontUpdateMain1 + STA.w $0AB3 + + ; Run the modified routine that loads the buffer and normal color ram. + JSL Palette_OverworldBgMain2 + + .dontUpdateMain1 + + LDA.l Pool_EnableBGColor : BEQ .dontUpdateBGColor1 + REP #$30 ; Set A, X, and Y in 16bit mode. + + LDA.b $8A : ASL : TAX ; Get area code and times it by 2 + + LDA.l Pool_BGColorTable, X ; Where ZS saves the array of palettes + STA.l $7EC300 : STA.l $7EC500 : STA.l $7EC540 : STA.l $7EC340 + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + ; TODO: Verify that this won't cause any other bugs. Don't update the CRAM + ; until later when the overlays are loaded so that way the BG overlays have + ; a chance to hide the cracks. + ;INC.b $15 ; trigger the buffer into the CGRAM. + + .dontUpdateBGColor1 + + LDA.b #$09 ; Replaced code. + + PLB + + JML Overworld_FinishTransGfx_firstHalf + + .mosaic + + ; Check to see if we need to update the animated tiles by checking what was previously loaded. + LDX.b $8A + LDA.l Pool_AnimatedTable, X : CMP.w AnimatedTileGFXSet : BEQ .dontUpdateAnimated2 + ; Do a 00 check just in case the data isn't present we don't get at crash. + CMP.b #$00 : BNE .notZero + ; $5B is the defualt flower/water animated tiles value. + LDA.b #$5B + + .notZero + + STA.w AnimatedTileGFXSet : DEC : TAY + + JSL DecompOwAnimatedTiles ; This forces the game to update the animated tiles when going from one area to another. + + .dontUpdateAnimated2 + + ; Check to see if we need to update the main palette by checking + ; what was previously loaded. + LDX.b $8A + LDA.l Pool_MainPaletteTable, X : CMP.w $0AB3 : BEQ .dontUpdateMain2 + STA.w $0AB3 + + ; Run the vanilla routine that only loads the buffer. + JSL Palette_OverworldBgMain + + .dontUpdateMain2 + + REP #$30 ; Set A, X, and Y in 16bit mode. + + LDA.b $8A : ASL : TAX ; Get area code and times it by 2 + + LDA.l Pool_BGColorTable, X ; Where ZS saves the array of palettes + STA.l $7EC300 : STA.l $7EC340 ;set transparent color ; only set the buffer so it fades in right during mosaic transition. + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + ;INC.b $15 ; trigger the buffer into the CGRAM + + LDA.b #$09 ; Replaced code. + + ; PLACE CUSTOM GFX LOAD HERE! + ; JML CheckForChangeGraphicsTransitionLoadCastle + + CheckForChangeGraphicsTransitionLoadRetrun: + + PLB + + JML Overworld_FinishTransGfx_firstHalf + + SkipOverworld_FinishTransGfx_firstHalf: + + PLB + + JML $02ABC3 ; $012BC3 skips Overworld_FinishTransGfx_firstHalf +} + +; The following 2 functions are copied from the palettes.asm but they only copied colors +; into the buffer so these copy colors into the normal ram as well. +Palette_OverworldBgMain2: +{ + REP #$21 + + LDA.w $0AB3 : ASL A : TAX + + LDA.l $1BEC3B, X : ADC.w #$E6C8 : STA.b $00 + + REP #$10 + + ; Target BP2 through BP6 (first halves) + ; each palette has 7 colors + ; Load 5 palettes + LDA.w #$0042 + LDX.w #$0006 + LDY.w #$0004 + + JSR Palette_MultiLoad2 + + SEP #$30 + + RTL +} + +Palette_MultiLoad2: +{ + ; Description: Generally used to load multiple palettes for BGs. + ; Upon close inspection, one sees that this algorithm is almost the same as the + ; last subroutine. + ; Name = Palette_MultiLoad(A, X, Y) + + ; Parameters: X = (number of colors in the palette - 1) + ; A = offset to add to $7EC300, in other words, where to write in palette + ; memory + ; Y = (number of palettes to load - 1) + ; + + STA.b $04 ; Save the values for future reference. + STX.b $06 + STY.b $08 + + LDA.w #$001B ; The absolute address at $00 was planted in the calling function. This value + ; is the bank #$1B ( => D in Rom) The address is found from $0AB6 + STA.b $02 ; And of course, store it at $02 + + .nextPalette + ; $0AA8 + A parameter will be the X value. + LDA.w $0AA8 : CLC : ADC.b $04 : TAX + + LDY.b $06 ; Tell me how long the palette is. + + .copyColors + ; We're loading A from the address set up in the calling function. + LDA.b [$00] : STA.l $7EC300, X : STA.l $7EC500, X + + ; Increment the absolute portion of the address by two, and decrease the color count by one + INC.b $00 : INC.b $00 + + INX #2 + + ; So basically loop (Y+1) times, taking (Y * 2 bytes) to $7EC300, X + DEY : BPL .copyColors + + ; This technique bumps us up to the next 4bpp (16 color) palette. + LDA.b $04 : CLC : ADC.w #$0020 : STA.b $04 + + ; Decrease the number of palettes we have to load. + DEC.b $08 + + BPL .nextPalette + + ; We're done loading palettes. + + RTS +} + +pushpc + +; ============================================================================== + +if !Func0ABC5A = 1 + +org $0ABC5A ; $053C5A + JSL CheckForChangeGraphicsNormalLoad + +;warnpc $0ABC5E ; $053C5E + +else + +; Undo the function above: +org $0ABC5A ; $053C5A +db $22, $9B, $E1, $00 + +endif + +; Loads the animated tiles after the overworld map is closed. +pullpc +CheckForChangeGraphicsNormalLoad: +{ + PHB : PHK : PLB + + JSL InitTilesets ; Replaced code. + + LDX.b $8A + + ; Do a 00 check just in case the data isn't present we don't get at crash. + LDA.l Pool_AnimatedTable, X : CMP.b #$00 : BNE .notZero + ; $5B is the defualt flower/water animated tiles value. + LDA.b #$5B + + .notZero + + STA.w AnimatedTileGFXSet : DEC : TAY + + ; TODO: this whole function may not be needed. + ; This forces the game to update the animated tiles when going from one area to another. + ;JSL DecompOwAnimatedTiles + + ; PLACE CUSTOM GFX LOAD HERE! + JSL CheckForChangeGraphicsNormalLoadBoat + + PLB + + RTL +} +pushpc + +; ============================================================================== + +if !Func0AB8F5 = 1 + +; Loads different animated tiles when returning from bird travel. +org $0AB8F5 ; $0538F5 +Func0AB8F5: +{ + ; Get the animated tiles value for this overworld area. + LDX.b $8A + + ; Do a 00 check just in case the data isn't present we don't get at crash. + LDA.l Pool_AnimatedTable, X : CMP.b #$00 : BNE .notZero + ; $5B is the defualt flower/water animated tiles value. + LDA.b #$5B + + .notZero + + STA.w AnimatedTileGFXSet : DEC : TAY + + ; From this point on it is the vanilla function. + JSL DecompOwAnimatedTiles ; $5394 IN ROM + JSL $0BFE70 ; $05FE70 IN ROM + + STZ.w $0AA9 + STZ.w $0AB2 + + JSL InitTilesets + + INC.w $0200 + + STZ.b $B2 + + JSL $02B1F4 ; $0131F4 IN ROM + + ; Play sound effect indicating we're coming out of map mode. + LDA.b #$10 : STA.w $012F + + JSL LoadAmbientSound + + ; If it's a different music track than was playing where we came from, + ; simply change to it (as opposed to setting volume back to full). + LDA.l $7F5B00, X : AND.b #$0F : TAX : CPX.w $0130 : BNE .different_music + ; otherwise, just set the volume back to full. + LDX.b #$F3 + + .different_music + + STX.w $012C + + ; PLACE CUSTOM GFX LOAD HERE! + JSL CheckForChangeGraphicsNormalLoadBoat + + RTL +} +;warnpc $0AB948 ; $053948 + +else + +; Undo the function above: +org $0AB8F5 ; $0538F5 +db $A0, $58, $A5, $8A, $29, $BF, $C9, $03 +db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 +db $F0, $02, $A0, $5A, $22, $94, $D3, $00 +db $22, $70, $FE, $0B, $9C, $A9, $0A, $9C +db $B2, $0A, $22, $9B, $E1, $00, $EE, $00 +db $02, $64, $B2, $22, $F4, $B1, $02, $A9 +db $10, $8D, $2F, $01, $A6, $8A, $BF, $00 +db $5B, $7F, $4A, $4A, $4A, $4A, $8D, $2D +db $01, $BF, $00, $5B, $7F, $29, $0F, $AA +db $EC, $30, $01, $D0, $02, $A2, $F3, $8E +db $2C, $01, $6B + +endif + +pullpc +LoadAmbientSound: +{ + ; Reset the ambient sound effect to what it was. + LDX.b $8A : LDA.l $7F5B00, X : LSR #4 : STA.w $012D + + ; Check if we need to stop the rain sound in the misery mire. + LDA.l Pool_EnableRainMireEvent : BEQ .disableRainSound + LDA.b $8A : CMP.b #$70 : BNE .disableRainSound + ; Has Misery Mire been triggered yet? + LDA.l $7EF2F0 : AND.b #$20 : BNE .disableRainSound + LDA.b #$01 : STA.w $012D + + .disableRainSound + + RTL +} +pushpc + +; ============================================================================== + +if !Func0BFEC6 = 1 + +; Loads different special transparent colors and overlay speeds based on the +; overlay duringtransition and under other certain cases. Exact cases need to be +; investigated. When leaving dungeon. +org $0BFEC6 ; $05FEC6 +Overworld_LoadBGColorAndSubscreenOverlay: +{ + JSL ReplaceBGColor + + ; set fixed color to neutral + LDA.w #$4020 : STA.b $9C + LDA.w #$8040 : STA.b $9D + + ; Check if we need to load the rain in the misery mire. + LDA.l Pool_EnableRainMireEvent : BEQ .notMire + LDA.b $8A : CMP.w #$0070 : BNE .notMire + ; Has Misery Mire been triggered yet? + LDA.l $7EF2F0 : AND.w #$0020 : BNE .notMire + JMP .subscreenOnAndReturn + + .notMire + + JSL ReadOverlayArray + + ; Check for misery mire. + CMP.w #$009F : BNE .notRain + JMP .subscreenOnAndReturn + + .notRain + + ; Check for lost woods?, skull woods, and pyramid area. + CMP.w #$009D : BEQ .noCustomFixedColor + CMP.w #$0096 : BEQ .noCustomFixedColor + LDX.w #$4C26 + LDY.w #$8C4C + + ; Check for LW Death mountain. + CMP.w #$0095 : BEQ .setCustomFixedColor + LDX.w #$4A26 + LDY.w #$874A + + ; Check for DW Death mountain. (not turtle rock?) + CMP.w #$009C : BEQ .setCustomFixedColor + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + ; Update CGRAM this frame + INC.b $15 + + RTL + + .setCustomFixedColor + + STX.b $9C + STY.b $9D ; Set the fixed color addition color values + + .noCustomFixedColor + + LDA.b $11 : AND.w #$00FF : CMP.w #$0004 : BEQ .BRANCH_11 + ; Make sure BG2 and BG1 Y scroll values are synchronized. Same for X scroll + LDA.b $E8 : STA.b $E6 + LDA.b $E2 : STA.b $E0 + + ; Just because I need a bit more space. + JSL ReadOverlayArray + + ; Are we at Hyrule Castle or Pyramid of Power? + CMP.w #$0096 : BNE .subscreenOnAndReturn + JSL NeedSomeSpaceForWhateverThisIs + + BRA .subscreenOnAndReturn + + .BRANCH_11 + + LDA.b $8A : ASL : TAX + + ; Check for the pyramid BG. + LDA.l Pool_OverlayTable, X : CMP.w #$0096 : BNE .subscreenOnAndReturn + ; Synchronize Y scrolls on BG0 and BG1. Same for X scrolls + LDA.b $E8 : STA.b $E6 + LDA.b $E2 : STA.b $E0 + + LDA.w $0410 : AND.w #$00FF : CMP.w #$0008 : BEQ .BRANCH_12 + ; Handles scroll for special areas maybe? + LDA.w #$0838 : STA.b $E0 + + .BRANCH_12 + + LDA.w #$06C0 : STA.b $E6 + + .subscreenOnAndReturn + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + ; Put BG0 on the subscreen + LDA.b #$01 : STA.b $1D + + ; Update palette + INC.b $15 + + RTL +} +;warnpc $0BFFA8 ; $05FFA8 + +else + +; Undo the function above: +org $0BFEC6 ; $05FEC6 +db $A9, $20, $40, $85, $9C, $A9, $40, $80 +db $85, $9D, $A5, $8A, $F0, $40, $C9, $70 +db $00, $D0, $03, $4C, $9D, $FF, $C9, $40 +db $00, $F0, $33, $C9, $5B, $00, $F0, $2E +db $A2, $26, $4C, $A0, $4C, $8C, $C9, $03 +db $00, $F0, $1F, $C9, $05, $00, $F0, $1A +db $C9, $07, $00, $F0, $15, $A2, $26, $4A +db $A0, $4A, $87, $C9, $43, $00, $F0, $0A +db $C9, $45, $00, $F0, $05, $E2, $30, $E6 +db $15, $6B, $86, $9C, $84, $9D, $A5, $11 +db $29, $FF, $00, $C9, $04, $00, $F0, $58 +db $A5, $E8, $85, $E6, $A5, $E2, $85, $E0 +db $A5, $8A, $29, $3F, $00, $C9, $1B, $00 +db $D0, $6D, $A5, $E2, $38, $E9, $78, $07 +db $4A, $A8, $29, $00, $40, $F0, $05, $98 +db $09, $00, $80, $A8, $84, $00, $A5, $E2 +db $38, $E5, $00, $85, $E0, $A5, $E6, $C9 +db $C0, $06, $90, $17, $38, $E9, $00, $06 +db $29, $FF, $03, $C9, $80, $01, $B0, $06 +db $4A, $09, $00, $06, $80, $0E, $A9, $C0 +db $06, $80, $09, $A5, $E6, $29, $FF, $00 +db $4A, $09, $00, $06, $85, $E6, $80, $27 +db $A5, $8A, $29, $3F, $00, $C9, $1B, $00 +db $D0, $1D, $A5, $E8, $85, $E6, $A5, $E2 +db $85, $E0, $AD, $10, $04, $29, $FF, $00 +db $C9, $08, $00, $F0, $05, $A9, $38, $08 +db $85, $E0, $A9, $C0, $06, $85, $E6, $E2 +db $20, $A9, $01, $85, $1D, $E2, $30, $E6 +db $15, $6B + +endif + +pullpc +ReplaceBGColor: +{ + PHB : PHK : PLB + + ; TODO: This may need to check if we are in a warp and then if so load the custom color. + ; If not, then chceck if its enabled or not. + ;SEP #$20 ; Set A in 8bit mode + + ;LDA.l Pool_EnableBGColor : BNE .custom + ;REP #$20 ; Set A in 16bit mode + + ;PLB + + ;RTL + + ;.custom + + ;REP #$20 ; Set A in 16bit mode + + LDA.b $8A : ASL : TAX ; Get area code and times it by 2 + LDA.l Pool_BGColorTable, X ; Get the color. + + ;STA.l $7EC300 : STA.l $7EC340 ; Set the BG color + STA.l $7EC500 : STA.l $7EC540 + + PLB + + RTL +} + +NeedSomeSpaceForWhateverThisIs: +{ + LDA.b $E2 : SEC : SBC.w #$0778 : LSR A : TAY : AND.w #$4000 : BEQ .BRANCH_7 + TYA : ORA.w #$8000 : TAY + + .BRANCH_7 + + STY.b $00 + + LDA.b $E2 : SEC : SBC.b $00 : STA.b $E0 + + LDA.b $E6 : CMP.w #$06C0 : BCC .BRANCH_9 + SEC : SBC.w #$0600 : AND.w #$03FF : CMP.w #$0180 : BCS .BRANCH_8 + LSR A : ORA.w #$0600 + + BRA .BRANCH_10 + + .BRANCH_8 + + LDA.w #$06C0 + + BRA .BRANCH_10 + + .BRANCH_9 + + LDA.b $E6 : AND.w #$00FF : LSR A : ORA.w #$0600 + + .BRANCH_10 + + ; Set BG1 vertical scroll + STA.b $E6 + + RTL +} +pushpc + +; ============================================================================== + +if !Func0ED627 = 1 + +; Loads the transparent color under some load conditions such as the mirror warp. +; TODO: Investigate the other conditions. Exiting dungeons. +org $0ED627 ; $075627 + JML InitColorLoad2 + NOP + +;warnpc $0ED62C ; $07562C + +else + +; Undo the function above: +org $0ED627 ; $075627 +db $A5, $8A, $C9, $80, $00 + +endif + +org $0ED652 +InitColorLoad2_Return: + +pullpc +InitColorLoad2: +{ + PHB : PHK : PLB + + ; $0181 is the exit room number used for getting into the under the bridge area. + LDA.b $A0 : CMP.w #$0181 : BNE .notBridge + LDA.l Pool_BGColorTable_Bridge + + BRA .storeColor + + .notBridge + + LDA.b $8A : ASL : TAX ; Get area code and times it by 2 + LDA.w Pool_BGColorTable, X ; Get the color. + + .storeColor + + STA.l $7EC300 : STA.l $7EC340 ;set transparent color + ;STA.l $7EC500 : STA.l $7EC540 + + INC $15 + + PLB + + JML InitColorLoad2_Return ; $0ED652 +} +pushpc + +; ============================================================================== + +if !Func0ED8AE = 1 + +; Resets the area special color after the screen flashes. +org $0ED8AE ; $0758AE +Func0ED8AE: +{ + LDA.b $1B : BNE .noSpecialColor + REP #$30 ; Set A, X, and Y in 16bit mode. + + LDX.w #$4020 : STX.b $9C + LDX.w #$8040 : STX.b $9D + + LDX.w #$4F33 + LDY.w #$894F + + ; Lost woods and skull woods. + LDA.b $8A : ASL : TAX + LDA.l Pool_OverlayTable, X : CMP.w #$009D : BEQ .noSpecialColor + CMP.w #$0040 : BEQ .noSpecialColor + ; Pyramid area. + CMP.w #$0096 : BEQ .specialColor + LDX.w #$4C26 + LDY.w #$8C4C + + ; LW death mountain. + CMP.w #$0095 : BEQ .specialColor + LDX.w #$4A26 + LDY.w #$874A + + ; DW death mountain. + CMP.w #$009C : BEQ .specialColor + BRA .noSpecialColor + + .specialColor + + STX.b $9C + STY.b $9D + + .noSpecialColor + + SEP #$30 ; Set A, X, and Y in 8bit mode. + + RTL +} +;warnpc $0ED8FB ; $0758FB + +else + +; Undo the function above: +org $0ED8AE ; $0758AE +db $A5, $1B, $D0, $46, $C2, $10, $A2, $20 +db $40, $86, $9C, $A2, $40, $80, $86, $9D +db $A2, $33, $4F, $A0, $4F, $89, $A5, $8A +db $F0, $30, $C9, $40, $F0, $2C, $C9, $5B +db $F0, $24, $A2, $26, $4C, $A0, $4C, $8C +db $C9, $03, $F0, $1A, $C9, $05, $F0, $16 +db $C9, $07, $F0, $12, $A2, $26, $4A, $A0 +db $4A, $87, $C9, $43, $F0, $08, $C9, $45 +db $F0, $04, $C9, $47, $D0, $04, $86, $9C +db $84, $9D, $E2, $10, $6B + +endif + +; ============================================================================== + +pullpc \ No newline at end of file