From e2525ebdb11e68a72d5b49b12034582115302d83 Mon Sep 17 00:00:00 2001 From: cassidoxa Date: Tue, 22 Aug 2023 01:40:53 -0400 Subject: [PATCH] Rework menu dungeon item + select behavior Fix colored heart animations --- inventory.asm | 28 +++- newhud.asm | 2 + pendantcrystalhud.asm | 299 +++++++++++++++++++----------------------- sram.asm | 3 +- 4 files changed, 163 insertions(+), 169 deletions(-) diff --git a/inventory.asm b/inventory.asm index d1a87c7..a4591da 100644 --- a/inventory.asm +++ b/inventory.asm @@ -10,10 +10,9 @@ ProcessMenuButtons: BIT.b #$20 : BNE .sel_pressed ; check for P1 Select button LDA.b Joy1A_All : BIT.b #$20 : BNE .sel_held .sel_unheld - LDA.l HudFlag : AND.b #$20 : BEQ + - LDA.l HudFlag : AND.b #$DF : STA.l HudFlag ; select is released, unset hud flag - LDA.b IndoorsFlag : BEQ + ; skip if outdoors - LDA.b #$20 : STA.w SFX3 ; menu select sound + LDA.l HudFlag : AND.b #$60 : BEQ + + LDA.b #$00 : STA.l HudFlag + JSL.l MaybePlaySelectSFX + JSL.l ResetEquipment + @@ -21,8 +20,14 @@ ProcessMenuButtons: CLC ; no buttons RTL .sel_pressed - LDA.l HudFlag : ORA.b #$20 : STA.l HudFlag ; set hud flag - LDA.b #$20 : STA.w SFX3 ; menu select sound + LDA.l HUDDungeonItems : BIT.b #$0C : BNE + + LDA.b #$40 + BRA .store_flag + + + LDA.b #$60 + .store_flag + STA.l HudFlag + JSL.l MaybePlaySelectSFX JSL.l ResetEquipment RTL .y_pressed ; Note: used as entry point by quickswap code. Must preserve X. @@ -737,3 +742,14 @@ RTL } ;-------------------------------------------------------------------------------- +MaybePlaySelectSFX: + LDA.w DungeonID : BMI .not_dungeon + .play + LDA.b #$20 : STA.w SFX3 ; menu select sound + RTL + .not_dungeon + LDA.l HUDDungeonItems : BIT.b #$13 : BEQ .dont_play + BIT.b #$0C : BEQ .dont_play + BRA .play + .dont_play +RTL diff --git a/newhud.asm b/newhud.asm index 52de6f7..680d400 100644 --- a/newhud.asm +++ b/newhud.asm @@ -494,9 +494,11 @@ CheckHeartPalette: RTS ColorAnimatedHearts: + PHX REP #$20 LDA.l HUDHeartColors_index : ASL : TAX LDA.l HUDHeartColors_masks_game_hud,X + PLX ORA.l HeartFramesBaseTiles,X STA.b [Scrap00],Y SEP #$20 diff --git a/pendantcrystalhud.asm b/pendantcrystalhud.asm index 9048759..7364b34 100644 --- a/pendantcrystalhud.asm +++ b/pendantcrystalhud.asm @@ -116,10 +116,14 @@ RTL ;================================================================================ ShowDungeonItems: REP #$30 - LDA.w DungeonID : AND.w #$00FF : CMP.w #$00FF : BNE + : RTL : + ; return normal result if outdoors or in a cave - LDA.l HudFlag : AND.w #$0020 ; check hud flag - BEQ + : LDA.w #$0000 : RTL : + ; if set, send the zero onwards - LDA.w DungeonID : AND.w #$00FF : CMP.w #$00FF ; original logic + LDA.w DungeonID-1 : BMI .no_dungeon + LDA.l HudFlag : AND.w #$0040 : BEQ + + .no_dungeon + LDA.w #$0000 + RTL + + + LDA.w IndoorsFlag + .done RTL ;-------------------------------------------------------------------------------- UpdateKeys: @@ -190,7 +194,7 @@ RTL ;-------------------------------------------------------------------------------- DrawHUDDungeonItems: LDA.l HUDDungeonItems : BNE .continue - RTL +RTL .dungeon_positions dw 0 ; Hyrule Castle @@ -253,28 +257,19 @@ DrawHUDDungeonItems: dw $A4*2 ; ; Turtle Rock dw $0D*2 ; ; Ganon's Tower -.continue - PHP - - PHB - PHK - PLB - - REP #$30 - + .continue + PHP : PHB + PHK : PLB + REP #$30 ;------------------------------------------------------------------------------- ; dungeon names LDA.w #$2D50 - LDY.w #00 - -.next_dungeon_name + .next_dungeon_name LDX.w .dungeon_positions,Y STA.w GFXStripes+$0646,X - INC - INY : INY CPY.w #26 : BCC .next_dungeon_name @@ -286,163 +281,138 @@ DrawHUDDungeonItems: STA.w GFXStripes+$06C6,X STA.w GFXStripes+$0706,X - DEX : DEX : BPL -- - + DEX : DEX + BPL -- LDA.l HudFlag : AND.w #$0020 : BEQ + - - JMP .maps_and_compasses - -+ + JMP .maps_and_compasses ;------------------------------------------------------------------------------- + + + LDA.l HUDDungeonItems : AND.w #$0001 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$0684 ; blank tile + BRA .skip_small_keys + + + .draw_small_keys + LDA.w #$2810 : STA.w GFXStripes+$0684 ; small keys icon + LDY.w #0 + CLC - LDA.l HUDDungeonItems : AND.w #$0001 : BEQ .skip_small_keys + .next_small_key + LDX.w .small_key_x_offset,Y + LDA.l DungeonKeys,X + AND.w #$00FF -.draw_small_keys - LDA.w #$2810 : STA.w GFXStripes+$0684 ; small keys icon + LDX.w .dungeon_positions,Y + ADC.w #$2816 + STA.w GFXStripes+$0686,X - LDY.w #0 - - ; Clear the carry only once - ; it will be cleared by looping condition afterwards - CLC - -.next_small_key - LDX.w .small_key_x_offset,Y - LDA.l DungeonKeys,X - AND.w #$00FF - - LDX.w .dungeon_positions,Y - ADC.w #$2816 - STA.w GFXStripes+$0686,X - - INY : INY - CPY.w #26 : BCC .next_small_key + INY : INY + CPY.w #26 : BCC .next_small_key ;------------------------------------------------------------------------------- -.skip_small_keys + .skip_small_keys + ; Big Keys + LDA.l HUDDungeonItems : AND.w #$0002 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$06C4 ; blank tile + BRA .skip_big_keys + + + LDA.w #$2811 : STA.w GFXStripes+$06C4 ; big key icon + LDX.w #0 + LDA.l BigKeyField - ; Big Keys - LDA.l HUDDungeonItems : AND.w #$0002 : BEQ .skip_big_keys + .next_big_key + BIT.w .dungeon_bitmasks,X + BEQ ..skip_key + LDY.w .dungeon_positions,X + LDA.w #$2826 + STA.w GFXStripes+$06C6,Y + LDA.l BigKeyField - LDA.w #$2811 : STA.w GFXStripes+$06C4 ; big key icon - - ; use X so we can BIT - LDX.w #0 - - ; load once and test multiple times - LDA.l BigKeyField - -.next_big_key - BIT.w .dungeon_bitmasks,X - BEQ ..skip_key - - LDY.w .dungeon_positions,X - LDA.w #$2826 - STA.w GFXStripes+$06C6,Y - - ; reload - LDA.l BigKeyField - -..skip_key - INX : INX - CPX.w #26 : BCC .next_big_key + ..skip_key + INX : INX + CPX.w #26 : BCC .next_big_key ;------------------------------------------------------------------------------- -.skip_big_keys + .skip_big_keys + LDA.l HUDDungeonItems : AND.w #$0010 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$0704 ; blank tile + BRA .skip_boss_kills + + + LDA.w #$280F : STA.w GFXStripes+$0704 ; skull icon + LDY.w #0 - LDA.l HUDDungeonItems : AND.w #$0010 : BEQ .skip_boss_kills - LDA.w #$280F : STA.w GFXStripes+$0704 ; skull icon - LDY.w #0 + .next_boss_kill + LDX.w .boss_room_ids,Y + LDA.l RoomDataWRAM.l,X + AND.w #$0800 + BEQ ..skip_boss_kill + LDA.w #$2826 + LDX.w .dungeon_positions,Y + STA.w GFXStripes+$0706,X + ..skip_boss_kill + INY : INY + CPY.w #26 : BCC .next_boss_kill -.next_boss_kill - LDX.w .boss_room_ids,Y - LDA.l RoomDataWRAM.l,X - AND.w #$0800 - BEQ ..skip_boss_kill +;------------------------------------------------------------------------------- + .skip_boss_kills + LDA.l HUDDungeonItems : BIT.w #$00F3 : BEQ .maps_and_compasses + JMP .exit +;------------------------------------------------------------------------------- + .maps_and_compasses + LDA.w #$24F5 : STA.w GFXStripes+$0704 ; blank tile boss icon + ; Maps + LDA.l HUDDungeonItems : AND.w #$0004 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$0684 ; map icon + BRA .skip_maps + + + LDA.w #$2821 : STA.w GFXStripes+$0684 ; map icon + LDX.w #0 + LDA.l MapField - LDA.w #$2826 - LDX.w .dungeon_positions,Y - STA.w GFXStripes+$0706,X + .next_map + BIT.w .dungeon_bitmasks,X + BEQ ..skip_map -..skip_boss_kill - INY : INY - CPY.w #26 : BCC .next_boss_kill + LDY.w .dungeon_positions,X + LDA.w #$2826 + STA.w GFXStripes+$0686,Y + LDA.l MapField + + ..skip_map + INX : INX + CPX.w #26 : BCC .next_map + + .skip_maps + LDA.l HUDDungeonItems : AND.w #$0008 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$06C4 ; blank tile + BRA .skip_compasses + + + LDA.w #$2C20 : STA.w GFXStripes+$06C4 ; compass icon + LDX.w #0 + LDA.l CompassField + + .next_compass + BIT.w .dungeon_bitmasks,X + BEQ ..skip_compass + + LDY.w .dungeon_positions,X + LDA.w #$2826 + STA.w GFXStripes+$06C6,Y + LDA.l CompassField + + ..skip_compass + INX : INX + CPX.w #26 : BCC .next_compass ;------------------------------------------------------------------------------- -.skip_boss_kills - JMP .exit - -;------------------------------------------------------------------------------- - - ; This should only display if select is pressed in hud - .maps_and_compasses - - ; Maps - LDA.l HUDDungeonItems : AND.w #$0004 : BEQ .skip_maps - LDA.w #$2821 : STA.w GFXStripes+$0684 ; map icon - - ; use X so we can BIT - LDX.w #0 - - ; load once and test multiple times - LDA.l MapField - -.next_map - BIT.w .dungeon_bitmasks,X - BEQ ..skip_map - - LDY.w .dungeon_positions,X - LDA.w #$2826 - STA.w GFXStripes+$0686,Y - - ; reload - LDA.l MapField - -..skip_map - INX : INX - CPX.w #26 : BCC .next_map - -;------------------------------------------------------------------------------- - -.skip_maps - - ; Compasses - LDA.l HUDDungeonItems : AND.w #$0008 : BEQ .skip_compasses - LDA.w #$2C20 : STA.w GFXStripes+$06C4 ; compass icon - - ; use X so we can BIT - LDX.w #0 - - ; load once and test multiple times - LDA.l CompassField - -.next_compass - BIT.w .dungeon_bitmasks,X - BEQ ..skip_compass - - LDY.w .dungeon_positions,X - LDA.w #$2826 - STA.w GFXStripes+$06C6,Y - - ; reload - LDA.l CompassField - -..skip_compass - INX : INX - CPX.w #26 : BCC .next_compass - -;------------------------------------------------------------------------------- - -.skip_compasses - -.exit - PLB - PLP + .skip_compasses + .exit + PLB + PLP RTL ;-------------------------------------------------------------------------------- ;================================================================================ @@ -598,15 +568,19 @@ HandleEmptyMenu: LDA.b Joy1A_New : BIT.b #$DF : BNE .close_menu ; Not select, close menu BIT.b #$20 : BNE .sel_pressed LDA.b Joy1A_All : BIT.b #$20 : BNE .wait_for_change - LDA.l HudFlag : AND.b #$20 : BEQ .wait_for_change ; HUD flag off, skip drawing work - LDA.l HudFlag : AND.b #$DF : STA.l HudFlag ; Unset without select - LDA.b IndoorsFlag : BEQ ++ ; skip if outdoors - LDA.b #$20 : STA.w SFX3 - ++ - LDA.b #$0C : BRA .done + LDA.l HudFlag : AND.b #$60 : BEQ .wait_for_change + LDA.l HudFlag : AND.b #$9F : STA.l HudFlag ; Unset without select + JSL.l MaybePlaySelectSFX + LDA.b #$0C : BRA .done .sel_pressed - LDA.l HudFlag : ORA.b #$20 : STA.l HudFlag - LDA.b #$20 : STA.w SFX3 + LDA.l HUDDungeonItems : BIT.b #$0C : BNE + + LDA.b #$40 + BRA .store_flag + + + LDA.b #$60 + .store_flag + STA.l HudFlag + JSL.l MaybePlaySelectSFX LDA.b #$0C : BRA .done .wait_for_change LDA.b #$03 : BRA .done @@ -665,3 +639,4 @@ dw $2084, $6084, $2085, $6085 ; 0 heart pieces dw $20AD, $6084, $2085, $6085 ; 1 heart piece dw $20AD, $6084, $20AE, $6085 ; 2 heart pieces dw $20AD, $60AD, $20AE, $6085 ; 3 heart pieces +;------------------------------------------------------------------------------- diff --git a/sram.asm b/sram.asm index 92b93df..9bc5846 100644 --- a/sram.asm +++ b/sram.asm @@ -255,7 +255,8 @@ MapOverlay: skip 2 ; Used to reveal dungeon prizes on the map in mo ; | m = Misery Mire | d = Palace of Darkness | s = Swamp Palace ; | a = Aga Tower | t = Desert Palace | e = Eastern Palace ; / h = Hyrule Castle | s = Sewer Passage -HudFlag: ; +HudFlag: ; - h c - - - - - + ; c = show maps and compasses | h = show heart pieces IgnoreFaeries: ; HasGroveItem: ; GeneralFlags: skip 1 ; - - h - - i - g (bitfield)