1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-02-05 14:28:27 +00:00

- Added save game version

- Serialized magic effect as RefId in activespells, creaturestats, and magiceffects
This commit is contained in:
Telvanni 4Life 2026-01-27 18:13:50 -05:00
parent 6226836c39
commit e97a293d05
4 changed files with 45 additions and 20 deletions

View file

@ -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<ESM::RefId>(&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;

View file

@ -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");
}

View file

@ -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;

View file

@ -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<int32_t, float> 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);
}
}
}