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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Wed Mar 26 22:17:08 CET 2008


Revision: 31249
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31249&view=rev
Author:   lordhoto
Date:     2008-03-26 14:17:07 -0700 (Wed, 26 Mar 2008)

Log Message:
-----------
Added support for HoF savefile from the original interpreter.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/saveload.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.cpp
===================================================================
--- scummvm/trunk/engines/kyra/saveload.cpp	2008-03-26 21:16:16 UTC (rev 31248)
+++ scummvm/trunk/engines/kyra/saveload.cpp	2008-03-26 21:17:07 UTC (rev 31249)
@@ -52,7 +52,7 @@
 	// following line to graciously handle old savegames from LE machines.
 	// if (type != MKID_BE('KYRA') && type != MKID_BE('ARYK')) {
 	if (type != MKID_BE(saveGameID())) {
-		warning("No Kyrandia savefile header.");
+		warning("No ScummVM Kyra engine savefile header.");
 		delete in;
 		return 0;
 	}

Modified: scummvm/trunk/engines/kyra/saveload_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/saveload_v2.cpp	2008-03-26 21:16:16 UTC (rev 31248)
+++ scummvm/trunk/engines/kyra/saveload_v2.cpp	2008-03-26 21:17:07 UTC (rev 31249)
@@ -134,9 +134,46 @@
 	uint32 version = 0;
 	char saveName[31];
 	Common::InSaveFile *in = openSaveForReading(fileName, version, saveName);
-	if (!in)
-		return;
+	if (!in) {
+		// check for original savefile
+		if (in = _saveFileMan->openForLoading(fileName)) {
+			in->seek(0x50, SEEK_CUR);
 
+			uint8 type[4];
+			uint8 acceptedType[4] = { 0x4D, 0x42, 0x4C, 0x33 }; // 'MBL3'
+			in->read(type, sizeof(type));
+			uint16 origVersion = in->readUint16LE();
+			
+			debug(1, "Savegame type: '%c%c%c%c' version: %d", type[0], type[1], type[2], type[3], version);
+
+			if (!memcmp(type, acceptedType, 4) && origVersion == 100) {
+				warning("Trying to load savegame from original interpreter, while this is possible, it is not officially supported.");
+
+				in->seek(0, SEEK_SET);
+
+				// read first 31 bytes of original description
+				in->read(saveName, 30);
+				saveName[30] = 0;
+				// skip last part of original description
+				in->seek(0x50-30, SEEK_CUR);
+				version = 0xF000 + origVersion;
+				// skip type
+				in->seek(4, SEEK_CUR);
+				// skip version
+				in->seek(2, SEEK_CUR);
+			} else {
+				delete in;
+				in = 0;
+			}
+		}
+
+		if (!in) {
+			showMessageFromCCode(0x35, 0x84, 0);
+			snd_playSoundEffect(0x0D);
+			return;
+		}
+	}
+
 	bool setFlag1EE = (queryGameFlag(0x1EE) != 0);
 	
 	_deathHandler = -1;
@@ -150,82 +187,181 @@
 
 	_screen->hideMouse();
 
-	_timer->loadDataFromFile(in, version);
+	if (version < 0xF000) {
+		_timer->loadDataFromFile(in, version);
 
-	uint32 flagsSize = in->readUint32BE();
-	assert(flagsSize <= sizeof(_flagsTable));
-	in->read(_flagsTable, flagsSize);
+		uint32 flagsSize = in->readUint32BE();
+		assert(flagsSize <= sizeof(_flagsTable));
+		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->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();
 
-	_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();
+		_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();
 
-	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 < 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 < 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 < 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();
+		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();
+	} else {
+		version -= 0xF000;
+
+		/*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);
+
+		_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();
+
+		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();
+		}
+
+		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 < 86; ++i) {
+			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();
+
+		uint32 currentTime = _system->getMillis();
+
+		for (int i = 0; i < 6; ++i)
+			_timer->setDelay(i, in->readSint32LE());
+
+		for (int i = 0; i < 6; ++i) {
+			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->resetNextRun();
+
+		_sceneExit1 = in->readUint16LE();
+		_sceneExit2 = in->readUint16LE();
+		_sceneExit3 = in->readUint16LE();
+		_sceneExit4 = in->readUint16LE();
 	}
 
-	_itemInHand = in->readSint16BE();
-	_sceneExit1 = in->readUint16BE();
-	_sceneExit2 = in->readUint16BE();
-	_sceneExit3 = in->readUint16BE();
-	_sceneExit4 = in->readUint16BE();
-
 	if (in->ioFailed())
 		error("Load failed ('%s', '%s').", fileName, saveName);
 	else

Modified: scummvm/trunk/engines/kyra/timer.cpp
===================================================================
--- scummvm/trunk/engines/kyra/timer.cpp	2008-03-26 21:16:16 UTC (rev 31248)
+++ scummvm/trunk/engines/kyra/timer.cpp	2008-03-26 21:17:07 UTC (rev 31249)
@@ -164,6 +164,18 @@
 	return -1;
 }
 
+void TimerManager::setNextRun(uint8 id, uint32 nextRun) {
+	debugC(9, kDebugLevelTimer, "TimerManager::setNextRun(%d, %u)", id, nextRun);
+
+	Iterator timer = Common::find_if(_timers.begin(), _timers.end(), TimerEqual(id));
+	if (timer != _timers.end()) {
+		timer->nextRun = nextRun;	
+		return;
+	}
+
+	warning("TimerManager::getNextRun: No timer %d", id);
+}
+
 uint32 TimerManager::getNextRun(uint8 id) const {
 	debugC(9, kDebugLevelTimer, "TimerManager::getNextRun(%d)", id);
 

Modified: scummvm/trunk/engines/kyra/timer.h
===================================================================
--- scummvm/trunk/engines/kyra/timer.h	2008-03-26 21:16:16 UTC (rev 31248)
+++ scummvm/trunk/engines/kyra/timer.h	2008-03-26 21:17:07 UTC (rev 31249)
@@ -69,17 +69,18 @@
 	void setCountdown(uint8 id, int32 countdown);
 	void setDelay(uint8 id, int32 countdown);
 	int32 getDelay(uint8 id) const;
+	void setNextRun(uint8 id, uint32 nextRun);
 	uint32 getNextRun(uint8 id) const;
 
 	bool isEnabled(uint8 id) const;
 	void enable(uint8 id);
 	void disable(uint8 id);
 
-	void resync();
-
 	void loadDataFromFile(Common::InSaveFile *file, int version);
 	void saveDataToFile(Common::OutSaveFile *file) const;
 private:
+	void resync();
+
 	KyraEngine *_vm;
 	OSystem *_system;
 	Common::List<TimerEntry> _timers;


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