diff --git a/gk/doors_dungeon_map.asm b/gk/doors_dungeon_map.asm index 60c2300..aec57fe 100644 --- a/gk/doors_dungeon_map.asm +++ b/gk/doors_dungeon_map.asm @@ -1240,7 +1240,7 @@ DrawDoorsMapBlinker: AND.w #$01E0 ASL A : ASL A : ASL A XBA - CLC : ADC.w #$00A4 + CLC : ADC.w #$00A5 STA.w OAMBuffer, X LDA.b LinkPosY @@ -1718,10 +1718,13 @@ DoorsMapChangeDungeon: BNE + INX + LDA.l DungeonMapData.prev, X + STA.w DungeonID CMP.b $00 BEQ .done - STA.w DungeonID + JSL IsValidDungeonToSwapTo + BCC .next + JSL FindFirstEntrance CPY.b #$FF BEQ .next diff --git a/gk/draw_loot.asm b/gk/draw_loot.asm index 10cea18..bf544af 100644 --- a/gk/draw_loot.asm +++ b/gk/draw_loot.asm @@ -1,4 +1,5 @@ RedrawLoot: + SEP #$20 JSL DrawLoot ; what we wrote over diff --git a/gk/dungeon_indicator.asm b/gk/dungeon_indicator.asm index f2721e1..625650b 100644 --- a/gk/dungeon_indicator.asm +++ b/gk/dungeon_indicator.asm @@ -5,6 +5,15 @@ LoadDungeonIndicator: LDA.w DungeonID CMP.b #DungeonIndicatorMap_end-DungeonIndicatorMap : BCS .done TAX + + ; mark dungeon as entered + REP #$20 + LDA.w DungeonMask, X + ORA.l DungeonVisited + STA.l DungeonVisited + SEP #$20 + + ; load indicator LDA.l DungeonIndicatorMap, X TAX diff --git a/gk/dungeon_switch.asm b/gk/dungeon_switch.asm index 717bc4c..c9e12ad 100644 --- a/gk/dungeon_switch.asm +++ b/gk/dungeon_switch.asm @@ -42,6 +42,8 @@ CheckSwitchMap: BRA .doors_done .change_dungeon + LDA.l MapSwapping + BEQ .doors_done JSL DoorsMapChangeDungeon BRA .doors_done @@ -59,10 +61,14 @@ CheckSwitchMap: .not_fancy_door_map SEP #$20 + LDA.l MapSwapping + BEQ .no_swap + LDA.b $F6 AND.b #$30 - BNE + + BNE .do_swap +.no_swap ; what we wrote over REP #$20 LDA.w DungeonMapFloorCountData, X @@ -70,15 +76,20 @@ CheckSwitchMap: CLC : ADC.b $00 RTL -+ PHA +.do_swap TXA +.try_next ASL A TAX - PLA + LDA.b $F6 BIT.b #$20 BNE + INX -+ LDA.l DungeonMapData.prev, X ++ + + LDA.l DungeonMapData.prev, X + JSL IsValidDungeonToSwapTo + BCC .try_next STA.w DungeonID LDA.b #$04 @@ -87,6 +98,58 @@ CheckSwitchMap: LDA.w #$0000 RTL +; in A = dungeon ID to check +; out C - CC = not valid, CS = valid +IsValidDungeonToSwapTo: + CMP.l CachedDungeonID ; dungeon we're in is always valid + BNE + + SEC + RTL ++ + + PHP + REP #$20 + PHX : PHA + TAX + + LDA.l MapSwapping + BIT.w #$0080 + BNE .yes + + BIT.w #$0001 + BEQ + + ; check visited flag + LDA.l SwapMasks, X + AND.l DungeonVisited + BNE .yes ++ + + LDA.l MapSwapping : BIT.w #$0002 + BEQ + + ; check map flag + LDA.l SwapMasks, X + AND.l MapField + BNE .yes ++ + +.no + PLA : PLX + PLP + CLC + RTL + +.yes + PLA : PLX + PLP + SEC + RTL + +SwapMasks: + dw $C000, $C000, $2000, $1000 + dw $0800, $0400, $0200, $0100 + dw $0080, $0040, $0020, $0010 + dw $0008, $0004, $0002, $0001 + DungeonMapSwitch_Submodule: JSL $80893D JSL $80833F @@ -224,39 +287,32 @@ DrawDungeonLabel: CLC : ADC.w #$0008 TAY + LDA.l MapSwapping + BEQ + ; L/R switch indicators - LDA.w #$E310 + LDA.w #$E360 STA.w GFXStripes+$02, Y - LDA.w #$E910 + LDA.w #$E960 STA.w GFXStripes+$0A, Y - LDA.w #$E318 - STA.w GFXStripes+$12, Y - LDA.w #$E918 - STA.w GFXStripes+$1A, Y LDA.w #$0300 STA.w GFXStripes+$04, Y STA.w GFXStripes+$0C, Y - STA.w GFXStripes+$14, Y - STA.w GFXStripes+$1C, Y - LDA.w #$49AF + LDA.w #$65BF STA.w GFXStripes+$06, Y - STA.w GFXStripes+$16, Y - LDA.w #$099E + LDA.w #$25BD STA.w GFXStripes+$08, Y - STA.w GFXStripes+$18, Y - LDA.w #$099F + LDA.w #$25BE STA.w GFXStripes+$0E, Y - STA.w GFXStripes+$1E, Y - LDA.w #$09AF + LDA.w #$25BF STA.w GFXStripes+$10, Y - STA.w GFXStripes+$20, Y TYA - CLC : ADC.w #$0020 + CLC : ADC.w #$0010 TAY ++ LDA.l DRMode BNE .doors diff --git a/menu/drfont.2bpp b/menu/drfont.2bpp index b4782ed..5c209ae 100644 Binary files a/menu/drfont.2bpp and b/menu/drfont.2bpp differ diff --git a/menu/hudalpha.asm b/menu/hudalpha.asm index 280d31b..1496ae1 100644 --- a/menu/hudalpha.asm +++ b/menu/hudalpha.asm @@ -9,7 +9,7 @@ UploadMenuOnlyIcons: REP #$20 LDA.w #MenuOnlyIcons : STA.w $4342 LDA.w #$1801 : STA.w $4340 - LDA.w #$0310 : STA.w $4345 + LDA.w #$0400 : STA.w $4345 LDA.w #$0F800>>1 : STA.w $2116 SEP #$20 diff --git a/sram.asm b/sram.asm index b6bb73d..9c05d50 100644 --- a/sram.asm +++ b/sram.asm @@ -240,7 +240,9 @@ CompassCountDisplay: skip 2 ; Compass count display flags (bitfield) ; High Byte: x c e d a s p m ; x = Sewers | c = Hyrule Castle | e = Eastern Palace | d = Desert Palace ; a = Castle Tower | s = Swamp Palace | p = PoD | m = Mire -skip 10 ; +DungeonVisited: skip 2 ; Whether each dungeon has been entered (bitfield) + ; same order of bits as CompassCountDisplay above +skip 8 ; Aga2Duck: skip 1 ; Used in lieu of pyramid hole for checking if the duck should come ; 0 = Haven't called post-Aga 2 bird | 1 = Have called post-Aga 2 bird NpcFlags: skip 2 ; l - c s t k z o (bitfield)