From efe0dea82c6c8fcbf4a50b950af2bf9cf82092d0 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Tue, 18 Jan 2011 09:27:32 +0000 Subject: GOB: Implement Urban Runner autosave Makes the "Try again" after a death work svn-id: r55293 --- engines/gob/save/saveload.h | 21 ++++++++ engines/gob/save/saveload_v6.cpp | 105 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 3 deletions(-) (limited to 'engines/gob/save') diff --git a/engines/gob/save/saveload.h b/engines/gob/save/saveload.h index de64be36f0..a88dfee0d9 100644 --- a/engines/gob/save/saveload.h +++ b/engines/gob/save/saveload.h @@ -517,9 +517,30 @@ protected: void refreshProps(); }; + /** Handles the autosave. */ + class AutoHandler : public SaveHandler { + public: + AutoHandler(GobEngine *vm, const Common::String &target); + ~AutoHandler(); + + int32 getSize(); + bool load(int16 dataVar, int32 size, int32 offset); + bool save(int16 dataVar, int32 size, int32 offset); + + private: + class File : public SlotFileStatic { + public: + File(GobEngine *vm, const Common::String &base); + ~File(); + }; + + File _file; + }; + static SaveFile _saveFiles[]; GameHandler *_gameHandler; + AutoHandler *_autoHandler; SaveHandler *getHandler(const char *fileName) const; const char *getDescription(const char *fileName) const; diff --git a/engines/gob/save/saveload_v6.cpp b/engines/gob/save/saveload_v6.cpp index e31c8b4809..0b9e45a9c0 100644 --- a/engines/gob/save/saveload_v6.cpp +++ b/engines/gob/save/saveload_v6.cpp @@ -31,9 +31,10 @@ namespace Gob { SaveLoad_v6::SaveFile SaveLoad_v6::_saveFiles[] = { - { "cat.inf", kSaveModeSave, 0, "savegame"}, // Save file - { "mdo.def", kSaveModeExists, 0, 0}, - {"no_cd.txt", kSaveModeExists, 0, 0}, + { "cat.inf" , kSaveModeSave, 0, "savegame"}, // Save file + { "cata1.inf", kSaveModeSave, 0, "autosave"}, // Autosave file + { "mdo.def" , kSaveModeExists, 0, 0}, + {"no_cd.txt" , kSaveModeExists, 0, 0}, }; @@ -275,15 +276,113 @@ void SaveLoad_v6::GameHandler::refreshProps() { } +SaveLoad_v6::AutoHandler::File::File(GobEngine *vm, const Common::String &base) : + SlotFileStatic(vm, base, "aut") { +} + +SaveLoad_v6::AutoHandler::File::~File() { +} + + +SaveLoad_v6::AutoHandler::AutoHandler(GobEngine *vm, const Common::String &target) : + SaveHandler(vm), _file(vm, target) { +} + +SaveLoad_v6::AutoHandler::~AutoHandler() { +} + +int32 SaveLoad_v6::AutoHandler::getSize() { + Common::String fileName = _file.build(); + if (fileName.empty()) + return -1; + + SaveReader reader(1, 0, fileName); + SaveHeader header; + + if (!reader.load()) + return -1; + + if (!reader.readPartHeader(0, &header)) + return -1; + + // Return the part's size + return header.getSize() + 2900; +} + +bool SaveLoad_v6::AutoHandler::load(int16 dataVar, int32 size, int32 offset) { + uint32 varSize = SaveHandler::getVarSize(_vm); + if (varSize == 0) + return false; + + if ((size != 0) || (offset != 2900)) { + warning("Invalid autoloading procedure (%d, %d, %d)", dataVar, size, offset); + return false; + } + + Common::String fileName = _file.build(); + if (fileName.empty()) + return false; + + SaveReader reader(1, 0, fileName); + SaveHeader header; + SavePartVars vars(_vm, varSize); + + if (!reader.load()) + return false; + + if (!reader.readPartHeader(0, &header)) + return false; + + if (header.getSize() != varSize) { + warning("Autosave mismatch (%d, %d)", header.getSize(), varSize); + return false; + } + + if (!reader.readPart(0, &vars)) + return false; + + if (!vars.writeInto(0, 0, varSize)) + return false; + + return true; +} + +bool SaveLoad_v6::AutoHandler::save(int16 dataVar, int32 size, int32 offset) { + uint32 varSize = SaveHandler::getVarSize(_vm); + if (varSize == 0) + return false; + + if ((size != 0) || (offset != 2900)) { + warning("Invalid autosaving procedure (%d, %d, %d)", dataVar, size, offset); + return false; + } + + Common::String fileName = _file.build(); + if (fileName.empty()) + return false; + + SaveWriter writer(1, 0, fileName); + SavePartVars vars(_vm, varSize); + + if (!vars.readFrom(0, 0, varSize)) + return false; + + return writer.writePart(0, &vars); +} + + SaveLoad_v6::SaveLoad_v6(GobEngine *vm, const char *targetName) : SaveLoad(vm) { _gameHandler = new GameHandler(vm, targetName); + _autoHandler = new AutoHandler(vm, targetName); _saveFiles[0].handler = _gameHandler; + _saveFiles[1].handler = _autoHandler; } SaveLoad_v6::~SaveLoad_v6() { + delete _autoHandler; delete _gameHandler; } -- cgit v1.2.3