Files
alttpr-baserom/menu/overworldmap.asm
2024-04-09 09:26:27 -06:00

147 lines
4.0 KiB
NASM

pushpc
org $8AC02B
DrawPrizesOverride:
LDX.b #$FF
.loopStart
INX : PHX
JSR OverworldMap_CheckForPrize
BCC + : JMP .skip_draw : +
TXA : ASL A : TAX
LDA.l MapCompassFlag
AND.b #$01 : BNE +
LDA.l WorldMapIcon_posx_vanilla+1, X : STA.l $7EC10B
LDA.l WorldMapIcon_posx_vanilla, X : STA.l $7EC10A
LDA.l WorldMapIcon_posy_vanilla+1, X : STA.l $7EC109
LDA.l WorldMapIcon_posy_vanilla, X : STA.l $7EC108
BRA .adjustment
+ LDA.l WorldMapIcon_posx_located+1, X : STA.l $7EC10B
LDA.l WorldMapIcon_posx_located, X : STA.l $7EC10A
LDA.l WorldMapIcon_posy_located+1, X : STA.l $7EC109
LDA.l WorldMapIcon_posy_located, X : STA.l $7EC108
.adjustment
LDA.l WorldMapIcon_tile, X : CMP.b #$FF : BEQ .skip_draw
LDA.l WorldMapIcon_tile+1, X : BEQ .dont_adjust
CMP.b #$64 : BEQ .is_crystal
LDA.b FrameCounter : AND.b #$10 : BNE .skip_draw
.is_crystal
JSR WorldMapIcon_AdjustCoordinate
.dont_adjust
JSR WorldMap_CalculateOAMCoordinates
BCC .skip_draw
PLX : PHX : TXA : ASL A : TAX
LDA.l WorldMapIcon_tile+1, X : BEQ .is_red_x
LDA.l MapCompassFlag : CMP.b #$01 : BEQ .is_red_x
LDA.l WorldMapIcon_tile+1, X : STA.b Scrap0D
LDA.l WorldMapIcon_tile, X : STA.b Scrap0C
LDA.b #$02 : BRA .continue
.is_red_x
LDA.b FrameCounter : LSR #3 : AND.b #$03 : TAX
LDA.l WorldMap_RedXChars,X : STA.b Scrap0D
LDA.b #$32 : STA.b Scrap0C : LDA.b #$00
.continue
STA.b Scrap0B
PLX : PHX
INX : JSR WorldMap_HandleSpriteBlink
.skip_draw
; end of loop
PLX : CPX.b #12 : BCS + : JMP .loopStart : +
PLA : STA.l $7EC10B
PLA : STA.l $7EC10A
PLA : STA.l $7EC109
PLA : STA.l $7EC108
RTS
; X - the index of the prize marker
OverworldMap_CheckForPrize:
PHX
LDA.b #$00 : STA.l MapCompassFlag
JSR OverworldMap_CheckForCompass
BCC +
LDA.l MapCompassFlag : ORA.b #$01 : STA.l MapCompassFlag
LDA.l CurrentWorld : AND.b #$40 : BNE ++ ; is the compass position on LW or DW?
LDA.l WorldCompassMask, X : BEQ + : JMP .fail
++ LDA.l WorldCompassMask, X : BNE + : JMP .fail
+ JSR OverworldMap_CheckForMap
BCC +
LDA.l MapCompassFlag : ORA.b #$02 : STA.l MapCompassFlag
+
LDA.l MapCompassFlag : BEQ .fail
CMP.b #$02 : BNE .checkIfObtained
LDA.l CurrentWorld : AND.b #$40 : BNE +
CPX.b #3 : BCS .fail : BRA .checkIfObtained
+ CPX.b #10 : BCS .fail
CPX.b #3 : BCC .fail
.checkIfObtained
LDA.l MC_DungeonIdsForPrize, X
BPL +++ : CLC : BRA .done : +++ ; non-prize flags
CMP.b #$02 : BCC .hyrule_castle
ASL : TAX
REP #$20
LDA.l DungeonsCompleted : AND.l DungeonItemMasks,X : BNE .fail
CLC : BRA .done
; see if hyrule castle has been completely cleared
.hyrule_castle
REP #$20
LDA.l CompassTotalsWRAM, X : SEC : SBC.l DungeonLocationsChecked, X
SEP #$20
BEQ .fail
CLC : BRA .done
.fail
SEC
.done
SEP #$20
PLX
RTS
; X - which compass in question
; CLC - should not move indicator
; SEC - yep indicator can move
OverworldMap_CheckForCompass:
LDA.l CompassMode : AND.b #$80 : BEQ .unset ; should I check for compass logic
LDA.l CompassMode : AND.b #$40 : BEQ .set ; compasses/maps aren't shuffled
LDA.l CompassMode : AND.b #$20 : BNE +
JSR OverworldMap_CheckForMap : BCC .unset : BRA .set
+ LDA.l CompassExists, X : BEQ .set ; compass doesn't exist
PHX
LDA.l MC_SRAM_Offsets, X : TAX ; put compass offset into X
LDA.l CompassField, X : ORA.l MapOverlay, X
PLX
AND.l MC_Masks, X : BNE .set ; is the compass obtained
.unset
CLC
RTS
.set
SEC
RTS
; map - which map in question
; CLC - should not show exact prize
; SEC - yep should show exact prize
OverworldMap_CheckForMap:
LDA.l MapMode : BEQ .set ; obtaining map doesn't change anything
LDA.l CurrentWorld : AND.b #$40 : BNE + ; not really sure on this check
LDA.l MapField : ORA.l MapOverlay : AND.b #$01 : BNE .set : BRA .continue
+ LDA.l MapField : ORA.l MapOverlay : AND.b #$02 : BNE .set
.continue
PHX
LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X
LDA.l MapField, X : ORA.l MapOverlay, X
PLX
AND.l MC_Masks, X : BNE .set ; is the map obtained?
.unset
CLC
RTS
.set
SEC
RTS
pullpc