aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/save
diff options
context:
space:
mode:
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;
}