From c503e3eb6125ab27214363796284da46ed9cd1d1 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 21 Oct 2021 14:05:59 -0600 Subject: [PATCH 1/3] Overworld Map Refactor --- LTTP_RND_GeneralBugfixes.asm | 1 + hooks.asm | 67 ++++---- menu/overworldmap.asm | 303 +++++++++++++++++++++++++++++++++++ newhud.asm | 2 +- pendantcrystalhud.asm | 76 --------- tables.asm | 35 ++-- 6 files changed, 360 insertions(+), 124 deletions(-) create mode 100644 menu/overworldmap.asm diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 5341811..586527a 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -237,6 +237,7 @@ incsrc contrib.asm org $A38000 incsrc stats/main.asm +incsrc menu/overworldmap.asm ; overwrites some code in bank 0A incsrc doorrando.asm ; bank 27 likely A7 in the future ;bank 28/A8 for keydropshuffle incsrc enemizer/main.asm ; this is originally in bank 36, but is currently in migratory status in bank 37 diff --git a/hooks.asm b/hooks.asm index 414336c..961609d 100755 --- a/hooks.asm +++ b/hooks.asm @@ -1822,13 +1822,13 @@ LDA CrystalPendantFlags_2, X ;NOP #10 ;CLC ;================================================================================ -org $0AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail) -JSL.l OverworldMap_CheckObject : RTS -org $0AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail) -JSL.l OverworldMap_CheckObject : RTS +;org $0AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail) +;JSL.l OverworldMap_CheckObject : RTS +;org $0AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail) +;JSL.l OverworldMap_CheckObject : RTS ;================================================================================ org $0AC53e ; <- 5453E - Bank0A.asm:1771 - (LDA $0AC50D, X : STA $0D) -JSL.l GetCrystalNumber +LDA.l CrystalNumberTable, X ;================================================================================ ; EVERY INSTANCE OF STA $7EF3C7 IN THE ENTIRE CODEBASE org $029D51 ; <- 11D51 @@ -1864,34 +1864,35 @@ JSL.l GetMapMode org $0AC01A ; <- 5401A JSL.l GetMapMode -org $0AC037 ; <- 54037 -JSL.l GetMapMode -org $0AC079 ; <- 54079 -JSL.l GetMapMode -org $0AC0B8 ; <- 540B8 x -JSL.l GetMapMode -org $0AC0F8 ; <- 540F8 -JSL.l GetMapMode -org $0AC137 ; <- 54137 -JSL.l GetMapMode -org $0AC179 ; <- 54179 -JSL.l GetMapMode -org $0AC1B3 ; <- 541B3 -JSL.l GetMapMode -org $0AC1F5 ; <- 541F5 -JSL.l GetMapMode -org $0AC22F ; <- 5422F -JSL.l GetMapMode -org $0AC271 ; <- 54271 -JSL.l GetMapMode -org $0AC2AB ; <- 542AB -JSL.l GetMapMode -org $0AC2ED ; <- 542ED -JSL.l GetMapMode -org $0AC327 ; <- 54327 -JSL.l GetMapMode -org $0AC369 ; <- 54369 -JSL.l GetMapMode +;Overwritten +;org $0AC037 ; <- 54037 +;JSL.l GetMapMode +;org $0AC079 ; <- 54079 +;JSL.l GetMapMode +;org $0AC0B8 ; <- 540B8 x +;JSL.l GetMapMode +;org $0AC0F8 ; <- 540F8 +;JSL.l GetMapMode +;org $0AC137 ; <- 54137 +;JSL.l GetMapMode +;org $0AC179 ; <- 54179 +;JSL.l GetMapMode +;org $0AC1B3 ; <- 541B3 +;JSL.l GetMapMode +;org $0AC1F5 ; <- 541F5 +;JSL.l GetMapMode +;org $0AC22F ; <- 5422F +;JSL.l GetMapMode +;org $0AC271 ; <- 54271 +;JSL.l GetMapMode +;org $0AC2AB ; <- 542AB +;JSL.l GetMapMode +;org $0AC2ED ; <- 542ED +;JSL.l GetMapMode +;org $0AC327 ; <- 54327 +;JSL.l GetMapMode +;org $0AC369 ; <- 54369 +;JSL.l GetMapMode org $0DC849 ; <- 6C849 JSL.l GetMapMode diff --git a/menu/overworldmap.asm b/menu/overworldmap.asm new file mode 100644 index 0000000..67612af --- /dev/null +++ b/menu/overworldmap.asm @@ -0,0 +1,303 @@ +; adding support for up to 13 markers +!MC_FLAG = "$7F5420" +!INVENTORY_MAP = "$7EF368" +!INVENTORY_COMPASS = "$7EF364" +!MAP_OVERLAY = "$7EF414" ; [2] + +; 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+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 + 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 $7EF3CA : 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 $7EF3CA : 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 CompassTotal, X : SEC : SBC $7EF4BF, X : BEQ .fail + CLC : BRA .done + + .checkPendant + LDA $7EF374 : AND.l CrystalPendantFlags, X : BNE .fail + CLC : BRA .done + + .checkCrystal + LDA $7EF37A : AND.l CrystalPendantFlags, X : BNE .fail + CLC : BRA .done + + .checkAga1 + LDA $7EF3C5 : CMP #$03 : BEQ .fail + CLC : BRA .done + + .checkAga2 + LDA $7EF2DB : AND #$20 : BNE .fail + CLC : BRA .done + + .fail + SEC +.done +PLX +RTS + +;LDA $7EF3CA : AND #$40 : BNE + ; is the compass position on LW or DW? +; LDA.l WorldCompassMask, X : BNE .unset : BRA .continue +; + LDA.l WorldCompassMask, X : BEQ .unset + +; 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 aren't shuffled + LDA.l CompassExists, X : BEQ .set ; compass doesn't exits + PHX + LDA.l MC_SRAM_Offsets, X : TAX ; put compass offset into X + LDA !INVENTORY_COMPASS, X : ORA !MAP_OVERLAY, 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 $7EF3CA : AND #$40 : BNE + ; not really sure on this check + LDA !INVENTORY_MAP : ORA !MAP_OVERLAY : AND.b #$01 : BNE .set : BRA .continue + + LDA !INVENTORY_MAP : ORA !MAP_OVERLAY : AND.b #$02 : BNE .set +.continue + PHX + LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X + LDA !INVENTORY_MAP, X : ORA !MAP_OVERLAY, 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 + diff --git a/newhud.asm b/newhud.asm index 9c36f2d..40f0c11 100644 --- a/newhud.asm +++ b/newhud.asm @@ -98,7 +98,7 @@ SEP #$30 ; Draw Dungeon Compass Counts ;================================================================================ REP #$20 - LDA.l CompassMode : AND #$00FF : BEQ + ; skip if CompassMode is 0. + LDA.l CompassMode : AND #$003F : BEQ + ; skip if CompassMode is 0. JSL.l DrawDungeonCompassCounts ; compasses.asm + diff --git a/pendantcrystalhud.asm b/pendantcrystalhud.asm index 256b395..3b11aaa 100644 --- a/pendantcrystalhud.asm +++ b/pendantcrystalhud.asm @@ -42,82 +42,6 @@ RTL LDA.b #$FF ; don't show keys RTL ;================================================================================ -GetCrystalNumber: - PHX - TXA : ASL : TAX - LDA $7EF3CA : EOR.b #$40 : BNE + - INX - + - LDA.l CrystalNumberTable-16, X - PLX -RTL -;================================================================================ -!INVENTORY_MAP = "$7EF368" -!MAP_OVERLAY = "$7EF414" ; [2] -OverworldMap_CheckObject: - PHX - ;CPX.b #$01 : BNE + : JMP ++ : + : JMP .fail - LDA $7EF3CA : AND.b #$40 : BNE + - ;LW Map - LDA.l MapMode : BEQ +++ - LDA !INVENTORY_MAP : ORA !MAP_OVERLAY : AND.b #$01 : BNE +++ - PHX - LDA.l .lw_map_offsets, X : TAX ; put map offset into X - LDA !INVENTORY_MAP, X : ORA !MAP_OVERLAY, X - PLX - AND.l .lw_map_masks, X : BNE +++ - JMP .fail - +++ - LDA.l .lw_offsets, X - BPL +++ : CLC : BRA .done : +++ ; don't display master sword - TAX : BRA ++ - + - ;DW Map - LDA.l MapMode : BEQ +++ - LDA !INVENTORY_MAP : ORA !MAP_OVERLAY : AND.b #$02 : BNE +++ - PHX - LDA.l .dw_map_offsets, X : TAX ; put map offset into X - LDA.l !INVENTORY_MAP, X : ORA !MAP_OVERLAY, X - PLX - AND.l .dw_map_masks, X : BNE +++ - JMP .fail - +++ - LDA.l .dw_offsets, X - TAX : BRA ++ - SEC - PLX -RTL -++ - LDA.l CrystalPendantFlags_2, X - AND.b #$40 : BNE .checkCrystal - - .checkPendant - LDA $7EF374 : AND.l CrystalPendantFlags, X : BNE .fail - CLC : BRA .done - - .checkCrystal - LDA $7EF37A : AND.l CrystalPendantFlags, X : BNE .fail - CLC : BRA .done - - .fail - SEC - .done - PLX -RTL -.lw_offsets -db $02, $0A, $03, $FF -.dw_offsets -db $06, $08, $0C, $0B, $07, $09, $05 -.lw_map_offsets -db $01, $00, $01 -; pod skull trock thieves mire ice swamp -.dw_map_offsets -db $01, $00, $00, $00, $01, $00, $01 -.lw_map_masks -db $20, $20, $10, $00 -.dw_map_masks -db $02, $80, $08, $10, $01, $40, $04 -;================================================================================ SetLWDWMap: PHP SEP #$20 ; set 8-bit accumulator diff --git a/tables.asm b/tables.asm index 8ccb5fb..cab1dda 100644 --- a/tables.asm +++ b/tables.asm @@ -139,6 +139,8 @@ MapMode: db #$00 ; #$00 = Always On (default) - #$01 = Require Map Item CompassMode: db #$00 ; #$00 = Off (default) - #$01 = Display Dungeon Count w/Compass - #$02 = Display Dungeon Count Always + ; #$8x = Moves prize indicator to a special position if bit on + ; #$4x = Compasses are shuffled and must be obtained to show position if bit on ;-------------------------------------------------------------------------------- org $30803D ; PC 0x18003D PersistentFloodgate: @@ -240,13 +242,13 @@ org $30804F ; PC 0x18004F ByrnaInvulnerability: db #$01 ; #$00 = Off - #$01 = On (default) ;-------------------------------------------------------------------------------- -org $308050 ; PC 0x180050 - 0x18005C +org $308050 ; PC 0x180050 - 0x18005D CrystalPendantFlags_2: - db $00 ; Sewers - db $00 ; Hyrule Castle + db $02 ; Ganons Tower - because 5D is not available right now - sewers doesn't get one + db $04 ; Hyrule Castle db $00 ; Eastern Palace db $00 ; Desert Palace - db $00 ; Agahnim's Tower + db $01 ; Agahnim's Tower db $40 ; Swamp Palace db $40 ; Palace of Darkness db $40 ; Misery Mire @@ -258,6 +260,9 @@ CrystalPendantFlags_2: db $40 ; Turtle Rock ;Pendant: $00 ;Crystal: $40 +;Aga1: $01 +;Aga2: $02 +;HC special check $04 ;-------------------------------------------------------------------------------- org $30805E ; PC 0x18005E - Number of crystals required to enter GT NumberOfCrystalsRequiredForTower: @@ -288,20 +293,20 @@ dl #$000000 ;-------------------------------------------------------------------------------- org $308070 ; PC 0x180070 - 0x18007F CrystalNumberTable: -db $00 ; +db $69 ; Eastern +db $69 ; Hera +db $69 ; Desert +db $7F ; Darkness +db $6C ; Skull +db $7C ; TRock +db $6D ; Thieves +db $6F ; Mire +db $6E ; Ice db $79 ; Swamp db $00 ; -db $6E ; Ice db $00 ; -db $6F ; Mire db $00 ; -db $6D ; Thieves -db $69 ; Desert -db $7C ; TRock -db $69 ; Hera -db $6C ; Skull -db $69 ; Eastern -db $7F ; Darkness +db $00 ; db $00 ; db $00 ; @@ -1555,6 +1560,8 @@ dw #9999 ; Rupee Limit ; $7F5400 - $7F540F - MSU Block ; $7F5410 - $7F56FF - Unused +; $7F5420 - MapCompass flag - used during Overworld Map processing +; $7F5421 - $7F56FF - Unused ; $7F5700 - $7F57FF - Dialog Buffer ; From f95bce282b2c42acb04e64b1bcf95d8b964a3df3 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 21 Oct 2021 16:15:34 -0600 Subject: [PATCH 2/3] Removed some comment cruft --- menu/overworldmap.asm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/menu/overworldmap.asm b/menu/overworldmap.asm index 67612af..9bd111a 100644 --- a/menu/overworldmap.asm +++ b/menu/overworldmap.asm @@ -248,10 +248,6 @@ PHX PLX RTS -;LDA $7EF3CA : AND #$40 : BNE + ; is the compass position on LW or DW? -; LDA.l WorldCompassMask, X : BNE .unset : BRA .continue -; + LDA.l WorldCompassMask, X : BEQ .unset - ; X - which compass in question ; CLC - should not move indicator ; SEC - yep indicator can move From 620c672fe1745cb56f80dd7e663098a26873ed58 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 21 Oct 2021 16:18:51 -0600 Subject: [PATCH 3/3] Turn off Terrorpin AI fix by default - can be a post-gen option --- tables.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tables.asm b/tables.asm index 99d4143..e158516 100644 --- a/tables.asm +++ b/tables.asm @@ -1879,7 +1879,7 @@ db #$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00, org $30E37D ; PC 0x18637D Enable_TerrorPin_AI_Fix: -db #$01 +db #$00 ;Shop slot count as check org $30E560 ; PC 0x18650