From 34bb99b7d0235bef8b4605ecf6e3c734be81c954 Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sat, 12 Jun 2021 15:22:27 +0200 Subject: [PATCH] MSU1: Resume overworld tracks --- LTTP_RND_GeneralBugfixes.asm | 7 ++- msu.asm | 89 ++++++++++++++++++++++++++++++++++-- tables.asm | 8 +++- 3 files changed, 98 insertions(+), 6 deletions(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 6c3cb05..f2a6e53 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -81,7 +81,12 @@ db #$20, #$19, #$08, #$31 ; year/month/day !REG_MSU_PACK_COUNT = $7F50AA !REG_MSU_PACK_CURRENT = $7F50AB !REG_MSU_PACK_REQUEST = $7F50AC -!REG_SPC_LOADING = $7F50AD +!REG_MSU_LOADED_TRACK = $7F50AD ; 2 bytes +!REG_SPC_LOADING = $7F50AF +!MSU_LOADED_TRACK = $7F5400 +!MSU_RESUME_TRACK = $7F5401 +!MSU_RESUME_TIME = $7F5402 ; 4 bytes +!MSU_RESUME_CANCEL = $7F5406 !REG_MUSIC_CONTROL = $012B ;!REG_MUSIC_CONTROL = $012C !REG_MUSIC_CONTROL_REQUEST = $012C diff --git a/msu.asm b/msu.asm index cd21a0a..a0853b9 100644 --- a/msu.asm +++ b/msu.asm @@ -116,6 +116,7 @@ !FLAG_MSU_PLAY = #$01 !FLAG_MSU_REPEAT = #$02 +!FLAG_MSU_RESUME = #$04 !FLAG_MSU_STATUS_TRACK_MISSING = #$08 !FLAG_MSU_STATUS_AUDIO_PLAYING = #$10 !FLAG_MSU_STATUS_AUDIO_REPEATING = #$20 @@ -145,6 +146,25 @@ !VAL_VOLUME_HALF = #$80 !VAL_VOLUME_FULL = #$FF +;================================================================================ +; Check if A has an overworld track +;-------------------------------------------------------------------------------- +IsOverworldTrack: + CMP #02 : BEQ .yes ; 2 - Hyrule Field + CMP #03 : BEQ .yes ; 3 - Time of Falling Rain + CMP #04 : BEQ .yes ; 4 - The Silly Pink Rabbit + CMP #05 : BEQ .yes ; 5 - Forest of Mystery + CMP #07 : BEQ .yes ; 7 - Kakariko Village + CMP #09 : BEQ .yes ; 9 - Dark Golden Land + CMP #15 : BEQ .yes ; 15 - Dark Woods + CMP #60 : BEQ .yes ; 60 - Light World OW (after ped pull) + CMP #61 : BEQ .yes ; 61 - Dark World OW (with all crystals) + .no + CLC : RTS +.yes +SEC : RTS +;-------------------------------------------------------------------------------- + ;================================================================================ ; Extended OST/SPC fallback, decide which track to actually play ;-------------------------------------------------------------------------------- @@ -402,6 +422,12 @@ StoreMusicOnDeath: MSUInit: PHP + LDA #$00 + STA !MSU_LOADED_TRACK + STA !MSU_RESUME_TRACK + STA !MSU_RESUME_TIME : STA !MSU_RESUME_TIME+1 : STA !MSU_RESUME_TIME+2 : STA !MSU_RESUME_TIME+3 + STA !MSU_RESUME_CANCEL + LDA NoBGM : BNE .done REP #$20 @@ -465,6 +491,41 @@ MSUInit: ;-------------------------------------------------------------------------------- +;================================================================================ +; Stop MSU-1 audio track and save the current position when approriate +;-------------------------------------------------------------------------------- +MSUStopPlaying: +PHA : XBA : PHA + LDA !MSU_LOADED_TRACK + JSR IsOverworldTrack : BCC + ; dont save if this isnt an overworld track + ; dont save if we already saved recently + REP #$20 + LDA !MSU_RESUME_TRACK : AND #$00FF : BEQ ++ + LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA + LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE +++ + PLA : CMP MSUResumeDelay : !BLT .too_early + BRA ++ + +++ + PLA + ++ + ; saving + LDA !NMI_COUNTER : STA !MSU_RESUME_TIME + LDA !NMI_COUNTER+2 : STA !MSU_RESUME_TIME+2 + SEP #$20 + + LDA !MSU_LOADED_TRACK : STA !MSU_RESUME_TRACK + LDA #$00 : STA !MSU_LOADED_TRACK ; dont take this path if we're calling again + LDA !FLAG_MSU_RESUME : STA !REG_MSU_CONTROL ; save this track's position + PLA : XBA : PLA + RTS + .too_early + SEP #$20 + + + LDA #$00 : STA !REG_MSU_CONTROL +PLA : XBA : PLA +RTS +;-------------------------------------------------------------------------------- + ;================================================================================ ; Play MSU-1 audio track ;-------------------------------------------------------------------------------- @@ -492,6 +553,11 @@ MSUMain: LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start JML SPCContinue .start + LDA !MSU_RESUME_CANCEL : BEQ + + REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20 + LDA #$00 : STA !MSU_RESUME_CANCEL + JML SPCContinue + + LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME STA !REG_CURRENT_VOLUME @@ -522,7 +588,7 @@ MSUMain: LDA !REG_TARGET_VOLUME : BRA .set .mute STZ !REG_CURRENT_VOLUME - STZ !REG_MSU_CONTROL + JSR MSUStopPlaying BRA .set .increment ADC !VAL_VOLUME_INCREMENT : BCS .max @@ -568,7 +634,7 @@ MSUMain: CPX !REG_CURRENT_MSU_TRACK : BNE + - : CPX #27 : BEQ + TXA - BRA .done+1 + JMP .done+1 + CPX !REG_CURRENT_COMMAND : BEQ - LDA.b #$00 : XBA @@ -577,6 +643,8 @@ MSUMain: !SUB !REG_MSU_PACK_COUNT : BRA - + + JSR MSUStopPlaying + PHX : PHA : TXA : PLX REP #$20 BEQ + @@ -585,10 +653,25 @@ MSUMain: DEX : BNE - + STA !REG_MSU_TRACK + STA !REG_MSU_LOADED_TRACK SEP #$20 - STZ !REG_MSU_CONTROL PLX + TXA : CMP !MSU_RESUME_TRACK : BNE + ; dont resume if too late + REP #$20 + LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA + LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE ++ + PLA : CMP MSUResumeDelay : !BGE +++ + SEP #$20 : BRA .done_resume + ++ + PLA + +++ + SEP #$20 + LDA #$01 : STA !MSU_RESUME_CANCEL + .done_resume: + LDA #$00 : STA !MSU_RESUME_TRACK + + + TXA : STA !MSU_LOADED_TRACK STX !REG_CURRENT_MSU_TRACK LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT + LDA #$00 : BRA ++ diff --git a/tables.asm b/tables.asm index 386cc6c..26f3c75 100644 --- a/tables.asm +++ b/tables.asm @@ -992,8 +992,11 @@ db $00 ; $00 = BGM enabled (default) $01 = BGM disabled org $30821B ; PC 0x18021B FastFanfare: db $00 ; $00 = Normal fanfare (default) $01 = Fast fanfare +org $30821C ; PC 0x18021C +MSUResumeDelay: +dw $0708 ; Number of frames on a different track until we no longer resume (0x708 = 1800 = ~30s) ;-------------------------------------------------------------------------------- -; 0x18021C - 0x18021F (unused) +; 0x18021E - 0x18021F (unused) ;================================================================================ ; $308220 (0x180220) - $30823F (0x18023F) ; Plandomizer Author Name (ASCII) - Leave unused chars as 0 @@ -1522,8 +1525,9 @@ dw #9999 ; Rupee Limit ; $7F5100 - $7F51FF - Block Cypher Buffer ; $7F5200 - $7F52FF - RNG Pointer Block ; $7F5300 - $7F53FF - Multiworld Block +; $7F5400 - $7F540F - MSU Block -; $7F5400 - $7F56FF - Unused +; $7F5410 - $7F56FF - Unused ; $7F5700 - $7F57FF - Dialog Buffer ;