diff --git a/src/ObjCommon/Game/T6/InfoStringT6.cpp b/src/ObjCommon/Game/T6/InfoStringT6.cpp index 0adca4a7..800a8e31 100644 --- a/src/ObjCommon/Game/T6/InfoStringT6.cpp +++ b/src/ObjCommon/Game/T6/InfoStringT6.cpp @@ -72,53 +72,56 @@ void InfoStringFromStructConverter::FillFromBaseField(const cspField_t& field) } case CSPFT_XMODEL: - { - const auto* model = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + { + const auto* model = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - if (model) - m_info_string.SetValueForKey(std::string(field.szName), std::string(model->name)); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } + if (model) + m_info_string.SetValueForKey(std::string(field.szName), std::string(model->name)); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } case CSPFT_MATERIAL: case CSPFT_MATERIAL_STREAM: - { - const auto* material = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + { + const auto* material = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); - if (material) - m_info_string.SetValueForKey(std::string(field.szName), std::string(material->info.name)); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } + if (material) + m_info_string.SetValueForKey(std::string(field.szName), std::string(material->info.name)); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } case CSPFT_PHYS_PRESET: - { - const auto* physPreset = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + { + const auto* physPreset = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); - if (physPreset) - m_info_string.SetValueForKey(std::string(field.szName), std::string(physPreset->name)); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } + if (physPreset) + m_info_string.SetValueForKey(std::string(field.szName), std::string(physPreset->name)); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } case CSPFT_SCRIPT_STRING: FillFromScriptString(std::string(field.szName), field.iOffset); break; case CSPFT_TRACER: - { - const auto* tracer = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + { + const auto* tracer = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset + ); - if (tracer) - m_info_string.SetValueForKey(std::string(field.szName), std::string(tracer->name)); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } + if (tracer) + m_info_string.SetValueForKey(std::string(field.szName), std::string(tracer->name)); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } case CSPFT_SOUND_ALIAS_ID: assert(false); @@ -153,3 +156,11 @@ InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structu m_field_count(fieldCount) { } + +InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, const size_t fieldCount, + std::function scriptStringValueCallback) + : InfoStringFromStructConverterBase(structure, std::move(scriptStringValueCallback)), + m_fields(fields), + m_field_count(fieldCount) +{ +} diff --git a/src/ObjCommon/Game/T6/InfoStringT6.h b/src/ObjCommon/Game/T6/InfoStringT6.h index 9c42662c..f49941ac 100644 --- a/src/ObjCommon/Game/T6/InfoStringT6.h +++ b/src/ObjCommon/Game/T6/InfoStringT6.h @@ -28,5 +28,6 @@ namespace T6 public: InfoStringFromStructConverter(const void* structure, const cspField_t* fields, size_t fieldCount); + InfoStringFromStructConverter(const void* structure, const cspField_t* fields, size_t fieldCount, std::function scriptStringValueCallback); }; } diff --git a/src/ObjCommon/Utils/InfoString.cpp b/src/ObjCommon/Utils/InfoString.cpp index e48060b7..4b340158 100644 --- a/src/ObjCommon/Utils/InfoString.cpp +++ b/src/ObjCommon/Utils/InfoString.cpp @@ -117,9 +117,7 @@ InfoStringFromStructConverterBase::InfoStringFromStructConverterBase(const void* { } -InfoStringFromStructConverterBase::InfoStringFromStructConverterBase(const void* structure, - std::function - scriptStringValueCallback) +InfoStringFromStructConverterBase::InfoStringFromStructConverterBase(const void* structure, std::function scriptStringValueCallback) : m_structure(structure), m_get_scr_string(std::move(scriptStringValueCallback)) { diff --git a/src/ObjCommon/Utils/InfoString.h b/src/ObjCommon/Utils/InfoString.h index f638cee6..506354f1 100644 --- a/src/ObjCommon/Utils/InfoString.h +++ b/src/ObjCommon/Utils/InfoString.h @@ -50,7 +50,7 @@ class InfoStringFromStructConverterBase protected: InfoString m_info_string; const void* m_structure; - const std::function m_get_scr_string; + const std::function m_get_scr_string; void FillFromString(const std::string& key, size_t offset); void FillFromStringBuffer(const std::string& key, size_t offset, size_t bufferSize); @@ -67,7 +67,7 @@ protected: public: explicit InfoStringFromStructConverterBase(const void* structure); - InfoStringFromStructConverterBase(const void* structure, std::function scriptStringValueCallback); + InfoStringFromStructConverterBase(const void* structure, std::function scriptStringValueCallback); virtual ~InfoStringFromStructConverterBase(); InfoStringFromStructConverterBase(const InfoStringFromStructConverterBase& other) = delete; InfoStringFromStructConverterBase(InfoStringFromStructConverterBase&& other) noexcept = delete; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp index 182215e2..3e71e948 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp @@ -1,11 +1,14 @@ #include "AssetDumperWeapon.h" #include +#include #include "Game/T6/InfoStringT6.h" using namespace T6; +const std::string AssetDumperWeapon::EMPTY_STRING; + cspField_t AssetDumperWeapon::weapon_fields[] { {"displayName", offsetof(WeaponFullDef, weapVariantDef.szDisplayName), CSPFT_STRING}, @@ -1445,8 +1448,8 @@ namespace T6 } public: - InfoStringFromWeaponConverter(const WeaponFullDef* structure, const cspField_t* fields, const size_t fieldCount) - : InfoStringFromStructConverter(structure, fields, fieldCount) + InfoStringFromWeaponConverter(const WeaponFullDef* structure, const cspField_t* fields, const size_t fieldCount, std::function scriptStringValueCallback) + : InfoStringFromStructConverter(structure, fields, fieldCount, std::move(scriptStringValueCallback)) { } }; @@ -1585,7 +1588,14 @@ void AssetDumperWeapon::DumpAsset(Zone* zone, XAssetInfo* asse memset(fullDef, 0, sizeof WeaponFullDef); CopyToFullDef(asset->Asset(), fullDef); - InfoStringFromWeaponConverter converter(fullDef, weapon_fields, _countof(weapon_fields)); + InfoStringFromWeaponConverter converter(fullDef, weapon_fields, _countof(weapon_fields), [asset](const scr_string_t scrStr) -> const std::string& + { + if (scrStr >= asset->m_script_strings.size()) + return EMPTY_STRING; + + return asset->m_script_strings[scrStr]; + }); + const auto infoString = converter.Convert(); const auto stringValue = infoString.ToString("WEAPONFILE"); out->Write(stringValue.c_str(), 1, stringValue.length()); diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h index 074d704d..41ad12b4 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h @@ -7,6 +7,7 @@ namespace T6 { class AssetDumperWeapon final : public AbstractAssetDumper { + static const std::string EMPTY_STRING; static cspField_t weapon_fields[]; void CopyToFullDef(const WeaponVariantDef* weapon, WeaponFullDef* fullDef) const;