300 lines
6.7 KiB
NASM
300 lines
6.7 KiB
NASM
; adding support for up to 13 markers
|
|
!MC_FLAG = "$7F5420"
|
|
|
|
; tables
|
|
org $0ABDF6
|
|
WorldMapIcon_posx_vanilla:
|
|
dw $0F31 ; prize1
|
|
dw $08D0 ; prize2
|
|
dw $0108
|
|
dw $0F40
|
|
|
|
dw $0082
|
|
dw $0F11
|
|
dw $01D0
|
|
dw $0100
|
|
|
|
dw $0CA0
|
|
dw $0759
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FFFF ; reserved - not used
|
|
dw $FFFF
|
|
dw $FFFF
|
|
|
|
org $0ABE16
|
|
WorldMapIcon_posy_vanilla:
|
|
dw $0620 ; prize1
|
|
dw $0080 ; prize2
|
|
dw $0D70
|
|
dw $0620
|
|
|
|
dw $00B0
|
|
dw $0103
|
|
dw $0780
|
|
dw $0CA0
|
|
|
|
dw $0DA0
|
|
dw $0ED0
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FFFF ; reserved - not used
|
|
dw $FFFF
|
|
dw $FFFF
|
|
|
|
org $0ABE36
|
|
WorldMapIcon_posx_located:
|
|
dw $FF00 ; prize1
|
|
dw $FF00 ; prize2
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FFFF ; reserved - not used
|
|
dw $FFFF
|
|
dw $FFFF
|
|
|
|
org $0ABE56
|
|
WorldMapIcon_posy_located:
|
|
dw $FF00 ; prize1
|
|
dw $FF00 ; prize2
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
dw $FF00
|
|
|
|
dw $FF00
|
|
dw $FFFF ; reserved - not used
|
|
dw $FFFF
|
|
dw $FFFF
|
|
|
|
org $0ABE76
|
|
WorldMapIcon_tile:
|
|
db $38, $62 ; green pendant
|
|
db $32, $60 ; red pendant
|
|
db $34, $60 ; blue pendant
|
|
db $34, $64 ; crystal
|
|
|
|
db $34, $64 ; crystal
|
|
db $34, $64 ; crystal
|
|
db $34, $64 ; crystal
|
|
db $34, $64 ; crystal
|
|
|
|
db $34, $64 ; crystal
|
|
db $34, $64 ; crystal
|
|
db $32, $66 ; skull looking thing
|
|
db $00, $00 ; red x
|
|
|
|
db $00, $00 ; red x
|
|
db $00, $00 ; unused red x's
|
|
db $00, $00
|
|
db $00, $00
|
|
|
|
org $0ABE96
|
|
CompassExists:
|
|
; dw $37FC ; todo: convert to two bytes with masks? so much extra code...
|
|
; eastern hera desert pod skull trock thieves mire ice swamp gt at escape
|
|
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00
|
|
|
|
; 0 = light world, 1 = dark world
|
|
org $0ABEA6
|
|
WorldCompassMask:
|
|
db $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00
|
|
|
|
; eastern desert hera pod skull trock thieves mire ice swamp gt at escape x1 x2 x3
|
|
|
|
; refs
|
|
org $0AC59B
|
|
WorldMapIcon_AdjustCoordinate:
|
|
org $0AC3B1
|
|
WorldMap_CalculateOAMCoordinates:
|
|
org $0AC52E
|
|
WorldMap_HandleSpriteBlink:
|
|
org $0ABF70
|
|
WorldMap_RedXChars:
|
|
|
|
org $0AC02B
|
|
DrawPrizesOverride:
|
|
LDX.b #$FF
|
|
.loopStart
|
|
INX : PHX
|
|
JSR OverworldMap_CheckForPrize
|
|
BCC + : JMP .skip_draw : +
|
|
|
|
TXA : ASL A : TAX
|
|
LDA.l !MC_FLAG
|
|
AND #$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 #$FF : BEQ .skip_draw
|
|
LDA.l WorldMapIcon_tile+1, X : BEQ .dont_adjust
|
|
CMP.b #$64 : BEQ .is_crystal
|
|
LDA.b $1A : 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 !MC_FLAG : CMP.b #$01 : BEQ .is_red_x
|
|
LDA.l WorldMapIcon_tile+1, X : STA.b $0D
|
|
LDA.l WorldMapIcon_tile, X : STA.b $0C
|
|
LDA.b #$02 : BRA .continue
|
|
.is_red_x
|
|
LDA.b $1A : LSR #3 : AND.b #$03 : TAX
|
|
LDA.l WorldMap_RedXChars,X : STA.b $0D
|
|
LDA.b #$32 : STA.b $0C : LDA.b #$00
|
|
.continue
|
|
STA.b $0B
|
|
PLX : PHX
|
|
INX : JSR WorldMap_HandleSpriteBlink
|
|
.skip_draw
|
|
; end of loop
|
|
PLX : CPX #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 #$00 : STA.l !MC_FLAG
|
|
JSR OverworldMap_CheckForCompass
|
|
BCC +
|
|
LDA.l !MC_FLAG : ORA #$01 : STA.l !MC_FLAG
|
|
LDA CurrentWorld : AND #$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 !MC_FLAG : ORA #$02 : STA.l !MC_FLAG
|
|
+
|
|
LDA.l !MC_FLAG : BEQ .fail
|
|
CMP #$02 : BNE .checkIfObtained
|
|
LDA CurrentWorld : AND #$40 : BNE +
|
|
CPX #3 : BCS .fail : BRA .checkIfObtained
|
|
+ CPX #10 : BCS .fail
|
|
CPX #3 : BCC .fail
|
|
|
|
.checkIfObtained
|
|
LDA.l MC_DungeonIdsForPrize, X
|
|
BPL +++ : CLC : BRA .done : +++ ; non-prize flags
|
|
|
|
TAX : LDA.l CrystalPendantFlags_2, X : BEQ .checkPendant
|
|
AND.b #$40 : BNE .checkCrystal
|
|
LDA.l CrystalPendantFlags_2, X : AND.b #$01 : BNE .checkAga1
|
|
LDA.l CrystalPendantFlags_2, X : AND.b #$02 : BNE .checkAga2
|
|
|
|
; see if hyrule castle has been completely cleared
|
|
LDA.l CompassTotalsWRAM, X : SEC : SBC DungeonLocationsChecked, X : BEQ .fail
|
|
CLC : BRA .done
|
|
|
|
.checkPendant
|
|
LDA PendantsField : AND.l CrystalPendantFlags, X : BNE .fail
|
|
CLC : BRA .done
|
|
|
|
.checkCrystal
|
|
LDA CrystalsField : AND.l CrystalPendantFlags, X : BNE .fail
|
|
CLC : BRA .done
|
|
|
|
.checkAga1
|
|
LDA ProgressIndicator : CMP #$03 : BEQ .fail
|
|
CLC : BRA .done
|
|
|
|
.checkAga2
|
|
LDA RoomDataWRAM[$0D].high : AND #$08 : BNE .fail
|
|
CLC : BRA .done
|
|
|
|
.fail
|
|
SEC
|
|
.done
|
|
PLX
|
|
RTS
|
|
|
|
; X - which compass in question
|
|
; CLC - should not move indicator
|
|
; SEC - yep indicator can move
|
|
OverworldMap_CheckForCompass:
|
|
LDA.l CompassMode : AND #$80 : BEQ .unset ; should I check for compass logic
|
|
LDA.l CompassMode : AND #$40 : BEQ .set ; compasses/maps aren't shuffled
|
|
LDA.l CompassMode : AND #$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 CompassField, X : ORA 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 CurrentWorld : AND #$40 : BNE + ; not really sure on this check
|
|
LDA MapField : ORA MapOverlay : AND.b #$01 : BNE .set : BRA .continue
|
|
+ LDA MapField : ORA MapOverlay : AND.b #$02 : BNE .set
|
|
.continue
|
|
PHX
|
|
LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X
|
|
LDA MapField, X : ORA MapOverlay, X
|
|
PLX
|
|
AND.l MC_Masks, X : BNE .set ; is the map obtained?
|
|
.unset
|
|
CLC
|
|
RTS
|
|
.set
|
|
SEC
|
|
RTS
|
|
|
|
; eastern desert hera pod skull trock thieves mire ice swamp gt at escape
|
|
MC_DungeonIdsForPrize:
|
|
db $02, $0A, $03, $06, $08, $0C, $0B, $07, $09, $05, $00, $04, $01
|
|
MC_SRAM_Offsets:
|
|
db $01, $00, $01, $01, $00, $00, $00, $01, $00, $01, $00, $01, $01
|
|
MC_Masks:
|
|
; EP TH DP PD SK TR TT MM
|
|
db $20, $20, $10, $02, $80, $08, $10, $01, $40, $04, $04, $08, $40
|
|
|
|
warnpc $0AC3B1 ; above code should not exceed the space of the code segment it is overwriting |