Files
oracle-of-secrets/Overworld/world_map.asm
2025-01-09 02:36:14 -05:00

638 lines
12 KiB
NASM

; =========================================================
; World Map Module
WorldMapIcon_AdjustCoordinate = $0AC589
WorldMap_HandleSpriteBlink = $0AC51C
pullpc
DrawWisdomPendant:
{
; X position
LDA.b #$08 : STA.l $7EC10B
LDA.b #$30 : STA.l $7EC10A
; Y position
LDA.b #$07 : STA.l $7EC109
LDA.b #$01 : STA.l $7EC108
LDA.b #$60 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0D : STA.l $7EC025
RTL
}
DrawPowerPendant:
{
; X position
LDA.b #$08 : STA.l $7EC10B
LDA.b #$0D : STA.l $7EC10A ; Upper nybble control Zoomed low X pos
; Y position
LDA.b #$02 : STA.l $7EC109
LDA.b #$84 : STA.l $7EC108 ; Upper nybble control Zoomed low Y pos
LDA.b #$60 : STA.b $0D
LDA.b #$32 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$08 : STA.l $7EC025
RTL
}
DrawCouragePendant:
{
; X position
LDA.b #$00 : STA.l $7EC10B
LDA.b #$87 : STA.l $7EC10A
; Y position
LDA.b #$04 : STA.l $7EC109
LDA.b #$01 : STA.l $7EC108
; Tile GFX
LDA.b #$60 : STA.b $0D
LDA.b #$38 : STA.b $0C
; Tile Size
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0A : STA.l $7EC025 ; OAM Slot used
RTL
}
DrawMasterSwordIcon:
{
; X position
LDA.b #$02 : STA.l $7EC10B
LDA.b #$FD : STA.l $7EC10A ; Upper nybble control Zoomed low X pos
; Y position
LDA.b #$00 : STA.l $7EC109
LDA.b #$E4 : STA.l $7EC108 ; Upper nybble control Zoomed low Y pos
LDA.b #$62 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0B : STA.l $7EC025
RTL
}
DrawFortressOfSecretsIcon:
{
; X position
LDA.b #$0E : STA.l $7EC10B
LDA.b #$5E : STA.l $7EC10A
; Y position
LDA.b #$06 : STA.l $7EC109
LDA.b #$68 : STA.l $7EC108
LDA.b #$66 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0B : STA.l $7EC025
RTL
}
DrawFinalBossIcon:
{
; X position
LDA.b #$0E : STA.l $7EC10B
LDA.b #$5E : STA.l $7EC10A
; Y position
LDA.b #$04 : STA.l $7EC109
LDA.b #$68 : STA.l $7EC108
; Tile GFX (Skull Icon)
LDA.b #$66 : STA.b $0D
LDA.b #$34 : STA.b $0C
; Tile Size
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0E : STA.l $7EC025 ; OAM Slot used
RTL
}
DrawHallOfSecretsIcon:
{
; X position
LDA.b #$0D : STA.l $7EC10B
LDA.b #$34 : STA.l $7EC10A
; Y position
LDA.b #$03 : STA.l $7EC109
LDA.b #$0E : STA.l $7EC108
; Tile GFX
LDA.b #$68 : STA.b $0D
LDA.b #$34 : STA.b $0C
; Tile Size
LDA.b #$00 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$07 : STA.l $7EC025
RTL
}
DrawPyramidIcon:
{
; X position
LDA.b #$05 : STA.l $7EC10B
LDA.b #$00 : STA.l $7EC10A
; Y position
LDA.b #$00 : STA.l $7EC109
LDA.b #$54 : STA.l $7EC108
LDA.b #$68 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$00 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$07 : STA.l $7EC025
RTL
}
DrawEonEscapeIcon:
{
LDA.b #$04 : STA.l $7EC10B
LDA.b #$F4 : STA.l $7EC10A
LDA.b #$0B : STA.l $7EC109
LDA.b #$0E : STA.l $7EC108
LDA.b #$68 : STA.b $0D
LDA.b #$36 : STA.b $0C ; Tile GFX
LDA.b #$00 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$06 : STA.l $7EC025
RTL
}
pushpc
; Removed mirror portal draw and pyramid open code
org $0ABF90
MapIconDraw:
{
; .dont_draw_link
LDA.l $7EC108 : PHA
LDA.l $7EC109 : PHA
LDA.l $7EC10A : PHA
LDA.l $7EC10B : PHA
;-----------------------------------
.draw_prizes
LDA.b $8A : AND.b #$40 : BEQ .lwprizes
LDA.l OOSPROG : AND.b #$02 : BNE .check_pendants
JSL DrawEonEscapeIcon
JSR HandleMapDrawIcon
JMP restore_coords_and_exit
.check_pendants
LDA.l OOSPROG : AND.b #$10 : BEQ .check_master_sword
JSL DrawPowerPendant
JSR HandleMapDrawIcon
JSL DrawWisdomPendant
JSR HandleMapDrawIcon
JSL DrawCouragePendant
JSR HandleMapDrawIcon
.check_master_sword
LDA.l OOSPROG : AND.b #$20 : BEQ .check_fortress
JSL DrawMasterSwordIcon
JSR HandleMapDrawIcon
JMP restore_coords_and_exit
.check_fortress
LDA.l OOSPROG : AND.b #$40 : BEQ .check_final_boss
JSL DrawFortressOfSecretsIcon
JSR HandleMapDrawIcon
JMP restore_coords_and_exit
.check_final_boss
LDA.l OOSPROG : AND.b #$80 : BEQ .exit_dw
JSL DrawFinalBossIcon
JSR HandleMapDrawIcon
.exit_dw
JMP restore_coords_and_exit
.lwprizes
;-----------------------------------
LDA.l $7EF3C7 : CMP.b #$01 : BEQ .hall_of_secrets
CMP.b #$02 : BEQ .draw_secret
CMP.b #$03 : BEQ .draw_crystal_1
CMP.b #$04 : BCS .draw_crystals
JSL DrawEonEscapeIcon
JSR HandleMapDrawIcon
JMP restore_coords_and_exit
.hall_of_secrets
JSL DrawHallOfSecretsIcon
JSR HandleMapDrawIcon
JMP restore_coords_and_exit
.draw_secret ; Pyramid of Power
JSL DrawPyramidIcon
JSR HandleMapDrawIcon_noflash
JMP .skip_draw_6
.draw_crystal_1
; Draw Crystal 1
LDA.l $7EF37A : AND #$02 : BNE .skip_draw_0
; X position
LDA.b #$00 : STA.l $7EC10B
LDA.b #$87 : STA.l $7EC10A
; Y position
LDA.b #$04 : STA.l $7EC109
LDA.b #$01 : STA.l $7EC108
; Tile GFX
LDA.b #$64 : STA.b $0D
LDA.b #$38 : STA.b $0C
; Tile Size
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0E : STA.l $7EC025 ; OAM Slot used
JSR HandleMapDrawIcon
.skip_draw_0
JMP restore_coords_and_exit
.draw_crystals
; Draw Crystal 2
LDA.l $7EF37A : AND #$10 : BNE .skip_draw_1
; X position (2)
LDA.b #$1E : STA.l $7EC10B
LDA.b #$A0 : STA.l $7EC10A
; Y position (2)
LDA.b #$09 : STA.l $7EC109
LDA.b #$74 : STA.l $7EC108
LDA.b #$64 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$08 : STA.l $7EC025
JSR HandleMapDrawIcon
.skip_draw_1
; Draw Crystal 3
LDA.l $7EF37A : AND #$40 : BNE .skip_draw_2
; X position
LDA.b #$08 : STA.l $7EC10B
LDA.b #$10 : STA.l $7EC10A
; Y position
LDA.b #$04 : STA.l $7EC109
LDA.b #$0E : STA.l $7EC108
LDA.b #$64 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0D : STA.l $7EC025
JSR HandleMapDrawIcon
.skip_draw_2
; Draw Crystal 4
LDA.l $7EF37A : AND #$20 : BNE .skip_draw_3
; X position
LDA.b #$0E : STA.l $7EC10B
LDA.b #$5E : STA.l $7EC10A
; Y position
LDA.b #$06 : STA.l $7EC109
LDA.b #$68 : STA.l $7EC108
LDA.b #$64 : STA.b $0D
LDA.b #$3C : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0B : STA.l $7EC025
JSR HandleMapDrawIcon
.skip_draw_3
; Draw Crystal 5
LDA.l $7EF37A : AND #$04 : BNE .skip_draw_4
; X position
LDA.b #$0C : STA.l $7EC10B
LDA.b #$34 : STA.l $7EC10A
; Y position
LDA.b #$00 : STA.l $7EC109
LDA.b #$0E : STA.l $7EC108
LDA.b #$64 : STA.b $0D
LDA.b #$34 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$09 : STA.l $7EC025
JSR HandleMapDrawIcon
.skip_draw_4
; Draw Crystal 6
LDA.l $7EF37A : AND #$01 : BNE .skip_draw_5
; X position (6)
LDA.b #$0D : STA.l $7EC10B
LDA.b #$05 : STA.l $7EC10A
; Y position (6)
LDA.b #$0D : STA.l $7EC109
LDA.b #$09 : STA.l $7EC108
LDA.b #$64 : STA.b $0D
LDA.b #$32 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0A : STA.l $7EC025
JSR HandleMapDrawIcon
.skip_draw_5
; Draw Crystal 7
LDA.l $7EF37A : AND #$08 : BNE .skip_draw_6
; X position
LDA.b #$00 : STA.l $7EC10B
LDA.b #$F4 : STA.l $7EC10A
; Y position
LDA.b #$0D : STA.l $7EC109
LDA.b #$0E : STA.l $7EC108
LDA.b #$64 : STA.b $0D
LDA.b #$32 : STA.b $0C ; Tile GFX
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
LDA.b #$0C : STA.l $7EC025
JSR HandleMapDrawIcon
.skip_draw_6
JMP restore_coords_and_exit
}
HandleMapDrawIcon:
{
; Timer to make it flash
LDA.b $1A : AND.b #$10 : BNE .skip_draw
.noflash ; ALTERNATE ENTRY POINT
JSR WorldMapIcon_AdjustCoordinate
LDA.l $7EC025 : TAX
JSR WorldMap_CalculateOAMCoordinates
BCC .skip_draw
LDA.l $7EC025 : TAX
LDA.b #$02
JSR WorldMap_HandleSpriteBlink
.skip_draw
RTS
}
FixMaskPaletteOnExit:
{
JSL Palette_ArmorAndGloves
LDA.l $7EC229
RTL
}
assert pc() <= $0AC387
org $0ABC76
JSL FixMaskPaletteOnExit
org $0AC589
RTS
org $0AC38A
restore_coords_and_exit:
{
PLA : STA.l $7EC10B
PLA : STA.l $7EC10A
PLA : STA.l $7EC109
PLA : STA.l $7EC108
RTS
}
WorldMap_CalculateOAMCoordinates:
; =========================================================
; 0x0C4000 to 0x0C8000 for the map gfx
; patch a new rom with your map data/gfx
; create a new bin file out of these bytes
; 0AC727 (pc: 054727) to 0AD726 (pc: 055726) 0x1000 bytes
; =========================================================
; LW OVERWORLD MAP
; =========================================================
org $008E54 ;STZ $2115
JSL DMAOwMap
RTS
org $00E399
JSL DMAOwMapGfx
RTL
; =========================================================
; DW OVERWORLD MAP
; =========================================================
org $008FF3
RTS ; do nothing during DW update, we'll handle it in the LW routine
org $408000
LWWorldMap_Tiles:
incbin world_map/LwMapTileset.bin
LWWorldMap_Gfx:
incbin world_map/LwMapGfx.bin
org $418000
DWWorldMap_Tiles:
incbin world_map/DwMapTileset.bin
DWWorldMap_Gfx:
incbin world_map/DwMapGfx.bin
DMAOwMap:
{
JSL Palette_ArmorAndGloves
LDA $8A : AND #$40 : BEQ .LWMAP
JMP .DWMAP
.LWMAP
STZ.w $2115
LDA.b #LWWorldMap_Tiles>>16
STA.w $4304
REP #$20
LDA.w #$1800
STA.w $4300
STZ.b $04
STZ.b $02
LDY.b #$01
LDX.b #$00
.next_quadrant
LDA.w #$0020
STA.b $06
LDA.l .vram_offset,X
STA.b $00
.next_row
LDA.b $00
STA.w $2116
CLC
ADC.w #$0080
STA.b $00
LDA.b $02
CLC
ADC.w #LWWorldMap_Tiles
STA.w $4302
LDA.w #$0020
STA.w $4305
STY.w $420B
CLC
ADC.b $02
STA.b $02
DEC.b $06
BNE .next_row
INC.b $04
INC.b $04
LDX.b $04
CPX.b #$08
BNE .next_quadrant
SEP #$20
RTL
.vram_offset
dw $0000, $0020, $1000, $1020
.DWMAP
STZ.w $2115
LDA.b #DWWorldMap_Tiles>>16
STA.w $4304
REP #$20
LDA.w #$1800
STA.w $4300
STZ.b $04
STZ.b $02
LDY.b #$01
LDX.b #$00
.next_quadrant2
LDA.w #$0020
STA.b $06
LDA.l .vram_offset,X
STA.b $00
.next_row2
LDA.b $00
STA.w $2116
CLC
ADC.w #$0080
STA.b $00
LDA.b $02
CLC
ADC.w #DWWorldMap_Tiles
STA.w $4302
LDA.w #$0020
STA.w $4305
STY.w $420B
CLC
ADC.b $02
STA.b $02
DEC.b $06
BNE .next_row2
INC.b $04
INC.b $04
LDX.b $04
CPX.b #$08
BNE .next_quadrant2
SEP #$20
RTL
}
DMAOwMapGfx:
{
LDA $8A : AND #$40 : BNE .DWMAP
LDA.b #LWWorldMap_Gfx>>16 : STA $02
LDA.b #$80 : STA $2115
STZ $2116 : STZ $2117
REP #$10
LDY.w #LWWorldMap_Gfx : STY $00
LDY.w #$0000
.writeChr
LDA [$00], Y : STA $2119 : INY
LDA [$00], Y : STA $2119 : INY
LDA [$00], Y : STA $2119 : INY
LDA [$00], Y : STA $2119 : INY
CPY.w #$4000 : BNE .writeChr
SEP #$10
RTL
.DWMAP
LDA.b #DWWorldMap_Gfx>>16 : STA $02
LDA.b #$80 : STA $2115
STZ $2116 : STZ $2117
REP #$10
LDY.w #DWWorldMap_Gfx : STY $00
LDY.w #$0000
.writeChr2
LDA [$00], Y : STA $2119 : INY
LDA [$00], Y : STA $2119 : INY
LDA [$00], Y : STA $2119 : INY
LDA [$00], Y : STA $2119 : INY
CPY.w #$4000 : BNE .writeChr2
SEP #$10
RTL
}
org $0ADC27
DWPalettes:
incbin world_map/dw_palette.bin