From 1540b69ac153a3709f9494ad51f4c5ae1bdafbb1 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Wed, 4 Feb 2026 20:41:28 +0000 Subject: [PATCH 1/3] refactor: asset refs are specified via asset name not enum entry --- src/ZoneCode/Game/IW3/XAssets/FxEffectDef.txt | 2 +- src/ZoneCode/Game/IW3/XAssets/WeaponDef.txt | 2 +- src/ZoneCode/Game/IW4/XAssets/FxEffectDef.txt | 2 +- .../Game/IW4/XAssets/WeaponCompleteDef.txt | 6 ++--- src/ZoneCode/Game/IW5/XAssets/FxEffectDef.txt | 2 +- .../Game/IW5/XAssets/WeaponCompleteDef.txt | 12 ++++----- src/ZoneCode/Game/T5/XAssets/FxEffectDef.txt | 2 +- .../Game/T5/XAssets/WeaponVariantDef.txt | 2 +- src/ZoneCode/Game/T6/XAssets/FxEffectDef.txt | 2 +- .../T6/XAssets/WeaponAttachmentUnique.txt | 2 +- .../Game/T6/XAssets/WeaponVariantDef.txt | 2 +- .../Domain/Information/MemberInformation.cpp | 3 +-- .../Domain/Information/MemberInformation.h | 2 +- .../Generating/Templates/ZoneMarkTemplate.cpp | 14 +++++----- .../Commands/Sequence/SequenceAsset.cpp | 6 ++--- .../Commands/Sequence/SequenceAssetRef.cpp | 26 ++++++++++++------- .../MarkingRequiredPostProcessor.cpp | 2 +- 17 files changed, 48 insertions(+), 41 deletions(-) diff --git a/src/ZoneCode/Game/IW3/XAssets/FxEffectDef.txt b/src/ZoneCode/Game/IW3/XAssets/FxEffectDef.txt index b4311136..fff0e03e 100644 --- a/src/ZoneCode/Game/IW3/XAssets/FxEffectDef.txt +++ b/src/ZoneCode/Game/IW3/XAssets/FxEffectDef.txt @@ -35,7 +35,7 @@ set condition material FxElemDef::elemType == FX_ELEM_TYPE_SPRITE_BILLBOARD use FxEffectDefRef; set condition handle never; set string name; -set assetref name ASSET_TYPE_FX; +set assetref name AssetFx; // FxTrailDef use FxTrailDef; diff --git a/src/ZoneCode/Game/IW3/XAssets/WeaponDef.txt b/src/ZoneCode/Game/IW3/XAssets/WeaponDef.txt index 290b6d19..77401b6e 100644 --- a/src/ZoneCode/Game/IW3/XAssets/WeaponDef.txt +++ b/src/ZoneCode/Game/IW3/XAssets/WeaponDef.txt @@ -7,7 +7,7 @@ set string szInternalName; set string szDisplayName; set string szOverlayName; set string szXAnims; -set assetref szXAnims ASSET_TYPE_XANIMPARTS; +set assetref szXAnims AssetXAnim; set string szModeName; set scriptstring hideTags; set scriptstring notetrackSoundMapKeys; diff --git a/src/ZoneCode/Game/IW4/XAssets/FxEffectDef.txt b/src/ZoneCode/Game/IW4/XAssets/FxEffectDef.txt index 3b44b01f..a72c5715 100644 --- a/src/ZoneCode/Game/IW4/XAssets/FxEffectDef.txt +++ b/src/ZoneCode/Game/IW4/XAssets/FxEffectDef.txt @@ -37,7 +37,7 @@ set condition material FxElemDef::elemType == FX_ELEM_TYPE_SPRITE_BILLBOARD use FxEffectDefRef; set condition handle never; set string name; -set assetref name ASSET_TYPE_FX; +set assetref name AssetFx; // FxElemExtendedDefPtr use FxElemExtendedDefPtr; diff --git a/src/ZoneCode/Game/IW4/XAssets/WeaponCompleteDef.txt b/src/ZoneCode/Game/IW4/XAssets/WeaponCompleteDef.txt index a2911b7f..0a6a5d3c 100644 --- a/src/ZoneCode/Game/IW4/XAssets/WeaponCompleteDef.txt +++ b/src/ZoneCode/Game/IW4/XAssets/WeaponCompleteDef.txt @@ -10,7 +10,7 @@ set reusable hideTags; set scriptstring hideTags; set count hideTags 32; set string szXAnims; -set assetref szXAnims ASSET_TYPE_XANIMPARTS; +set assetref szXAnims AssetXAnim; set reusable szXAnims; set count szXAnims 37; set string szAltWeaponName; @@ -26,11 +26,11 @@ set reusable gunXModel; set count gunXModel 16; set reusable szXAnimsRightHanded; set string szXAnimsRightHanded; -set assetref szXAnimsRightHanded ASSET_TYPE_XANIMPARTS; +set assetref szXAnimsRightHanded AssetXAnim; set count szXAnimsRightHanded 37; set reusable szXAnimsLeftHanded; set string szXAnimsLeftHanded; -set assetref szXAnimsLeftHanded ASSET_TYPE_XANIMPARTS; +set assetref szXAnimsLeftHanded AssetXAnim; set count szXAnimsLeftHanded 37; set string szModeName; set reusable notetrackSoundMapKeys; diff --git a/src/ZoneCode/Game/IW5/XAssets/FxEffectDef.txt b/src/ZoneCode/Game/IW5/XAssets/FxEffectDef.txt index 2a83e44a..5e1aef7c 100644 --- a/src/ZoneCode/Game/IW5/XAssets/FxEffectDef.txt +++ b/src/ZoneCode/Game/IW5/XAssets/FxEffectDef.txt @@ -38,7 +38,7 @@ set condition material FxElemDef::elemType == FX_ELEM_TYPE_SPRITE_BILLBOARD use FxEffectDefRef; set condition handle never; set string name; -set assetref name ASSET_TYPE_FX; +set assetref name AssetFx; // FxElemExtendedDefPtr use FxElemExtendedDefPtr; diff --git a/src/ZoneCode/Game/IW5/XAssets/WeaponCompleteDef.txt b/src/ZoneCode/Game/IW5/XAssets/WeaponCompleteDef.txt index 6846512e..abeb9c9d 100644 --- a/src/ZoneCode/Game/IW5/XAssets/WeaponCompleteDef.txt +++ b/src/ZoneCode/Game/IW5/XAssets/WeaponCompleteDef.txt @@ -16,7 +16,7 @@ set count underBarrels 3; set reusable others; set count others 4; set string szXAnims; -set assetref szXAnims ASSET_TYPE_XANIMPARTS; +set assetref szXAnims AssetXAnim; set reusable szXAnims; set count szXAnims WEAP_ANIM_COUNT; set reusable animOverrides; @@ -39,8 +39,8 @@ set count aiVsPlayerAccuracyGraphKnots aiVsPlayerAccuracyGraphKnotCount; use AnimOverrideEntry; set string overrideAnim; set string altmodeAnim; -set assetref overrideAnim ASSET_TYPE_XANIMPARTS; -set assetref altmodeAnim ASSET_TYPE_XANIMPARTS; +set assetref overrideAnim AssetXAnim; +set assetref altmodeAnim AssetXAnim; // NoteTrackToSoundEntry use NoteTrackToSoundEntry; @@ -58,11 +58,11 @@ set reusable gunXModel; set count gunXModel 16; set reusable szXAnimsRightHanded; set string szXAnimsRightHanded; -set assetref szXAnimsRightHanded ASSET_TYPE_XANIMPARTS; +set assetref szXAnimsRightHanded AssetXAnim; set count szXAnimsRightHanded WEAP_ANIM_COUNT; set reusable szXAnimsLeftHanded; set string szXAnimsLeftHanded; -set assetref szXAnimsLeftHanded ASSET_TYPE_XANIMPARTS; +set assetref szXAnimsLeftHanded AssetXAnim; set count szXAnimsLeftHanded WEAP_ANIM_COUNT; set string szModeName; set reusable notetrackSoundMapKeys; @@ -121,4 +121,4 @@ set condition sound never; // snd_alias_list_name use snd_alias_list_name; set string soundName; -set assetref soundName ASSET_TYPE_SOUND; +set assetref soundName AssetSound; diff --git a/src/ZoneCode/Game/T5/XAssets/FxEffectDef.txt b/src/ZoneCode/Game/T5/XAssets/FxEffectDef.txt index bd40a3ec..21e0b67b 100644 --- a/src/ZoneCode/Game/T5/XAssets/FxEffectDef.txt +++ b/src/ZoneCode/Game/T5/XAssets/FxEffectDef.txt @@ -37,7 +37,7 @@ set condition material FxElemDef::elemType == FX_ELEM_TYPE_SPRITE_BILLBOARD use FxEffectDefRef; set condition handle never; set string name; -set assetref name ASSET_TYPE_FX; +set assetref name AssetFx; // FxTrailDef use FxTrailDef; diff --git a/src/ZoneCode/Game/T5/XAssets/WeaponVariantDef.txt b/src/ZoneCode/Game/T5/XAssets/WeaponVariantDef.txt index fb15e40f..488a69d9 100644 --- a/src/ZoneCode/Game/T5/XAssets/WeaponVariantDef.txt +++ b/src/ZoneCode/Game/T5/XAssets/WeaponVariantDef.txt @@ -8,7 +8,7 @@ set reusable weapDef; set string szDisplayName; set string szAltWeaponName; set string szXAnims; -set assetref szXAnims ASSET_TYPE_XANIMPARTS; +set assetref szXAnims AssetXAnim; set count szXAnims NUM_WEAP_ANIMS; set reusable szXAnims; set scriptstring hideTags; diff --git a/src/ZoneCode/Game/T6/XAssets/FxEffectDef.txt b/src/ZoneCode/Game/T6/XAssets/FxEffectDef.txt index 0009e0d5..82e55b49 100644 --- a/src/ZoneCode/Game/T6/XAssets/FxEffectDef.txt +++ b/src/ZoneCode/Game/T6/XAssets/FxEffectDef.txt @@ -38,7 +38,7 @@ set condition material FxElemDef::elemType == FX_ELEM_TYPE_SPRITE_BILLBOARD use FxEffectDefRef; set condition handle never; set string name; -set assetref name ASSET_TYPE_FX; +set assetref name AssetFx; // FxElemExtendedDefPtr use FxElemExtendedDefPtr; diff --git a/src/ZoneCode/Game/T6/XAssets/WeaponAttachmentUnique.txt b/src/ZoneCode/Game/T6/XAssets/WeaponAttachmentUnique.txt index 4fd2b883..ce6db77d 100644 --- a/src/ZoneCode/Game/T6/XAssets/WeaponAttachmentUnique.txt +++ b/src/ZoneCode/Game/T6/XAssets/WeaponAttachmentUnique.txt @@ -12,7 +12,7 @@ set reusable hideTags; set string viewModelTag; set string worldModelTag; set string szXAnims; -set assetref szXAnims ASSET_TYPE_XANIMPARTS; +set assetref szXAnims AssetXAnim; set count szXAnims 88; set reusable szXAnims; set count locationDamageMultipliers 21; diff --git a/src/ZoneCode/Game/T6/XAssets/WeaponVariantDef.txt b/src/ZoneCode/Game/T6/XAssets/WeaponVariantDef.txt index 610d37ab..c39b148b 100644 --- a/src/ZoneCode/Game/T6/XAssets/WeaponVariantDef.txt +++ b/src/ZoneCode/Game/T6/XAssets/WeaponVariantDef.txt @@ -13,7 +13,7 @@ set reusable attachments; set count attachmentUniques 95; set reusable attachmentUniques; set string szXAnims; -set assetref szXAnims ASSET_TYPE_XANIMPARTS; +set assetref szXAnims AssetXAnim; set count szXAnims NUM_WEAP_ANIMS; set reusable szXAnims; set scriptstring hideTags; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp index ab4b5323..a19fc05c 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp @@ -8,7 +8,6 @@ MemberInformation::MemberInformation(StructureInformation* parent, StructureInfo m_is_script_string(false), m_is_reusable(false), m_is_leaf(false), - m_fast_file_block(nullptr), - m_asset_ref(nullptr) + m_fast_file_block(nullptr) { } diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h index fb5699e3..f517e069 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h @@ -25,5 +25,5 @@ public: std::unique_ptr m_alloc_alignment; std::unique_ptr m_post_load_action; const FastFileBlock* m_fast_file_block; - const EnumMember* m_asset_ref; + std::string m_asset_ref; }; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp index 050c993a..9c79ad0a 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp @@ -397,22 +397,22 @@ namespace { if (modifier.IsArray()) { - LINEF("MarkArray_IndirectAssetRef({0}, {1}, {2});", - member->m_asset_ref->m_name, + LINEF("MarkArray_IndirectAssetRef({0}::EnumEntry, {1}, {2});", + member->m_asset_ref, MakeMemberAccess(info, member, modifier), modifier.GetArraySize()) } else { - LINEF("MarkArray_IndirectAssetRef({0}, {1}, {2});", - member->m_asset_ref->m_name, + LINEF("MarkArray_IndirectAssetRef({0}::EnumEntry, {1}, {2});", + member->m_asset_ref, MakeMemberAccess(info, member, modifier), MakeEvaluation(modifier.GetPointerArrayCountEvaluation())) } } else if (loadType == MemberLoadType::SINGLE_POINTER) { - LINEF("Mark_IndirectAssetRef({0}, {1});", member->m_asset_ref->m_name, MakeMemberAccess(info, member, modifier)) + LINEF("Mark_IndirectAssetRef({0}::EnumEntry, {1});", member->m_asset_ref, MakeMemberAccess(info, member, modifier)) } else { @@ -505,7 +505,7 @@ namespace { MarkMember_ScriptString(info, member, modifier, loadType); } - else if (member->m_asset_ref) + else if (!member->m_asset_ref.empty()) { MarkMember_AssetRef(info, member, modifier, loadType); } @@ -740,7 +740,7 @@ namespace if (computations.ShouldIgnore() || computations.IsInRuntimeBlock()) return; - if (member->m_is_script_string || member->m_asset_ref + if (member->m_is_script_string || !member->m_asset_ref.empty() || member->m_type && (member->m_type->m_requires_marking || StructureComputations(member->m_type).IsAsset())) { if (info->m_definition->GetType() == DataDefinitionType::UNION) diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp index 84e78363..c6bc11a2 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp @@ -5,8 +5,8 @@ namespace { - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_ASSET_NAME = 2; + constexpr auto CAPTURE_TYPE = 1; + constexpr auto CAPTURE_ASSET_NAME = 2; } // namespace SequenceAsset::SequenceAsset() @@ -31,7 +31,7 @@ void SequenceAsset::ProcessMatch(CommandsParserState* state, SequenceResult(definition); + const auto* definitionWithMembers = dynamic_cast(definition); if (definitionWithMembers == nullptr) throw ParsingException(typeNameToken.GetPos(), "Type must be struct or union"); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp index 2a8912e5..12524f4c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp @@ -7,10 +7,17 @@ namespace { - static constexpr auto TAG_DEFAULT = 1; + constexpr auto CAPTURE_TYPE = 1; + constexpr auto CAPTURE_ASSET_NAME = 2; - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_ASSET_TYPE_ENUM_ENTRY = 2; + bool AssetWithNameIsKnown(const std::string& assetName, const IDataRepository& repository) + { + return std::ranges::any_of(repository.GetAllStructureInformation(), + [&assetName](const StructureInformation* info) + { + return !info->m_asset_name.empty() && info->m_asset_name == assetName; + }); + } } // namespace SequenceAssetRef::SequenceAssetRef() @@ -22,17 +29,18 @@ SequenceAssetRef::SequenceAssetRef() create.Keyword("set"), create.Keyword("assetref"), create.Label(CommandsCommonMatchers::LABEL_TYPENAME).Capture(CAPTURE_TYPE), - create.Identifier().Capture(CAPTURE_ASSET_TYPE_ENUM_ENTRY), + create.Identifier().Capture(CAPTURE_ASSET_NAME), create.Char(';'), }); } void SequenceAssetRef::ProcessMatch(CommandsParserState* state, SequenceResult& result) const { - const auto& enumEntryToken = result.NextCapture(CAPTURE_ASSET_TYPE_ENUM_ENTRY); - const auto* enumMember = state->GetRepository()->GetEnumMemberByName(enumEntryToken.IdentifierValue()); - if (enumMember == nullptr) - throw ParsingException(enumEntryToken.GetPos(), "Unknown asset type enum entry"); + const auto& assetNameToken = result.NextCapture(CAPTURE_ASSET_NAME); + auto assetName = assetNameToken.IdentifierValue(); + + if (!AssetWithNameIsKnown(assetName, *state->GetRepository())) + throw ParsingException(assetNameToken.GetPos(), "No asset with this name"); const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE); @@ -75,5 +83,5 @@ void SequenceAssetRef::ProcessMatch(CommandsParserState* state, SequenceResultm_type->GetType() != DataDefinitionType::BASE_TYPE) throw ParsingException(typeNameToken.GetPos(), "Invalid type for string, must be a base type"); - lastMember->m_asset_ref = enumMember; + lastMember->m_asset_ref = std::move(assetName); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp index 137beb7a..f09a2932 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp @@ -47,7 +47,7 @@ namespace continue; // Any script strings, asset refs and assets need to be processed. - if (member->m_is_script_string || member->m_asset_ref || member->m_type && StructureComputations(member->m_type).IsAsset()) + if (member->m_is_script_string || !member->m_asset_ref.empty() || member->m_type && StructureComputations(member->m_type).IsAsset()) { info->m_requires_marking = true; return true; From e5784d09ed123ec4d340465c69aca258d69fbad4 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Wed, 4 Feb 2026 23:00:10 +0100 Subject: [PATCH 2/3] refactor: retrieve asset names from IGame --- src/Common/Game/IGame.h | 5 + src/Common/Game/IW3/GameIW3.cpp | 62 +++++++++---- src/Common/Game/IW3/GameIW3.h | 4 + src/Common/Game/IW4/GameIW4.cpp | 67 ++++++++++---- src/Common/Game/IW4/GameIW4.h | 3 + src/Common/Game/IW5/GameIW5.cpp | 104 +++++++++++++++++---- src/Common/Game/IW5/GameIW5.h | 3 + src/Common/Game/T5/GameT5.cpp | 99 +++++++++++++------- src/Common/Game/T5/GameT5.h | 3 + src/Common/Game/T6/GameT6.cpp | 158 ++++++++++++++++++++++++-------- src/Common/Game/T6/GameT6.h | 3 + 11 files changed, 389 insertions(+), 122 deletions(-) diff --git a/src/Common/Game/IGame.h b/src/Common/Game/IGame.h index a53ed7b6..71c27528 100644 --- a/src/Common/Game/IGame.h +++ b/src/Common/Game/IGame.h @@ -1,8 +1,10 @@ #pragma once #include "GameLanguage.h" +#include "Zone/ZoneTypes.h" #include +#include #include #include @@ -64,5 +66,8 @@ public: [[nodiscard]] virtual const std::string& GetShortName() const = 0; [[nodiscard]] virtual const std::vector& GetLanguagePrefixes() const = 0; + [[nodiscard]] virtual asset_type_t GetAssetTypeCount() const = 0; + [[nodiscard]] virtual std::optional GetAssetTypeName(asset_type_t assetType) const = 0; + static IGame* GetGameById(GameId gameId); }; diff --git a/src/Common/Game/IW3/GameIW3.cpp b/src/Common/Game/IW3/GameIW3.cpp index e95cdf5a..63d4944b 100644 --- a/src/Common/Game/IW3/GameIW3.cpp +++ b/src/Common/Game/IW3/GameIW3.cpp @@ -1,28 +1,56 @@ #include "GameIW3.h" +#include "IW3.h" + #include using namespace IW3; -GameId Game::GetId() const +namespace { - return GameId::IW3; -} + constexpr const char* ASSET_TYPE_NAMES[ASSET_TYPE_COUNT]{ + "xmodelpieces", "physpreset", "xanim", "xmodel", "material", "techniqueset", "image", "sound", "soundcurve", "loadedsound", + "clipmap_unused", "clipmap", "comworld", "gameworldsp", "gameworldmp", "mapents", "gfxworld", "lightdef", "uimap", "font", + "menulist", "menu", "localize", "weapon", "snddriverglobals", "fx", "impactfx", "aitype", "mptype", "character", + "xmodelalias", "rawfile", "stringtable", + }; +} // namespace -const std::string& Game::GetFullName() const +namespace IW3 { - static std::string fullName = "Call Of Duty 4: Modern Warfare"; - return fullName; -} + GameId Game::GetId() const + { + return GameId::IW3; + } -const std::string& Game::GetShortName() const -{ - static std::string shortName = "IW3"; - return shortName; -} + const std::string& Game::GetFullName() const + { + static std::string fullName = "Call Of Duty 4: Modern Warfare"; + return fullName; + } -const std::vector& Game::GetLanguagePrefixes() const -{ - static std::vector prefixes; - return prefixes; -} + const std::string& Game::GetShortName() const + { + static std::string shortName = "IW3"; + return shortName; + } + + const std::vector& Game::GetLanguagePrefixes() const + { + static std::vector prefixes; + return prefixes; + } + + asset_type_t Game::GetAssetTypeCount() const + { + return ASSET_TYPE_COUNT; + } + + std::optional Game::GetAssetTypeName(const asset_type_t assetType) const + { + if (assetType < std::extent_v) + return ASSET_TYPE_NAMES[assetType]; + + return std::nullopt; + } +} // namespace IW3 diff --git a/src/Common/Game/IW3/GameIW3.h b/src/Common/Game/IW3/GameIW3.h index 07dfdb43..852e2049 100644 --- a/src/Common/Game/IW3/GameIW3.h +++ b/src/Common/Game/IW3/GameIW3.h @@ -1,4 +1,5 @@ #pragma once + #include "Game/IGame.h" namespace IW3 @@ -10,5 +11,8 @@ namespace IW3 [[nodiscard]] const std::string& GetFullName() const override; [[nodiscard]] const std::string& GetShortName() const override; [[nodiscard]] const std::vector& GetLanguagePrefixes() const override; + + [[nodiscard]] asset_type_t GetAssetTypeCount() const override; + [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; }; } // namespace IW3 diff --git a/src/Common/Game/IW4/GameIW4.cpp b/src/Common/Game/IW4/GameIW4.cpp index 1a26117e..ec81db3d 100644 --- a/src/Common/Game/IW4/GameIW4.cpp +++ b/src/Common/Game/IW4/GameIW4.cpp @@ -1,28 +1,61 @@ #include "GameIW4.h" +#include "IW4.h" + #include using namespace IW4; -GameId Game::GetId() const +namespace { - return GameId::IW4; -} + constexpr const char* ASSET_TYPE_NAMES[ASSET_TYPE_COUNT]{ + "physpreset", "physcollmap", "xanim", "xmodelsurfs", "xmodel", + "material", "pixelshader", "vertexshader", "vertexdecl", "techniqueset", + "image", "sound", "soundcurve", "loadedsound", "clipmap_unused", + "clipmap", "comworld", "gameworldsp", "gameworldmp", "mapents", + "fxworld", "gfxworld", "lightdef", "uimap", "font", + "menulist", "menu", "localize", "weapon", "snddriverglobals", + "fx", "impactfx", "aitype", "mptype", "character", + "xmodelalias", "rawfile", "stringtable", "leaderboard", "structureddatadef", + "tracer", "vehicle", "addonmapents", + }; +} // namespace -const std::string& Game::GetFullName() const +namespace IW4 { - static std::string fullName = "Call Of Duty: Modern Warfare 2"; - return fullName; -} + GameId Game::GetId() const + { + return GameId::IW4; + } -const std::string& Game::GetShortName() const -{ - static std::string shortName = "IW4"; - return shortName; -} + const std::string& Game::GetFullName() const + { + static std::string fullName = "Call Of Duty: Modern Warfare 2"; + return fullName; + } -const std::vector& Game::GetLanguagePrefixes() const -{ - static std::vector prefixes; - return prefixes; -} + const std::string& Game::GetShortName() const + { + static std::string shortName = "IW4"; + return shortName; + } + + const std::vector& Game::GetLanguagePrefixes() const + { + static std::vector prefixes; + return prefixes; + } + + asset_type_t Game::GetAssetTypeCount() const + { + return ASSET_TYPE_COUNT; + } + + std::optional Game::GetAssetTypeName(const asset_type_t assetType) const + { + if (assetType < std::extent_v) + return ASSET_TYPE_NAMES[assetType]; + + return std::nullopt; + } +} // namespace IW4 diff --git a/src/Common/Game/IW4/GameIW4.h b/src/Common/Game/IW4/GameIW4.h index 54967067..bd63bd67 100644 --- a/src/Common/Game/IW4/GameIW4.h +++ b/src/Common/Game/IW4/GameIW4.h @@ -10,5 +10,8 @@ namespace IW4 [[nodiscard]] const std::string& GetFullName() const override; [[nodiscard]] const std::string& GetShortName() const override; [[nodiscard]] const std::vector& GetLanguagePrefixes() const override; + + [[nodiscard]] asset_type_t GetAssetTypeCount() const override; + [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; }; } // namespace IW4 diff --git a/src/Common/Game/IW5/GameIW5.cpp b/src/Common/Game/IW5/GameIW5.cpp index 7cddaa87..1a863bb1 100644 --- a/src/Common/Game/IW5/GameIW5.cpp +++ b/src/Common/Game/IW5/GameIW5.cpp @@ -1,28 +1,98 @@ #include "GameIW5.h" +#include "IW5.h" + #include using namespace IW5; -GameId Game::GetId() const +namespace { - return GameId::IW5; -} + constexpr const char* ASSET_TYPE_NAMES[ASSET_TYPE_COUNT]{ + "physpreset", + "physcollmap", + "xanim", + "xmodelsurfs", + "xmodel", + "material", + "pixelshader", + "vertexshader", + "vertexdecl", + "techniqueset", + "image", + "sound", + "soundcurve", + "loadedsound", + "clipmap", + "comworld", + "glassworld", + "pathdata", + "vehicletrack", + "mapents", + "fxworld", + "gfxworld", + "lightdef", + "uimap", + "font", + "menulist", + "menu", + "localize", + "attachment", + "weapon", + "snddriverglobals", + "fx", + "impactfx", + "surfacefx", + "aitype", + "mptype", + "character", + "xmodelalias", + "rawfile", + "scriptfile", + "stringtable", + "leaderboard", + "structureddatadef", + "tracer", + "vehicle", + "addonmapents", + }; +} // namespace -const std::string& Game::GetFullName() const +namespace IW5 { - static std::string fullName = "Call Of Duty: Modern Warfare 3"; - return fullName; -} + GameId Game::GetId() const + { + return GameId::IW5; + } -const std::string& Game::GetShortName() const -{ - static std::string shortName = "IW5"; - return shortName; -} + const std::string& Game::GetFullName() const + { + static std::string fullName = "Call Of Duty: Modern Warfare 3"; + return fullName; + } -const std::vector& Game::GetLanguagePrefixes() const -{ - static std::vector prefixes; - return prefixes; -} + const std::string& Game::GetShortName() const + { + static std::string shortName = "IW5"; + return shortName; + } + + const std::vector& Game::GetLanguagePrefixes() const + { + static std::vector prefixes; + return prefixes; + } + + asset_type_t Game::GetAssetTypeCount() const + { + return ASSET_TYPE_COUNT; + } + + std::optional Game::GetAssetTypeName(const asset_type_t assetType) const + { + if (assetType < std::extent_v) + return ASSET_TYPE_NAMES[assetType]; + + return std::nullopt; + } +} // namespace IW5 diff --git a/src/Common/Game/IW5/GameIW5.h b/src/Common/Game/IW5/GameIW5.h index a0ca6309..bec5019e 100644 --- a/src/Common/Game/IW5/GameIW5.h +++ b/src/Common/Game/IW5/GameIW5.h @@ -10,5 +10,8 @@ namespace IW5 [[nodiscard]] const std::string& GetFullName() const override; [[nodiscard]] const std::string& GetShortName() const override; [[nodiscard]] const std::vector& GetLanguagePrefixes() const override; + + [[nodiscard]] asset_type_t GetAssetTypeCount() const override; + [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; }; } // namespace IW5 diff --git a/src/Common/Game/T5/GameT5.cpp b/src/Common/Game/T5/GameT5.cpp index 2609df85..cf41a117 100644 --- a/src/Common/Game/T5/GameT5.cpp +++ b/src/Common/Game/T5/GameT5.cpp @@ -1,43 +1,74 @@ #include "GameT5.h" +#include "T5.h" + #include using namespace T5; -GameId Game::GetId() const +namespace { - return GameId::T5; -} - -const std::string& Game::GetFullName() const -{ - static std::string fullName = "Call Of Duty: Black Ops"; - return fullName; -} - -const std::string& Game::GetShortName() const -{ - static std::string shortName = "T5"; - return shortName; -} - -const std::vector& Game::GetLanguagePrefixes() const -{ - static std::vector prefixes{ - {GameLanguage::LANGUAGE_ENGLISH, "en_"}, - {GameLanguage::LANGUAGE_FRENCH, "fr_"}, - {GameLanguage::LANGUAGE_FRENCH_CAN, "fc_"}, - {GameLanguage::LANGUAGE_GERMAN, "ge_"}, - {GameLanguage::LANGUAGE_AUSTRIAN, "ge_"}, - {GameLanguage::LANGUAGE_ITALIAN, "it_"}, - {GameLanguage::LANGUAGE_SPANISH, "sp_"}, - {GameLanguage::LANGUAGE_BRITISH, "br_"}, - {GameLanguage::LANGUAGE_RUSSIAN, "ru_"}, - {GameLanguage::LANGUAGE_POLISH, "po_"}, - {GameLanguage::LANGUAGE_KOREAN, "ko_"}, - {GameLanguage::LANGUAGE_JAPANESE, "ja_"}, - {GameLanguage::LANGUAGE_CZECH, "cz_"}, + constexpr const char* ASSET_TYPE_NAMES[ASSET_TYPE_COUNT]{ + "xmodelpieces", "physpreset", "physconstraints", "destructibledef", "xanim", "xmodel", "material", + "techniqueset", "image", "soundbank", "soundpatch", "clipmap_unused", "clipmap", "comworld", + "gameworldsp", "gameworldmp", "mapents", "gfxworld", "gfxlightdef", "uimap", "font", + "menulist", "menu", "localize", "weapon", "weapondef", "weaponvariant", "snddriverglobals", + "fx", "fximpacttable", "aitype", "mptype", "mpbody", "mphead", "character", + "xmodelalias", "rawfile", "stringtable", "packindex", "xglobals", "ddl", "glasses", + "emblemset", }; +} // namespace - return prefixes; -} +namespace T5 +{ + GameId Game::GetId() const + { + return GameId::T5; + } + + const std::string& Game::GetFullName() const + { + static std::string fullName = "Call Of Duty: Black Ops"; + return fullName; + } + + const std::string& Game::GetShortName() const + { + static std::string shortName = "T5"; + return shortName; + } + + const std::vector& Game::GetLanguagePrefixes() const + { + static std::vector prefixes{ + {GameLanguage::LANGUAGE_ENGLISH, "en_"}, + {GameLanguage::LANGUAGE_FRENCH, "fr_"}, + {GameLanguage::LANGUAGE_FRENCH_CAN, "fc_"}, + {GameLanguage::LANGUAGE_GERMAN, "ge_"}, + {GameLanguage::LANGUAGE_AUSTRIAN, "ge_"}, + {GameLanguage::LANGUAGE_ITALIAN, "it_"}, + {GameLanguage::LANGUAGE_SPANISH, "sp_"}, + {GameLanguage::LANGUAGE_BRITISH, "br_"}, + {GameLanguage::LANGUAGE_RUSSIAN, "ru_"}, + {GameLanguage::LANGUAGE_POLISH, "po_"}, + {GameLanguage::LANGUAGE_KOREAN, "ko_"}, + {GameLanguage::LANGUAGE_JAPANESE, "ja_"}, + {GameLanguage::LANGUAGE_CZECH, "cz_"}, + }; + + return prefixes; + } + + asset_type_t Game::GetAssetTypeCount() const + { + return ASSET_TYPE_COUNT; + } + + std::optional Game::GetAssetTypeName(const asset_type_t assetType) const + { + if (assetType < std::extent_v) + return ASSET_TYPE_NAMES[assetType]; + + return std::nullopt; + } +} // namespace T5 diff --git a/src/Common/Game/T5/GameT5.h b/src/Common/Game/T5/GameT5.h index 213037ba..fdc8334b 100644 --- a/src/Common/Game/T5/GameT5.h +++ b/src/Common/Game/T5/GameT5.h @@ -10,5 +10,8 @@ namespace T5 [[nodiscard]] const std::string& GetFullName() const override; [[nodiscard]] const std::string& GetShortName() const override; [[nodiscard]] const std::vector& GetLanguagePrefixes() const override; + + [[nodiscard]] asset_type_t GetAssetTypeCount() const override; + [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; }; } // namespace T5 diff --git a/src/Common/Game/T6/GameT6.cpp b/src/Common/Game/T6/GameT6.cpp index c2ba1c4e..3a38a387 100644 --- a/src/Common/Game/T6/GameT6.cpp +++ b/src/Common/Game/T6/GameT6.cpp @@ -1,46 +1,130 @@ #include "GameT6.h" +#include "T6.h" + #include using namespace T6; -GameId Game::GetId() const +namespace { - return GameId::T6; -} - -const std::string& Game::GetFullName() const -{ - static std::string fullName = "Call Of Duty: Black Ops II"; - return fullName; -} - -const std::string& Game::GetShortName() const -{ - static std::string shortName = "T6"; - return shortName; -} - -const std::vector& Game::GetLanguagePrefixes() const -{ - static std::vector prefixes{ - {GameLanguage::LANGUAGE_ENGLISH, "en_"}, - {GameLanguage::LANGUAGE_FRENCH, "fr_"}, - {GameLanguage::LANGUAGE_FRENCH_CAN, "fc_"}, - {GameLanguage::LANGUAGE_GERMAN, "ge_"}, - {GameLanguage::LANGUAGE_AUSTRIAN, "as_"}, - {GameLanguage::LANGUAGE_ITALIAN, "it_"}, - {GameLanguage::LANGUAGE_SPANISH, "sp_"}, - {GameLanguage::LANGUAGE_BRITISH, "br_"}, - {GameLanguage::LANGUAGE_RUSSIAN, "ru_"}, - {GameLanguage::LANGUAGE_POLISH, "po_"}, - {GameLanguage::LANGUAGE_KOREAN, "ko_"}, - {GameLanguage::LANGUAGE_JAPANESE, "ja_"}, - {GameLanguage::LANGUAGE_CZECH, "cz_"}, - {GameLanguage::LANGUAGE_FULL_JAPANESE, "fj_"}, - {GameLanguage::LANGUAGE_PORTUGUESE, "bp_"}, - {GameLanguage::LANGUAGE_MEXICAN_SPANISH, "ms_"}, + constexpr const char* ASSET_TYPE_NAMES[ASSET_TYPE_COUNT]{ + "xmodelpieces", + "physpreset", + "physconstraints", + "destructibledef", + "xanim", + "xmodel", + "material", + "techniqueset", + "image", + "soundbank", + "soundpatch", + "clipmap_unused", + "clipmap", + "comworld", + "gameworldsp", + "gameworldmp", + "mapents", + "gfxworld", + "gfxlightdef", + "uimap", + "font", + "fonticon", + "menulist", + "menu", + "localize", + "weapon", + "weapondef", + "weaponvariant", + "weaponfull", + "attachment", + "attachmentunique", + "camo", + "snddriverglobals", + "fx", + "fximpacttable", + "aitype", + "mptype", + "mpbody", + "mphead", + "character", + "xmodelalias", + "rawfile", + "stringtable", + "leaderboard", + "xglobals", + "ddl", + "glasses", + "emblemset", + "script", + "keyvaluepairs", + "vehicle", + "memoryblock", + "addonmapents", + "tracer", + "skinnedverts", + "qdb", + "slug", + "footsteptable", + "footstepfxtable", + "zbarrier", }; +} // namespace - return prefixes; -} +namespace T6 +{ + GameId Game::GetId() const + { + return GameId::T6; + } + + const std::string& Game::GetFullName() const + { + static std::string fullName = "Call Of Duty: Black Ops II"; + return fullName; + } + + const std::string& Game::GetShortName() const + { + static std::string shortName = "T6"; + return shortName; + } + + const std::vector& Game::GetLanguagePrefixes() const + { + static std::vector prefixes{ + {GameLanguage::LANGUAGE_ENGLISH, "en_"}, + {GameLanguage::LANGUAGE_FRENCH, "fr_"}, + {GameLanguage::LANGUAGE_FRENCH_CAN, "fc_"}, + {GameLanguage::LANGUAGE_GERMAN, "ge_"}, + {GameLanguage::LANGUAGE_AUSTRIAN, "as_"}, + {GameLanguage::LANGUAGE_ITALIAN, "it_"}, + {GameLanguage::LANGUAGE_SPANISH, "sp_"}, + {GameLanguage::LANGUAGE_BRITISH, "br_"}, + {GameLanguage::LANGUAGE_RUSSIAN, "ru_"}, + {GameLanguage::LANGUAGE_POLISH, "po_"}, + {GameLanguage::LANGUAGE_KOREAN, "ko_"}, + {GameLanguage::LANGUAGE_JAPANESE, "ja_"}, + {GameLanguage::LANGUAGE_CZECH, "cz_"}, + {GameLanguage::LANGUAGE_FULL_JAPANESE, "fj_"}, + {GameLanguage::LANGUAGE_PORTUGUESE, "bp_"}, + {GameLanguage::LANGUAGE_MEXICAN_SPANISH, "ms_"}, + }; + + return prefixes; + } + + asset_type_t Game::GetAssetTypeCount() const + { + return ASSET_TYPE_COUNT; + } + + std::optional Game::GetAssetTypeName(const asset_type_t assetType) const + { + if (assetType < std::extent_v) + return ASSET_TYPE_NAMES[assetType]; + + return std::nullopt; + } +} // namespace T6 diff --git a/src/Common/Game/T6/GameT6.h b/src/Common/Game/T6/GameT6.h index 0fbd4b7a..060b50be 100644 --- a/src/Common/Game/T6/GameT6.h +++ b/src/Common/Game/T6/GameT6.h @@ -10,5 +10,8 @@ namespace T6 [[nodiscard]] const std::string& GetFullName() const override; [[nodiscard]] const std::string& GetShortName() const override; [[nodiscard]] const std::vector& GetLanguagePrefixes() const override; + + [[nodiscard]] asset_type_t GetAssetTypeCount() const override; + [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; }; } // namespace T6 From 3b1e65e8cc108c62b4c22993ad1d33e141649a41 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Wed, 4 Feb 2026 22:35:33 +0000 Subject: [PATCH 3/3] refactor: move asset type names to IGame implementations --- src/ObjLoading/Asset/AssetCreationContext.cpp | 16 ++-- src/ObjLoading/Asset/AssetCreationContext.h | 1 - .../Asset/AssetCreatorCollection.cpp | 7 +- .../ContentLister/ContentPrinter.cpp | 2 +- src/Unlinking/Unlinker.cpp | 40 ++++---- .../Game/IW3/AssetNameResolverIW3.cpp | 22 ----- .../Game/IW3/AssetNameResolverIW3.h | 14 --- src/ZoneCommon/Game/IW3/GameAssetPoolIW3.cpp | 36 -------- src/ZoneCommon/Game/IW3/GameAssetPoolIW3.h | 7 -- .../IW3/Zone/Definition/ZoneDefWriterIW3.cpp | 5 +- .../Game/IW4/AssetNameResolverIW4.cpp | 22 ----- .../Game/IW4/AssetNameResolverIW4.h | 14 --- src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp | 41 --------- src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h | 6 -- .../IW4/Zone/Definition/ZoneDefWriterIW4.cpp | 5 +- .../Game/IW5/AssetNameResolverIW5.cpp | 22 ----- .../Game/IW5/AssetNameResolverIW5.h | 14 --- src/ZoneCommon/Game/IW5/GameAssetPoolIW5.cpp | 78 ---------------- src/ZoneCommon/Game/IW5/GameAssetPoolIW5.h | 6 -- .../IW5/Zone/Definition/ZoneDefWriterIW5.cpp | 5 +- .../Game/T5/AssetNameResolverT5.cpp | 22 ----- src/ZoneCommon/Game/T5/AssetNameResolverT5.h | 14 --- src/ZoneCommon/Game/T5/GameAssetPoolT5.cpp | 39 -------- src/ZoneCommon/Game/T5/GameAssetPoolT5.h | 6 -- .../T5/Zone/Definition/ZoneDefWriterT5.cpp | 5 +- .../Game/T6/AssetNameResolverT6.cpp | 22 ----- src/ZoneCommon/Game/T6/AssetNameResolverT6.h | 14 --- src/ZoneCommon/Game/T6/GameAssetPoolT6.cpp | 92 ------------------- src/ZoneCommon/Game/T6/GameAssetPoolT6.h | 6 -- .../T6/Zone/Definition/ZoneDefWriterT6.cpp | 5 +- src/ZoneCommon/Pool/ZoneAssetPools.h | 3 - .../Zone/AssetList/AssetListOutputStream.cpp | 4 +- .../Zone/AssetList/AssetListOutputStream.h | 3 +- .../Zone/AssetList/AssetListReader.cpp | 8 +- src/ZoneCommon/Zone/AssetNameResolver.cpp | 38 +++----- src/ZoneCommon/Zone/AssetNameResolver.h | 25 +---- .../Sequence/SequenceZoneDefinitionEntry.cpp | 5 +- .../Parsing/ZoneDefinitionParserState.cpp | 3 +- .../Parsing/ZoneDefinitionParserState.h | 2 +- 39 files changed, 72 insertions(+), 607 deletions(-) delete mode 100644 src/ZoneCommon/Game/IW3/AssetNameResolverIW3.cpp delete mode 100644 src/ZoneCommon/Game/IW3/AssetNameResolverIW3.h delete mode 100644 src/ZoneCommon/Game/IW4/AssetNameResolverIW4.cpp delete mode 100644 src/ZoneCommon/Game/IW4/AssetNameResolverIW4.h delete mode 100644 src/ZoneCommon/Game/IW5/AssetNameResolverIW5.cpp delete mode 100644 src/ZoneCommon/Game/IW5/AssetNameResolverIW5.h delete mode 100644 src/ZoneCommon/Game/T5/AssetNameResolverT5.cpp delete mode 100644 src/ZoneCommon/Game/T5/AssetNameResolverT5.h delete mode 100644 src/ZoneCommon/Game/T6/AssetNameResolverT6.cpp delete mode 100644 src/ZoneCommon/Game/T6/AssetNameResolverT6.h diff --git a/src/ObjLoading/Asset/AssetCreationContext.cpp b/src/ObjLoading/Asset/AssetCreationContext.cpp index 268f7479..b5a2bd0e 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.cpp +++ b/src/ObjLoading/Asset/AssetCreationContext.cpp @@ -4,7 +4,6 @@ #include #include -#include IgnoredAssetLookup::IgnoredAssetLookup() = default; @@ -89,7 +88,7 @@ XAssetInfoGeneric* AssetCreationContext::AddAssetGeneric(GenericAssetRegistratio addedAsset = m_zone.m_pools->AddAsset(std::move(xAssetInfo)); if (addedAsset == nullptr) - con::error("Failed to add asset of type \"{}\" to pool: \"{}\"", *m_zone.m_pools->GetAssetTypeName(assetType), pAssetName); + con::error(R"(Failed to add asset of type "{}" to pool: "{}")", *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType), pAssetName); return addedAsset; } @@ -99,7 +98,7 @@ XAssetInfoGeneric* AssetCreationContext::LoadDefaultAssetDependency(const asset_ if (result.HasTakenAction() && !result.HasFailed()) return result.GetAssetInfo(); - con::error("Failed to create default asset of type {}", *m_zone.m_pools->GetAssetTypeName(assetType)); + con::error("Failed to create default asset of type {}", *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType)); return nullptr; } @@ -129,11 +128,11 @@ XAssetInfoGeneric* AssetCreationContext::LoadDependencyGeneric(const asset_type_ if (!result.HasFailed()) return result.GetAssetInfo(); - con::error("Could not load asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); + con::error(R"(Could not load asset "{}" of type "{}")", assetName, *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType)); } else if (required) { - con::error("Missing asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); + con::error(R"(Missing asset "{}" of type "{}")", assetName, *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType)); } return nullptr; @@ -151,7 +150,8 @@ IndirectAssetReference AssetCreationContext::LoadIndirectAssetReferenceGeneric(c const auto result = m_creators->CreateAsset(assetType, assetName, *this); if (!result.HasTakenAction() && !result.HasFailed()) { - con::warn("Could not load indirectly referenced asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); + con::warn( + R"(Could not load indirectly referenced asset "{}" of type "{}")", assetName, *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType)); } return IndirectAssetReference(assetType, assetName); } @@ -187,11 +187,11 @@ XAssetInfoGeneric* AssetCreationContext::ForceLoadDependencyGeneric(const asset_ if (!result.HasFailed()) return result.GetAssetInfo(); - con::error("Could not load asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); + con::error(R"(Could not load asset "{}" of type "{}")", assetName, *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType)); } else { - con::error("Missing asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); + con::error(R"(Missing asset "{}" of type "{}")", assetName, *IGame::GetGameById(m_zone.m_game_id)->GetAssetTypeName(assetType)); } return nullptr; diff --git a/src/ObjLoading/Asset/AssetCreationContext.h b/src/ObjLoading/Asset/AssetCreationContext.h index c83446c5..d0efd031 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.h +++ b/src/ObjLoading/Asset/AssetCreationContext.h @@ -11,7 +11,6 @@ #include #include #include -#include class AssetCreatorCollection; diff --git a/src/ObjLoading/Asset/AssetCreatorCollection.cpp b/src/ObjLoading/Asset/AssetCreatorCollection.cpp index ee237293..4ed9b70f 100644 --- a/src/ObjLoading/Asset/AssetCreatorCollection.cpp +++ b/src/ObjLoading/Asset/AssetCreatorCollection.cpp @@ -4,9 +4,10 @@ AssetCreatorCollection::AssetCreatorCollection(const Zone& zone) { - m_asset_creators_by_type.resize(zone.m_pools->GetAssetTypeCount()); - m_asset_post_processors_by_type.resize(zone.m_pools->GetAssetTypeCount()); - m_default_asset_creators_by_type.resize(zone.m_pools->GetAssetTypeCount()); + const auto* game = IGame::GetGameById(zone.m_game_id); + m_asset_creators_by_type.resize(game->GetAssetTypeCount()); + m_asset_post_processors_by_type.resize(game->GetAssetTypeCount()); + m_default_asset_creators_by_type.resize(game->GetAssetTypeCount()); } void AssetCreatorCollection::AddAssetCreator(std::unique_ptr creator) diff --git a/src/Unlinking/ContentLister/ContentPrinter.cpp b/src/Unlinking/ContentLister/ContentPrinter.cpp index 2134dcdc..bdd00134 100644 --- a/src/Unlinking/ContentLister/ContentPrinter.cpp +++ b/src/Unlinking/ContentLister/ContentPrinter.cpp @@ -18,7 +18,7 @@ void ContentPrinter::PrintContent() const con::info("Content:"); for (const auto& asset : *pools) - con::info("{}, {}", *pools->GetAssetTypeName(asset->m_type), asset->m_name); + con::info("{}, {}", *game->GetAssetTypeName(asset->m_type), asset->m_name); con::info(""); } diff --git a/src/Unlinking/Unlinker.cpp b/src/Unlinking/Unlinker.cpp index be90a78c..1175a9eb 100644 --- a/src/Unlinking/Unlinker.cpp +++ b/src/Unlinking/Unlinker.cpp @@ -8,9 +8,9 @@ #include "SearchPath/OutputPathFilesystem.h" #include "UnlinkerArgs.h" #include "UnlinkerPaths.h" -#include "Utils/ClassUtils.h" #include "Utils/Logging/Log.h" #include "Utils/ObjFileStream.h" +#include "Zone/AssetNameResolver.h" #include "Zone/Definition/ZoneDefWriter.h" #include "ZoneLoading.h" @@ -18,7 +18,6 @@ #include #include #include -#include namespace fs = std::filesystem; @@ -27,7 +26,7 @@ namespace class UnlinkerImpl : public Unlinker { public: - UnlinkerImpl(UnlinkerArgs args) + explicit UnlinkerImpl(UnlinkerArgs args) : m_args(std::move(args)) { } @@ -96,34 +95,27 @@ namespace void UpdateAssetIncludesAndExcludes(const AssetDumpingContext& context) const { - const auto assetTypeCount = context.m_zone.m_pools->GetAssetTypeCount(); + const auto gameId = context.m_zone.m_game_id; + const auto* game = IGame::GetGameById(gameId); + const auto assetTypeCount = game->GetAssetTypeCount(); - ObjWriting::Configuration.AssetTypesToHandleBitfield = std::vector(assetTypeCount); + const auto initialValue = m_args.m_asset_type_handling == UnlinkerArgs::AssetTypeHandling::EXCLUDE; + ObjWriting::Configuration.AssetTypesToHandleBitfield = std::vector(assetTypeCount, initialValue); std::vector handledSpecifiedAssets(m_args.m_specified_asset_types.size()); - for (auto i = 0u; i < assetTypeCount; i++) - { - const auto assetTypeName = std::string(*context.m_zone.m_pools->GetAssetTypeName(i)); - - const auto foundSpecifiedEntry = m_args.m_specified_asset_type_map.find(assetTypeName); - if (foundSpecifiedEntry != m_args.m_specified_asset_type_map.end()) - { - ObjWriting::Configuration.AssetTypesToHandleBitfield[i] = m_args.m_asset_type_handling == UnlinkerArgs::AssetTypeHandling::INCLUDE; - assert(foundSpecifiedEntry->second < handledSpecifiedAssets.size()); - handledSpecifiedAssets[foundSpecifiedEntry->second] = true; - } - else - ObjWriting::Configuration.AssetTypesToHandleBitfield[i] = m_args.m_asset_type_handling == UnlinkerArgs::AssetTypeHandling::EXCLUDE; - } - + const AssetNameResolver assetNameResolver(gameId); auto anySpecifiedValueInvalid = false; - for (auto i = 0u; i < handledSpecifiedAssets.size(); i++) + for (const auto& specifiedValue : m_args.m_specified_asset_types) { - if (!handledSpecifiedAssets[i]) + const auto maybeAssetType = assetNameResolver.GetAssetTypeByName(specifiedValue); + if (!maybeAssetType) { - con::error("Unknown asset type \"{}\"", m_args.m_specified_asset_types[i]); + con::error("Unknown asset type \"{}\"", specifiedValue); anySpecifiedValueInvalid = true; + continue; } + + ObjWriting::Configuration.AssetTypesToHandleBitfield[*maybeAssetType] = !initialValue; } if (anySpecifiedValueInvalid) @@ -134,7 +126,7 @@ namespace std::ostringstream ss; for (auto i = 0u; i < assetTypeCount; i++) { - const auto assetTypeName = std::string(*context.m_zone.m_pools->GetAssetTypeName(i)); + const auto assetTypeName = std::string(*game->GetAssetTypeName(i)); if (first) first = false; diff --git a/src/ZoneCommon/Game/IW3/AssetNameResolverIW3.cpp b/src/ZoneCommon/Game/IW3/AssetNameResolverIW3.cpp deleted file mode 100644 index 11284cff..00000000 --- a/src/ZoneCommon/Game/IW3/AssetNameResolverIW3.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "AssetNameResolverIW3.h" - -#include "Game/IW3/GameAssetPoolIW3.h" -#include "Utils/StringUtils.h" - -using namespace IW3; - -AssetNameResolver::AssetNameResolver() -{ - for (auto assetType = 0; assetType < ASSET_TYPE_COUNT; assetType++) - AddAssetTypeName(assetType, *GameAssetPoolIW3::AssetTypeNameByType(assetType)); -} - -GameId AssetNameResolver::GetGameId() const -{ - return GameId::IW3; -} - -std::optional AssetNameResolver::GetAssetTypeName(const asset_type_t assetType) const -{ - return GameAssetPoolIW3::AssetTypeNameByType(assetType); -} diff --git a/src/ZoneCommon/Game/IW3/AssetNameResolverIW3.h b/src/ZoneCommon/Game/IW3/AssetNameResolverIW3.h deleted file mode 100644 index fa7bffb4..00000000 --- a/src/ZoneCommon/Game/IW3/AssetNameResolverIW3.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "Zone/AssetNameResolver.h" - -namespace IW3 -{ - class AssetNameResolver final : public HashMapBasedAssetNameResolver - { - public: - AssetNameResolver(); - [[nodiscard]] GameId GetGameId() const override; - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - }; -} // namespace IW3 diff --git a/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.cpp b/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.cpp index 5d7f994a..6344a4e5 100644 --- a/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.cpp +++ b/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.cpp @@ -3,26 +3,13 @@ #include "Pool/AssetPoolDynamic.h" #include -#include using namespace IW3; -namespace -{ - constexpr const char* ASSET_TYPE_NAMES[]{ - "xmodelpieces", "physpreset", "xanim", "xmodel", "material", "techniqueset", "image", "sound", "soundcurve", "loadedsound", - "clipmap_unused", "clipmap", "comworld", "gameworldsp", "gameworldmp", "mapents", "gfxworld", "lightdef", "uimap", "font", - "menulist", "menu", "localize", "weapon", "snddriverglobals", "fx", "impactfx", "aitype", "mptype", "character", - "xmodelalias", "rawfile", "stringtable", - }; -} - GameAssetPoolIW3::GameAssetPoolIW3(Zone* zone, const zone_priority_t priority) : ZoneAssetPools(zone), m_priority(priority) { - static_assert(std::extent_v == ASSET_TYPE_COUNT); - #define INIT_POOL(poolName) (poolName) = std::make_unique>(m_priority) INIT_POOL(m_phys_preset); @@ -151,26 +138,3 @@ XAssetInfoGeneric* GameAssetPoolIW3::GetAsset(const asset_type_t type, const std #undef CASE_GET_ASSET } - -std::optional GameAssetPoolIW3::AssetTypeNameByType(const asset_type_t assetType) -{ - if (assetType >= 0 && assetType < static_cast(std::extent_v)) - return ASSET_TYPE_NAMES[assetType]; - - return std::nullopt; -} - -std::optional GameAssetPoolIW3::GetAssetTypeName(const asset_type_t assetType) const -{ - return AssetTypeNameByType(assetType); -} - -asset_type_t GameAssetPoolIW3::AssetTypeCount() -{ - return ASSET_TYPE_COUNT; -} - -asset_type_t GameAssetPoolIW3::GetAssetTypeCount() const -{ - return AssetTypeCount(); -} diff --git a/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.h b/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.h index 9d675501..8a023886 100644 --- a/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.h +++ b/src/ZoneCommon/Game/IW3/GameAssetPoolIW3.h @@ -5,7 +5,6 @@ #include "Pool/ZoneAssetPools.h" #include -#include class GameAssetPoolIW3 final : public ZoneAssetPools { @@ -41,12 +40,6 @@ public: [[nodiscard]] XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const override; - static std::optional AssetTypeNameByType(asset_type_t assetType); - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - - static asset_type_t AssetTypeCount(); - [[nodiscard]] asset_type_t GetAssetTypeCount() const override; - protected: XAssetInfoGeneric* AddAssetToPool(std::unique_ptr xAssetInfo) override; diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp index a98caa82..f1d22693 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp @@ -10,6 +10,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const { + const auto* game = IGame::GetGameById(zone.m_game_id); const auto* pools = dynamic_cast(zone.m_pools.get()); assert(pools); @@ -18,7 +19,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& // Localized strings are all collected in one string file. So only add this to the zone file. if (!pools->m_localize->m_asset_lookup.empty()) - stream.WriteEntry(*pools->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); + stream.WriteEntry(*game->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); for (const auto& asset : *pools) { @@ -28,7 +29,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& break; default: - stream.WriteEntry(*pools->GetAssetTypeName(asset->m_type), asset->m_name); + stream.WriteEntry(*game->GetAssetTypeName(asset->m_type), asset->m_name); break; } } diff --git a/src/ZoneCommon/Game/IW4/AssetNameResolverIW4.cpp b/src/ZoneCommon/Game/IW4/AssetNameResolverIW4.cpp deleted file mode 100644 index 1ca578fd..00000000 --- a/src/ZoneCommon/Game/IW4/AssetNameResolverIW4.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "AssetNameResolverIW4.h" - -#include "Game/IW4/GameAssetPoolIW4.h" -#include "Utils/StringUtils.h" - -using namespace IW4; - -AssetNameResolver::AssetNameResolver() -{ - for (auto assetType = 0; assetType < ASSET_TYPE_COUNT; assetType++) - AddAssetTypeName(assetType, *GameAssetPoolIW4::AssetTypeNameByType(assetType)); -} - -GameId AssetNameResolver::GetGameId() const -{ - return GameId::IW4; -} - -std::optional AssetNameResolver::GetAssetTypeName(const asset_type_t assetType) const -{ - return GameAssetPoolIW4::AssetTypeNameByType(assetType); -} diff --git a/src/ZoneCommon/Game/IW4/AssetNameResolverIW4.h b/src/ZoneCommon/Game/IW4/AssetNameResolverIW4.h deleted file mode 100644 index 49188830..00000000 --- a/src/ZoneCommon/Game/IW4/AssetNameResolverIW4.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "Zone/AssetNameResolver.h" - -namespace IW4 -{ - class AssetNameResolver final : public HashMapBasedAssetNameResolver - { - public: - AssetNameResolver(); - [[nodiscard]] GameId GetGameId() const override; - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - }; -} // namespace IW4 diff --git a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp index 882e7b37..8b6c0fbd 100644 --- a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp +++ b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp @@ -3,31 +3,13 @@ #include "Pool/AssetPoolDynamic.h" #include -#include using namespace IW4; -namespace -{ - constexpr const char* ASSET_TYPE_NAMES[]{ - "physpreset", "physcollmap", "xanim", "xmodelsurfs", "xmodel", - "material", "pixelshader", "vertexshader", "vertexdecl", "techniqueset", - "image", "sound", "soundcurve", "loadedsound", "clipmap_unused", - "clipmap", "comworld", "gameworldsp", "gameworldmp", "mapents", - "fxworld", "gfxworld", "lightdef", "uimap", "font", - "menulist", "menu", "localize", "weapon", "snddriverglobals", - "fx", "impactfx", "aitype", "mptype", "character", - "xmodelalias", "rawfile", "stringtable", "leaderboard", "structureddatadef", - "tracer", "vehicle", "addonmapents", - }; -} - GameAssetPoolIW4::GameAssetPoolIW4(Zone* zone, const zone_priority_t priority) : ZoneAssetPools(zone), m_priority(priority) { - static_assert(std::extent_v == ASSET_TYPE_COUNT); - #define INIT_POOL(poolName) (poolName) = std::make_unique>(m_priority) INIT_POOL(m_phys_preset); @@ -186,26 +168,3 @@ XAssetInfoGeneric* GameAssetPoolIW4::GetAsset(const asset_type_t type, const std #undef CASE_GET_ASSET } - -std::optional GameAssetPoolIW4::AssetTypeNameByType(const asset_type_t assetType) -{ - if (assetType >= 0 && assetType < static_cast(std::extent_v)) - return ASSET_TYPE_NAMES[assetType]; - - return std::nullopt; -} - -std::optional GameAssetPoolIW4::GetAssetTypeName(const asset_type_t assetType) const -{ - return AssetTypeNameByType(assetType); -} - -asset_type_t GameAssetPoolIW4::AssetTypeCount() -{ - return ASSET_TYPE_COUNT; -} - -asset_type_t GameAssetPoolIW4::GetAssetTypeCount() const -{ - return AssetTypeCount(); -} diff --git a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h index 77c0f941..9c900d5a 100644 --- a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h +++ b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h @@ -50,12 +50,6 @@ public: [[nodiscard]] XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const override; - static std::optional AssetTypeNameByType(asset_type_t assetType); - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - - static asset_type_t AssetTypeCount(); - [[nodiscard]] asset_type_t GetAssetTypeCount() const override; - protected: XAssetInfoGeneric* AddAssetToPool(std::unique_ptr xAssetInfo) override; diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp index 6bd9cc93..778e08ad 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp @@ -10,6 +10,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const { + const auto* game = IGame::GetGameById(zone.m_game_id); const auto* pools = dynamic_cast(zone.m_pools.get()); assert(pools); @@ -18,7 +19,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& // Localized strings are all collected in one string file. So only add this to the zone file. if (!pools->m_localize->m_asset_lookup.empty()) - stream.WriteEntry(*pools->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); + stream.WriteEntry(*game->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); for (const auto& asset : *pools) { @@ -28,7 +29,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& break; default: - stream.WriteEntry(*pools->GetAssetTypeName(asset->m_type), asset->m_name); + stream.WriteEntry(*game->GetAssetTypeName(asset->m_type), asset->m_name); break; } } diff --git a/src/ZoneCommon/Game/IW5/AssetNameResolverIW5.cpp b/src/ZoneCommon/Game/IW5/AssetNameResolverIW5.cpp deleted file mode 100644 index f25c5e77..00000000 --- a/src/ZoneCommon/Game/IW5/AssetNameResolverIW5.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "AssetNameResolverIW5.h" - -#include "Game/IW5/GameAssetPoolIW5.h" -#include "Utils/StringUtils.h" - -using namespace IW5; - -AssetNameResolver::AssetNameResolver() -{ - for (auto assetType = 0; assetType < ASSET_TYPE_COUNT; assetType++) - AddAssetTypeName(assetType, *GameAssetPoolIW5::AssetTypeNameByType(assetType)); -} - -GameId AssetNameResolver::GetGameId() const -{ - return GameId::IW5; -} - -std::optional AssetNameResolver::GetAssetTypeName(const asset_type_t assetType) const -{ - return GameAssetPoolIW5::AssetTypeNameByType(assetType); -} diff --git a/src/ZoneCommon/Game/IW5/AssetNameResolverIW5.h b/src/ZoneCommon/Game/IW5/AssetNameResolverIW5.h deleted file mode 100644 index 15096e8a..00000000 --- a/src/ZoneCommon/Game/IW5/AssetNameResolverIW5.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "Zone/AssetNameResolver.h" - -namespace IW5 -{ - class AssetNameResolver final : public HashMapBasedAssetNameResolver - { - public: - AssetNameResolver(); - [[nodiscard]] GameId GetGameId() const override; - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - }; -} // namespace IW5 diff --git a/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.cpp b/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.cpp index 4d22eff3..6fd87bfa 100644 --- a/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.cpp +++ b/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.cpp @@ -3,68 +3,13 @@ #include "Pool/AssetPoolDynamic.h" #include -#include using namespace IW5; -namespace -{ - constexpr const char* ASSET_TYPE_NAMES[]{ - "physpreset", - "physcollmap", - "xanim", - "xmodelsurfs", - "xmodel", - "material", - "pixelshader", - "vertexshader", - "vertexdecl", - "techniqueset", - "image", - "sound", - "soundcurve", - "loadedsound", - "clipmap", - "comworld", - "glassworld", - "pathdata", - "vehicletrack", - "mapents", - "fxworld", - "gfxworld", - "lightdef", - "uimap", - "font", - "menulist", - "menu", - "localize", - "attachment", - "weapon", - "snddriverglobals", - "fx", - "impactfx", - "surfacefx", - "aitype", - "mptype", - "character", - "xmodelalias", - "rawfile", - "scriptfile", - "stringtable", - "leaderboard", - "structureddatadef", - "tracer", - "vehicle", - "addonmapents", - }; -} - GameAssetPoolIW5::GameAssetPoolIW5(Zone* zone, const zone_priority_t priority) : ZoneAssetPools(zone), m_priority(priority) { - static_assert(std::extent_v == ASSET_TYPE_COUNT); - #define INIT_POOL(poolName) (poolName) = std::make_unique>(m_priority) INIT_POOL(m_phys_preset); @@ -236,26 +181,3 @@ XAssetInfoGeneric* GameAssetPoolIW5::GetAsset(const asset_type_t type, const std #undef CASE_GET_ASSET } - -std::optional GameAssetPoolIW5::AssetTypeNameByType(const asset_type_t assetType) -{ - if (assetType >= 0 && assetType < static_cast(std::extent_v)) - return ASSET_TYPE_NAMES[assetType]; - - return std::nullopt; -} - -std::optional GameAssetPoolIW5::GetAssetTypeName(const asset_type_t assetType) const -{ - return AssetTypeNameByType(assetType); -} - -asset_type_t GameAssetPoolIW5::AssetTypeCount() -{ - return ASSET_TYPE_COUNT; -} - -asset_type_t GameAssetPoolIW5::GetAssetTypeCount() const -{ - return AssetTypeCount(); -} diff --git a/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.h b/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.h index 0e40cfc7..43157699 100644 --- a/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.h +++ b/src/ZoneCommon/Game/IW5/GameAssetPoolIW5.h @@ -55,12 +55,6 @@ public: [[nodiscard]] XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const override; - static std::optional AssetTypeNameByType(asset_type_t assetType); - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - - static asset_type_t AssetTypeCount(); - [[nodiscard]] asset_type_t GetAssetTypeCount() const override; - protected: XAssetInfoGeneric* AddAssetToPool(std::unique_ptr xAssetInfo) override; diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp index 4678dc85..948b97c1 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp @@ -10,6 +10,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const { + const auto* game = IGame::GetGameById(zone.m_game_id); const auto* pools = dynamic_cast(zone.m_pools.get()); assert(pools); @@ -18,7 +19,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& // Localized strings are all collected in one string file. So only add this to the zone file. if (!pools->m_localize->m_asset_lookup.empty()) - stream.WriteEntry(*pools->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); + stream.WriteEntry(*game->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); for (const auto& asset : *pools) { @@ -28,7 +29,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& break; default: - stream.WriteEntry(*pools->GetAssetTypeName(asset->m_type), asset->m_name); + stream.WriteEntry(*game->GetAssetTypeName(asset->m_type), asset->m_name); break; } } diff --git a/src/ZoneCommon/Game/T5/AssetNameResolverT5.cpp b/src/ZoneCommon/Game/T5/AssetNameResolverT5.cpp deleted file mode 100644 index 58b10166..00000000 --- a/src/ZoneCommon/Game/T5/AssetNameResolverT5.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "AssetNameResolverT5.h" - -#include "Game/T5/GameAssetPoolT5.h" -#include "Utils/StringUtils.h" - -using namespace T5; - -AssetNameResolver::AssetNameResolver() -{ - for (auto assetType = 0; assetType < ASSET_TYPE_COUNT; assetType++) - AddAssetTypeName(assetType, *GameAssetPoolT5::AssetTypeNameByType(assetType)); -} - -GameId AssetNameResolver::GetGameId() const -{ - return GameId::T5; -} - -std::optional AssetNameResolver::GetAssetTypeName(const asset_type_t assetType) const -{ - return GameAssetPoolT5::AssetTypeNameByType(assetType); -} diff --git a/src/ZoneCommon/Game/T5/AssetNameResolverT5.h b/src/ZoneCommon/Game/T5/AssetNameResolverT5.h deleted file mode 100644 index 30de16a5..00000000 --- a/src/ZoneCommon/Game/T5/AssetNameResolverT5.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "Zone/AssetNameResolver.h" - -namespace T5 -{ - class AssetNameResolver final : public HashMapBasedAssetNameResolver - { - public: - AssetNameResolver(); - [[nodiscard]] GameId GetGameId() const override; - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - }; -} // namespace T5 diff --git a/src/ZoneCommon/Game/T5/GameAssetPoolT5.cpp b/src/ZoneCommon/Game/T5/GameAssetPoolT5.cpp index 0298c332..7af93bd0 100644 --- a/src/ZoneCommon/Game/T5/GameAssetPoolT5.cpp +++ b/src/ZoneCommon/Game/T5/GameAssetPoolT5.cpp @@ -3,29 +3,13 @@ #include "Pool/AssetPoolDynamic.h" #include -#include using namespace T5; -namespace -{ - constexpr const char* ASSET_TYPE_NAMES[]{ - "xmodelpieces", "physpreset", "physconstraints", "destructibledef", "xanim", "xmodel", "material", - "techniqueset", "image", "soundbank", "soundpatch", "clipmap_unused", "clipmap", "comworld", - "gameworldsp", "gameworldmp", "mapents", "gfxworld", "gfxlightdef", "uimap", "font", - "menulist", "menu", "localize", "weapon", "weapondef", "weaponvariant", "snddriverglobals", - "fx", "fximpacttable", "aitype", "mptype", "mpbody", "mphead", "character", - "xmodelalias", "rawfile", "stringtable", "packindex", "xglobals", "ddl", "glasses", - "emblemset", - }; -} - GameAssetPoolT5::GameAssetPoolT5(Zone* zone, const zone_priority_t priority) : ZoneAssetPools(zone), m_priority(priority) { - static_assert(std::extent_v == ASSET_TYPE_COUNT); - #define INIT_POOL(poolName) (poolName) = std::make_unique>(m_priority) INIT_POOL(m_phys_preset); @@ -175,26 +159,3 @@ XAssetInfoGeneric* GameAssetPoolT5::GetAsset(const asset_type_t type, const std: #undef CASE_GET_ASSET } - -std::optional GameAssetPoolT5::AssetTypeNameByType(const asset_type_t assetType) -{ - if (assetType >= 0 && assetType < static_cast(std::extent_v)) - return ASSET_TYPE_NAMES[assetType]; - - return std::nullopt; -} - -std::optional GameAssetPoolT5::GetAssetTypeName(const asset_type_t assetType) const -{ - return AssetTypeNameByType(assetType); -} - -asset_type_t GameAssetPoolT5::AssetTypeCount() -{ - return ASSET_TYPE_COUNT; -} - -asset_type_t GameAssetPoolT5::GetAssetTypeCount() const -{ - return AssetTypeCount(); -} diff --git a/src/ZoneCommon/Game/T5/GameAssetPoolT5.h b/src/ZoneCommon/Game/T5/GameAssetPoolT5.h index ccb2c09b..08ee4567 100644 --- a/src/ZoneCommon/Game/T5/GameAssetPoolT5.h +++ b/src/ZoneCommon/Game/T5/GameAssetPoolT5.h @@ -47,12 +47,6 @@ public: [[nodiscard]] XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const override; - static std::optional AssetTypeNameByType(asset_type_t assetType); - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - - static asset_type_t AssetTypeCount(); - [[nodiscard]] asset_type_t GetAssetTypeCount() const override; - protected: XAssetInfoGeneric* AddAssetToPool(std::unique_ptr xAssetInfo) override; diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp index 976f8798..4aac8f64 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp @@ -10,6 +10,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const { + const auto* game = IGame::GetGameById(zone.m_game_id); const auto* pools = dynamic_cast(zone.m_pools.get()); assert(pools); @@ -18,7 +19,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& // Localized strings are all collected in one string file. So only add this to the zone file. if (!pools->m_localize->m_asset_lookup.empty()) - stream.WriteEntry(*pools->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); + stream.WriteEntry(*game->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); for (const auto& asset : *pools) { @@ -28,7 +29,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& break; default: - stream.WriteEntry(*pools->GetAssetTypeName(asset->m_type), asset->m_name); + stream.WriteEntry(*game->GetAssetTypeName(asset->m_type), asset->m_name); break; } } diff --git a/src/ZoneCommon/Game/T6/AssetNameResolverT6.cpp b/src/ZoneCommon/Game/T6/AssetNameResolverT6.cpp deleted file mode 100644 index 765172d6..00000000 --- a/src/ZoneCommon/Game/T6/AssetNameResolverT6.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "AssetNameResolverT6.h" - -#include "Game/T6/GameAssetPoolT6.h" -#include "Utils/StringUtils.h" - -using namespace T6; - -AssetNameResolver::AssetNameResolver() -{ - for (auto assetType = 0; assetType < ASSET_TYPE_COUNT; assetType++) - AddAssetTypeName(assetType, *GameAssetPoolT6::AssetTypeNameByType(assetType)); -} - -GameId AssetNameResolver::GetGameId() const -{ - return GameId::T6; -} - -std::optional AssetNameResolver::GetAssetTypeName(const asset_type_t assetType) const -{ - return GameAssetPoolT6::AssetTypeNameByType(assetType); -} diff --git a/src/ZoneCommon/Game/T6/AssetNameResolverT6.h b/src/ZoneCommon/Game/T6/AssetNameResolverT6.h deleted file mode 100644 index 39cc1805..00000000 --- a/src/ZoneCommon/Game/T6/AssetNameResolverT6.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "Zone/AssetNameResolver.h" - -namespace T6 -{ - class AssetNameResolver final : public HashMapBasedAssetNameResolver - { - public: - AssetNameResolver(); - [[nodiscard]] GameId GetGameId() const override; - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - }; -} // namespace T6 diff --git a/src/ZoneCommon/Game/T6/GameAssetPoolT6.cpp b/src/ZoneCommon/Game/T6/GameAssetPoolT6.cpp index 8ecf4d64..8c7a59ca 100644 --- a/src/ZoneCommon/Game/T6/GameAssetPoolT6.cpp +++ b/src/ZoneCommon/Game/T6/GameAssetPoolT6.cpp @@ -3,82 +3,13 @@ #include "Pool/AssetPoolDynamic.h" #include -#include using namespace T6; -namespace -{ - constexpr const char* ASSET_TYPE_NAMES[]{ - "xmodelpieces", - "physpreset", - "physconstraints", - "destructibledef", - "xanim", - "xmodel", - "material", - "techniqueset", - "image", - "soundbank", - "soundpatch", - "clipmap_unused", - "clipmap", - "comworld", - "gameworldsp", - "gameworldmp", - "mapents", - "gfxworld", - "gfxlightdef", - "uimap", - "font", - "fonticon", - "menulist", - "menu", - "localize", - "weapon", - "weapondef", - "weaponvariant", - "weaponfull", - "attachment", - "attachmentunique", - "camo", - "snddriverglobals", - "fx", - "fximpacttable", - "aitype", - "mptype", - "mpbody", - "mphead", - "character", - "xmodelalias", - "rawfile", - "stringtable", - "leaderboard", - "xglobals", - "ddl", - "glasses", - "emblemset", - "script", - "keyvaluepairs", - "vehicle", - "memoryblock", - "addonmapents", - "tracer", - "skinnedverts", - "qdb", - "slug", - "footsteptable", - "footstepfxtable", - "zbarrier", - }; -} // namespace - GameAssetPoolT6::GameAssetPoolT6(Zone* zone, const zone_priority_t priority) : ZoneAssetPools(zone), m_priority(priority) { - static_assert(std::extent_v == ASSET_TYPE_COUNT); - #define INIT_POOL(poolName) (poolName) = std::make_unique>(m_priority) INIT_POOL(m_phys_preset); @@ -276,26 +207,3 @@ XAssetInfoGeneric* GameAssetPoolT6::GetAsset(const asset_type_t type, const std: #undef CASE_GET_ASSET } - -std::optional GameAssetPoolT6::AssetTypeNameByType(const asset_type_t assetType) -{ - if (assetType >= 0 && assetType < static_cast(std::extent_v)) - return ASSET_TYPE_NAMES[assetType]; - - return std::nullopt; -} - -std::optional GameAssetPoolT6::GetAssetTypeName(const asset_type_t assetType) const -{ - return AssetTypeNameByType(assetType); -} - -asset_type_t GameAssetPoolT6::AssetTypeCount() -{ - return ASSET_TYPE_COUNT; -} - -asset_type_t GameAssetPoolT6::GetAssetTypeCount() const -{ - return AssetTypeCount(); -} diff --git a/src/ZoneCommon/Game/T6/GameAssetPoolT6.h b/src/ZoneCommon/Game/T6/GameAssetPoolT6.h index 6e10849d..90e595f2 100644 --- a/src/ZoneCommon/Game/T6/GameAssetPoolT6.h +++ b/src/ZoneCommon/Game/T6/GameAssetPoolT6.h @@ -63,12 +63,6 @@ public: [[nodiscard]] XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const override; - static std::optional AssetTypeNameByType(asset_type_t assetType); - [[nodiscard]] std::optional GetAssetTypeName(asset_type_t assetType) const override; - - static asset_type_t AssetTypeCount(); - [[nodiscard]] asset_type_t GetAssetTypeCount() const override; - protected: XAssetInfoGeneric* AddAssetToPool(std::unique_ptr xAssetInfo) override; diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp index 4b59ebcc..ef5d6520 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp @@ -66,6 +66,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const { + const auto* game = IGame::GetGameById(zone.m_game_id); const auto* pools = dynamic_cast(zone.m_pools.get()); assert(pools); @@ -74,7 +75,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& // Localized strings are all collected in one string file. So only add this to the zone file. if (!pools->m_localize->m_asset_lookup.empty()) - stream.WriteEntry(*pools->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); + stream.WriteEntry(*game->GetAssetTypeName(ASSET_TYPE_LOCALIZE_ENTRY), zone.m_name); for (const auto& asset : *pools) { @@ -85,7 +86,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& break; default: - stream.WriteEntry(*pools->GetAssetTypeName(asset->m_type), asset->m_name); + stream.WriteEntry(*game->GetAssetTypeName(asset->m_type), asset->m_name); break; } } diff --git a/src/ZoneCommon/Pool/ZoneAssetPools.h b/src/ZoneCommon/Pool/ZoneAssetPools.h index 824498dd..973115f3 100644 --- a/src/ZoneCommon/Pool/ZoneAssetPools.h +++ b/src/ZoneCommon/Pool/ZoneAssetPools.h @@ -36,9 +36,6 @@ public: [[nodiscard]] virtual XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const = 0; [[nodiscard]] virtual XAssetInfoGeneric* GetAssetOrAssetReference(asset_type_t type, const std::string& name) const; - [[nodiscard]] virtual asset_type_t GetAssetTypeCount() const = 0; - [[nodiscard]] virtual std::optional GetAssetTypeName(asset_type_t assetType) const = 0; - [[nodiscard]] size_t GetTotalAssetCount() const; [[nodiscard]] iterator begin() const; diff --git a/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp index 5df9139e..942b154c 100644 --- a/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp +++ b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp @@ -2,13 +2,13 @@ AssetListOutputStream::AssetListOutputStream(std::ostream& stream, const GameId game) : m_stream(stream), - m_asset_name_resolver(IAssetNameResolver::GetResolverForGame(game)) + m_game(IGame::GetGameById(game)) { } void AssetListOutputStream::WriteEntry(const AssetListEntry& entry) { - m_stream.WriteColumn(*m_asset_name_resolver->GetAssetTypeName(entry.m_type)); + m_stream.WriteColumn(*m_game->GetAssetTypeName(entry.m_type)); m_stream.WriteColumn(entry.m_name); m_stream.NextRow(); } diff --git a/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h index 902d935b..11839dca 100644 --- a/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h +++ b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h @@ -3,7 +3,6 @@ #include "AssetList.h" #include "Csv/CsvStream.h" #include "Game/IGame.h" -#include "Zone/AssetNameResolver.h" #include @@ -16,5 +15,5 @@ public: private: CsvOutputStream m_stream; - const IAssetNameResolver* m_asset_name_resolver; + const IGame* m_game; }; diff --git a/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp b/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp index 84ee2270..67b13018 100644 --- a/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp +++ b/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp @@ -12,9 +12,9 @@ namespace class AssetListInputStream { public: - AssetListInputStream(std::istream& stream, GameId game) + AssetListInputStream(std::istream& stream, const GameId game) : m_stream(stream), - m_asset_name_resolver(IAssetNameResolver::GetResolverForGame(game)) + m_asset_name_resolver(game) { } @@ -33,7 +33,7 @@ namespace continue; const auto& typeName = row[0]; - const auto maybeType = m_asset_name_resolver->GetAssetTypeByName(typeName); + const auto maybeType = m_asset_name_resolver.GetAssetTypeByName(typeName); if (!maybeType) { con::error("Unknown asset type name \"{}\"", typeName); @@ -60,7 +60,7 @@ namespace private: CsvInputStream m_stream; - const IAssetNameResolver* m_asset_name_resolver; + AssetNameResolver m_asset_name_resolver; }; } // namespace diff --git a/src/ZoneCommon/Zone/AssetNameResolver.cpp b/src/ZoneCommon/Zone/AssetNameResolver.cpp index 6b2ee715..375705d3 100644 --- a/src/ZoneCommon/Zone/AssetNameResolver.cpp +++ b/src/ZoneCommon/Zone/AssetNameResolver.cpp @@ -1,38 +1,28 @@ #include "AssetNameResolver.h" -#include "Game/IW3/AssetNameResolverIW3.h" -#include "Game/IW4/AssetNameResolverIW4.h" -#include "Game/IW5/AssetNameResolverIW5.h" -#include "Game/T5/AssetNameResolverT5.h" -#include "Game/T6/AssetNameResolverT6.h" #include "Utils/StringUtils.h" #include -const IAssetNameResolver* IAssetNameResolver::GetResolverForGame(GameId game) +AssetNameResolver::AssetNameResolver(const GameId gameId) { - static const IAssetNameResolver* assetNameResolvers[static_cast(GameId::COUNT)]{ - new IW3::AssetNameResolver(), - new IW4::AssetNameResolver(), - new IW5::AssetNameResolver(), - new T5::AssetNameResolver(), - new T6::AssetNameResolver(), - }; + const auto* game = IGame::GetGameById(gameId); + const auto assetTypeCount = game->GetAssetTypeCount(); - assert(static_cast(game) < static_cast(GameId::COUNT)); - const auto* result = assetNameResolvers[static_cast(game)]; - assert(result); + for (asset_type_t assetType = 0; assetType < assetTypeCount; assetType++) + { + auto maybeAssetTypeName = game->GetAssetTypeName(assetType); + assert(maybeAssetTypeName); + if (!maybeAssetTypeName) + continue; - return result; + std::string lowerCaseName(*maybeAssetTypeName); + utils::MakeStringLowerCase(lowerCaseName); + m_asset_types_by_name.emplace(lowerCaseName, assetType); + } } -void HashMapBasedAssetNameResolver::AddAssetTypeName(asset_type_t assetType, std::string name) -{ - utils::MakeStringLowerCase(name); - m_asset_types_by_name.emplace(std::move(name), assetType); -} - -std::optional HashMapBasedAssetNameResolver::GetAssetTypeByName(const std::string& assetTypeName) const +std::optional AssetNameResolver::GetAssetTypeByName(const std::string& assetTypeName) const { std::string lowerCaseName = assetTypeName; utils::MakeStringLowerCase(lowerCaseName); diff --git a/src/ZoneCommon/Zone/AssetNameResolver.h b/src/ZoneCommon/Zone/AssetNameResolver.h index 659479a4..c05cac23 100644 --- a/src/ZoneCommon/Zone/AssetNameResolver.h +++ b/src/ZoneCommon/Zone/AssetNameResolver.h @@ -7,30 +7,13 @@ #include #include -class IAssetNameResolver +class AssetNameResolver { public: - IAssetNameResolver() = default; - virtual ~IAssetNameResolver() = default; - IAssetNameResolver(const IAssetNameResolver& other) = default; - IAssetNameResolver(IAssetNameResolver&& other) noexcept = default; - IAssetNameResolver& operator=(const IAssetNameResolver& other) = default; - IAssetNameResolver& operator=(IAssetNameResolver&& other) noexcept = default; + AssetNameResolver() = default; + explicit AssetNameResolver(GameId gameId); - [[nodiscard]] virtual GameId GetGameId() const = 0; - [[nodiscard]] virtual std::optional GetAssetTypeByName(const std::string& assetTypeName) const = 0; - [[nodiscard]] virtual std::optional GetAssetTypeName(asset_type_t assetType) const = 0; - - static const IAssetNameResolver* GetResolverForGame(GameId game); -}; - -class HashMapBasedAssetNameResolver : public IAssetNameResolver -{ -public: - [[nodiscard]] std::optional GetAssetTypeByName(const std::string& assetTypeName) const override; - -protected: - void AddAssetTypeName(asset_type_t assetType, std::string name); + [[nodiscard]] std::optional GetAssetTypeByName(const std::string& assetTypeName) const; private: std::unordered_map m_asset_types_by_name; diff --git a/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp index f6bcd436..f7504622 100644 --- a/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp @@ -23,10 +23,7 @@ void SequenceZoneDefinitionEntry::ProcessMatch(ZoneDefinitionParserState* state, { const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE_NAME); - if (!state->m_asset_name_resolver) - throw ParsingException(typeNameToken.GetPos(), "Must define game before first asset"); - - const auto maybeAssetType = state->m_asset_name_resolver->GetAssetTypeByName(typeNameToken.FieldValue()); + const auto maybeAssetType = state->m_asset_name_resolver.GetAssetTypeByName(typeNameToken.FieldValue()); if (!maybeAssetType) throw ParsingException(typeNameToken.GetPos(), "Unknown asset type"); diff --git a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp index af7a1a62..aebaa182 100644 --- a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp @@ -5,7 +5,6 @@ ZoneDefinitionParserState::ZoneDefinitionParserState(std::string targetName, ISearchPath& searchPath, IParserLineStream& underlyingStream) : m_search_path(searchPath), m_underlying_stream(underlyingStream), - m_asset_name_resolver(nullptr), m_definition(std::make_unique()) { @@ -16,7 +15,7 @@ ZoneDefinitionParserState::ZoneDefinitionParserState(std::string targetName, ISe void ZoneDefinitionParserState::SetGame(const GameId game) { m_definition->m_game = game; - m_asset_name_resolver = IAssetNameResolver::GetResolverForGame(game); + m_asset_name_resolver = AssetNameResolver(game); } namespace diff --git a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h index 4fa60515..aa872c22 100644 --- a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h @@ -26,7 +26,7 @@ public: IParserLineStream& m_underlying_stream; std::unordered_set m_inclusions; - const IAssetNameResolver* m_asset_name_resolver; + AssetNameResolver m_asset_name_resolver; std::optional m_current_ipak; std::optional m_current_iwd;