diff --git a/engines/grim/detection.cpp b/engines/grim/detection.cpp index 7a2dce645d1..61b4085aa6d 100644 --- a/engines/grim/detection.cpp +++ b/engines/grim/detection.cpp @@ -462,7 +462,7 @@ SaveStateList GrimMetaEngine::listSaves(const char *target) const { if (slotNum >= 0) { SaveGame *savedState = SaveGame::openForLoading(*file); if (savedState) { - if (savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { + if (!savedState->isCompatible()) { delete savedState; continue; } diff --git a/engines/grim/grim.cpp b/engines/grim/grim.cpp index 9b009586cff..2944638ef70 100644 --- a/engines/grim/grim.cpp +++ b/engines/grim/grim.cpp @@ -746,7 +746,7 @@ void GrimEngine::savegameRestore() { filename = _savegameFileName; } _savedState = SaveGame::openForLoading(filename); - if (!_savedState || _savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) + if (!_savedState || !_savedState->isCompatible()) return; g_imuse->stopAllSounds(); g_imuse->resetState(); diff --git a/engines/grim/lua_v1.cpp b/engines/grim/lua_v1.cpp index f7c6bc52dec..c40fbc989d1 100644 --- a/engines/grim/lua_v1.cpp +++ b/engines/grim/lua_v1.cpp @@ -866,7 +866,7 @@ void Lua_V1::GetSaveGameImage() { } const char *filename = lua_getstring(param); SaveGame *savedState = SaveGame::openForLoading(filename); - if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { + if (!savedState || !savedState->isCompatible()) { lua_pushnil(); return; } @@ -924,7 +924,7 @@ void Lua_V1::GetSaveGameData() { SaveGame *savedState = SaveGame::openForLoading(filename); lua_Object result = lua_createtable(); - if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { + if (!savedState || !savedState->isCompatible()) { lua_pushobject(result); lua_pushnumber(2); lua_pushstring("mo.set"); // Just a placeholder to not make it throw a lua error @@ -934,7 +934,7 @@ void Lua_V1::GetSaveGameData() { if (!savedState) { warning("Savegame %s is invalid", filename); } else { - warning("Savegame %s is incompatible with this Residual build. Save version: %d; current version: %d", filename, savedState->saveVersion(), SaveGame::SAVEGAME_VERSION); + warning("Savegame %s is incompatible with this Residual build. Save version: %d; current version: %d", filename, savedState->saveMajorVersion(), SaveGame::SAVEGAME_MAJOR_VERSION); } delete savedState; return; diff --git a/engines/grim/savegame.cpp b/engines/grim/savegame.cpp index 9b59c872806..7bb244038a1 100644 --- a/engines/grim/savegame.cpp +++ b/engines/grim/savegame.cpp @@ -33,7 +33,8 @@ namespace Grim { #define SAVEGAME_HEADERTAG 'RSAV' #define SAVEGAME_FOOTERTAG 'ESAV' -int SaveGame::SAVEGAME_VERSION = 21; +uint SaveGame::SAVEGAME_MAJOR_VERSION = 22; +uint SaveGame::SAVEGAME_MINOR_VERSION = 0; SaveGame *SaveGame::openForLoading(const Common::String &filename) { Common::InSaveFile *inSaveFile = g_system->getSavefileManager()->openForLoading(filename); @@ -52,7 +53,8 @@ SaveGame *SaveGame::openForLoading(const Common::String &filename) { delete save; return NULL; } - save->_version = inSaveFile->readUint32BE(); + save->_majorVersion = inSaveFile->readUint32BE(); + save->_minorVersion = inSaveFile->readUint32BE(); return save; } @@ -70,9 +72,11 @@ SaveGame *SaveGame::openForSaving(const Common::String &filename) { save->_outSaveFile = outSaveFile; outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG); - outSaveFile->writeUint32BE(SAVEGAME_VERSION); + outSaveFile->writeUint32BE(SAVEGAME_MAJOR_VERSION); + outSaveFile->writeUint32BE(SAVEGAME_MINOR_VERSION); - save->_version = SAVEGAME_VERSION; + save->_majorVersion = SAVEGAME_MAJOR_VERSION; + save->_minorVersion = SAVEGAME_MINOR_VERSION; return save; } @@ -95,12 +99,20 @@ SaveGame::~SaveGame() { free(_sectionBuffer); } -int SaveGame::saveVersion() const { - return _version; +bool SaveGame::isCompatible() const { + return _majorVersion == SAVEGAME_MAJOR_VERSION; +} + +uint SaveGame::saveMajorVersion() const { + return _majorVersion; +} + +uint SaveGame::saveMinorVersion() const { + return _minorVersion; } uint32 SaveGame::beginSection(uint32 sectionTag) { - assert(_version == SAVEGAME_VERSION); + assert(_majorVersion == SAVEGAME_MAJOR_VERSION); if (_currentSection != 0) error("Tried to begin a new save game section with ending old section"); diff --git a/engines/grim/savegame.h b/engines/grim/savegame.h index 993e0b079c1..d8937924123 100644 --- a/engines/grim/savegame.h +++ b/engines/grim/savegame.h @@ -37,9 +37,24 @@ public: static SaveGame *openForSaving(const Common::String &filename); ~SaveGame(); - static int SAVEGAME_VERSION; + /** + * Major savegame version. + * If a savegame has a different major version than SAVEGAME_MAJOR_VERSION + * it cannot be loaded. + */ + static uint SAVEGAME_MAJOR_VERSION; + /** + * Minor savegame version. + * A savegame with a different minor version than SAVEGAME_MINOR_VERSION and + * the same major version than SAVEGAME_MAJOR_VERSION is compatible with + * the current loading code. + */ + static uint SAVEGAME_MINOR_VERSION; - int saveVersion() const; + bool isCompatible() const; + + uint saveMajorVersion() const; + uint saveMinorVersion() const; uint32 beginSection(uint32 sectionTag); void endSection(); uint32 getBufferPos(); @@ -70,7 +85,8 @@ public: protected: SaveGame(); - int _version; + uint _majorVersion; + uint _minorVersion; bool _saving; Common::InSaveFile *_inSaveFile; Common::OutSaveFile *_outSaveFile;