From 28610ae7a90c72b9a15625726d70c78285911e78 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 9 May 2024 20:38:23 +0200 Subject: [PATCH] feat: log invalid enum values for infostring loaders --- .../IW4/AssetLoaders/AssetLoaderWeapon.cpp | 34 +++++++-------- .../IW5/AssetLoaders/AssetLoaderWeapon.cpp | 34 +++++++-------- .../AssetLoaderPhysConstraints.cpp | 2 +- .../T6/AssetLoaders/AssetLoaderTracer.cpp | 2 +- .../T6/AssetLoaders/AssetLoaderVehicle.cpp | 6 +-- .../T6/AssetLoaders/AssetLoaderWeapon.cpp | 42 +++++++++---------- .../AssetLoaderWeaponAttachment.cpp | 6 +-- .../AssetLoaderWeaponAttachmentUnique.cpp | 4 +- .../InfoStringToStructConverterBase.cpp | 17 +++++++- .../InfoStringToStructConverterBase.h | 2 +- 10 files changed, 82 insertions(+), 67 deletions(-) diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp index eb74d699..bd3cf859 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp @@ -151,62 +151,62 @@ namespace switch (static_cast(field.iFieldType)) { case WFT_WEAPONTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapTypeNames, std::extent_v); case WFT_WEAPONCLASS: - return ConvertEnumInt(value, field.iOffset, szWeapClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapClassNames, std::extent_v); case WFT_OVERLAYRETICLE: - return ConvertEnumInt(value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); case WFT_PENETRATE_TYPE: - return ConvertEnumInt(value, field.iOffset, penetrateTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, penetrateTypeNames, std::extent_v); case WFT_IMPACT_TYPE: - return ConvertEnumInt(value, field.iOffset, impactTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, impactTypeNames, std::extent_v); case WFT_STANCE: - return ConvertEnumInt(value, field.iOffset, szWeapStanceNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapStanceNames, std::extent_v); case WFT_PROJ_EXPLOSION: - return ConvertEnumInt(value, field.iOffset, szProjectileExplosionNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szProjectileExplosionNames, std::extent_v); case WFT_OFFHAND_CLASS: - return ConvertEnumInt(value, field.iOffset, offhandClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, offhandClassNames, std::extent_v); case WFT_ANIMTYPE: - return ConvertEnumInt(value, field.iOffset, playerAnimTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, playerAnimTypeNames, std::extent_v); case WFT_ACTIVE_RETICLE_TYPE: - return ConvertEnumInt(value, field.iOffset, activeReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, activeReticleNames, std::extent_v); case WFT_GUIDED_MISSILE_TYPE: - return ConvertEnumInt(value, field.iOffset, guidedMissileNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, guidedMissileNames, std::extent_v); case WFT_BOUNCE_SOUND: return ConvertBounceSounds(field, value); case WFT_STICKINESS: - return ConvertEnumInt(value, field.iOffset, stickinessNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, stickinessNames, std::extent_v); case WFT_OVERLAYINTERFACE: - return ConvertEnumInt(value, field.iOffset, overlayInterfaceNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, overlayInterfaceNames, std::extent_v); case WFT_INVENTORYTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapInventoryTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapInventoryTypeNames, std::extent_v); case WFT_FIRETYPE: - return ConvertEnumInt(value, field.iOffset, szWeapFireTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapFireTypeNames, std::extent_v); case WFT_AMMOCOUNTER_CLIPTYPE: - return ConvertEnumInt(value, field.iOffset, ammoCounterClipNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, ammoCounterClipNames, std::extent_v); case WFT_ICONRATIO_HUD: case WFT_ICONRATIO_PICKUP: case WFT_ICONRATIO_AMMOCOUNTER: case WFT_ICONRATIO_KILL: case WFT_ICONRATIO_DPAD: - return ConvertEnumInt(value, field.iOffset, weapIconRatioNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, weapIconRatioNames, std::extent_v); case WFT_HIDETAGS: return ConvertHideTags(field, value); diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp index 06e73bf3..4054129a 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp @@ -556,62 +556,62 @@ namespace switch (static_cast(field.iFieldType)) { case WFT_WEAPONTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapTypeNames, std::extent_v); case WFT_WEAPONCLASS: - return ConvertEnumInt(value, field.iOffset, szWeapClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapClassNames, std::extent_v); case WFT_OVERLAYRETICLE: - return ConvertEnumInt(value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); case WFT_PENETRATE_TYPE: - return ConvertEnumInt(value, field.iOffset, penetrateTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, penetrateTypeNames, std::extent_v); case WFT_IMPACT_TYPE: - return ConvertEnumInt(value, field.iOffset, impactTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, impactTypeNames, std::extent_v); case WFT_STANCE: - return ConvertEnumInt(value, field.iOffset, szWeapStanceNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapStanceNames, std::extent_v); case WFT_PROJ_EXPLOSION: - return ConvertEnumInt(value, field.iOffset, szProjectileExplosionNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szProjectileExplosionNames, std::extent_v); case WFT_OFFHAND_CLASS: - return ConvertEnumInt(value, field.iOffset, offhandClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, offhandClassNames, std::extent_v); case WFT_ANIMTYPE: - return ConvertEnumInt(value, field.iOffset, playerAnimTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, playerAnimTypeNames, std::extent_v); case WFT_ACTIVE_RETICLE_TYPE: - return ConvertEnumInt(value, field.iOffset, activeReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, activeReticleNames, std::extent_v); case WFT_GUIDED_MISSILE_TYPE: - return ConvertEnumInt(value, field.iOffset, guidedMissileNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, guidedMissileNames, std::extent_v); case WFT_PER_SURFACE_TYPE_SOUND: return ConvertPerSurfaceTypeSound(field, value); case WFT_STICKINESS: - return ConvertEnumInt(value, field.iOffset, stickinessNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, stickinessNames, std::extent_v); case WFT_OVERLAYINTERFACE: - return ConvertEnumInt(value, field.iOffset, overlayInterfaceNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, overlayInterfaceNames, std::extent_v); case WFT_INVENTORYTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapInventoryTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapInventoryTypeNames, std::extent_v); case WFT_FIRETYPE: - return ConvertEnumInt(value, field.iOffset, szWeapFireTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapFireTypeNames, std::extent_v); case WFT_AMMOCOUNTER_CLIPTYPE: - return ConvertEnumInt(value, field.iOffset, ammoCounterClipNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, ammoCounterClipNames, std::extent_v); case WFT_ICONRATIO_HUD: case WFT_ICONRATIO_PICKUP: case WFT_ICONRATIO_AMMOCOUNTER: case WFT_ICONRATIO_KILL: case WFT_ICONRATIO_DPAD: - return ConvertEnumInt(value, field.iOffset, weapIconRatioNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, weapIconRatioNames, std::extent_v); case WFT_HIDETAGS: return ConvertHideTags(field, value); diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderPhysConstraints.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderPhysConstraints.cpp index 6dc86ede..67166778 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderPhysConstraints.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderPhysConstraints.cpp @@ -23,7 +23,7 @@ namespace T6 switch (static_cast(field.iFieldType)) { case CFT_TYPE: - return ConvertEnumInt(value, field.iOffset, s_constraintTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, s_constraintTypeNames, std::extent_v); default: assert(false); diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderTracer.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderTracer.cpp index 90d21cf2..d75f23fd 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderTracer.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderTracer.cpp @@ -23,7 +23,7 @@ namespace T6 switch (static_cast(field.iFieldType)) { case TFT_TRACERTYPE: - return ConvertEnumInt(value, field.iOffset, tracerTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, tracerTypeNames, std::extent_v); case TFT_NUM_FIELD_TYPES: default: diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderVehicle.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderVehicle.cpp index 3b935a5c..91acd77d 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderVehicle.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderVehicle.cpp @@ -23,13 +23,13 @@ namespace T6 switch (static_cast(field.iFieldType)) { case VFT_TYPE: - return ConvertEnumInt(value, field.iOffset, s_vehicleClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, s_vehicleClassNames, std::extent_v); case VFT_CAMERAMODE: - return ConvertEnumInt(value, field.iOffset, s_vehicleCameraModes, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, s_vehicleCameraModes, std::extent_v); case VFT_TRACTION_TYPE: - return ConvertEnumInt(value, field.iOffset, s_tractionTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, s_tractionTypeNames, std::extent_v); case VFT_MPH_TO_INCHES_PER_SECOND: { diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp index 6228858a..940d3424 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp @@ -277,74 +277,74 @@ namespace T6 switch (static_cast(field.iFieldType)) { case WFT_WEAPONTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapTypeNames, std::extent_v); case WFT_WEAPONCLASS: - return ConvertEnumInt(value, field.iOffset, szWeapClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapClassNames, std::extent_v); case WFT_OVERLAYRETICLE: - return ConvertEnumInt(value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); case WFT_PENETRATE_TYPE: - return ConvertEnumInt(value, field.iOffset, penetrateTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, penetrateTypeNames, std::extent_v); case WFT_IMPACT_TYPE: - return ConvertEnumInt(value, field.iOffset, impactTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, impactTypeNames, std::extent_v); case WFT_STANCE: - return ConvertEnumInt(value, field.iOffset, szWeapStanceNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapStanceNames, std::extent_v); case WFT_PROJ_EXPLOSION: - return ConvertEnumInt(value, field.iOffset, szProjectileExplosionNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szProjectileExplosionNames, std::extent_v); case WFT_OFFHAND_CLASS: - return ConvertEnumInt(value, field.iOffset, offhandClassNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, offhandClassNames, std::extent_v); case WFT_OFFHAND_SLOT: - return ConvertEnumInt(value, field.iOffset, offhandSlotNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, offhandSlotNames, std::extent_v); case WFT_ANIMTYPE: - return ConvertEnumInt(value, field.iOffset, playerAnimTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, playerAnimTypeNames, std::extent_v); case WFT_ACTIVE_RETICLE_TYPE: - return ConvertEnumInt(value, field.iOffset, activeReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, activeReticleNames, std::extent_v); case WFT_GUIDED_MISSILE_TYPE: - return ConvertEnumInt(value, field.iOffset, guidedMissileNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, guidedMissileNames, std::extent_v); case WFT_BOUNCE_SOUND: return ConvertBounceSounds(field, value); case WFT_STICKINESS: - return ConvertEnumInt(value, field.iOffset, stickinessNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, stickinessNames, std::extent_v); case WFT_ROTATETYPE: - return ConvertEnumInt(value, field.iOffset, rotateTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, rotateTypeNames, std::extent_v); case WFT_OVERLAYINTERFACE: - return ConvertEnumInt(value, field.iOffset, overlayInterfaceNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, overlayInterfaceNames, std::extent_v); case WFT_INVENTORYTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapInventoryTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapInventoryTypeNames, std::extent_v); case WFT_FIRETYPE: - return ConvertEnumInt(value, field.iOffset, szWeapFireTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapFireTypeNames, std::extent_v); case WFT_CLIPTYPE: - return ConvertEnumInt(value, field.iOffset, szWeapClipTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapClipTypeNames, std::extent_v); case WFT_AMMOCOUNTER_CLIPTYPE: - return ConvertEnumInt(value, field.iOffset, ammoCounterClipNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, ammoCounterClipNames, std::extent_v); case WFT_ICONRATIO_HUD: case WFT_ICONRATIO_AMMOCOUNTER: case WFT_ICONRATIO_KILL: case WFT_ICONRATIO_DPAD: case WFT_ICONRATIO_INDICATOR: - return ConvertEnumInt(value, field.iOffset, weapIconRatioNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, weapIconRatioNames, std::extent_v); case WFT_BARRELTYPE: - return ConvertEnumInt(value, field.iOffset, barrelTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, barrelTypeNames, std::extent_v); case WFT_HIDETAGS: return ConvertHideTags(field, value); diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachment.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachment.cpp index 8f748a0f..9c919685 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachment.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachment.cpp @@ -58,13 +58,13 @@ namespace T6 switch (static_cast(field.iFieldType)) { case AFT_ATTACHMENTTYPE: - return ConvertEnumInt(value, field.iOffset, szAttachmentTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szAttachmentTypeNames, std::extent_v); case AFT_PENETRATE_TYPE: - return ConvertEnumInt(value, field.iOffset, penetrateTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, penetrateTypeNames, std::extent_v); case AFT_FIRETYPE: - return ConvertEnumInt(value, field.iOffset, szWeapFireTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapFireTypeNames, std::extent_v); default: assert(false); diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp index 86ff51fa..379a97f8 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp @@ -99,13 +99,13 @@ namespace T6 switch (static_cast(field.iFieldType)) { case AUFT_ATTACHMENTTYPE: - return ConvertEnumInt(value, field.iOffset, szAttachmentTypeNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szAttachmentTypeNames, std::extent_v); case AUFT_HIDETAGS: return ConvertHideTags(field, value); case AUFT_OVERLAYRETICLE: - return ConvertEnumInt(value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); + return ConvertEnumInt(field.szName, value, field.iOffset, szWeapOverlayReticleNames, std::extent_v); case AUFT_CAMO: return ConvertWeaponCamo(field, value); diff --git a/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp index 02ebfeec..a2686ddf 100644 --- a/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp +++ b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp @@ -2,6 +2,7 @@ #include #include +#include InfoStringToStructConverterBase::InfoStringToStructConverterBase(const InfoString& infoString, void* structure, @@ -148,7 +149,8 @@ bool InfoStringToStructConverterBase::ConvertScriptString(const std::string& val return true; } -bool InfoStringToStructConverterBase::ConvertEnumInt(const std::string& value, const size_t offset, const char** enumValues, const size_t enumSize) +bool InfoStringToStructConverterBase::ConvertEnumInt( + const std::string& fieldName, const std::string& value, const size_t offset, const char** enumValues, const size_t enumSize) { for (auto i = 0u; i < enumSize; i++) { @@ -159,6 +161,19 @@ bool InfoStringToStructConverterBase::ConvertEnumInt(const std::string& value, c } } + std::ostringstream ss; + ss << "Not a valid value for field \"" << fieldName << "\": \"" << value << "\". Valid values are:\n "; + + for (auto i = 0u; i < enumSize; i++) + { + if (i > 0) + ss << ", "; + ss << '"' << enumValues[i] << '"'; + } + + ss << '\n'; + std::cerr << ss.str(); + return false; } diff --git a/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h index d25e2084..cc9be478 100644 --- a/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h +++ b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h @@ -110,7 +110,7 @@ protected: bool ConvertFloat(const std::string& value, size_t offset); bool ConvertMilliseconds(const std::string& value, size_t offset); bool ConvertScriptString(const std::string& value, size_t offset); - bool ConvertEnumInt(const std::string& value, size_t offset, const char** enumValues, size_t enumSize); + bool ConvertEnumInt(const std::string& fieldName, const std::string& value, size_t offset, const char** enumValues, size_t enumSize); public: InfoStringToStructConverterBase(const InfoString& infoString, void* structure, ZoneScriptStrings& zoneScriptStrings, MemoryManager* memory);