diff --git a/include/functions.h b/include/functions.h index 91f0173a54..e465d9a32c 100644 --- a/include/functions.h +++ b/include/functions.h @@ -2060,8 +2060,8 @@ void func_800F5BF0(u8 arg0); void Audio_PlayFanfare(u16); void func_800F5C2C(void); void func_800F5E18(u8 playerIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4); -void func_800F5E90(u8); -void func_800F6114(f32 dist); +void Audio_SetSequenceMode(u8 seqMode); +void Audio_SetBgmEnemyVolume(f32 dist); void func_800F6268(f32 dist, u16); void func_800F64E0(u8 arg0); void func_800F6584(u8 arg0); diff --git a/include/sequence.h b/include/sequence.h index 2b6cc46664..c29fb200ee 100644 --- a/include/sequence.h +++ b/include/sequence.h @@ -7,17 +7,17 @@ #define NA_BGM_NATURE_AMBIENCE 0x1 // Environmental nature background sounds #define NA_BGM_FIELD_LOGIC 0x2 // Hyrule Field #define NA_BGM_FIELD_INIT 0x3 // Hyrule Field Initial Segment From Loading Area -#define NA_BGM_FIELD_MOVE_1 0x4 // Hyrule Field Moving Segment 1 -#define NA_BGM_FIELD_MOVE_2 0x5 // Hyrule Field Moving Segment 2 -#define NA_BGM_FIELD_MOVE_3 0x6 // Hyrule Field Moving Segment 3 -#define NA_BGM_FIELD_MOVE_4 0x7 // Hyrule Field Moving Segment 4 -#define NA_BGM_FIELD_MOVE_5 0x8 // Hyrule Field Moving Segment 5 -#define NA_BGM_FIELD_MOVE_6 0x9 // Hyrule Field Moving Segment 6 -#define NA_BGM_FIELD_MOVE_7 0x0A // Hyrule Field Moving Segment 7 -#define NA_BGM_FIELD_MOVE_8 0x0B // Hyrule Field Moving Segment 8 -#define NA_BGM_FIELD_MOVE_9 0x0C // Hyrule Field Moving Segment 9 -#define NA_BGM_FIELD_MOVE_A 0x0D // Hyrule Field Moving Segment 10 -#define NA_BGM_FIELD_MOVE_B 0x0E // Hyrule Field Moving Segment 11 +#define NA_BGM_FIELD_DEFAULT_1 0x4 // Hyrule Field Moving Segment 1 +#define NA_BGM_FIELD_DEFAULT_2 0x5 // Hyrule Field Moving Segment 2 +#define NA_BGM_FIELD_DEFAULT_3 0x6 // Hyrule Field Moving Segment 3 +#define NA_BGM_FIELD_DEFAULT_4 0x7 // Hyrule Field Moving Segment 4 +#define NA_BGM_FIELD_DEFAULT_5 0x8 // Hyrule Field Moving Segment 5 +#define NA_BGM_FIELD_DEFAULT_6 0x9 // Hyrule Field Moving Segment 6 +#define NA_BGM_FIELD_DEFAULT_7 0x0A // Hyrule Field Moving Segment 7 +#define NA_BGM_FIELD_DEFAULT_8 0x0B // Hyrule Field Moving Segment 8 +#define NA_BGM_FIELD_DEFAULT_9 0x0C // Hyrule Field Moving Segment 9 +#define NA_BGM_FIELD_DEFAULT_A 0x0D // Hyrule Field Moving Segment 10 +#define NA_BGM_FIELD_DEFAULT_B 0x0E // Hyrule Field Moving Segment 11 #define NA_BGM_FIELD_ENEMY_INIT 0x0F // Hyrule Field Enemy Approaches #define NA_BGM_FIELD_ENEMY_1 0x10 // Hyrule Field Enemy Near Segment 1 #define NA_BGM_FIELD_ENEMY_2 0x11 // Hyrule Field Enemy Near Segment 2 @@ -95,7 +95,7 @@ #define NA_BGM_DOOR_OF_TIME 0x59 // Open Door of Temple of Time "NA_BGM_GATE_OPEN" #define NA_BGM_OWL 0x5A // Kaepora Gaebora's Theme #define NA_BGM_SHADOW_TEMPLE 0x5B // Shadow Temple "NA_BGM_DARKNESS_DUNGEON" -#define NA_BGM_WATAER_TEMPLE 0x5C // Water Temple "NA_BGM_AQUA_DUNGEON" +#define NA_BGM_WATER_TEMPLE 0x5C // Water Temple "NA_BGM_AQUA_DUNGEON" #define NA_BGM_BRIDGE_TO_GANONS 0x5D // Ganon's Castle Bridge "NA_BGM_BRIDGE" #define NA_BGM_OCARINA_OF_TIME 0x5E // Ocarina of Time "NA_BGM_SARIA" #define NA_BGM_GERUDO_VALLEY 0x5F // Gerudo Valley "NA_BGM_GERUDO" @@ -124,4 +124,11 @@ typedef enum { /* 3 */ SEQ_PLAYER_BGM_SUB } SequencePlayerId; +typedef enum { + /* 0 */ SEQ_MODE_DEFAULT, + /* 1 */ SEQ_MODE_ENEMY, + /* 2 */ SEQ_MODE_STILL, // Not moving or first-person view + /* 3 */ SEQ_MODE_IGNORE +} SequenceMode; + #endif diff --git a/include/z64.h b/include/z64.h index fbe0112531..8536429326 100644 --- a/include/z64.h +++ b/include/z64.h @@ -216,7 +216,7 @@ typedef struct { /* 0x4D */ char unk_4D[0x03]; /* 0x50 */ TargetContextEntry arr_50[3]; /* 0x8C */ Actor* unk_8C; - /* 0x90 */ Actor* unk_90; + /* 0x90 */ Actor* bgmEnemy; // The nearest enemy to player with the right flags that will trigger NA_BGM_ENEMY /* 0x94 */ Actor* unk_94; } TargetContext; // size = 0x98 diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c index b1af38f950..64a1419da2 100644 --- a/src/code/code_800EC960.c +++ b/src/code/code_800EC960.c @@ -121,27 +121,134 @@ s8 sAudioCutsceneFlag = 0; s8 sSpecReverb = 0; s8 sAudioEnvReverb = 0; s8 sAudioCodeReverb = 0; -u8 D_8013061C = 0; +u8 sPrevSeqMode = 0; f32 sAudioEnemyDist = 0.0f; s8 sAudioEnemyVol = 127; u16 D_80130628 = NA_BGM_DISABLED; u8 D_8013062C = 0; u8 D_80130630 = NA_BGM_GENERAL_SFX; -u32 D_80130634 = 0; -u32 D_80130638 = 0; +u32 sNumFramesStill = 0; +u32 sNumFramesMoving = 0; u8 sAudioBaseFilter = 0; u8 sAudioExtraFilter = 0; u8 sAudioBaseFilter2 = 0; u8 sAudioExtraFilter2 = 0; Vec3f* sSariaBgmPtr = NULL; f32 D_80130650 = 2000.0f; -u8 D_80130654 = 0; -u8 D_80130658[0x70] = { - 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 16, 0, 136, - 1, 0, 0, 32, 0, 0, 2, 4, 2, 2, 1, 16, 0, 0, 1, 2, 1, 0, 128, 0, 128, 0, 2, 2, 2, 2, 2, 2, - 136, 2, 0, 2, 17, 2, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 32, 0, 16, 2, 0, 0, - 4, 32, 64, 64, 1, 2, 2, 1, 1, 2, 0, 17, 0, 0, 128, 0, 128, 128, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, +u8 sSeqModeInput = 0; +u8 sSeqFlags[0x6E] = { + 0x2, // NA_BGM_GENERAL_SFX + 0x1, // NA_BGM_NATURE_BACKGROUND + 0, // NA_BGM_FIELD_LOGIC + 0, // NA_BGM_FIELD_INIT + 0, // NA_BGM_FIELD_DEFAULT_1 + 0, // NA_BGM_FIELD_DEFAULT_2 + 0, // NA_BGM_FIELD_DEFAULT_3 + 0, // NA_BGM_FIELD_DEFAULT_4 + 0, // NA_BGM_FIELD_DEFAULT_5 + 0, // NA_BGM_FIELD_DEFAULT_6 + 0, // NA_BGM_FIELD_DEFAULT_7 + 0, // NA_BGM_FIELD_DEFAULT_8 + 0, // NA_BGM_FIELD_DEFAULT_9 + 0, // NA_BGM_FIELD_DEFAULT_A + 0, // NA_BGM_FIELD_DEFAULT_B + 0, // NA_BGM_FIELD_ENEMY_INIT + 0, // NA_BGM_FIELD_ENEMY_1 + 0, // NA_BGM_FIELD_ENEMY_2 + 0, // NA_BGM_FIELD_ENEMY_3 + 0, // NA_BGM_FIELD_ENEMY_4 + 0, // NA_BGM_FIELD_STILL_1 + 0, // NA_BGM_FIELD_STILL_2 + 0, // NA_BGM_FIELD_STILL_3 + 0, // NA_BGM_FIELD_STILL_4 + 0x21, // NA_BGM_DUNGEON + 0x10, // NA_BGM_KAKARIKO_ADULT + 0, // NA_BGM_ENEMY + 0x88, // NA_BGM_BOSS + 0x1, // NA_BGM_INSIDE_DEKU_TREE + 0, // NA_BGM_MARKET + 0, // NA_BGM_TITLE + 0x20, // NA_BGM_LINK_HOUSE + 0, // NA_BGM_GAME_OVER + 0, // NA_BGM_BOSS_CLEAR + 0x2, // NA_BGM_ITEM_GET + 0x4, // NA_BGM_OPENING_GANON + 0x2, // NA_BGM_HEART_GET + 0x2, // NA_BGM_OCA_LIGHT + 0x1, // NA_BGM_JABU_JABU + 0x10, // NA_BGM_KAKARIKO_KID + 0, // NA_BGM_GREAT_FAIRY + 0, // NA_BGM_ZELDA_THEME + 0x1, // NA_BGM_FIRE_TEMPLE + 0x2, // NA_BGM_OPEN_TRE_BOX + 0x1, // NA_BGM_FOREST_TEMPLE + 0, // NA_BGM_COURTYARD + 0x80, // NA_BGM_GANON_TOWER + 0, // NA_BGM_LONLON + 0x80, // NA_BGM_GORON_CITY + 0, // NA_BGM_FIELD_MORNING + 0x2, // NA_BGM_SPIRITUAL_STONE + 0x2, // NA_BGM_OCA_BOLERO + 0x2, // NA_BGM_OCA_MINUET + 0x2, // NA_BGM_OCA_SERENADE + 0x2, // NA_BGM_OCA_REQUIEM + 0x2, // NA_BGM_OCA_NOCTURNE + 0x88, // NA_BGM_MINI_BOSS + 0x2, // NA_BGM_SMALL_ITEM_GET + 0, // NA_BGM_TEMPLE_OF_TIME + 0x2, // NA_BGM_EVENT_CLEAR + 0x11, // NA_BGM_KOKIRI + 0x2, // NA_BGM_OCA_FAIRY_GET + 0x1, // NA_BGM_SARIA_THEME + 0x1, // NA_BGM_SPIRIT_TEMPLE + 0, // NA_BGM_HORSE + 0, // NA_BGM_HORSE_GOAL + 0, // NA_BGM_INGO + 0x2, // NA_BGM_MEDALLION_GET + 0x2, // NA_BGM_OCA_SARIA + 0x2, // NA_BGM_OCA_EPONA + 0x2, // NA_BGM_OCA_ZELDA + 0x2, // NA_BGM_OCA_SUNS + 0x2, // NA_BGM_OCA_TIME + 0x2, // NA_BGM_OCA_STORM + 0, // NA_BGM_NAVI_OPENING + 0, // NA_BGM_DEKU_TREE_CS + 0, // NA_BGM_WINDMILL + 0, // NA_BGM_HYRULE_CS + 0x20, // NA_BGM_MINI_GAME + 0, // NA_BGM_SHEIK + 0x10, // NA_BGM_ZORA_DOMAIN + 0x2, // NA_BGM_APPEAR + 0, // NA_BGM_ADULT_LINK + 0, // NA_BGM_MASTER_SWORD + 0x4, // NA_BGM_INTRO_GANON + 0x20, // NA_BGM_SHOP + 0x40, // NA_BGM_CHAMBER_OF_SAGES + 0x40, // NA_BGM_FILE_SELECT + 0x1, // NA_BGM_ICE_CAVERN + 0x2, // NA_BGM_DOOR_OF_TIME + 0x2, // NA_BGM_OWL + 0x1, // NA_BGM_SHADOW_TEMPLE + 0x1, // NA_BGM_WATER_TEMPLE + 0x2, // NA_BGM_BRIDGE_TO_GANONS + 0, // NA_BGM_OCARINA_OF_TIME + 0x11, // NA_BGM_GERUDO_VALLEY + 0, // NA_BGM_POTION_SHOP + 0, // NA_BGM_KOTAKE_KOUME + 0x80, // NA_BGM_ESCAPE + 0, // NA_BGM_UNDERGROUND + 0x80, // NA_BGM_GANON_BATTLE_1 + 0x80, // NA_BGM_GANON_BATTLE_2 + 0, // NA_BGM_END_DEMO + 0, // NA_BGM_STAFF_1 + 0, // NA_BGM_STAFF_2 + 0, // NA_BGM_STAFF_3 + 0, // NA_BGM_STAFF_4 + 0, // NA_BGM_FIRE_BOSS + 0x8, // NA_BGM_MINI_GAME_2 + 0, // NA_BGM_VARIOUS_SFX }; + s8 sSpecReverbs[20] = { 0, 0, 0, 0, 0, 0, 0, 40, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; D_801306DC_s D_801306DC[20] = { @@ -1480,7 +1587,7 @@ f32 D_80131C8C = 0.0f; // === Audio Debugging === -// These variables come between in-function statics in func_800EE824 and func_800F510C +// These variables come between in-function statics in func_800EE824 and Audio_SplitBgmChannels f32 sAudioUpdateDuration = 0.0f; f32 sAudioUpdateDurationMax = 0.0f; @@ -2213,8 +2320,8 @@ void AudioDebug_Draw(GfxPrint* printer) { GfxPrint_Printf(printer, "SOUND GAME FRAME MAX %f", sAudioUpdateDurationMax); GfxPrint_SetPos(printer, 3, 9); - GfxPrint_Printf(printer, "SWITCH BGM MODE %d %d %d (FLAG %d)", D_8013061C, D_80130634, D_80130638, - D_80130654); + GfxPrint_Printf(printer, "SWITCH BGM MODE %d %d %d (FLAG %d)", sPrevSeqMode, sNumFramesStill, + sNumFramesMoving, sSeqModeInput); GfxPrint_SetPos(printer, 3, 10); GfxPrint_Printf(printer, "ENEMY DIST %f VOL %3d", sAudioEnemyDist, sAudioEnemyVol); @@ -2639,7 +2746,7 @@ void AudioDebug_ProcessInput_BlkChgBgm(void) { if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) { sAudioBlkChgBgmWork[sAudioBlkChgBgmSel]--; if (sAudioBlkChgBgmSel == 1) { - func_800F5E90(sAudioBlkChgBgmWork[1]); + Audio_SetSequenceMode(sAudioBlkChgBgmWork[1]); ; // might be a fake match? } } @@ -2647,7 +2754,7 @@ void AudioDebug_ProcessInput_BlkChgBgm(void) { if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) { sAudioBlkChgBgmWork[sAudioBlkChgBgmSel]++; if (sAudioBlkChgBgmSel == 1) { - func_800F5E90(sAudioBlkChgBgmWork[1]); + Audio_SetSequenceMode(sAudioBlkChgBgmWork[1]); } } @@ -3248,7 +3355,7 @@ void Audio_ResetSfxChannelState(void) { } sSfxChannelState[SFX_PLAYER_CHANNEL_OCARINA].unk_0C = 0; - D_8013061C = 0; + sPrevSeqMode = 0; sAudioCodeReverb = 0; } @@ -3609,39 +3716,48 @@ void Audio_ClearSariaBgmAtPos(Vec3f* pos) { } } -void func_800F510C(s8 volSplit) { - u8 vol; - u8 prio; +/** + * Turns on and off channels from both bgm players in a way that splits + * equally between the two bgm channels. Split based on note priority + */ +void Audio_SplitBgmChannels(s8 volSplit) { + u8 volume; + u8 notePriority; u16 channelBits; - u8 players[2] = { SEQ_PLAYER_BGM_MAIN, SEQ_PLAYER_BGM_SUB }; + u8 bgmPlayers[2] = { SEQ_PLAYER_BGM_MAIN, SEQ_PLAYER_BGM_SUB }; + u8 channelIdx; u8 i; - u8 j; if ((func_800FA0B4(SEQ_PLAYER_FANFARE) == NA_BGM_DISABLED) && (func_800FA0B4(SEQ_PLAYER_BGM_SUB) != NA_BGM_LONLON)) { - for (i = 0; i < 2; i++) { + for (i = 0; i < ARRAY_COUNT(bgmPlayers); i++) { if (i == 0) { - vol = volSplit; + // Main Bgm SeqPlayer + volume = volSplit; } else { - vol = 0x7F - volSplit; + // Sub Bgm SeqPlayer + volume = 0x7F - volSplit; } - if (vol > 100) { - prio = 11; - } else if (vol < 20) { - prio = 2; + if (volume > 100) { + notePriority = 11; + } else if (volume < 20) { + notePriority = 2; } else { - prio = ((vol - 20) / 10) + 2; + notePriority = ((volume - 20) / 10) + 2; } channelBits = 0; - for (j = 0; j < 0x10; j++) { - if (gAudioContext.seqPlayers[players[i]].channels[j]->notePriority < prio) { - channelBits += (1 << j); + for (channelIdx = 0; channelIdx < 16; channelIdx++) { + if (notePriority > gAudioContext.seqPlayers[bgmPlayers[i]].channels[channelIdx]->notePriority) { + // If the note currently playing in the channel is a high enough priority, + // then keep the channel on by setting a channelBit + // If this condition fails, then the channel will be shut off + channelBits += (1 << channelIdx); } } - Audio_SeqCmdA(players[i], channelBits); + Audio_SeqCmdA(bgmPlayers[i], channelBits); } } } @@ -3685,7 +3801,7 @@ void Audio_PlaySariaBgm(Vec3f* pos, u16 seqId, u16 distMax) { } if (seqId != NA_BGM_GREAT_FAIRY) { - func_800F510C(vol); + Audio_SplitBgmChannels(vol); } Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, vol, 0); @@ -3711,7 +3827,7 @@ void func_800F5550(u16 seqId) { Audio_QueueCmdS32(0xF8000000, 0); } - if ((D_80130658[D_80130630] & 0x20) && D_80130658[(seqId & 0xFF) & 0xFF] & 0x10) { + if ((sSeqFlags[D_80130630] & 0x20) && sSeqFlags[(seqId & 0xFF) & 0xFF] & 0x10) { if ((D_8013062C & 0x3F) != 0) { sp27 = 0x1E; @@ -3721,9 +3837,9 @@ void func_800F5550(u16 seqId) { D_8013062C = 0; } else { - nv = (D_80130658[(seqId & 0xFF) & 0xFF] & 0x40) ? 1 : 0xFF; + nv = (sSeqFlags[(seqId & 0xFF) & 0xFF] & 0x40) ? 1 : 0xFF; func_800F5E18(SEQ_PLAYER_BGM_MAIN, seqId, 0, 7, nv); - if (!(D_80130658[seqId] & 0x20)) { + if (!(sSeqFlags[seqId] & 0x20)) { D_8013062C = 0xC0; } } @@ -3737,7 +3853,7 @@ void func_800F56A8(void) { temp_v0 = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); bvar = temp_v0 & 0xFF; - if ((temp_v0 != NA_BGM_DISABLED) && ((D_80130658[bvar] & 0x10) != 0)) { + if ((temp_v0 != NA_BGM_DISABLED) && (sSeqFlags[bvar] & 0x10)) { if (D_8013062C != 0xC0) { D_8013062C = gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[3]; } else { @@ -3770,9 +3886,9 @@ void func_800F5918(void) { void func_800F595C(u16 arg0) { u8 arg0b = arg0 & 0xFF; - if (D_80130658[arg0b] & 2) { + if (sSeqFlags[arg0b] & 2) { Audio_PlayFanfare(arg0); - } else if (D_80130658[arg0b] & 4) { + } else if (sSeqFlags[arg0b] & 4) { Audio_StartSeq(SEQ_PLAYER_FANFARE, 0, arg0); } else { @@ -3784,9 +3900,9 @@ void func_800F595C(u16 arg0) { void func_800F59E8(u16 arg0) { u8 arg0b = arg0 & 0xFF; - if (D_80130658[arg0b] & 2) { + if (sSeqFlags[arg0b] & 2) { Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0); - } else if (D_80130658[arg0b] & 4) { + } else if (sSeqFlags[arg0b] & 4) { Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0); } else { Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, 0); @@ -3796,9 +3912,9 @@ void func_800F59E8(u16 arg0) { s32 func_800F5A58(u8 arg0) { u8 phi_a1 = 0; - if (D_80130658[arg0 & 0xFF] & 2) { + if (sSeqFlags[arg0 & 0xFF] & 2) { phi_a1 = 1; - } else if (D_80130658[arg0 & 0xFF] & 4) { + } else if (sSeqFlags[arg0 & 0xFF] & 4) { phi_a1 = 1; } @@ -3814,7 +3930,7 @@ void func_800F5ACC(u16 seqId) { temp_v0 = func_800FA0B4(SEQ_PLAYER_BGM_MAIN); if ((temp_v0 & 0xFF) != NA_BGM_GANON_TOWER && (temp_v0 & 0xFF) != NA_BGM_ESCAPE && temp_v0 != seqId) { - func_800F5E90(3); + Audio_SetSequenceMode(SEQ_MODE_IGNORE); if (temp_v0 != NA_BGM_DISABLED) { D_80130628 = temp_v0; } else { @@ -3826,7 +3942,7 @@ void func_800F5ACC(u16 seqId) { void func_800F5B58(void) { if ((func_800FA0B4(SEQ_PLAYER_BGM_MAIN) != NA_BGM_DISABLED) && (D_80130628 != NA_BGM_DISABLED) && - (D_80130658[func_800FA0B4(SEQ_PLAYER_BGM_MAIN) & 0xFF] & 8)) { + (sSeqFlags[func_800FA0B4(SEQ_PLAYER_BGM_MAIN) & 0xFF] & 8)) { if (D_80130628 == NA_BGM_DISABLED) { Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, 0); } else { @@ -3908,77 +4024,83 @@ void func_800F5E18(u8 playerIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4) { Audio_StartSeq(playerIdx, fadeTimer, seqId); } -void func_800F5E90(u8 arg0) { - s32 phi_t0; - u16 phi_t1; - u8 phi_a3; +void Audio_SetSequenceMode(u8 seqMode) { + s32 volumeFadeInTimer; + u16 seqId; + u8 volumeFadeOutTimer; - D_80130654 = arg0; + sSeqModeInput = seqMode; if (D_80130628 == NA_BGM_DISABLED) { if (sAudioCutsceneFlag) { - arg0 = 3; - } - phi_t1 = D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254; - if (phi_t1 == NA_BGM_FIELD_LOGIC && func_800FA0B4(SEQ_PLAYER_BGM_SUB) == (NA_BGM_ENEMY | 0x800)) { - arg0 = 3; + seqMode = SEQ_MODE_IGNORE; } - phi_a3 = phi_t1 & 0xFF; - if ((phi_t1 == NA_BGM_DISABLED) || ((D_80130658[phi_a3] & 1) != 0) || ((D_8013061C & 0x7F) == 1)) { - if (arg0 != (D_8013061C & 0x7F)) { - if (arg0 == 1) { + seqId = D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254; + + if (seqId == NA_BGM_FIELD_LOGIC && func_800FA0B4(SEQ_PLAYER_BGM_SUB) == (NA_BGM_ENEMY | 0x800)) { + seqMode = SEQ_MODE_IGNORE; + } + + if ((seqId == NA_BGM_DISABLED) || (sSeqFlags[(u8)(seqId & 0xFF)] & 1) || + ((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY)) { + if (seqMode != (sPrevSeqMode & 0x7F)) { + if (seqMode == SEQ_MODE_ENEMY) { + // Start playing enemy bgm if (D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol < 0) { - phi_t0 = -(D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol); + volumeFadeInTimer = -(D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol); } else { - phi_t0 = D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol; + volumeFadeInTimer = D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol; } - Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, sAudioEnemyVol, phi_t0); - Audio_StartSeq(SEQ_PLAYER_BGM_SUB, 10, NA_BGM_ENEMY | 0x800); - if (phi_t1 != NA_BGM_NATURE_AMBIENCE) { - Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, (0x7F - sAudioEnemyVol) & 0xFF, 0xA); - func_800F510C(sAudioEnemyVol); - } - } else { - if ((D_8013061C & 0x7F) == 1) { - Audio_SeqCmd1(SEQ_PLAYER_BGM_SUB, 10); - if (arg0 == 3) { - phi_a3 = 0; - } else { - phi_a3 = 10; - } - Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, 0x7F, phi_a3); - func_800F510C(0); + Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, sAudioEnemyVol, volumeFadeInTimer); + Audio_StartSeq(SEQ_PLAYER_BGM_SUB, 10, NA_BGM_ENEMY | 0x800); + + if (seqId != NA_BGM_NATURE_AMBIENCE) { + Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, (0x7F - sAudioEnemyVol) & 0xFF, 0xA); + Audio_SplitBgmChannels(sAudioEnemyVol); } + } else if ((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY) { + // Stop playing enemy bgm + Audio_SeqCmd1(SEQ_PLAYER_BGM_SUB, 10); + if (seqMode == SEQ_MODE_IGNORE) { + volumeFadeOutTimer = 0; + } else { + volumeFadeOutTimer = 10; + } + + Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, 0x7F, volumeFadeOutTimer); + Audio_SplitBgmChannels(0); } - D_8013061C = arg0 + 0x80; + sPrevSeqMode = seqMode + 0x80; } } else { - if (arg0 == 0) { - if (D_8013061C == 2) { - D_80130638 = 0; + // Hyrule Field will play slightly different bgm music depending on whether player is standing + // still or moving. This is the logic to determine the transition between those two states + if (seqMode == SEQ_MODE_DEFAULT) { + if (sPrevSeqMode == SEQ_MODE_STILL) { + sNumFramesMoving = 0; } - D_80130634 = 0; - D_80130638++; + sNumFramesStill = 0; + sNumFramesMoving++; } else { - D_80130634++; + sNumFramesStill++; } - if (arg0 == 2 && D_80130634 < 0x1E && D_80130638 >= 0x15) { - arg0 = 0; + if (seqMode == SEQ_MODE_STILL && sNumFramesStill < 30 && sNumFramesMoving > 20) { + seqMode = SEQ_MODE_DEFAULT; } - D_8013061C = arg0; - Audio_SeqCmd7(SEQ_PLAYER_BGM_MAIN, 2, arg0); + sPrevSeqMode = seqMode; + Audio_SeqCmd7(SEQ_PLAYER_BGM_MAIN, 2, seqMode); } } } -void func_800F6114(f32 dist) { +void Audio_SetBgmEnemyVolume(f32 dist) { f32 adjDist; - if (D_8013061C == 0x81) { + if (sPrevSeqMode == (0x80 | SEQ_MODE_ENEMY)) { if (dist != sAudioEnemyDist) { if (dist < 150.0f) { adjDist = 0.0f; @@ -3989,13 +4111,13 @@ void func_800F6114(f32 dist) { } sAudioEnemyVol = ((350.0f - adjDist) * 127.0f) / 350.0f; - Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, sAudioEnemyVol, 0xA); + Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, sAudioEnemyVol, 10); if (D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 != NA_BGM_NATURE_AMBIENCE) { - Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, (0x7F - sAudioEnemyVol), 0xA); + Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, (0x7F - sAudioEnemyVol), 10); } } if (D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 != NA_BGM_NATURE_AMBIENCE) { - func_800F510C(sAudioEnemyVol); + Audio_SplitBgmChannels(sAudioEnemyVol); } } sAudioEnemyDist = dist; @@ -4241,7 +4363,7 @@ void Audio_PreNMI(void) { } void func_800F6C34(void) { - D_8013061C = 0; + sPrevSeqMode = 0; D_8016B7A8 = 1.0f; D_8016B7B0 = 1.0f; sAudioBaseFilter = 0; @@ -4336,7 +4458,7 @@ void func_800F6FB4(u8 arg0) { u8 b2; if ((D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 == NA_BGM_DISABLED) || - ((D_80130658[((u8)D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254) & 0xFF] & 0x80) == 0)) { + !(sSeqFlags[((u8)D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254) & 0xFF] & 0x80)) { func_800F6E7C(D_801306DC[arg0].unk_00, D_801306DC[arg0].unk_02); while ((D_801306DC[arg0].unk_04[i] != 0xFF) && (i < 100)) { // Probably a fake match, using Audio_SeqCmd8 doesn't work. diff --git a/src/code/code_800F9280.c b/src/code/code_800F9280.c index e6dd4b67d2..36857b0def 100644 --- a/src/code/code_800F9280.c +++ b/src/code/code_800F9280.c @@ -391,14 +391,14 @@ void func_800FA174(u8 playerIdx) { D_8016E348[playerIdx] = 0; } -void func_800FA18C(u8 playeridx, u8 arg1) { +void func_800FA18C(u8 playerIdx, u8 arg1) { u8 i; - for (i = 0; i < D_8016E750[playeridx].unk_4D; i++) { - u8 unkb = (D_8016E750[playeridx].unk_2C[i] & 0xF00000) >> 20; + for (i = 0; i < D_8016E750[playerIdx].unk_4D; i++) { + u8 unkb = (D_8016E750[playerIdx].unk_2C[i] & 0xF00000) >> 20; if (unkb == arg1) { - D_8016E750[playeridx].unk_2C[i] = 0xFF000000; + D_8016E750[playerIdx].unk_2C[i] = 0xFF000000; } } } diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 0318e51f05..5d5f86f1a4 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -286,7 +286,7 @@ void func_8002C0C0(TargetContext* targetCtx, Actor* actor, GlobalContext* global targetCtx->targetedActor = NULL; targetCtx->unk_40 = 0.0f; targetCtx->unk_8C = NULL; - targetCtx->unk_90 = NULL; + targetCtx->bgmEnemy = NULL; targetCtx->unk_4B = 0; targetCtx->unk_4C = 0; func_8002BF60(targetCtx, actor, actor->category, globalCtx); @@ -2836,8 +2836,8 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, GlobalContext* globalC actorCtx->targetCtx.unk_8C = NULL; } - if (actor == actorCtx->targetCtx.unk_90) { - actorCtx->targetCtx.unk_90 = NULL; + if (actor == actorCtx->targetCtx.bgmEnemy) { + actorCtx->targetCtx.bgmEnemy = NULL; } Audio_StopSfxByPos(&actor->projectedPos); @@ -2873,7 +2873,7 @@ s32 func_80032880(GlobalContext* globalCtx, Actor* actor) { Actor* D_8015BBE8; Actor* D_8015BBEC; f32 D_8015BBF0; -f32 D_8015BBF4; +f32 sbgmEnemyDistSq; s32 D_8015BBF8; s16 D_8015BBFC; @@ -2890,10 +2890,13 @@ void func_800328D4(GlobalContext* globalCtx, ActorContext* actorCtx, Player* pla while (actor != NULL) { if ((actor->update != NULL) && ((Player*)actor != player) && ((actor->flags & 1) == 1)) { + + // This block below is for determining the closest actor to player in determining the volume + // used while playing enemy bgm music if ((actorCategory == ACTORCAT_ENEMY) && ((actor->flags & 5) == 5) && - (actor->xyzDistToPlayerSq < 250000.0f) && (actor->xyzDistToPlayerSq < D_8015BBF4)) { - actorCtx->targetCtx.unk_90 = actor; - D_8015BBF4 = actor->xyzDistToPlayerSq; + (actor->xyzDistToPlayerSq < SQ(500.0f)) && (actor->xyzDistToPlayerSq < sbgmEnemyDistSq)) { + actorCtx->targetCtx.bgmEnemy = actor; + sbgmEnemyDistSq = actor->xyzDistToPlayerSq; } if (actor != sp84) { @@ -2929,13 +2932,13 @@ Actor* func_80032AF0(GlobalContext* globalCtx, ActorContext* actorCtx, Actor** a u8* entry; D_8015BBE8 = D_8015BBEC = NULL; - D_8015BBF0 = D_8015BBF4 = FLT_MAX; + D_8015BBF0 = sbgmEnemyDistSq = FLT_MAX; D_8015BBF8 = 0x7FFFFFFF; if (!Player_InCsMode(globalCtx)) { entry = &D_801160A0[0]; - actorCtx->targetCtx.unk_90 = NULL; + actorCtx->targetCtx.bgmEnemy = NULL; D_8015BBFC = player->actor.shape.rot.y; for (i = 0; i < 3; i++) { diff --git a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c index 3b3981477b..01d43594ea 100644 --- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c +++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.c @@ -129,7 +129,7 @@ static u16 sBgmList[] = { NA_BGM_DOOR_OF_TIME, NA_BGM_OWL, NA_BGM_SHADOW_TEMPLE, - NA_BGM_WATAER_TEMPLE, + NA_BGM_WATER_TEMPLE, NA_BGM_BRIDGE_TO_GANONS, NA_BGM_VARIOUS_SFX, NA_BGM_OCARINA_OF_TIME, diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 60097a3be5..6a896557d2 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -9626,14 +9626,14 @@ void func_80847BA0(GlobalContext* globalCtx, Player* this) { } } -void func_808486A8(GlobalContext* globalCtx, Player* this) { - u8 sp27; +void Player_UpdateCamAndSeqModes(GlobalContext* globalCtx, Player* this) { + u8 seqMode; s32 pad; Actor* unk_664; s32 camMode; if (this->actor.category == ACTORCAT_PLAYER) { - sp27 = 0; + seqMode = SEQ_MODE_DEFAULT; if (this->csMode != 0) { Camera_ChangeMode(Gameplay_GetCamera(globalCtx, 0), CAM_MODE_NORMAL); @@ -9691,22 +9691,24 @@ void func_808486A8(GlobalContext* globalCtx, Player* this) { camMode = CAM_MODE_NORMAL; if ((this->linearVelocity == 0.0f) && (!(this->stateFlags1 & 0x800000) || (this->rideActor->speedXZ == 0.0f))) { - sp27 = 2; + // not moving + seqMode = SEQ_MODE_STILL; } } Camera_ChangeMode(Gameplay_GetCamera(globalCtx, 0), camMode); } else { - sp27 = 2; + // First person mode + seqMode = SEQ_MODE_STILL; } - if (globalCtx->actorCtx.targetCtx.unk_90 != NULL) { - sp27 = 1; - func_800F6114(sqrtf(globalCtx->actorCtx.targetCtx.unk_90->xyzDistToPlayerSq)); + if (globalCtx->actorCtx.targetCtx.bgmEnemy != NULL) { + seqMode = SEQ_MODE_ENEMY; + Audio_SetBgmEnemyVolume(sqrtf(globalCtx->actorCtx.targetCtx.bgmEnemy->xyzDistToPlayerSq)); } if (globalCtx->sceneNum != SCENE_TURIBORI) { - func_800F5E90(sp27); + Audio_SetSequenceMode(seqMode); } } } @@ -10155,7 +10157,7 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) { this->func_674(this, globalCtx); } - func_808486A8(globalCtx, this); + Player_UpdateCamAndSeqModes(globalCtx, this); if (this->skelAnime.moveFlags & 8) { AnimationContext_SetMoveActor(globalCtx, &this->actor, &this->skelAnime,