aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/save
diff options
context:
space:
mode:
authorSven Hesse2011-01-18 09:27:32 +0000
committerSven Hesse2011-01-18 09:27:32 +0000
commitefe0dea82c6c8fcbf4a50b950af2bf9cf82092d0 (patch)
treef2b513096a0d773d1e2b4cf7a6bf94ac8e28974b /engines/gob/save
parent4413754ad2b51fd07c97223f0790695c1f2d2235 (diff)
downloadscummvm-rg350-efe0dea82c6c8fcbf4a50b950af2bf9cf82092d0.tar.gz
scummvm-rg350-efe0dea82c6c8fcbf4a50b950af2bf9cf82092d0.tar.bz2
scummvm-rg350-efe0dea82c6c8fcbf4a50b950af2bf9cf82092d0.zip
GOB: Implement Urban Runner autosave
Makes the "Try again" after a death work svn-id: r55293
Diffstat (limited to 'engines/gob/save')
-rw-r--r--engines/gob/save/saveload.h21
-rw-r--r--engines/gob/save/saveload_v6.cpp105
2 files changed, 123 insertions, 3 deletions
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;
}