From ea0cb66eae592456e1c9187082bb09c490bb1f86 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 7 Apr 2024 14:08:06 +0200 Subject: [PATCH] chore: dump iw5 weapon sound overrides --- src/Common/Game/IW5/IW5.h | 1 + src/Common/Game/IW5/IW5_Assets.h | 17 ++++-- .../Game/IW5/InfoString/WeaponFields.h | 11 +++- .../IW5/AssetDumpers/AssetDumperWeapon.cpp | 53 +++++++++++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/Common/Game/IW5/IW5.h b/src/Common/Game/IW5/IW5.h index 33f0f237..01917beb 100644 --- a/src/Common/Game/IW5/IW5.h +++ b/src/Common/Game/IW5/IW5.h @@ -117,6 +117,7 @@ namespace IW5 WFT_ANIM_NAME, WFT_ATTACHMENT, WFT_ANIM_OVERRIDES, + WFT_SOUND_OVERRIDES, WFT_NUM_FIELD_TYPES, }; diff --git a/src/Common/Game/IW5/IW5_Assets.h b/src/Common/Game/IW5/IW5_Assets.h index cfaf08f8..67c224b3 100644 --- a/src/Common/Game/IW5/IW5_Assets.h +++ b/src/Common/Game/IW5/IW5_Assets.h @@ -3923,13 +3923,24 @@ namespace IW5 int altTime; }; + enum SoundOverrideTypes : unsigned int + { + SNDTYPE_NONE = 0x0, + SNDTYPE_FIRE = 0x1, + SNDTYPE_PLAYER_FIRE = 0x2, + SNDTYPE_PLAYER_AKIMBO = 0x3, + SNDTYPE_PLAYER_LASTSHOT = 0x4, + + SNDTYPE_PLAYER_COUNT + }; + struct SoundOverrideEntry { - unsigned short attachment1; - unsigned short attachment2; + WeaponAttachmentCombination attachment1; + WeaponAttachmentCombination attachment2; SndAliasCustom overrideSound; SndAliasCustom altmodeSound; - unsigned int soundType; + SoundOverrideTypes soundType; }; struct FXOverrideEntry diff --git a/src/ObjCommon/Game/IW5/InfoString/WeaponFields.h b/src/ObjCommon/Game/IW5/InfoString/WeaponFields.h index 97daf1e7..b75514df 100644 --- a/src/ObjCommon/Game/IW5/InfoString/WeaponFields.h +++ b/src/ObjCommon/Game/IW5/InfoString/WeaponFields.h @@ -4,7 +4,6 @@ namespace IW5 { // WeaponCompleteDef: - // TODO: soundOverrides // TODO: fxOverrides // TODO: reloadOverrides // TODO: notetrackOverrides @@ -734,6 +733,7 @@ namespace IW5 {"missileConeSoundCrossfadeBottomSize", offsetof(WeaponFullDef, weapDef.missileConeSoundCrossfadeBottomSize), CSPFT_FLOAT }, {"attachments", offsetof(WeaponFullDef, scopes), WFT_ATTACHMENT }, {"animOverrides", offsetof(WeaponFullDef, weapCompleteDef.animOverrides), WFT_ANIM_OVERRIDES }, + {"soundOverrides", offsetof(WeaponFullDef, weapCompleteDef.soundOverrides), WFT_SOUND_OVERRIDES }, }; inline const char* szWeapTypeNames[]{ @@ -925,4 +925,13 @@ namespace IW5 "ads_down", "alt_adjust", }; static_assert(std::extent_v == WEAP_ANIM_COUNT); + + inline const char* soundOverrideTypeNames[]{ + "none", + "fire", + "player_fire", + "player_akimbo", + "player_lastshot", + }; + static_assert(std::extent_v == SNDTYPE_PLAYER_COUNT); } // namespace IW5 diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp index 04e217b9..6cf3167f 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp @@ -221,6 +221,10 @@ namespace IW5 FillFromAnimOverrides(std::string(field.szName)); break; + case WFT_SOUND_OVERRIDES: + FillFromSoundOverrides(std::string(field.szName)); + break; + case WFT_NUM_FIELD_TYPES: default: assert(false); @@ -357,6 +361,55 @@ namespace IW5 m_info_string.SetValueForKey(key, ss.str()); } + void FillFromSoundOverrides(const std::string& key) + { + std::stringstream ss; + bool first = true; + + for (auto i = 0u; i < m_weapon->weapCompleteDef.numSoundOverrides; i++) + { + const auto& soundOverride = m_weapon->weapCompleteDef.soundOverrides[i]; + + if (!first) + ss << "\n"; + else + first = false; + + assert(soundOverride.soundType < SNDTYPE_PLAYER_COUNT); + + if (soundOverride.attachment1.fields) + ss << GetNameForSingleWeaponAttachment(soundOverride.attachment1); + else + ss << "none"; + + ss << ' '; + + if (soundOverride.attachment2.fields) + ss << GetNameForSingleWeaponAttachment(soundOverride.attachment2); + else + ss << "none"; + + ss << ' '; + + if (soundOverride.soundType < SNDTYPE_PLAYER_COUNT) + ss << soundOverrideTypeNames[soundOverride.soundType] << ' '; + + if (soundOverride.overrideSound.name && soundOverride.overrideSound.name->soundName && soundOverride.overrideSound.name->soundName[0]) + ss << soundOverride.overrideSound.name->soundName; + else + ss << "none"; + + ss << ' '; + + if (soundOverride.altmodeSound.name && soundOverride.altmodeSound.name->soundName && soundOverride.altmodeSound.name->soundName[0]) + ss << soundOverride.altmodeSound.name->soundName; + else + ss << "none"; + } + + m_info_string.SetValueForKey(key, ss.str()); + } + const WeaponFullDef* m_weapon; }; } // namespace IW5