diff options
| author | robojumper <robojumper@gmail.com> | 2025-07-09 00:30:48 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-09-13 10:59:42 +0200 |
| commit | 4f9d63d357dfbdf3f08a7294eb2fbc7ccfe790cf (patch) | |
| tree | 51b80accf33403078974ee3e65573a94b260923e /src/d | |
| parent | bb3f0562bd38e7a4d001af0b578be03653faedcf (diff) | |
d_snd_bgm_sound_battle OK
Diffstat (limited to 'src/d')
| -rw-r--r-- | src/d/snd/d_snd_bgm_mgr.cpp | 2 | ||||
| -rw-r--r-- | src/d/snd/d_snd_bgm_mml_parsers.cpp | 24 | ||||
| -rw-r--r-- | src/d/snd/d_snd_bgm_sound.cpp | 38 | ||||
| -rw-r--r-- | src/d/snd/d_snd_bgm_sound_battle.cpp | 58 |
4 files changed, 87 insertions, 35 deletions
diff --git a/src/d/snd/d_snd_bgm_mgr.cpp b/src/d/snd/d_snd_bgm_mgr.cpp index dcfcb3ac..a972531c 100644 --- a/src/d/snd/d_snd_bgm_mgr.cpp +++ b/src/d/snd/d_snd_bgm_mgr.cpp @@ -1,7 +1,7 @@ #include "d/snd/d_snd_bgm_mgr.h" #include "common.h" -#include "d/snd/d_snd_bgm_sound battle.h" +#include "d/snd/d_snd_bgm_sound_battle.h" #include "d/snd/d_snd_bgm_sound.h" #include "d/snd/d_snd_mgr.h" #include "d/snd/d_snd_player_mgr.h" diff --git a/src/d/snd/d_snd_bgm_mml_parsers.cpp b/src/d/snd/d_snd_bgm_mml_parsers.cpp index e8797706..8e996ed6 100644 --- a/src/d/snd/d_snd_bgm_mml_parsers.cpp +++ b/src/d/snd/d_snd_bgm_mml_parsers.cpp @@ -1,9 +1,9 @@ #include "d/snd/d_snd_bgm_mml_parsers.h" #include "common.h" -#include "d/snd/d_snd_mgr.h" -#include "d/snd/d_snd_bgm_sound_harp_mgr.h" #include "d/snd/d_snd_bgm_seq_data_mgr.h" +#include "d/snd/d_snd_bgm_sound_harp_mgr.h" +#include "d/snd/d_snd_mgr.h" #include "d/snd/d_snd_player_mgr.h" #include "nw4r/snd/snd_SoundArchive.h" #include "sized_string.h" @@ -23,7 +23,8 @@ bool dSndBgmMmlParserHarp_c::parseData(const char *soundLabel, u32 baseSoundId, SizedString<64> dataLabel; dataLabel.sprintf("%s%s", dSndBgmSeqDataMgr_c::getDataPrefix(), soundLabel); u32 dataId = dSndPlayerMgr_c::GetInstance()->convertLabelStringToSoundId(dataLabel); - if (dataId != -1 && dSndMgr_c::GetInstance()->getArchive()->GetSoundType(dataId) == nw4r::snd::SoundArchive::SOUND_TYPE_SEQ) { + if (dataId != -1 && + dSndMgr_c::GetInstance()->getArchive()->GetSoundType(dataId) == nw4r::snd::SoundArchive::SOUND_TYPE_SEQ) { ok = loadAndParse(dataId, trackMask, true); if (ok) { field_0x294->setSoundId(baseSoundId); @@ -53,22 +54,17 @@ void dSndBgmMmlParserHarp_c::CommandProc(u32 trackNo, int wait, u32 command, s32 } break; default: - if (command == MML_SET_TEMPO) { - field_0x294->setTempo(commandArg1); - } - break; - + if (command == MML_SET_TEMPO) { + field_0x294->setTempo(commandArg1); + } + break; } } void dSndBgmMmlParserHarp_c::NoteOnCommandProc(u32 trackNo, int wait, int key, int velocity, s32 length) const { // TODO type switch ((s32)trackNo) { - case 15: - field_0x298->addVar(wait, key, velocity); - break; - default: - break; - + case 15: field_0x298->addVar(wait, key, velocity); break; + default: break; } } diff --git a/src/d/snd/d_snd_bgm_sound.cpp b/src/d/snd/d_snd_bgm_sound.cpp index e6e8a78e..60a717bc 100644 --- a/src/d/snd/d_snd_bgm_sound.cpp +++ b/src/d/snd/d_snd_bgm_sound.cpp @@ -29,8 +29,8 @@ dSndBgmSound_c::dSndBgmSound_c() mSeqTempo(-1), mBgmFlags(0), mDidRewindPlaySamplePosition(false), - field_0x114(-1), - field_0x118(0x180), + mBgmVar3(-1), + mSeqTimebase(0x180), mPlaySamplePosition(0), mpHarpMgr(&mHarpMgr), mpSeqConfig(nullptr), @@ -71,9 +71,9 @@ void dSndBgmSound_c::cancel() { mpSeqConfig = nullptr; mPlaySamplePosition = 0; mSeqPlaySamplePosition = -1; - field_0x114 = -1; + mBgmVar3 = -1; mSeqTempo = -1; - field_0x118 = 0x180; + mSeqTimebase = 0x180; mHarpMgr.reset(); for (int i = 0; i < 2; i++) { field_0x14C[i] = 0; @@ -239,7 +239,7 @@ void dSndBgmSound_c::loadSeqConfig(u32 soundId) { if (dSndMgr_c::GetInstance()->getArchive()->GetSoundType(soundId) == nw4r::snd::SoundArchive::SOUND_TYPE_SEQ) { mpSeqConfig = dSndBgmSeqConfig::getConfig(soundId, 1); if (mpSeqConfig != nullptr) { - field_0x118 = mpSeqConfig->field_0x08; + mSeqTimebase = mpSeqConfig->mTimebase; } } } @@ -415,27 +415,31 @@ void dSndBgmSound_c::calcSeqPlaySamplePosition() { nw4r::snd::SeqSoundHandle handle(this); s32 tick = handle.GetTick(); - field_0x114 = readSeqTrackVariable(3); - if (field_0x114 >= 0) { - mSeqPlaySamplePosition = tick % field_0x118; + mBgmVar3 = readSeqTrackVariable(3); + if (mBgmVar3 >= 0) { + // Var >= 0 - seq itself controls play position + mSeqPlaySamplePosition = tick % mSeqTimebase; if (mSeqPlaySamplePosition == 0) { - field_0x114++; - if (mpSeqConfig != nullptr && field_0x114 > mpSeqConfig->field_0x0E) { - field_0x114 = mpSeqConfig->field_0x0C; + mBgmVar3++; + if (mpSeqConfig != nullptr && mBgmVar3 > mpSeqConfig->mLoopEnd) { + mBgmVar3 = mpSeqConfig->mLoopStart; } } - mSeqPlaySamplePosition += field_0x118 * field_0x114; + mSeqPlaySamplePosition += mSeqTimebase * mBgmVar3; } else if (mpSeqConfig != nullptr) { - if (tick < (mpSeqConfig->field_0x0E + 1) * field_0x118) { + if (tick < (mpSeqConfig->mLoopEnd + 1) * mSeqTimebase) { + // not looped yet, no adjustment needed mSeqPlaySamplePosition = tick; return; } - s32 offset = mpSeqConfig->field_0x0C * field_0x118; + s32 startOffset = mpSeqConfig->mLoopStart * mSeqTimebase; - tick -= offset; - tick = tick % (field_0x118 * (mpSeqConfig->field_0x0E - mpSeqConfig->field_0x0C)); - mSeqPlaySamplePosition = tick + offset; + // wrap around loop, making sure to account for start offset + tick -= startOffset; + tick = tick % (mSeqTimebase * (mpSeqConfig->mLoopEnd - mpSeqConfig->mLoopStart)); + mSeqPlaySamplePosition = tick + startOffset; } else { + // Fallback, not controlled by seq no config override mSeqPlaySamplePosition = tick; } } diff --git a/src/d/snd/d_snd_bgm_sound_battle.cpp b/src/d/snd/d_snd_bgm_sound_battle.cpp index d3b604c5..034fedb1 100644 --- a/src/d/snd/d_snd_bgm_sound_battle.cpp +++ b/src/d/snd/d_snd_bgm_sound_battle.cpp @@ -5,14 +5,15 @@ #include "d/snd/d_snd_bgm_sound.h" #include "d/snd/d_snd_mgr.h" #include "d/snd/d_snd_wzsound.h" +#include "nw4r/snd/snd_SeqSoundHandle.h" dSndBgmBattleSound_c::dSndBgmBattleSound_c() - : mpBgmBattleConfig(nullptr), mMuteApplyStateMask(0), mTickRelated(0), field_0x190(0), field_0x191(1) {} + : mpBgmBattleConfig(nullptr), mMuteGroupActiveMask(0), mPrevTick(0), field_0x190(0), field_0x191(1) {} void dSndBgmBattleSound_c::cancel() { dSndBgmSound_c::cancel(); - mMuteApplyStateMask = 0; - mTickRelated = 0; + mMuteGroupActiveMask = 0; + mPrevTick = 0; field_0x190 = 0; field_0x191 = 1; } @@ -44,3 +45,54 @@ void dSndBgmBattleSound_c::fadeIn(u32 id, s32 fadeFrames) { field_0x191 = 0; } } + +void dSndBgmBattleSound_c::setTrackGroupMuted(u32 groupId) { + mMuteGroupActiveMask |= (1 << groupId); +} + +void dSndBgmBattleSound_c::setTrackGroupUnmuted(u32 groupId) { + mMuteGroupActiveMask &= ~(1 << groupId); +} + +bool dSndBgmBattleSound_c::startMainBattleLoop() { + if (isPlaying() && readSeqTrackVariable(0) != 1) { + // This seq variable allows the seq sound to jump from intro to main loop + writeSeqTrackVariable(0, 1); + mpSeqConfig = dSndBgmSeqConfig::getConfig(GetId(), 1); + return true; + } + + return false; +} + +void dSndBgmBattleSound_c::calcSeqPlaySamplePosition() { + if (!isSeqSound()) { + return; + } + + nw4r::snd::SeqSoundHandle handle(this); + s32 tick = handle.GetTick(); + s32 tickDiff = tick - mPrevTick; + + if (tickDiff <= 0) { + return; + } + + mPrevTick = tick; + s32 timeBase = mpSeqConfig != nullptr ? mpSeqConfig->mTimebase : 0x180; + mBgmVar3 = readSeqTrackVariable(3); + if (mBgmVar3 >= 0) { + // Var >= 0 - seq itself controls play position + mSeqPlaySamplePosition = tick % mSeqTimebase; + mSeqPlaySamplePosition += mSeqTimebase * mBgmVar3; + } else if (mpSeqConfig != nullptr) { + mSeqPlaySamplePosition += tickDiff; + if (mSeqPlaySamplePosition < (mpSeqConfig->mLoopEnd + 1) * timeBase) { + // not looped yet, no adjustment needed + return; + } + // looped, simple adjustment - simplified compared to dSndBgmSound_c which always calculates + // mSeqPlaySamplePosition freshly. This function instead uses the difference + mSeqPlaySamplePosition -= (timeBase * (mpSeqConfig->mLoopEnd - mpSeqConfig->mLoopStart)); + } +} |
