From 538c4be8398272c052c8e9fe55877383e11f1215 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 30 Dec 2021 16:51:16 +0100 Subject: [PATCH] Fix not supporting nullptr scriptstrings --- .../AssetLoading/AssetLoadingManager.cpp | 4 +- src/ZoneCommon/Zone/ZoneScriptStrings.cpp | 129 ++++++++++++++++-- src/ZoneCommon/Zone/ZoneScriptStrings.h | 13 ++ src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp | 73 +++++----- src/ZoneLoading/Game/IW3/ContentLoaderIW3.h | 2 +- src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp | 19 +-- src/ZoneLoading/Game/IW4/ContentLoaderIW4.h | 2 +- src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp | 19 +-- src/ZoneLoading/Game/IW5/ContentLoaderIW5.h | 2 +- src/ZoneLoading/Game/T5/ContentLoaderT5.cpp | 19 +-- src/ZoneLoading/Game/T5/ContentLoaderT5.h | 2 +- src/ZoneLoading/Game/T6/ContentLoaderT6.cpp | 19 +-- src/ZoneLoading/Game/T6/ContentLoaderT6.h | 2 +- src/ZoneLoading/Loading/AssetLoader.cpp | 4 - src/ZoneWriting/Game/IW3/ContentWriterIW3.cpp | 8 +- src/ZoneWriting/Game/IW4/ContentWriterIW4.cpp | 8 +- src/ZoneWriting/Game/IW5/ContentWriterIW5.cpp | 8 +- src/ZoneWriting/Game/T5/ContentWriterT5.cpp | 8 +- src/ZoneWriting/Game/T6/ContentWriterT6.cpp | 8 +- src/ZoneWriting/Writing/AssetWriter.cpp | 2 +- 20 files changed, 209 insertions(+), 142 deletions(-) diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp index 9e885724..bc34497b 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp @@ -98,8 +98,8 @@ XAssetInfoGeneric* AssetLoadingManager::LoadAssetDependency(const asset_type_t a // Make sure any used script string is available in the created zone // The replacement of the scr_string_t values will be done upon writing - for(auto scrString : existingAsset->m_used_script_strings) - m_context.m_zone->m_script_strings.AddOrGetScriptString(existingAsset->m_zone->m_script_strings[scrString]); + for(const auto scrString : existingAsset->m_used_script_strings) + m_context.m_zone->m_script_strings.AddOrGetScriptString(existingAsset->m_zone->m_script_strings.CValue(scrString)); AddAsset(existingAsset->m_type, existingAsset->m_name, existingAsset->m_ptr, std::move(dependencies), existingAsset->m_used_script_strings, existingAsset->m_zone); auto* lastDependency = m_last_dependency_loaded; diff --git a/src/ZoneCommon/Zone/ZoneScriptStrings.cpp b/src/ZoneCommon/Zone/ZoneScriptStrings.cpp index fc8cd6ed..d78cdf69 100644 --- a/src/ZoneCommon/Zone/ZoneScriptStrings.cpp +++ b/src/ZoneCommon/Zone/ZoneScriptStrings.cpp @@ -1,8 +1,51 @@ #include "ZoneScriptStrings.h" +#include #include #include +ZoneScriptStrings::ZoneScriptStrings() + : m_null_entry_pos(0) +{ + // Make script string 0 a nullptr string + m_scr_strings.emplace_back(); +} + +void ZoneScriptStrings::InitializeForExistingZone() +{ + m_null_entry_pos = -1; + m_scr_strings.clear(); +} + +void ZoneScriptStrings::InitializeForExistingZone(const char** scrStrList, const size_t scrStrCount) +{ + InitializeForExistingZone(); + + if (!scrStrList) + return; + + for (auto i = 0u; i < scrStrCount; i++) + AddScriptString(scrStrList[i]); +} + +void ZoneScriptStrings::AddScriptString(const char* value) +{ + const auto newStringIndex = m_scr_strings.size(); + const auto newScrStringIndex = static_cast(newStringIndex); + + if (value != nullptr) + { + m_scr_strings.emplace_back(value); + m_scr_string_lookup[value] = newScrStringIndex; + } + else + { + assert(m_null_entry_pos < 0); // If null index is already set, the previous cost will not be considered null string anymore. + m_scr_strings.emplace_back(); + m_null_entry_pos = static_cast(newStringIndex); + } +} + void ZoneScriptStrings::AddScriptString(const std::string& value) { const auto newScrStringIndex = static_cast(m_scr_strings.size()); @@ -10,20 +53,36 @@ void ZoneScriptStrings::AddScriptString(const std::string& value) m_scr_string_lookup[value] = newScrStringIndex; } -scr_string_t ZoneScriptStrings::AddOrGetScriptString(const std::string& value) +scr_string_t ZoneScriptStrings::AddOrGetScriptString(const char* value) { - if (m_scr_strings.empty()) - { - m_scr_strings.emplace_back(""); - m_scr_string_lookup[""] = static_cast(0); - } - else + if (value != nullptr) { const auto existingScriptString = m_scr_string_lookup.find(value); if (existingScriptString != m_scr_string_lookup.end()) return existingScriptString->second; + + const auto newScrStringIndex = static_cast(m_scr_strings.size()); + m_scr_strings.emplace_back(value); + m_scr_string_lookup[value] = newScrStringIndex; + return newScrStringIndex; } + if (m_null_entry_pos < 0) + { + const auto newStringIndex = m_scr_strings.size(); + m_scr_strings.emplace_back(); + m_null_entry_pos = static_cast(newStringIndex); + return static_cast(newStringIndex); + } + return static_cast(m_null_entry_pos); +} + +scr_string_t ZoneScriptStrings::AddOrGetScriptString(const std::string& value) +{ + const auto existingScriptString = m_scr_string_lookup.find(value); + if (existingScriptString != m_scr_string_lookup.end()) + return existingScriptString->second; + const auto newScrStringIndex = static_cast(m_scr_strings.size()); m_scr_strings.emplace_back(value); m_scr_string_lookup[value] = newScrStringIndex; @@ -31,6 +90,27 @@ scr_string_t ZoneScriptStrings::AddOrGetScriptString(const std::string& value) return newScrStringIndex; } +scr_string_t ZoneScriptStrings::GetScriptString(const char* value) const +{ + if (value == nullptr) + { + if (m_null_entry_pos >= 0) + return static_cast(m_null_entry_pos); + + std::ostringstream str; + str << "Unable to find script string nullptr"; + throw std::runtime_error(str.str()); + } + + const auto existingScriptString = m_scr_string_lookup.find(value); + if (existingScriptString != m_scr_string_lookup.end()) + return existingScriptString->second; + + std::ostringstream str; + str << "Unable to find script string \"" << value << "\""; + throw std::runtime_error(str.str()); +} + scr_string_t ZoneScriptStrings::GetScriptString(const std::string& value) const { const auto existingScriptString = m_scr_string_lookup.find(value); @@ -52,9 +132,42 @@ bool ZoneScriptStrings::Empty() const return m_scr_strings.empty(); } +const char* ZoneScriptStrings::CValue(const size_t index) const +{ + if (index > m_scr_strings.size()) + { + std::ostringstream str; + str << "Script string index '" << index << "' is not inside range of zone script strings (count: " << m_scr_strings.size() << ")"; + throw std::runtime_error(str.str()); + } + + if (m_null_entry_pos == static_cast(index)) + return nullptr; + + return m_scr_strings[index].c_str(); +} + +const std::string& ZoneScriptStrings::Value(const size_t index) const +{ + return (*this)[index]; +} + +const std::string& ZoneScriptStrings::Value(const size_t index, bool& isNull) const +{ + if (index > m_scr_strings.size()) + { + std::ostringstream str; + str << "Script string index '" << index << "' is not inside range of zone script strings (count: " << m_scr_strings.size() << ")"; + throw std::runtime_error(str.str()); + } + + isNull = m_null_entry_pos == static_cast(index); + return m_scr_strings[index]; +} + const std::string& ZoneScriptStrings::operator[](const size_t index) const { - if(index > m_scr_strings.size()) + if (index > m_scr_strings.size()) { std::ostringstream str; str << "Script string index '" << index << "' is not inside range of zone script strings (count: " << m_scr_strings.size() << ")"; diff --git a/src/ZoneCommon/Zone/ZoneScriptStrings.h b/src/ZoneCommon/Zone/ZoneScriptStrings.h index 088bcd09..3ccbd3fd 100644 --- a/src/ZoneCommon/Zone/ZoneScriptStrings.h +++ b/src/ZoneCommon/Zone/ZoneScriptStrings.h @@ -10,16 +10,29 @@ class ZoneScriptStrings { + int m_null_entry_pos; std::vector m_scr_strings; std::unordered_map m_scr_string_lookup; public: + ZoneScriptStrings(); + + void InitializeForExistingZone(); + void InitializeForExistingZone(const char** scrStrList, size_t scrStrCount); + + void AddScriptString(const char* value); void AddScriptString(const std::string& value); + scr_string_t AddOrGetScriptString(const char* value); scr_string_t AddOrGetScriptString(const std::string& value); + _NODISCARD scr_string_t GetScriptString(const char* value) const; _NODISCARD scr_string_t GetScriptString(const std::string& value) const; + _NODISCARD size_t Count() const; _NODISCARD bool Empty() const; + _NODISCARD const char* CValue(size_t index) const; + _NODISCARD const std::string& Value(size_t index) const; + _NODISCARD const std::string& Value(size_t index, bool& isNull) const; _NODISCARD const std::string& operator[](size_t index) const; _NODISCARD std::vector::const_iterator begin() const; _NODISCARD std::vector::const_iterator end() const; diff --git a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp index d4ceeac4..cc222c36 100644 --- a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp +++ b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.cpp @@ -33,9 +33,9 @@ using namespace IW3; ContentLoader::ContentLoader() + : varXAsset(nullptr), + varScriptStringList(nullptr) { - varXAsset = nullptr; - varScriptStringList = nullptr; } void ContentLoader::LoadScriptStringList(const bool atStreamStart) @@ -55,17 +55,8 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); - for (int i = 0; i < varScriptStringList->count; i++) - { - if (varScriptStringList->strings[i]) - { - m_zone->m_script_strings.AddScriptString(varScriptStringList->strings[i]); - } - else - { - m_zone->m_script_strings.AddScriptString(""); - } - } + if (varScriptStringList->strings && varScriptStringList->count > 0) + m_zone->m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } m_stream->PopBlock(); @@ -73,7 +64,7 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); } -void ContentLoader::LoadXAsset(const bool atStreamStart) +void ContentLoader::LoadXAsset(const bool atStreamStart) const { #define LOAD_ASSET(type_index, typeName, headerEntry) \ case type_index: \ @@ -93,33 +84,33 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) switch (varXAsset->type) { - LOAD_ASSET(ASSET_TYPE_PHYSPRESET, PhysPreset, physPreset) - LOAD_ASSET(ASSET_TYPE_XANIMPARTS, XAnimParts, parts) - LOAD_ASSET(ASSET_TYPE_XMODEL, XModel, model) - LOAD_ASSET(ASSET_TYPE_MATERIAL, Material, material) - LOAD_ASSET(ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet, techniqueSet) - LOAD_ASSET(ASSET_TYPE_IMAGE, GfxImage, image) - LOAD_ASSET(ASSET_TYPE_SOUND, snd_alias_list_t, sound) - LOAD_ASSET(ASSET_TYPE_SOUND_CURVE, SndCurve, sndCurve) - LOAD_ASSET(ASSET_TYPE_LOADED_SOUND, LoadedSound, loadSnd) - LOAD_ASSET(ASSET_TYPE_CLIPMAP, clipMap_t, clipMap) - LOAD_ASSET(ASSET_TYPE_CLIPMAP_PVS, clipMap_t, clipMap) - LOAD_ASSET(ASSET_TYPE_COMWORLD, ComWorld, comWorld) - LOAD_ASSET(ASSET_TYPE_GAMEWORLD_SP, GameWorldSp, gameWorldSp) - LOAD_ASSET(ASSET_TYPE_GAMEWORLD_MP, GameWorldMp, gameWorldMp) - LOAD_ASSET(ASSET_TYPE_MAP_ENTS, MapEnts, mapEnts) - LOAD_ASSET(ASSET_TYPE_GFXWORLD, GfxWorld, gfxWorld) - LOAD_ASSET(ASSET_TYPE_LIGHT_DEF, GfxLightDef, lightDef) - LOAD_ASSET(ASSET_TYPE_FONT, Font_s, font) - LOAD_ASSET(ASSET_TYPE_MENULIST, MenuList, menuList) - LOAD_ASSET(ASSET_TYPE_MENU, menuDef_t, menu) - LOAD_ASSET(ASSET_TYPE_LOCALIZE_ENTRY, LocalizeEntry, localize) - LOAD_ASSET(ASSET_TYPE_WEAPON, WeaponDef, weapon) - SKIP_ASSET(ASSET_TYPE_SNDDRIVER_GLOBALS, SndDriverGlobals, sndDriverGlobals) - LOAD_ASSET(ASSET_TYPE_FX, FxEffectDef, fx) - LOAD_ASSET(ASSET_TYPE_IMPACT_FX, FxImpactTable, impactFx) - LOAD_ASSET(ASSET_TYPE_RAWFILE, RawFile, rawfile) - LOAD_ASSET(ASSET_TYPE_STRINGTABLE, StringTable, stringTable) + LOAD_ASSET(ASSET_TYPE_PHYSPRESET, PhysPreset, physPreset) + LOAD_ASSET(ASSET_TYPE_XANIMPARTS, XAnimParts, parts) + LOAD_ASSET(ASSET_TYPE_XMODEL, XModel, model) + LOAD_ASSET(ASSET_TYPE_MATERIAL, Material, material) + LOAD_ASSET(ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet, techniqueSet) + LOAD_ASSET(ASSET_TYPE_IMAGE, GfxImage, image) + LOAD_ASSET(ASSET_TYPE_SOUND, snd_alias_list_t, sound) + LOAD_ASSET(ASSET_TYPE_SOUND_CURVE, SndCurve, sndCurve) + LOAD_ASSET(ASSET_TYPE_LOADED_SOUND, LoadedSound, loadSnd) + LOAD_ASSET(ASSET_TYPE_CLIPMAP, clipMap_t, clipMap) + LOAD_ASSET(ASSET_TYPE_CLIPMAP_PVS, clipMap_t, clipMap) + LOAD_ASSET(ASSET_TYPE_COMWORLD, ComWorld, comWorld) + LOAD_ASSET(ASSET_TYPE_GAMEWORLD_SP, GameWorldSp, gameWorldSp) + LOAD_ASSET(ASSET_TYPE_GAMEWORLD_MP, GameWorldMp, gameWorldMp) + LOAD_ASSET(ASSET_TYPE_MAP_ENTS, MapEnts, mapEnts) + LOAD_ASSET(ASSET_TYPE_GFXWORLD, GfxWorld, gfxWorld) + LOAD_ASSET(ASSET_TYPE_LIGHT_DEF, GfxLightDef, lightDef) + LOAD_ASSET(ASSET_TYPE_FONT, Font_s, font) + LOAD_ASSET(ASSET_TYPE_MENULIST, MenuList, menuList) + LOAD_ASSET(ASSET_TYPE_MENU, menuDef_t, menu) + LOAD_ASSET(ASSET_TYPE_LOCALIZE_ENTRY, LocalizeEntry, localize) + LOAD_ASSET(ASSET_TYPE_WEAPON, WeaponDef, weapon) + SKIP_ASSET(ASSET_TYPE_SNDDRIVER_GLOBALS, SndDriverGlobals, sndDriverGlobals) + LOAD_ASSET(ASSET_TYPE_FX, FxEffectDef, fx) + LOAD_ASSET(ASSET_TYPE_IMPACT_FX, FxImpactTable, impactFx) + LOAD_ASSET(ASSET_TYPE_RAWFILE, RawFile, rawfile) + LOAD_ASSET(ASSET_TYPE_STRINGTABLE, StringTable, stringTable) default: { diff --git a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h index a5e6caab..1790a1fc 100644 --- a/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h +++ b/src/ZoneLoading/Game/IW3/ContentLoaderIW3.h @@ -12,7 +12,7 @@ namespace IW3 void LoadScriptStringList(bool atStreamStart); - void LoadXAsset(bool atStreamStart); + void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); public: diff --git a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp index c9970b59..10f056e8 100644 --- a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp +++ b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp @@ -43,9 +43,9 @@ using namespace IW4; ContentLoader::ContentLoader() + : varXAsset(nullptr), + varScriptStringList(nullptr) { - varXAsset = nullptr; - varScriptStringList = nullptr; } void ContentLoader::LoadScriptStringList(const bool atStreamStart) @@ -65,17 +65,8 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); - for (int i = 0; i < varScriptStringList->count; i++) - { - if (varScriptStringList->strings[i]) - { - m_zone->m_script_strings.AddScriptString(varScriptStringList->strings[i]); - } - else - { - m_zone->m_script_strings.AddScriptString(""); - } - } + if (varScriptStringList->strings && varScriptStringList->count > 0) + m_zone->m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } m_stream->PopBlock(); @@ -83,7 +74,7 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); } -void ContentLoader::LoadXAsset(const bool atStreamStart) +void ContentLoader::LoadXAsset(const bool atStreamStart) const { #define LOAD_ASSET(type_index, typeName, headerEntry) \ case type_index: \ diff --git a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h index 9bc87a89..da132e4f 100644 --- a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h +++ b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.h @@ -12,7 +12,7 @@ namespace IW4 void LoadScriptStringList(bool atStreamStart); - void LoadXAsset(bool atStreamStart); + void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); public: diff --git a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp index bffb5ec8..81bdb8c3 100644 --- a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp +++ b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.cpp @@ -48,9 +48,9 @@ using namespace IW5; ContentLoader::ContentLoader() + : varXAsset(nullptr), + varScriptStringList(nullptr) { - varXAsset = nullptr; - varScriptStringList = nullptr; } void ContentLoader::LoadScriptStringList(const bool atStreamStart) @@ -70,17 +70,8 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); - for (int i = 0; i < varScriptStringList->count; i++) - { - if (varScriptStringList->strings[i]) - { - m_zone->m_script_strings.AddScriptString(varScriptStringList->strings[i]); - } - else - { - m_zone->m_script_strings.AddScriptString(""); - } - } + if (varScriptStringList->strings && varScriptStringList->count > 0) + m_zone->m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } m_stream->PopBlock(); @@ -88,7 +79,7 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); } -void ContentLoader::LoadXAsset(const bool atStreamStart) +void ContentLoader::LoadXAsset(const bool atStreamStart) const { #define LOAD_ASSET(type_index, typeName, headerEntry) \ case type_index: \ diff --git a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h index 2bcc7451..79a0813c 100644 --- a/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h +++ b/src/ZoneLoading/Game/IW5/ContentLoaderIW5.h @@ -12,7 +12,7 @@ namespace IW5 void LoadScriptStringList(bool atStreamStart); - void LoadXAsset(bool atStreamStart); + void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); public: diff --git a/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp b/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp index d83b1dbd..34122243 100644 --- a/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp +++ b/src/ZoneLoading/Game/T5/ContentLoaderT5.cpp @@ -40,9 +40,9 @@ using namespace T5; ContentLoader::ContentLoader() + : varXAsset(nullptr), + varScriptStringList(nullptr) { - varXAsset = nullptr; - varScriptStringList = nullptr; } void ContentLoader::LoadScriptStringList(const bool atStreamStart) @@ -62,17 +62,8 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); - for (int i = 0; i < varScriptStringList->count; i++) - { - if (varScriptStringList->strings[i]) - { - m_zone->m_script_strings.AddScriptString(varScriptStringList->strings[i]); - } - else - { - m_zone->m_script_strings.AddScriptString(""); - } - } + if (varScriptStringList->strings && varScriptStringList->count > 0) + m_zone->m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } m_stream->PopBlock(); @@ -80,7 +71,7 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); } -void ContentLoader::LoadXAsset(const bool atStreamStart) +void ContentLoader::LoadXAsset(const bool atStreamStart) const { #define LOAD_ASSET(type_index, typeName, headerEntry) \ case type_index: \ diff --git a/src/ZoneLoading/Game/T5/ContentLoaderT5.h b/src/ZoneLoading/Game/T5/ContentLoaderT5.h index 16aa600c..ffc36ceb 100644 --- a/src/ZoneLoading/Game/T5/ContentLoaderT5.h +++ b/src/ZoneLoading/Game/T5/ContentLoaderT5.h @@ -12,7 +12,7 @@ namespace T5 void LoadScriptStringList(bool atStreamStart); - void LoadXAsset(bool atStreamStart); + void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); public: diff --git a/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp b/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp index 531905fa..e7504d6a 100644 --- a/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp +++ b/src/ZoneLoading/Game/T6/ContentLoaderT6.cpp @@ -56,9 +56,9 @@ using namespace T6; ContentLoader::ContentLoader() + : varXAsset(nullptr), + varScriptStringList(nullptr) { - varXAsset = nullptr; - varScriptStringList = nullptr; } void ContentLoader::LoadScriptStringList(const bool atStreamStart) @@ -78,17 +78,8 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) varXString = varScriptStringList->strings; LoadXStringArray(true, varScriptStringList->count); - for (int i = 0; i < varScriptStringList->count; i++) - { - if (varScriptStringList->strings[i]) - { - m_zone->m_script_strings.AddScriptString(varScriptStringList->strings[i]); - } - else - { - m_zone->m_script_strings.AddScriptString(""); - } - } + if (varScriptStringList->strings && varScriptStringList->count > 0) + m_zone->m_script_strings.InitializeForExistingZone(varScriptStringList->strings, static_cast(varScriptStringList->count)); } m_stream->PopBlock(); @@ -96,7 +87,7 @@ void ContentLoader::LoadScriptStringList(const bool atStreamStart) assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); } -void ContentLoader::LoadXAsset(const bool atStreamStart) +void ContentLoader::LoadXAsset(const bool atStreamStart) const { #define LOAD_ASSET(type_index, typeName, headerEntry) \ case type_index: \ diff --git a/src/ZoneLoading/Game/T6/ContentLoaderT6.h b/src/ZoneLoading/Game/T6/ContentLoaderT6.h index 273baa35..592e6f81 100644 --- a/src/ZoneLoading/Game/T6/ContentLoaderT6.h +++ b/src/ZoneLoading/Game/T6/ContentLoaderT6.h @@ -12,7 +12,7 @@ namespace T6 void LoadScriptStringList(bool atStreamStart); - void LoadXAsset(bool atStreamStart); + void LoadXAsset(bool atStreamStart) const; void LoadXAssetArray(bool atStreamStart, size_t count); public: diff --git a/src/ZoneLoading/Loading/AssetLoader.cpp b/src/ZoneLoading/Loading/AssetLoader.cpp index d38919e2..2480a327 100644 --- a/src/ZoneLoading/Loading/AssetLoader.cpp +++ b/src/ZoneLoading/Loading/AssetLoader.cpp @@ -8,10 +8,6 @@ AssetLoader::AssetLoader(const asset_type_t assetType, Zone* zone, IZoneInputStr m_asset_type(assetType), varScriptString(nullptr) { - m_asset_type = assetType; - m_zone = zone; - m_stream = stream; - varScriptString = nullptr; } void AssetLoader::AddDependency(XAssetInfoGeneric* assetInfo) diff --git a/src/ZoneWriting/Game/IW3/ContentWriterIW3.cpp b/src/ZoneWriting/Game/IW3/ContentWriterIW3.cpp index ac51ab1b..161beaa1 100644 --- a/src/ZoneWriting/Game/IW3/ContentWriterIW3.cpp +++ b/src/ZoneWriting/Game/IW3/ContentWriterIW3.cpp @@ -45,13 +45,11 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo if (!m_zone->m_script_strings.Empty()) { assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); - xAssetList.stringList.count = m_zone->m_script_strings.Count(); + xAssetList.stringList.count = static_cast(m_zone->m_script_strings.Count()); xAssetList.stringList.strings = static_cast(memory.Alloc(sizeof(const char*) * m_zone->m_script_strings.Count())); for (auto i = 0u; i < m_zone->m_script_strings.Count(); i++) - { - xAssetList.stringList.strings[i] = m_zone->m_script_strings[i].c_str(); - } + xAssetList.stringList.strings[i] = m_zone->m_script_strings.CValue(i); } else { @@ -62,7 +60,7 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo const auto assetCount = m_zone->m_pools->GetTotalAssetCount(); if (assetCount > 0) { - xAssetList.assetCount = assetCount; + xAssetList.assetCount = static_cast(assetCount); xAssetList.assets = static_cast(memory.Alloc(sizeof(XAsset) * assetCount)); const auto end = m_zone->m_pools->end(); diff --git a/src/ZoneWriting/Game/IW4/ContentWriterIW4.cpp b/src/ZoneWriting/Game/IW4/ContentWriterIW4.cpp index 7cca434b..c3e97cbb 100644 --- a/src/ZoneWriting/Game/IW4/ContentWriterIW4.cpp +++ b/src/ZoneWriting/Game/IW4/ContentWriterIW4.cpp @@ -55,13 +55,11 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo if (!m_zone->m_script_strings.Empty()) { assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); - xAssetList.stringList.count = m_zone->m_script_strings.Count(); + xAssetList.stringList.count = static_cast(m_zone->m_script_strings.Count()); xAssetList.stringList.strings = static_cast(memory.Alloc(sizeof(const char*) * m_zone->m_script_strings.Count())); for (auto i = 0u; i < m_zone->m_script_strings.Count(); i++) - { - xAssetList.stringList.strings[i] = m_zone->m_script_strings[i].c_str(); - } + xAssetList.stringList.strings[i] = m_zone->m_script_strings.CValue(i); } else { @@ -72,7 +70,7 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo const auto assetCount = m_zone->m_pools->GetTotalAssetCount(); if (assetCount > 0) { - xAssetList.assetCount = assetCount; + xAssetList.assetCount = static_cast(assetCount); xAssetList.assets = static_cast(memory.Alloc(sizeof(XAsset) * assetCount)); const auto end = m_zone->m_pools->end(); diff --git a/src/ZoneWriting/Game/IW5/ContentWriterIW5.cpp b/src/ZoneWriting/Game/IW5/ContentWriterIW5.cpp index 418a24db..916294a7 100644 --- a/src/ZoneWriting/Game/IW5/ContentWriterIW5.cpp +++ b/src/ZoneWriting/Game/IW5/ContentWriterIW5.cpp @@ -60,13 +60,11 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo if (!m_zone->m_script_strings.Empty()) { assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); - xAssetList.stringList.count = m_zone->m_script_strings.Count(); + xAssetList.stringList.count = static_cast(m_zone->m_script_strings.Count()); xAssetList.stringList.strings = static_cast(memory.Alloc(sizeof(const char*) * m_zone->m_script_strings.Count())); for (auto i = 0u; i < m_zone->m_script_strings.Count(); i++) - { - xAssetList.stringList.strings[i] = m_zone->m_script_strings[i].c_str(); - } + xAssetList.stringList.strings[i] = m_zone->m_script_strings.CValue(i); } else { @@ -77,7 +75,7 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo const auto assetCount = m_zone->m_pools->GetTotalAssetCount(); if (assetCount > 0) { - xAssetList.assetCount = assetCount; + xAssetList.assetCount = static_cast(assetCount); xAssetList.assets = static_cast(memory.Alloc(sizeof(XAsset) * assetCount)); const auto end = m_zone->m_pools->end(); diff --git a/src/ZoneWriting/Game/T5/ContentWriterT5.cpp b/src/ZoneWriting/Game/T5/ContentWriterT5.cpp index a0d6de23..ef7b0246 100644 --- a/src/ZoneWriting/Game/T5/ContentWriterT5.cpp +++ b/src/ZoneWriting/Game/T5/ContentWriterT5.cpp @@ -52,13 +52,11 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo if (!m_zone->m_script_strings.Empty()) { assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); - xAssetList.stringList.count = m_zone->m_script_strings.Count(); + xAssetList.stringList.count = static_cast(m_zone->m_script_strings.Count()); xAssetList.stringList.strings = static_cast(memory.Alloc(sizeof(const char*) * m_zone->m_script_strings.Count())); for (auto i = 0u; i < m_zone->m_script_strings.Count(); i++) - { - xAssetList.stringList.strings[i] = m_zone->m_script_strings[i].c_str(); - } + xAssetList.stringList.strings[i] = m_zone->m_script_strings.CValue(i); } else { @@ -69,7 +67,7 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo const auto assetCount = m_zone->m_pools->GetTotalAssetCount(); if (assetCount > 0) { - xAssetList.assetCount = assetCount; + xAssetList.assetCount = static_cast(assetCount); xAssetList.assets = static_cast(memory.Alloc(sizeof(XAsset) * assetCount)); const auto end = m_zone->m_pools->end(); diff --git a/src/ZoneWriting/Game/T6/ContentWriterT6.cpp b/src/ZoneWriting/Game/T6/ContentWriterT6.cpp index c5975f7e..cbb68e74 100644 --- a/src/ZoneWriting/Game/T6/ContentWriterT6.cpp +++ b/src/ZoneWriting/Game/T6/ContentWriterT6.cpp @@ -68,13 +68,11 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo if (!m_zone->m_script_strings.Empty()) { assert(m_zone->m_script_strings.Count() <= SCR_STRING_MAX + 1); - xAssetList.stringList.count = m_zone->m_script_strings.Count(); + xAssetList.stringList.count = static_cast(m_zone->m_script_strings.Count()); xAssetList.stringList.strings = static_cast(memory.Alloc(sizeof(const char*) * m_zone->m_script_strings.Count())); for (auto i = 0u; i < m_zone->m_script_strings.Count(); i++) - { - xAssetList.stringList.strings[i] = m_zone->m_script_strings[i].c_str(); - } + xAssetList.stringList.strings[i] = m_zone->m_script_strings.CValue(i); } else { @@ -88,7 +86,7 @@ void ContentWriter::CreateXAssetList(XAssetList& xAssetList, MemoryManager& memo const auto assetCount = m_zone->m_pools->GetTotalAssetCount(); if (assetCount > 0) { - xAssetList.assetCount = assetCount; + xAssetList.assetCount = static_cast(assetCount); xAssetList.assets = static_cast(memory.Alloc(sizeof(XAsset) * assetCount)); const auto end = m_zone->m_pools->end(); diff --git a/src/ZoneWriting/Writing/AssetWriter.cpp b/src/ZoneWriting/Writing/AssetWriter.cpp index ec0baae9..087cb048 100644 --- a/src/ZoneWriting/Writing/AssetWriter.cpp +++ b/src/ZoneWriting/Writing/AssetWriter.cpp @@ -17,7 +17,7 @@ scr_string_t AssetWriter::UseScriptString(const scr_string_t scrString) const if (m_asset->m_zone == m_zone) return scrString; - const auto strValue = m_asset->m_zone->m_script_strings[scrString]; + const auto strValue = m_asset->m_zone->m_script_strings.CValue(scrString); return m_zone->m_script_strings.GetScriptString(strValue); }