[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