[Scummvm-cvs-logs] SF.net SVN: scummvm: [31271] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Thu Mar 27 21:55:00 CET 2008


Revision: 31271
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31271&view=rev
Author:   lordhoto
Date:     2008-03-27 13:54:59 -0700 (Thu, 27 Mar 2008)

Log Message:
-----------
Removed much code duplication in Hand of Fate savefile loading with SeekableSubReadStreamEndian.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/saveload_v1.cpp
    scummvm/trunk/engines/kyra/saveload_v2.cpp
    scummvm/trunk/engines/kyra/timer.cpp
    scummvm/trunk/engines/kyra/timer.h

Modified: scummvm/trunk/engines/kyra/saveload_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/saveload_v1.cpp	2008-03-27 20:53:52 UTC (rev 31270)
+++ scummvm/trunk/engines/kyra/saveload_v1.cpp	2008-03-27 20:54:59 UTC (rev 31271)
@@ -104,7 +104,7 @@
 	_poisonDeathCounter = in->readByte();
 	_animator->_brandonDrawFrame = in->readUint16BE();
 
-	_timer->loadDataFromFile(in, header.version);
+	_timer->loadDataFromFile(*in, header.version);
 
 	memset(_flagsTable, 0, sizeof(_flagsTable));
 	uint32 flagsSize = in->readUint32BE();
@@ -262,7 +262,7 @@
 	out->writeByte(_poisonDeathCounter);
 	out->writeUint16BE(_animator->_brandonDrawFrame);
 
-	_timer->saveDataToFile(out);
+	_timer->saveDataToFile(*out);
 
 	out->writeUint32BE(sizeof(_flagsTable));
 	out->write(_flagsTable, sizeof(_flagsTable));

Modified: scummvm/trunk/engines/kyra/saveload_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/saveload_v2.cpp	2008-03-27 20:53:52 UTC (rev 31270)
+++ scummvm/trunk/engines/kyra/saveload_v2.cpp	2008-03-27 20:54:59 UTC (rev 31271)
@@ -42,7 +42,7 @@
 	if (!out)
 		return;
 
-	_timer->saveDataToFile(out);
+	_timer->saveDataToFile(*out);
 
 	out->writeUint32BE(sizeof(_flagsTable));
 	out->write(_flagsTable, sizeof(_flagsTable));
@@ -132,8 +132,8 @@
 	debugC(9, kDebugLevelMain, "KyraEngine_v2::loadGame('%s')", fileName);
 
 	SaveHeader header;
-	Common::InSaveFile *in = openSaveForReading(fileName, header);
-	if (!in) {
+	Common::InSaveFile *saveFile = openSaveForReading(fileName, header);
+	if (!saveFile) {
 		showMessageFromCCode(0x35, 0x84, 0);
 		snd_playSoundEffect(0x0D);
 	}
@@ -152,188 +152,137 @@
 
 	int loadedZTable = _loadedZTable;
 
+	Common::SeekableSubReadStreamEndian in(saveFile, saveFile->pos(), saveFile->size(), !header.originalSave, true);
+
 	_screen->hideMouse();
 
 	if (!header.originalSave) {
 		_timer->loadDataFromFile(in, header.version);
 
-		uint32 flagsSize = in->readUint32BE();
+		uint32 flagsSize = in.readUint32BE();
 		assert(flagsSize <= sizeof(_flagsTable));
-		in->read(_flagsTable, flagsSize);
+		in.read(_flagsTable, flagsSize);
+	}
 
-		// usually we have to save the flag set by opcode 10 here
-		//word_2AB05 = in->readUint16BE();
-		_lastMusicCommand = in->readSint16BE();
-		_newChapterFile = in->readByte();
-		_loadedZTable = in->readByte();
-		_cauldronState = in->readByte();
-		_colorCodeFlag1 = in->readByte();
-		_colorCodeFlag2 = in->readByte();
-		_bookCurPage = in->readByte();
-		_bookMaxPage = in->readByte();
-		for (int i = 0; i < 7; ++i)
-			_presetColorCode[i] = in->readByte();
-		for (int i = 0; i < 7; ++i)
-			_inputColorCode[i] = in->readByte();
-		for (int i = 0; i < 25; ++i)
-			_cauldronTable[i] = in->readSint16BE();
-		for (int i = 0; i < 20; ++i)
-			_hiddenItems[i] = in->readUint16BE();
-		for (int i = 0; i < 19; ++i)
-			in->read(_conversationState[i], 14);
-		in->read(_newSceneDlgState, 32);
-		_cauldronUseCount = in->readSint16BE();
+	// usually we have to save the flag set by opcode 10 here
+	//word_2AB05 = in.readUint16();
+	if (header.originalSave)
+		in.readUint16();
+	_lastMusicCommand = in.readSint16();
+	_newChapterFile = in.readByte();
+	_loadedZTable = in.readByte();
+	_cauldronState = in.readByte();
+	_colorCodeFlag1 = in.readByte();
+	_colorCodeFlag2 = in.readByte();
+	_bookCurPage = in.readByte();
+	_bookMaxPage = in.readByte();
+	for (int i = 0; i < 7; ++i)
+		_presetColorCode[i] = in.readByte();
+	for (int i = 0; i < 7; ++i)
+		_inputColorCode[i] = in.readByte();
+	for (int i = 0; i < 25; ++i)
+		_cauldronTable[i] = in.readSint16();
+	for (int i = 0; i < 20; ++i)
+		_hiddenItems[i] = in.readUint16();
 
-		_mainCharacter.sceneId = in->readUint16BE();
-		_mainCharacter.dlgIndex = in->readUint16BE();
-		_mainCharacter.height = in->readByte();
-		_mainCharacter.facing = in->readByte();
-		_mainCharacter.animFrame = in->readUint16BE();
-		_mainCharacter.unk8 = in->readByte();
-		_mainCharacter.unk9 = in->readByte();
-		_mainCharacter.unkA = in->readByte();
-		for (int i = 0; i < 20; ++i)
-			_mainCharacter.inventory[i] = in->readUint16BE();
-		_mainCharacter.x1 = in->readSint16BE();
-		_mainCharacter.y1 = in->readSint16BE();
-		_mainCharacter.x2 = in->readSint16BE();
-		_mainCharacter.y2 = in->readSint16BE();
+	if (header.originalSave) {
+		assert(sizeof(_flagsTable) >= 0x41);
+		in.read(_flagsTable, 0x41);
+	}
 
-		for (int i = 0; i < 30; ++i) {
-			_itemList[i].id = in->readUint16BE();
-			_itemList[i].sceneId = in->readUint16BE();
-			_itemList[i].x = in->readSint16BE();
-			_itemList[i].y = in->readByte();
-			_itemList[i].unk7 = in->readUint16BE();
-		}
+	for (int i = 0; i < 19; ++i)
+		in.read(_conversationState[i], 14);
 
-		for (int i = 0; i < 72; ++i) {
-			in->read(_talkObjectList[i].filename, 13);
-			_talkObjectList[i].scriptId = in->readByte();
-			_talkObjectList[i].x = in->readSint16BE();
-			_talkObjectList[i].y = in->readSint16BE();
-			_talkObjectList[i].color = in->readByte();
-		}
-
-		for (int i = 0; i < 86; ++i) {
-			in->read(_sceneList[i].filename, 10);
-			_sceneList[i].exit1 = in->readUint16BE();
-			_sceneList[i].exit2 = in->readUint16BE();
-			_sceneList[i].exit3 = in->readUint16BE();
-			_sceneList[i].exit4 = in->readUint16BE();
-			_sceneList[i].flags = in->readByte();
-			_sceneList[i].sound = in->readByte();
-		}
-
-		_itemInHand = in->readSint16BE();
-		_sceneExit1 = in->readUint16BE();
-		_sceneExit2 = in->readUint16BE();
-		_sceneExit3 = in->readUint16BE();
-		_sceneExit4 = in->readUint16BE();
+	if (!header.originalSave) {
+		in.read(_newSceneDlgState, 32);
 	} else {
-		/*word_2AB05 = */in->readUint16LE();
-		_lastMusicCommand = in->readSint16LE();
-		_newChapterFile = in->readByte();
-		_loadedZTable = in->readByte();
-		_cauldronState = in->readByte();
-		_colorCodeFlag1 = in->readByte();
-		_colorCodeFlag2 = in->readByte();
-		_bookCurPage = in->readByte();
-		_bookMaxPage = in->readByte();
-
-		for (int i = 0; i < 7; ++i)
-			_presetColorCode[i] = in->readByte();
-		for (int i = 0; i < 7; ++i)
-			_inputColorCode[i] = in->readByte();
-		for (int i = 0; i < 25; ++i)
-			_cauldronTable[i] = in->readSint16LE();
-		for (int i = 0; i < 20; ++i)
-			_hiddenItems[i] = in->readUint16LE();
-
-		assert(sizeof(_flagsTable) >= 0x41);
-		in->read(_flagsTable, 0x41);
-
-		for (int i = 0; i < 19; ++i)
-			in->read(_conversationState[i], 14);
 		for (int i = 0; i < 31; ++i)
-			_newSceneDlgState[i] = in->readUint16LE();
-		_cauldronUseCount = in->readSint16LE();
-		in->seek(6, SEEK_CUR);
+			_newSceneDlgState[i] = in.readUint16();
+	}
+		
+	_cauldronUseCount = in.readSint16();
 
-		_mainCharacter.sceneId = in->readUint16LE();
-		_mainCharacter.dlgIndex = in->readUint16LE();
-		_mainCharacter.height = in->readByte();
-		_mainCharacter.facing = in->readByte();
-		_mainCharacter.animFrame = in->readUint16LE();
-		_mainCharacter.unk8 = in->readByte();
-		_mainCharacter.unk9 = in->readByte();
-		_mainCharacter.unkA = in->readByte();
-		for (int i = 0; i < 20; ++i)
-			_mainCharacter.inventory[i] = in->readUint16LE();
-		_mainCharacter.x1 = in->readSint16LE();
-		_mainCharacter.y1 = in->readSint16LE();
-		_mainCharacter.x2 = in->readSint16LE();
-		_mainCharacter.y2 = in->readSint16LE();
+	if (header.originalSave)
+		in.seek(6, SEEK_CUR);
 
-		for (int i = 0; i < 30; ++i) {
-			_itemList[i].id = in->readUint16LE();
-			_itemList[i].sceneId = in->readUint16LE();
-			_itemList[i].x = in->readSint16LE();
-			_itemList[i].y = in->readByte();
-			_itemList[i].unk7 = in->readUint16LE();
-		}
+	_mainCharacter.sceneId = in.readUint16();
+	_mainCharacter.dlgIndex = in.readUint16();
+	_mainCharacter.height = in.readByte();
+	_mainCharacter.facing = in.readByte();
+	_mainCharacter.animFrame = in.readUint16();
+	_mainCharacter.unk8 = in.readByte();
+	_mainCharacter.unk9 = in.readByte();
+	_mainCharacter.unkA = in.readByte();
+	for (int i = 0; i < 20; ++i)
+		_mainCharacter.inventory[i] = in.readUint16();
+	_mainCharacter.x1 = in.readSint16();
+	_mainCharacter.y1 = in.readSint16();
+	_mainCharacter.x2 = in.readSint16();
+	_mainCharacter.y2 = in.readSint16();
 
-		for (int i = 0; i < 72; ++i) {
-			in->read(_talkObjectList[i].filename, 13);
-			_talkObjectList[i].scriptId = in->readByte();
-			_talkObjectList[i].x = in->readSint16LE();
-			_talkObjectList[i].y = in->readSint16LE();
-			_talkObjectList[i].color = in->readByte();
-		}
+	for (int i = 0; i < 30; ++i) {
+		_itemList[i].id = in.readUint16();
+		_itemList[i].sceneId = in.readUint16();
+		_itemList[i].x = in.readSint16();
+		_itemList[i].y = in.readByte();
+		_itemList[i].unk7 = in.readUint16();
+	}
 
-		for (int i = 0; i < 86; ++i) {
-			in->read(_sceneList[i].filename, 9);
+	for (int i = 0; i < 72; ++i) {
+		in.read(_talkObjectList[i].filename, 13);
+		_talkObjectList[i].scriptId = in.readByte();
+		_talkObjectList[i].x = in.readSint16();
+		_talkObjectList[i].y = in.readSint16();
+		_talkObjectList[i].color = in.readByte();
+	}
+
+	for (int i = 0; i < 86; ++i) {
+		if (!header.originalSave) {
+			in.read(_sceneList[i].filename, 10);
+		} else {
+			in.read(_sceneList[i].filename, 9);
 			_sceneList[i].filename[9] = 0;
-			_sceneList[i].exit1 = in->readUint16LE();
-			_sceneList[i].exit2 = in->readUint16LE();
-			_sceneList[i].exit3 = in->readUint16LE();
-			_sceneList[i].exit4 = in->readUint16LE();
-			_sceneList[i].flags = in->readByte();
-			_sceneList[i].sound = in->readByte();
 		}
 
-		_itemInHand = in->readSint16LE();
+		_sceneList[i].exit1 = in.readUint16();
+		_sceneList[i].exit2 = in.readUint16();
+		_sceneList[i].exit3 = in.readUint16();
+		_sceneList[i].exit4 = in.readUint16();
+		_sceneList[i].flags = in.readByte();
+		_sceneList[i].sound = in.readByte();
+	}
 
+	_itemInHand = in.readSint16();
+
+	if (header.originalSave) {
 		uint32 currentTime = _system->getMillis();
 
 		for (int i = 0; i < 6; ++i)
-			_timer->setDelay(i, in->readSint32LE());
+			_timer->setDelay(i, in.readSint32LE());
 
 		for (int i = 0; i < 6; ++i) {
-			if (in->readUint16LE())
+			if (in.readUint16LE())
 				_timer->enable(i);
 			else
 				_timer->disable(i);
 		}
 
 		for (int i = 0; i < 6; ++i)
-			_timer->setNextRun(i, currentTime + (in->readUint32LE() * _tickLength));
+			_timer->setNextRun(i, currentTime + (in.readUint32LE() * _tickLength));
 
 		_timer->resetNextRun();
-
-		_sceneExit1 = in->readUint16LE();
-		_sceneExit2 = in->readUint16LE();
-		_sceneExit3 = in->readUint16LE();
-		_sceneExit4 = in->readUint16LE();
 	}
 
-	if (in->ioFailed())
+	_sceneExit1 = in.readUint16();
+	_sceneExit2 = in.readUint16();
+	_sceneExit3 = in.readUint16();
+	_sceneExit4 = in.readUint16();
+
+	if (saveFile->ioFailed())
 		error("Load failed ('%s', '%s').", fileName, header.description.c_str());
 	else
 		debugC(1, kDebugLevelMain, "Loaded savegame '%s.'", header.description.c_str());
 
-	delete in;
-
 	if (loadedZTable != _loadedZTable)
 		loadZShapes(_loadedZTable);
 

Modified: scummvm/trunk/engines/kyra/timer.cpp
===================================================================
--- scummvm/trunk/engines/kyra/timer.cpp	2008-03-27 20:53:52 UTC (rev 31270)
+++ scummvm/trunk/engines/kyra/timer.cpp	2008-03-27 20:54:59 UTC (rev 31271)
@@ -27,7 +27,7 @@
 #include "kyra/timer.h"
 
 #include "common/func.h"
-#include "common/savefile.h"
+#include "common/stream.h"
 
 namespace Kyra {
 
@@ -218,15 +218,15 @@
 		warning("TimerManager::disable: No timer %d", id);
 }
 
-void TimerManager::loadDataFromFile(Common::InSaveFile *file, int version) {
-	debugC(9, kDebugLevelTimer, "TimerManager::loadDataFromFile(%p, %d)", (const void*)file, version);
+void TimerManager::loadDataFromFile(Common::SeekableReadStream &file, int version) {
+	debugC(9, kDebugLevelTimer, "TimerManager::loadDataFromFile(%p, %d)", (const void*)&file, version);
 
 	if (version <= 7) {
 		_nextRun = 0;
 		for (int i = 0; i < 32; ++i) {
-			uint8 enabled = file->readByte();
-			int32 countdown = file->readSint32BE();
-			uint32 nextRun = file->readUint32BE();
+			uint8 enabled = file.readByte();
+			int32 countdown = file.readSint32BE();
+			uint32 nextRun = file.readUint32BE();
 
 			Iterator timer = Common::find_if(_timers.begin(), _timers.end(), TimerEqual(i));
 			if (timer != _timers.end()) {
@@ -246,18 +246,18 @@
 			}
 		}
 	} else {
-		int entries = file->readByte();
+		int entries = file.readByte();
 		for (int i = 0; i < entries; ++i) {
-			uint8 id = file->readByte();
+			uint8 id = file.readByte();
 
 			Iterator timer = Common::find_if(_timers.begin(), _timers.end(), TimerEqual(id));
 			if (timer != _timers.end()) {
-				timer->enabled = file->readByte();
-				timer->countdown = file->readSint32BE();
-				timer->lastUpdate = file->readSint32BE();
+				timer->enabled = file.readByte();
+				timer->countdown = file.readSint32BE();
+				timer->lastUpdate = file.readSint32BE();
 			} else {
 				warning("Loading timer data for non existing timer %d", id);
-				file->seek(7, SEEK_CUR);
+				file.seek(7, SEEK_CUR);
 			}
 		}
 
@@ -265,15 +265,15 @@
 	}
 }
 
-void TimerManager::saveDataToFile(Common::OutSaveFile *file) const {
-	debugC(9, kDebugLevelTimer, "TimerManager::saveDataToFile(%p)", (const void*)file);
+void TimerManager::saveDataToFile(Common::WriteStream &file) const {
+	debugC(9, kDebugLevelTimer, "TimerManager::saveDataToFile(%p)", (const void*)&file);
 
-	file->writeByte(count());
+	file.writeByte(count());
 	for (CIterator pos = _timers.begin(); pos != _timers.end(); ++pos) {
-		file->writeByte(pos->id);
-		file->writeByte(pos->enabled);
-		file->writeSint32BE(pos->countdown);
-		file->writeSint32BE(pos->lastUpdate - _system->getMillis());
+		file.writeByte(pos->id);
+		file.writeByte(pos->enabled);
+		file.writeSint32BE(pos->countdown);
+		file.writeSint32BE(pos->lastUpdate - _system->getMillis());
 	}
 }
 

Modified: scummvm/trunk/engines/kyra/timer.h
===================================================================
--- scummvm/trunk/engines/kyra/timer.h	2008-03-27 20:53:52 UTC (rev 31270)
+++ scummvm/trunk/engines/kyra/timer.h	2008-03-27 20:54:59 UTC (rev 31271)
@@ -30,12 +30,8 @@
 #include "kyra/util.h"
 
 #include "common/list.h"
+#include "common/stream.h"
 
-namespace Common {
-class InSaveFile;
-class OutSaveFile;
-} // end of namespace Common
-
 namespace Kyra {
 
 typedef Functor1<int, void> TimerFunc;
@@ -76,8 +72,8 @@
 	void enable(uint8 id);
 	void disable(uint8 id);
 
-	void loadDataFromFile(Common::InSaveFile *file, int version);
-	void saveDataToFile(Common::OutSaveFile *file) const;
+	void loadDataFromFile(Common::SeekableReadStream &file, int version);
+	void saveDataToFile(Common::WriteStream &file) const;
 private:
 	void resync();
 


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