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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Wed Apr 23 18:06:33 CEST 2008


Revision: 31664
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31664&view=rev
Author:   lordhoto
Date:     2008-04-23 09:06:33 -0700 (Wed, 23 Apr 2008)

Log Message:
-----------
Implemented opcodes:
 - 8: o3_getMalcolmsSpirit
 - 52: o3_setMalcolmsSpirit
 - 65: o3_updateConversations
 - 117: o3_runDialog

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/kyra_v3.cpp
    scummvm/trunk/engines/kyra/kyra_v3.h
    scummvm/trunk/engines/kyra/script.cpp
    scummvm/trunk/engines/kyra/script_v3.cpp
    scummvm/trunk/engines/kyra/text_v3.cpp

Modified: scummvm/trunk/engines/kyra/kyra_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-23 14:58:30 UTC (rev 31663)
+++ scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-23 16:06:33 UTC (rev 31664)
@@ -120,6 +120,7 @@
 	memset(&_dialogScriptData, 0, sizeof(_dialogScriptData));
 	memset(&_dialogScriptState, 0, sizeof(_dialogScriptState));
 	_dialogScriptFuncStart = _dialogScriptFuncProc = _dialogScriptFuncEnd = 0;
+	_malcolmsSpirit = 1;
 }
 
 KyraEngine_v3::~KyraEngine_v3() {

Modified: scummvm/trunk/engines/kyra/kyra_v3.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-23 14:58:30 UTC (rev 31663)
+++ scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-23 16:06:33 UTC (rev 31664)
@@ -454,6 +454,8 @@
 
 	bool checkCharCollision(int x, int y);
 
+	int _malcolmsSpirit;
+
 	// talk object
 	struct TalkObject {
 		char filename[13];
@@ -523,6 +525,7 @@
 	int o3d_delay(ScriptState *script);
 
 	void malcolmRandomChat();
+	void runDialog(int dlgIndex, int funcNum);
 
 	// conscience
 	bool _badConscienceShown;
@@ -582,6 +585,7 @@
 	int o3_getCharacterY(ScriptState *script);
 	int o3_getCharacterFacing(ScriptState *script);
 	int o3_getCharacterScene(ScriptState *script);
+	int o3_getMalcolmsSpirit(ScriptState *script);
 	int o3_trySceneChange(ScriptState *script);
 	int o3_showSceneFileMessage(ScriptState *script);
 	int o3_showBadConscience(ScriptState *script);
@@ -602,10 +606,12 @@
 	int o3_showMouse(ScriptState *script);
 	int o3_badConscienceChat(ScriptState *script);
 	int o3_wipeDownMouseItem(ScriptState *script);
+	int o3_setMalcolmsSpirit(ScriptState *script);
 	int o3_delay(ScriptState *script);
 	int o3_setSceneFilename(ScriptState *script);
 	int o3_drawSceneShape(ScriptState *script);
 	int o3_checkInRect(ScriptState *script);
+	int o3_updateConversations(ScriptState *script);
 	int o3_setSceneDim(ScriptState *script);
 	int o3_update(ScriptState *script);
 	int o3_enterNewScene(ScriptState *script);
@@ -619,6 +625,7 @@
 	int o3_defineSceneAnim(ScriptState *script);
 	int o3_updateSceneAnim(ScriptState *script);
 	int o3_runActorScript(ScriptState *script);
+	int o3_runDialog(ScriptState *script);
 	int o3_malcolmRandomChat(ScriptState *script);
 	int o3_setDlgIndex(ScriptState *script);
 	int o3_getDlgIndex(ScriptState *script);

Modified: scummvm/trunk/engines/kyra/script.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script.cpp	2008-04-23 14:58:30 UTC (rev 31663)
+++ scummvm/trunk/engines/kyra/script.cpp	2008-04-23 16:06:33 UTC (rev 31664)
@@ -221,6 +221,7 @@
 void ScriptFileParser::setFile(const char *filename, Resource *res) {
 	destroy();
 
+	res->exists(filename, true);
 	_stream = res->getFileStream(filename);
 	assert(_stream);
 	_startOffset = 0;

Modified: scummvm/trunk/engines/kyra/script_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-23 14:58:30 UTC (rev 31663)
+++ scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-23 16:06:33 UTC (rev 31664)
@@ -108,6 +108,11 @@
 	return _mainCharacter.sceneId;
 }
 
+int KyraEngine_v3::o3_getMalcolmsSpirit(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getMalcolmsSpirit(%p) ()", (const void *)script);
+	return _malcolmsSpirit;
+}
+
 int KyraEngine_v3::o3_trySceneChange(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_trySceneChange(%p) (%d, %d, %d, %d)", (const void *)script,
 			stackPos(0), stackPos(1), stackPos(2), stackPos(3));
@@ -283,6 +288,11 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_setMalcolmsSpirit(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setMalcolmsSpirit(%p) (%d)", (const void *)script, stackPos(0));
+	return (_malcolmsSpirit = stackPos(0));
+}
+
 int KyraEngine_v3::o3_delay(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_delay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
 	const uint32 delayTime = stackPos(0) * _tickLength;
@@ -337,6 +347,210 @@
 	}
 }
 
+int KyraEngine_v3::o3_updateConversations(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_updateConversations(%p) (%d)", (const void *)script, stackPos(0));
+	int dlgIndex = stackPos(0);
+	switch (_curChapter-2) {
+	case 0:
+		dlgIndex -= 34;
+		break;
+	
+	case 1:
+		dlgIndex -= 54;
+		break;
+
+	case 2:
+		dlgIndex -= 55;
+		break;
+
+	case 3:
+		dlgIndex -= 70;
+		break;
+
+	default:
+		break;
+	}
+
+	int convs[4];
+	Common::set_to(convs, convs+4, -1);
+
+	if (_curChapter == 1) {
+		switch (_mainCharacter.dlgIndex) {
+		case 0:
+			convs[0] = 6;
+			convs[1] = 12;
+			break;
+
+		case 2:
+			convs[0] = 8;
+			convs[1] = 14;
+			break;
+
+		case 3:
+			convs[0] = 9;
+			convs[1] = 15;
+			break;
+
+		case 4:
+			convs[0] = 10;
+			convs[1] = 16;
+			break;
+
+		case 5:
+			convs[0] = 11;
+			convs[1] = 17;
+			break;
+
+		case 6:
+			convs[0] = 0;
+			convs[1] = 12;
+			break;
+
+		case 8:
+			convs[0] = 2;
+			convs[1] = 14;
+			break;
+
+		case 9:
+			convs[0] = 3;
+			convs[1] = 15;
+			break;
+
+		case 10:
+			convs[0] = 4;
+			convs[1] = 16;
+			break;
+
+		case 11:
+			convs[0] = 5;
+			convs[1] = 17;
+			break;
+
+		case 12:
+			convs[0] = 0;
+			convs[1] = 6;
+			break;
+
+		case 14:
+			convs[0] = 2;
+			convs[1] = 8;
+			break;
+
+		case 15:
+			convs[0] = 3;
+			convs[1] = 9;
+			break;
+
+		case 16:
+			convs[0] = 4;
+			convs[1] = 10;
+			break;
+
+		case 17:
+			convs[0] = 5;
+			convs[1] = 11;
+			break;
+
+		default:
+			break;
+		}
+	} else if (_curChapter == 2) {
+		switch (_mainCharacter.dlgIndex) {
+		case 0:
+			convs[0] = 4;
+			convs[1] = 8;
+			convs[2] = 5;
+			convs[3] = 9;
+			break;
+
+		case 1:
+			convs[0] = 4;
+			convs[1] = 8;
+			convs[2] = 0;
+			convs[3] = 5;
+			break;
+
+		case 2:
+			convs[0] = 6;
+			convs[2] = 11;
+			break;
+
+		case 3:
+			convs[0] = 7;
+			convs[2] = 12;
+			break;
+
+		case 4:
+			convs[0] = 0;
+			convs[1] = 8;
+			convs[2] = 1;
+			convs[3] = 9;
+			break;
+
+		case 5:
+			convs[0] = 0;
+			convs[1] = 8;
+			convs[2] = 4;
+			convs[3] = 1;
+			break;
+
+		case 6:
+			convs[0] = 2;
+			convs[1] = 10;
+			break;
+
+		case 7:
+			convs[0] = 3;
+			convs[1] = 11;
+			break;
+
+		case 8:
+			convs[0] = 0;
+			convs[1] = 4;
+			convs[2] = 1;
+			break;
+
+		case 9:
+			convs[0] = 0;
+			convs[1] = 4;
+			convs[2] = 0;
+			convs[4] = 1;
+			break;
+
+		case 10:
+			convs[0] = 2;
+			convs[1] = 6;
+			break;
+
+		case 11:
+			convs[0] = 3;
+			convs[1] = 7;
+			break;
+
+		default:
+			break;
+		}
+	} else if (_curChapter == 4) {
+		if (_malcolmsSpirit == 0) {
+			convs[0] = _mainCharacter.dlgIndex - 10;
+			convs[1] = _mainCharacter.dlgIndex - 5;
+		} else if (_malcolmsSpirit == 1) {
+			convs[0] = _mainCharacter.dlgIndex + 5;
+			convs[1] = _mainCharacter.dlgIndex + 10;
+		} else if (_malcolmsSpirit == 2) {
+			convs[0] = _mainCharacter.dlgIndex - 5;
+			convs[1] = _mainCharacter.dlgIndex + 5;
+		}
+	}
+
+	for (int i = 0; i < 4; ++i) {
+		if (convs[i] != -1)
+			_conversationState[dlgIndex][convs[i]] = 0;
+	}
+
+	return 1;
+}
+
 int KyraEngine_v3::o3_setSceneDim(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setSceneDim(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
 	_sceneMinX = stackPos(0);
@@ -544,6 +758,12 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_runDialog(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_runDialog(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+	runDialog(stackPos(0), stackPos(1));
+	return 0;
+}
+
 int KyraEngine_v3::o3_malcolmRandomChat(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_malcolmRandomChat(%p) ()", (const void *)script);
 	malcolmRandomChat();
@@ -751,7 +971,7 @@
 	Opcode(o3_getCharacterFacing);
 	Opcode(o3_getCharacterScene);
 	// 0x08
-	OpcodeUnImpl();
+	Opcode(o3_getMalcolmsSpirit);
 	Opcode(o3_dummy);
 	Opcode(o3_dummy);
 	OpcodeUnImpl();
@@ -806,8 +1026,8 @@
 	Opcode(o3_wipeDownMouseItem);
 	Opcode(o3_dummy);
 	// 0x34
+	Opcode(o3_setMalcolmsSpirit);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 	Opcode(o3_dummy);
 	Opcode(o3_delay);
 	// 0x38
@@ -822,8 +1042,8 @@
 	Opcode(o3_drawSceneShape);
 	// 0x40
 	Opcode(o3_checkInRect);
+	Opcode(o3_updateConversations);
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 	Opcode(o3_dummy);
 	// 0x44
 	Opcode(o3_dummy);
@@ -887,7 +1107,7 @@
 	Opcode(o3_dummy);
 	// 0x74
 	Opcode(o3_runActorScript);
-	OpcodeUnImpl();
+	Opcode(o3_runDialog);
 	Opcode(o3_malcolmRandomChat);
 	Opcode(o3_setDlgIndex);
 	// 0x78

Modified: scummvm/trunk/engines/kyra/text_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/text_v3.cpp	2008-04-23 14:58:30 UTC (rev 31663)
+++ scummvm/trunk/engines/kyra/text_v3.cpp	2008-04-23 16:06:33 UTC (rev 31664)
@@ -516,7 +516,7 @@
 
 	while (running) {
 		uint16 cmd = _cnvFile->readUint16LE();
-		int object = cmd - 14;
+		int object = cmd - 12;
 		
 		if (cmd == 10) {
 			break;
@@ -668,5 +668,52 @@
 	processDialog(vocHighIndex, vocHighBase, 0);
 }
 
+void KyraEngine_v3::runDialog(int dlgIndex, int funcNum) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::runDialog(%d, %d)", dlgIndex, funcNum);
+	
+	switch (_curChapter-2) {
+	case 0:
+		dlgIndex -= 34;
+		break;
+	
+	case 1:
+		dlgIndex -= 54;
+		break;
+
+	case 2:
+		dlgIndex -= 55;
+		break;
+
+	case 3:
+		dlgIndex -= 70;
+		break;
+
+	default:
+		break;
+	}
+
+	updateDlgBuffer();
+
+	int vocHighBase = 0, vocHighIndex = 0, index1 = 0, index2 = 0;
+	loadDlgHeader(vocHighBase, vocHighIndex, index1, index2);
+
+	int convState = _conversationState[dlgIndex][vocHighBase];
+	uint32 offset = ((vocHighIndex == 1) ? dlgIndex - 1 : dlgIndex) * 6;
+	if (convState == -1) {
+		_cnvFile->seek(offset, SEEK_CUR);
+		_conversationState[dlgIndex][vocHighBase] = 0;
+	} else if (convState == 0 || convState == 2) {
+		_cnvFile->seek(offset+2, SEEK_CUR);
+		_conversationState[dlgIndex][vocHighBase] = 1;
+	} else {
+		_cnvFile->seek(offset+4, SEEK_CUR);
+		_conversationState[dlgIndex][vocHighBase] = 2;
+	}
+
+	_cnvFile->seek(_cnvFile->readUint16LE(), SEEK_SET);
+
+	processDialog(vocHighIndex, vocHighBase, funcNum);
+}
+
 } // end of namespace Kyra
 


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