[Scummvm-cvs-logs] SF.net SVN: scummvm: [32079] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Tue May 13 06:54:59 CEST 2008


Revision: 32079
          http://scummvm.svn.sourceforge.net/scummvm/?rev=32079&view=rev
Author:   drmccoy
Date:     2008-05-12 21:54:58 -0700 (Mon, 12 May 2008)

Log Message:
-----------
Implemented/Fixed saving/loading in Woodruff -- this time for real.

Modified Paths:
--------------
    scummvm/trunk/engines/gob/saveload.h
    scummvm/trunk/engines/gob/saveload_v4.cpp

Modified: scummvm/trunk/engines/gob/saveload.h
===================================================================
--- scummvm/trunk/engines/gob/saveload.h	2008-05-12 22:37:21 UTC (rev 32078)
+++ scummvm/trunk/engines/gob/saveload.h	2008-05-13 04:54:58 UTC (rev 32079)
@@ -335,8 +335,9 @@
 public:
 	enum SaveType {
 		kSaveNone,
+		kSaveScreenProps,
 		kSaveGame,
-		kSaveTempBuffer
+		kSaveGameScreenProps
 	};
 
 	bool _firstSizeGame;
@@ -358,13 +359,14 @@
 
 	int32 _varSize;
 
-	PagedBuffer _tmpBuffer;
 	StagedSave _save;
 
 	byte _propBuffer[1000];
 	byte _indexBuffer[1200];
 	bool _hasIndex;
 
+	byte *_screenProps;
+
 	virtual int getSaveType(const char *fileName);
 
 	virtual int32 getSizeVersioned(int type);
@@ -374,14 +376,17 @@
 	int getSlot(int32 offset) const;
 	int getSlotRemainder(int32 offset) const;
 
+	int32 getSizeScreenProps(SaveFile &saveFile);
 	int32 getSizeGame(SaveFile &saveFile);
-	int32 getSizeTempBuffer(SaveFile &saveFile);
+	int32 getSizeGameScreenProps(SaveFile &saveFile);
 
+	bool loadScreenProps(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
 	bool loadGame(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
-	bool loadTempBuffer(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
+	bool loadGameScreenProps(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
 
+	bool saveScreenProps(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
 	bool saveGame(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
-	bool saveTempBuffer(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
+	bool saveGameScreenProps(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
 
 	void assertInited();
 };

Modified: scummvm/trunk/engines/gob/saveload_v4.cpp
===================================================================
--- scummvm/trunk/engines/gob/saveload_v4.cpp	2008-05-12 22:37:21 UTC (rev 32078)
+++ scummvm/trunk/engines/gob/saveload_v4.cpp	2008-05-13 04:54:58 UTC (rev 32079)
@@ -33,8 +33,18 @@
 namespace Gob {
 
 SaveLoad_v4::SaveFile SaveLoad_v4::_saveFiles[] = {
-	{  "cat.inf", 0, kSaveModeSave, kSaveGame       },
-	{ "save.tmp", 0, kSaveModeSave, kSaveTempBuffer }
+	{  "save.tmp", 0, kSaveModeSave, kSaveScreenProps     },
+	{   "cat.inf", 0, kSaveModeSave, kSaveGame            },
+	{ "save0.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save1.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save2.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save3.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save4.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save5.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save6.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save7.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save8.tmp", 0, kSaveModeSave, kSaveGameScreenProps },
+	{ "save9.tmp", 0, kSaveModeSave, kSaveGameScreenProps }
 };
 
 SaveLoad_v4::SaveLoad_v4(GobEngine *vm, const char *targetName) :
@@ -42,18 +52,32 @@
 
 	_firstSizeGame = true;
 
-	_saveFiles[0].destName = new char[strlen(targetName) + 5];
-	_saveFiles[1].destName = 0;
+	_saveFiles[0].destName = 0;
+	_saveFiles[1].destName = new char[strlen(targetName) + 5];
+	_saveFiles[2].destName = _saveFiles[1].destName;
+	_saveFiles[3].destName = _saveFiles[1].destName;
+	_saveFiles[4].destName = _saveFiles[1].destName;
+	_saveFiles[5].destName = _saveFiles[1].destName;
+	_saveFiles[6].destName = _saveFiles[1].destName;
+	_saveFiles[7].destName = _saveFiles[1].destName;
+	_saveFiles[8].destName = _saveFiles[1].destName;
+	_saveFiles[9].destName = _saveFiles[1].destName;
+	_saveFiles[10].destName = _saveFiles[1].destName;
+	_saveFiles[11].destName = _saveFiles[1].destName;
 
-	sprintf(_saveFiles[0].destName, "%s.s00", targetName);
+	sprintf(_saveFiles[1].destName, "%s.s00", targetName);
 
 	_varSize = 0;
 	_hasIndex = false;
 	memset(_propBuffer, 0, 1000);
+
+	_screenProps = new byte[512000];
+	memset(_screenProps, 0, 512000);
 }
 
 SaveLoad_v4::~SaveLoad_v4() {
-	delete[] _saveFiles[0].destName;
+	delete[] _screenProps;
+	delete[] _saveFiles[1].destName;
 }
 
 SaveLoad::SaveMode SaveLoad_v4::getSaveMode(const char *fileName) {
@@ -78,10 +102,12 @@
 	assertInited();
 
 	switch (_saveFiles[type].type) {
+	case kSaveScreenProps:
+		return getSizeScreenProps(_saveFiles[type]);
 	case kSaveGame:
 		return getSizeGame(_saveFiles[type]);
-	case kSaveTempBuffer:
-		return getSizeTempBuffer(_saveFiles[type]);
+	case kSaveGameScreenProps:
+		return getSizeGameScreenProps(_saveFiles[type]);
 	default:
 		break;
 	}
@@ -93,6 +119,13 @@
 	assertInited();
 
 	switch (_saveFiles[type].type) {
+	case kSaveScreenProps:
+		if (loadScreenProps(_saveFiles[type], dataVar, size, offset))
+			return true;
+
+		warning("While loading screen properties");
+		break;
+
 	case kSaveGame:
 		if (loadGame(_saveFiles[type], dataVar, size, offset))
 			return true;
@@ -100,11 +133,11 @@
 		warning("While loading from slot %d", getSlot(offset));
 		break;
 
-	case kSaveTempBuffer:
-		if (loadTempBuffer(_saveFiles[type], dataVar, size, offset))
+	case kSaveGameScreenProps:
+		if (loadGameScreenProps(_saveFiles[type], dataVar, size, offset))
 			return true;
 
-		warning("While loading from the tempBuffer");
+		warning("While loading screen properties from slot %d", getSlot(offset));
 		break;
 
 	default:
@@ -118,6 +151,13 @@
 	assertInited();
 
 	switch (_saveFiles[type].type) {
+	case kSaveScreenProps:
+		if (saveScreenProps(_saveFiles[type], dataVar, size, offset))
+			return true;
+
+		warning("While saving screen properties");
+		break;
+
 	case kSaveGame:
 		if (saveGame(_saveFiles[type], dataVar, size, offset))
 			return true;
@@ -125,11 +165,11 @@
 		warning("While saving to slot %d", getSlot(offset));
 		break;
 
-	case kSaveTempBuffer:
-		if (saveTempBuffer(_saveFiles[type], dataVar, size, offset))
+	case kSaveGameScreenProps:
+		if (saveGameScreenProps(_saveFiles[type], dataVar, size, offset))
 			return true;
 
-		warning("While saving to the tempBuffer");
+		warning("While saving screen properties to slot %d", getSlot(offset));
 		break;
 
 	default:
@@ -147,6 +187,10 @@
 	return ((offset - 1700) % _varSize);
 }
 
+int32 SaveLoad_v4::getSizeScreenProps(SaveFile &saveFile) {
+	return 256000;
+}
+
 int32 SaveLoad_v4::getSizeGame(SaveFile &saveFile) {
 	if (_firstSizeGame) {
 		_firstSizeGame = false;
@@ -169,10 +213,46 @@
 	return size;
 }
 
-int32 SaveLoad_v4::getSizeTempBuffer(SaveFile &saveFile) {
-	return _tmpBuffer.getSize();
+int32 SaveLoad_v4::getSizeGameScreenProps(SaveFile &saveFile) {
+	return -1;
+
+	Common::SaveFileManager *saveMan = g_system->getSavefileManager();
+	Common::InSaveFile *in;
+
+	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
+	in = saveMan->openForLoading(saveFile.destName);
+
+	if (!in)
+		return -1;
+
+	int32 size = in->size();
+
+	delete in;
+
+	return size;
 }
 
+bool SaveLoad_v4::loadScreenProps(SaveFile &saveFile,
+		int16 dataVar, int32 size, int32 offset) {
+
+	// Using a sprite as a buffer
+	if (size <= 0)
+		return true;
+
+	if ((offset < 0) || (size + offset) > 256000) {
+		warning("Invalid size (%d) or offset (%d)", size, offset);
+		return false;
+	}
+
+	debugC(3, kDebugSaveLoad, "Loading screen properties (%d, %d, %d)",
+			dataVar, size, offset);
+
+	memcpy(_vm->_global->_inter_variables + dataVar, _screenProps + offset, size);
+	memcpy(_vm->_global->_inter_variablesSizes + dataVar, _screenProps + 256000 + offset, size);
+
+	return true;
+}
+
 bool SaveLoad_v4::loadGame(SaveFile &saveFile,
 		int16 dataVar, int32 size, int32 offset) {
 
@@ -228,18 +308,42 @@
 	return true;
 }
 
-bool SaveLoad_v4::loadTempBuffer(SaveFile &saveFile,
+bool SaveLoad_v4::loadGameScreenProps(SaveFile &saveFile,
 		int16 dataVar, int32 size, int32 offset) {
 
-	debugC(3, kDebugSaveLoad, "Loading from the temporary buffer (%d, %d, %d)",
-			dataVar, size, offset);
+	if (size != -5) {
+		warning("Invalid loading procedure (%d, %d, %d)", dataVar, size, offset);
+		return false;
+	}
 
-	if (size < 0) {
-		warning("Woodruff stub: Read screenshot");
+	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
+
+	if (!_save.load(0, 256000, _varSize + 540, saveFile.destName,
+	                _screenProps, _screenProps + 256000))
 		return false;
+
+	return true;
+}
+
+bool SaveLoad_v4::saveScreenProps(SaveFile &saveFile,
+		int16 dataVar, int32 size, int32 offset) {
+
+	// Using a sprite as a buffer
+	if (size <= 0)
+		return true;
+
+	if ((offset < 0) || (size + offset) > 256000) {
+		warning("Invalid size (%d) or offset (%d)", size, offset);
+		return false;
 	}
 
-	return _tmpBuffer.read(_vm->_global->_inter_variables + dataVar, size, offset);
+	debugC(3, kDebugSaveLoad, "Saving screen properties (%d, %d, %d)",
+			dataVar, size, offset);
+
+	memcpy(_screenProps + offset, _vm->_global->_inter_variables + dataVar, size);
+	memcpy(_screenProps + 256000 + offset, _vm->_global->_inter_variablesSizes + dataVar, size);
+
+	return true;
 }
 
 bool SaveLoad_v4::saveGame(SaveFile &saveFile,
@@ -310,18 +414,21 @@
 	return true;
 }
 
-bool SaveLoad_v4::saveTempBuffer(SaveFile &saveFile,
+bool SaveLoad_v4::saveGameScreenProps(SaveFile &saveFile,
 		int16 dataVar, int32 size, int32 offset) {
 
-	debugC(3, kDebugSaveLoad, "Saving to the temporary buffer (%d, %d, %d)",
-			dataVar, size, offset);
-
-	if (size < 0) {
-		warning("Woodruff stub: Write screenshot");
+	if (size != -5) {
+		warning("Invalid saving procedure (%d, %d, %d)", dataVar, size, offset);
 		return false;
 	}
 
-	return _tmpBuffer.write(_vm->_global->_inter_variables + dataVar, size, offset);
+	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
+
+	if (!_save.save(0, 256000, _varSize + 540, saveFile.destName,
+	                _screenProps, _screenProps + 256000))
+		return false;
+
+	return true;
 }
 
 void SaveLoad_v4::assertInited() {
@@ -333,6 +440,7 @@
 	_save.addStage(500);
 	_save.addStage(40, false);
 	_save.addStage(_varSize);
+	_save.addStage(256000);
 }
 
 } // End of namespace Gob


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