diff options
| author | robojumper <robojumper@gmail.com> | 2025-07-20 22:10:38 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-09-13 11:10:28 +0200 |
| commit | 1be399e999307d9bd3fdffaf03618edefd5fdc84 (patch) | |
| tree | c6c44b2351b30f2cc0dad42d8b2555253bac3514 /src | |
| parent | ac846aea3e813fb9f03b3d491ccd15ac4646ac7d (diff) | |
d_snd_small_effect_mgr OK
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/snd/d_snd_small_effect_mgr.cpp | 108 | ||||
| -rw-r--r-- | src/d/snd/d_snd_state_mgr.cpp | 32 |
2 files changed, 115 insertions, 25 deletions
diff --git a/src/d/snd/d_snd_small_effect_mgr.cpp b/src/d/snd/d_snd_small_effect_mgr.cpp index 46a9ffc5..b970a325 100644 --- a/src/d/snd/d_snd_small_effect_mgr.cpp +++ b/src/d/snd/d_snd_small_effect_mgr.cpp @@ -1,6 +1,7 @@ #include "d/snd/d_snd_small_effect_mgr.h" #include "common.h" +#include "d/snd/d_snd_area_sound_effect_mgr.h" #include "d/snd/d_snd_bgm_harp_data.h" #include "d/snd/d_snd_bgm_mgr.h" #include "d/snd/d_snd_bgm_sound.h" @@ -109,13 +110,64 @@ void dSndSmallEffectMgr_c::stopAllSoundExceptEffectOrLink(s32 fadeFrames) { } bool dSndSmallEffectMgr_c::playSoundInternalChecked(u32 soundId, nw4r::snd::SoundHandle *pHandle) { - // TODO - return false; + if (dSndStateMgr_c::GetInstance()->getField_0x064()) { + return false; + } + + if (field_0x10 > 0) { + return false; + } + + if (dSndStateMgr_c::GetInstance()->checkFlag0x10(dSndStateMgr_c::FLAG0x10_0x08)) { + return false; + } + return playSoundInternal(soundId, pHandle); } bool dSndSmallEffectMgr_c::playSoundInternal(u32 soundId, nw4r::snd::SoundHandle *pHandle) { - // TODO - return false; + u32 userParam = dSndPlayerMgr_c::GetInstance()->getSomeUserParam(soundId); + if (userParam & 2) { + for (u32 i = dSndPlayerMgr_c::PLAYER_SMALL_IMPORTANT; i <= dSndPlayerMgr_c::PLAYER_EVENT; i++) { + if (isPlayingSound(i, soundId)) { + return false; + } + } + } else if (userParam & 1) { + stopSounds(soundId, 2); + } + + if (userParam & 0x80000000) { + return false; + } + + nw4r::snd::SoundHandle tmpHandle; + if (pHandle == nullptr) { + pHandle = &tmpHandle; + } + + nw4r::snd::SoundStartable::StartResult res = dSndPlayerMgr_c::GetInstance()->startSound(pHandle, soundId, nullptr); + if (res == nw4r::snd::SoundStartable::START_SUCCESS) { + if (userParam & 8) { + if (EGG::AudioRmtSpeakerMgr::getWpadVolume() != 0) { + pHandle->SetOutputLineFlag(nw4r::snd::OUTPUT_LINE_REMOTE_1); + } + } else if (userParam & 4) { + pHandle->SetOutputLineFlag(nw4r::snd::OUTPUT_LINE_MAIN | nw4r::snd::OUTPUT_LINE_REMOTE_1); + } + + if (userParam & 0x10 && EGG::AudioRmtSpeakerMgr::getWpadVolume() != 0) { + u32 rcVariant = dSndPlayerMgr_c::GetInstance()->getRemoConSoundVariant(soundId); + if (rcVariant != -1) { + nw4r::snd::SoundHandle rcHandle; + dSndMgr_c::GetInstance()->getPlayer().StartSound(&rcHandle, rcVariant); + if (EGG::AudioRmtSpeakerMgr::getWpadVolume() != 0) { + rcHandle.SetOutputLineFlag(nw4r::snd::OUTPUT_LINE_REMOTE_1); + } + } + } + } + + return res == nw4r::snd::SoundStartable::START_SUCCESS; } bool dSndSmallEffectMgr_c::playSound(u32 soundId) { @@ -228,8 +280,41 @@ bool dSndSmallEffectMgr_c::playSoundWithPan(u32 soundId, f32 pan) { return ok; } +bool dSndSmallEffectMgr_c::doSideEffects(u32 soundId) { + if (soundId == SE_S_FS2_SELECT_START || soundId == SE_S_NE_SELECT_OK) { + dSndBgmMgr_c::GetInstance()->stopAllBgm(15); + dSndAreaSoundEffectMgr_c::GetInstance()->stopSounds(15); + } + + u32 userParam = dSndPlayerMgr_c::GetInstance()->getSomeUserParam(soundId); + if ((userParam & 0x80) && dSndStateMgr_c::GetInstance()->isInEvent()) { + return false; + } + + if (userParam & 2) { + for (u32 i = dSndPlayerMgr_c::PLAYER_SMALL_IMPORTANT; i <= dSndPlayerMgr_c::PLAYER_SMALL_NORMAL; i++) { + if (isPlayingSound(i, soundId)) { + return false; + } + } + } else if (userParam & 1) { + stopSounds(soundId, 2); + } + return true; +} + bool dSndSmallEffectMgr_c::playSoundInternal(u32 soundId) { - // TODO + u32 userParam = dSndPlayerMgr_c::GetInstance()->getSomeUserParam(soundId); + + // Why is this flag weird + if ((userParam >> 31) != 0) { + return false; + } + + // Bunch of code duplication between doSideEffects and playSoundInternal + if (doSideEffects(soundId)) { + return playSoundInternal(soundId, &mNormalSound); + } return false; } @@ -491,6 +576,14 @@ bool dSndSmallEffectMgr_c::playSkbSound(u32 soundId) { return playSound(soundId); } +bool dSndSmallEffectMgr_c::playDemoSound(u32 soundId, nw4r::snd::SoundHandle *pHandle) { + nw4r::snd::SoundHandle tmpHandle; + + return dSndPlayerMgr_c::GetInstance()->startDemoSound( + pHandle == nullptr ? &tmpHandle : pHandle, soundId, nullptr + ) == nw4r::snd::SoundStartable::START_SUCCESS; +} + void dSndSmallEffectMgr_c::stopSounds(u32 playerIdx, u32 soundId, s32 fadeFrames) { SoundStopper stopper(soundId, fadeFrames); dSndControlPlayerMgr_c::GetInstance()->getPlayer1(playerIdx)->ForEachSound(stopper, false); @@ -661,7 +754,6 @@ bool dSndSmallEffectMgr_c::playBattleHitSound(BattleHitSound_e type, dSoundSourc // One bit set, get the value (using a slightly convoluted method // due to inline complexity) without rejecting it when it equals // the previously picked value - // TODO - unnecessary reload of count here. varIdx = set->getRandomIdxWithBitSet(); field_0x40 = set->getVal(varIdx); } else { @@ -733,9 +825,7 @@ bool dSndSmallEffectMgr_c::playBattleHitSound(BattleHitSound_e type, dSoundSourc return ok; } -void dSndSmallEffectMgr_c::setBitsIfAdjacent( - dSndBgmDataHarpVarSetBase_c *set, s32 count, s32 target, u32 *pMask -) { +void dSndSmallEffectMgr_c::setBitsIfAdjacent(dSndBgmDataHarpVarSetBase_c *set, s32 count, s32 target, u32 *pMask) { for (int i = 0; i < count; i++) { s32 val = set->getVal(i); if (val == target + 1 || val == target - 1) { diff --git a/src/d/snd/d_snd_state_mgr.cpp b/src/d/snd/d_snd_state_mgr.cpp index 6342cab2..90eaaa6e 100644 --- a/src/d/snd/d_snd_state_mgr.cpp +++ b/src/d/snd/d_snd_state_mgr.cpp @@ -42,7 +42,7 @@ dSndStateMgr_c::dSndStateMgr_c() mLayer(0), mRoomId(-1), field_0x060(0), - field_0x064(0), + field_0x064(false), field_0x065(false), mHasChangedTgSndAreaFlags(false), mHasChangedTgSndAreaMgFlags(false), @@ -110,8 +110,8 @@ void dSndStateMgr_c::onStageOrLayerUpdate() { bool unk_0x065 = field_0x065; - onFlag0x10(0x2); - field_0x064 = 0; + onFlag0x10(FLAG0x10_0x02); + field_0x064 = false; if (!streq(mStageName, dScGame_c::currentSpawnInfo.getStageName())) { mNeedsGroupsReload = true; @@ -248,7 +248,7 @@ void dSndStateMgr_c::onRestartScene(s32 fadeFrames) { dSndAreaSoundEffectMgr_c::GetInstance()->stopSounds(fadeFrames); } else { onGotoStage(fadeFrames); - onFlag0x10(0x01); + onFlag0x10(FLAG0x10_0x01); return; } } @@ -256,10 +256,10 @@ void dSndStateMgr_c::onRestartScene(s32 fadeFrames) { dSndSmallEffectMgr_c::GetInstance()->stopAllSoundExceptEvent(fadeFrames); dSndBgmMgr_c::GetInstance()->prepareBgm(); dSndHarpSongMgr_c::GetInstance()->deactivate(); - onFlag0x10(0x01); + onFlag0x10(FLAG0x10_0x01); dSndBgmMgr_c::GetInstance()->setField_0x306(1); - offFlag0x10(0x4); - offFlag0x10(0x10); + offFlag0x10(FLAG0x10_0x04); + offFlag0x10(FLAG0x10_0x10); } void dSndStateMgr_c::loadStageSound() { @@ -488,14 +488,14 @@ void dSndStateMgr_c::setEvent(const char *eventName) { dSndPlayerMgr_c::GetInstance()->leaveCaution(); } - if (field_0x064 == 0) { + if (!field_0x064) { if (streq(mEventName, "DefaultSkip")) { onSkipEvent(); mPrevEventName = mEventName; return; } - if (!checkFlag0x18(0x20) || !checkFlag0x10(0x04)) { + if (!checkFlag0x18(0x20) || !checkFlag0x10(FLAG0x10_0x04)) { SizedString<64> prevEvent = mEventName; if (isInEvent()) { field_0x23C = 1; @@ -523,7 +523,7 @@ void dSndStateMgr_c::setEvent(const char *eventName) { mpStbEventName = nullptr; } - if (!checkFlag0x10(0x04)) { + if (!checkFlag0x10(FLAG0x10_0x04)) { if (mpUnkCallback != nullptr) { mpUnkCallback(); } @@ -531,11 +531,11 @@ void dSndStateMgr_c::setEvent(const char *eventName) { dSndBgmMgr_c::GetInstance()->setField_0x306(1); dSndBgmMgr_c::GetInstance()->prepareBgm(); onEventFlag(EVENT_0x04); - onFlag0x10(0x04); + onFlag0x10(FLAG0x10_0x04); dSndControlPlayerMgr_c::GetInstance()->unmuteScenePlayers(30); } bool b2 = checkEventFlag(EVENT_0x800) && dSndBgmMgr_c::GetInstance()->isPlayingBgmSound(); - if (checkEventFlag(EVENT_0x800) && field_0x064 == 0) { + if (checkEventFlag(EVENT_0x800) && !field_0x064) { // TODO - constness or direct access offEventFlag(0x800); } @@ -846,8 +846,8 @@ void dSndStateMgr_c::onMsgWaitEnd() { } void dSndStateMgr_c::onLinkDie() { - if (!checkFlag0x10(0x8)) { - onFlag0x10(0x8); + if (!checkFlag0x10(FLAG0x10_0x08)) { + onFlag0x10(FLAG0x10_0x08); dSndBgmMgr_c::GetInstance()->stopAllBgm(15); dSndSmallEffectMgr_c::GetInstance()->stopAllSoundExceptEffectOrLink(15); if (field_0x065 == 0) { @@ -861,7 +861,7 @@ void dSndStateMgr_c::setStbEventName(const char *eventName) { } void dSndStateMgr_c::calcRoomId() { - if (checkFlag0x10(4)) { + if (checkFlag0x10(FLAG0x10_0x04)) { if (field_0x060 > 0) { field_0x060--; } else { @@ -871,7 +871,7 @@ void dSndStateMgr_c::calcRoomId() { s32 newRoom = dSndSourceMgr_c::GetInstance()->getPlayerSourceRoomId(); if (mRoomId != newRoom) { setRoomId(newRoom); - } else if (newRoom != -1 && !checkFlag0x10(0x10)) { + } else if (newRoom != -1 && !checkFlag0x10(FLAG0x10_0x10)) { setRoomId(newRoom); } } |
