GRIM: Add minor versioning of savegames, allowing compatible save versions.

Bump savegame version to 22.0.
This commit is contained in:
Giulio Camuffo 2012-03-09 15:44:53 +01:00
parent 873a2d1373
commit 3c515489d3
5 changed files with 43 additions and 15 deletions

View file

@ -462,7 +462,7 @@ SaveStateList GrimMetaEngine::listSaves(const char *target) const {
if (slotNum >= 0) { if (slotNum >= 0) {
SaveGame *savedState = SaveGame::openForLoading(*file); SaveGame *savedState = SaveGame::openForLoading(*file);
if (savedState) { if (savedState) {
if (savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { if (!savedState->isCompatible()) {
delete savedState; delete savedState;
continue; continue;
} }

View file

@ -746,7 +746,7 @@ void GrimEngine::savegameRestore() {
filename = _savegameFileName; filename = _savegameFileName;
} }
_savedState = SaveGame::openForLoading(filename); _savedState = SaveGame::openForLoading(filename);
if (!_savedState || _savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) if (!_savedState || !_savedState->isCompatible())
return; return;
g_imuse->stopAllSounds(); g_imuse->stopAllSounds();
g_imuse->resetState(); g_imuse->resetState();

View file

@ -866,7 +866,7 @@ void Lua_V1::GetSaveGameImage() {
} }
const char *filename = lua_getstring(param); const char *filename = lua_getstring(param);
SaveGame *savedState = SaveGame::openForLoading(filename); SaveGame *savedState = SaveGame::openForLoading(filename);
if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { if (!savedState || !savedState->isCompatible()) {
lua_pushnil(); lua_pushnil();
return; return;
} }
@ -924,7 +924,7 @@ void Lua_V1::GetSaveGameData() {
SaveGame *savedState = SaveGame::openForLoading(filename); SaveGame *savedState = SaveGame::openForLoading(filename);
lua_Object result = lua_createtable(); lua_Object result = lua_createtable();
if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { if (!savedState || !savedState->isCompatible()) {
lua_pushobject(result); lua_pushobject(result);
lua_pushnumber(2); lua_pushnumber(2);
lua_pushstring("mo.set"); // Just a placeholder to not make it throw a lua error 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) { if (!savedState) {
warning("Savegame %s is invalid", filename); warning("Savegame %s is invalid", filename);
} else { } 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; delete savedState;
return; return;

View file

@ -33,7 +33,8 @@ namespace Grim {
#define SAVEGAME_HEADERTAG 'RSAV' #define SAVEGAME_HEADERTAG 'RSAV'
#define SAVEGAME_FOOTERTAG 'ESAV' #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) { SaveGame *SaveGame::openForLoading(const Common::String &filename) {
Common::InSaveFile *inSaveFile = g_system->getSavefileManager()->openForLoading(filename); Common::InSaveFile *inSaveFile = g_system->getSavefileManager()->openForLoading(filename);
@ -52,7 +53,8 @@ SaveGame *SaveGame::openForLoading(const Common::String &filename) {
delete save; delete save;
return NULL; return NULL;
} }
save->_version = inSaveFile->readUint32BE(); save->_majorVersion = inSaveFile->readUint32BE();
save->_minorVersion = inSaveFile->readUint32BE();
return save; return save;
} }
@ -70,9 +72,11 @@ SaveGame *SaveGame::openForSaving(const Common::String &filename) {
save->_outSaveFile = outSaveFile; save->_outSaveFile = outSaveFile;
outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG); 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; return save;
} }
@ -95,12 +99,20 @@ SaveGame::~SaveGame() {
free(_sectionBuffer); free(_sectionBuffer);
} }
int SaveGame::saveVersion() const { bool SaveGame::isCompatible() const {
return _version; return _majorVersion == SAVEGAME_MAJOR_VERSION;
}
uint SaveGame::saveMajorVersion() const {
return _majorVersion;
}
uint SaveGame::saveMinorVersion() const {
return _minorVersion;
} }
uint32 SaveGame::beginSection(uint32 sectionTag) { uint32 SaveGame::beginSection(uint32 sectionTag) {
assert(_version == SAVEGAME_VERSION); assert(_majorVersion == SAVEGAME_MAJOR_VERSION);
if (_currentSection != 0) if (_currentSection != 0)
error("Tried to begin a new save game section with ending old section"); error("Tried to begin a new save game section with ending old section");

View file

@ -37,9 +37,24 @@ public:
static SaveGame *openForSaving(const Common::String &filename); static SaveGame *openForSaving(const Common::String &filename);
~SaveGame(); ~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); uint32 beginSection(uint32 sectionTag);
void endSection(); void endSection();
uint32 getBufferPos(); uint32 getBufferPos();
@ -70,7 +85,8 @@ public:
protected: protected:
SaveGame(); SaveGame();
int _version; uint _majorVersion;
uint _minorVersion;
bool _saving; bool _saving;
Common::InSaveFile *_inSaveFile; Common::InSaveFile *_inSaveFile;
Common::OutSaveFile *_outSaveFile; Common::OutSaveFile *_outSaveFile;