summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-07-10 14:15:45 +0200
committerrobojumper <robojumper@gmail.com>2025-09-13 11:07:49 +0200
commit6cc8ca8ebd3f4ea9bea6f8c1dc227aaa131aadba (patch)
treec5eb78f36a0ae82723bb93d4d56b00c3c4be4d60 /src
parenta617b9f8cf8a6c3688f1034b2db641c9a092900c (diff)
A bit more
Diffstat (limited to 'src')
-rw-r--r--src/d/snd/d_snd_3d_manager.cpp2
-rw-r--r--src/d/snd/d_snd_area_sound_effect_mgr.cpp8
-rw-r--r--src/d/snd/d_snd_bgm_mgr.cpp18
-rw-r--r--src/d/snd/d_snd_control_player_mgr.cpp4
-rw-r--r--src/d/snd/d_snd_event_callbacks.cpp2
-rw-r--r--src/d/snd/d_snd_event_demo_callbacks.cpp1
-rw-r--r--src/d/snd/d_snd_mgr.cpp4
-rw-r--r--src/d/snd/d_snd_player_mgr.cpp3
-rw-r--r--src/d/snd/d_snd_small_effect_mgr.cpp7
-rw-r--r--src/d/snd/d_snd_sound_npc_callbacks.cpp3
-rw-r--r--src/d/snd/d_snd_source_mgr.cpp8
-rw-r--r--src/d/snd/d_snd_state_mgr.cpp186
12 files changed, 223 insertions, 23 deletions
diff --git a/src/d/snd/d_snd_3d_manager.cpp b/src/d/snd/d_snd_3d_manager.cpp
index bc204ce8..07a14b51 100644
--- a/src/d/snd/d_snd_3d_manager.cpp
+++ b/src/d/snd/d_snd_3d_manager.cpp
@@ -75,7 +75,7 @@ void dSnd3DManager_c::updateFromCamera(EGG::LookAtCamera &camera) {
}
f32 dist = 0.5f;
- if (fn_80364DA0(ENEMY_SOUND_MGR)) {
+ if (dSndStateMgr_c::GetInstance()->isInEvent()) {
dist = mCamDistance;
f32 prevCameraAtSqVelocity = mCameraAtSqVelocity;
f32 prevCameraPosSqVelocity = mCameraPosSqVelocity;
diff --git a/src/d/snd/d_snd_area_sound_effect_mgr.cpp b/src/d/snd/d_snd_area_sound_effect_mgr.cpp
index c21bdb69..691aa918 100644
--- a/src/d/snd/d_snd_area_sound_effect_mgr.cpp
+++ b/src/d/snd/d_snd_area_sound_effect_mgr.cpp
@@ -50,6 +50,14 @@ bool dSndAreaSoundEffectMgr_c::startSound(u32 soundId, u32 handleIdx) {
return res;
}
+void dSndAreaSoundEffectMgr_c::onEventStart() {
+ // no-op
+}
+
+void dSndAreaSoundEffectMgr_c::onEventEnd() {
+ // no-op
+}
+
void dSndAreaSoundEffectMgr_c::stopSounds(s32 fadeFrames) {
for (u32 i = 0; i < 3; i++) {
mSounds[i].stop(fadeFrames);
diff --git a/src/d/snd/d_snd_bgm_mgr.cpp b/src/d/snd/d_snd_bgm_mgr.cpp
index 04e206b2..1563c995 100644
--- a/src/d/snd/d_snd_bgm_mgr.cpp
+++ b/src/d/snd/d_snd_bgm_mgr.cpp
@@ -35,7 +35,7 @@ dSndBgmMgr_c::dSndBgmMgr_c()
field_0x29C(0),
mSoundActor(dSndMgr_c::GetInstance()->getPlayer()),
field_0x2F4(1.0f),
- field_0x2F8(-1),
+ mBgmToPlayOnEventEnd(-1),
field_0x2FC(0),
field_0x300(-1),
field_0x304(0),
@@ -278,6 +278,22 @@ void dSndBgmMgr_c::setBgmHandleIdxVolume(u32 handleIdx, f32 volume, s32 fadeFram
}
}
+void dSndBgmMgr_c::setBgmToPlayOnEventEnd(u32 soundId) {
+ if (soundId != -1) {
+ prepareBgm(soundId, 0);
+ mBgmToPlayOnEventEnd = soundId;
+ }
+}
+
+bool dSndBgmMgr_c::onEventEnd() {
+ bool ret = false;
+ if (mBgmToPlayOnEventEnd != -1) {
+ ret = playBgm(mBgmToPlayOnEventEnd, 0, false);
+ mBgmToPlayOnEventEnd = -1;
+ }
+ return ret;
+}
+
bool dSndBgmMgr_c::isPlayingBgmSound() const {
for (int i = 0; i < 7; i++) {
if (mBgmSounds[i]->isPlaying()) {
diff --git a/src/d/snd/d_snd_control_player_mgr.cpp b/src/d/snd/d_snd_control_player_mgr.cpp
index 88e45102..5503760a 100644
--- a/src/d/snd/d_snd_control_player_mgr.cpp
+++ b/src/d/snd/d_snd_control_player_mgr.cpp
@@ -5,9 +5,9 @@
#include "d/snd/d_snd_control_player.h"
#include "d/snd/d_snd_mgr.h"
#include "d/snd/d_snd_player_mgr.h"
+#include "d/snd/d_snd_state_mgr.h"
#include "nw4r/snd/snd_SoundHandle.h"
#include "nw4r/ut/ut_list.h"
-#include "toBeSorted/music_mgrs.h"
struct FanfareMuteFlagsApplier {
~FanfareMuteFlagsApplier() {}
@@ -24,7 +24,7 @@ struct FanfareMuteFlagsApplier {
dSndControlPlayerMgr_c::GetInstance()->setBgmVolumeDecreaseSpeed(0.2f);
}
- if (fn_80364DA0(ENEMY_SOUND_MGR)) {
+ if (dSndStateMgr_c::GetInstance()->isInEvent()) {
if (!(userParam & dSndPlayerMgr_c::FANFARE_UNMUTE_STAGE_EFFECTS)) {
dSndControlPlayerMgr_c::GetInstance()->setGroupVolumeFlag(
dSndControlPlayerMgr_c::CTRL_GROUP_STAGE_EFFECTS, dSndControlPlayerMgr_c::MUTE_FULL
diff --git a/src/d/snd/d_snd_event_callbacks.cpp b/src/d/snd/d_snd_event_callbacks.cpp
index ef47659d..9e05cc71 100644
--- a/src/d/snd/d_snd_event_callbacks.cpp
+++ b/src/d/snd/d_snd_event_callbacks.cpp
@@ -5,7 +5,7 @@
void todoInititalizeSndEvent();
void todoExecuteSndEvent();
-void todoFinalizeSndEvent();
+void todoFinalizeSndEvent(bool skipped);
#pragma push
#pragma readonly_strings on
diff --git a/src/d/snd/d_snd_event_demo_callbacks.cpp b/src/d/snd/d_snd_event_demo_callbacks.cpp
index d7e71ae7..8d806c06 100644
--- a/src/d/snd/d_snd_event_demo_callbacks.cpp
+++ b/src/d/snd/d_snd_event_demo_callbacks.cpp
@@ -4,7 +4,6 @@
void todoInititalizeSndEvent();
void todoExecuteSndEvent();
-void todoFinalizeSndEvent();
// clang-format off
diff --git a/src/d/snd/d_snd_mgr.cpp b/src/d/snd/d_snd_mgr.cpp
index 4b8eadb2..bfa6be62 100644
--- a/src/d/snd/d_snd_mgr.cpp
+++ b/src/d/snd/d_snd_mgr.cpp
@@ -3,6 +3,7 @@
#include "d/snd/d_snd_3d_manager.h"
#include "d/snd/d_snd_area_sound_effect_mgr.h"
#include "d/snd/d_snd_bgm_mgr.h"
+#include "d/snd/d_snd_bgm_seq_data_mgr.h"
#include "d/snd/d_snd_control_player_mgr.h"
#include "d/snd/d_snd_distant_sound_actor_pool.h"
#include "d/snd/d_snd_player_mgr.h"
@@ -14,7 +15,6 @@
#include "egg/audio/eggAudioRmtSpeakerMgr.h"
#include "egg/audio/eggAudioUtility.h"
-extern "C" void initSomeUnusedSoundMgr();
extern "C" void fn_8037F940();
extern "C" void fn_80399600();
@@ -27,7 +27,7 @@ dSndMgr_c::dSndMgr_c() : field_0x6CC(0) {
dSndStateMgr_c::create();
dSnd3DManager_c::create();
dSndBgmMgr_c::create();
- initSomeUnusedSoundMgr();
+ dSndBgmSeqDataMgr_c::create();
dSndSmallEffectMgr_c::create();
dSndAreaSoundEffectMgr_c::create();
dSndSourceMgr_c::create();
diff --git a/src/d/snd/d_snd_player_mgr.cpp b/src/d/snd/d_snd_player_mgr.cpp
index 3663b779..741690e1 100644
--- a/src/d/snd/d_snd_player_mgr.cpp
+++ b/src/d/snd/d_snd_player_mgr.cpp
@@ -20,7 +20,6 @@
#include "nw4r/snd/snd_SoundHandle.h"
#include "nw4r/snd/snd_SoundStartable.h"
#include "sized_string.h"
-#include "toBeSorted/music_mgrs.h"
const char *dSndPlayerMgr_c::getSoundArchivePath() {
return "Sound/WZSound.brsar";
@@ -168,7 +167,7 @@ void dSndPlayerMgr_c::enterCaution() {
}
s32 frames = 9;
- if (fn_80364DA0(ENEMY_SOUND_MGR)) {
+ if (dSndStateMgr_c::GetInstance()->isInEvent()) {
frames = 0;
}
diff --git a/src/d/snd/d_snd_small_effect_mgr.cpp b/src/d/snd/d_snd_small_effect_mgr.cpp
index eaf02c1b..41c89b8e 100644
--- a/src/d/snd/d_snd_small_effect_mgr.cpp
+++ b/src/d/snd/d_snd_small_effect_mgr.cpp
@@ -21,7 +21,6 @@
#include "nw4r/snd/snd_SoundStartable.h"
#include "nw4r/snd/snd_global.h"
#include "rvl/OS/OSFastCast.h"
-#include "toBeSorted/music_mgrs.h"
SND_DISPOSER_DEFINE(dSndSmallEffectMgr_c)
@@ -175,8 +174,8 @@ bool dSndSmallEffectMgr_c::playSound(u32 soundId) {
break;
}
case SE_S_SKIP: {
- if (fn_80364DA0(ENEMY_SOUND_MGR)) {
- fn_80365020(ENEMY_SOUND_MGR);
+ if (dSndStateMgr_c::GetInstance()->isInEvent()) {
+ dSndStateMgr_c::GetInstance()->onSkipEvent();
}
break;
}
@@ -349,7 +348,7 @@ bool dSndSmallEffectMgr_c::holdBowChargeSound(f32 remainingChargeAmount) {
}
bool dSndSmallEffectMgr_c::holdFinisherPromptSound(const nw4r::math::VEC3 *position) {
- if (fn_80364DA0(ENEMY_SOUND_MGR)) {
+ if (dSndStateMgr_c::GetInstance()->isInEvent()) {
return false;
}
return dSndDistantSoundActorPool_c::GetInstance()->holdSound(SE_S_FOCUS_FINISHER_LV, position);
diff --git a/src/d/snd/d_snd_sound_npc_callbacks.cpp b/src/d/snd/d_snd_sound_npc_callbacks.cpp
index e809927f..94054d87 100644
--- a/src/d/snd/d_snd_sound_npc_callbacks.cpp
+++ b/src/d/snd/d_snd_sound_npc_callbacks.cpp
@@ -4,11 +4,10 @@
#include "d/snd/d_snd_state_mgr.h"
#include "d/snd/d_snd_wzsound.h"
#include "nw4r/snd/snd_SeqSoundHandle.h"
-#include "toBeSorted/music_mgrs.h"
void dSndSourcePyBird_c::cbPyBirdGlide(dSndSeSound_c *sound, dSoundSource_c *source, nw4r::snd::SoundHandle &handle) {
s32 var = 0;
- if (!fn_80364DA0(dSndStateMgr_c::GetInstance())) {
+ if (!dSndStateMgr_c::GetInstance()->isInEvent()) {
var = static_cast<dSndSourcePyBird_c*>(source)->mSeqVarValue;
}
nw4r::snd::SeqSoundHandle seqHandle(&handle);
diff --git a/src/d/snd/d_snd_source_mgr.cpp b/src/d/snd/d_snd_source_mgr.cpp
index 9a391372..85e196d4 100644
--- a/src/d/snd/d_snd_source_mgr.cpp
+++ b/src/d/snd/d_snd_source_mgr.cpp
@@ -580,6 +580,14 @@ void dSndSourceMgr_c::clearSourceList(nw4r::ut::List *list) {
}
}
+void dSndSourceMgr_c::onEventStart() {
+ // no-op
+}
+
+void dSndSourceMgr_c::onEventEnd() {
+ // no-op
+}
+
s32 dSndSourceMgr_c::getPlayerSourceRoomId() const {
if (mpPlayerSource == nullptr) {
return -1;
diff --git a/src/d/snd/d_snd_state_mgr.cpp b/src/d/snd/d_snd_state_mgr.cpp
index 86100d36..8dd9ff4d 100644
--- a/src/d/snd/d_snd_state_mgr.cpp
+++ b/src/d/snd/d_snd_state_mgr.cpp
@@ -2,13 +2,22 @@
#include "common.h"
#include "d/d_sc_game.h"
+#include "d/snd/d_snd_area_sound_effect_mgr.h"
+#include "d/snd/d_snd_bgm_mgr.h"
+#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_mgr.h"
#include "d/snd/d_snd_player_mgr.h"
+#include "d/snd/d_snd_source_mgr.h"
#include "d/snd/d_snd_stage_data.h"
#include "d/snd/d_snd_util.h"
#include "egg/core/eggHeap.h"
#include "nw4r/snd/snd_FxReverbStdDpl2.h"
+#include "nw4r/snd/snd_SoundPlayer.h"
+#include "nw4r/snd/snd_global.h"
#include "sized_string.h"
+#include "toBeSorted/event_manager.h"
#include <cstring>
@@ -32,9 +41,9 @@ dSndStateMgr_c::dSndStateMgr_c()
field_0x067(0),
field_0x068(-1),
field_0x06C(-1),
- field_0x070(0),
+ mpUnkCallback(nullptr),
field_0x074(0),
- field_0x078(0),
+ mpOnEventStartCallback(nullptr),
field_0x07C(0),
field_0x080(0),
field_0x084(0),
@@ -46,9 +55,8 @@ dSndStateMgr_c::dSndStateMgr_c()
field_0x11C(0),
field_0x120(0),
field_0x124(0),
- field_0x128(-1),
+ mSeLvSoundId(-1),
field_0x22C(0),
- field_0x230(0),
mpSoundEventDef(nullptr),
field_0x238(-1),
field_0x23C(0),
@@ -85,7 +93,7 @@ void dSndStateMgr_c::setup(EGG::Heap *pHeap) {
}
void *mem = pHeap->alloc(max, 4);
mFx.AssignWorkBuffer(mem, max);
- resetStageName();
+ resetEventName();
}
void dSndStateMgr_c::onStageOrLayerUpdate() {
@@ -98,9 +106,9 @@ void dSndStateMgr_c::onStageOrLayerUpdate() {
onFlag0x10(0x2);
field_0x064 = 0;
- if (!streq(field_0x098, dScGame_c::currentSpawnInfo.getStageName())) {
+ if (!streq(mStageName, dScGame_c::currentSpawnInfo.getStageName())) {
needsGroupsReload = true;
- field_0x01C = dScGame_c::currentSpawnInfo.getStageName();
+ mStageName = dScGame_c::currentSpawnInfo.getStageName();
}
if (!needsGroupsReload && dScGame_c::currentSpawnInfo.layer != mLayer) {
@@ -197,6 +205,130 @@ bool dSndStateMgr_c::isSeekerStoneStage(const char *stageName, s32 layer) {
return false;
}
+void dSndStateMgr_c::setEvent(const char *eventName) {
+ if (eventName == nullptr) {
+ return;
+ }
+
+ if (dSndPlayerMgr_c::GetInstance()->checkFlag(dSndPlayerMgr_c::MGR_CAUTION)) {
+ dSndPlayerMgr_c::GetInstance()->leaveCaution();
+ }
+
+ if (field_0x064 == 0) {
+ if (streq(mEventName, "DefaultSkip")) {
+ onSkipEvent();
+ mPrevEventName = mEventName;
+ return;
+ }
+
+ if (!checkFlag0x18(0x20) || !checkFlag0x10(0x04)) {
+ SizedString<64> prevEvent = mEventName;
+ if (isInEvent()) {
+ field_0x23C = 1;
+ finalizeEvent(false);
+ } else {
+ field_0x23C = 0;
+ }
+
+ // TODO - constness or direct access
+ if (checkEventFlag(EVENT_0x04)) {
+ offEventFlag(EVENT_0x04);
+ }
+ mEventName = eventName;
+ mPrevEventName = prevEvent;
+ resetEventVars();
+ field_0x23D = 0;
+ field_0x238 = -1;
+
+ if (streq(mEventName, "STB")) {
+ if (field_0x118 != nullptr) {
+ mEventName = field_0x118;
+ }
+ onEventFlag(EVENT_DEMO);
+ } else {
+ field_0x118 = nullptr;
+ }
+
+ if (!checkFlag0x10(0x04)) {
+ if (mpUnkCallback != nullptr) {
+ mpUnkCallback();
+ }
+ field_0x23D = 1;
+ dSndBgmMgr_c::GetInstance()->setField_0x306(1);
+ dSndBgmMgr_c::GetInstance()->prepareBgm();
+ onEventFlag(EVENT_0x04);
+ onFlag0x10(0x04);
+ dSndControlPlayerMgr_c::GetInstance()->unmuteScenePlayers(30);
+ }
+ bool b2 = checkEventFlag(EVENT_0x800) && dSndBgmMgr_c::GetInstance()->isPlayingBgmSound();
+ if (checkEventFlag(EVENT_0x800) && field_0x064 == 0) {
+ // TODO - constness or direct access
+ offEventFlag(0x800);
+ }
+
+ mSoundEventId = SND_EVENT_0x89;
+ initializeEventCallbacks(mEventName);
+ s32 i3 = 0;
+ SizedString<64> eventLabel;
+ if (mSoundEventId == SND_EVENT_JMAP) {
+ s32 roomId = EventManager::getCurrentEventRoomId();
+ // UB: Cannot pass object of non-POD type 'SizedString<32>' through variadic method
+ eventLabel.sprintf("%s_R%d_JMAP_%d", mStageName, mLayer, roomId);
+ } else if (mSoundEventId == SND_EVENT_JMAPAllMove) {
+ s32 roomId = EventManager::getCurrentEventRoomId();
+ // UB: Cannot pass object of non-POD type 'SizedString<32>' through variadic method
+ eventLabel.sprintf("%s_R%d_JMAPAllMove_%d", mStageName, mLayer, roomId);
+ } else {
+ eventLabel.sprintf("%s", &mEventName);
+ }
+
+ if (checkEventFlag(EVENT_DEMO)) {
+ mBgmName.sprintf("BGM_%s", &eventLabel);
+ mFanName.sprintf("FAN_%s", &eventLabel);
+ mSeName.sprintf("SE_%s", &eventLabel);
+ mCmdName.sprintf("CMD_%s", &eventLabel);
+ } else {
+ mBgmName.sprintf("BGM_EVENT_%s", &eventLabel);
+ mFanName.sprintf("FAN_EVENT_%s", &eventLabel);
+ mSeName.sprintf("SE_EVENT_%s", &eventLabel);
+ mCmdName.sprintf("CMD_EVENT_%s", &eventLabel);
+ }
+
+ if (checkEventFlag(EVENT_0x04)) {
+ field_0x238 = getBgmLabelSoundId();
+ if (b2 && field_0x238 == -1) {
+ field_0x23D = 0;
+ }
+ } else {
+ i3 = playFanOrBgm(getBgmLabelSoundId());
+ if (i3) {
+ field_0x23D = 0;
+ }
+ }
+
+ handleFan();
+ handleSe();
+ handleSeLv();
+ handleCmd();
+
+ if (mSoundEventId != SND_EVENT_0x89) {
+ onEventFlag(EVENT_IN_EVENT);
+ field_0x11C = 0;
+ field_0x120 = 0;
+ field_0x124 = 0;
+ if (mpOnEventStartCallback != nullptr) {
+ (mpOnEventStartCallback)(mSoundEventId, mEventFlags);
+ }
+ if (field_0x238 == -1) {
+ dSndBgmMgr_c::GetInstance()->onEventStart(mEventName, mSoundEventId, i3);
+ }
+ dSndAreaSoundEffectMgr_c::GetInstance()->onEventStart();
+ dSndSourceMgr_c::GetInstance()->onEventStart();
+ }
+ }
+ }
+}
+
bool dSndStateMgr_c::isInStage(const char *stageName) {
return !std::strcmp(dScGame_c::currentSpawnInfo.getStageName(), stageName);
}
@@ -233,6 +365,46 @@ void dSndStateMgr_c::initializeEventCallbacks(const char *name) {
}
}
+void dSndStateMgr_c::handleSeLv() {
+ SizedString<0x40> name = mSeName;
+ name += "_LV";
+ u32 soundId = convertSeLabelToSoundId(name);
+ if (soundId != -1) {
+ mSeLvSoundId = soundId;
+ 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);
+ }
+ }
+ } else {
+ mSeLvSoundId = -1;
+ }
+}
+
+bool dSndStateMgr_c::finalizeEvent(bool skipped) {
+ dSndPlayerMgr_c *mgr = dSndPlayerMgr_c::GetInstance();
+ if (mgr->checkFlag(dSndPlayerMgr_c::MGR_CAUTION)) {
+ mgr->leaveCaution();
+ }
+ if (!isInEvent()) {
+ return false;
+ }
+
+ if (mpSoundEventDef != nullptr && mpSoundEventDef->finalizeCb) {
+ mpSoundEventDef->finalizeCb(skipped);
+ }
+
+ if (!isInDemo()) {
+ nw4r::snd::SoundPlayer *p = dSndControlPlayerMgr_c::GetInstance()->getPlayer1(dSndPlayerMgr_c::PLAYER_EVENT);
+ SoundStopperIfParamFlag20 stopper;
+ p->ForEachSound(stopper, false);
+ }
+ // TODO ...
+
+ return false;
+}
+
const char *dSndStateMgr_c::getStageName(s32 id) {
if (id >= SND_STAGE_MAX) {
return "NULL";