diff --git a/src/Common/Game/IW5/IW5.h b/src/Common/Game/IW5/IW5.h index e6c58928..9b019bbf 100644 --- a/src/Common/Game/IW5/IW5.h +++ b/src/Common/Game/IW5/IW5.h @@ -120,7 +120,7 @@ namespace IW5 WFT_SOUND_OVERRIDES, WFT_FX_OVERRIDES, WFT_RELOAD_OVERRIDES, - WFT_NOTE_TRACK_OVERRIDES, + WFT_NOTETRACK_OVERRIDES, WFT_NUM_FIELD_TYPES, }; diff --git a/src/Common/Game/IW5/IW5_Assets.h b/src/Common/Game/IW5/IW5_Assets.h index 350a2dea..2ed9b192 100644 --- a/src/Common/Game/IW5/IW5_Assets.h +++ b/src/Common/Game/IW5/IW5_Assets.h @@ -3971,7 +3971,8 @@ namespace IW5 struct NoteTrackToSoundEntry { - int attachment; + WeaponAttachmentCombination attachment; + short unused; ScriptString* notetrackSoundMapKeys; ScriptString* notetrackSoundMapValues; }; diff --git a/src/ObjCommon/Game/IW5/InfoString/WeaponFields.h b/src/ObjCommon/Game/IW5/InfoString/WeaponFields.h index 9e6a34a7..19eaecbf 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: notetrackOverrides // TODO: iFireTimeAkimbo // TODO: iAltRaiseTimeAkimbo // TODO: fireAnimLengthAkimbo @@ -734,6 +733,7 @@ namespace IW5 {"soundOverrides", offsetof(WeaponFullDef, weapCompleteDef.soundOverrides), WFT_SOUND_OVERRIDES }, {"fxOverrides", offsetof(WeaponFullDef, weapCompleteDef.fxOverrides), WFT_FX_OVERRIDES }, {"reloadOverrides", offsetof(WeaponFullDef, weapCompleteDef.reloadOverrides), WFT_RELOAD_OVERRIDES }, + {"notetrackOverrides", offsetof(WeaponFullDef, weapCompleteDef.notetrackOverrides), WFT_NOTETRACK_OVERRIDES }, }; inline const char* szWeapTypeNames[]{ diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp index 06de0a3c..5afb7d22 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperWeapon.cpp @@ -233,6 +233,10 @@ namespace IW5 FillFromReloadOverrides(std::string(field.szName)); break; + case WFT_NOTETRACK_OVERRIDES: + FillFromNoteTrackOverrides(std::string(field.szName)); + break; + case WFT_NUM_FIELD_TYPES: default: assert(false); @@ -492,6 +496,40 @@ namespace IW5 m_info_string.SetValueForKey(key, ss.str()); } + void FillFromNoteTrackOverrides(const std::string& key) + { + std::stringstream ss; + bool first = true; + + for (auto i = 0u; i < m_weapon->weapCompleteDef.numNotetrackOverrides; i++) + { + const auto& noteTrackOverrides = m_weapon->weapCompleteDef.notetrackOverrides[i]; + + assert(noteTrackOverrides.notetrackSoundMapKeys || noteTrackOverrides.notetrackSoundMapValues); + if (!noteTrackOverrides.notetrackSoundMapKeys || !noteTrackOverrides.notetrackSoundMapValues) + continue; + + const auto attachmentName = noteTrackOverrides.attachment.fields ? GetNameForSingleWeaponAttachment(noteTrackOverrides.attachment) : "none"; + for (auto j = 0u; j < 24u; j++) + { + const auto& noteTrackKey = m_get_scr_string(noteTrackOverrides.notetrackSoundMapKeys[j]); + const auto& noteTrackValue = m_get_scr_string(noteTrackOverrides.notetrackSoundMapValues[j]); + + if (noteTrackKey.empty() || noteTrackValue.empty()) + continue; + + if (!first) + ss << "\n"; + else + first = false; + + ss << attachmentName << ' ' << noteTrackKey << ' ' << noteTrackValue; + } + } + + m_info_string.SetValueForKey(key, ss.str()); + } + const WeaponFullDef* m_weapon; }; } // namespace IW5