diff options
| author | MonsterDruide1 <5958456@gmail.com> | 2021-08-03 17:07:32 +0200 |
|---|---|---|
| committer | MonsterDruide1 <5958456@gmail.com> | 2021-08-04 22:12:42 +0200 |
| commit | b3d32fb76667163c59e8a62d0bddd3cfdcdc61cd (patch) | |
| tree | 9c4be1c926b17a593362fcc25f81a78bd26449e8 /src | |
| parent | 5367d0c85a46400a6856f0a8958c76d66fbc8cce (diff) | |
ksys/snd: Add MusicInfo and subclasses
Diffstat (limited to 'src')
| -rw-r--r-- | src/KingSystem/Sound/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/KingSystem/Sound/sndMusicInfo.cpp | 527 | ||||
| -rw-r--r-- | src/KingSystem/Sound/sndMusicInfo.h | 596 |
3 files changed, 1125 insertions, 0 deletions
diff --git a/src/KingSystem/Sound/CMakeLists.txt b/src/KingSystem/Sound/CMakeLists.txt index 1dfc73f1..3198e338 100644 --- a/src/KingSystem/Sound/CMakeLists.txt +++ b/src/KingSystem/Sound/CMakeLists.txt @@ -3,6 +3,8 @@ target_sources(uking PRIVATE sndInfoData.h sndMusicDefinition.cpp sndMusicDefinition.h + sndMusicInfo.cpp + sndMusicInfo.h sndResource.cpp sndResource.h ) diff --git a/src/KingSystem/Sound/sndMusicInfo.cpp b/src/KingSystem/Sound/sndMusicInfo.cpp new file mode 100644 index 00000000..98c5dcb1 --- /dev/null +++ b/src/KingSystem/Sound/sndMusicInfo.cpp @@ -0,0 +1,527 @@ +#include "KingSystem/Sound/sndMusicInfo.h" + +namespace ksys::snd { + +void MusicInfo::applySoundResource() { + sead::DirectResource* sound = loadMusic(); + if (sound) { + agl::utl::ResParameterArchive archive(sound->getRawData()); + applyResParameterArchive(archive); + } +} + +EnvBgmInfo::ParamPerType::ParamPerType() + : mBpm(110, "Bpm", "BPM", "Min=60,Max=180", this), + mPart0FirstWaitCount(0, "Part0FirstWaitCount", "パート0 初回予約の待ち拍", "Min=0,Max=100", + this), + mPart1FirstWaitCount(1, "Part1FirstWaitCount", "パート1 初回予約の待ち拍", "Min=0,Max=100", + this), + mPart2FirstWaitCount(15, "Part2FirstWaitCount", "パート2 初回予約の待ち拍", "Min=0,Max=100", + this), + mPart3FirstWaitCount(30, "Part3FirstWaitCount", "パート3 初回予約の待ち拍", "Min=0,Max=100", + this) {} + +EnvBgmInfo::EnvBgmInfo() + : mEnableWaitSec(20, "EnableWaitSec", "昼夜切り替えや条件外れた後の開始待ち秒", + "Min=0.f, Max=40.f", &mData), + mDistanceOfCheckingActiveEnemy(70, "DistanceOfCheckingActiveEnemy", + "警戒以上の敵を調べる範囲", "Min=1, Max=50", &mData), + mTimeDay(5, "TimeDay", "この時刻以降は昼扱い", "Min=0.f,Max=24.f", &mData), + mTimeNight(20, "TimeNight", "この時刻以降は夜扱い", "Min=0.f,Max=24.f", &mData), + mConstVolume(1, 1, "ConstVolume", "固定音量", "Min=0.f,Max=1.f", &mHeader), + mConstPan(0, 0, "ConstPan", "固定パン", "Min=-1.f,Max=1.f", &mHeader), + mMasterBeatBase(12, "MasterBeatBase", "基本の値", "Min=1,Max=24", &mData), + mMasterBeatRate(1, 4, "MasterBeatRate", "倍率", "Min=1,Max=4", &mHeader), + mPart0Volume(0.5, 1, "Part0Volume", "初回以外の音量ランダム幅", "Min=0.f,Max=1.f", &mHeader), + mPart0Pan(-0.95, 0.95, "Part0Pan", "パンランダム幅", "Min=-1.f,Max=1.f", &mHeader), + mPart1SegmentAWaitCountBase(25, "Part1SegmentAWaitCountBase", "基本の値", "Min=0,Max=100", + &mData), + mPart1SegmentAWaitCountRate(1, 4, "Part1SegmentAWaitCountRate", "倍率", "Min=1,Max=10", + &mHeader), + mPart1SegmentBWaitCountBase(15, "Part1SegmentBWaitCountBase", "基本の値", "Min=0,Max=100", + &mData), + mPart1SegmentBWaitCountRate(1, 5, "Part1SegmentBWaitCountRate", "倍率", "Min=1,Max=10", + &mHeader), + mPart1SegmentCWaitCountBase(20, "Part1SegmentCWaitCountBase", "基本の値", "Min=0,Max=100", + &mData), + mPart1SegmentCWaitCountRate(1, 5, "Part1SegmentCWaitCountRate", "倍率", "Min=1,Max=10", + &mHeader), + mPart1Volume(0.5, 1, "Part1Volume", "初回以外の音量ランダム幅", "Min=0.f,Max=1.f", &mHeader), + mPart1Pan(-0.4, 0.4, "Part1Pan", "パンランダム幅", "Min=-1.f,Max=1.f", &mHeader), + mPart2WaitCountBase(40, "Part2WaitCountBase", "基本の値", "Min=0,Max=100", &mData), + mPart2WaitCountRate(1, 3, "Part2WaitCountRate", "倍率", "Min=1,Max=10", &mHeader), + mPart2Volume(0.4, 1, "Part2Volume", "音量ランダム幅", "Min=0.f,Max=1.f", &mHeader), + // mPart2Pan missing? + mPart3WaitCountBase(50, "Part3WaitCountBase", "基本の値", "Min=0,Max=100", &mData), + mPart3WaitCountRate(1, 4, "Part3WaitCountRate", "倍率", "Min=1,Max=10", &mHeader), + mPart3Volume(0.4, 1, "Part3Volume", "音量ランダム幅", "Min=0.f,Max=1.f", &mHeader), + mPart3Pan(-1, 1, "Part3Pan", "パンランダム幅", "Min=-1.f,Max=1.f", &mHeader) {} + +void EnvBgmInfo::init(sead::Heap* heap) { + // mData not linked in any way? + addList(&mHeader, "MusicParam"); + mParamPerTypes.allocBufferAssert(EnvTimeEnum::size(), heap); + for (int i = 0; i < EnvTimeEnum::size(); i++) { + mHeader.addObj(&mParamPerTypes[i], + sead::FormatFixedSafeString<32>("ParamPerType_%s", EnvTimeEnum(i).text())); + } + applySoundResource(); +} + +HorseBgmInfo::HorseBgmInfo() + : mTimeDay(5, "TimeDay", "この時刻以降は昼扱い", "Min=0.f, Max=24.f", &mData), + mTimeNight(20, "TimeNight", "この時刻以降は夜扱い", "Min=0.f, Max=24.f", &mData), + mPlayWaitSec(5, "PlayWaitSec", "快速ギアになってから再生開始までの待ち秒", "Min=0.f,Max=10.f", + &mData), + mFadeInSec(14, "FadeInSec", "フェードイン秒", "Min=0.f,Max=30.f", &mData), + mMinVolume(0, "MinVolume", "フェードイン開始時点の音量", "Min=0.f,Max=1.f", &mData), + mFadeOutWaitSec(3, "FadeOutWaitSec", "ギアが下がった時のフェードアウト開始待ち秒", + "Min=0.f,Max=10.f", &mData), + mFadeOutSec(8, "FadeOutSec", "フェードアウト秒", "Min=0.f,Max=30.f", &mData), + mPlayingSecUseOutro(18, "PlayingSecUseOutro", + "フェードアウト完了時に再生がこの秒数以上続いてたらアウトロあり", + "Min=0.f,Max=60.f", &mData), + mIgnoreRequestSec(50, "IgnoreRequestSec", + "フェードアウト開始時に発動する開始リクエスト禁止秒", "Min=0.f,Max=100.f", + &mData) {} + +void HorseBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +TemperatureBgmInfo::ParamPerType::ParamPerType() + : mTemperatureThreshold(30, "TemperatureThreshold", "温度の閾値", "Min=-50.f,Max=50.f", this), + mFadeOutSec(2, "FadeOutSec", "条件を外れた時のフェードアウト秒", "Min=0.f,Max=10.f", this), + mCancelFadeSec(0.5, "CancelFadeSec", "再度条件に入った時の復帰フェード秒", "Min=0.f,Max=10.f", + this) {} + +void TemperatureBgmInfo::init(sead::Heap* heap) { + addList(&mData, "MusicParam"); + mParamPerTypes.allocBufferAssert(TemperatureEnum::size(), heap); + for (int i = 0; i < TemperatureEnum::size(); i++) { + mData.addObj(&mParamPerTypes[i], + sead::FormatFixedSafeString<32>("ParamPerType_%s", TemperatureEnum(i).text())); + } + applySoundResource(); +} + +TemperatureBgmInfo::~TemperatureBgmInfo() = default; + +SpotBgmInfo::SpotBgmInfo() + : mTimeDay(3.5, "TimeDay", "この時刻以降は昼扱い", "Min=0.f, Max=24.f", &mData), + mTimeNight(20, "TimeNight", "この時刻以降は夜扱い", "Min=0.f, Max=24.f", &mData), + mFilterOnFadeSec(8, "FilterOnFadeSec", "フィルタOnの時のフェード秒", "Min=0.f,Max=30.f", + &mData), + mFilterOffFadeSec(5, "FilterOffFadeSec", "フィルタOffの時のフェード秒", "Min=0.f,Max=30.f", + &mData), + mFilterValueLo(0.65, "FilterValueLo", "フィルタの値(ローパス)", "Min=0.f,Max=1.f", &mData), + mFilterValueHi(0.65, "FilterValueHi", "フィルタの値(ハイパス)", "Min=0.f,Max=1.f", &mData), + mSubTrackNearDistance(10, "SubTrackNearDistance", "音量最大になる距離(m)", + "Min=0.f,Max=50.f", &mData), + mSubTrackFarDistance(30, "SubTrackFarDistance", "音量最小になる距離(m)", "Min=0.f,Max=50.f", + &mData), + mSubTrackVolumeMaxDelta(1, "SubTrackVolumeMaxDelta", + "音量の変化度合の上限(大きくすると急な変化を抑えられる)", + "Min=0.01f,Max=1.f", &mData), + mAllowFadeInSec(1, "AllowFadeInSec", "フェードイン秒", "Min=0.f, Max=3.f", &mData), + mAllowFadeOutSec(3, "AllowFadeOutSec", "フェードアウト秒", "Min=0.f, Max=3.f", &mData), + mFadeOutSec(3, "FadeOutSec", "シグナル切断によるフェードアウト秒", "Min=0.f, Max=3.f", + &mData), + mCullingYFadeOutSec(3, "CullingYFadeOutSec", "エリア外によるフェードアウト秒", + "Min=0.f, Max=5.f", &mData), + mCullingYFadeInSec(1, "CullingYFadeInSec", "エリア内復帰によるフェードイン秒", + "Min=0.f, Max=5.f", &mData) {} + +void SpotBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +MazeForestBgmInfo::MazeForestBgmInfo() + : mPlayWaitSec(3, "PlayWaitSec", "エリアに入ってからの再生開始待ち秒", "Min=0.f, Max=10.f", + &mData), + mFadeInSec(5, "FadeInSec", "再生開始時のフェードイン秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(9, "FadeOutSec", "エリアから出た時のフェードアウト秒", "Min=0.f,Max=10.f", + &mData), + mVolumeNormal(0.34, "VolumeNormal", "エリア内通常状態の音量", "Min=0.f,Max=1.f", &mData), + mLostBoostSec(1.5, "LostBoostSec", "迷い状態になった時の音量上げ秒", "Min=0.f,Max=10.f", + &mData), + mLostBoostCancelSec(2, "LostBoostCancelSec", "迷い状態を脱した時の音量戻し秒", + "Min=0.f,Max=10.f", &mData) {} + +void MazeForestBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +CastleBgmInfo::CastleBgmInfo() + : mFadeOutWaitSec(3, "FadeOutWaitSec", "フェードアウト待ち秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(8, "FadeOutSec", "フェードアウト秒", "Min=0.f,Max=10.f", &mData), + mToIndoorWaitSec(3, "ToIndoorWaitSec", "外→内時のクロスフェード開始待ち秒", + "Min=0.f,Max=10.f", &mData), + mToIndoorFadeSec(5, "ToIndoorFadeSec", "外→内時のクロスフェード秒", "Min=0.f,Max=10.f", + &mData), + mToOutdoorFadeSec(5, "ToOutdoorFadeSec", "内→外時のクロスフェード秒", "Min=0.f,Max=10.f", + &mData), + mBattleWaitSec(1, "BattleWaitSec", "戦闘トラックフェードイン待ち秒", "Min=0.f,Max=10.f", + &mData), + mBattleFadeInSec(5, "BattleFadeInSec", "戦闘トラックフェードイン秒", "Min=0.f,Max=10.f", + &mData), + mBattleFadeOutSec(5, "BattleFadeOutSec", "戦闘トラックフェードアウト秒", "Min=0.f,Max=10.f", + &mData) {} + +void CastleBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +BigMazeBgmInfo::BigMazeBgmInfo() + : mPlayWaitSec(3, "PlayWaitSec", "エリアに入ってからの再生開始待ち秒", "Min=0.f, Max=10.f", + &mData), + mFadeInSec(5, "FadeInSec", "再生開始時のフェードイン秒", "Min=0.f, Max=10.f", &mData), + mFadeOutSec(10, "FadeOutSec", "再生停止時のフェードアウト秒", "Min=0.f, Max=20.f", &mData) {} + +void BigMazeBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +AnimalMasterBgmInfo::AnimalMasterBgmInfo() + : mPlayWaitSec(2, "PlayWaitSec", "エリアに入ってからの再生開始待ち秒", "Min=0.f, Max=10.f", + &mData), + mFadeInSec(5, "FadeInSec", "再生開始時のフェードイン秒", "Min=0.f, Max=10.f", &mData), + mFadeOutSec(6, "FadeOutSec", "再生停止時のフェードアウト秒", "Min=0.f, Max=20.f", &mData) {} + +void AnimalMasterBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +FieldBattleBgmInfo::FieldBattleBgmInfo() + : mBpm(130, "Bpm", "BPM", "Min=90,Max=180", &mData), + mPlayWaitSec(1, "PlayWaitSec", "緊迫発生から再生開始までの待ち秒", "Min=0.f,Max=10.f", + &mData), + mFadeInSec(5, "FadeInSec", "再生開始時のフェードイン秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(5, "FadeOutSec", "緊迫解除時のフェードアウト秒", "Min=0.f,Max=10.f", &mData), + mFeelPlayingSec(3, "FeelPlayingSec", + "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData), + mEasy1_OddsByKey0(40, "Easy1_OddsByKey0", "Easy1の前で調0を選ぶ確率", "Min=0.f,Max=100.f", + &mData), + mEasy1_OddsByKey1(30, "Easy1_OddsByKey1", "Easy1の前で調1を選ぶ確率", "Min=0.f,Max=100.f", + &mData), + mEasy1R_OddsBySameKey(20, "Easy1R_OddsBySameKey", "Easy1に再度戻る時に同調を継続する確率", + "Min=0.f,Max=100.f", &mData), + mEasy5_OddsBySameKey(40, "Easy5_OddsBySameKey", "Easy5の前で同調を継続する確率", + "Min=0.f,Max=100.f", &mData), + mMiddle0_OddsBySameKey(40, "Middle0_OddsBySameKey", "Middle0の前で同調を継続する確率", + "Min=0.f,Max=100.f", &mData), + mHard0_OddsBySameKey(100, "Hard0_OddsBySameKey", "Hard0の前で同調を継続する確率", + "Min=0.f,Max=100.f", &mData), + mHard1_OddsBySameKey(40, "Hard1_OddsBySameKey", "Hard1の前で同調を継続する確率", + "Min=0.f,Max=100.f", &mData), + mHard1F_OddsBySameKey(20, "Hard1F_OddsBySameKey", "Hard1の後で同調を継続する確率", + "Min=0.f,Max=100.f", &mData), + mOddsByKeySubId0(50, "OddsByKeySubId0", "調内タイプのAorBの確率", "Min=0.f,Max=100.f", + &mData), + mTension_SkipEasy2(25, "Tension_SkipEasy2", "Easy2をスキップする緊迫度", "Min=0,Max=100", + &mData), + mTension_SkipEasy5(50, "Tension_SkipEasy5", "Easy5をスキップする緊迫度", "Min=0,Max=100", + &mData), + mTension_SkipMiddle1(70, "Tension_SkipMiddle1", "Middle1をスキップする緊迫度", + "Min=0,Max=100", &mData), + mTension_SkipHard(39, "Tension_SkipHard", "Hardに進む緊迫度", "Min=0,Max=100", &mData), + mReserveHitWaitBeat(1, "ReserveHitWaitBeat", "何拍先に予約するか", "Min=0,Max=10", &mData), + mHitChainGridThreshold(18, "HitChainGridThreshold", + "このグリッド以上ヒット間隔が空いたらコンボをリセット", "Min=1,Max=20", + &mData), + mIgnoreReserveHitGrid_Chain0(3, "IgnoreReserveHitGrid_Chain0", "ヒット波形0", "Min=0,Max=10", + &mData), + mIgnoreReserveHitGrid_Chain1(2, "IgnoreReserveHitGrid_Chain1", "ヒット波形1", "Min=0,Max=10", + &mData), + mIgnoreReserveHitGrid_Chain2(5, "IgnoreReserveHitGrid_Chain2", "ヒット波形2", "Min=0,Max=10", + &mData), + mStopMainBgmWaitBeat(0, "StopMainBgmWaitBeat", "何拍先に通常波形を止めるか", "Min=0,Max=5", + &mData), + mReserveOutroWaitBeat(0, "ReserveOutroWaitBeat", "何拍先にアウトロ予約するか", "Min=0,Max=10", + &mData) {} + +void FieldBattleBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +BossBgmInfo::BossBgmInfo() + : mPlayWaitSec(2, "PlayWaitSec", "再生開始までの待ち秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(5, "FadeOutSec", "見失った時のフェードアウト秒", "Min=0.f,Max=10.f", &mData), + mOutroWaitSec(0, "OutroWaitSec", "アウトロ開始待ち秒", "Min=0.f,Max=10.f", &mData), + mChangeTypeFadeOutSec(4, "ChangeTypeFadeOutSec", "ゲージ表示敵切替時のフェードアウト秒", + "Min=0.f,Max=10.f", &mData), + mFeelPlayingSec(3, "FeelPlayingSec", + "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData) {} + +void BossBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +// GolemBgmInfo and GiantBgmInfo functions never defined in code, but are just references to +// BossBgmInfo functions +GolemBgmInfo::GolemBgmInfo() = default; + +GiantBgmInfo::GiantBgmInfo() = default; + +SandwormBgmInfo::SandwormBgmInfo() + : mAngryStartFadeSec(1, "AngryStartFadeSec", "怒り開始時クロスフェード秒", "Min=0.f,Max=5.f", + &mData), + mAngryEndFadeSec(1, "AngryEndFadeSec", "怒り終了時クロスフェード秒", "Min=0.f,Max=5.f", + &mData), + mChanceStartWaitSec(0.5, "ChanceStartWaitSec", "チャンスタイム開始待ち秒", "Min=0.f,Max=5.f", + &mData) {} + +AssassinSeniorBgmInfo::AssassinSeniorBgmInfo() + : mFadeOutSec(5, "FadeOutSec", "範囲外によるフェードアウト秒", "Min=0.f,Max=10.f", &mData), + mToDemoFadeSec(0.5, "ToDemoFadeSec", "デモ開始時トラックフェードアウト秒", "Min=0.f,Max=10.f", + &mData), + mToBattleFadeSec(0.5, "ToBattleFadeSec", "デモ終了時トラックフェードイン秒", + "Min=0.f,Max=10.f", &mData), + mFeelPlayingSec(0.4, "FeelPlayingSec", + "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData) {} + +void AssassinSeniorBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +GuardianBgmInfo::GuardianBgmInfo() + : mPlayWaitSec(0.35, "PlayWaitSec", "再生開始までの待ち秒", "Min=0.f,Max=10.f", &mData), + mFadeOutWaitSec(3, "FadeOutWaitSec", "フェードアウト待ち秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(5, "FadeOutSec", "フェードアウト秒", "Min=0.f,Max=10.f", &mData), + mFeelPlayingSec(0.4, "FeelPlayingSec", + "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData), + mDamageThresholdHitReserve(100, "DamageThresholdHitReserve", "ヒット予約するダメージ量", + "Min=10,Max=500", &mData), + mCancelHitSec(1.8, "CancelHitSec", "ヒット予約後マーカーがすぐこない場合の予約破棄までの秒数", + "Min=0.1f,Max=10.f", &mData), + mIgnoreReserveCountDownSec(3.9, "IgnoreReserveCountDownSec", + "ヒット波形再生開始後、再予約を許可するまでの秒数", + "Min=0.f,Max=10.f", &mData), + mMarkerIdHitSectionB(39, "MarkerIdHitSectionB", "次がこのID以上なら「B」", "Min=0,Max=100", + &mData), + mMarkerIdHitSectionC(54, "MarkerIdHitSectionC", "次がこのID以上なら「C」", "Min=0,Max=100", + &mData), + mMarkerIdHitSectionA(61, "MarkerIdHitSectionA", "次がこのID以上ならまわって「A」", + "Min=0,Max=100", &mData), + mMarkerCallbackOffsetSample( + -2850, "MarkerCallbackOffsetSample", + "マーカーコールバックのオフセットサンプル数(負にすると実際より手前で返る)", + "Min=-32000,Max=32000", &mData) {} + +void GuardianBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +GuardianFixedBgmInfo::GuardianFixedBgmInfo() + : mPlayWaitSec(0.35, "PlayWaitSec", "再生開始までの待ち秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(5, "FadeOutSec", "フェードアウト秒", "Min=0.f,Max=10.f", &mData), + mFadeWaitSec(1, "FadeWaitSec", "フェードアウト開始までの待ち秒", "Min=0.f,Max=10.f", &mData), + mFeelPlayingSec(0.4, "FeelPlayingSec", + "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData) {} + +void GuardianFixedBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +DragonBgmInfo::ParamPerType::ParamPerType() + : mDistanceThreshold(200, "DistanceThreshold", "再生開始する距離", "Min = 50.f,Max=400.f", + this), + mPlayWaitSec(1, "PlayWaitSec", "再生待ち秒", "Min=0.f,Max=10.f", this), + mFadeInSec(6, "FadeInSec", "フェードイン秒", "Min=0.f,Max=20.f", this), + mFadeWaitSec(3, "FadeWaitSec", "再生終了待ち秒", "Min=0.f,Max=20.f", this), + mFadeOutSec(8, "FadeOutSec", "フェードアウト秒", "Min=0.f,Max=20.f", this) {} + +void DragonBgmInfo::init(sead::Heap* heap) { + addList(&mData, "MusicParam"); + mParamPerTypes.allocBufferAssert(DragonEnum::size(), heap); + for (int i = 0; i < DragonEnum::size(); i++) { + mData.addObj(&mParamPerTypes[i], + sead::FormatFixedSafeString<32>("ParamPerType_%s", DragonEnum(i).text())); + } + applySoundResource(); +} + +GanonGrudgeBattleBgmInfo::GanonGrudgeBattleBgmInfo() + : mFadeInSec(1, "FadeInSec", "フェードイン秒", "Min=0.f,Max=10.f", &mData), + mFadeOutSec(2, "FadeOutSec", "フェードアウト秒", "Min=0.f,Max=10.f", &mData), + mFeelPlayingSec(0.4, "FeelPlayingSec", + "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData) {} + +void GanonGrudgeBattleBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +EventBgmRemainsElecBattleInfo::EventBgmRemainsElecBattleInfo() + : mMinVolumeOutStorm(0.2, "MinVolumeOutStorm", "条件外の時の音量", "Min=0.f, Max=1.f", &mData), + mFadeInSecOutStorm(3, "FadeInSecOutStorm", "フェードイン秒", "Min=0.f,Max=5.f", &mData), + mFadeOutSecOutStorm(3, "FadeOutSecOutStorm", "フェードアウト秒", "Min=0.f,Max=5.f", &mData), + mMinVolumeWakeBoarding(0, "MinVolumeWakeBoarding", "条件外の時の音量", "Min=0.f,Max=1.f", + &mData), + mFadeInSecWakeBoarding(0.1, "FadeInSecWakeBoarding", "フェードイン秒", "Min=0.f,Max=5.f", + &mData), + mFadeOutSecWakeBoarding(0.1, "FadeOutSecWakeBoarding", "フェードアウト秒", "Min=0.f,Max=5.f", + &mData) {} + +void EventBgmRemainsElecBattleInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +EventBgmRemainsFireBattleInfo::EventBgmRemainsFireBattleInfo() + : mFoundFadeOutSec(0.1, "FoundFadeOutSec", "警報時フェードアウト秒", "Min=0.f, Max=5.f", + &mData), + mFoundWaitSec(2, "FoundWaitSec", "警報時(初回)の次のkey再生待ち秒", "Min=0.f,Max=5.f", + &mData), + mFoundAgainWaitSec(1, "FoundAgainWaitSec", "警報時(二回目以降)の次のkey再生待ち秒", + "Min=0.f,Max=5.f", &mData) {} + +void EventBgmRemainsFireBattleInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +DungeonNormalBgmInfo::PartChangeOdds::PartChangeOdds() + : mOdds_1To1(50, "Odds_1To1", "今回パート数1を選ぶ確率(%)", "Min=0.f,Max=100.f", this), + mOdds_2To1(50, "Odds_2To1", "今回パート数1を選ぶ確率(%)", "Min=0.f,Max=100.f", this), + mOdds_2To2(50, "Odds_2To2", "今回パート数2を選ぶ確率(%)", "Min=0.f,Max=100.f", this), + mOdds_3To2(50, "Odds_3To2", "今回パート数2を選ぶ確率(%)", "Min=0.f,Max=100.f", this), + mOdds_3To3(50, "Odds_3To3", "今回パート数3を選ぶ確率(%)", "Min=0.f,Max=100.f", this), + mOdds_4To3(50, "Odds_4To3", "今回パート数3を選ぶ確率(%)", "Min=0.f,Max=100.f", this) {} + +DungeonNormalBgmInfo::DungeonNormalBgmInfo() + : mLoopNumForOddsId2(10, "LoopNumForOddsId2", "確率パターンが2になるループ回数", "Min=0,Max=50", + &mData), + mLoopNumForOddsId3(20, "LoopNumForOddsId3", "確率パターンが3になるループ回数", "Min=0,Max=50", + &mData), + mMaxPartChainThreshold(4, "MaxPartChainThreshold", + "パート数最大が何回続いたらループ回数リセットするか", "Min=0,Max=10", + &mData), + mOdds_FirstArp(50, "Odds_FirstArp", + "初回にアルペジオorストリングベースでアルペジオを選ぶ確率(%)", + "Min=0.f,Max=100.f", &mData), + mTitleDelaySec(0, "TitleDelaySec", "ダンジョンのタイトルが消えてから再生開始までの時間(秒)", + "Min=0.f,Max=10.f", &mData) {} + +void DungeonNormalBgmInfo::init(sead::Heap* heap) { + addList(&mHeader, "MusicParam"); + static constexpr int NumPartChangeOdds = 3; + mPartChangeOdds.allocBufferAssert(NumPartChangeOdds, heap); + for (int i = 0; i < NumPartChangeOdds; i++) + mHeader.addObj(&mPartChangeOdds[i], sead::FormatFixedSafeString<32>("PartChangeOdds%d", i)); + applySoundResource(); +} + +DungeonRewardBgmInfo::DungeonRewardBgmInfo() + : mOddsPlayableString(50, "OddsPlayableString", "ストリングスが選ばれる確率(%)", + "Min=0.f, Max=100.f", &mData), + mTitleDelaySec(0, "TitleDelaySec", "ダンジョンのタイトルが消えてから再生開始までの時間(秒)", + "Min=0.f,Max=10.f", &mData) {} + +void DungeonRewardBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +DungeonBattleBgmInfo::DungeonBattleBgmInfo() + : mPlayWaitSec(1, "PlayWaitSec", "緊迫発生から再生開始までの待ち秒", "Min=0.f, Max=10.f", + &mData), + mFadeOutSec(5, "FadeOutSec", "緊迫解除時のフェードアウト秒", "Min=0.f,Max=10.f", &mData), + mVolumeNormal(3, "VolumeNormal", "再生開始後、この秒数を越えたら他セクションに再生中と通知", + "Min=0.f,Max=10.f", &mData) {} + +void DungeonBattleBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +RemainsNormalBgmInfo::RemainsNormalBgmInfo() + : mFadeOutSecA(2, "FadeOutSecA", "A→Bの時のAのフェードアウト秒", "Min=0.f, Max=10.f", &mData), + mFadeOutSecB(0, "FadeOutSecB", "B→Zの時のBのフェードアウト秒", "Min=0.f, Max=10.f", &mData), + mFadeOutSecZ(2, "FadeOutSecZ", "Z→ボスの時のZのフェードアウト秒", "Min=0.f, Max=10.f", + &mData), + mCrossFadeSec(1, "CrossFadeSec", "B内のクロスフェード秒", "Min=0.f, Max=10.f", &mData) {} + +void RemainsNormalBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +TutorialDungeonBattleBgmInfo::TutorialDungeonBattleBgmInfo() + : mTransitionDelaySec(0.46, "TransitionDelaySec", "ステップ間の再生待ち秒", &mData), + mOutroDelaySec(0, "OutroDelaySec", "アウトロ開始前の待ち秒", &mData) {} + +void TutorialDungeonBattleBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +GanonBeastBgmInfo::GanonBeastBgmInfo() + : mStartDelaySec(0.5, "StartDelaySec", "開始時の再生待ち秒", &mData), + mRetryDelaySec(0.5, "RetryDelaySec", "リトライ時の再生待ち秒", &mData), + m1To2TransitionDelaySec(1, "1To2TransitionDelaySec", "レベル1→2の再生待ち秒", &mData), + m2To3TransitionDelaySec(1, "2To3TransitionDelaySec", "レベル2→3の再生待ち秒", &mData), + mFadeOutSec(0.25, "FadeOutSec", "切り替わり時のフェードアウト秒", &mData) {} + +void GanonBeastBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +FinalTrialBossBattleBgmInfo::FinalTrialBossBattleBgmInfo() + : mTransformDemoWaitSec(1, "TransformDemoWaitSec", "変化デモトラックチェンジ待ち秒", &mData), + mFadeSecToTransformDemo(1, "FadeSecToTransformDemo", "変化デモトラックへのクロスフェード秒", + &mData), + mCurveTypeToTransformDemo( + 1, "CurveTypeToTransformDemo", + "変化デモトラックへのカーブタイプ(0=リニア,1=二乗,2=平方根,3=サイン)", &mData), + mFadeSecFromTransformDemo(1, "FadeSecFromTransformDemo", + "変化デモからインゲームへのクロスフェード秒", &mData), + mCurveTypeFromTransformDemo( + 1, "CurveTypeFromTransformDemo", + "変化デモからインゲームへのカーブタイプ(0=リニア,1=二乗,2=平方根,3=サイン)", &mData), + mFadeSeLevel3To4(1, "FadeSecLevel3To4", "レベル3から4へのクロスフェード秒", &mData), + mCurveTypeLevel3To4(1, "CurveTypeLevel3To4", + "レベル3から4へのカーブタイプ(0=リニア,1=二乗,2=平方根,3=サイン)", + &mData), + mStopFadeSec(1, "StopFadeSec", "停止時のフェード秒", &mData) {} + +void FinalTrialBossBattleBgmInfo::init(sead::Heap* heap) { + addObj(&mData, "MusicParam"); + applySoundResource(); +} + +EnvPaletteReactiveBgmInfo::ParamPerType::ParamPerType() + : mPlayWaitSec(2, "PlayWaitSec", "再生待ち秒", "Min = 0.1f, Max = 10.f", this), + mFadeInSec(5, "FadeInSec", "フェードイン秒", this), + mFadeOutSec(3, "FadeOutSec", "フェードアウト秒", this) {} + +void EnvPaletteReactiveBgmInfo::init(sead::Heap* heap) { + addList(&mData, "MusicParam"); + mParamPerTypes.allocBufferAssert(EnvPaletteReactiveBgmEnum::size(), heap); + for (int i = 0; i < EnvPaletteReactiveBgmEnum::size(); i++) { + mData.addObj(&mParamPerTypes[i], + sead::FormatFixedSafeString<32>("ParamPerType_%s", + EnvPaletteReactiveBgmEnum(i).text())); + } + applySoundResource(); +} + +} // namespace ksys::snd diff --git a/src/KingSystem/Sound/sndMusicInfo.h b/src/KingSystem/Sound/sndMusicInfo.h new file mode 100644 index 00000000..fcf78bd8 --- /dev/null +++ b/src/KingSystem/Sound/sndMusicInfo.h @@ -0,0 +1,596 @@ +#pragma once + +#include <agl/Utils/aglParameter.h> +#include <agl/Utils/aglParameterIO.h> +#include <agl/Utils/aglParameterList.h> +#include <agl/Utils/aglParameterObj.h> +#include <container/seadBuffer.h> +#include <prim/seadEnum.h> +#include <prim/seadSafeString.h> +#include <resource/seadResource.h> + +#include "KingSystem/Utils/Types.h" + +namespace ksys::snd { + +class MusicInfo : public agl::utl::IParameterIO { +public: + template <typename T> + struct MinMax : public agl::utl::IParameterObj { + MinMax(T min, T max, const sead::SafeString& name, const sead::SafeString& label, + const sead::SafeString& meta, agl::utl::IParameterList* parent) + : mLabel(label), mMeta(meta), mMin(min, "Min", "最小", mMeta, this), + mMax(max, "Max", "最大", mMeta, this) { + parent->addObj(this, name); + } + + sead::FixedSafeString<64> mLabel; + sead::FixedSafeString<32> mMeta; + agl::utl::Parameter<T> mMin; + agl::utl::Parameter<T> mMax; + }; + + MusicInfo() : IParameterIO("mscinfo", 0) {} + virtual void init(sead::Heap* heap) {} + +protected: + void applySoundResource(); + +private: + // TODO: 0x7101015628, requires `Sound` and `snd::ResourceMgr` + sead::DirectResource* loadMusic(); + +protected: + sead::SafeString mBgmTypeName; +}; + +class EnvBgmInfo : public MusicInfo { +public: + SEAD_ENUM(EnvTimeEnum,EnvDayBgm,EnvNightBgm) + + struct ParamPerType : public agl::utl::IParameterObj { + ParamPerType(); + + agl::utl::Parameter<unsigned int> mBpm; + agl::utl::Parameter<unsigned int> mPart0FirstWaitCount; + agl::utl::Parameter<unsigned int> mPart1FirstWaitCount; + agl::utl::Parameter<unsigned int> mPart2FirstWaitCount; + agl::utl::Parameter<unsigned int> mPart3FirstWaitCount; + }; + KSYS_CHECK_SIZE_NX150(ParamPerType, 0xD0); + + EnvBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterList mHeader; + agl::utl::IParameterObj mData; + +public: + sead::Buffer<EnvBgmInfo::ParamPerType> mParamPerTypes; + agl::utl::Parameter<float> mEnableWaitSec; + agl::utl::Parameter<int> mDistanceOfCheckingActiveEnemy; + agl::utl::Parameter<float> mTimeDay; + agl::utl::Parameter<float> mTimeNight; + MinMax<float> mConstVolume; + MinMax<float> mConstPan; + agl::utl::Parameter<unsigned int> mMasterBeatBase; + MinMax<int> mMasterBeatRate; + MinMax<float> mPart0Volume; + MinMax<float> mPart0Pan; + agl::utl::Parameter<unsigned int> mPart1SegmentAWaitCountBase; + MinMax<unsigned int> mPart1SegmentAWaitCountRate; + agl::utl::Parameter<unsigned int> mPart1SegmentBWaitCountBase; + MinMax<unsigned int> mPart1SegmentBWaitCountRate; + agl::utl::Parameter<unsigned int> mPart1SegmentCWaitCountBase; + MinMax<unsigned int> mPart1SegmentCWaitCountRate; + MinMax<float> mPart1Volume; + MinMax<float> mPart1Pan; + agl::utl::Parameter<unsigned int> mPart2WaitCountBase; + MinMax<unsigned int> mPart2WaitCountRate; + MinMax<float> mPart2Volume; + agl::utl::Parameter<unsigned int> mPart3WaitCountBase; + MinMax<unsigned int> mPart3WaitCountRate; + MinMax<float> mPart3Volume; + MinMax<float> mPart3Pan; +}; +KSYS_CHECK_SIZE_NX150(EnvBgmInfo, 0x12A8); + +class HorseBgmInfo : public MusicInfo { +public: + HorseBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mTimeDay; + agl::utl::Parameter<float> mTimeNight; + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mMinVolume; + agl::utl::Parameter<float> mFadeOutWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mPlayingSecUseOutro; + agl::utl::Parameter<float> mIgnoreRequestSec; +}; +KSYS_CHECK_SIZE_NX150(HorseBgmInfo, 0x330); + +class TemperatureBgmInfo : public MusicInfo { +public: + SEAD_ENUM(TemperatureEnum,ColdBgm,HotBgm,BurnBgm) + + struct ParamPerType : public agl::utl::IParameterObj { + ParamPerType(); + + agl::utl::Parameter<float> mTemperatureThreshold; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mCancelFadeSec; + }; + KSYS_CHECK_SIZE_NX150(ParamPerType, 0x90); + + TemperatureBgmInfo() = default; + ~TemperatureBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterList mData; + +public: + sead::Buffer<ParamPerType> mParamPerTypes; +}; +KSYS_CHECK_SIZE_NX150(TemperatureBgmInfo, 0x238); + +class SpotBgmInfo : public MusicInfo { +public: + SpotBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mTimeDay; + agl::utl::Parameter<float> mTimeNight; + agl::utl::Parameter<float> mFilterOnFadeSec; + agl::utl::Parameter<float> mFilterOffFadeSec; + agl::utl::Parameter<float> mFilterValueLo; + agl::utl::Parameter<float> mFilterValueHi; + agl::utl::Parameter<float> mSubTrackNearDistance; + agl::utl::Parameter<float> mSubTrackFarDistance; + agl::utl::Parameter<float> mSubTrackVolumeMaxDelta; + agl::utl::Parameter<float> mAllowFadeInSec; + agl::utl::Parameter<float> mAllowFadeOutSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mCullingYFadeOutSec; + agl::utl::Parameter<float> mCullingYFadeInSec; +}; +KSYS_CHECK_SIZE_NX150(SpotBgmInfo, 0x3D0); + +class MazeForestBgmInfo : public MusicInfo { +public: + MazeForestBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mVolumeNormal; + agl::utl::Parameter<float> mLostBoostSec; + agl::utl::Parameter<float> mLostBoostCancelSec; +}; +KSYS_CHECK_SIZE_NX150(MazeForestBgmInfo, 0x2D0); + +class CastleBgmInfo : public MusicInfo { +public: + CastleBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mFadeOutWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mToIndoorWaitSec; + agl::utl::Parameter<float> mToIndoorFadeSec; + agl::utl::Parameter<float> mToOutdoorFadeSec; + agl::utl::Parameter<float> mBattleWaitSec; + agl::utl::Parameter<float> mBattleFadeInSec; + agl::utl::Parameter<float> mBattleFadeOutSec; +}; +KSYS_CHECK_SIZE_NX150(CastleBgmInfo, 0x310); + +class BigMazeBgmInfo : public MusicInfo { +public: + BigMazeBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeOutSec; +}; +KSYS_CHECK_SIZE_NX150(BigMazeBgmInfo, 0x270); + +class AnimalMasterBgmInfo : public MusicInfo { +public: + AnimalMasterBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeOutSec; +}; +KSYS_CHECK_SIZE_NX150(BigMazeBgmInfo, 0x270); + +class FieldBattleBgmInfo : public MusicInfo { +public: + FieldBattleBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<unsigned int> mBpm; + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mFeelPlayingSec; + agl::utl::Parameter<float> mEasy1_OddsByKey0; + agl::utl::Parameter<float> mEasy1_OddsByKey1; + agl::utl::Parameter<float> mEasy1R_OddsBySameKey; + agl::utl::Parameter<float> mEasy5_OddsBySameKey; + agl::utl::Parameter<float> mMiddle0_OddsBySameKey; + agl::utl::Parameter<float> mHard0_OddsBySameKey; + agl::utl::Parameter<float> mHard1_OddsBySameKey; + agl::utl::Parameter<float> mHard1F_OddsBySameKey; + agl::utl::Parameter<float> mOddsByKeySubId0; + agl::utl::Parameter<int> mTension_SkipEasy2; + agl::utl::Parameter<int> mTension_SkipEasy5; + agl::utl::Parameter<int> mTension_SkipMiddle1; + agl::utl::Parameter<int> mTension_SkipHard; + agl::utl::Parameter<unsigned int> mReserveHitWaitBeat; + agl::utl::Parameter<unsigned int> mHitChainGridThreshold; + agl::utl::Parameter<unsigned int> mIgnoreReserveHitGrid_Chain0; + agl::utl::Parameter<unsigned int> mIgnoreReserveHitGrid_Chain1; + agl::utl::Parameter<unsigned int> mIgnoreReserveHitGrid_Chain2; + agl::utl::Parameter<int> mStopMainBgmWaitBeat; + agl::utl::Parameter<unsigned int> mReserveOutroWaitBeat; +}; +KSYS_CHECK_SIZE_NX150(FieldBattleBgmInfo, 0x530); + +class BossBgmInfo : public MusicInfo { +public: + BossBgmInfo(); + void init(sead::Heap* heap) override; + +protected: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mOutroWaitSec; + agl::utl::Parameter<float> mChangeTypeFadeOutSec; + agl::utl::Parameter<float> mFeelPlayingSec; +}; +KSYS_CHECK_SIZE_NX150(BossBgmInfo, 0x2B0); + +class GolemBgmInfo : public BossBgmInfo { +public: + GolemBgmInfo(); +}; +KSYS_CHECK_SIZE_NX150(GolemBgmInfo, 0x2B0); + +class GiantBgmInfo : public BossBgmInfo { +public: + GiantBgmInfo(); +}; +KSYS_CHECK_SIZE_NX150(GiantBgmInfo, 0x2B0); + +class SandwormBgmInfo : public BossBgmInfo { +public: + SandwormBgmInfo(); + +private: + agl::utl::Parameter<float> mAngryStartFadeSec; + agl::utl::Parameter<float> mAngryEndFadeSec; + agl::utl::Parameter<float> mChanceStartWaitSec; +}; +KSYS_CHECK_SIZE_NX150(SandwormBgmInfo, 0x310); + +class AssassinSeniorBgmInfo : public MusicInfo { +public: + AssassinSeniorBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mToDemoFadeSec; + agl::utl::Parameter<float> mToBattleFadeSec; + agl::utl::Parameter<float> mFeelPlayingSec; +}; +KSYS_CHECK_SIZE_NX150(AssassinSeniorBgmInfo, 0x290); + +class GuardianBgmInfo : public MusicInfo { +public: + GuardianBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeOutWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mFeelPlayingSec; + agl::utl::Parameter<int> mDamageThresholdHitReserve; + agl::utl::Parameter<float> mCancelHitSec; + agl::utl::Parameter<float> mIgnoreReserveCountDownSec; + agl::utl::Parameter<unsigned int> mMarkerIdHitSectionB; + agl::utl::Parameter<unsigned int> mMarkerIdHitSectionC; + agl::utl::Parameter<unsigned int> mMarkerIdHitSectionA; + agl::utl::Parameter<int> mMarkerCallbackOffsetSample; +}; +KSYS_CHECK_SIZE_NX150(GuardianBgmInfo, 0x370); + +class GuardianFixedBgmInfo : public MusicInfo { +public: + GuardianFixedBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mFadeWaitSec; + agl::utl::Parameter<float> mFeelPlayingSec; +}; +KSYS_CHECK_SIZE_NX150(GuardianFixedBgmInfo, 0x290); + +class DragonBgmInfo : public MusicInfo { +public: + SEAD_ENUM(DragonEnum,DragonBgm,GrudgeDragonBgm) + + struct ParamPerType : public agl::utl::IParameterObj { + agl::utl::Parameter<float> mDistanceThreshold; + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + + ParamPerType(); + }; + + DragonBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterList mData; + +public: + sead::Buffer<ParamPerType> mParamPerTypes; +}; +KSYS_CHECK_SIZE_NX150(DragonBgmInfo, 0x238); + +class GanonGrudgeBattleBgmInfo : public MusicInfo { +public: + GanonGrudgeBattleBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mFeelPlayingSec; +}; +KSYS_CHECK_SIZE_NX150(GanonGrudgeBattleBgmInfo, 0x270); + +class EventBgmRemainsElecBattleInfo : public MusicInfo { +public: + EventBgmRemainsElecBattleInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mMinVolumeOutStorm; + agl::utl::Parameter<float> mFadeInSecOutStorm; + agl::utl::Parameter<float> mFadeOutSecOutStorm; + agl::utl::Parameter<float> mMinVolumeWakeBoarding; + agl::utl::Parameter<float> mFadeInSecWakeBoarding; + agl::utl::Parameter<float> mFadeOutSecWakeBoarding; +}; +KSYS_CHECK_SIZE_NX150(EventBgmRemainsElecBattleInfo, 0x2d0); + +class EventBgmRemainsFireBattleInfo : public MusicInfo { +public: + EventBgmRemainsFireBattleInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mFoundFadeOutSec; + agl::utl::Parameter<float> mFoundWaitSec; + agl::utl::Parameter<float> mFoundAgainWaitSec; +}; +KSYS_CHECK_SIZE_NX150(EventBgmRemainsFireBattleInfo, 0x270); + +class DungeonNormalBgmInfo : public MusicInfo { +public: + struct PartChangeOdds : public agl::utl::IParameterObj { + PartChangeOdds(); + agl::utl::Parameter<float> mOdds_1To1; + agl::utl::Parameter<float> mOdds_2To1; + agl::utl::Parameter<float> mOdds_2To2; + agl::utl::Parameter<float> mOdds_3To2; + agl::utl::Parameter<float> mOdds_3To3; + agl::utl::Parameter<float> mOdds_4To3; + }; + + DungeonNormalBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterList mHeader; + +public: + sead::Buffer<PartChangeOdds> mPartChangeOdds; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<unsigned int> mLoopNumForOddsId2; + agl::utl::Parameter<unsigned int> mLoopNumForOddsId3; + agl::utl::Parameter<unsigned int> mMaxPartChainThreshold; + agl::utl::Parameter<float> mOdds_FirstArp; + agl::utl::Parameter<float> mTitleDelaySec; +}; +KSYS_CHECK_SIZE_NX150(DungeonNormalBgmInfo, 0x308); + +class DungeonRewardBgmInfo : public MusicInfo { +public: + DungeonRewardBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mOddsPlayableString; + agl::utl::Parameter<float> mTitleDelaySec; +}; +KSYS_CHECK_SIZE_NX150(DungeonRewardBgmInfo, 0x250); + +class DungeonBattleBgmInfo : public MusicInfo { +public: + DungeonBattleBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeOutSec; + agl::utl::Parameter<float> mVolumeNormal; +}; +KSYS_CHECK_SIZE_NX150(DungeonBattleBgmInfo, 0x270); + +class RemainsNormalBgmInfo : public MusicInfo { +public: + RemainsNormalBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mFadeOutSecA; + agl::utl::Parameter<float> mFadeOutSecB; + agl::utl::Parameter<float> mFadeOutSecZ; + agl::utl::Parameter<float> mCrossFadeSec; +}; +KSYS_CHECK_SIZE_NX150(RemainsNormalBgmInfo, 0x290); + +class TutorialDungeonBattleBgmInfo : public MusicInfo { +public: + TutorialDungeonBattleBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mTransitionDelaySec; + agl::utl::Parameter<float> mOutroDelaySec; +}; +KSYS_CHECK_SIZE_NX150(TutorialDungeonBattleBgmInfo, 0x250); + +class GanonBeastBgmInfo : public MusicInfo { +public: + GanonBeastBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mStartDelaySec; + agl::utl::Parameter<float> mRetryDelaySec; + agl::utl::Parameter<float> m1To2TransitionDelaySec; + agl::utl::Parameter<float> m2To3TransitionDelaySec; + agl::utl::Parameter<float> mFadeOutSec; +}; +KSYS_CHECK_SIZE_NX150(GanonBeastBgmInfo, 0x2b0); + +class FinalTrialBossBattleBgmInfo : public MusicInfo { +public: + FinalTrialBossBattleBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterObj mData; + +public: + agl::utl::Parameter<float> mTransformDemoWaitSec; + agl::utl::Parameter<float> mFadeSecToTransformDemo; + agl::utl::Parameter<unsigned int> mCurveTypeToTransformDemo; + agl::utl::Parameter<float> mFadeSecFromTransformDemo; + agl::utl::Parameter<unsigned int> mCurveTypeFromTransformDemo; + agl::utl::Parameter<float> mFadeSeLevel3To4; + agl::utl::Parameter<unsigned int> mCurveTypeLevel3To4; + agl::utl::Parameter<float> mStopFadeSec; +}; +KSYS_CHECK_SIZE_NX150(FinalTrialBossBattleBgmInfo, 0x310); + +class EnvPaletteReactiveBgmInfo : public MusicInfo { +public: + SEAD_ENUM(EnvPaletteReactiveBgmEnum,DLC2nd_OneHitKillTrial) + + struct ParamPerType : public agl::utl::IParameterObj { + agl::utl::Parameter<float> mPlayWaitSec; + agl::utl::Parameter<float> mFadeInSec; + agl::utl::Parameter<float> mFadeOutSec; + + ParamPerType(); + }; + + EnvPaletteReactiveBgmInfo(); + void init(sead::Heap* heap) override; + +private: + agl::utl::IParameterList mData; + +public: + sead::Buffer<ParamPerType> mParamPerTypes; +}; +KSYS_CHECK_SIZE_NX150(EnvPaletteReactiveBgmInfo, 0x238); + +} // namespace ksys::snd |
