From aaf350d0883ef8bb83db30a1fea4a01ff7c9172b Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 25 Mar 2021 13:34:14 +0100 Subject: [PATCH] Add calculation of fields not specified via weapon fields to asset loader weapon --- .../T6/AssetLoaders/AssetLoaderWeapon.cpp | 27 ++++++++++++++++++- .../Game/T6/AssetLoaders/AssetLoaderWeapon.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp index c97b1b50..567ac621 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp @@ -344,11 +344,33 @@ void AssetLoaderWeapon::LinkWeaponFullDefSubStructs(WeaponFullDef* weapon) weapon->weapDef.locationDamageMultipliers = weapon->locationDamageMultipliers; } +void AssetLoaderWeapon::CalculateWeaponFields(WeaponFullDef* weapon) +{ + // iAttachments + weapon->weapVariantDef.iAttachments = 0; + for(auto i = 1u; i < sizeof(WeaponVariantDef::iAttachments) * 8; i++) // Bit for default attachment always 0 + { + if (weapon->attachments[i]) + weapon->weapVariantDef.iAttachments |= 1 << i; + } + + if (weapon->weapVariantDef.iAdsTransInTime <= 0) + weapon->weapVariantDef.fOOPosAnimLength[0] = 0.0033333334f; + else + weapon->weapVariantDef.fOOPosAnimLength[0] = 1.0f / static_cast(weapon->weapVariantDef.iAdsTransInTime); + + if (weapon->weapVariantDef.iAdsTransOutTime <= 0) + weapon->weapVariantDef.fOOPosAnimLength[1] = 0.0020000001f; + else + weapon->weapVariantDef.fOOPosAnimLength[1] = 1.0f / static_cast(weapon->weapVariantDef.iAdsTransOutTime); +} + void* AssetLoaderWeapon::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) { auto* weaponFullDef = memory->Create(); memset(weaponFullDef, 0, sizeof(WeaponFullDef)); LinkWeaponFullDefSubStructs(weaponFullDef); + CalculateWeaponFields(weaponFullDef); weaponFullDef->weapVariantDef.szInternalName = memory->Dup(assetName.c_str()); return weaponFullDef; } @@ -385,7 +407,10 @@ bool AssetLoaderWeapon::LoadFromRaw(const std::string& assetName, ISearchPath* s weaponFullDef->weapVariantDef.szInternalName = memory->Dup(assetName.c_str()); - manager->AddAsset(ASSET_TYPE_WEAPON, assetName, weaponFullDef, converter.GetDependencies(), converter.GetUsedScriptStrings()); + // TODO: Load accuracy graph and flametable + CalculateWeaponFields(weaponFullDef); + + manager->AddAsset(ASSET_TYPE_WEAPON, assetName, &weaponFullDef->weapVariantDef, converter.GetDependencies(), converter.GetUsedScriptStrings()); return true; } diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.h b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.h index de3c4b57..398ad63a 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.h +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.h @@ -9,6 +9,7 @@ namespace T6 class AssetLoaderWeapon final : public BasicAssetLoader { static void LinkWeaponFullDefSubStructs(WeaponFullDef* weapon); + static void CalculateWeaponFields(WeaponFullDef* weapon); public: _NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override;