diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 04be5689..767134d4 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1035,7 +1035,7 @@ createSoundSource__9dAcBase_cFv = .text:0x8002C690; // type:function size:0x78 initAllocatorWork1Heap__9dAcBase_cFiPci = .text:0x8002C710; // type:function size:0xC initAllocator__9dAcBase_cFiPcPQ23EGG4Heapi = .text:0x8002C720; // type:function size:0x8C addActorToRoom__9dAcBase_cFl = .text:0x8002C7B0; // type:function size:0x88 -setBit_field_0xE8__9dAcBase_cFl = .text:0x8002C840; // type:function size:0x18 +setTgSndAreaFlag__9dAcBase_cFl = .text:0x8002C840; // type:function size:0x18 actorCreate__9dAcBase_cFv = .text:0x8002C860; // type:function size:0x8 actorPostCreate__9dAcBase_cFv = .text:0x8002C870; // type:function size:0x8 create__9dAcBase_cFv = .text:0x8002C880; // type:function size:0x70 @@ -20058,7 +20058,7 @@ isVolcanicDungeon__14dSndStateMgr_cFUl = .text:0x80361FD0; // type:function size isSeekerStoneStage__14dSndStateMgr_cFPCcl = .text:0x80362020; // type:function size:0x84 isActiveDemoMaybe__14dSndStateMgr_cCFl = .text:0x803620B0; // type:function size:0x5C isSomeSkyloftRoom__14dSndStateMgr_cCFv = .text:0x80362110; // type:function size:0x34 -fn_80362150 = .text:0x80362150; // type:function size:0xB0 +onGotoStage__14dSndStateMgr_cFl = .text:0x80362150; // type:function size:0xB0 fn_80362200 = .text:0x80362200; // type:function size:0xFC fn_80362300 = .text:0x80362300; // type:function size:0x84 fn_80362390 = .text:0x80362390; // type:function size:0x6C @@ -20067,8 +20067,8 @@ fn_80362410 = .text:0x80362410; // type:function size:0xC checkFlag0x18__14dSndStateMgr_cFUl = .text:0x80362420; // type:function size:0x18 isInStage__14dSndStateMgr_cFPCc = .text:0x80362440; // type:function size:0x34 fn_80362480 = .text:0x80362480; // type:function size:0x6C -fn_803624F0 = .text:0x803624F0; // type:function size:0xF4 -fn_803625F0 = .text:0x803625F0; // type:function size:0x140 +onStageLoad__14dSndStateMgr_cFv = .text:0x803624F0; // type:function size:0xF4 +onRestartScene__14dSndStateMgr_cFl = .text:0x803625F0; // type:function size:0x140 loadStageSound__14dSndStateMgr_cFv = .text:0x80362730; // type:function size:0x8 loadStageSound__14dSndStateMgr_cFb = .text:0x80362740; // type:function size:0x59C calc__14dSndStateMgr_cFv = .text:0x80362CE0; // type:function size:0xFC @@ -20137,9 +20137,9 @@ setBgmLpf__14dSndStateMgr_cFv = .text:0x80365970; // type:function size:0x8 setBgmLpf__14dSndStateMgr_cFl = .text:0x80365980; // type:function size:0x54 resetBgmAndStageEffectLpf__14dSndStateMgr_cFv = .text:0x803659E0; // type:function size:0x4C resetBgmLpf__14dSndStateMgr_cFv = .text:0x80365A30; // type:function size:0x48 -fn_80365A80 = .text:0x80365A80; // type:function size:0x4C +calcFxSend3D__14dSndStateMgr_cFv = .text:0x80365A80; // type:function size:0x4C restoreEffects__14dSndStateMgr_cFv = .text:0x80365AD0; // type:function size:0xA8 -fn_80365B80 = .text:0x80365B80; // type:function size:0x5C +setFxSend3DTarget__14dSndStateMgr_cFv = .text:0x80365B80; // type:function size:0x5C getUserParamVolume__14dSndStateMgr_cFUl = .text:0x80365BE0; // type:function size:0x70 fn_80365C50 = .text:0x80365C50; // type:function size:0xC8 loadObjectSound__14dSndStateMgr_cFv = .text:0x80365D20; // type:function size:0x3C @@ -20178,7 +20178,7 @@ fn_80366DE0 = .text:0x80366DE0; // type:function size:0x118 fn_80366F00 = .text:0x80366F00; // type:function size:0x5C fn_80366F60 = .text:0x80366F60; // type:function size:0x30C fn_80367270 = .text:0x80367270; // type:function size:0xC -fn_80367280 = .text:0x80367280; // type:function size:0x18C +setCallbacksForStage__14dSndStateMgr_cFv = .text:0x80367280; // type:function size:0x18C cbUnkNoop__14dSndStateMgr_cFv = .text:0x80367410; // type:function size:0x4 fn_80367420 = .text:0x80367420; // type:function size:0x24 fn_80367450 = .text:0x80367450; // type:function size:0x14 @@ -20463,9 +20463,9 @@ musicForStageRelated = .text:0x8036F3B0; // type:function size:0x9EC fn_8036FDA0 = .text:0x8036FDA0; // type:function size:0x2C fn_8036FDD0 = .text:0x8036FDD0; // type:function size:0x298 fn_80370070 = .text:0x80370070; // type:function size:0xC8 -fn_80370140 = .text:0x80370140; // type:function size:0x8 +setOverrideBgmId__12dSndBgmMgr_cFUl = .text:0x80370140; // type:function size:0x8 fn_80370150 = .text:0x80370150; // type:function size:0x20 -fn_80370170 = .text:0x80370170; // type:function size:0x1C +activateOverrideBgmId__12dSndBgmMgr_cFv = .text:0x80370170; // type:function size:0x1C fn_80370190 = .text:0x80370190; // type:function size:0x180 fn_80370310 = .text:0x80370310; // type:function size:0x8 fn_80370320 = .text:0x80370320; // type:function size:0xF4 @@ -20502,8 +20502,8 @@ setBgmToPlayOnEventEnd__12dSndBgmMgr_cFUl = .text:0x803713D0; // type:function s onEventEnd__12dSndBgmMgr_cFv = .text:0x80371420; // type:function size:0x58 fn_80371480 = .text:0x80371480; // type:function size:0x7C fn_80371500 = .text:0x80371500; // type:function size:0x60 -fn_80371560 = .text:0x80371560; // type:function size:0x84 -fn_803715F0 = .text:0x803715F0; // type:function size:0x84 +onTgSndAreaFlagsChange__12dSndBgmMgr_cFUlUl = .text:0x80371560; // type:function size:0x84 +onTgSndAreaMgFlagsChange__12dSndBgmMgr_cFUlUl = .text:0x803715F0; // type:function size:0x84 fn_80371680 = .text:0x80371680; // type:function size:0xB0 fn_80371730 = .text:0x80371730; // type:function size:0x84 fn_803717C0 = .text:0x803717C0; // type:function size:0x160 @@ -20889,7 +20889,7 @@ __dt__20dSndHarpSongEntry2_cFv = .text:0x8037FBD0; // type:function size:0x58 setup__17dSndHarpSongMgr_cFv = .text:0x8037FC30; // type:function size:0x4 setupState0__17dSndHarpSongMgr_cFv = .text:0x8037FC40; // type:function size:0xA8 fn_8037FCF0 = .text:0x8037FCF0; // type:function size:0x6C -putHarpAway = .text:0x8037FD60; // type:function size:0x74 +deactivate__17dSndHarpSongMgr_cFv = .text:0x8037FD60; // type:function size:0x74 fn_8037FDE0 = .text:0x8037FDE0; // type:function size:0x58 calc__17dSndHarpSongMgr_cFv = .text:0x8037FE40; // type:function size:0x220 fn_80380060 = .text:0x80380060; // type:function size:0x130 diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 1905389a..17175279 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -78,7 +78,7 @@ public: /* 0xCC */ mVec3_c mScale; /* 0xD8 */ u32 actor_properties; /* 0xDC */ dAcRef_c actor_node; - /* 0xE8 */ u32 field_0xe8; + /* 0xE8 */ u32 mTgSndAreaFlags; /* 0xEC */ s8 roomid; /* 0xED */ u8 actor_subtype; /* 0xEE */ u8 polyAttr0; @@ -177,7 +177,7 @@ public: /* 8002c710 */ int initAllocatorWork1Heap(int size, char *name, int align); /* 8002c720 */ int initAllocator(int size, char *name, EGG::Heap *heap, int align); /* 8002c7b0 */ bool addActorToRoom(s32 roomId); - /* 8002c840 */ void setBit_field_0xE8(s32); + /* 8002c840 */ void setTgSndAreaFlag(s32); /* 8002cf10 */ u32 itemDroppingAndGivingRelated(mVec3_c *spawnPos, int subtype); /* 8002cf90 */ void fillUpperParams2Byte(); /* 8002cfa0 */ u32 getParams2_ignoreLower(); diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 2672af43..786eabd6 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -93,6 +93,10 @@ public: return LINK; } + static dAcPy_c *GetLinkM() { + return LINK; + } + static dAcPy_c *GetLink2() { return LINK2; } diff --git a/include/d/snd/d_snd_3d_actor.h b/include/d/snd/d_snd_3d_actor.h index 2228f7d5..bdbfd365 100644 --- a/include/d/snd/d_snd_3d_actor.h +++ b/include/d/snd/d_snd_3d_actor.h @@ -128,7 +128,7 @@ protected: /* 0xCC */ u16 mFlags; /* 0xD0 */ nw4r::math::VEC3 mPositionRelativeToPlayer; /* 0xDC */ f32 mDistanceToPlayer; - /* 0xE0 */ f32 a_field_0xE0; + /* 0xE0 */ f32 mFxSend3D; }; #endif diff --git a/include/d/snd/d_snd_bgm_mgr.h b/include/d/snd/d_snd_bgm_mgr.h index 688e7065..cce578fc 100644 --- a/include/d/snd/d_snd_bgm_mgr.h +++ b/include/d/snd/d_snd_bgm_mgr.h @@ -46,6 +46,12 @@ public: bool onEventFinalize(const char *eventName, u32 soundEventId, bool skipped); void prepareBgm(); + void setOverrideBgmId(u32 id); + void activateOverrideBgmId(); + + void onTgSndAreaMgFlagsChange(u32 newFlags, u32 oldFlags); + void onTgSndAreaFlagsChange(u32 newFlags, u32 oldFlags); + dSndBgmSound_c *getSoundHandleForBgm(u32 soundId, u32 startOffset); bool isPlayingBgmSound() const; bool isPlayingBgmSoundId(u32 soundId) const; diff --git a/include/d/snd/d_snd_harp_song_mgr.h b/include/d/snd/d_snd_harp_song_mgr.h index 67868858..934ffe0f 100644 --- a/include/d/snd/d_snd_harp_song_mgr.h +++ b/include/d/snd/d_snd_harp_song_mgr.h @@ -19,6 +19,9 @@ public: void calc(); + void activate(); + void deactivate(); + nw4r::snd::SoundHandle &getFiSingHandle() { return mFiSingHandle; } diff --git a/include/d/snd/d_snd_state_mgr.h b/include/d/snd/d_snd_state_mgr.h index cdb32434..cc8109d2 100644 --- a/include/d/snd/d_snd_state_mgr.h +++ b/include/d/snd/d_snd_state_mgr.h @@ -17,6 +17,7 @@ public: public: typedef void (*OnEventStartCallback)(s32 soundEventId, u32 flags); + typedef void (*OnFlagsChangeCallback)(u32 newFlags, u32 oldFlags); enum StageFlags_e { STAGE_FIELD = 0x1, @@ -77,12 +78,10 @@ public: return mFrameCounter; } - f32 getField_0x49C() const { - return field_0x49C; + f32 getFxSend3D() const { + return mFxSend3D; } - - void resetEventName() { mEventName = "EVENT_NONE"; } @@ -173,6 +172,8 @@ public: void onStageOrLayerUpdate(); void onStageLoad(); + void onRestartScene(s32 fadeFrames); + void onGotoStage(s32 fadeFrames); void loadStageSound(); void loadObjectSound(); @@ -227,6 +228,8 @@ private: void setRoomId(s32 roomId); void calcTgSnd(); void calcFilters(); + void calcFxSend3D(); + void setFxSend3DTarget(); u32 getBgmLabelSoundId(); void doLabelSuffix(const char *suffix); @@ -250,7 +253,7 @@ private: u32 getCmdCameraId(); u32 getCmdMsgWaitId(); u32 getCmdFrameCountId(); - + void calcSe(); bool calcBgm(); void calcCmd(); @@ -306,16 +309,16 @@ private: /* 0x060 */ UNKWORD field_0x060; /* 0x064 */ u8 field_0x064; /* 0x065 */ bool field_0x065; - /* 0x066 */ u8 field_0x066; - /* 0x067 */ u8 field_0x067; - /* 0x068 */ UNKWORD field_0x068; - /* 0x06C */ UNKWORD field_0x06C; + /* 0x066 */ bool mHasChangedTgSndAreaFlags; + /* 0x067 */ bool mHasChangedTgSndAreaMgFlags; + /* 0x068 */ u32 mSavedTgSndAreaFlags; + /* 0x06C */ u32 mSavedTgSndAreaMgFlags; /* 0x070 */ void (*mpUnkCallback)(); /* 0x074 */ UNKWORD field_0x074; /* 0x078 */ OnEventStartCallback mpOnEventStartCallback; /* 0x07C */ UNKWORD field_0x07C; - /* 0x080 */ UNKWORD field_0x080; - /* 0x084 */ UNKWORD field_0x084; + /* 0x080 */ OnFlagsChangeCallback mpTgSndAreaFlagsChangeCallback; + /* 0x084 */ OnFlagsChangeCallback mpTgSndAreaMgFlagsChangeCallback; /* 0x088 */ UNKWORD field_0x088; /* 0x08C */ s32 mSoundEventId; /* 0x090 */ s32 mCameraCutCounter; @@ -346,11 +349,11 @@ private: /* 0x258 */ u32 field_0x258; /* 0x25C */ nw4r::snd::FxReverbStdDpl2 mFx; /* 0x48C */ UNKWORD field_0x48C; - /* 0x490 */ f32 field_0x490; - /* 0x494 */ f32 field_0x494; - /* 0x498 */ f32 field_0x498; - /* 0x49C */ f32 field_0x49C; - /* 0x4A0 */ f32 field_0x4A0; + /* 0x490 */ f32 mFxSend3DDefault; + /* 0x494 */ f32 mFxSend3DOverride; + /* 0x498 */ f32 mFxSend3DNext; + /* 0x49C */ f32 mFxSend3D; + /* 0x4A0 */ f32 mFxSend3DTarget; /* 0x4A4 */ u32 field_0x4A4; /* 0x4A8 */ u8 field_0x4A8; /* 0x4A9 */ bool mNeedsGroupsReload; diff --git a/include/d/t/d_t_sound_area_mgr.h b/include/d/t/d_t_sound_area_mgr.h index d7b64106..ae191056 100644 --- a/include/d/t/d_t_sound_area_mgr.h +++ b/include/d/t/d_t_sound_area_mgr.h @@ -16,8 +16,12 @@ public: virtual int doDelete() override; virtual int create() override; - void setBgmFlag(int flag) { - mBgmFlags |= 1 << flag; + void setSndFlag(int flag) { + mSndFlags |= 1 << flag; + } + + u32 getSndFlags() const { + return mSndFlags; } static dTgSndMg_c *GetInstance() { @@ -26,7 +30,8 @@ public: private: static dTgSndMg_c *sInstance; - u32 mBgmFlags; + + /* 0xFC */ u32 mSndFlags; }; #endif diff --git a/include/toBeSorted/music_mgrs.h b/include/toBeSorted/music_mgrs.h index 34c40a68..c0d9be19 100644 --- a/include/toBeSorted/music_mgrs.h +++ b/include/toBeSorted/music_mgrs.h @@ -3,9 +3,6 @@ #include "common.h" #include "d/snd/d_snd_player_mgr.h" -#include "d/snd/d_snd_state_mgr.h" - -class dSndSound_c; // A lot of these names are and were guesses that are probably wrong in a lot of ways. @@ -16,8 +13,4 @@ extern "C" void fn_8035E820(dSndPlayerMgr_c *); extern "C" void fn_8035E880(dSndPlayerMgr_c *); extern "C" void fn_8035E310(dSndPlayerMgr_c *); -#define ENEMY_SOUND_MGR (dSndStateMgr_c::GetInstance()) -extern "C" void fn_80362150(dSndStateMgr_c *, u16); -extern "C" void fn_803625F0(dSndStateMgr_c *, u16); - #endif diff --git a/src/REL/d/t/d_t_sound_area.cpp b/src/REL/d/t/d_t_sound_area.cpp index 869a62dc..b1f7552f 100644 --- a/src/REL/d/t/d_t_sound_area.cpp +++ b/src/REL/d/t/d_t_sound_area.cpp @@ -36,7 +36,7 @@ int dTgSndAr_c::create() { } dAcBase_c *ac = static_cast(base); if (!ac->isActorPlayer() && checkPosInArea(ac->position)) { - ac->setBit_field_0xE8(params & 0xFF); + ac->setTgSndAreaFlag(params & 0xFF); } } return SUCCEEDED; @@ -49,12 +49,12 @@ int dTgSndAr_c::doDelete() { int dTgSndAr_c::actorExecute() { dAcBase_c *link = dAcPy_c::LINK; if (link != nullptr && checkPosInArea(link->position)) { - link->setBit_field_0xE8(params & 0xFF); + link->setTgSndAreaFlag(params & 0xFF); } if (dSnd3DManager_c::GetInstance() != nullptr) { mVec3_c pos(dSnd3DManager_c::GetInstance()->getCameraTargetPos()); if (checkPosInArea(pos) && dTgSndMg_c::GetInstance() != nullptr) { - dTgSndMg_c::GetInstance()->setBgmFlag(params & 0xFF); + dTgSndMg_c::GetInstance()->setSndFlag(params & 0xFF); } } return SUCCEEDED; diff --git a/src/REL/d/t/d_t_sound_area_mgr.cpp b/src/REL/d/t/d_t_sound_area_mgr.cpp index 0d9dd1d1..c17a843c 100644 --- a/src/REL/d/t/d_t_sound_area_mgr.cpp +++ b/src/REL/d/t/d_t_sound_area_mgr.cpp @@ -18,9 +18,9 @@ int dTgSndMg_c::doDelete() { int dTgSndMg_c::actorExecute() { if (dAcPy_c::LINK != nullptr) { - dAcPy_c::LINK->field_0xe8 = 0; + dAcPy_c::LINK->mTgSndAreaFlags = 0; } - mBgmFlags = 0; + mSndFlags = 0; return SUCCEEDED; } diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 1aea297b..1aa515d4 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -151,8 +151,8 @@ bool dAcBase_c::addActorToRoom(s32 roomId) { return false; } -void dAcBase_c::setBit_field_0xE8(s32 shift) { - field_0xe8 |= (1 << shift); +void dAcBase_c::setTgSndAreaFlag(s32 shift) { + mTgSndAreaFlags |= (1 << shift); } int dAcBase_c::actorCreate() { diff --git a/src/d/d_sc_game.cpp b/src/d/d_sc_game.cpp index 9d85e44f..7d4f449c 100644 --- a/src/d/d_sc_game.cpp +++ b/src/d/d_sc_game.cpp @@ -6,6 +6,7 @@ #include "d/d_gfx.h" #include "d/d_stage_mgr.h" #include "d/flag/storyflag_manager.h" +#include "d/snd/d_snd_state_mgr.h" #include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m_fader_base.h" @@ -16,7 +17,6 @@ #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/minigame_mgr.h" -#include "toBeSorted/music_mgrs.h" #include "toBeSorted/unk_save_time.h" #include @@ -166,7 +166,7 @@ void dScGame_c::executeState_Action() { } } else if (mReloadTrigger != fProfile::PROFILE_MAX) { mFader.fadeOut(); - fn_80362150(ENEMY_SOUND_MGR, mFader.getFadeOutFrame()); + dSndStateMgr_c::GetInstance()->onGotoStage(mFader.getFadeOutFrame()); } } diff --git a/src/d/d_sc_title.cpp b/src/d/d_sc_title.cpp index aad53c91..653e3c22 100644 --- a/src/d/d_sc_title.cpp +++ b/src/d/d_sc_title.cpp @@ -9,6 +9,7 @@ #include "d/d_reset.h" #include "d/d_sc_game.h" #include "d/d_sys.h" +#include "d/snd/d_snd_state_mgr.h" #include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m_color.h" @@ -162,7 +163,7 @@ void dScTitle_c::loadTitleScreen(u32 params) { } else { actuallyTriggerEntrance("F000", 0, 28, 48, 0, 0, dFader_c::FADER_BLACK, 15, -1); } - fn_80362150(ENEMY_SOUND_MGR, 30); + dSndStateMgr_c::GetInstance()->onGotoStage(30); } void dScTitle_c::setSomethingSkbRelated() { diff --git a/src/d/d_stage_mgr.cpp b/src/d/d_stage_mgr.cpp index e461ab37..c3f7f005 100644 --- a/src/d/d_stage_mgr.cpp +++ b/src/d/d_stage_mgr.cpp @@ -17,7 +17,6 @@ #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/d_particle.h" -#include "toBeSorted/music_mgrs.h" SPECIAL_BASE_PROFILE(STAGE_MANAGER, dStageMgr_c, fProfile::STAGE_MANAGER, 0X5, 1536); @@ -280,7 +279,7 @@ void dStageMgr_c::finalizeState_RestartSceneWait() {} void dStageMgr_c::initializeState_RestartScene() { triggerFade(dScGame_c::nextSpawnInfo.transitionType, dScGame_c::nextSpawnInfo.transitionFadeFrames); mFader.setFadeInType(dScGame_c::nextSpawnInfo.transitionType); - fn_803625F0(ENEMY_SOUND_MGR, mFader.getFadeOutFrame()); + dSndStateMgr_c::GetInstance()->onRestartScene(mFader.getFadeOutFrame()); } void dStageMgr_c::executeState_RestartScene() { diff --git a/src/d/snd/d_snd_3d_actor.cpp b/src/d/snd/d_snd_3d_actor.cpp index 4732c5ba..913afbd7 100644 --- a/src/d/snd/d_snd_3d_actor.cpp +++ b/src/d/snd/d_snd_3d_actor.cpp @@ -30,7 +30,7 @@ dSnd3DActor_c::dSnd3DActor_c(dSndSourceParam *pSourceParam, s32 sourceType) mpSourceParam(pSourceParam), mFlags(0), mDistanceToPlayer(INFINITY), - a_field_0xE0(0.0f) { + mFxSend3D(0.0f) { resetCachedRelativePositions(); // Portability hazard SetUserParam(reinterpret_cast(this)); @@ -41,7 +41,7 @@ dSnd3DActor_c::dSnd3DActor_c(dSndSourceParam *pSourceParam, s32 sourceType) void dSnd3DActor_c::setPosition(const nw4r::math::VEC3 &rPosition) { SetPosition(rPosition); - a_field_0xE0 = dSndStateMgr_c::GetInstance()->getField_0x49C(); + mFxSend3D = dSndStateMgr_c::GetInstance()->getFxSend3D(); mFlags = 0; } diff --git a/src/d/snd/d_snd_distant_sound_actor.cpp b/src/d/snd/d_snd_distant_sound_actor.cpp index 88c2a9ca..0dad5ccc 100644 --- a/src/d/snd/d_snd_distant_sound_actor.cpp +++ b/src/d/snd/d_snd_distant_sound_actor.cpp @@ -109,7 +109,7 @@ void dSndDistantSoundActor_c::setPause(bool flag, int fadeFrames) { } void dSndDistantSoundActor_c::updateSome3DField() { - a_field_0xE0 = dSndStateMgr_c::GetInstance()->getField_0x49C(); + mFxSend3D = dSndStateMgr_c::GetInstance()->getFxSend3D(); } UNKWORD dSndDistantSoundActor_c::d_vt_0x3C() { diff --git a/src/d/snd/d_snd_state_mgr.cpp b/src/d/snd/d_snd_state_mgr.cpp index c2dceeea..6342cab2 100644 --- a/src/d/snd/d_snd_state_mgr.cpp +++ b/src/d/snd/d_snd_state_mgr.cpp @@ -9,6 +9,7 @@ #include "d/snd/d_snd_checkers.h" #include "d/snd/d_snd_control_player_mgr.h" #include "d/snd/d_snd_event.h" +#include "d/snd/d_snd_harp_song_mgr.h" #include "d/snd/d_snd_mgr.h" #include "d/snd/d_snd_player_mgr.h" #include "d/snd/d_snd_small_effect_mgr.h" @@ -16,6 +17,7 @@ #include "d/snd/d_snd_stage_data.h" #include "d/snd/d_snd_util.h" #include "d/snd/d_snd_wzsound.h" +#include "d/t/d_t_sound_area_mgr.h" #include "egg/core/eggHeap.h" #include "nw4r/snd/snd_FxReverbStdDpl2.h" #include "nw4r/snd/snd_SeqSoundHandle.h" @@ -42,16 +44,16 @@ dSndStateMgr_c::dSndStateMgr_c() field_0x060(0), field_0x064(0), field_0x065(false), - field_0x066(0), - field_0x067(0), - field_0x068(-1), - field_0x06C(-1), + mHasChangedTgSndAreaFlags(false), + mHasChangedTgSndAreaMgFlags(false), + mSavedTgSndAreaFlags(-1), + mSavedTgSndAreaMgFlags(-1), mpUnkCallback(nullptr), field_0x074(0), mpOnEventStartCallback(nullptr), field_0x07C(0), - field_0x080(0), - field_0x084(0), + mpTgSndAreaFlagsChangeCallback(nullptr), + mpTgSndAreaMgFlagsChangeCallback(nullptr), field_0x088(0), mSoundEventId(SND_EVENT_0x89), mCameraCutCounter(0), @@ -74,11 +76,11 @@ dSndStateMgr_c::dSndStateMgr_c() field_0x254(0), field_0x258(0), field_0x48C(0), - field_0x490(0.02f), - field_0x494(-1.0f), - field_0x498(-1.0f), - field_0x49C(0.02f), - field_0x4A0(0.02f), + mFxSend3DDefault(0.02f), + mFxSend3DOverride(-1.0f), + mFxSend3DNext(-1.0f), + mFxSend3D(0.02f), + mFxSend3DTarget(0.02f), field_0x4A4(-1), field_0x4A8(0), mNeedsGroupsReload(false) {} @@ -228,6 +230,38 @@ bool dSndStateMgr_c::isSomeSkyloftRoom() const { } } +void dSndStateMgr_c::onRestartScene(s32 fadeFrames) { + if (field_0x064) { + return; + } + + s32 nextLayer = dScGame_c::nextSpawnInfo.layer; + // This combines next stage with current layer, so this effectively checks if you're leaving the Hint Movie scene + if (isSeekerStoneStage(mStageName, dScGame_c::currentSpawnInfo.layer)) { + dSndBgmMgr_c::GetInstance()->stopAllBgm(fadeFrames); + } else if (mLayer != nextLayer) { + if (isSeekerStoneStage(mStageName, nextLayer)) { + dSndBgmMgr_c::GetInstance()->stopAllBgm(fadeFrames); + dSndBgmMgr_c::GetInstance()->prepareBgm(BGM_HINT_SELECT, 0); + dSndBgmMgr_c::GetInstance()->setOverrideBgmId(BGM_HINT_SELECT); + dSndBgmMgr_c::GetInstance()->activateOverrideBgmId(); + dSndAreaSoundEffectMgr_c::GetInstance()->stopSounds(fadeFrames); + } else { + onGotoStage(fadeFrames); + onFlag0x10(0x01); + return; + } + } + + dSndSmallEffectMgr_c::GetInstance()->stopAllSoundExceptEvent(fadeFrames); + dSndBgmMgr_c::GetInstance()->prepareBgm(); + dSndHarpSongMgr_c::GetInstance()->deactivate(); + onFlag0x10(0x01); + dSndBgmMgr_c::GetInstance()->setField_0x306(1); + offFlag0x10(0x4); + offFlag0x10(0x10); +} + void dSndStateMgr_c::loadStageSound() { loadStageSound(false); } @@ -405,7 +439,7 @@ void dSndStateMgr_c::loadStageSound(bool force) { f32 volume = -1.0f; dSndAreaSoundEffectMgr_c::GetInstance()->loadStageSound(&volume); if (volume > 0.0f) { - field_0x490 = volume; + mFxSend3DDefault = volume; } } @@ -700,7 +734,7 @@ void dSndStateMgr_c::handleSeLv() { if (dSndMgr_c::GetInstance()->holdSound(&mSeLvSoundHandle, soundId)) { u32 id = dSndPlayerMgr_c::GetInstance()->getDemoArchive()->GetSoundUserParam(soundId); if ((dSndPlayerMgr_c::sEventMuteFlagsMask & id & 0x2000000) == 0) { - mSeLvSoundHandle.SetFxSend(nw4r::snd::AUX_A, field_0x49C); + mSeLvSoundHandle.SetFxSend(nw4r::snd::AUX_A, mFxSend3D); } } } else { @@ -849,7 +883,35 @@ void dSndStateMgr_c::setRoomId(s32 roomId) { } void dSndStateMgr_c::calcTgSnd() { - // ... + mHasChangedTgSndAreaFlags = false; + mHasChangedTgSndAreaMgFlags = false; + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link != nullptr && dTgSndMg_c::GetInstance() != nullptr) { + u32 flags = dTgSndMg_c::GetInstance()->getSndFlags(); + if (flags != mSavedTgSndAreaMgFlags) { + mHasChangedTgSndAreaMgFlags = true; + if (mpTgSndAreaMgFlagsChangeCallback != nullptr) { + (mpTgSndAreaMgFlagsChangeCallback)(flags, mSavedTgSndAreaMgFlags); + } + dSndBgmMgr_c::GetInstance()->onTgSndAreaMgFlagsChange(flags, mSavedTgSndAreaMgFlags); + mSavedTgSndAreaMgFlags = flags; + } + + if (dSndSourceMgr_c::getBoomerangSource() != nullptr) { + flags = mSavedTgSndAreaMgFlags; + } else { + flags = link->mTgSndAreaFlags; + } + if (flags != mSavedTgSndAreaFlags) { + mHasChangedTgSndAreaFlags = true; + if (mpTgSndAreaFlagsChangeCallback != nullptr) { + (mpTgSndAreaFlagsChangeCallback)(flags, mSavedTgSndAreaFlags); + } + mFxSend3DNext = getUserParamVolume(flags); + dSndBgmMgr_c::GetInstance()->onTgSndAreaFlagsChange(flags, mSavedTgSndAreaFlags); + mSavedTgSndAreaFlags = flags; + } + } } void dSndStateMgr_c::calcFilters() { @@ -975,6 +1037,37 @@ void dSndStateMgr_c::resetBgmLpf() { } } +void dSndStateMgr_c::calcFxSend3D() { + if (mFxSend3D > mFxSend3DTarget) { + mFxSend3D -= 0.02f; + if (mFxSend3D < mFxSend3DTarget) { + mFxSend3D = mFxSend3DTarget; + } + } else if (mFxSend3D < mFxSend3DTarget) { + mFxSend3D += 0.02f; + if (mFxSend3D > mFxSend3DTarget) { + mFxSend3D = mFxSend3DTarget; + } + } +} + +void dSndStateMgr_c::setFxSend3DTarget() { + // TODO - weird control flow + f32 target = mFxSend3DDefault; + if (mFxSend3DNext > 0.0f) { + target = mFxSend3DNext; + } else if (mFxSend3DOverride > 0.0f) { + target = mFxSend3DOverride; + } + + if (target < 0.02f) { + target = 0.02f; + } else if (target > 0.3f) { + target = 0.3f; + } + mFxSend3DTarget = target; +} + f32 dSndStateMgr_c::getUserParamVolume(u32 userParam) { s32 bit = 31; for (int i = 0; i < 4; i++) {