From 916f660335c6bd76c1465347b6c3310f325cf7f3 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 10 Feb 2024 15:48:28 -0500 Subject: [PATCH] Update goldstar to work with hookshot, HUD and menu --- Items/goldstar.asm | 87 +++++++++++++++++++++++++++++------------ Menu/menu_draw.asm | 23 ++++++----- Menu/menu_gfx_table.asm | 6 +-- Menu/menu_hud.asm | 86 +++++++++++++++------------------------- Menu/menu_text.asm | 85 +++++++++++++++++++++++++++++++++++----- 5 files changed, 185 insertions(+), 102 deletions(-) diff --git a/Items/goldstar.asm b/Items/goldstar.asm index 150d27f..eaa5fda 100644 --- a/Items/goldstar.asm +++ b/Items/goldstar.asm @@ -55,9 +55,8 @@ pullpc HookMaskCheck: { - LDA.w $0202 : AND.w #$00FF : CMP.w #$000E : BNE .not_mask - ; morning star graphics oam tile pattern id - LDA.w $0109 : AND #$FF00 : ORA.w #$004A + LDA GoldstarOrHookshot : AND.w #$00FF : CMP.w #$0002 : BNE .not_mask + LDA.w $0109 : AND #$FF00 : ORA.w #$004A ; morning star graphics oam tile pattern id RTL .not_mask ; return hookshot graphics oam tile pattern id @@ -95,7 +94,7 @@ pullpc ; $22D4C0 - Hooked into AncillaDraw_Hookshot @ _08BF2D BallChain_DrawOrReturn: { - LDA $0202 : CMP #$0E : BEQ + + LDA GoldstarOrHookshot : CMP #$02 : BEQ + LDA #$00 : STA ($92),Y RTL + ; $22D4CD @@ -114,13 +113,13 @@ pullpc BallChain_ExtraCollisionLogic: { TAX - LDA $0202 : CMP #$0E : BNE + ; Check if turtle - TXA : CMP #$0A : BNE ++ ; $22D4F3 - LDA #$FF : BRA ++ ; $22D4F3 + LDA GoldstarOrHookshot : CMP #$02 : BNE + ; Check if using goldstar + TXA : CMP #$0A : BNE ++ + LDA #$FF : BRA ++ + ; $22D4F2 TXA ++ ; $22D4F3 - CMP #$FF : BEQ +++ ; $22D4FB + CMP #$FF : BEQ +++ JML $08BF10 ; AncillaDraw_Hookshot - JSR Ancilla_SetOAM_XY, skips hookshot char +++ ; $22D4FB JML $08BF32 ; AncillaDraw_Hookshot_skip @@ -241,7 +240,7 @@ pullpc ; Sets Link state to 0x00 and resets the hookshot timer BallChain_ResetTimer: { - LDA $0202 : CMP #$0E : BNE + + LDA GoldstarOrHookshot : CMP #$02 : BNE + STZ $7A ; Clear the timer + STZ $5D ; Return to LinkState_Default @@ -262,7 +261,7 @@ pullpc ; Natively NOPs out the bytes 08BFDA - 08BFEA BallChain_DrawChainOrHookshot: { - LDA $0202 : CMP #$0E : BEQ + + LDA GoldstarOrHookshot : CMP #$02 : BEQ + LDA #$19 : STA ($90),Y JSR BallChainOrHookshot_Modifier ; $D820 ORA.b #$02 @@ -292,7 +291,7 @@ struct HookshotSpriteData $08BD4C endstruct pushpc -org $8BF1B ; AncillaDraw_HookshotChain +org $08BF1B ; AncillaDraw_HookshotChain JSL Goldstar_SetChainProperties NOP #3 pullpc @@ -300,7 +299,7 @@ pullpc ; $22D850 - Modify the palette Goldstar_SetChainProperties: { - LDA $0202 : CMP #$0E : BEQ .ball_chain + LDA GoldstarOrHookshot : CMP #$02 : BEQ .ball_chain LDA HookshotSpriteData.prop, X ORA.b #$02 : ORA.b $65 RTL @@ -323,14 +322,14 @@ pullpc Link_OAM_Actually: { REP #$20 - LDA $0202 : AND #$00FF : CMP #$000E : BEQ + + LDA $0202 : AND #$00FF : CMP #$0003 : BEQ + LDA $839B,Y RTL + ; $22D892 LDA $839B,Y : CMP #$221A : BEQ ++ RTL ++ ; $22D89B - LDA $0202 : AND #$00FF : CMP #$000E : BEQ +++ + LDA GoldstarOrHookshot : AND #$00FF : CMP #$0002 : BEQ +++ LDA $839B,Y RTL +++ ; $22D8AA @@ -383,6 +382,8 @@ HookshotChain_AncillaDraw: JMP Routine_22D9A0 ; $D9A0 +++++++ ; 22D951 CLC : CMP #$05 : BCC ++++++++ + LDA $F8 : CMP.b #$40 : BEQ + + JMP Routine_22D9A0 ; $D9A0 ++++++++ ; 22D959 JMP Routine_22DBD0 ; $DBD0 @@ -700,11 +701,10 @@ org $08BDFD pullpc ; 22DC50 -; Hooked into Hookshot_Extending_ignore_collision @ 08BDFD HookshotOrBallChain_Extending_ignore_collision: { ; Ball Chain Timer - LDA $7A : CMP #$00 : BNE + ; $22DC5E + LDA $7A : CMP #$00 : BNE + JSL Hookshot_CheckTileCollision ; $07D576 JML $08BE01 ; Hookshot_Extending_ignore_collision continue + ; 22DC5E @@ -914,20 +914,55 @@ Hookshot_Init: Goldstar_Begin: { - BIT $3A : BVS .return - LDA $6C : BNE .return - - JSL Link_CheckNewY_ButtonPress_Long : BCC .return - JSL CheckForBallChain JSL Hookshot_Init JSL BallChain_StartAnimationFlag - LDY.b #$03 - LDA.b #$1F ; ANCILLA 1F + LDY.b #$03 : LDA.b #$1F ; ANCILLA 1F JSL $099B10 ; AncillaAdd_Hookshot JSL TransferGFXinRAM - - .return - RTL } + +CheckForSwitchToGoldstar: +{ + %CheckNewR_ButtonPress() : BEQ .continue + LDA GoldstarOrHookshot : CMP #$01 : BEQ .set_hookshot + LDA #$01 : STA GoldstarOrHookshot + JMP .continue +.set_hookshot: + LDA #$02 : STA GoldstarOrHookshot +.continue: + ; Restore vanilla code + LDA.b $3A : AND.b #$40 + RTL +} + +BeginGoldstarOrHookshot: +{ + LDA GoldstarOrHookshot : CMP #$02 : BEQ .begin_goldstar + JMP .return + +.begin_goldstar: + JSL Goldstar_Begin + RTL + +.return + JSL Hookshot_Init + LDA #$13 : STA $5D ; Set hookshot state + LDA #$01 : STA.w $037B + LDY.b #$03 + LDA.b #$1F ; ANCILLA 1F + JSL $099B10 ; AncillaAdd_Hookshot + RTL +} + +pushpc + +org $07AB25 + JSL CheckForSwitchToGoldstar + +org $07AB3A ;$07AB40 + JSL BeginGoldstarOrHookshot + RTS + +pullpc \ No newline at end of file diff --git a/Menu/menu_draw.asm b/Menu/menu_draw.asm index 84c3083..71a8375 100644 --- a/Menu/menu_draw.asm +++ b/Menu/menu_draw.asm @@ -230,10 +230,15 @@ DrawYItems: LDY.w #BoomsGFX JSR DrawMenuItem - LDA.w #$7EF342 + LDA.l $7EF342 : CMP.w #$0000 : BEQ .no_hookshot + LDA.w GoldstarOrHookshot : BNE .spoof_hookshot + LDA #$0001 ; No goldstar, but hookshot +.spoof_hookshot + STA.w MenuItemValueSpoof : LDA.w #MenuItemValueSpoof LDX.w #menu_offset(7,9) LDY.w #HookGFX JSR DrawMenuItem +.no_hookshot LDA.l $7EF343 CMP.w #$00 : BEQ .no_bomb @@ -288,18 +293,18 @@ DrawYItems: JSR DrawMenuItem ;; next row - - LDA.w #$7EF34C + LDA.l $7EF34C : CMP.w #$0000 : BEQ .no_ocarina + LDA.w $030F : BNE .spoof_ocarina + LDA #$0001 ; Multi-songs not unlocked yet +.spoof_ocarina + STA.w ShortSpoof : LDA.w #ShortSpoof LDX.w #menu_offset(13,3) LDY.w #OcarinaGFX JSR DrawMenuItem +.no_ocarina - ;LDA.w #$7EF34E - LDA.l $7EF34E - CMP.w #$00 : BEQ .no_book - LDA.w #$01 - STA.w ShortSpoof - LDA.w #ShortSpoof + LDA.l $7EF34E : CMP.w #$00 : BEQ .no_book + LDA.w #$01 : STA.w ShortSpoof : LDA.w #ShortSpoof LDX.w #menu_offset(13,6) LDY.w #BookGFX JSR DrawMenuItem diff --git a/Menu/menu_gfx_table.asm b/Menu/menu_gfx_table.asm index e2c0c4a..8db8653 100644 --- a/Menu/menu_gfx_table.asm +++ b/Menu/menu_gfx_table.asm @@ -27,7 +27,7 @@ BoomsGFX: HookGFX: dw $24F5, $24F6, $24C0, $24F5 ; Hookshot - ;dw $2C17, $3531, $2D40, $3541 Ball & Chain + dw $2C17, $3531, $2D40, $3541 ; Ball & Chain ; ------------------------------------- @@ -81,8 +81,8 @@ ShovelGFX: OcarinaGFX: dw $2CD4, $2CD5, $2CE4, $2CE5 - dw $2CD4, $2CD5, $2CE4, $2CE5 - dw $2CD4, $2CD5, $2CE4, $2CE5 + dw $3CD4, $3CD5, $3CE4, $3CE5 ; Green + dw $24D4, $24D5, $24E4, $24E5 ; Red ; ------------------------------------- diff --git a/Menu/menu_hud.asm b/Menu/menu_hud.asm index 1fbf262..626c8c6 100644 --- a/Menu/menu_hud.asm +++ b/Menu/menu_hud.asm @@ -273,12 +273,10 @@ HUD_UpdateItemBox: JMP .loadBottleContent .bottle1NotEquipped CPX.w #$000C : BNE .bottle2NotEquipped - LDA.w #$0002 - JMP .loadBottleContent + LDA.w #$0002 : JMP .loadBottleContent .bottle2NotEquipped CPX.w #$0012 : BNE .bottle3NotEquipped - LDA.w #$0003 - JMP .loadBottleContent + LDA.w #$0003 : JMP .loadBottleContent .bottle3NotEquipped CPX.w #$0018 : BNE .bottleNotEquipped LDA.w #$0004 @@ -291,6 +289,21 @@ HUD_UpdateItemBox: .fluteNotEquipped + CPX.w #$0003 : BNE .hookshotNotEquipped + LDA.w GoldstarOrHookshot + SEC : SBC.b #$01 + +.hookshotNotEquipped + + JSR HUD_DrawItem + +.noEquippedItem + + RTS +} + +HUD_DrawItem: +{ STA $02 TXA : DEC A : ASL A : TAX LDA $FA93, X : STA $04 @@ -302,8 +315,6 @@ HUD_UpdateItemBox: LDA ($04), Y : STA $7EC7B6 : INY #2 LDA ($04), Y : STA $7EC7B8 : INY #2 -.noEquippedItem - RTS } @@ -377,6 +388,8 @@ HexToDecimal: RTS } +pushpc + ; ============================================================================= ; $6FA93-$6FAFC DATA @@ -488,62 +501,23 @@ org $0DF811 dw $20F5, $20F5, $20F5, $20F5 dw $30B4, $30B5, $30C4, $30C5 +org $0DF669 + dw $24F5, $24F6, $24C0, $24F5 ; Hookshot + dw $2C17, $3531, $2D40, $3541 ; Ball & Chain + ; ============================================================================= ; $6FE77-$6FFC0 + + org $0DFE77 HUD_Tilemap: incbin tilemaps/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 -; ; magic bar top part -; dw $200B, $200C, $200C, $200C, $200C, $200C -; ; item frame top part -; dw $206C, $206D, $206E, $206F +; #_02816A: JSL RebuildHUD_Keys -; dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F -; dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F -; dw $207F - -; ; rupee icon key icon -; dw $3CA8, $FCA8, $207F, $2071, $207F - -; ; magic bar -; dw $201B, $344B -; dw $344B, $344B, $344B, $344B - -; ; item frame left part -; dw $20DE, $207F, $207F, $20DF - -; 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 - -; ; magic bar bottom part -; dw $A00B, $A00C -; dw $A00C, $A00C, $A00C, $A00C - -; ; item frame right part -; dw $20EE, $207F, $207F, $20EF - -; 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 - -; ; item frame bottom part -; dw $207C, $207D, $207E, $201D - -; 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 -; } +; LoadUnderworldRoomRebuildHUD: +; #_028118: LDA.b #$00 ; reset mosaic level ; ============================================================================== @@ -636,4 +610,6 @@ FloorIndicator: SEP #$30 RTL -} \ No newline at end of file +} + +pullpc \ No newline at end of file diff --git a/Menu/menu_text.asm b/Menu/menu_text.asm index ff5d343..2d891f0 100644 --- a/Menu/menu_text.asm +++ b/Menu/menu_text.asm @@ -64,6 +64,7 @@ PlaytimeLabel: dw "PLAYTIME:_" DrawPlaytimeLabel: +{ LDX.w #$10 .draw2 @@ -71,7 +72,25 @@ DrawPlaytimeLabel: STA.w $1692, X DEX : DEX : BPL .draw2 + ; ; Starting at 0 = $2570 we draw the hours + ; ; Get hours + ; LDA $7EE000 + + ; ; CLC : ADC #$2570 + + + ; STA.w $1692+#$12 ; First digit of hour + + ; STA.w $1692+#$14 ; Second digit of hour + + ; ; Get minutes + ; LDA $7EE001 + ; ; CLC : ADC #$2570 + ; STA.w $1692+#$16 ; First digit of minute + ; STA.w $1692+#$18 ; Second digit of minute + RTS +} ; ============================================================================= @@ -110,16 +129,27 @@ Menu_BottleItems: dw "____FAIRY_____ " dw "__GOOD_BEE____ " +Menu_GoldstarLabel: + dw "__GOLD_STAR___ " + +Menu_SongNames: + dw "SONG:_SOARING_ " + dw "SONG:_HEALING_ " + dw "SONG:_STORMS__ " + Menu_DrawItemName: { SEP #$30 + LDA.w $0202 : CMP.b #$03 : BEQ .goldstar + LDA.w $0202 : CMP.b #$0D : BEQ .ocarina ; Check if it's a bottle LDA.w $0202 : CMP.b #$06 : BEQ .bottle_1 LDA.w $0202 : CMP.b #$0C : BEQ .bottle_2 LDA.w $0202 : CMP.b #$12 : BEQ .bottle_3 LDA.w $0202 : CMP.b #$18 : BEQ .bottle_4 + +.draw_item REP #$30 - LDA.w $0202 : BEQ .no_items DEC : ASL #5 : TAX LDY.w #$000 @@ -141,16 +171,53 @@ Menu_DrawItemName: REP #$30 : LDX #$0002 : JMP .draw_bottle .bottle_4 REP #$30 : LDX #$0003 - .draw_bottle - LDA.l $7EF35C, X : AND.w #$00FF - DEC : ASL #5 : TAX - LDY.w #$0000 -.draw_bottle_loop - LDA.w Menu_BottleItems, X : STA.w $1692, Y - INX #2 : INY #2 - CPY #$001C : BCC .draw_bottle_loop + JSR DrawBottleNames RTS + +.goldstar + LDA GoldstarOrHookshot : CMP.b #$02 : BNE .draw_item + JSR MaybeDrawGoldstarName + RTS + +.ocarina + REP #$30 + + ; Check the timer and see if we should draw the item name + LDA $1A : AND.w #$00FF : CMP #$0080 : BCC .draw_item + + LDA $030F : BEQ .draw_item + LDA $030F : AND.w #$00FF : DEC : ASL #5 : TAX + LDY.w #$0000 +.draw_ocarina_loop + LDA.w Menu_SongNames, X : STA.w $1692, Y + INX #2 : INY #2 : CPY #$001C : BCC .draw_ocarina_loop + RTS + +} + +DrawBottleNames: +{ + + LDA.l $7EF35C, X : AND.w #$00FF + DEC : ASL #5 : TAX + LDY.w #$0000 + .draw_bottle_loop + LDA.w Menu_BottleItems, X : STA.w $1692, Y + INX #2 : INY #2 + CPY #$001C : BCC .draw_bottle_loop + RTS +} + +MaybeDrawGoldstarName: +{ + REP #$30 + LDX.w #$0000 + LDY.w #$0000 + .draw_goldstar_loop + LDA.w Menu_GoldstarLabel, X + STA.w $1692, X : INX #2 : INY #2 : CPY #$001C : BCC .draw_goldstar_loop + RTS } ; =============================================================================