diff options
author | Filippos Karapetis | 2009-01-13 19:29:55 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-01-13 19:29:55 +0000 |
commit | 305954d34a612f14bdaad2cda9f982498f4f7066 (patch) | |
tree | 3d2e1bce1f59bc3541388fec200730f40733fef4 /engines/made | |
parent | 094fca2207cc88c5a82ab2ee7320e7345615a926 (diff) | |
download | scummvm-rg350-305954d34a612f14bdaad2cda9f982498f4f7066.tar.gz scummvm-rg350-305954d34a612f14bdaad2cda9f982498f4f7066.tar.bz2 scummvm-rg350-305954d34a612f14bdaad2cda9f982498f4f7066.zip |
Save game headers are now verified
svn-id: r35848
Diffstat (limited to 'engines/made')
-rw-r--r-- | engines/made/database.cpp | 62 | ||||
-rw-r--r-- | engines/made/database.h | 6 | ||||
-rw-r--r-- | engines/made/scriptfuncs.cpp | 4 |
3 files changed, 56 insertions, 16 deletions
diff --git a/engines/made/database.cpp b/engines/made/database.cpp index b317862951..ba7454be3e 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -416,7 +416,7 @@ void GameDatabaseV2::reloadFromStream(Common::SeekableReadStream &sourceS) { // Not used in version 2 games } -bool GameDatabaseV2::getSavegameDescription(const char *filename, Common::String &description) { +bool GameDatabaseV2::getSavegameDescription(const char *filename, Common::String &description, int16 version) { // Not used in version 2 games return false; } @@ -574,17 +574,38 @@ void GameDatabaseV3::reloadFromStream(Common::SeekableReadStream &sourceS) { sourceS.read(_gameState, _gameStateSize); } -bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description) { +bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description, int16 version) { Common::InSaveFile *in; char desc[64]; + if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { return false; } - in->skip(4); // TODO: Verify marker 'SGAM' - in->skip(4); // TODO: Verify size - in->skip(2); // TODO: Verify version + + uint32 header = in->readUint32BE(); + if (header != MKID_BE('SGAM')) { + warning("Save game header missing"); + delete in; + return false; + } + + int32 size = in->readUint32LE(); + if (size != in->size() - 64) { + warning("Unexpected save game size. Expected %d, size is %d (file size - 64)", size, in->size() - 64); + delete in; + return false; + } + + int16 saveVersion = in->readUint16LE(); + if (saveVersion != version) { + warning("Save game %s was saved with a different version of the game. Game version is %d, save version is %d", filename, version, saveVersion); + delete in; + return false; + } + in->read(desc, 64); description = desc; + delete in; return true; } @@ -610,19 +631,38 @@ int16 GameDatabaseV3::savegame(const char *filename, const char *description, in int16 GameDatabaseV3::loadgame(const char *filename, int16 version) { Common::InSaveFile *in; - int16 result = 0; - //uint32 expectedSize = 4 + 4 + 2 + _gameStateSize; + uint32 expectedSize = 4 + 4 + 2 + _gameStateSize; + if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { warning("Can't open file '%s', game not loaded", filename); return 1; } - in->skip(4); // TODO: Verify marker 'SGAM' - in->skip(4); // TODO: Verify size - in->skip(2); // TODO: Verify version + + uint32 header = in->readUint32BE(); + if (header != MKID_BE('SGAM')) { + warning("Save game header missing"); + delete in; + return 1; + } + + uint32 size = in->readUint32LE(); + if (size != expectedSize) { + warning("Unexpected save game size. Expected %d, size is %d", expectedSize, size); + delete in; + return false; + } + + int16 saveVersion = in->readUint16LE(); + if (saveVersion != version) { + warning("Save game %s was saved with a different version of the game. Game version is %d, save version is %d", filename, version, saveVersion); + delete in; + return 1; + } + in->skip(64); // skip savegame description in->read(_gameState, _gameStateSize); delete in; - return result; + return 0; } int16 *GameDatabaseV3::findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag) { diff --git a/engines/made/database.h b/engines/made/database.h index 6d12e20b2b..bceed50109 100644 --- a/engines/made/database.h +++ b/engines/made/database.h @@ -137,7 +137,7 @@ public: virtual int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag) = 0; virtual const char *getString(uint16 offset) = 0; - virtual bool getSavegameDescription(const char *filename, Common::String &description) = 0; + virtual bool getSavegameDescription(const char *filename, Common::String &description, int16 version) = 0; virtual int16 savegame(const char *filename, const char *description, int16 version) = 0; virtual int16 loadgame(const char *filename, int16 version) = 0; @@ -164,7 +164,7 @@ public: ~GameDatabaseV2(); int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag); const char *getString(uint16 offset); - bool getSavegameDescription(const char *filename, Common::String &description); + bool getSavegameDescription(const char *filename, Common::String &description, int16 version); int16 savegame(const char *filename, const char *description, int16 version); int16 loadgame(const char *filename, int16 version); protected: @@ -178,7 +178,7 @@ public: GameDatabaseV3(MadeEngine *vm); int16 *findObjectProperty(int16 objectIndex, int16 propertyId, int16 &propertyFlag); const char *getString(uint16 offset); - bool getSavegameDescription(const char *filename, Common::String &description); + bool getSavegameDescription(const char *filename, Common::String &description, int16 version); int16 savegame(const char *filename, const char *description, int16 version); int16 loadgame(const char *filename, int16 version); protected: diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp index da6f8cf1f9..f627ff7de0 100644 --- a/engines/made/scriptfuncs.cpp +++ b/engines/made/scriptfuncs.cpp @@ -896,7 +896,7 @@ int16 ScriptFunctions::sfGetGameDescription(int16 argc, int16 *argv) { int16 descObjectIndex = argv[2]; int16 saveNum = argv[1]; - /*int16 version = argv[0];*/ + int16 version = argv[0]; Common::String description; if (saveNum > 999) @@ -904,7 +904,7 @@ int16 ScriptFunctions::sfGetGameDescription(int16 argc, int16 *argv) { Common::String filename = _vm->getSavegameFilename(saveNum); - if (_vm->_dat->getSavegameDescription(filename.c_str(), description)) { + if (_vm->_dat->getSavegameDescription(filename.c_str(), description, version)) { _vm->_dat->setObjectString(descObjectIndex, description.c_str()); return 0; } else { |