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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Tue Apr 22 20:08:56 CEST 2008


Revision: 31657
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31657&view=rev
Author:   lordhoto
Date:     2008-04-22 11:08:56 -0700 (Tue, 22 Apr 2008)

Log Message:
-----------
Implemented opcodes:
 - 32: o3_setHandItem
 - 33: o3_removeHandItem
 - 50: o3_wipeDownMouseItem
 - 116: o3_runActorScript
 - 136: o3_countItemInstances

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/animator_v3.cpp
    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/script_v3.cpp

Modified: scummvm/trunk/engines/kyra/animator_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/animator_v3.cpp	2008-04-22 10:18:32 UTC (rev 31656)
+++ scummvm/trunk/engines/kyra/animator_v3.cpp	2008-04-22 18:08:56 UTC (rev 31657)
@@ -193,7 +193,7 @@
 		if (obj->shapeIndex == 0xFFFF)
 			return;
 		int scale = getScale(obj->xPos1, obj->yPos1);
-		_screen->drawShape(2, getShapePtr(obj->shapeIndex), x, y, 2, obj->flags | 104, _paletteOverlay, obj->palette, layer, scale, scale);
+		_screen->drawShape(2, getShapePtr(obj->shapeIndex), x, y, 2, obj->flags | 0x104, _paletteOverlay, obj->palette, layer, scale, scale);
 	} else {
 		if (obj->shapePtr) {
 			_screen->drawShape(2, obj->shapePtr, x, y, 2, obj->flags, 7);

Modified: scummvm/trunk/engines/kyra/items_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/items_v3.cpp	2008-04-22 10:18:32 UTC (rev 31656)
+++ scummvm/trunk/engines/kyra/items_v3.cpp	2008-04-22 18:08:56 UTC (rev 31657)
@@ -90,13 +90,53 @@
 	return itemIndex;
 }
 
+void KyraEngine_v3::setMouseCursor(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::setMouseCursor(%u)", item);
+	int shape = 0;
+	int hotX = 1;
+	int hotY = 1;
+
+	if (item != 0xFFFF) {
+		hotX = 12;
+		hotY = 19;
+		shape = item+248;
+	}
+
+	if ((int16)item != _itemInHand)
+		_screen->setMouseCursor(hotX, hotY, getShapePtr(shape));
+}
+
 void KyraEngine_v3::setItemMouseCursor() {
 	debugC(9, kDebugLevelMain, "KyraEngine_v3::setItemMouseCursor()");
 	_handItemSet = _itemInHand;
 	if (_itemInHand == -1)
 		_screen->setMouseCursor(0, 0, _gameShapes[0]);
 	else
-		_screen->setMouseCursor(0xC, 0x13, _gameShapes[_itemInHand+248]);
+		_screen->setMouseCursor(12, 19, _gameShapes[_itemInHand+248]);
 }
 
+void KyraEngine_v3::setHandItem(uint16 item) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::setHandItem(%u)", item);
+	_screen->hideMouse();
+
+	if (item == 0xFFFF) {
+		removeHandItem();
+	} else {
+		setMouseCursor(item);
+		_itemInHand = item;
+	}
+
+	_screen->showMouse();
+}
+
+void KyraEngine_v3::removeHandItem() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::removeHandItem()");
+	_screen->hideMouse();
+	_screen->setMouseCursor(0, 0, _gameShapes[0]);
+	_itemInHand = -1;
+	_handItemSet = -1;
+	_screen->showMouse();
+}
+
 } // end of namespace Kyra
+

Modified: scummvm/trunk/engines/kyra/kyra_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-22 10:18:32 UTC (rev 31656)
+++ scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-22 18:08:56 UTC (rev 31657)
@@ -1430,6 +1430,18 @@
 
 #pragma mark -
 
+void KyraEngine_v3::backUpGfxRect32x32(int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::backUpGfxRect32x32(%d, %d)", x, y);
+	_screen->copyRegionToBuffer(_screen->_curPage, x, y, 32, 32, _gfxBackUpRect);
+}
+
+void KyraEngine_v3::restoreGfxRect32x32(int x, int y) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::restoreGfxRect32x32(%d, %d)", x, y);
+	_screen->copyBlockToPage(_screen->_curPage, x, y, 32, 32, _gfxBackUpRect);
+}
+
+#pragma mark -
+
 char *KyraEngine_v3::appendLanguage(char *buf, int lang, int bufSize) {
 	debugC(9, kDebugLevelMain, "KyraEngine_v3::appendLanguage([%p|'%s'], %d, %d)", (const void*)buf, buf, lang, bufSize);
 	assert(lang < _languageExtensionSize);

Modified: scummvm/trunk/engines/kyra/kyra_v3.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-22 10:18:32 UTC (rev 31656)
+++ scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-22 18:08:56 UTC (rev 31657)
@@ -280,7 +280,11 @@
 
 	int checkItemCollision(int x, int y);
 
+	void setMouseCursor(uint16 item);
+
 	// -> hand item
+	void setHandItem(uint16 item);
+	void removeHandItem();
 	void setItemMouseCursor();
 
 	int _itemInHand;
@@ -516,7 +520,6 @@
 	// unk
 	uint8 *_costPalBuffer;
 	uint8 *_screenBuffer;
-	uint8 *_gfxBackUpRect;
 	uint8 *_paletteOverlay;
 	bool _useActorBuffer;
 	int _curChapter;
@@ -527,6 +530,10 @@
 	void loadShadowShape();
 	void loadExtrasShapes();
 
+	uint8 *_gfxBackUpRect;
+	void backUpGfxRect32x32(int x, int y);
+	void restoreGfxRect32x32(int x, int y);
+
 	// opcodes
 	int o3_getMalcolmShapes(ScriptState *script);
 	int o3_setCharacterPos(ScriptState *script);
@@ -546,12 +553,15 @@
 	int o3_queryGameFlag(ScriptState *script);
 	int o3_resetGameFlag(ScriptState *script);
 	int o3_setGameFlag(ScriptState *script);
+	int o3_setHandItem(ScriptState *script);
+	int o3_removeHandItem(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_wipeDownMouseItem(ScriptState *script);
 	int o3_delay(ScriptState *script);
 	int o3_setSceneFilename(ScriptState *script);
 	int o3_drawSceneShape(ScriptState *script);
@@ -567,7 +577,9 @@
 	int o3_setSpecialSceneScriptRunTime(ScriptState *script);
 	int o3_defineSceneAnim(ScriptState *script);
 	int o3_updateSceneAnim(ScriptState *script);
+	int o3_runActorScript(ScriptState *script);
 	int o3_defineScene(ScriptState *script);
+	int o3_countItemInstances(ScriptState *script);
 	int o3_setSpecialSceneScriptState(ScriptState *script);
 	int o3_clearSpecialSceneScriptState(ScriptState *script);
 	int o3_querySpecialSceneScriptState(ScriptState *script);

Modified: scummvm/trunk/engines/kyra/script_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-22 10:18:32 UTC (rev 31656)
+++ scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-22 18:08:56 UTC (rev 31657)
@@ -190,6 +190,18 @@
 	return 1;
 }
 
+int KyraEngine_v3::o3_setHandItem(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setHandItem(%p) (%d)", (const void *)script, stackPos(0));
+	setHandItem(stackPos(0));
+	return 0;
+}
+
+int KyraEngine_v3::o3_removeHandItem(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_removeHandItem(%p) ()", (const void *)script);
+	removeHandItem();
+	return 0;
+}
+
 int KyraEngine_v3::o3_getHandItem(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getHandItem(%p) ()", (const void *)script);
 	return _itemInHand;
@@ -235,6 +247,33 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_wipeDownMouseItem(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o3_wipeDownMouseItem(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
+	_screen->hideMouse();
+	const int x = stackPos(1) - 12;
+	const int y = stackPos(2) - 19;
+
+	if (_itemInHand >= 0) {
+		backUpGfxRect32x32(x, y);
+		uint8 *shape = getShapePtr(_itemInHand+248);
+		for (int curY = y, height = 20; height > 0; height -= 2, curY += 2) {
+			restoreGfxRect32x32(x, y);
+			_screen->setNewShapeHeight(shape, height);
+			uint32 waitTime = _system->getMillis() + _tickLength;
+			_screen->drawShape(0, shape, x, curY, 0, 0);
+			_screen->updateScreen();
+			delayUntil(waitTime);
+		}
+		restoreGfxRect32x32(x, y);
+		_screen->resetShapeHeight(shape);
+	}
+
+	_screen->showMouse();
+	removeHandItem();
+
+	return 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;
@@ -455,6 +494,40 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_runActorScript(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_runActorScript(%p) ()", (const void *)script);
+	ScriptData data;
+	ScriptState state;
+	memset(&data, 0, sizeof(data));
+	memset(&state, 0, sizeof(state));
+
+	_res->exists("_ACTOR.EMC", true);
+	_scriptInterpreter->loadScript("_ACTOR.EMC", &data, &_opcodes);
+	_scriptInterpreter->initScript(&state, &data);
+	_scriptInterpreter->startScript(&state, 0);
+
+	state.regs[4] = _itemInHand;
+	state.regs[0] = _mainCharacter.sceneId;
+
+	int vocHigh = _vocHigh;
+	_vocHigh = 200;
+	_useActorBuffer = true;
+
+	while (_scriptInterpreter->validScript(&state))
+		_scriptInterpreter->runScript(&state);
+
+	_useActorBuffer = false;
+	_vocHigh = vocHigh;
+	_scriptInterpreter->unloadScript(&data);
+
+	if (queryGameFlag(0x218)) {
+		resetGameFlag(0x218);
+		enterNewScene(78, -1, 0, 0, 0);
+	}
+
+	return 0;
+}
+
 int KyraEngine_v3::o3_defineScene(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_defineScene(%p) (%d, '%s', %d, %d, %d, %d, %d, %d)",
 		(const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
@@ -481,6 +554,27 @@
 	return 0;
 }
 
+int KyraEngine_v3::o3_countItemInstances(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_countItemInstances(%p) (%d)", (const void *)script, stackPos(0));
+	int count = 0;
+	const int16 item = stackPos(0);
+
+	for (int i = 0; i < 10; ++i) {
+		if (_mainCharacter.inventory[i] == item)
+			++count;
+	}
+
+	if (_itemInHand == item)
+		++count;
+
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == item)
+			++count;
+	}
+
+	return count;
+}
+
 int KyraEngine_v3::o3_setSpecialSceneScriptState(ScriptState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setSpecialSceneScriptState(%p) (%d)", (const void *)script, stackPos(0));
 	_specialSceneScriptState[stackPos(0)] = 1;
@@ -641,8 +735,8 @@
 	// 0x28
 	Opcode(o3_resetGameFlag);
 	Opcode(o3_setGameFlag);
-	OpcodeUnImpl();
-	OpcodeUnImpl();
+	Opcode(o3_setHandItem);
+	Opcode(o3_removeHandItem);
 	// 0x2c
 	Opcode(o3_getHandItem);
 	Opcode(o3_hideMouse);
@@ -651,7 +745,7 @@
 	// 0x30
 	Opcode(o3_showMouse);
 	Opcode(o3_badConscienceChat);
-	OpcodeUnImpl();
+	Opcode(o3_wipeDownMouseItem);
 	Opcode(o3_dummy);
 	// 0x34
 	OpcodeUnImpl();
@@ -734,10 +828,10 @@
 	Opcode(o3_updateSceneAnim);
 	Opcode(o3_dummy);
 	// 0x74
+	Opcode(o3_runActorScript);
 	OpcodeUnImpl();
 	OpcodeUnImpl();
 	OpcodeUnImpl();
-	OpcodeUnImpl();
 	// 0x78
 	OpcodeUnImpl();
 	Opcode(o3_defineScene);
@@ -759,7 +853,7 @@
 	Opcode(o3_dummy);
 	Opcode(o3_dummy);
 	// 0x88
-	OpcodeUnImpl();
+	Opcode(o3_countItemInstances);
 	Opcode(o3_dummy);
 	OpcodeUnImpl();
 	Opcode(o3_dummy);


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