Merge branch 'master' into DRMain

# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	hooks.asm
This commit is contained in:
aerinon
2021-06-22 13:12:07 -06:00
11 changed files with 428 additions and 98 deletions

152
msu.asm
View File

@@ -116,12 +116,15 @@
!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
!FLAG_MSU_STATUS_AUDIO_BUSY = #$40
!FLAG_MSU_STATUS_DATA_BUSY = #$80
!FLAG_RESUME_CANCEL = #$01
!FLAG_RESUME_FADEIN = #$02
!REG_CURRENT_MSU_TRACK = $010B
!REG_CURRENT_VOLUME = $0127
@@ -145,11 +148,46 @@
!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
;--------------------------------------------------------------------------------
;================================================================================
; Check if the track in A should be resumed
;--------------------------------------------------------------------------------
IsResumableTrack:
PHA
LDA MSUResumeType : BEQ +
PLA
JSR IsOverworldTrack
RTS
+
PLA
SEC
RTS
;--------------------------------------------------------------------------------
;================================================================================
; Extended OST/SPC fallback, decide which track to actually play
;--------------------------------------------------------------------------------
CheckMusicLoadRequest:
PHP : REP #$10 : PHA : PHX : PHY
PHP : PHB : PHD : REP #$30 : PHA : PHX : PHY
LDA #$0000 : TCD : SEP #$20 : PHA : PLB
LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip+3 : BMI .skip+3
CMP !REG_CURRENT_COMMAND : BNE .continue
CMP.b #22 : BNE .skip ; Check GT when mirroring from upstairs
@@ -159,7 +197,7 @@ CheckMusicLoadRequest:
.skip
LDA !REG_MUSIC_CONTROL_REQUEST
STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST
PLY : PLX : PLA : PLP
REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP
RTL
.continue
@@ -320,13 +358,13 @@ CheckMusicLoadRequest:
.done
LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST
PLY : PLX : PLA : PLP
REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP
RTL
.sfx_indoors
LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST
PLY : PLX : PLA : PLP
PHP : SEP #$20 : LDA.b #$05 : STA $012D : PLP
SEP #$20 : LDA.b #$05 : STA $012D
REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP
JML Module_PreDungeon_setAmbientSfx
;--------------------------------------------------------------------------------
@@ -404,6 +442,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_CONTROL
LDA NoBGM : BNE .done
REP #$20
@@ -467,6 +511,41 @@ MSUInit:
;--------------------------------------------------------------------------------
;================================================================================
; Stop MSU-1 audio track and save the current position when approriate
;--------------------------------------------------------------------------------
MSUStopPlaying:
PHA : XBA : PHA
LDA !MSU_LOADED_TRACK
JSR IsResumableTrack : BCC +
; 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 MSUResumeTimer : !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
;--------------------------------------------------------------------------------
@@ -477,6 +556,7 @@ MSUMain:
LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BEQ .continue
.nomsu
SEP #$30
-
JML SPCContinue
.continue
LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .nomsu
@@ -488,16 +568,28 @@ MSUMain:
LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade
.check_busy
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready
JML SPCContinue
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE -
.ready
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start
JML SPCContinue
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE -
.start
LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_CANCEL : BEQ +
EOR !FLAG_RESUME_CANCEL : STA !MSU_RESUME_CONTROL
REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20
BRA -
+
LDA !VAL_VOLUME_FULL
STA !REG_TARGET_VOLUME
LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_FADEIN : BEQ +
EOR !FLAG_RESUME_FADEIN : STA !MSU_RESUME_CONTROL
LDA #$00
BRA ++
+
LDA !VAL_VOLUME_FULL
++
STA !REG_CURRENT_VOLUME
STA !REG_MSU_VOLUME
LDA !REG_CURRENT_MSU_TRACK : DEC : PHA
AND.b #$07 : TAY
PLA : LSR #3 : TAX
@@ -524,7 +616,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
@@ -570,7 +662,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
@@ -579,6 +671,8 @@ MSUMain:
!SUB !REG_MSU_PACK_COUNT : BRA -
+
JSR MSUStopPlaying
PHX : PHA : TXA : PLX
REP #$20
BEQ +
@@ -587,10 +681,35 @@ 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 MSUResumeTimer : !BGE +++
SEP #$20
LDA !FLAG_RESUME_FADEIN : BRA .done_resume
++
PLA
+++
SEP #$20
LDA !FLAG_RESUME_CANCEL
.done_resume:
STA !MSU_RESUME_CONTROL
LDA #$00 : STA !MSU_RESUME_TRACK
+
CPX #07 : BNE + ; Kakariko Village
LDA $10 : CMP #$07 : BNE +
; we're in link's house -> ignore
LDA #$00
BRA ++
+
TXA
++
STA !MSU_LOADED_TRACK
STX !REG_CURRENT_MSU_TRACK
LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT +
LDA #$00 : BRA ++
@@ -625,12 +744,12 @@ MSUMain:
; Wait for the fanfare music to start, or else it can get skipped entirely
;--------------------------------------------------------------------------------
FanfarePreload:
STA !REG_MUSIC_CONTROL_REQUEST ; thing we wrote over
STA.l !REG_MUSIC_CONTROL_REQUEST ; thing we wrote over
PHA
JSL CheckMusicLoadRequest
WAI
PLA
- : CMP !REG_SPC_CONTROL : BNE -
- : CMP.l !REG_SPC_CONTROL : BNE -
JML AddReceivedItem_doneWithSoundEffects
;--------------------------------------------------------------------------------
@@ -653,7 +772,7 @@ PendantFanfareWait:
jml PendantFanfareContinue
.spc
SEP #$20
LDA !REG_SPC_CONTROL : BNE .continue
LDA.l !REG_SPC_CONTROL : BNE .continue
.done
jml PendantFanfareDone
;--------------------------------------------------------------------------------
@@ -677,7 +796,7 @@ CrystalFanfareWait:
jml CrystalFanfareContinue
.spc
SEP #$20
LDA !REG_SPC_CONTROL : BNE .continue
LDA.l !REG_SPC_CONTROL : BNE .continue
.done
jml CrystalFanfareDone
;--------------------------------------------------------------------------------
@@ -704,6 +823,7 @@ EndingMusicWait:
LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .done
SEP #$20
.wait
LDA.b $50 : BNE .done
LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BNE .wait
.done
SEP #$20