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) {
|
||||
SaveGame *savedState = SaveGame::openForLoading(*file);
|
||||
if (savedState) {
|
||||
if (savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) {
|
||||
if (!savedState->isCompatible()) {
|
||||
delete savedState;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue