pokered/home/audio.asm
2020-11-06 10:33:58 -05:00

214 lines
4.1 KiB
NASM

PlayDefaultMusic::
call WaitForSoundToFinish
xor a
ld c, a
ld d, a
ld [wLastMusicSoundID], a
jr PlayDefaultMusicCommon
PlayDefaultMusicFadeOutCurrent::
; Fade out the current music and then play the default music.
ld c, 10
ld d, 0
ld a, [wd72e]
bit 5, a ; has a battle just ended?
jr z, PlayDefaultMusicCommon
xor a
ld [wLastMusicSoundID], a
ld c, 8
ld d, c
PlayDefaultMusicCommon::
ld a, [wWalkBikeSurfState]
and a
jr z, .walking
cp $2
jr z, .surfing
ld a, MUSIC_BIKE_RIDING
jr .next
.surfing
ld a, MUSIC_SURFING
.next
ld b, a
ld a, d
and a ; should current music be faded out first?
ld a, BANK(Music_BikeRiding)
jr nz, .next2
; Only change the audio ROM bank if the current music isn't going to be faded
; out before the default music begins.
ld [wAudioROMBank], a
.next2
; [wAudioSavedROMBank] will be copied to [wAudioROMBank] after fading out the
; current music (if the current music is faded out).
ld [wAudioSavedROMBank], a
jr .next3
.walking
ld a, [wMapMusicSoundID]
ld b, a
call CompareMapMusicBankWithCurrentBank
jr c, .next4
.next3
ld a, [wLastMusicSoundID]
cp b ; is the default music already playing?
ret z ; if so, do nothing
.next4
ld a, c
ld [wAudioFadeOutControl], a
ld a, b
ld [wLastMusicSoundID], a
ld [wNewSoundID], a
jp PlaySound
UpdateMusic6Times::
; This is called when entering a map, before fading out the current music and
; playing the default music (i.e. the map's music or biking/surfing music).
ld a, [wAudioROMBank]
ld b, a
cp BANK(Audio1_UpdateMusic)
jr nz, .checkForAudio2
; audio 1
ld hl, Audio1_UpdateMusic
jr .next
.checkForAudio2
cp BANK(Audio2_UpdateMusic)
jr nz, .audio3
; audio 2
ld hl, Audio2_UpdateMusic
jr .next
.audio3
ld hl, Audio3_UpdateMusic
.next
ld c, 6
.loop
push bc
push hl
call Bankswitch
pop hl
pop bc
dec c
jr nz, .loop
ret
CompareMapMusicBankWithCurrentBank::
; Compares the map music's audio ROM bank with the current audio ROM bank
; and updates the audio ROM bank variables.
; Returns whether the banks are different in carry.
ld a, [wMapMusicROMBank]
ld e, a
ld a, [wAudioROMBank]
cp e
jr nz, .differentBanks
ld [wAudioSavedROMBank], a
and a
ret
.differentBanks
ld a, c ; this is a fade-out counter value and it's always non-zero
and a
ld a, e
jr nz, .next
; If the fade-counter is non-zero, we don't change the audio ROM bank because
; it's needed to keep playing the music as it fades out. The FadeOutAudio
; routine will take care of copying [wAudioSavedROMBank] to [wAudioROMBank]
; when the music has faded out.
ld [wAudioROMBank], a
.next
ld [wAudioSavedROMBank], a
scf
ret
PlayMusic::
ld b, a
ld [wNewSoundID], a
xor a
ld [wAudioFadeOutControl], a
ld a, c
ld [wAudioROMBank], a
ld [wAudioSavedROMBank], a
ld a, b
; plays music specified by a. If value is $ff, music is stopped
PlaySound::
push hl
push de
push bc
ld b, a
ld a, [wNewSoundID]
and a
jr z, .next
xor a
ld [wChannelSoundIDs + Ch5], a
ld [wChannelSoundIDs + Ch6], a
ld [wChannelSoundIDs + Ch7], a
ld [wChannelSoundIDs + Ch8], a
.next
ld a, [wAudioFadeOutControl]
and a ; has a fade-out length been specified?
jr z, .noFadeOut
ld a, [wNewSoundID]
and a ; is the new sound ID 0?
jr z, .done ; if so, do nothing
xor a
ld [wNewSoundID], a
ld a, [wLastMusicSoundID]
cp $ff ; has the music been stopped?
jr nz, .fadeOut ; if not, fade out the current music
; If it has been stopped, start playing the new music immediately.
xor a
ld [wAudioFadeOutControl], a
.noFadeOut
xor a
ld [wNewSoundID], a
ldh a, [hLoadedROMBank]
ldh [hSavedROMBank], a
ld a, [wAudioROMBank]
ldh [hLoadedROMBank], a
ld [MBC1RomBank], a
cp BANK(Audio1_PlaySound)
jr nz, .checkForAudio2
; audio 1
ld a, b
call Audio1_PlaySound
jr .next2
.checkForAudio2
cp BANK(Audio2_PlaySound)
jr nz, .audio3
; audio 2
ld a, b
call Audio2_PlaySound
jr .next2
.audio3
ld a, b
call Audio3_PlaySound
.next2
ldh a, [hSavedROMBank]
ldh [hLoadedROMBank], a
ld [MBC1RomBank], a
jr .done
.fadeOut
ld a, b
ld [wLastMusicSoundID], a
ld a, [wAudioFadeOutControl]
ld [wAudioFadeOutCounterReloadValue], a
ld [wAudioFadeOutCounter], a
ld a, b
ld [wAudioFadeOutControl], a
.done
pop bc
pop de
pop hl
ret