diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 9b7a5d237..f38407232 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -6177,7 +6177,7 @@ bool aiStopCutsceneTrack(void) bool aiPlayTemporaryTrack(void) { u8 *cmd = g_Vars.ailist + g_Vars.aioffset; - musicStartTemporary(cmd[2]); + musicStartTemporaryAmbient(cmd[2]); g_Vars.aioffset += 3; return false; @@ -6189,7 +6189,7 @@ bool aiPlayTemporaryTrack(void) bool aiStopAmbientTrack(void) { g_Vars.aioffset += 2; - musicEndAmbient(); + musicEndTemporaryAmbient(); return false; } diff --git a/src/game/credits.c b/src/game/credits.c index 02284fe52..e4c4a44b2 100644 --- a/src/game/credits.c +++ b/src/game/credits.c @@ -3189,7 +3189,7 @@ void creditsTickSlide(void) g_CreditsData->unk4204 = 0; g_CreditsData->unk4208 = 0; - musicResumeAfterUnpause(); + musicEndMenu(); musicStartPrimary(0); } } while (credit && credit->more && g_CreditsData->numthisslide < 4); @@ -4847,7 +4847,7 @@ void creditsTick(void) musicStartPrimary(0); } else { musicSetStage(STAGE_CREDITS); - musicStartMenu2(MUSIC_CREDITS); + musicStartTrackAsMenu(MUSIC_CREDITS); } } @@ -4938,7 +4938,7 @@ glabel var7f1afe70nb .NB0f1359ec: /* f1359ec: 0fc5a1ab */ jal musicSetStage /* f1359f0: 2404005c */ addiu $a0,$zero,0x5c -/* f1359f4: 0fc5a176 */ jal musicStartMenu2 +/* f1359f4: 0fc5a176 */ jal musicStartTrackAsMenu /* f1359f8: 24040058 */ addiu $a0,$zero,0x58 /* f1359fc: 00002025 */ or $a0,$zero,$zero .NB0f135a00: diff --git a/src/game/game_01bea0.c b/src/game/game_01bea0.c index d7668519f..f729c56eb 100644 --- a/src/game/game_01bea0.c +++ b/src/game/game_01bea0.c @@ -1223,7 +1223,7 @@ glabel var7f1a863c .PF0f01cfd4: /* f01cfd4: 0c0039af */ jal mainChangeToStage /* f01cfd8: 00000000 */ nop -/* f01cfdc: 0fc5b88c */ jal func0f16d3d0 +/* f01cfdc: 0fc5b88c */ jal musicQueueStopAllEvent /* f01cfe0: 00000000 */ nop /* f01cfe4: 10000042 */ b .PF0f01d0f0 /* f01cfe8: 240fffff */ li $t7,-1 @@ -1297,7 +1297,7 @@ glabel var7f1a863c .PF0f01d0dc: /* f01d0dc: 52000004 */ beqzl $s0,.PF0f01d0f0 /* f01d0e0: 240fffff */ li $t7,-1 -/* f01d0e4: 0fc5ba5d */ jal musicStartForMenu +/* f01d0e4: 0fc5ba5d */ jal musicStartMenu /* f01d0e8: 00000000 */ nop .PF0f01d0ec: /* f01d0ec: 240fffff */ li $t7,-1 @@ -3000,7 +3000,7 @@ glabel var7f1a863c .L0f01cf04: /* f01cf04: 0c003a57 */ jal mainChangeToStage /* f01cf08: 00000000 */ nop -/* f01cf0c: 0fc5b4f4 */ jal func0f16d3d0 +/* f01cf0c: 0fc5b4f4 */ jal musicQueueStopAllEvent /* f01cf10: 00000000 */ nop /* f01cf14: 10000042 */ b .L0f01d020 /* f01cf18: 2419ffff */ addiu $t9,$zero,-1 @@ -3074,7 +3074,7 @@ glabel var7f1a863c .L0f01d00c: /* f01d00c: 52000004 */ beqzl $s0,.L0f01d020 /* f01d010: 2419ffff */ addiu $t9,$zero,-1 -/* f01d014: 0fc5b6c5 */ jal musicStartForMenu +/* f01d014: 0fc5b6c5 */ jal musicStartMenu /* f01d018: 00000000 */ nop .L0f01d01c: /* f01d01c: 2419ffff */ addiu $t9,$zero,-1 @@ -4768,7 +4768,7 @@ glabel var7f1a863c .NB0f01cbe4: /* f01cbe4: 0c003c56 */ jal mainChangeToStage /* f01cbe8: 00000000 */ sll $zero,$zero,0x0 -/* f01cbec: 0fc5a04d */ jal func0f16d3d0 +/* f01cbec: 0fc5a04d */ jal musicQueueStopAllEvent /* f01cbf0: 00000000 */ sll $zero,$zero,0x0 /* f01cbf4: 10000042 */ beqz $zero,.NB0f01cd00 /* f01cbf8: 2419ffff */ addiu $t9,$zero,-1 @@ -4842,7 +4842,7 @@ glabel var7f1a863c .NB0f01ccec: /* f01ccec: 52000004 */ beqzl $s0,.NB0f01cd00 /* f01ccf0: 2419ffff */ addiu $t9,$zero,-1 -/* f01ccf4: 0fc5a1e8 */ jal musicStartForMenu +/* f01ccf4: 0fc5a1e8 */ jal musicStartMenu /* f01ccf8: 00000000 */ sll $zero,$zero,0x0 .NB0f01ccfc: /* f01ccfc: 2419ffff */ addiu $t9,$zero,-1 @@ -5916,7 +5916,7 @@ glabel var7f1a863c // gamefileLoadDefaults(&g_GameFile); // gamefileApplyOptions(&g_GameFile); // mainChangeToStage(IS4MB() ? STAGE_4MBMENU : STAGE_CITRAINING); -// func0f16d3d0(); +// musicQueueStopAllEvent(); // } else { // // cf1c // s32 pass = false; @@ -5944,7 +5944,7 @@ glabel var7f1a863c // } // // if (pass) { -// musicStartForMenu(); +// musicStartMenu(); // } // } // diff --git a/src/game/game_0b69d0.c b/src/game/game_0b69d0.c index b08679092..c2ed00f92 100644 --- a/src/game/game_0b69d0.c +++ b/src/game/game_0b69d0.c @@ -4231,7 +4231,7 @@ void currentPlayerTickPauseMenu(void) } } - musicStartForMenu(); + musicStartMenu(); } break; case PAUSEMODE_PAUSED: @@ -4244,7 +4244,7 @@ void currentPlayerTickPauseMenu(void) if (g_Vars.currentplayer->pausetime60 >= 20) { lvSetPaused(false); g_Vars.currentplayer->pausemode = PAUSEMODE_UNPAUSED; - musicResumeAfterUnpause(); + musicEndMenu(); } break; } @@ -4259,11 +4259,11 @@ void currentPlayerPause(s32 root) } } -void func0f0baf38(void) +void currentPlayerUnpause(void) { if (g_Vars.currentplayer->pausemode == PAUSEMODE_PAUSED) { lvSetPaused(false); - musicResumeAfterUnpause(); + musicEndMenu(); g_Vars.currentplayer->pausemode = PAUSEMODE_UNPAUSED; } } @@ -14520,7 +14520,7 @@ Gfx *currentPlayerRenderHud(Gfx *gdl) if (g_Vars.mplayerisrunning == false) { musicStartSoloDeath(); } else { - func0f16dd14(); + musicStartMpDeath(); } } else { if (g_Vars.currentplayer->redbloodfinished) { diff --git a/src/game/game_0f09f0.c b/src/game/game_0f09f0.c index 5f0e60f19..6aad6ff4c 100644 --- a/src/game/game_0f09f0.c +++ b/src/game/game_0f09f0.c @@ -17713,7 +17713,7 @@ glabel var7f1b29f8 /* f0f8538: 24040004 */ addiu $a0,$zero,0x4 /* f0f853c: 1000001e */ b .L0f0f85b8 /* f0f8540: 00000000 */ nop -/* f0f8544: 0fc5b6c5 */ jal musicStartForMenu +/* f0f8544: 0fc5b6c5 */ jal musicStartMenu /* f0f8548: 00000000 */ nop /* f0f854c: 3c03800a */ lui $v1,%hi(g_MenuData) /* f0f8550: 246319c0 */ addiu $v1,$v1,%lo(g_MenuData) @@ -17737,7 +17737,7 @@ glabel var7f1b29f8 /* f0f8594: 24040001 */ addiu $a0,$zero,0x1 /* f0f8598: 10000007 */ b .L0f0f85b8 /* f0f859c: 00000000 */ nop -/* f0f85a0: 0fc5b6c5 */ jal musicStartForMenu +/* f0f85a0: 0fc5b6c5 */ jal musicStartMenu /* f0f85a4: 00000000 */ nop /* f0f85a8: 3c03800a */ lui $v1,%hi(g_MenuData) /* f0f85ac: 246319c0 */ addiu $v1,$v1,%lo(g_MenuData) @@ -17952,7 +17952,7 @@ glabel var7f1b29f8 /* f0f4ea0: 24040004 */ addiu $a0,$zero,0x4 /* f0f4ea4: 1000001e */ beqz $zero,.NB0f0f4f20 /* f0f4ea8: 00000000 */ sll $zero,$zero,0x0 -/* f0f4eac: 0fc5a1e8 */ jal musicStartForMenu +/* f0f4eac: 0fc5a1e8 */ jal musicStartMenu /* f0f4eb0: 00000000 */ sll $zero,$zero,0x0 /* f0f4eb4: 3c03800a */ lui $v1,0x800a /* f0f4eb8: 24635eb0 */ addiu $v1,$v1,0x5eb0 @@ -17976,7 +17976,7 @@ glabel var7f1b29f8 /* f0f4efc: 24040001 */ addiu $a0,$zero,0x1 /* f0f4f00: 10000007 */ beqz $zero,.NB0f0f4f20 /* f0f4f04: 00000000 */ sll $zero,$zero,0x0 -/* f0f4f08: 0fc5a1e8 */ jal musicStartForMenu +/* f0f4f08: 0fc5a1e8 */ jal musicStartMenu /* f0f4f0c: 00000000 */ sll $zero,$zero,0x0 /* f0f4f10: 3c03800a */ lui $v1,0x800a /* f0f4f14: 24635eb0 */ addiu $v1,$v1,0x5eb0 @@ -18000,7 +18000,7 @@ glabel var7f1b29f8 void func0f0f85e0(struct menudialog *dialog, s32 root) { if (dialog == &g_CiMenuViaPcMenuDialog) { - musicStartForMenu(); + musicStartMenu(); } menuPushRootDialog(dialog, root); @@ -23743,7 +23743,7 @@ void func0f0fa6ac(void) case MENUROOT_FILEMGR: case MENUROOT_4MBMAINMENU: case MENUROOT_TRAINING: - func0f0baf38(); + currentPlayerUnpause(); g_PlayersWithControl[0] = true; } } diff --git a/src/game/game_176080.c b/src/game/game_176080.c index 5bb50f5fe..d0c36639f 100644 --- a/src/game/game_176080.c +++ b/src/game/game_176080.c @@ -611,7 +611,7 @@ s32 stageGetPrimaryTrack(s32 stagenum) s32 i; if (g_Vars.normmplayerisrunning) { - return func0f18c4c0(); + return mpChooseRandomTrack(); } i = 0; @@ -619,7 +619,7 @@ s32 stageGetPrimaryTrack(s32 stagenum) while (g_StageTracks[i].stagenum) { if (g_StageTracks[i].stagenum == stagenum) { if (g_StageTracks[i].primarytrack == -1) { - return func0f18c4c0(); + return mpChooseRandomTrack(); } return g_StageTracks[i].primarytrack; @@ -628,7 +628,7 @@ s32 stageGetPrimaryTrack(s32 stagenum) i++; } - return func0f18c4c0(); + return mpChooseRandomTrack(); } s32 stageGetAmbientTrack(s32 stagenum) @@ -646,7 +646,7 @@ s32 stageGetAmbientTrack(s32 stagenum) return -1; } -s32 stageGetXTrack(s32 stagenum) +s32 stageGetNrgTrack(s32 stagenum) { s32 i = 0; diff --git a/src/game/lv.c b/src/game/lv.c index 904b4a645..a298cdbde 100644 --- a/src/game/lv.c +++ b/src/game/lv.c @@ -356,7 +356,7 @@ void lvInit(s32 stagenum) g_MiscAudioHandle = NULL; - func0f16d324(); + musicInit(); func0f011124(true); func0f013b80(); texturesLoadConfigs(); @@ -681,7 +681,7 @@ glabel var7f1b1f44nc /* f1628ac: a22004d6 */ sb $zero,0x4d6($s1) /* f1628b0: a22004d7 */ sb $zero,0x4d7($s1) /* f1628b4: 3c018008 */ lui $at,0x8008 -/* f1628b8: 0fc5a026 */ jal func0f16d324 +/* f1628b8: 0fc5a026 */ jal musicInit /* f1628bc: ac206894 */ sw $zero,0x6894($at) /* f1628c0: 0fc04399 */ jal func0f011124 /* f1628c4: 24040001 */ addiu $a0,$zero,0x1 diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index 5a606e331..2b331b6bd 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -52,7 +52,7 @@ const char var7f1b8a00[] = "||||||||||||| Starting game... players %d\n"; #endif s32 var80087260 = 0x00000000; -u32 var80087264 = 0x00000000; +bool g_MpEnableMusicSwitching = false; struct mpweapon g_MpWeapons[0x27] = { /*0x00*/ { WEAPON_NONE, 0x00, 0x00, 0x00, 0x00, 1, 0, MODEL_CHRTT33, 0x0100 }, @@ -263,7 +263,7 @@ void mpInit(void) g_MpSetup.paused = false; - var80087264 = 0; + g_MpEnableMusicSwitching = false; if (g_Vars.normmplayerisrunning) { if (mpGetUsingMultipleTunes()) { @@ -278,7 +278,7 @@ void mpInit(void) } if (count >= 2) { - var80087264 = 1; + g_MpEnableMusicSwitching = true; } } @@ -7253,7 +7253,7 @@ void mpEndMatch(void) s32 prevplayernum; s32 i; - musicStartForMenu(); + musicStartMenu(); mpSetPaused(MPPAUSEMODE_GAMEOVER); prevplayernum = g_Vars.currentplayernum; @@ -7793,7 +7793,7 @@ s32 mpGetCurrentTrackSlotNum(void) #if VERSION >= VERSION_PAL_FINAL GLOBAL_ASM( -glabel func0f18c4c0 +glabel mpChooseRandomTrack /* f18d564: 27bdffc8 */ addiu $sp,$sp,-56 /* f18d568: afbf0034 */ sw $ra,0x34($sp) /* f18d56c: afb60030 */ sw $s6,0x30($sp) @@ -8007,7 +8007,7 @@ glabel func0f18c4c0 ); #else GLOBAL_ASM( -glabel func0f18c4c0 +glabel mpChooseRandomTrack /* f18c4c0: 27bdffc8 */ addiu $sp,$sp,-56 /* f18c4c4: afbf0034 */ sw $ra,0x34($sp) /* f18c4c8: afb60030 */ sw $s6,0x30($sp) @@ -8062,12 +8062,12 @@ glabel func0f18c4c0 /* f18c578: aec20004 */ sw $v0,0x4($s6) /* f18c57c: 006f1821 */ addu $v1,$v1,$t7 /* f18c580: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) -/* f18c584: 3c018008 */ lui $at,%hi(var800840f8) +/* f18c584: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c588: 307801ff */ andi $t8,$v1,0x1ff /* f18c58c: 0018c900 */ sll $t9,$t8,0x4 /* f18c590: 0338c823 */ subu $t9,$t9,$t8 /* f18c594: 0019c880 */ sll $t9,$t9,0x2 -/* f18c598: ac3940f8 */ sw $t9,%lo(var800840f8)($at) +/* f18c598: ac3940f8 */ sw $t9,%lo(g_MusicLife60)($at) /* f18c59c: 10000073 */ b .L0f18c76c /* f18c5a0: 00031242 */ srl $v0,$v1,0x9 .L0f18c5a4: @@ -8105,12 +8105,12 @@ glabel func0f18c4c0 /* f18c608: 1661000a */ bne $s3,$at,.L0f18c634 /* f18c60c: 3c038008 */ lui $v1,%hi(g_MpTracks) /* f18c610: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) -/* f18c614: 3c018008 */ lui $at,%hi(var800840f8) +/* f18c614: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c618: 306801ff */ andi $t0,$v1,0x1ff /* f18c61c: 00084900 */ sll $t1,$t0,0x4 /* f18c620: 01284823 */ subu $t1,$t1,$t0 /* f18c624: 00094880 */ sll $t1,$t1,0x2 -/* f18c628: ac2940f8 */ sw $t1,%lo(var800840f8)($at) +/* f18c628: ac2940f8 */ sw $t1,%lo(g_MusicLife60)($at) /* f18c62c: 1000004f */ b .L0f18c76c /* f18c630: 00031242 */ srl $v0,$v1,0x9 .L0f18c634: @@ -8130,12 +8130,12 @@ glabel func0f18c4c0 /* f18c664: aed30004 */ sw $s3,0x4($s6) /* f18c668: 006b1821 */ addu $v1,$v1,$t3 /* f18c66c: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) -/* f18c670: 3c018008 */ lui $at,%hi(var800840f8) +/* f18c670: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c674: 306c01ff */ andi $t4,$v1,0x1ff /* f18c678: 000c6900 */ sll $t5,$t4,0x4 /* f18c67c: 01ac6823 */ subu $t5,$t5,$t4 /* f18c680: 000d6880 */ sll $t5,$t5,0x2 -/* f18c684: ac2d40f8 */ sw $t5,%lo(var800840f8)($at) +/* f18c684: ac2d40f8 */ sw $t5,%lo(g_MusicLife60)($at) /* f18c688: 10000038 */ b .L0f18c76c /* f18c68c: 00031242 */ srl $v0,$v1,0x9 .L0f18c690: @@ -8170,12 +8170,12 @@ glabel func0f18c4c0 /* f18c6f8: aec20004 */ sw $v0,0x4($s6) /* f18c6fc: 006f1821 */ addu $v1,$v1,$t7 /* f18c700: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) -/* f18c704: 3c018008 */ lui $at,%hi(var800840f8) +/* f18c704: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c708: 307801ff */ andi $t8,$v1,0x1ff /* f18c70c: 0018c900 */ sll $t9,$t8,0x4 /* f18c710: 0338c823 */ subu $t9,$t9,$t8 /* f18c714: 0019c880 */ sll $t9,$t9,0x2 -/* f18c718: ac3940f8 */ sw $t9,%lo(var800840f8)($at) +/* f18c718: ac3940f8 */ sw $t9,%lo(g_MusicLife60)($at) /* f18c71c: 10000013 */ b .L0f18c76c /* f18c720: 00031242 */ srl $v0,$v1,0x9 .L0f18c724: @@ -8190,12 +8190,12 @@ glabel func0f18c4c0 /* f18c744: aec20004 */ sw $v0,0x4($s6) /* f18c748: 00681821 */ addu $v1,$v1,$t0 /* f18c74c: 94637a70 */ lhu $v1,%lo(g_MpTracks)($v1) -/* f18c750: 3c018008 */ lui $at,%hi(var800840f8) +/* f18c750: 3c018008 */ lui $at,%hi(g_MusicLife60) /* f18c754: 306901ff */ andi $t1,$v1,0x1ff /* f18c758: 00095100 */ sll $t2,$t1,0x4 /* f18c75c: 01495023 */ subu $t2,$t2,$t1 /* f18c760: 000a5080 */ sll $t2,$t2,0x2 -/* f18c764: ac2a40f8 */ sw $t2,%lo(var800840f8)($at) +/* f18c764: ac2a40f8 */ sw $t2,%lo(g_MusicLife60)($at) /* f18c768: 00031242 */ srl $v0,$v1,0x9 .L0f18c76c: /* f18c76c: 8fbf0034 */ lw $ra,0x34($sp) diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index 37bd13580..cc5ac6f72 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -6512,7 +6512,7 @@ s32 mpSelectTuneListHandler(s32 operation, struct menuitem *item, union handlerd break; case MENUOP_LISTITEMFOCUS: if (data->list.value < mpGetNumUnlockedTracks()) { - musicStartMenu2(mpGetTrackMusicNum(data->list.value)); + musicStartTrackAsMenu(mpGetTrackMusicNum(data->list.value)); } break; case MENUOP_GETLISTITEMCHECKBOX: diff --git a/src/game/music.c b/src/game/music.c index 5ce7f55bb..d9447b2c4 100644 --- a/src/game/music.c +++ b/src/game/music.c @@ -11,8 +11,10 @@ #include "data.h" #include "types.h" +#define FADETYPE_STOP 0 +#define FADETYPE_PAUSE 1 + s32 g_MusicStageNum; -u32 var800aa5d4; struct musicevent g_MusicEventQueue[40]; struct var800aaa38 var800aaa38[3]; u32 g_AudioXReasonsActive[4]; @@ -29,20 +31,20 @@ s32 var800840d0 = -1; #endif u32 g_MusicNextEventId = 0; -u32 g_MusicNrgIsPlaying = false; -s32 var800840dc = 0; +bool g_MusicNrgIsActive = false; +bool g_MusicMpDeathIsPlaying = false; s32 var800840e0 = 15; s32 var800840e4 = 0; -s32 var800840e8 = 0; +bool g_MusicSoloDeathIsPlaying = false; #if VERSION >= VERSION_NTSC_1_0 -u16 var800840ec = 0x5000; +u16 g_MusicVolume = 0x5000; #endif -s32 g_MusicDeathTimer240 = 0x00000000; -s32 var800840f4 = 0x00000000; -s32 var800840f8 = PAL ? 100 : 120; -s32 var800840fc = 0x00000000; +s32 g_MusicDeathTimer240 = 0; // Counts down 5 seconds while death music plays +s32 g_MusicAge60 = 0; // The current age of the MP track being played +s32 g_MusicLife60 = PALDOWN(120); // The max age of any MP track (this value is changed in MP code) +s32 g_MusicSilenceTimer60 = 0; // Counts down the 2 second silence between MP track changes #if VERSION < VERSION_NTSC_1_0 const char var7f1b2030nb[] = "MUSIC : musicPlayLevel\n"; @@ -55,12 +57,12 @@ const char var7f1b20b8nb[] = "musicStartWatch start\n"; const char var7f1b20d0nb[] = "musicEndWatch start\n"; const char var7f1b20e8nb[] = "musicEndWatch end\n"; const char var7f1b20fcnb[] = "musicStartDead\n"; -const char var7f1b210cnb[] = "musicStartTemporary\n"; +const char var7f1b210cnb[] = "musicStartTemporaryAmbient\n"; const char var7f1b2124nb[] = "musicEndTemporary\n"; const char var7f1b2138nb[] = "musicStartCutscene\n"; const char var7f1b214cnb[] = "musicEndCutscene\n"; const char var7f1b2160nb[] = "musicStartAmbient : Tune=%d\n"; -const char var7f1b2180nb[] = "musicEndAmbient\n"; +const char var7f1b2180nb[] = "musicEndTemporaryAmbient\n"; #endif char *var80084100[] = { @@ -88,8 +90,8 @@ u16 musicGetVolume(void) return 0x5000; } - if (var800840ec < 0x5000) { - volume = var800840ec; + if (g_MusicVolume < 0x5000) { + volume = g_MusicVolume; } else { volume = 0x5000; } @@ -111,13 +113,13 @@ void musicSetVolume(u16 volume) #endif for (i = 0; i < ARRAYCOUNT(var800aaa38); i++) { - if (var800aaa38[i].tracktype != 0 && var800aaa38[i].tracktype != TRACKTYPE_AMBIENT) { - snd0000fd9c(&var80094ed8[i], volume); + if (var800aaa38[i].tracktype != TRACKTYPE_NONE && var800aaa38[i].tracktype != TRACKTYPE_AMBIENT) { + sndSetMusicChannelVolume(&var80094ed8[i], volume); } } #if VERSION >= VERSION_NTSC_1_0 - var800840ec = volume; + g_MusicVolume = volume; #endif } @@ -157,7 +159,7 @@ s32 func0f16d124(s32 tracktype) return 0; } -s32 func0f16d180(s32 tracktype) +s32 musicGetChannelByTrackType(s32 tracktype) { s32 i; @@ -170,7 +172,7 @@ s32 func0f16d180(s32 tracktype) return -1; } -void musicStart(u32 tracktype, u32 tracknum, f32 arg2, u16 volume) +void musicQueueStartEvent(u32 tracktype, u32 tracknum, f32 arg2, u16 volume) { if (!g_SndDisabled) { g_MusicEventQueue[g_MusicEventQueueLength].tracktype = tracktype; @@ -185,7 +187,7 @@ void musicStart(u32 tracktype, u32 tracknum, f32 arg2, u16 volume) } } -void musicEnd(s32 tracktype) +void musicQueueStopEvent(s32 tracktype) { if (!g_SndDisabled) { g_MusicEventQueue[g_MusicEventQueueLength].tracktype = tracktype; @@ -197,12 +199,12 @@ void musicEnd(s32 tracktype) } } -void func0f16d2ac(s32 tracktype, f32 arg1, s32 arg2) +void musicQueueFadeEvent(s32 tracktype, f32 arg1, bool fadetopause) { if (!g_SndDisabled) { g_MusicEventQueue[g_MusicEventQueueLength].tracktype = tracktype; g_MusicEventQueue[g_MusicEventQueueLength].unk0c = arg1; - g_MusicEventQueue[g_MusicEventQueueLength].unk08 = arg2; + g_MusicEventQueue[g_MusicEventQueueLength].fadetopause = fadetopause; g_MusicEventQueue[g_MusicEventQueueLength].eventtype = MUSICEVENTTYPE_FADE; g_MusicEventQueue[g_MusicEventQueueLength].id = g_MusicNextEventId++; g_MusicEventQueue[g_MusicEventQueueLength].numattempts = 0; @@ -211,7 +213,7 @@ void func0f16d2ac(s32 tracktype, f32 arg1, s32 arg2) } } -void func0f16d324(void) +void musicInit(void) { s32 i; @@ -224,22 +226,22 @@ void func0f16d324(void) #if VERSION >= VERSION_NTSC_1_0 func0f16d430(); - func0f16d3d0(); - func0f16d44c(); + musicQueueStopAllEvent(); + musicQueueType5Event(); #else - func0f16d3d0(); + musicQueueStopAllEvent(); #endif - var800840e8 = 0; + g_MusicSoloDeathIsPlaying = false; g_MusicDeathTimer240 = 0; g_MenuTrack = -1; g_TemporaryPrimaryTrack = -1; g_TemporaryAmbientTrack = -1; - g_MusicNrgIsPlaying = 0; + g_MusicNrgIsActive = false; } } -void func0f16d3d0(void) +void musicQueueStopAllEvent(void) { #if VERSION >= VERSION_NTSC_1_0 g_MusicEventQueue[0].tracktype = TRACKTYPE_6; @@ -262,7 +264,7 @@ void func0f16d430(void) var800840e0 = 0; } -void func0f16d44c(void) +void musicQueueType5Event(void) { g_MusicEventQueue[g_MusicEventQueueLength].tracktype = TRACKTYPE_6; g_MusicEventQueue[g_MusicEventQueueLength].eventtype = MUSICEVENTTYPE_5; @@ -280,7 +282,7 @@ void func0f16d44c(void) void musicStartPrimary(f32 arg0) { if (PRIMARYTRACK() >= 0) { - musicStart(TRACKTYPE_PRIMARY, PRIMARYTRACK(), arg0, musicGetVolume()); + musicQueueStartEvent(TRACKTYPE_PRIMARY, PRIMARYTRACK(), arg0, musicGetVolume()); } } @@ -296,8 +298,8 @@ void musicStartAmbient(f32 arg0) pass = true; } else if (musicIsAnyPlayerInAmbientRoom()) { if (g_Vars.tickmode != TICKMODE_CUTSCENE && AMBIENTTRACK() != stageGetAmbientTrack(g_MusicStageNum)) { - musicEnd(TRACKTYPE_AMBIENT); - musicStartTemporary(stageGetAmbientTrack(g_MusicStageNum)); + musicQueueStopEvent(TRACKTYPE_AMBIENT); + musicStartTemporaryAmbient(stageGetAmbientTrack(g_MusicStageNum)); return; } @@ -309,7 +311,7 @@ void musicStartAmbient(f32 arg0) pass = func0f16d124(TRACKTYPE_AMBIENT); if (pass == 0 || pass == 2) { - musicStart(TRACKTYPE_AMBIENT, AMBIENTTRACK(), arg0, VOLUME(g_SfxVolume)); + musicQueueStartEvent(TRACKTYPE_AMBIENT, AMBIENTTRACK(), arg0, VOLUME(g_SfxVolume)); } } } @@ -372,12 +374,12 @@ glabel musicStartAmbient /* f1682dc: 8fa30018 */ lw $v1,0x18($sp) /* f1682e0: 5043000b */ beql $v0,$v1,.NB0f168310 /* f1682e4: 24050001 */ addiu $a1,$zero,0x1 -/* f1682e8: 0fc59fed */ jal musicEnd +/* f1682e8: 0fc59fed */ jal musicQueueStopEvent /* f1682ec: 24040005 */ addiu $a0,$zero,0x5 /* f1682f0: 3c04800b */ lui $a0,0x800b /* f1682f4: 0fc5c65e */ jal stageGetAmbientTrack /* f1682f8: 8c84ee80 */ lw $a0,-0x1180($a0) -/* f1682fc: 0fc5a2f1 */ jal musicStartTemporary +/* f1682fc: 0fc5a2f1 */ jal musicStartTemporaryAmbient /* f168300: 00402025 */ or $a0,$v0,$zero /* f168304: 1000001a */ beqz $zero,.NB0f168370 /* f168308: 8fbf0014 */ lw $ra,0x14($sp) @@ -407,7 +409,7 @@ glabel musicStartAmbient /* f168358: 3c078006 */ lui $a3,0x8006 /* f16835c: 94e7f6e8 */ lhu $a3,-0x918($a3) /* f168360: 24040005 */ addiu $a0,$zero,0x5 -/* f168364: 0fc59fcc */ jal musicStart +/* f168364: 0fc59fcc */ jal musicQueueStartEvent /* f168368: 8fa60020 */ lw $a2,0x20($sp) .NB0f16836c: /* f16836c: 8fbf0014 */ lw $ra,0x14($sp) @@ -430,11 +432,11 @@ bool musicIsAnyPlayerInAmbientRoom(void) return false; } - if (var800840e8) { + if (g_MusicSoloDeathIsPlaying) { return false; } - if (g_MusicNrgIsPlaying && var800840dc) { + if (g_MusicNrgIsActive && g_MusicMpDeathIsPlaying) { return false; } @@ -459,30 +461,41 @@ bool musicIsAnyPlayerInAmbientRoom(void) return false; } -void musicStartX(f32 arg0) +void musicStartNrg(f32 arg0) { - musicStart(TRACKTYPE_X, stageGetXTrack(g_MusicStageNum), arg0, musicGetVolume()); + musicQueueStartEvent(TRACKTYPE_NRG, stageGetNrgTrack(g_MusicStageNum), arg0, musicGetVolume()); } -void musicStartMenu(f32 arg0) +/** + * Not called. + */ +void musicStartWatch(f32 arg0) { - musicStart(TRACKTYPE_MENU, menuChooseMusic(), arg0, musicGetVolume()); + musicQueueStartEvent(TRACKTYPE_MENU, menuChooseMusic(), arg0, musicGetVolume()); } -void musicStartMenu2(s32 tracknum) +/** + * Play a specific track as a menu track. + * + * Used in credits and the soundtrack dialog in MP setup. + */ +void musicStartTrackAsMenu(s32 tracknum) { if (tracknum != g_MenuTrack) { - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); - func0f16d2ac(TRACKTYPE_PRIMARY, 0.5f, 1); - func0f16d2ac(TRACKTYPE_X, 0.5f, 1); - func0f16d2ac(TRACKTYPE_AMBIENT, 0.5f, 1); - musicStart(TRACKTYPE_MENU, tracknum, 0, musicGetVolume()); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); + musicQueueFadeEvent(TRACKTYPE_PRIMARY, 0.5f, FADETYPE_PAUSE); + musicQueueFadeEvent(TRACKTYPE_NRG, 0.5f, FADETYPE_PAUSE); + musicQueueFadeEvent(TRACKTYPE_AMBIENT, 0.5f, FADETYPE_PAUSE); + musicQueueStartEvent(TRACKTYPE_MENU, tracknum, 0, musicGetVolume()); } g_MenuTrack = tracknum; } +/** + * Used when starting combat simulator matches. + */ void musicSetStageAndStartMusic(s32 stagenum) { g_MusicStageNum = stagenum; @@ -494,6 +507,9 @@ void musicSetStageAndStartMusic(s32 stagenum) } } +/** + * Used for solo missions. + */ void musicSetStage(s32 stagenum) { g_MusicStageNum = stagenum; @@ -503,60 +519,63 @@ void musicReset(void) { #if VERSION >= VERSION_NTSC_1_0 func0f16d430(); - func0f16d3d0(); - func0f16d44c(); + musicQueueStopAllEvent(); + musicQueueType5Event(); #else - func0f16d3d0(); + musicQueueStopAllEvent(); #endif } -void musicStartNrg(void) +void musicActivateNrg(void) { #if VERSION >= VERSION_NTSC_1_0 - if (g_MusicNrgIsPlaying == 0) + if (!g_MusicNrgIsActive) #endif { - if (stageGetXTrack(g_MusicStageNum) >= 0) { - musicEnd(TRACKTYPE_X); - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); - func0f16d2ac(TRACKTYPE_PRIMARY, 0.5, 1); - musicStartX(0); + if (stageGetNrgTrack(g_MusicStageNum) >= 0) { + musicQueueStopEvent(TRACKTYPE_NRG); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); + musicQueueFadeEvent(TRACKTYPE_PRIMARY, 0.5, FADETYPE_PAUSE); + musicStartNrg(0); - g_MusicNrgIsPlaying = 1; + g_MusicNrgIsActive = true; } } } -void musicStopNrg(void) +void musicDeactivateNrg(void) { #if VERSION >= VERSION_NTSC_1_0 - if (g_MusicNrgIsPlaying) + if (g_MusicNrgIsActive) #endif { - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); - func0f16d2ac(TRACKTYPE_X, 1, 0); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); + musicQueueFadeEvent(TRACKTYPE_NRG, 1, FADETYPE_STOP); if (g_Vars.dontplaynrg == false) { musicStartPrimary(0.5); } - g_MusicNrgIsPlaying = 0; + g_MusicNrgIsActive = false; } } -void musicStartForMenu(void) +/** + * Called in many places when opening a pause menu. + */ +void musicStartMenu(void) { - musicStartMenu2(menuChooseMusic()); + musicStartTrackAsMenu(menuChooseMusic()); } -void musicResumeAfterUnpause(void) +void musicEndMenu(void) { - func0f16d2ac(TRACKTYPE_MENU, 1, 0); + musicQueueFadeEvent(TRACKTYPE_MENU, 1, FADETYPE_STOP); - if (func0f16d0a8(TRACKTYPE_X, 1)) { - musicStartX(1); + if (func0f16d0a8(TRACKTYPE_NRG, 1)) { + musicStartNrg(1); } else { musicStartPrimary(1); } @@ -566,119 +585,142 @@ void musicResumeAfterUnpause(void) void musicStartSoloDeath(void) { - var800840e8 = 1; + g_MusicSoloDeathIsPlaying = true; #if VERSION >= VERSION_NTSC_1_0 func0f16d430(); #endif - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); musicUnsetXReason(-1); - musicEnd(TRACKTYPE_X); - musicEnd(TRACKTYPE_PRIMARY); - musicEnd(TRACKTYPE_AMBIENT); - musicStart(TRACKTYPE_PRIMARY, MUSIC_DEATH_SOLO, 0, VOLUME(g_SfxVolume) > musicGetVolume() ? VOLUME(g_SfxVolume) : musicGetVolume()); + musicQueueStopEvent(TRACKTYPE_NRG); + musicQueueStopEvent(TRACKTYPE_PRIMARY); + musicQueueStopEvent(TRACKTYPE_AMBIENT); + musicQueueStartEvent(TRACKTYPE_PRIMARY, MUSIC_DEATH_SOLO, 0, VOLUME(g_SfxVolume) > musicGetVolume() ? VOLUME(g_SfxVolume) : musicGetVolume()); #if VERSION >= VERSION_NTSC_1_0 - func0f16d44c(); + musicQueueType5Event(); #endif } -void musicStartMpDeath(f32 arg0) +void _musicStartMpDeath(f32 arg0) { #if VERSION >= VERSION_NTSC_1_0 func0f16d430(); - musicStart(TRACKTYPE_DEATH, MUSIC_DEATH_MP, arg0, VOLUME(g_SfxVolume) > musicGetVolume() ? VOLUME(g_SfxVolume) : musicGetVolume()); - func0f16d44c(); + musicQueueStartEvent(TRACKTYPE_DEATH, MUSIC_DEATH_MP, arg0, VOLUME(g_SfxVolume) > musicGetVolume() ? VOLUME(g_SfxVolume) : musicGetVolume()); + musicQueueType5Event(); #else - musicStart(TRACKTYPE_DEATH, MUSIC_DEATH_MP, arg0, VOLUME(g_SfxVolume) > musicGetVolume() ? VOLUME(g_SfxVolume) : musicGetVolume()); + musicQueueStartEvent(TRACKTYPE_DEATH, MUSIC_DEATH_MP, arg0, VOLUME(g_SfxVolume) > musicGetVolume() ? VOLUME(g_SfxVolume) : musicGetVolume()); #endif } -void func0f16dd14(void) +void musicStartMpDeath(void) { #if VERSION >= VERSION_NTSC_1_0 func0f16d430(); #endif - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); - musicEnd(TRACKTYPE_AMBIENT); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); + musicQueueStopEvent(TRACKTYPE_AMBIENT); - if (g_MusicNrgIsPlaying) { - func0f16d2ac(TRACKTYPE_X, 0.1f, 1); + if (g_MusicNrgIsActive) { + musicQueueFadeEvent(TRACKTYPE_NRG, 0.1f, FADETYPE_PAUSE); } else { - func0f16d2ac(TRACKTYPE_PRIMARY, 0.1f, 1); + musicQueueFadeEvent(TRACKTYPE_PRIMARY, 0.1f, FADETYPE_PAUSE); } - musicStartMpDeath(0); + _musicStartMpDeath(0); g_MusicDeathTimer240 = PALDOWN(1200); - var800840dc = 1; + g_MusicMpDeathIsPlaying = true; #if VERSION >= VERSION_NTSC_1_0 - func0f16d44c(); + musicQueueType5Event(); #endif } -void func0f16ddb0(void) +void musicEndDeath(void) { - func0f16d2ac(TRACKTYPE_DEATH, 2, 0); + musicQueueFadeEvent(TRACKTYPE_DEATH, 2, FADETYPE_STOP); - if (g_MusicNrgIsPlaying) { - musicStartX(2); + if (g_MusicNrgIsActive) { + musicStartNrg(2); } else { musicStartPrimary(2); } - var800840dc = 0; + g_MusicMpDeathIsPlaying = false; } +/** + * Stop all other music and play the given track. + * + * It's used by the AI scripting language, specifically for CI training and + * the Skedar King battle. + * + * The track type used is primary. + */ void musicPlayTrackIsolated(s32 tracknum) { #if VERSION >= VERSION_NTSC_1_0 func0f16d430(); #endif - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); musicUnsetXReason(-1); - musicEnd(TRACKTYPE_X); - musicEnd(TRACKTYPE_PRIMARY); - musicEnd(TRACKTYPE_AMBIENT); - musicStart(TRACKTYPE_PRIMARY, tracknum, 0, musicGetVolume()); + musicQueueStopEvent(TRACKTYPE_NRG); + musicQueueStopEvent(TRACKTYPE_PRIMARY); + musicQueueStopEvent(TRACKTYPE_AMBIENT); + musicQueueStartEvent(TRACKTYPE_PRIMARY, tracknum, 0, musicGetVolume()); #if VERSION >= VERSION_NTSC_1_0 - func0f16d44c(); + musicQueueType5Event(); #endif } +/** + * Restart the level's default tracks after using the isolated track above. + * + * It's used by the AI scripting language, specifically when ending CI training. + */ void musicPlayDefaultTracks(void) { - musicEnd(TRACKTYPE_PRIMARY); - musicEnd(TRACKTYPE_AMBIENT); + musicQueueStopEvent(TRACKTYPE_PRIMARY); + musicQueueStopEvent(TRACKTYPE_AMBIENT); musicStartPrimary(0.5f); } +/** + * Used by the title screen, as well as AF1's NRG theme which never ends. + */ void musicStartTemporaryPrimary(s32 tracknum) { - musicEnd(TRACKTYPE_PRIMARY); + musicQueueStopEvent(TRACKTYPE_PRIMARY); g_TemporaryPrimaryTrack = tracknum; musicStartPrimary(0.5f); } +/** + * Used by AI scripting on each stage. + * + * The cutscene track is played with a primary tracktype. + * + * The NRG theme will not play while a cutscene theme is active. + */ void musicStartCutscene(s32 tracknum) { u32 volume; - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); musicUnsetXReason(-1); - musicEnd(TRACKTYPE_X); - musicEnd(TRACKTYPE_PRIMARY); + musicQueueStopEvent(TRACKTYPE_NRG); + musicQueueStopEvent(TRACKTYPE_PRIMARY); if (g_SfxVolume < musicGetVolume()) { volume = musicGetVolume(); @@ -686,34 +728,41 @@ void musicStartCutscene(s32 tracknum) volume = g_SfxVolume; } - musicStart(TRACKTYPE_PRIMARY, tracknum, 0, volume); + musicQueueStartEvent(TRACKTYPE_PRIMARY, tracknum, 0, volume); g_Vars.dontplaynrg = true; } +/** + * Used by AI scripting on each stage. + */ void musicEndCutscene(void) { g_Vars.dontplaynrg = false; if (var800624a4 == 0) { - musicEnd(TRACKTYPE_PRIMARY); - musicEnd(TRACKTYPE_AMBIENT); + musicQueueStopEvent(TRACKTYPE_PRIMARY); + musicQueueStopEvent(TRACKTYPE_AMBIENT); musicStartPrimary(0.5f); } } -void musicStartTemporary(s32 tracknum) +/** + * Used by AI scripting, and only to set the ambient track during the Defection + * intro and Extraction outro to traffic noises. + */ +void musicStartTemporaryAmbient(s32 tracknum) { g_TemporaryAmbientTrack = tracknum; - musicEnd(TRACKTYPE_AMBIENT); + musicQueueStopEvent(TRACKTYPE_AMBIENT); - musicStart(TRACKTYPE_AMBIENT, tracknum, 0, VOLUME(g_SfxVolume)); + musicQueueStartEvent(TRACKTYPE_AMBIENT, tracknum, 0, VOLUME(g_SfxVolume)); } -void musicEndAmbient(void) +void musicEndTemporaryAmbient(void) { g_TemporaryAmbientTrack = -1; - musicEnd(TRACKTYPE_AMBIENT); + musicQueueStopEvent(TRACKTYPE_AMBIENT); } void musicSetXReason(s32 reason, u32 minsecs, u32 maxsecs) @@ -739,20 +788,23 @@ void musicUnsetXReason(s32 reason) } #if VERSION >= VERSION_NTSC_1_0 - if (g_MusicNrgIsPlaying) { - musicStopNrg(); + if (g_MusicNrgIsActive) { + musicDeactivateNrg(); } #endif } } -void func0f16e138(void) +/** + * Called by musicTick every 0.25 seconds. + */ +void musicTickAmbient(void) { if (g_TemporaryAmbientTrack == -1) { if (musicIsAnyPlayerInAmbientRoom()) { musicStartAmbient(1); } else if (func0f16d124(TRACKTYPE_AMBIENT) == 1) { - func0f16d2ac(TRACKTYPE_AMBIENT, 1, 1); + musicQueueFadeEvent(TRACKTYPE_AMBIENT, 1, FADETYPE_PAUSE); } } else if (stageGetAmbientTrack(g_MusicStageNum) >= 0) { musicStartAmbient(1); diff --git a/src/game/title.c b/src/game/title.c index 9de048c5e..c8b4ca430 100644 --- a/src/game/title.c +++ b/src/game/title.c @@ -417,7 +417,7 @@ glabel func0f01616c void titleInitLegal(void) { - func0f16d3d0(); + musicQueueStopAllEvent(); var800624f4 = 1; g_TitleTimer = 0; var800624a8 = 0; @@ -2440,7 +2440,7 @@ void func0f017980(void) g_TitleTimer = PALDOWN(549); var80062730 = 0; - musicStartTemporaryPrimary(1); + musicStartTemporaryPrimary(MUSIC_TITLE2); } #if VERSION >= VERSION_PAL_FINAL @@ -6035,7 +6035,7 @@ void titleInitRareLogo(void) var800624f4 = 1; - func0f16d3d0(); + musicQueueStopAllEvent(); joy00014810(false); if (var800624a4 == false && g_Is4Mb != true) { @@ -6089,7 +6089,7 @@ void titleTickRareLogo(void) g_TitleTimer++; } else { if (g_TitleTimer == 0) { - musicStart(TRACKTYPE_PRIMARY, MUSIC_TITLE1, 0, 0x7fff); + musicQueueStartEvent(TRACKTYPE_PRIMARY, MUSIC_TITLE1, 0, 0x7fff); } g_TitleTimer += g_Vars.lvupdate240_60; diff --git a/src/include/constants.h b/src/include/constants.h index 7aab09af8..53f59d22f 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -3765,7 +3765,7 @@ #define TRACKTYPE_NONE 0 #define TRACKTYPE_PRIMARY 1 -#define TRACKTYPE_X 2 +#define TRACKTYPE_NRG 2 // NRG = "energy" (the high-energy X track) #define TRACKTYPE_MENU 3 #define TRACKTYPE_DEATH 4 #define TRACKTYPE_AMBIENT 5 diff --git a/src/include/data.h b/src/include/data.h index ec1875b1d..3ebba06f1 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -457,13 +457,13 @@ extern s32 var80082050; extern u32 g_GfxNumSwaps; extern s32 g_NumReasonsToEndMpMatch; extern s32 g_MusicEventQueueLength; -extern u32 g_MusicNrgIsPlaying; +extern bool g_MusicNrgIsActive; extern s32 var800840e0; extern s32 var800840e4; extern s32 g_MusicDeathTimer240; -extern s32 var800840f4; -extern s32 var800840f8; -extern s32 var800840fc; +extern s32 g_MusicAge60; +extern s32 g_MusicLife60; +extern s32 g_MusicSilenceTimer60; extern bool g_Jpn; #if VERSION >= VERSION_PAL_FINAL extern s32 g_LanguageId; @@ -509,7 +509,7 @@ extern struct mpscenariooverview g_MpScenarioOverviews[]; extern struct menudialog g_MpScenarioMenuDialog; extern struct menudialog g_MpQuickTeamScenarioMenuDialog; extern s32 var80087260; -extern u32 var80087264; +extern bool g_MpEnableMusicSwitching; extern struct mpweapon g_MpWeapons[0x27]; extern struct mphead g_MpHeads[75]; extern struct mpsimulanttype g_MpSimulantTypes[]; diff --git a/src/include/game/game_0b69d0.h b/src/include/game/game_0b69d0.h index 302316f96..9efe7f9c3 100644 --- a/src/include/game/game_0b69d0.h +++ b/src/include/game/game_0b69d0.h @@ -29,7 +29,7 @@ void currentPlayerUpdateZoom(void); void func0f0bace0(void); void currentPlayerTickPauseMenu(void); void currentPlayerPause(s32 root); -void func0f0baf38(void); +void currentPlayerUnpause(void); Gfx *func0f0baf84(Gfx *gdl); Gfx *fadeDraw(Gfx *gdl, u32 r, u32 g, u32 b, f32 frac); Gfx *currentPlayerDrawFade(Gfx *gdl); diff --git a/src/include/game/game_176080.h b/src/include/game/game_176080.h index fd19c642a..29f070d62 100644 --- a/src/include/game/game_176080.h +++ b/src/include/game/game_176080.h @@ -14,6 +14,6 @@ void *func0f176668(s32 arg0); Gfx *func0f1766b4(Gfx *gdl); s32 stageGetPrimaryTrack(s32 stagenum); s32 stageGetAmbientTrack(s32 stagenum); -s32 stageGetXTrack(s32 stagenum); +s32 stageGetNrgTrack(s32 stagenum); #endif diff --git a/src/include/game/mplayer/mplayer.h b/src/include/game/mplayer/mplayer.h index da0812a25..ee305509b 100644 --- a/src/include/game/mplayer/mplayer.h +++ b/src/include/game/mplayer/mplayer.h @@ -79,7 +79,7 @@ void mpDisableAllMultiTracks(void); void mpRandomiseMultiTracks(void); void mpSetTrackToRandom(void); s32 mpGetCurrentTrackSlotNum(void); -u32 func0f18c4c0(void); +u32 mpChooseRandomTrack(void); struct mpchr *func0f18c794(s32 index); u32 func0f18c828(void); s32 mpGetNumChrs(void); diff --git a/src/include/game/music.h b/src/include/game/music.h index 8a59b823b..9ed7f1968 100644 --- a/src/include/game/music.h +++ b/src/include/game/music.h @@ -8,38 +8,38 @@ u16 musicGetVolume(void); void musicSetVolume(u16 volume); bool func0f16d0a8(s32 tracktype, s32 arg1); s32 func0f16d124(s32 tracktype); -void musicStart(u32 tracktype, u32 tracknum, f32 arg2, u16 volume); -void musicEnd(s32 tracktype); -void func0f16d2ac(s32 tracktype, f32 arg1, s32 arg2); -void func0f16d324(void); -void func0f16d3d0(void); +void musicQueueStartEvent(u32 tracktype, u32 tracknum, f32 arg2, u16 volume); +void musicQueueStopEvent(s32 tracktype); +void musicQueueFadeEvent(s32 tracktype, f32 arg1, bool fadetopause); +void musicInit(void); +void musicQueueStopAllEvent(void); void func0f16d430(void); -void func0f16d44c(void); +void musicQueueType5Event(void); void musicStartPrimary(f32 arg0); void musicStartAmbient(f32 arg0); bool musicIsAnyPlayerInAmbientRoom(void); -void musicStartX(f32 arg0); -void musicStartMenu2(s32 tracknum); +void musicStartNrg(f32 arg0); +void musicStartTrackAsMenu(s32 tracknum); void musicSetStageAndStartMusic(s32 stagenum); void musicSetStage(s32 stagenum); void musicReset(void); -void musicStartNrg(void); -void musicStopNrg(void); -void musicStartForMenu(void); -void musicResumeAfterUnpause(void); +void musicActivateNrg(void); +void musicDeactivateNrg(void); +void musicStartMenu(void); +void musicEndMenu(void); void musicStartSoloDeath(void); -void musicStartMpDeath(f32 arg0); -void func0f16dd14(void); -void func0f16ddb0(void); +void _musicStartMpDeath(f32 arg0); +void musicStartMpDeath(void); +void musicEndDeath(void); void musicPlayTrackIsolated(s32 tracknum); void musicPlayDefaultTracks(void); void musicStartTemporaryPrimary(s32 tracknum); void musicStartCutscene(s32 tracknum); void musicEndCutscene(void); -void musicStartTemporary(s32 tracknum); -void musicEndAmbient(void); +void musicStartTemporaryAmbient(s32 tracknum); +void musicEndTemporaryAmbient(void); void musicSetXReason(s32 reason, u32 minsecs, u32 maxsecs); void musicUnsetXReason(s32 reason); -void func0f16e138(void); +void musicTickAmbient(void); #endif diff --git a/src/include/lib/snd.h b/src/include/lib/snd.h index 40bac106a..69f613d02 100644 --- a/src/include/lib/snd.h +++ b/src/include/lib/snd.h @@ -25,7 +25,7 @@ bool sndIsMp3(u16 soundnum); bool snd0000fbc4(s16 arg0); u32 snd0000fc48(void); u32 snd0000fd74(void); -void snd0000fd9c(struct var80094ed8 *arg0, u16 volume); +void sndSetMusicChannelVolume(struct var80094ed8 *arg0, u16 volume); void snd0000fe18(void); void snd0000fe20(void); void snd0000fe50(void); diff --git a/src/include/types.h b/src/include/types.h index f49841ec8..923a797af 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6129,7 +6129,7 @@ struct optiongroup { struct musicevent { s32 tracktype; s32 tracknum; - s32 unk08; + bool fadetopause; f32 unk0c; s16 volume; u16 eventtype; @@ -6259,7 +6259,7 @@ struct var80094ed8 { /*0x0f4*/ u32 unk0f4; /*0x0f8*/ N_ALCSPlayer *seqp; /*0x0fc*/ void *unk0fc; - /*0x100*/ u16 unk100; + /*0x100*/ u16 volume; /*0x104*/ u32 unk104; }; diff --git a/src/lib/main.c b/src/lib/main.c index ff10187cf..9a9d7e8a8 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -3189,7 +3189,7 @@ void mainEndStage(void) } setCurrentPlayerNum(prevplayernum); - musicStartForMenu(); + musicStartMenu(); } else if (g_Vars.antiplayernum >= 0) { s32 prevplayernum = g_Vars.currentplayernum; s32 i; @@ -3200,12 +3200,12 @@ void mainEndStage(void) } setCurrentPlayerNum(prevplayernum); - musicStartForMenu(); + musicStartMenu(); } else if (g_Vars.normmplayerisrunning) { mpEndMatch(); } else { endscreenPrepare(); - musicStartForMenu(); + musicStartMenu(); } } diff --git a/src/lib/music.c b/src/lib/music.c index a21cad48d..9add36c1a 100644 --- a/src/lib/music.c +++ b/src/lib/music.c @@ -40,7 +40,7 @@ const char var70053f38[] = "MUSIC : Tick -> Channel %d (State=%d) has faded to s const char var70053f7c[] = "MUSIC : WARNING -> Force fade termination\n"; const char var70053fa8[] = "MUSIC TICK : Job Guid = %u\n"; -s32 var8005edf0 = -1; +s32 g_MusicNextAmbientTick240 = -1; GLOBAL_ASM( glabel musicHandleStartEvent @@ -147,7 +147,7 @@ glabel var70053fd8 /* 11558: 02202025 */ or $a0,$s1,$zero /* 1155c: 96a50010 */ lhu $a1,0x10($s5) /* 11560: 240c0002 */ addiu $t4,$zero,0x2 -/* 11564: 0c003f67 */ jal snd0000fd9c +/* 11564: 0c003f67 */ jal sndSetMusicChannelVolume /* 11568: afac0044 */ sw $t4,0x44($sp) /* 1156c: 3c0e800b */ lui $t6,%hi(var800aaa38) /* 11570: 25ceaa38 */ addiu $t6,$t6,%lo(var800aaa38) @@ -295,8 +295,8 @@ s32 musicHandleFadeEvent(struct musicevent *event, u32 arg1) func00039e5c(var80094ed8[i].seqp, j, var70053ca0[event->tracktype], 32); } - var800aaa38[i].unk04 = event->unk08; - var800aaa38[i].unk08 = event->unk08; + var800aaa38[i].unk04 = event->fadetopause; + var800aaa38[i].unk08 = event->fadetopause; var800aaa38[i].unk0c = var80094ed8[i].seqp->chanState[0].unk0d; } } @@ -1148,37 +1148,43 @@ void musicTick(void) || (g_Vars.antiplayernum >= 0 && !g_Vars.bond->isdead) || (g_Vars.coopplayernum >= 0 && (!g_Vars.bond->isdead || !g_Vars.coop->isdead)))) { // Someone is dying in MP, or anti is dying, or *one* person is dying in coop - var800840fc = 0; + g_MusicSilenceTimer60 = 0; g_MusicDeathTimer240 -= g_Vars.lvupdate240; if (g_MusicDeathTimer240 <= 0) { - func0f16ddb0(); + musicEndDeath(); - if (var80087264 && g_Vars.normmplayerisrunning && var800840f8 < var800840f4) { - var800840f4 = 0; - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); - musicEnd(TRACKTYPE_PRIMARY); - musicStart(TRACKTYPE_PRIMARY, stageGetPrimaryTrack(g_MusicStageNum), 0, musicGetVolume()); + // The death is complete. Are we due to start a new track? + if (g_MpEnableMusicSwitching && g_Vars.normmplayerisrunning && g_MusicLife60 < g_MusicAge60) { + g_MusicAge60 = 0; + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); + musicQueueStopEvent(TRACKTYPE_PRIMARY); + musicQueueStartEvent(TRACKTYPE_PRIMARY, stageGetPrimaryTrack(g_MusicStageNum), 0, musicGetVolume()); } } - } else if (var80087264 && g_Vars.normmplayerisrunning && var800840f8 < var800840f4) { - var800840f4 = 0; - func0f16d2ac(TRACKTYPE_PRIMARY, 2, 1); - var800840fc = PALDOWN(120); + } else if (g_MpEnableMusicSwitching && g_Vars.normmplayerisrunning && g_MusicLife60 < g_MusicAge60) { + // Due to start a new track. Fade out the old one, + // then start a 2 second time before starting the new one. + g_MusicAge60 = 0; + musicQueueFadeEvent(TRACKTYPE_PRIMARY, 2, 1); + g_MusicSilenceTimer60 = PALDOWN(120); } - if (var80087264 && g_Vars.normmplayerisrunning) { - var800840f4 += g_Vars.diffframe60; + if (g_MpEnableMusicSwitching && g_Vars.normmplayerisrunning) { + g_MusicAge60 += g_Vars.diffframe60; - if (var800840fc > 0) { - var800840fc -= g_Vars.diffframe60; + // If the silence timer is set, it means we're transitioning between + // songs in multiplayer. Tick the timer down, and when it reaches + // zero start a new track. + if (g_MusicSilenceTimer60 > 0) { + g_MusicSilenceTimer60 -= g_Vars.diffframe60; - if (var800840fc <= 0) { - musicEnd(TRACKTYPE_MENU); - musicEnd(TRACKTYPE_DEATH); - musicEnd(TRACKTYPE_PRIMARY); - musicStart(TRACKTYPE_PRIMARY, stageGetPrimaryTrack(g_MusicStageNum), 0, musicGetVolume()); + if (g_MusicSilenceTimer60 <= 0) { + musicQueueStopEvent(TRACKTYPE_MENU); + musicQueueStopEvent(TRACKTYPE_DEATH); + musicQueueStopEvent(TRACKTYPE_PRIMARY); + musicQueueStartEvent(TRACKTYPE_PRIMARY, stageGetPrimaryTrack(g_MusicStageNum), 0, musicGetVolume()); } } } @@ -1212,35 +1218,36 @@ void musicTick(void) #if VERSION >= VERSION_NTSC_1_0 if (g_Vars.lvupdate240 != 0) { - if (g_MusicNrgIsPlaying) { + if (g_MusicNrgIsActive) { if (!playnrg) { - musicStopNrg(); + musicDeactivateNrg(); } } else { if (playnrg && !g_Vars.dontplaynrg) { - musicStartNrg(); + musicActivateNrg(); } } } #else if (g_Vars.lvupdate240 != 0) { - if (func0f16d0a8(TRACKTYPE_X, 1)) { + if (func0f16d0a8(TRACKTYPE_NRG, 1)) { if (!playnrg) { - musicStopNrg(); + musicDeactivateNrg(); } } else { if (playnrg && !g_Vars.dontplaynrg) { - musicStartNrg(); + musicActivateNrg(); } } } #endif - if (g_Vars.lvupdate240 > var8005edf0) { - func0f16e138(); - var8005edf0 = PALDOWN(60); + // Check if the player is in an ambient room every 0.25 seconds + if (g_Vars.lvupdate240 > g_MusicNextAmbientTick240) { + musicTickAmbient(); + g_MusicNextAmbientTick240 = PALDOWN(60); } else { - var8005edf0 -= g_Vars.lvupdate240; + g_MusicNextAmbientTick240 -= g_Vars.lvupdate240; } musicTickEvents(); @@ -1267,7 +1274,7 @@ bool musicAreTracksPlaying(u8 bits) return false; } - if ((bits & 0x02) && !musicIsTrackTypePlaying(TRACKTYPE_X)) { + if ((bits & 0x02) && !musicIsTrackTypePlaying(TRACKTYPE_NRG)) { return false; } diff --git a/src/lib/snd.c b/src/lib/snd.c index 907a1a52b..2d72e24db 100644 --- a/src/lib/snd.c +++ b/src/lib/snd.c @@ -2523,7 +2523,7 @@ glabel snd0000fc48 /* fd40: 0c003f5d */ jal snd0000fd74 /* fd44: 02002025 */ or $a0,$s0,$zero /* fd48: 02002025 */ or $a0,$s0,$zero -/* fd4c: 0c003f67 */ jal snd0000fd9c +/* fd4c: 0c003f67 */ jal sndSetMusicChannelVolume /* fd50: 3045ffff */ andi $a1,$v0,0xffff /* fd54: 0c00e70c */ jal func00039c30 /* fd58: 8e0400f8 */ lw $a0,0xf8($s0) @@ -2654,7 +2654,7 @@ glabel snd0000fc48 /* 10290: 0c0040b1 */ jal snd0000fd74 /* 10294: 02002025 */ or $a0,$s0,$zero /* 10298: 02002025 */ or $a0,$s0,$zero -/* 1029c: 0c0040bb */ jal snd0000fd9c +/* 1029c: 0c0040bb */ jal sndSetMusicChannelVolume /* 102a0: 3045ffff */ andi $a1,$v0,0xffff /* 102a4: 0c00ec00 */ jal func00039c30 /* 102a8: 8e0400f8 */ lw $a0,0xf8($s0) @@ -2683,13 +2683,13 @@ glabel snd0000fd74 /* fd98: 3062ffff */ andi $v0,$v1,0xffff ); -void snd0000fd9c(struct var80094ed8 *arg0, u16 volume) +void sndSetMusicChannelVolume(struct var80094ed8 *arg0, u16 volume) { if (!g_SndDisabled) { u32 tmp = (var8005ecf8[arg0->unk104] * volume); tmp >>= 15; - arg0->unk100 = volume; + arg0->volume = volume; if (tmp > 0x7fff) { tmp = 0x7fff;