From 2eefbac53f585b38900acb86d2b91e8322d8f7f6 Mon Sep 17 00:00:00 2001 From: Karkat Date: Sat, 27 Jan 2018 00:30:04 -0500 Subject: [PATCH] let's dev 1/27/18 added msu music support additional development on shops --- LTTP_RND_GeneralBugfixes.asm | 9 +- hooks.asm | 10 ++ msu.asm | 183 +++++++++++++++++++++++++++++++++++ shopkeeper.asm | 136 ++++++++++++++++++++++++-- tables.asm | 7 ++ 5 files changed, 335 insertions(+), 10 deletions(-) create mode 100644 msu.asm diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 55df77a..4e13664 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -26,7 +26,7 @@ org $3FFFFF ; <- 1FFFFF db #$00 ; expand file to 2mb org $1FFFF8 ; <- FFFF8 timestamp rom -db #$20, #$18, #$01, #$24 ; year/month/day +db #$20, #$18, #$01, #$27 ; year/month/day ;================================================================================ @@ -113,6 +113,7 @@ incsrc swordswap.asm incsrc stats.asm incsrc scratchpad.asm incsrc map.asm +incsrc msu.asm incsrc dialog.asm incsrc events.asm incsrc entrances.asm @@ -370,6 +371,9 @@ Sprite_ShowMessageMinimal: org $05EC96 Sprite_ZeldaLong: +org $0683E6 +Utility_CheckIfHitBoxesOverlapLong: + org $06A7DB Chicken_SpawnAvengerChicken: ; returns short @@ -497,6 +501,9 @@ Palette_Hud: org $1CFAAA ShopKeeper_RapidTerminateReceiveItem: +org $1CF500 +Sprite_NullifyHookshotDrag: + org $1DF65D Sprite_SpawnDynamically: diff --git a/hooks.asm b/hooks.asm index 00c4e67..1f14317 100644 --- a/hooks.asm +++ b/hooks.asm @@ -1058,6 +1058,16 @@ org $05FBD3 ; <- 2FBD3 - sprite_mad_batter.asm:209 - (STA $7EF37B) JSL.l GetMagicBatItem ;-------------------------------------------------------------------------------- +;================================================================================ +; MSU Music +;-------------------------------------------------------------------------------- +org $0080D7 ; <- D7 - Bank00.asm:172 (SEP #$30) +spc_nmi: + JML msu_main + NOP +spc_continue: +;-------------------------------------------------------------------------------- + ;================================================================================ ; Replacement Shopkeeper ;-------------------------------------------------------------------------------- diff --git a/msu.asm b/msu.asm new file mode 100644 index 0000000..8f741d7 --- /dev/null +++ b/msu.asm @@ -0,0 +1,183 @@ +;======================================= +; +; MSU-1 Enhanced Audio Patch +; Zelda no Densetsu - Kamigami no Triforce +; Modified for VT Randomizer +; +; Author: qwertymodo +; +; Free space used: 0x77DDD-0x77F8A +; +;======================================= + +!REG_MSU_STATUS = $2000 + +!REG_MSU_ID_0 = $2002 +!REG_MSU_ID_1 = $2003 +!REG_MSU_ID_2 = $2004 +!REG_MSU_ID_3 = $2005 +!REG_MSU_ID_4 = $2006 +!REG_MSU_ID_5 = $2007 + +!REG_MSU_ID_01 = $2002 +!REG_MSU_ID_23 = $2004 +!REG_MSU_ID_45 = $2006 + + +!VAL_MSU_ID_0 = #$53 ; 'S' +!VAL_MSU_ID_1 = #$2D ; '-' +!VAL_MSU_ID_2 = #$4D ; 'M' +!VAL_MSU_ID_3 = #$53 ; 'S' +!VAL_MSU_ID_4 = #$55 ; 'U' +!VAL_MSU_ID_5 = #$31 ; '1' + +!VAL_MSU_ID_01 = #$2D53 ; 'S-' +!VAL_MSU_ID_23 = #$534D ; 'MS' +!VAL_MSU_ID_45 = #$3155 ; 'U1' + + +!REG_MSU_TRACK = $2004 +!REG_MSU_TRACK_LO = $2004 +!REG_MSU_TRACK_HI = $2005 +!REG_MSU_VOLUME = $2006 +!REG_MSU_CONTROL = $2007 + + +!FLAG_MSU_PLAY = #$01 +!FLAG_MSU_REPEAT = #$02 +!FLAG_MSU_STATUS_TRACK_MISSING = #$08 +!FLAG_MSU_STATUS_AUDIO_PLAYING = #$10 +!FLAG_MSU_STATUS_AUDIO_REPEATING = #$20 +!FLAG_MSU_STATUS_AUDIO_BUSY = #$40 +!FLAG_MSU_STATUS_DATA_BUSY = #$80 + + +!REG_CURRENT_VOLUME = $0127 +!REG_TARGET_VOLUME = $0129 +!REG_CURRENT_MSU_TRACK = $012B +!REG_MUSIC_CONTROL = $012C +!REG_CURRENT_TRACK = $0130 +!REG_CURRENT_COMMAND = $0133 + +!REG_SPC_CONTROL = $2140 +!REG_NMI_FLAGS = $4210 + + +!VAL_COMMAND_FADE_OUT = #$F1 +!VAL_COMMAND_FADE_HALF = #$F2 +!VAL_COMMAND_FULL_VOLUME = #$F3 +!VAL_COMMAND_LOAD_NEW_BANK = #$FF + +!VAL_VOLUME_INCREMENT = #$10 +!VAL_VOLUME_DECREMENT = #$02 +!VAL_VOLUME_HALF = #$80 +!VAL_VOLUME_FULL = #$FF + +msu_main: + SEP #$20 ; set 8-bit accumulator + LDA $4210 ; thing we wrote over + REP #$20 ; set 16-bit accumulator + LDA !REG_MSU_ID_01 + CMP !VAL_MSU_ID_01 + BEQ .continue +.nomsu + SEP #$30 + JML spc_continue +.continue + LDA !REG_MSU_ID_23 + CMP !VAL_MSU_ID_23 + BNE .nomsu + LDA !REG_MSU_ID_45 + CMP !VAL_MSU_ID_45 + BNE .nomsu + SEP #$30 + LDX !REG_MUSIC_CONTROL + BNE command_ff + +do_fade: + LDA !REG_CURRENT_VOLUME + CMP !REG_TARGET_VOLUME + BNE .continue + JML spc_continue +.continue + BCC .increment +.decrement + SBC !VAL_VOLUME_DECREMENT + BCS .set +.mute + STZ !REG_CURRENT_VOLUME + STZ !REG_MSU_CONTROL + STZ !REG_CURRENT_MSU_TRACK + BRA .set +.increment + ADC !VAL_VOLUME_INCREMENT + BCC .set + LDA !VAL_VOLUME_FULL +.set + STA !REG_CURRENT_VOLUME + STA !REG_MSU_VOLUME + JML spc_continue + +command_ff: + CPX !VAL_COMMAND_LOAD_NEW_BANK + BNE command_f3 + JML spc_continue + +command_f3: + CPX !VAL_COMMAND_FULL_VOLUME + BNE command_f2 + STX !REG_SPC_CONTROL + LDA !VAL_VOLUME_FULL + STA !REG_TARGET_VOLUME + JML spc_continue + +command_f2: + CPX !VAL_COMMAND_FADE_HALF + BNE command_f1 + STX !REG_SPC_CONTROL + LDA !VAL_VOLUME_HALF + STA !REG_TARGET_VOLUME + JML spc_continue + +command_f1: + CPX !VAL_COMMAND_FADE_OUT + BNE load_track + STX !REG_SPC_CONTROL + STZ !REG_TARGET_VOLUME + JML spc_continue + +load_track: + CPX !REG_CURRENT_MSU_TRACK + BNE .continue + CPX #$1B + BEQ .continue + JML spc_continue +.continue + STX !REG_MSU_TRACK_LO + STZ !REG_MSU_TRACK_HI + STZ !REG_MSU_CONTROL + LDA !VAL_VOLUME_FULL + STA !REG_TARGET_VOLUME + STA !REG_CURRENT_VOLUME + STA !REG_MSU_VOLUME + +msu_check_busy: + LDA !REG_MSU_STATUS + BIT !FLAG_MSU_STATUS_AUDIO_BUSY + BNE msu_check_busy + BIT !FLAG_MSU_STATUS_TRACK_MISSING + BEQ msu_play + +spc_fallback: + STZ !REG_MSU_CONTROL + STZ !REG_CURRENT_MSU_TRACK + STZ !REG_TARGET_VOLUME + STZ !REG_CURRENT_VOLUME + STZ !REG_MSU_VOLUME + JML spc_continue + +msu_play: + LDA.l track_list,x + STA !REG_MSU_CONTROL + STX !REG_CURRENT_MSU_TRACK + JML spc_continue \ No newline at end of file diff --git a/shopkeeper.asm b/shopkeeper.asm index 6b6310c..f4eca0b 100644 --- a/shopkeeper.asm +++ b/shopkeeper.asm @@ -109,7 +109,6 @@ DrawPrice: SEP #$20 ; set 8-bit accumulator TXA : LSR #3 : STA $06 ; request 1-4 OAM slots - STA $FFFFFF ASL #2 PHA LDA $22 : CMP !COLUMN_LOW : !BLT .off @@ -148,8 +147,7 @@ SpritePrep_ShopKeeper: SEP #$20 ; set 8-bit accumulator LDA ShopTable, X : STA !SHOP_ID LDA ShopTable+5, X : STA !SHOP_TYPE - AND.b #$03 : STA !SCRATCH_CAPACITY - ASL : !ADD !SCRATCH_CAPACITY : STA !SCRATCH_CAPACITY + AND.b #$03 : ASL #2 : STA !SCRATCH_CAPACITY BRA .success + TXA : !ADD.w #$0008 : TAX @@ -172,7 +170,7 @@ SpritePrep_ShopKeeper: LDA.l ShopContentsTable, X : CMP !SHOP_ID : BNE + LDA.l ShopContentsTable+1, X : PHX : TYX : STA.l !SHOP_INVENTORY, X : PLX LDA.l ShopContentsTable+2, X : PHX : TYX : STA.l !SHOP_INVENTORY+1, X : PLX - LDA.l ShopContentsTable+3, X : PHX : TYX : STA.l !SHOP_INVENTORY+2, X : PLX + LDA.l ShopContentsTable+3, X : PHX : TYX : STA.l !SHOP_INVENTORY+2, X : LDA.b #$00 : STA.l !SHOP_INVENTORY+3, X : PLX PHX : PHY LDA.l ShopContentsTable+1, X : TAY REP #$20 ; set 16-bit accumulator @@ -180,7 +178,7 @@ SpritePrep_ShopKeeper: JSR LoadTile PLY : PLX INX #4 - INY #3 + INY #4 + BRA - .stop @@ -193,9 +191,9 @@ SpritePrep_ShopKeeper: PLP : PLY : PLX RTL .tile_offsets -dw $0000 : db $00 -dw $0080 : db $00 -dw $0100 : db $00 +dw $0000, $0000 +dw $0080, $0000 +dw $0100, $0000 ;-------------------------------------------------------------------------------- ; X - Tile Buffer Offset ; Y - Item ID @@ -306,6 +304,9 @@ Sprite_ShopKeeper: ; Draw Items JSR.w Shopkeeper_DrawItems + ; Set Up Hitboxes + JSR.w Shopkeeper_SetupHitboxes + ; $22 ; 0x48 - Left ; 0x60 - Midpoint 1 @@ -323,6 +324,120 @@ dw 0, 0 : db $10, $0C, $00, $02 dw 0, -8 : db $00, $0C, $00, $02 dw 0, 0 : db $10, $4C, $00, $02 ;-------------------------------------------------------------------------------- +Shopkeeper_SetupHitboxes: + PHX : PHY : PHP + LDY.b #$00 + - + LDA $00EE : CMP $0F20, X : BNE .no_interaction + + JSR.w Setup_LinksHitbox + JSR.w Setup_ShopItemCollisionHitbox + JSL.l Utility_CheckIfHitBoxesOverlapLong + BCC .no_contact + JSR.w Sprite_HaltSpecialPlayerMovementCopied + .no_contact + + JSR.w Setup_ShopItemInteractionHitbox + JSL.l Utility_CheckIfHitBoxesOverlapLong + BCC .no_interaction + LDA $F6 : AND.b #$80 : BEQ .no_interaction ; check for A-press + JSR.w Shopkeeper_BuyItem + .no_interaction + INY #4 + CPY.b #$0C : !BLT - + + PLP : PLY : PLX +RTS +;-------------------- +Shopkeeper_BuyItem: + PHX : PHY + TYX + REP #$20 : LDA $7EF360 : CMP.l !SHOP_INVENTORY+1, X : SEP #$20 : !BGE .buy + .cant_afford + LDA.b #$3C : STA $012E ; error sound + BRA .done + .buy + REP #$20 : LDA $7EF360 : !SUB !SHOP_INVENTORY+1, X : STA $7EF360 : SEP #$20 ; Take price away + LDA !SHOP_INVENTORY, X : TAY : JSL.l Link_ReceiveItem + LDA !SHOP_INVENTORY+3, X : INC : STA !SHOP_INVENTORY+3, X + .done + PLY : PLX +RTS +;-------------------- +Setup_ShopItemCollisionHitbox: +;The complications with XBA are to handle the fact that nintendo likes to store +;high and low bytes of 16 bit postion values seperately :-( + ; load shopkeeper X (16 bit) + LDA $0D30, X : XBA : LDA $0D10, X + + REP #$20 ; set 16-bit accumulator + !ADD.w Shopkeeper_DrawNextItem_item_offsets, Y + !ADD.w #$0002 ; a small negative margin + ; TODO: add 4 for a narrow item + SEP #$20 ; set 8-bit accumulator + + ; store hitbox X + STA $04 : XBA : STA $0A + + ;load shopkeeper Y (16 bit) + LDA $0D20, X : XBA : LDA $0D00, X + + REP #$20 ; set 16-bit accumulator + !ADD.w Shopkeeper_DrawNextItem_item_offsets+2, Y + SEP #$20 ; set 8-bit accumulator + + ; store hitbox Y Low: $05, High $0B + STA $05 : XBA : STA $0B + + LDA.b #12 : STA $06 ; Hitbox width, always 12 for existing (wide) shop items + ; TODO: for narrow sprite store make width 4 (i.e. 8 pixels smaller) + + LDA.b #14 : STA $07 ; Hitbox height, always 14 +RTS +;-------------------------------------------------------------------------------- +; Adjusts the already set up collision hitbox to be a suitable interaction hitbox +Setup_ShopItemInteractionHitbox: + PHP + SEP #$20 ; set 8-bit accumulator + + ; collision hitbox has left margin of -2, we want margin of 8 so we subtract 10 + LDA $04 : !SUB.b #$0A : STA $04 + LDA $0A : SBC.b #$00 : STA $0A ; Apply borrow + + ; collision hitbox has 0 top margin, we want a margin of 8 so we subtract 8 + LDA $05 : !SUB.b #$08 : STA $05 + LDA $0B : SBC.b #$00 : STA $0B ; Apply borrow + + ; We want a width of 32 for wide or 24 for narrow, so we add 20 + LDA $06 : !ADD.b #20 : STA $06 ; Hitbox width + + LDA.b #40 : STA $07 ; Hitbox height, always 40 + PLP +RTS +;-------------------------------------------------------------------------------- +; Following is a copy of procedure $3770A (Bank06.asm Line 6273) +; because there is no long version available +Setup_LinksHitbox: + LDA.b #$08 : STA $02 + STA $03 + + LDA $22 : !ADD.b #$04 : STA $00 + LDA $23 : ADC.b #$00 : STA $08 + + LDA $20 : ADC.b #$08 : STA $01 + LDA $21 : ADC.b #$00 : STA $09 +RTS +;-------------------------------------------------------------------------------- +; The following is a copy of procedure Sprite_HaltSpecialPlayerMovement (Bank1E.asm line 255) +; because there is no long version available +Sprite_HaltSpecialPlayerMovementCopied: + PHX + JSL Sprite_NullifyHookshotDrag + STZ $5E ; Set Link's speed to zero... + JSL Player_HaltDashAttackLong + PLX +RTS +;-------------------------------------------------------------------------------- ;!SHOP_TYPE = "$7F5051" ;!SHOP_INVENTORY = "$7F5052" !SPRITE_OAM = "$7EC025" @@ -347,6 +462,8 @@ RTS ;-------------------------------------------------------------------------------- Shopkeeper_DrawNextItem: + LDA !SHOP_INVENTORY+3, X : BNE .next + PHY TYA : ASL #2 : TAY REP #$20 ; set 16-bit accumulator @@ -380,8 +497,9 @@ Shopkeeper_DrawNextItem: JSR.w Shopkeeper_DrawNextPrice + .next INY - INX #3 + INX #4 RTS ;-------------------------------------------------------------------------------- .item_offsets diff --git a/tables.asm b/tables.asm index f3a420c..389aca0 100644 --- a/tables.asm +++ b/tables.asm @@ -1407,3 +1407,10 @@ db $FF, $27, $0A, $00 db $FF, $12, $F4, $01 db $FF, $FF, $FF, $FF ;================================================================================ +track_list: +db $00,$01,$03,$03,$03,$03,$03,$03 +db $01,$03,$01,$03,$03,$03,$03,$03 +db $03,$03,$03,$01,$03,$03,$03,$03 +db $03,$03,$03,$03,$03,$01,$03,$03 +db $03,$01,$01 +;================================================================================