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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sun Apr 20 15:44:44 CEST 2008


Revision: 31596
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31596&view=rev
Author:   lordhoto
Date:     2008-04-20 06:44:44 -0700 (Sun, 20 Apr 2008)

Log Message:
-----------
Implemented opcodes:
 - 6: o3_getCharacterFacing
 - 7: o3_getCharacterScene
 - 13: o3_trySceneChange
 - 32: o3_checkForItem
 - 46: o3_addSpecialExit
 - 63: o3_drawSceneShape
 - 75: o3_update
 - 80: o3_enterNewScene
 - 86: o3_setMalcolmPos
 - 154: o3_setupSceneAnimObject

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/items_v3.cpp
    scummvm/trunk/engines/kyra/kyra_v3.cpp
    scummvm/trunk/engines/kyra/kyra_v3.h
    scummvm/trunk/engines/kyra/scene_v3.cpp
    scummvm/trunk/engines/kyra/script_v3.cpp

Modified: scummvm/trunk/engines/kyra/items_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/items_v3.cpp	2008-04-20 12:34:16 UTC (rev 31595)
+++ scummvm/trunk/engines/kyra/items_v3.cpp	2008-04-20 13:44:44 UTC (rev 31596)
@@ -51,6 +51,15 @@
 	return -1;
 }
 
+int KyraEngine_v3::findItem(uint16 sceneId, uint16 id) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::findItem(%u, %u)", sceneId, id);
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == id && _itemList[i].sceneId == sceneId)
+			return i;
+	}
+	return -1;
+}
+
 int KyraEngine_v3::checkItemCollision(int x, int y) {
 	debugC(9, kDebugLevelMain, "KyraEngine_v3::checkItemCollision(%d, %d)", x, y);
 	int itemIndex = -1;

Modified: scummvm/trunk/engines/kyra/kyra_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-20 12:34:16 UTC (rev 31595)
+++ scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-20 13:44:44 UTC (rev 31596)
@@ -111,6 +111,7 @@
 	_deathHandler = -1;
 	_moveFacingTable = 0;
 	_unkHandleSceneChangeFlag = false;
+	memset(_sceneShapeDescs, 0, sizeof(_sceneShapeDescs));
 }
 
 KyraEngine_v3::~KyraEngine_v3() {
@@ -441,7 +442,8 @@
 
 void KyraEngine_v3::snd_stopVoice() {
 	debugC(9, kDebugLevelMain, "KyraEngine_v3::snd_stopVoice()");
-	_soundDigital->stopSound(_voiceSoundChannel);
+	if (_voiceSoundChannel != -1)
+		_soundDigital->stopSound(_voiceSoundChannel);
 }
 
 void KyraEngine_v3::playStudioSFX(const char *str) {

Modified: scummvm/trunk/engines/kyra/kyra_v3.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-20 12:34:16 UTC (rev 31595)
+++ scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-20 13:44:44 UTC (rev 31596)
@@ -274,6 +274,7 @@
 	void resetItemList();
 
 	int findFreeItem();
+	int findItem(uint16 item, uint16 scene);
 	
 	void initItems();
 
@@ -391,6 +392,14 @@
 
 	int8 _sceneDatPalette[45];
 	int8 _sceneDatLayerTable[15];
+	struct SceneShapeDesc {
+		// the original saves those variables, we don't, since
+		// they are just needed on scene load
+		/*int x, y;
+		int w, h;*/
+		int drawX, drawY;
+	};
+	SceneShapeDesc _sceneShapeDescs[20];
 
 	int getDrawLayer(int x, int y);
 
@@ -525,22 +534,31 @@
 	int o3_refreshCharacter(ScriptState *script);
 	int o3_getCharacterX(ScriptState *script);
 	int o3_getCharacterY(ScriptState *script);
+	int o3_getCharacterFacing(ScriptState *script);
+	int o3_getCharacterScene(ScriptState *script);
+	int o3_trySceneChange(ScriptState *script);
 	int o3_showSceneFileMessage(ScriptState *script);
 	int o3_showBadConscience(ScriptState *script);
 	int o3_hideBadConscience(ScriptState *script);
 	int o3_objectChat(ScriptState *script);
+	int o3_checkForItem(ScriptState *script);
 	int o3_defineItem(ScriptState *script);
 	int o3_queryGameFlag(ScriptState *script);
 	int o3_resetGameFlag(ScriptState *script);
 	int o3_setGameFlag(ScriptState *script);
 	int o3_getHandItem(ScriptState *script);
 	int o3_hideMouse(ScriptState *script);
+	int o3_addSpecialExit(ScriptState *script);
 	int o3_setMousePos(ScriptState *script);
 	int o3_showMouse(ScriptState *script);
 	int o3_badConscienceChat(ScriptState *script);
 	int o3_delay(ScriptState *script);
 	int o3_setSceneFilename(ScriptState *script);
+	int o3_drawSceneShape(ScriptState *script);
 	int o3_checkInRect(ScriptState *script);
+	int o3_update(ScriptState *script);
+	int o3_enterNewScene(ScriptState *script);
+	int o3_setMalcolmPos(ScriptState *script);
 	int o3_stopMusic(ScriptState *script);
 	int o3_playMusicTrack(ScriptState *script);
 	int o3_playSoundEffect(ScriptState *script);
@@ -555,6 +573,7 @@
 	int o3_querySpecialSceneScriptState(ScriptState *script);
 	int o3_setHiddenItemsEntry(ScriptState *script);
 	int o3_getHiddenItemsEntry(ScriptState *script);
+	int o3_setupSceneAnimObject(ScriptState *script);
 	int o3_removeSceneAnimObject(ScriptState *script);
 	int o3_setVocHigh(ScriptState *script);
 	int o3_getVocHigh(ScriptState *script);

Modified: scummvm/trunk/engines/kyra/scene_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/scene_v3.cpp	2008-04-20 12:34:16 UTC (rev 31595)
+++ scummvm/trunk/engines/kyra/scene_v3.cpp	2008-04-20 13:44:44 UTC (rev 31596)
@@ -410,7 +410,8 @@
 			int16 y = stream->readSint16LE();
 			int16 w = stream->readSint16LE();
 			int16 h = stream->readSint16LE();
-			stream->seek(4, SEEK_CUR);
+			_sceneShapeDescs[i].drawX = stream->readSint16LE();
+			_sceneShapeDescs[i].drawY = stream->readSint16LE();
 			_sceneShapes[i] = _screen->encodeShape(x, y, w, h, 0);
 			assert(_sceneShapes[i]);
 			musicUpdate(0);

Modified: scummvm/trunk/engines/kyra/script_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-20 12:34:16 UTC (rev 31595)
+++ scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-20 13:44:44 UTC (rev 31596)
@@ -98,6 +98,35 @@
 	return _mainCharacter.y1;
 }
 
+int KyraEngine_v3::o3_getCharacterFacing(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getCharacterFacing(%p) ()", (const void *)script);
+	return _mainCharacter.facing;
+}
+
+int KyraEngine_v3::o3_getCharacterScene(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getCharacterScene(%p) ()", (const void *)script);
+	return _mainCharacter.sceneId;
+}
+
+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));
+
+	_unkHandleSceneChangeFlag = 1;
+	int success = inputSceneChange(stackPos(0), stackPos(1), stackPos(2), stackPos(3));
+	_unkHandleSceneChangeFlag = 0;
+
+	if (success) {
+		_scriptInterpreter->initScript(script, script->dataPtr);
+		_unk4 = 0;
+		_unk3 = -1;
+		_unk5 = 1;
+		return 0;
+	} else {
+		return (_unk4 != 0) ? 1 : 0;
+	}
+}
+
 int KyraEngine_v3::o3_showSceneFileMessage(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_showSceneFileMessage(%p) (%d)", (const void *)script, stackPos(0));
 	showMessage((const char*)getTableEntry(_scenesFile, stackPos(0)), 0xFF, 0xF0);
@@ -127,6 +156,11 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_checkForItem(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_checkForItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+	return findItem(stackPos(0), stackPos(1)) == -1 ? 0 : 1;
+}
+
 int KyraEngine_v3::o3_defineItem(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_defineItem(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
 	int freeItem = findFreeItem();
@@ -167,6 +201,20 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_addSpecialExit(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_addSpecialExit(%p) (%d, %d, %d, %d, %d)", (const void *)script,
+		stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+	if (_specialExitCount < 5) {
+		_specialExitTable[_specialExitCount+0] = stackPos(0);
+		_specialExitTable[_specialExitCount+5] = stackPos(1);
+		_specialExitTable[_specialExitCount+10] = stackPos(2) + stackPos(0) - 1;
+		_specialExitTable[_specialExitCount+15] = stackPos(3) + stackPos(1) - 1;
+		_specialExitTable[_specialExitCount+20] = stackPos(4);
+		++_specialExitCount;
+	}
+	return 0;
+}
+
 int KyraEngine_v3::o3_setMousePos(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setMousePos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
 	setMousePos(stackPos(0), stackPos(1));
@@ -206,6 +254,16 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_drawSceneShape(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_drawSceneShape(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
+	const int shape = stackPos(0);
+	
+	int x = _sceneShapeDescs[shape].drawX;
+	int y = _sceneShapeDescs[shape].drawY;
+	_screen->drawShape(stackPos(2), _sceneShapes[shape], x, y, 2, (stackPos(1) != 0) ? 1 : 0);
+	return 0;
+}
+
 int KyraEngine_v3::o3_checkInRect(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_checkInRect(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script,
 			stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
@@ -231,6 +289,48 @@
 	}
 }
 
+int KyraEngine_v3::o3_update(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_update(%p) (%d)", (const void *)script, stackPos(0));
+	for (int times = stackPos(0); times != 0; --times) {
+		if (_chatText)
+			updateWithText();
+		else
+			update();
+	}
+	return 0;
+}
+
+int KyraEngine_v3::o3_enterNewScene(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_enterNewScene(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0),
+		stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+
+	_screen->hideMouse();
+	enterNewScene(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
+
+	_unk5 = 1;
+
+	if (_mainCharX == -1 || _mainCharY == -1) {
+		_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
+		updateCharacterAnim(0);
+	}
+	_screen->showMouse();
+
+	return 0;
+}
+
+int KyraEngine_v3::o3_setMalcolmPos(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setMalcolmPos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+	_mainCharX = stackPos(0);
+	_mainCharY = stackPos(1);
+
+	if (_mainCharX == -1 && _mainCharY == -1)
+		_mainCharacter.animFrame = 87;
+	else
+		_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
+
+	return 0;
+}
+
 int KyraEngine_v3::o3_stopMusic(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_stopMusic(%p) ()", (const void *)script);
 	stopMusicTrack();
@@ -408,6 +508,16 @@
 	return (int16)_hiddenItems[stackPos(0)];
 }
 
+int KyraEngine_v3::o3_setupSceneAnimObject(ScriptState *script) {
+	debugC(9, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setupSceneAnimObject(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')", (const void *)script,
+			stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8), stackPos(9),
+			stackPos(10), stackPos(11), stackPosString(12));
+	musicUpdate(0);
+	setupSceneAnimObject(stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8),
+						stackPos(9), stackPos(10), stackPos(11), stackPosString(12));
+	return 0;
+}
+
 int KyraEngine_v3::o3_removeSceneAnimObject(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_removeSceneAnimObject(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
 	removeSceneAnimObject(stackPos(0), stackPos(1));
@@ -483,8 +593,8 @@
 		// 0x04
 		Opcode(o3_getCharacterX),
 		Opcode(o3_getCharacterY),
-		OpcodeUnImpl(),
-		OpcodeUnImpl(),
+		Opcode(o3_getCharacterFacing),
+		Opcode(o3_getCharacterScene),
 		// 0x08
 		OpcodeUnImpl(),
 		Opcode(o3_dummy),
@@ -492,9 +602,9 @@
 		OpcodeUnImpl(),
 		// 0x0c
 		OpcodeUnImpl(),
+		Opcode(o3_trySceneChange),
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
-		OpcodeUnImpl(),
 		// 0x10
 		OpcodeUnImpl(),
 		Opcode(o3_showSceneFileMessage),
@@ -516,7 +626,7 @@
 		OpcodeUnImpl(),
 		Opcode(o3_objectChat),
 		// 0x20
-		OpcodeUnImpl(),
+		Opcode(o3_checkForItem),
 		Opcode(o3_dummy),
 		OpcodeUnImpl(),
 		Opcode(o3_defineItem),
@@ -533,7 +643,7 @@
 		// 0x2c
 		Opcode(o3_getHandItem),
 		Opcode(o3_hideMouse),
-		OpcodeUnImpl(),
+		Opcode(o3_addSpecialExit),
 		Opcode(o3_setMousePos),
 		// 0x30
 		Opcode(o3_showMouse),
@@ -554,7 +664,7 @@
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
-		OpcodeUnImpl(),
+		Opcode(o3_drawSceneShape),
 		// 0x40
 		Opcode(o3_checkInRect),
 		OpcodeUnImpl(),
@@ -569,21 +679,21 @@
 		Opcode(o3_dummy),
 		Opcode(o3_dummy),
 		OpcodeUnImpl(),
-		OpcodeUnImpl(),
+		Opcode(o3_update),
 		// 0x4c
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
 		// 0x50
+		Opcode(o3_enterNewScene),
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
-		OpcodeUnImpl(),
 		Opcode(o3_dummy),
 		// 0x54
 		Opcode(o3_dummy),
 		Opcode(o3_dummy),
-		OpcodeUnImpl(),
+		Opcode(o3_setMalcolmPos),
 		Opcode(o3_stopMusic),
 		// 0x58
 		Opcode(o3_playMusicTrack),
@@ -668,7 +778,7 @@
 		// 0x98
 		OpcodeUnImpl(),
 		OpcodeUnImpl(),
-		OpcodeUnImpl(),
+		Opcode(o3_setupSceneAnimObject),
 		Opcode(o3_removeSceneAnimObject),
 		// 0x9c
 		OpcodeUnImpl(),


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