hud and menu housekeeping

This commit is contained in:
scawful
2022-10-01 02:22:20 -05:00
parent 2d60b9654e
commit 55ed3943fd
4 changed files with 174 additions and 264 deletions

View File

@@ -45,22 +45,23 @@ Menu_Tilemap:
incbin "tilemaps/menu_frame.tilemap"
Menu_QuestIcons:
incbin "tilemaps/quest_icons.tilemap"
incsrc "menu_gfx_table.asm"
incsrc "menu_draw_items.asm"
incsrc "menu_text.asm"
incsrc "menu_palette.asm"
; Traverse jump table containing routines for Oracle of Secrets menu
; Subroutine table in menu_vectors
Menu_Entry:
{
PHB : PHK : PLB
LDA.w $0200
ASL
TAX
LDA.w $0200 : ASL : TAX
JSR (.vectors,X)
SEP #$20
PLB
RTL
}
incsrc "menu_vectors.asm"
; =============================================================================
@@ -136,7 +137,10 @@ Menu_UploadLeft:
; 03 MENU SCROLL DOWN
Menu_Scroll:
dw 0, -3, -5, -7, -10, -12, -15, -20, -28, -40, -50, -60, -75, -90, -100, -125, -150, -175, -190, -200, -210, -220, -225, -230, -232, -234, -238
dw 0, -3, -5, -7, -10, -12, -15, -20
dw -28, -40, -50, -60, -75, -90, -100
dw -125, -150, -175, -190, -200, -210
dw -220, -225, -230, -232, -234, -238
Menu_ScrollDown:
{
@@ -161,33 +165,6 @@ Menu_ScrollDown:
; 04 MENU ITEM SCREEN
incsrc "menu_select_item.asm"
Menu_InitItemScreen:
{
SEP #$30
LDY.w $0202 : BNE .all_good
.loop
INY : CPY.b #$25 : BCS .bad
LDX.w Menu_AddressIndex-1, Y
LDA.l $7EF300, X
BEQ .loop
STY.w $0202
BRA .all_good
.bad
STZ.w $0202
.all_good
STZ $0207
LDA.b #$04
STA.w $0200
RTS
}
; -----------------------------------------------------------------------------
Menu_ItemScreen:
{
JSR Menu_CheckHScroll
@@ -250,7 +227,6 @@ Menu_ItemScreen:
STA.w $11CE, X
BRA .done
.no_delete
LDA.w #$3060 : STA.w $1108, X ; corner
LDA.w #$3070 : STA.w $1148, X
@@ -290,6 +266,7 @@ Menu_ScrollTo:
; =============================================================================
; 06 MENU STATS SCREEN
incsrc "menu_scroll.asm"
Menu_StatsScreen:
{
@@ -297,61 +274,6 @@ Menu_StatsScreen:
RTS
}
; -----------------------------------------------------------------------------
Menu_CheckHScroll:
{
LDA.b $F4
BIT.b #$10 : BNE .leave_menu
LDA.b $F6
BIT.b #$20 : BNE .left
BIT.b #$10 : BNE .right
RTS
.left
REP #$20
LDA.w #$FFF8
BRA .merge
.right
REP #$20
LDA.w #$0008
.merge
STA.w MenuScrollHDirection
SEP #$30
INC.w $0200
LDA.b #$06 : STA.w $012F
RTS
.leave_menu
LDA.b #$08
STA.w $0200
RTS
}
; -----------------------------------------------------------------------------
Menu_ScrollHorizontal:
{
REP #$21 ; set A to 16 bit, clear carry flag
LDA.w $E4 ; BG3 Horizontal Scroll Value
ADC.w MenuScrollHDirection ; Direction set by Menu_CheckHScroll
AND.w #$01FF
STA.b $E4
AND.w #$00FF
BNE .loop
SEC
RTS
.loop
CLC
RTS
}
; =============================================================================
; 07 MENU SCROLL FROM
@@ -440,8 +362,8 @@ Menu_Exit:
RTS
}
; =============================================================================
incsrc "menu_draw_bg.asm"
incsrc "lw_map_names.asm"
incsrc "menu_hud.asm"
; =============================================================================

View File

@@ -1,26 +1,28 @@
; =============================================================================
; headsup display
org $0DFB91
JSL NewMenuUpdate
RTS
JSL Hud_Update
RTS
newIgnoreItemBox:
JSL NewMenuUpdate_ignoreItemBox
RTS
JSL Hud_Update_ignoreItemBox
RTS
org $0DDD21
JSR newIgnoreItemBox
JSR newIgnoreItemBox
; =============================================================================
org $268000
NewMenuUpdate:
Hud_Update:
{
JSR Hud_UpdateItemBox
JSR Hud_Hud_UpdateItemBox
; *$6FB94 ALTERNATE ENTRY POINT
.ignoreItemBox
.ignoreItemBox ; ALTERNATE ENTRY POINT
SEP #$30
; the hook for optimization was placed here...
; need to draw partial heart still though. update: optimization complete with great results
; need to draw partial heart still though.
LDA.b #$FD : STA $0A
LDA.b #$F9 : STA $0B
LDA.b #$0D : STA $0C
@@ -51,12 +53,12 @@ NewMenuUpdate:
LDA $7EF36C : CMP $7EF36D : BEQ .healthUpdated
; Seems absurd to have a branch of zero bytes, right?
SBC #$04 : CMP $7EF36D : BCS .healthUpdated
SEC : SBC #$04 : CMP $7EF36D : BCS .healthUpdated
.healthUpdated
; A = actual health + 0x03;
LDA $7EF36D : ADC.b #$03
LDA $7EF36D : SEC : SBC #$03
REP #$30
@@ -64,28 +66,26 @@ NewMenuUpdate:
LDA $7EF36C : AND.w #$00FF : STA $02
; this time we're filling in the full and partially filled hearts (actual health)
; filling in the full and partially filled hearts (actual health)
JSR HUD_UpdateHearts
; *$6FC09 ALTERNATE ENTRY POINT ; reentry hook
.ignoreHealth
.ignoreHealth ; *$6FC09 ALTERNATE ENTRY POINT ; reentry hook
REP #$30
; Magic amount indicator (normal, 1/2, or 1/4)
LDA $7EF37B : AND.w #$00FF : CMP.w #$0001 : BCC .normalMagicMeter
; draws a 1/2 magic meter (note, we could add in the 1/4 magic meter here if
; we really cared about that >_>
; draw 1/2 magic meter
LDA.w #$28F7 : STA $7EC704
LDA.w #$2851 : STA $7EC706
LDA.w #$28FA : STA $7EC708
.normalMagicMeter
; check how much magic power the player has at the moment (ranges from 0 to 0x7F)
; check player magic (ranges from 0 to 0x7F)
; X = ((MP & 0xFF)) + 7) & 0xFFF8)
LDA $7EF36E : AND.w #$00FF : ADC.w #$0007 : AND.w #$FFF8 : TAX
LDA $7EF36E : AND.w #$00FF : CLC : ADC #$0007 : AND.w #$FFF8 : TAX
; these four writes draw the magic power bar based on how much MP you have
LDA MagicTilemap+0, X : STA $7EC746
@@ -163,34 +163,20 @@ NewMenuUpdate:
RTL
}
; ==============================================================================
; Update Items
; =============================================================================
namespace Hud
incsrc "menu_gfx_table.asm"
HudItems:
dw BowsGFX
dw BoomsGFX
dw HookGFX
dw BombsGFX
dw DekuMaskGFX
dw BottlesGFX
dw HammerGFX
dw LampGFX
dw Fire_rodGFX
dw Ice_rodGFX
dw GoronMaskGFX
dw BottlesGFX
dw ShovelGFX
dw JumpFeatherGFX
dw SomariaGFX
dw ByrnaGFX
dw BunnyHoodGFX
dw BottlesGFX
dw PowderGFX
dw BookGFX
dw OcarinaGFX
dw MirrorGFX
dw StoneMaskGFX
dw BottlesGFX
dw BowsGFX : dw BoomsGFX : dw HookGFX
dw BombsGFX : dw DekuMaskGFX : dw BottlesGFX
dw HammerGFX : dw LampGFX : dw Fire_rodGFX
dw Ice_rodGFX : dw GoronMaskGFX : dw BottlesGFX
dw ShovelGFX : dw JumpFeatherGFX : dw SomariaGFX
dw ByrnaGFX : dw BunnyHoodGFX : dw BottlesGFX
dw PowderGFX : dw BookGFX : dw OcarinaGFX
dw MirrorGFX : dw StoneMaskGFX : dw BottlesGFX
Hud_UpdateItemBox:
{
@@ -199,98 +185,18 @@ Hud_UpdateItemBox:
ASL : TAX
LDY.w HudItems-2, X
LDA.w $0000,Y : STA.l $7EC778
LDA.w $0002,Y : STA.l $7EC77A
LDA.w $0004,Y : STA.l $7EC7B8
LDA.w $0006,Y : STA.l $7EC7BA
LDA.w $0000,Y : STA.l $7EC778-6
LDA.w $0002,Y : STA.l $7EC77A-6
LDA.w $0004,Y : STA.l $7EC7B8-6
LDA.w $0006,Y : STA.l $7EC7BA-6
SEP #$30
RTS
}
Vanilla_UpdateItemBox:
{
SEP #$30
namespace off
; Dost thou haveth the the bow?
LDA $7EF340 : BEQ .havethNoBow
; Dost thou haveth the silver arrows?
; (okay I'll stop soon)
CMP.b #$03 : BCC .havethNoSilverArrows
; Draw the arrow guage icon as silver rather than normal wood arrows.
LDA.b #$86 : STA $7EC71E
LDA.b #$24 : STA $7EC71F
LDA.b #$87 : STA $7EC720
LDA.b #$24 : STA $7EC721
LDX.b #$04
; check how many arrows the player has
LDA $7EF377 : BNE .drawBowItemIcon
LDX.b #$03
BRA .drawBowItemIcon
.havethNoSilverArrows
LDX.b #$02
LDA $7EF377 : BNE .drawBowItemIcon
LDX.b #$01
.drawBowItemIcon
; values of X correspond to how the icon will end up drawn:
; 0x01 - normal bow with no arrows
; 0x02 - normal bow with arrows
; 0x03 - silver bow with no silver arrows
; 0x04 - silver bow with silver arrows
TXA : STA $7EF340
.havethNoBow
REP #$30
LDX $0202 : BEQ .noEquippedItem
LDA $7EF33F, X : AND.w #$00FF
CPX.w #$0004 : BNE .bombsNotEquipped
LDA.w #$0001
.bombsNotEquipped
CPX.w #$0010 : BNE .bottleNotEquipped
TXY : TAX : LDA $7EF35B, X : AND.w #$00FF : TYX
.bottleNotEquipped
STA $02
TXA : DEC A : ASL A : TAX
LDA $FA93, X : STA $04
LDA $02 : ASL #3 : TAY
; These addresses form the item box graphics.
LDA ($04), Y : STA $7EC74A : INY #2
LDA ($04), Y : STA $7EC74C : INY #2
LDA ($04), Y : STA $7EC78A : INY #2
LDA ($04), Y : STA $7EC78C : INY #2
.noEquippedItem
RTS
}
; ==============================================================================
; =============================================================================
HUD_UpdateHearts:
{
@@ -343,7 +249,7 @@ HUD_UpdateHearts:
; if not, we have to move down one tile in the tilemap
LDX.w #$0000
LDA $07 : ADC.w #$0040 : STA $07
LDA $07 : CLC : ADC #$0040 : STA $07
.noLineChange
@@ -352,7 +258,7 @@ HUD_UpdateHearts:
RTS
}
; ==============================================================================
; =============================================================================
MagicTilemap:
dw $3CF5, $3CF5, $3CF5, $3CF5
@@ -373,65 +279,64 @@ MagicTilemap:
dw $3C4D, $3C5E, $3C5E, $3C5E
dw $3C4E, $3C5E, $3C5E, $3C5E
; ==============================================================================
; =============================================================================
HexToDecimal:
{
; This apparently is a hex to decimal converter for use with displaying numbers
; It's obviously slower with larger numbers... should find a way to speed it up. (already done)
REP #$30
STZ $0003
; The objects mentioned could be rupees, arrows, bombs, or keys.
LDX.w #$0000
LDY.w #$0002
.nextDigit
; If number of objects left < 100, 10
CMP $F9F9, Y : BCC .nextLowest10sPlace
; Otherwise take off another 100 objects from the total and increment $03
; $6F9F9, Y THAT IS, 100, 10
SBC $F9F9, Y
SEC : SBC $F9F9, Y
INC $03, X
BRA .nextDigit
.nextLowest10sPlace
INX : DEY #2
; Move on to next digit (to the right)
BPL .nextDigit
; Whatever is left is obviously less than 10, so store the digit at $05.
STA $05
SEP #$30
; Go through at most three digits.
LDX.b #$02
; Repeat for all three digits.
.setNextDigitTile
; Load each digit's computed value
LDA $03, X : CMP.b #$7F
BEQ .blankDigit
; #$0-9 -> #$90-#$99
ORA.b #$90
.blankDigit
; A blank digit.
STA $03, X
DEX : BPL .setNextDigitTile
RTS
}
; =============================================================================
; $6FE77-$6FFC0
org $0DFE77
HUD_Tilemap:
{
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $346C, $346D, $346E, $346F ; item frame top part
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $34DE, $207F, $207F, $34DF
; item frame left part
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $34DE, $207F, $207F, $34DF
; item frame right part
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
; item frame bottom part
dw $207F, $207F, $207F, $207F, $347C, $347D, $347E, $341D
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F
dw $207F
}

57
Menu/menu_scroll.asm Normal file
View File

@@ -0,0 +1,57 @@
; -----------------------------------------------------------------------------
Menu_CheckHScroll:
{
LDA.b $F4
BIT.b #$10 : BNE .leave_menu
LDA.b $F6
BIT.b #$20 : BNE .left
BIT.b #$10 : BNE .right
RTS
.left
REP #$20
LDA.w #$FFF8
BRA .merge
.right
REP #$20
LDA.w #$0008
.merge
STA.w MenuScrollHDirection
SEP #$30
INC.w $0200
LDA.b #$06 : STA.w $012F
RTS
.leave_menu
LDA.b #$08
STA.w $0200
RTS
}
; -----------------------------------------------------------------------------
Menu_ScrollHorizontal:
{
REP #$21 ; set A to 16 bit, clear carry flag
LDA.w $E4 ; BG3 Horizontal Scroll Value
ADC.w MenuScrollHDirection ; Direction set by Menu_CheckHScroll
AND.w #$01FF
STA.b $E4
AND.w #$00FF
BNE .loop
SEC
RTS
.loop
CLC
RTS
}
; -----------------------------------------------------------------------------

View File

@@ -157,3 +157,29 @@ Menu_DeleteCursor:
RTS
; -----------------------------------------------------------------------------
Menu_InitItemScreen:
{
SEP #$30
LDY.w $0202 : BNE .all_good
.loop
INY : CPY.b #$25 : BCS .bad
LDX.w Menu_AddressIndex-1, Y
LDA.l $7EF300, X
BEQ .loop
STY.w $0202
BRA .all_good
.bad
STZ.w $0202
.all_good
STZ $0207
LDA.b #$04
STA.w $0200
RTS
}
; -----------------------------------------------------------------------------