MSU1: Resume overworld tracks

This commit is contained in:
Bonta
2021-06-12 15:22:27 +02:00
parent dca1bfbab2
commit 34bb99b7d0
3 changed files with 98 additions and 6 deletions

View File

@@ -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

89
msu.asm
View File

@@ -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 ++

View File

@@ -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
;