From e97a293d05bf9fa4b914afeab37ddfe0307c423e Mon Sep 17 00:00:00 2001 From: Telvanni 4Life Date: Tue, 27 Jan 2026 18:13:50 -0500 Subject: [PATCH] - Added save game version - Serialized magic effect as RefId in activespells, creaturestats, and magiceffects --- components/esm3/activespells.cpp | 13 +++++++++---- components/esm3/creaturestats.cpp | 25 +++++++++++++++++-------- components/esm3/formatversion.hpp | 3 ++- components/esm3/magiceffects.cpp | 24 +++++++++++++++++------- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/components/esm3/activespells.cpp b/components/esm3/activespells.cpp index 657808e60b..740ab79acf 100644 --- a/components/esm3/activespells.cpp +++ b/components/esm3/activespells.cpp @@ -86,7 +86,7 @@ namespace ESM for (auto& effect : params.mEffects) { - esm.writeHNT("MGEF", ESM::MagicEffect::refIdToIndex(effect.mEffectId)); + esm.writeHNRefId("MGEF", effect.mEffectId); if (const ESM::RefId* id = std::get_if(&effect.mArg)) { if (!id->empty()) @@ -171,10 +171,15 @@ namespace ESM while (esm.isNextSub("MGEF")) { - int32_t effectId; ActiveEffect effect; - esm.getHT(effectId); - effect.mEffectId = ESM::MagicEffect::indexToRefId(effectId); + if (format <= MaxSerializeEffectRefIdFormatVersion) + { + int32_t effectId; + esm.getHT(effectId); + effect.mEffectId = ESM::MagicEffect::indexToRefId(effectId); + } + else + effect.mEffectId = esm.getRefId(); if (format <= MaxActorIdSaveGameFormatVersion) { int32_t arg = -1; diff --git a/components/esm3/creaturestats.cpp b/components/esm3/creaturestats.cpp index c034a6a0d1..1eb4f76e4f 100644 --- a/components/esm3/creaturestats.cpp +++ b/components/esm3/creaturestats.cpp @@ -129,14 +129,23 @@ namespace ESM { while (esm.isNextSub("SUMM")) { - int32_t magicEffect; - esm.getHT(magicEffect); - RefNum actor; - if (esm.getFormatVersion() <= MaxActorIdSaveGameFormatVersion) - esm.getHNT(actor.mIndex, "ACID"); + if (esm.getFormatVersion() <= MaxSerializeEffectRefIdFormatVersion) + { + int32_t magicEffect; + esm.getHT(magicEffect); + RefNum actor; + if (esm.getFormatVersion() <= MaxActorIdSaveGameFormatVersion) + esm.getHNT(actor.mIndex, "ACID"); + else + actor = esm.getFormId(true, "ACID"); + mSummonedCreatures.emplace(ESM::MagicEffect::indexToRefId(magicEffect), actor); + } else - actor = esm.getFormId(true, "ACID"); - mSummonedCreatures.emplace(ESM::MagicEffect::indexToRefId(magicEffect), actor); + { + RefId effectId = esm.getRefId(); + RefNum actor = esm.getFormId(true, "ACID"); + mSummonedCreatures.emplace(effectId, actor); + } } } @@ -251,7 +260,7 @@ namespace ESM for (const auto& [effectId, actor] : mSummonedCreatures) { - esm.writeHNT("SUMM", ESM::MagicEffect::refIdToIndex(effectId)); + esm.writeHNRefId("SUMM", effectId); esm.writeFormId(actor, true, "ACID"); } diff --git a/components/esm3/formatversion.hpp b/components/esm3/formatversion.hpp index f0cb36465d..6e65217e11 100644 --- a/components/esm3/formatversion.hpp +++ b/components/esm3/formatversion.hpp @@ -29,7 +29,8 @@ namespace ESM inline constexpr FormatVersion MaxActiveSpellTypeVersion = 31; inline constexpr FormatVersion MaxPlayerBeforeCellDataFormatVersion = 32; inline constexpr FormatVersion MaxActorIdSaveGameFormatVersion = 34; - inline constexpr FormatVersion CurrentSaveGameFormatVersion = 35; + inline constexpr FormatVersion MaxSerializeEffectRefIdFormatVersion = 35; + inline constexpr FormatVersion CurrentSaveGameFormatVersion = 36; inline constexpr FormatVersion MinSupportedSaveGameFormatVersion = 5; inline constexpr FormatVersion OpenMW0_49MinSaveGameFormatVersion = 5; diff --git a/components/esm3/magiceffects.cpp b/components/esm3/magiceffects.cpp index 6b86dfb02b..2fd48655eb 100644 --- a/components/esm3/magiceffects.cpp +++ b/components/esm3/magiceffects.cpp @@ -12,7 +12,7 @@ namespace ESM { for (const auto& [key, params] : mEffects) { - esm.writeHNT("EFID", ESM::MagicEffect::refIdToIndex(key)); + esm.writeHNRefId("EFID", key); esm.writeHNT("BASE", params.first); esm.writeHNT("MODI", params.second); } @@ -22,15 +22,25 @@ namespace ESM { while (esm.isNextSub("EFID")) { - int32_t id; std::pair params; - esm.getHT(id); - esm.getHNT(params.first, "BASE"); - if (esm.getFormatVersion() <= MaxClearModifiersFormatVersion) - params.second = 0.f; + if (esm.getFormatVersion() <= MaxSerializeEffectRefIdFormatVersion) + { + int32_t id; + esm.getHT(id); + esm.getHNT(params.first, "BASE"); + if (esm.getFormatVersion() <= MaxClearModifiersFormatVersion) + params.second = 0.f; + else + esm.getHNT(params.second, "MODI"); + mEffects.emplace(ESM::MagicEffect::indexToRefId(id), params); + } else + { + RefId effectId = esm.getRefId(); + esm.getHNT(params.first, "BASE"); esm.getHNT(params.second, "MODI"); - mEffects.emplace(ESM::MagicEffect::indexToRefId(id), params); + mEffects.emplace(effectId, params); + } } }