diff --git a/apps/openmw/mwmechanics/stat.cpp b/apps/openmw/mwmechanics/stat.cpp index 585808645a..eacfca98ae 100644 --- a/apps/openmw/mwmechanics/stat.cpp +++ b/apps/openmw/mwmechanics/stat.cpp @@ -21,13 +21,13 @@ namespace MWMechanics void Stat::writeState (ESM::StatState& state) const { state.mBase = mBase; - state.mMod = mModifier + mBase; + state.mMod = mModifier; } template void Stat::readState (const ESM::StatState& state) { mBase = state.mBase; - mModifier = state.mMod - mBase; + mModifier = state.mMod; } diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index b0c2ea3a23..75136eb915 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -185,6 +185,11 @@ namespace else if constexpr (std::is_same_v) MWWorld::convertMagicEffects(state.mCreatureStats, state.mInventory, &state.mNpcStats); } + else if(state.mVersion < 20) + { + if constexpr (std::is_same_v || std::is_same_v) + MWWorld::convertStats(state.mCreatureStats); + } if (state.mRef.mRefNum.hasContentFile()) { diff --git a/apps/openmw/mwworld/magiceffects.cpp b/apps/openmw/mwworld/magiceffects.cpp index f52a61af52..44c4061832 100644 --- a/apps/openmw/mwworld/magiceffects.cpp +++ b/apps/openmw/mwworld/magiceffects.cpp @@ -201,14 +201,23 @@ namespace MWWorld { auto& dynamic = creatureStats.mDynamic[i]; dynamic.mCurrent -= dynamic.mMod - dynamic.mBase; - dynamic.mMod = dynamic.mBase; + dynamic.mMod = 0.f; } for(std::size_t i = 0; i < 4; ++i) - creatureStats.mAiSettings[i].mMod = creatureStats.mAiSettings[i].mBase; + creatureStats.mAiSettings[i].mMod = 0.f; if(npcStats) { for(std::size_t i = 0; i < ESM::Skill::Length; ++i) npcStats->mSkills[i].mMod = 0.f; } } + + // Versions 17-19 wrote different modifiers to the savegame depending on whether the save had upgraded from a pre-17 version or not + void convertStats(ESM::CreatureStats& creatureStats) + { + for(std::size_t i = 0; i < 3; ++i) + creatureStats.mDynamic[i].mMod = 0.f; + for(std::size_t i = 0; i < 4; ++i) + creatureStats.mAiSettings[i].mMod = 0.f; + } } diff --git a/apps/openmw/mwworld/magiceffects.hpp b/apps/openmw/mwworld/magiceffects.hpp index 31d5ed2038..fdcc578e53 100644 --- a/apps/openmw/mwworld/magiceffects.hpp +++ b/apps/openmw/mwworld/magiceffects.hpp @@ -12,6 +12,8 @@ namespace MWWorld { void convertMagicEffects(ESM::CreatureStats& creatureStats, ESM::InventoryState& inventory, ESM::NpcStats* npcStats = nullptr); + + void convertStats(ESM::CreatureStats& creatureStats); } #endif diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp index 7062366697..45e87a7942 100644 --- a/apps/openmw/mwworld/player.cpp +++ b/apps/openmw/mwworld/player.cpp @@ -383,6 +383,8 @@ namespace MWWorld } if (reader.getFormat() < 17) convertMagicEffects(player.mObject.mCreatureStats, player.mObject.mInventory, &player.mObject.mNpcStats); + else if(reader.getFormat() < 20) + convertStats(player.mObject.mCreatureStats); if (!player.mObject.mEnabled) { diff --git a/components/esm3/savedgame.cpp b/components/esm3/savedgame.cpp index 6cecf26489..18498abe2c 100644 --- a/components/esm3/savedgame.cpp +++ b/components/esm3/savedgame.cpp @@ -4,7 +4,7 @@ #include "esmwriter.hpp" unsigned int ESM::SavedGame::sRecordId = ESM::REC_SAVE; -int ESM::SavedGame::sCurrentFormat = 19; +int ESM::SavedGame::sCurrentFormat = 20; void ESM::SavedGame::load (ESMReader &esm) {