GRIM: Add minor versioning of savegames, allowing compatible save versions.
Bump savegame version to 22.0.
This commit is contained in:
parent
873a2d1373
commit
3c515489d3
5 changed files with 43 additions and 15 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue