Files
oracle-of-secrets/Overworld/ZCustomOverworld.asm

2462 lines
68 KiB
NASM

; ==============================================================================
; 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 $0ED6DD
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