From fc37c77a9101972374cddbbe82d6079aa3468c2d Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Thu, 12 Dec 2013 12:19:25 +0100 Subject: [PATCH] store global variables in saved game files --- apps/openmw/mwstate/statemanagerimp.cpp | 1 + apps/openmw/mwworld/globals.cpp | 40 +++++++++++++++++++++++++ apps/openmw/mwworld/globals.hpp | 18 +++++++++++ apps/openmw/mwworld/worldimp.cpp | 11 ++++--- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp index 94219b8fca..a8f5631a02 100644 --- a/apps/openmw/mwstate/statemanagerimp.cpp +++ b/apps/openmw/mwstate/statemanagerimp.cpp @@ -161,6 +161,7 @@ void MWState::StateManager::loadGame (const Character *character, const Slot *sl case ESM::REC_NPC_: case ESM::REC_SPEL: case ESM::REC_WEAP: + case ESM::REC_GLOB: MWBase::Environment::get().getWorld()->readRecord (reader, n.val); break; diff --git a/apps/openmw/mwworld/globals.cpp b/apps/openmw/mwworld/globals.cpp index d8e96ddc36..879ffa8e34 100644 --- a/apps/openmw/mwworld/globals.cpp +++ b/apps/openmw/mwworld/globals.cpp @@ -3,6 +3,11 @@ #include +#include + +#include +#include + #include "esmstore.hpp" namespace MWWorld @@ -66,4 +71,39 @@ namespace MWWorld default: return ' '; } } + + int Globals::countSavedGameRecords() const + { + return mVariables.size(); + } + + void Globals::write (ESM::ESMWriter& writer) const + { + for (Collection::const_iterator iter (mVariables.begin()); iter!=mVariables.end(); ++iter) + { + writer.startRecord (ESM::REC_GLOB); + writer.writeHNString ("NAME", iter->first); + iter->second.write (writer, ESM::Variant::Format_Global); + writer.endRecord (ESM::REC_GLOB); + } + } + + bool Globals::readRecord (ESM::ESMReader& reader, int32_t type) + { + if (type==ESM::REC_GLOB) + { + std::string id = reader.getHNString ("NAME"); + + Collection::iterator iter = mVariables.find (Misc::StringUtils::lowerCase (id)); + + if (iter!=mVariables.end()) + iter->second.read (reader, ESM::Variant::Format_Global); + else + reader.skipHRecord(); + + return true; + } + + return false; + } } diff --git a/apps/openmw/mwworld/globals.hpp b/apps/openmw/mwworld/globals.hpp index ad140b0c1d..8f521c8a68 100644 --- a/apps/openmw/mwworld/globals.hpp +++ b/apps/openmw/mwworld/globals.hpp @@ -5,9 +5,17 @@ #include #include +#include + #include #include +namespace ESM +{ + class ESMWriter; + class ESMReader; +} + namespace MWWorld { class ESMStore; @@ -35,6 +43,16 @@ namespace MWWorld void fill (const MWWorld::ESMStore& store); ///< Replace variables with variables from \a store with default values. + + int countSavedGameRecords() const; + + void write (ESM::ESMWriter& writer) const; + + bool readRecord (ESM::ESMReader& reader, int32_t type); + ///< Records for variables that do not exist are dropped silently. + /// + /// \return Known type? + }; } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index c4e63fad0c..92091097c4 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -301,20 +301,23 @@ namespace MWWorld int World::countSavedGameRecords() const { - return mStore.countSavedGameRecords(); + return + mStore.countSavedGameRecords() + +mGlobalVariables.countSavedGameRecords(); } void World::write (ESM::ESMWriter& writer) const { mStore.write (writer); + mGlobalVariables.write (writer); } void World::readRecord (ESM::ESMReader& reader, int32_t type) { - if (!mStore.readRecord (reader, type)) + if (!mStore.readRecord (reader, type) && + !mGlobalVariables.readRecord (reader, type)) { - /// \todo handle other world state records - + throw std::runtime_error ("unknown record in saved game"); } }