[Scummvm-cvs-logs] SF.net SVN: scummvm:[55293] scummvm/trunk/engines/gob/save
drmccoy at users.sourceforge.net
drmccoy at users.sourceforge.net
Tue Jan 18 10:27:32 CET 2011
Revision: 55293
http://scummvm.svn.sourceforge.net/scummvm/?rev=55293&view=rev
Author: drmccoy
Date: 2011-01-18 09:27:32 +0000 (Tue, 18 Jan 2011)
Log Message:
-----------
GOB: Implement Urban Runner autosave
Makes the "Try again" after a death work
Modified Paths:
--------------
scummvm/trunk/engines/gob/save/saveload.h
scummvm/trunk/engines/gob/save/saveload_v6.cpp
Modified: scummvm/trunk/engines/gob/save/saveload.h
===================================================================
--- scummvm/trunk/engines/gob/save/saveload.h 2011-01-18 09:16:52 UTC (rev 55292)
+++ scummvm/trunk/engines/gob/save/saveload.h 2011-01-18 09:27:32 UTC (rev 55293)
@@ -517,9 +517,30 @@
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;
Modified: scummvm/trunk/engines/gob/save/saveload_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/save/saveload_v6.cpp 2011-01-18 09:16:52 UTC (rev 55292)
+++ scummvm/trunk/engines/gob/save/saveload_v6.cpp 2011-01-18 09:27:32 UTC (rev 55293)
@@ -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 @@
}
+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;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list