More and cleanup

This commit is contained in:
robojumper
2025-07-19 14:35:33 +02:00
parent 55e15b59e9
commit 90ab45d3dd
14 changed files with 432 additions and 77 deletions
+8 -10
View File
@@ -9,13 +9,14 @@
#include "d/d_stage_parse.h"
#include "d/d_sys.h"
#include "d/flag/flag_managers.h"
#include "egg/core/eggHeap.h"
#include "d/snd/d_snd_state_mgr.h"
#include "f/f_base.h"
#include "f/f_profile_name.h"
#include "m/m_dvd.h"
#include "toBeSorted/arc_managers/current_stage_arc_manager.h"
#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);
@@ -56,7 +57,7 @@ void dStageMgr_c::finalizeState_ReadStageRes() {
parseStageBzs(-1, stageBzs);
parseRoomStageBzs(-1, stageBzs);
}
fn_803618F0(ENEMY_SOUND_MGR);
dSndStateMgr_c::GetInstance()->onStageOrLayerUpdate();
}
void dStageMgr_c::initializeState_ReadRoomRes() {}
@@ -147,27 +148,24 @@ void dStageMgr_c::executeState_ReadLayerObjectRes() {
}
}
extern "C" void fn_800C85D0(void *, EGG::Heap *heap, bool, void *jpc, void *jpn);
extern "C" void *FOR_LOADED_PARTICLES;
void dStageMgr_c::finalizeState_ReadLayerObjectRes() {
if (mDemoName.len() != 0) {
const char *name = mDemoName;
void *jpc = OarcManager::GetInstance()->getSubEntryData(name, "dat/jparticle.jpc");
if (jpc != nullptr) {
void *jpn = OarcManager::GetInstance()->getSubEntryData(name, "dat/jparticle.jpn");
fn_800C85D0(FOR_LOADED_PARTICLES, dHeap::work2Heap.heap, true, jpc, jpn);
void *jpn = OarcManager::GetInstance()->getData(name, "dat/jparticle.jpn");
dParticle::mgr_c::GetInstance()->createResource(dHeap::work2Heap.heap, true, jpc, jpn);
}
}
}
static void *soundCallback(void *arg) {
fn_80362730(ENEMY_SOUND_MGR);
dSndStateMgr_c::GetInstance()->loadStageSound();
return reinterpret_cast<void *>(true);
}
void dStageMgr_c::initializeState_SoundLoadSceneData() {
fn_803624F0(ENEMY_SOUND_MGR);
dSndStateMgr_c::GetInstance()->onStageLoad();
mpDvdCallback = mDvd_callback_c::createOrDie(soundCallback, nullptr);
}
@@ -195,7 +193,7 @@ void dStageMgr_c::executeState_CreateObject() {
void dStageMgr_c::finalizeState_CreateObject() {}
static void *soundCallback2(void *arg) {
fn_80365D20(ENEMY_SOUND_MGR);
dSndStateMgr_c::GetInstance()->loadObjectSound();
return reinterpret_cast<void *>(true);
}
-1
View File
@@ -8,7 +8,6 @@
#include "nw4r/math/math_arithmetic.h"
#include "nw4r/math/math_types.h"
#include "nw4r/snd/snd_SoundArchive.h"
#include "toBeSorted/music_mgrs.h"
SND_DISPOSER_DEFINE(dSnd3DManager_c);
-2
View File
@@ -16,8 +16,6 @@
#include "nw4r/snd/snd_SoundStartable.h"
#include "nw4r/snd/snd_StrmSoundHandle.h"
#include "nw4r/snd/snd_WaveSoundHandle.h"
#include "toBeSorted/music_mgrs.h"
dSndBgmSoundHarpMgr_c *dSndBgmSound_c::spGlobalHarpMgr;
+1 -1
View File
@@ -366,7 +366,7 @@ bool dSndPlayerMgr_c::loadDemoArchive(const char *demoArchiveName) {
return ok;
}
void dSndPlayerMgr_c::shutdown() {
void dSndPlayerMgr_c::shutdownDemo() {
mDemoSoundArchivePlayer.Shutdown();
mDemoSoundArchive.Shutdown();
}
-1
View File
@@ -8,7 +8,6 @@
#include "nw4r/snd/snd_SoundArchive.h"
#include "nw4r/snd/snd_SoundStartable.h"
#include "nw4r/ut/ut_list.h"
#include "toBeSorted/music_mgrs.h"
dSndSound_c::dSndSound_c()
: mPrevStartOffset(0), mIsPreparing(false), mPauseFlag(false), mIsRunning(false), mIsFadingOut(false) {
+324 -11
View File
@@ -36,7 +36,7 @@ dSndStateMgr_c::dSndStateMgr_c()
field_0x03C(0),
mStageId(0xAC),
mPreviousStageId(0xAC),
field_0x054(0),
mStageTypeFlags(0),
mLayer(0),
mRoomId(-1),
field_0x060(0),
@@ -81,7 +81,7 @@ dSndStateMgr_c::dSndStateMgr_c()
field_0x4A0(0.02f),
field_0x4A4(-1),
field_0x4A8(0),
needsGroupsReload(false) {}
mNeedsGroupsReload(false) {}
extern "C" void fn_803665B0(nw4r::snd::detail::FxReverbStdParam &, int);
@@ -112,12 +112,12 @@ void dSndStateMgr_c::onStageOrLayerUpdate() {
field_0x064 = 0;
if (!streq(mStageName, dScGame_c::currentSpawnInfo.getStageName())) {
needsGroupsReload = true;
mNeedsGroupsReload = true;
mStageName = dScGame_c::currentSpawnInfo.getStageName();
}
if (!needsGroupsReload && dScGame_c::currentSpawnInfo.layer != mLayer) {
needsGroupsReload = true;
if (!mNeedsGroupsReload && dScGame_c::currentSpawnInfo.layer != mLayer) {
mNeedsGroupsReload = true;
}
mLayer = dScGame_c::currentSpawnInfo.layer;
@@ -210,6 +210,241 @@ bool dSndStateMgr_c::isSeekerStoneStage(const char *stageName, s32 layer) {
return false;
}
bool dSndStateMgr_c::isSomeSkyloftRoom() const {
switch (field_0x044) {
case SND_STAGE_F001r:
case SND_STAGE_F002r:
case SND_STAGE_F011r:
case SND_STAGE_F005r:
case SND_STAGE_F006r:
case SND_STAGE_F007r:
case SND_STAGE_F013r:
case SND_STAGE_F014r:
case SND_STAGE_F015r:
case SND_STAGE_F016r:
case SND_STAGE_F017r:
case SND_STAGE_F018r: return true;
default: return false;
}
}
void dSndStateMgr_c::loadStageSound() {
loadStageSound(false);
}
void dSndStateMgr_c::loadStageSound(bool force) {
if (!force && !mNeedsGroupsReload) {
return;
}
bool demo = isInDemo();
if (!checkFlag0x18(0x40)) {
for (int i = 0; i < dSndControlPlayerMgr_c::sNumPlayers; i++) {
dSndControlPlayerMgr_c::GetInstance()->setLpfFreq(i, 0.0f, 0);
dSndControlPlayerMgr_c::GetInstance()->setFxSend(i, 0.0f, 0);
}
}
if (checkEventFlag(EVENT_0x800)) {
if (!dSndBgmMgr_c::GetInstance()->isPlayingBgmSound()) {
dSndControlPlayerMgr_c::GetInstance()->setupPlayerControlsStage();
offEventFlag(EVENT_0x800);
} else {
dSndControlPlayerMgr_c::GetInstance()->setupPlayerControlsStageBgm();
}
} else {
if (dSndBgmMgr_c::GetInstance()->isPlayingBgmSound()) {
dSndControlPlayerMgr_c::GetInstance()->setupPlayerControlsStageBgm();
onEventFlag(EVENT_0x800);
} else {
dSndControlPlayerMgr_c::GetInstance()->setupPlayerControlsStage();
}
}
dSndControlPlayerMgr_c::GetInstance()->muteScenePlayers(0);
dSndPlayerMgr_c::GetInstance()->shutdownDemo();
field_0x4A8 = 1;
bool bHasState1 = false;
if (isSomeSkyloftRoom()) {
u32 id = dSndMgr_c::GetInstance()->getArchive()->ConvertLabelStringToGroupId("GRP_FAN_TIMECHANGE");
if (dSndMgr_c::GetInstance()->getPlayer().IsLoadedGroup(id)) {
bHasState1 = true;
} else {
dSndPlayerMgr_c::GetInstance()->popToState0();
if (dSndMgr_c::GetInstance()->loadGroup(id, nullptr, 0)) {
dSndPlayerMgr_c::GetInstance()->saveState1();
bHasState1 = true;
}
}
}
const dSndStageInfo *info = &dSndStageInfo::sInfos[mStageId];
u32 id = -1;
int round = 1;
bool b1 = false;
SizedString<64> label;
if (info->unk4 == mStageId) {
const char *stageName = getStageName(info->unk4);
label.sprintf("GRP_A_%s_L%d", stageName, mLayer);
round = 2;
} else {
const char *stageName = getCurrentStageName4();
label.sprintf("GRP_A_%s", stageName);
}
for (; round > 0; round--) {
id = dSndMgr_c::GetInstance()->getArchive()->ConvertLabelStringToGroupId(label);
if (field_0x4A4 == id && field_0x4A4 != -1) {
b1 = true;
break;
}
if (id != -1) {
if (bHasState1) {
dSndPlayerMgr_c::GetInstance()->popToState1();
} else {
dSndPlayerMgr_c::GetInstance()->popToState0();
}
if (dSndMgr_c::GetInstance()->loadGroup(id, nullptr, 0)) {
field_0x4A4 = id;
dSndPlayerMgr_c::GetInstance()->saveState2();
break;
}
}
if (round == 2) {
// we tried layer variant, now try variant without layer
const char *stageName = getCurrentStageName4();
label.sprintf("GRP_A_%s", stageName);
}
}
if (b1) {
dSndPlayerMgr_c::GetInstance()->popToState2();
} else if (id == -1) {
if (bHasState1) {
dSndPlayerMgr_c::GetInstance()->popToState1();
} else {
dSndPlayerMgr_c::GetInstance()->popToState0();
}
dSndPlayerMgr_c::GetInstance()->saveState2();
field_0x4A4 = -1;
}
if (!demo && (field_0x03C != 2 || field_0x065)) {
if (field_0x065) {
id = GRP_SIREN;
} else if (checkStageTypeFlag(STAGE_ROOM)) {
id = GRP_INDOOR;
} else if (checkStageTypeFlag(STAGE_FIELD)) {
id = GRP_FIELD;
} else if (checkStageTypeFlag(STAGE_DUNGEON)) {
if (isVolcanicDungeon(mStageId)) {
id = GRP_DUNGEON_BATTLE_ROOM;
} else {
id = GRP_DUNGEON;
}
} else if (checkStageTypeFlag(STAGE_BOSS)) {
id = GRP_BOSS;
} else {
id = GRP_DEFAULT;
}
if (id != -1) {
dSndMgr_c::GetInstance()->loadGroup(id, nullptr, 0);
}
}
if (!field_0x065) {
id = -1;
if (!demo) {
if (field_0x03C == 2) {
id = GRP_SKY;
} else if (checkStageTypeFlag(STAGE_FOREST)) {
id = GRP_FOREST;
} else if (checkStageTypeFlag(STAGE_MOUNTAIN)) {
id = GRP_MOUNTAIN;
} else if (checkStageTypeFlag(STAGE_DESERT)) {
id = GRP_DESERT;
}
if (id != -1) {
dSndMgr_c::GetInstance()->loadGroup(id, nullptr, 0);
}
}
SizedString<64> label;
label.sprintf("GRP_%s_L%d", &mStageName, mLayer);
id = dSndMgr_c::GetInstance()->getArchive()->ConvertLabelStringToGroupId(label);
if (id == -1) {
label.sprintf("GRP_%s", &mStageName);
id = dSndMgr_c::GetInstance()->getArchive()->ConvertLabelStringToGroupId(label);
}
if (id != -1) {
dSndMgr_c::GetInstance()->loadGroup(id, nullptr, 0);
}
if (demo) {
// REGSWAP
if (dSndPlayerMgr_c::GetInstance()->loadDemoArchive(getCurrentStageMusicDemoName())) {
for (u32 i = dSndPlayerMgr_c::PLAYER_LINK_BODY; i <= dSndPlayerMgr_c::PLAYER_EVENT; i++) {
dSndControlPlayerMgr_c::GetInstance()->getPlayer1(i)->StopAllSound(0);
}
dSndControlPlayerMgr_c::GetInstance()->setupPlayerControlsDemo();
}
}
}
field_0x4A8 = 0;
dSndBgmMgr_c::GetInstance()->loadStageSound();
f32 volume = -1.0f;
dSndAreaSoundEffectMgr_c::GetInstance()->loadStageSound(&volume);
if (volume > 0.0f) {
field_0x490 = volume;
}
}
void dSndStateMgr_c::calcEvent() {
if (!isInEvent()) {
return;
}
bool b = false;
if (dSndPlayerMgr_c::GetInstance()->checkFlag(dSndPlayerMgr_c::MGR_CAUTION) ||
dSndPlayerMgr_c::GetInstance()->checkFlag(dSndPlayerMgr_c::MGR_MAP) ||
dSndPlayerMgr_c::GetInstance()->checkFlag(dSndPlayerMgr_c::MGR_MSG_WAIT)) {
b = true;
}
if (mpSoundEventDef != nullptr && sEventExecuteCallback != nullptr) {
(sEventExecuteCallback)();
}
if (!b) {
if (EventManager::getCurrentEventName() == nullptr) {
if (!checkEventFlag(EVENT_0x800)) {
endEvent(false);
}
} else {
if (mSeLvSoundId != -1) {
dSndMgr_c::GetInstance()->holdSound(&mSeLvSoundHandle, mSeLvSoundId);
}
calcBgm();
calcSe();
calcCmd();
mFrameCounter++;
mCameraCutFrameCounter++;
mMsgFrameCounter++;
nw4r::snd::SeqSoundHandle::WriteGlobalVariable(2, mCameraCutFrameCounter);
}
}
}
void dSndStateMgr_c::setEvent(const char *eventName) {
if (eventName == nullptr) {
return;
@@ -382,14 +617,80 @@ void dSndStateMgr_c::doLabelSuffix(const char *suffix) {
u32 dSndStateMgr_c::getSeCameraId() {
SizedString<64> label;
label.sprintf("%s_C%d_%d", &mSeName, mCameraCutCounter, mCameraCutFrameCounter);
label.sprintf(getCameraFmt(), &mSeName, mCameraCutCounter, mCameraCutFrameCounter);
return convertSeLabelToSoundId(label);
}
void dSndStateMgr_c::clearExecuteCallback() {
u32 dSndStateMgr_c::getSeMsgWaitId() {
SizedString<64> label;
label.sprintf(getMsgWaitFmt(), &mSeName, mMsgCounter, mMsgWaitSelectCounter, mMsgFrameCounter);
return convertSeLabelToSoundId(label);
}
u32 dSndStateMgr_c::getSeFrameCountId() {
SizedString<64> label;
label.sprintf(getFrameFmt(), &mSeName, mFrameCounter);
return convertSeLabelToSoundId(label);
}
u32 dSndStateMgr_c::getBgmCameraId() {
SizedString<64> label;
label.sprintf(getCameraFmt(), &mBgmName, mCameraCutCounter, mCameraCutFrameCounter);
return convertBgmLabelToSoundId(label);
}
u32 dSndStateMgr_c::getBgmMsgWaitId() {
SizedString<64> label;
label.sprintf(getMsgWaitFmt(), &mBgmName, mMsgCounter, mMsgWaitSelectCounter, mMsgFrameCounter);
return convertBgmLabelToSoundId(label);
}
u32 dSndStateMgr_c::getBgmFrameCountId() {
SizedString<64> label;
label.sprintf(getFrameFmt(), &mBgmName, mFrameCounter);
return convertBgmLabelToSoundId(label);
}
u32 dSndStateMgr_c::getCmdCameraId() {
SizedString<64> label;
label.sprintf(getCameraFmt(), &mCmdName, mCameraCutCounter, mCameraCutFrameCounter);
return convertCmdLabelToSoundId(label);
}
u32 dSndStateMgr_c::getCmdMsgWaitId() {
SizedString<64> label;
label.sprintf(getMsgWaitFmt(), &mCmdName, mMsgCounter, mMsgWaitSelectCounter, mMsgFrameCounter);
return convertCmdLabelToSoundId(label);
}
u32 dSndStateMgr_c::getCmdFrameCountId() {
SizedString<64> label;
label.sprintf(getFrameFmt(), &mCmdName, mFrameCounter);
return convertCmdLabelToSoundId(label);
}
void dSndStateMgr_c::clearEventExecuteCallback() {
sEventExecuteCallback = nullptr;
}
bool dSndStateMgr_c::calcBgm() {
bool ok = playFanOrBgm(getBgmCameraId());
if (!ok) {
ok = playFanOrBgm(getBgmMsgWaitId());
}
if (!ok) {
// @bug (?) shouldn't this assign to ok? Maybe a shadowing redeclaration...
(void)playFanOrBgm(getBgmFrameCountId());
}
return ok;
}
void dSndStateMgr_c::calcSe() {
playSe(getSeCameraId());
playSe(getSeMsgWaitId());
playSe(getSeFrameCountId());
}
void dSndStateMgr_c::handleSeLv() {
SizedString<0x40> name = mSeName;
name += "_LV";
@@ -407,6 +708,12 @@ void dSndStateMgr_c::handleSeLv() {
}
}
void dSndStateMgr_c::calcCmd() {
playCmd(getCmdCameraId());
playCmd(getCmdMsgWaitId());
playCmd(getCmdFrameCountId());
}
bool dSndStateMgr_c::finalizeEvent(bool skipped) {
dSndPlayerMgr_c *mgr = dSndPlayerMgr_c::GetInstance();
if (mgr->checkFlag(dSndPlayerMgr_c::MGR_CAUTION)) {
@@ -426,9 +733,15 @@ bool dSndStateMgr_c::finalizeEvent(bool skipped) {
p->ForEachSound(stopper, false);
}
// ...
SizedString<64> label;
label.sprintf("%s_FIN", &mSeName);
playSe(dSndPlayerMgr_c::GetInstance()->convertLabelStringToSoundId(label));
label.sprintf("%s_FIN", &mBgmName);
doBgm(label);
label.sprintf("%s_FIN", &mCmdName);
doCmd(label);
return false;
return dSndBgmMgr_c::GetInstance()->onEventFinalize(mEventName, mSoundEventId, skipped);
}
// TODO - the whole "camera cut" thing seems plausible but I haven't confirmed it yet
@@ -482,7 +795,7 @@ void dSndStateMgr_c::onMsgWaitStart() {
if (mpSoundEventDef != nullptr && mpSoundEventDef->msgWaitStartCb != nullptr) {
mpSoundEventDef->msgWaitStartCb(mMsgWaitSelectCounter);
}
SizedString<64> label;
label.sprintf("_M%d_WS%d", mMsgCounter, mMsgWaitSelectCounter);
doLabelSuffix(label);
@@ -492,7 +805,7 @@ void dSndStateMgr_c::onMsgWaitEnd() {
if (mpSoundEventDef != nullptr && mpSoundEventDef->msgWaitEndCb != nullptr) {
mpSoundEventDef->msgWaitEndCb(mMsgWaitSelectCounter);
}
SizedString<64> label;
label.sprintf("_M%d_WE%d", mMsgCounter, mMsgWaitSelectCounter);
doLabelSuffix(label);