[Scummvm-cvs-logs] SF.net SVN: scummvm:[33223] scummvm/branches/branch-0-12-0/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Wed Jul 23 04:41:29 CEST 2008


Revision: 33223
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33223&view=rev
Author:   drmccoy
Date:     2008-07-23 02:41:28 +0000 (Wed, 23 Jul 2008)

Log Message:
-----------
More savegame-endianness fixes :/ (backport)

Modified Paths:
--------------
    scummvm/branches/branch-0-12-0/engines/gob/gob.cpp
    scummvm/branches/branch-0-12-0/engines/gob/gob.h
    scummvm/branches/branch-0-12-0/engines/gob/inter.cpp
    scummvm/branches/branch-0-12-0/engines/gob/saveload.cpp
    scummvm/branches/branch-0-12-0/engines/gob/saveload.h
    scummvm/branches/branch-0-12-0/engines/gob/saveload_v2.cpp
    scummvm/branches/branch-0-12-0/engines/gob/saveload_v3.cpp
    scummvm/branches/branch-0-12-0/engines/gob/saveload_v4.cpp

Modified: scummvm/branches/branch-0-12-0/engines/gob/gob.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/gob.cpp	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/gob.cpp	2008-07-23 02:41:28 UTC (rev 33223)
@@ -147,6 +147,15 @@
 		error("Video mode 0x%X is not supported!", videoMode);
 }
 
+Endianness GobEngine::getEndianness() const {
+	if ((_vm->getPlatform() == Common::kPlatformAmiga) ||
+	    (_vm->getPlatform() == Common::kPlatformMacintosh) ||
+	    (_vm->getPlatform() == Common::kPlatformAtariST))
+		return kEndiannessBE;
+
+	return kEndiannessLE;
+}
+
 Common::Platform GobEngine::getPlatform() const {
 	return _platform;
 }

Modified: scummvm/branches/branch-0-12-0/engines/gob/gob.h
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/gob.h	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/gob.h	2008-07-23 02:41:28 UTC (rev 33223)
@@ -79,6 +79,11 @@
 #define VAR(var)                    READ_VAR_UINT32(var)
 
 
+enum Endianness {
+	kEndiannessLE,
+	kEndiannessBE
+};
+
 enum GameType {
 	kGameTypeNone = 0,
 	kGameTypeGob1,
@@ -230,6 +235,7 @@
 	void validateLanguage();
 	void validateVideoMode(int16 videoMode);
 
+	Endianness getEndianness() const;
 	Common::Platform getPlatform() const;
 	GameType getGameType() const;
 	bool isCD() const;

Modified: scummvm/branches/branch-0-12-0/engines/gob/inter.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/inter.cpp	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/inter.cpp	2008-07-23 02:41:28 UTC (rev 33223)
@@ -296,9 +296,7 @@
 }
 
 void Inter::allocateVars(uint32 count) {
-	if ((_vm->getPlatform() == Common::kPlatformAmiga) ||
-	    (_vm->getPlatform() == Common::kPlatformMacintosh) ||
-	    (_vm->getPlatform() == Common::kPlatformAtariST))
+	if (_vm->getEndianness() == kEndiannessBE)
 		_variables = new VariablesBE(count * 4);
 	else
 		_variables = new VariablesLE(count * 4);

Modified: scummvm/branches/branch-0-12-0/engines/gob/saveload.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/saveload.cpp	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/saveload.cpp	2008-07-23 02:41:28 UTC (rev 33223)
@@ -153,7 +153,7 @@
 }
 
 
-PlainSave::PlainSave() {
+PlainSave::PlainSave(Endianness endianness) : _endianness(endianness) {
 }
 
 PlainSave::~PlainSave() {
@@ -230,7 +230,8 @@
 	}
 
 	bool retVal;
-	retVal = SaveLoad::saveDataEndian(*out, dataVar, size, variables, variableSizes);
+	retVal = SaveLoad::saveDataEndian(*out, dataVar, size,
+			variables, variableSizes, _endianness);
 
 	out->finalize();
 	if (out->ioFailed()) {
@@ -258,13 +259,14 @@
 		return false;
 	}
 
-	bool retVal = SaveLoad::loadDataEndian(*in, dataVar, size, variables, variableSizes);
+	bool retVal = SaveLoad::loadDataEndian(*in, dataVar, size,
+			variables, variableSizes, _endianness);
 	delete in;
 	return retVal;
 }
 
 
-StagedSave::StagedSave() {
+StagedSave::StagedSave(Endianness endianness) : _endianness(endianness) {
 	_mode = kModeNone;
 	_name = 0;
 	_loaded = false;
@@ -487,7 +489,7 @@
 
 		} else
 			result = SaveLoad::saveDataEndian(*out, 0, _stages[i].size,
-					_stages[i].bufVar, _stages[i].bufVarSizes);
+					_stages[i].bufVar, _stages[i].bufVarSizes, _endianness);
 	}
 
 	if (result) {
@@ -533,7 +535,7 @@
 			_stages[i].bufVarSizes = new byte[_stages[i].size];
 
 			result = SaveLoad::loadDataEndian(*in, 0, _stages[i].size,
-					_stages[i].bufVar, _stages[i].bufVarSizes);
+					_stages[i].bufVar, _stages[i].bufVarSizes, _endianness);
 		}
 	}
 
@@ -734,12 +736,14 @@
 	}
 }
 
-bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count) {
+bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness) {
+	bool LE = (endianness == kEndiannessLE);
+
 	while (count-- > 0) {
 		if (*sizes == 3)
-			*((uint32 *) buf) = READ_LE_UINT32(buf);
+			*((uint32 *) buf) = LE ? READ_LE_UINT32(buf) : READ_BE_UINT32(buf);
 		else if (*sizes == 1)
-			*((uint16 *) buf) = READ_LE_UINT16(buf);
+			*((uint16 *) buf) = LE ? READ_LE_UINT16(buf) : READ_BE_UINT16(buf);
 		else if (*sizes != 0) {
 			warning("SaveLoad::fromEndian(): Corrupted variables sizes");
 			return false;
@@ -753,12 +757,19 @@
 	return true;
 }
 
-bool SaveLoad::toEndian(byte *buf, const byte *sizes, uint32 count) {
+bool SaveLoad::toEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness) {
 	while (count-- > 0) {
-		if (*sizes == 3)
-			WRITE_LE_UINT32(buf, *((uint32 *) buf));
-		else if (*sizes == 1)
-			WRITE_LE_UINT16(buf, *((uint16 *) buf));
+		if (*sizes == 3) {
+			if (endianness == kEndiannessLE)
+				WRITE_LE_UINT32(buf, *((uint32 *) buf));
+			else
+				WRITE_BE_UINT32(buf, *((uint32 *) buf));
+		} else if (*sizes == 1) {
+			if (endianness == kEndiannessLE)
+				WRITE_LE_UINT16(buf, *((uint16 *) buf));
+			else
+				WRITE_BE_UINT16(buf, *((uint16 *) buf));
+		}
 		else if (*sizes != 0) {
 			warning("SaveLoad::toEndian(): Corrupted variables sizes");
 			return false;
@@ -811,7 +822,8 @@
 }
 
 bool SaveLoad::loadDataEndian(Common::ReadStream &in,
-		int16 dataVar, uint32 size, byte *variables, byte *variableSizes) {
+		int16 dataVar, uint32 size,
+		byte *variables, byte *variableSizes, Endianness endianness) {
 
 	bool retVal = false;
 
@@ -821,7 +833,7 @@
 	assert(varBuf && sizeBuf);
 
 	if (read(in, varBuf, sizeBuf, size) == size) {
-		if (fromEndian(varBuf, sizeBuf, size)) {
+		if (fromEndian(varBuf, sizeBuf, size, endianness)) {
 			memcpy(variables + dataVar, varBuf, size);
 			memcpy(variableSizes + dataVar, sizeBuf, size);
 			retVal = true;
@@ -835,7 +847,8 @@
 }
 
 bool SaveLoad::saveDataEndian(Common::WriteStream &out,
-		int16 dataVar, uint32 size, const byte *variables, const byte *variableSizes) {
+		int16 dataVar, uint32 size,
+		const byte *variables, const byte *variableSizes, Endianness endianness) {
 
 	bool retVal = false;
 
@@ -847,7 +860,7 @@
 	memcpy(varBuf, variables + dataVar, size);
 	memcpy(sizeBuf, variableSizes + dataVar, size);
 
-	if (toEndian(varBuf, sizeBuf, size))
+	if (toEndian(varBuf, sizeBuf, size, endianness))
 		if (write(out, varBuf, sizeBuf, size) == size)
 			retVal = true;
 

Modified: scummvm/branches/branch-0-12-0/engines/gob/saveload.h
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/saveload.h	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/saveload.h	2008-07-23 02:41:28 UTC (rev 33223)
@@ -65,7 +65,7 @@
 
 class PlainSave {
 public:
-	PlainSave();
+	PlainSave(Endianness endianness);
 	~PlainSave();
 
 	bool save(int16 dataVar, int32 size, int32 offset, const char *name,
@@ -77,11 +77,14 @@
 			const byte *variables, const byte *variableSizes) const;
 	bool load(int16 dataVar, int32 size, int32 offset, const char *name,
 			byte *variables, byte *variableSizes) const;
+
+private:
+	Endianness _endianness;
 };
 
 class StagedSave {
 public:
-	StagedSave();
+	StagedSave(Endianness endianness);
 	~StagedSave();
 
 	void addStage(int32 size, bool endianed = true);
@@ -114,6 +117,8 @@
 		kModeLoad
 	};
 
+	Endianness _endianness;
+
 	Common::Array<Stage> _stages;
 	enum Mode _mode;
 	char *_name;
@@ -178,17 +183,19 @@
 
 	static const char *stripPath(const char *fileName);
 
-	static bool fromEndian(byte *buf, const byte *sizes, uint32 count);
-	static bool toEndian(byte *buf, const byte *sizes, uint32 count);
+	static bool fromEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness);
+	static bool toEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness);
 	static uint32 read(Common::ReadStream &in,
 			byte *buf, byte *sizes, uint32 count);
 	static uint32 write(Common::WriteStream &out,
 			const byte *buf, const byte *sizes, uint32 count);
 
 	static bool loadDataEndian(Common::ReadStream &in,
-			int16 dataVar, uint32 size, byte *variables, byte *variableSizes);
+			int16 dataVar, uint32 size,
+			byte *variables, byte *variableSizes, Endianness endianness);
 	static bool saveDataEndian(Common::WriteStream &out,
-			int16 dataVar, uint32 size, const byte *variables, const byte *variableSizes);
+			int16 dataVar, uint32 size,
+			const byte *variables, const byte *variableSizes, Endianness endianness);
 
 protected:
 	GobEngine *_vm;
@@ -228,8 +235,8 @@
 	int32 _varSize;
 
 	TempSprite _tmpSprite;
-	PlainSave _notes;
-	StagedSave _save;
+	PlainSave *_notes;
+	StagedSave *_save;
 
 	byte _indexBuffer[600];
 	bool _hasIndex;
@@ -306,8 +313,8 @@
 
 	TempSprite _screenshot;
 	TempSprite _tmpSprite;
-	PlainSave _notes;
-	StagedSave _save;
+	PlainSave *_notes;
+	StagedSave *_save;
 
 	byte _propBuffer[1000];
 	byte _indexBuffer[1200];
@@ -370,7 +377,7 @@
 
 	int32 _varSize;
 
-	StagedSave _save;
+	StagedSave *_save;
 
 	byte _propBuffer[1000];
 	byte _indexBuffer[1200];

Modified: scummvm/branches/branch-0-12-0/engines/gob/saveload_v2.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/saveload_v2.cpp	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/saveload_v2.cpp	2008-07-23 02:41:28 UTC (rev 33223)
@@ -45,6 +45,9 @@
 SaveLoad_v2::SaveLoad_v2(GobEngine *vm, const char *targetName) :
 		SaveLoad(vm, targetName) {
 
+	_notes = new PlainSave(_vm->getEndianness());
+	_save = new StagedSave(_vm->getEndianness());
+
 	_saveFiles[0].destName = new char[strlen(targetName) + 5];
 	_saveFiles[1].destName = _saveFiles[0].destName;
 	_saveFiles[2].destName = 0;
@@ -58,6 +61,9 @@
 }
 
 SaveLoad_v2::~SaveLoad_v2() {
+	delete _notes;
+	delete _save;
+
 	delete[] _saveFiles[0].destName;
 	delete[] _saveFiles[3].destName;
 }
@@ -227,7 +233,7 @@
 			return false;
 		}
 
-		if (!_save.load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
+		if (!_save->load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
 			return false;
 	}
 
@@ -268,7 +274,7 @@
 
 	debugC(2, kDebugSaveLoad, "Loading the notes");
 
-	return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
+	return _notes->load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
 }
 
 bool SaveLoad_v2::saveGame(SaveFile &saveFile,
@@ -313,10 +319,10 @@
 
 		byte sizes[40];
 		memset(sizes, 0, 40);
-		if(!_save.save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes))
+		if(!_save->save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes))
 			return false;
 
-		if (!_save.save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
+		if (!_save->save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
 			return false;
 
 	}
@@ -350,7 +356,7 @@
 
 	debugC(2, kDebugSaveLoad, "Saving the notes");
 
-	return _notes.save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
+	return _notes->save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
 	return false;
 }
 
@@ -360,8 +366,8 @@
 
 	_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
 
-	_save.addStage(40);
-	_save.addStage(_varSize);
+	_save->addStage(40);
+	_save->addStage(_varSize);
 }
 
 } // End of namespace Gob

Modified: scummvm/branches/branch-0-12-0/engines/gob/saveload_v3.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/saveload_v3.cpp	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/saveload_v3.cpp	2008-07-23 02:41:28 UTC (rev 33223)
@@ -48,6 +48,9 @@
 		uint32 screenshotSize, int32 indexOffset, int32 screenshotOffset) :
 	SaveLoad(vm, targetName) {
 
+	_notes = new PlainSave(_vm->getEndianness());
+	_save = new StagedSave(_vm->getEndianness());
+
 	_screenshotSize = screenshotSize;
 	_indexOffset = indexOffset;
 	_screenshotOffset = screenshotOffset;
@@ -71,6 +74,9 @@
 }
 
 SaveLoad_v3::~SaveLoad_v3() {
+	delete _notes;
+	delete _save;
+
 	delete[] _saveFiles[0].destName;
 	delete[] _saveFiles[3].destName;
 }
@@ -243,7 +249,7 @@
 int32 SaveLoad_v3::getSizeScreenshot(SaveFile &saveFile) {
 	if (!_useScreenshots) {
 		_useScreenshots = true;
-		_save.addStage(_screenshotSize, false);
+		_save->addStage(_screenshotSize, false);
 	}
 
 	Common::SaveFileManager *saveMan = g_system->getSavefileManager();
@@ -312,7 +318,7 @@
 			return false;
 		}
 
-		if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
+		if (!_save->load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
 			return false;
 	}
 
@@ -353,7 +359,7 @@
 
 	debugC(2, kDebugSaveLoad, "Loading the notes");
 
-	return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
+	return _notes->load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
 }
 
 bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile,
@@ -363,7 +369,7 @@
 
 	if (!_useScreenshots) {
 		_useScreenshots = true;
-		_save.addStage(_screenshotSize, false);
+		_save->addStage(_screenshotSize, false);
 	}
 
 	if (offset == _indexOffset) {
@@ -395,7 +401,7 @@
 
 		byte *buffer = new byte[_screenshotSize];
 
-		if (!_save.load(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
+		if (!_save->load(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
 			delete[] buffer;
 			return false;
 		}
@@ -483,13 +489,13 @@
 
 		_hasIndex = false;
 
-		if(!_save.save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
+		if(!_save->save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
 			return false;
 
-		if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0))
+		if(!_save->save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0))
 			return false;
 
-		if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
+		if (!_save->save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
 			return false;
 
 	}
@@ -523,7 +529,7 @@
 
 	debugC(2, kDebugSaveLoad, "Saving the notes");
 
-	return _notes.save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables);
+	return _notes->save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables);
 	return false;
 }
 
@@ -534,7 +540,7 @@
 
 	if (!_useScreenshots) {
 		_useScreenshots = true;
-		_save.addStage(_screenshotSize, false);
+		_save->addStage(_screenshotSize, false);
 	}
 
 	if (offset >= _screenshotOffset) {
@@ -571,7 +577,7 @@
 			return false;
 		}
 
-		if (!_save.save(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
+		if (!_save->save(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
 			delete[] buffer;
 			return false;
 		}
@@ -588,9 +594,9 @@
 
 	_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
 
-	_save.addStage(500);
-	_save.addStage(40, false);
-	_save.addStage(_varSize);
+	_save->addStage(500);
+	_save->addStage(40, false);
+	_save->addStage(_varSize);
 }
 
 void SaveLoad_v3::buildScreenshotIndex(byte *buffer, char *name, int n) {

Modified: scummvm/branches/branch-0-12-0/engines/gob/saveload_v4.cpp
===================================================================
--- scummvm/branches/branch-0-12-0/engines/gob/saveload_v4.cpp	2008-07-23 02:41:02 UTC (rev 33222)
+++ scummvm/branches/branch-0-12-0/engines/gob/saveload_v4.cpp	2008-07-23 02:41:28 UTC (rev 33223)
@@ -50,6 +50,8 @@
 SaveLoad_v4::SaveLoad_v4(GobEngine *vm, const char *targetName) :
 	SaveLoad(vm, targetName) {
 
+	_save = new StagedSave(_vm->getEndianness());
+
 	_firstSizeGame = true;
 
 	_saveFiles[0].destName = 0;
@@ -76,6 +78,8 @@
 }
 
 SaveLoad_v4::~SaveLoad_v4() {
+	delete _save;
+
 	delete[] _screenProps;
 	delete[] _saveFiles[1].destName;
 }
@@ -297,7 +301,7 @@
 			return false;
 		}
 
-		if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
+		if (!_save->load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
 			return false;
 	}
 
@@ -314,7 +318,7 @@
 
 	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
 
-	if (!_save.load(0, 256000, _varSize + 540, saveFile.destName,
+	if (!_save->load(0, 256000, _varSize + 540, saveFile.destName,
 	                _screenProps, _screenProps + 256000))
 		return false;
 
@@ -393,13 +397,13 @@
 
 		_hasIndex = false;
 
-		if(!_save.save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
+		if(!_save->save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
 			return false;
 
-		if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0))
+		if(!_save->save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0))
 			return false;
 
-		if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
+		if (!_save->save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
 			return false;
 
 	}
@@ -417,7 +421,7 @@
 
 	setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
 
-	if (!_save.save(0, 256000, _varSize + 540, saveFile.destName,
+	if (!_save->save(0, 256000, _varSize + 540, saveFile.destName,
 	                _screenProps, _screenProps + 256000))
 		return false;
 
@@ -430,10 +434,10 @@
 
 	_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
 
-	_save.addStage(500);
-	_save.addStage(40, false);
-	_save.addStage(_varSize);
-	_save.addStage(256000);
+	_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