aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorJohannes Schickel2008-04-25 15:41:06 +0000
committerJohannes Schickel2008-04-25 15:41:06 +0000
commit425c87481618bbff5a2b5c7ba867ab523b5ed430 (patch)
treeaf12adb3604d5052b6e4e7c664f0698c734ec9f5 /engines/kyra
parentfd5064b0694b8a671c132be52bcdbf72f9b057c4 (diff)
downloadscummvm-rg350-425c87481618bbff5a2b5c7ba867ab523b5ed430.tar.gz
scummvm-rg350-425c87481618bbff5a2b5c7ba867ab523b5ed430.tar.bz2
scummvm-rg350-425c87481618bbff5a2b5c7ba867ab523b5ed430.zip
- Implemented opcodes:
-> 30: o3_addItemToCurScene -> 62: o3_drawSceneShape - Fixed bug in KyraEngine_v3::exchangeMouseItem, fixes user input after combining items svn-id: r31721
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/items_v3.cpp2
-rw-r--r--engines/kyra/kyra_v3.h2
-rw-r--r--engines/kyra/script_v3.cpp57
3 files changed, 58 insertions, 3 deletions
diff --git a/engines/kyra/items_v3.cpp b/engines/kyra/items_v3.cpp
index 23162514c2..655511e006 100644
--- a/engines/kyra/items_v3.cpp
+++ b/engines/kyra/items_v3.cpp
@@ -391,7 +391,6 @@ void KyraEngine_v3::itemDropDown(int startX, int startY, int dstX, int dstY, int
void KyraEngine_v3::exchangeMouseItem(int itemPos, int runScript) {
debugC(9, kDebugLevelMain, "KyraEngine_v3::exchangeMouseItem(%d, %d)", itemPos, runScript);
- _screen->hideMouse();
if (itemListMagic(_itemInHand, itemPos))
return;
@@ -401,6 +400,7 @@ void KyraEngine_v3::exchangeMouseItem(int itemPos, int runScript) {
return;
}
+ _screen->hideMouse();
deleteItemAnimEntry(itemPos);
int itemId = _itemList[itemPos].id;
diff --git a/engines/kyra/kyra_v3.h b/engines/kyra/kyra_v3.h
index 5f411d7cea..5d82bad67d 100644
--- a/engines/kyra/kyra_v3.h
+++ b/engines/kyra/kyra_v3.h
@@ -680,6 +680,7 @@ private:
int o3_showSceneFileMessage(ScriptState *script);
int o3_showBadConscience(ScriptState *script);
int o3_hideBadConscience(ScriptState *script);
+ int o3_addItemToCurScene(ScriptState *script);
int o3_objectChat(ScriptState *script);
int o3_checkForItem(ScriptState *script);
int o3_defineItem(ScriptState *script);
@@ -701,6 +702,7 @@ private:
int o3_updateScore(ScriptState *script);
int o3_setSceneFilename(ScriptState *script);
int o3_removeItemsFromScene(ScriptState *script);
+ int o3_drawSceneShape(ScriptState *script);
int o3_drawSceneShapeOnPage(ScriptState *script);
int o3_checkInRect(ScriptState *script);
int o3_updateConversations(ScriptState *script);
diff --git a/engines/kyra/script_v3.cpp b/engines/kyra/script_v3.cpp
index d82e848f3e..3a1914c7d1 100644
--- a/engines/kyra/script_v3.cpp
+++ b/engines/kyra/script_v3.cpp
@@ -162,6 +162,35 @@ int KyraEngine_v3::o3_hideBadConscience(ScriptState *script) {
return 0;
}
+int KyraEngine_v3::o3_addItemToCurScene(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_addItemToCurScene(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
+ const uint16 item = stackPos(0);
+ int x = stackPos(1);
+ int y = stackPos(2);
+ int itemSlot = findFreeItem();
+
+ if (x < 20)
+ x = 20;
+ else if (x > 299)
+ x = 299;
+
+ if (y < 18)
+ y = 18;
+ else if (y > 187)
+ y = 187;
+
+ if (itemSlot >= 0) {
+ _itemList[itemSlot].x = x;
+ _itemList[itemSlot].y = y;
+ _itemList[itemSlot].id = item;
+ _itemList[itemSlot].sceneId = _mainCharacter.sceneId;
+ addItemToAnimList(itemSlot);
+ refreshAnimObjectsIfNeed();
+ }
+
+ return itemSlot;
+}
+
int KyraEngine_v3::o3_objectChat(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_objectChat(%p) (%d)", (const void *)script, stackPos(0));
int id = stackPos(0);
@@ -349,6 +378,30 @@ int KyraEngine_v3::o3_removeItemsFromScene(ScriptState *script) {
return retValue;
}
+int KyraEngine_v3::o3_drawSceneShape(ScriptState *script) {
+ debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o3_drawSceneShape(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+
+ int shape = stackPos(0);
+ int flag = (stackPos(1) != 0) ? 1 : 0;
+
+ _screen->hideMouse();
+ restorePage3();
+
+ const int x = _sceneShapeDescs[shape].drawX;
+ const int y = _sceneShapeDescs[shape].drawY;
+
+ _screen->drawShape(2, _sceneShapes[shape], x, y, 2, flag);
+
+ _screen->copyRegionToBuffer(3, 0, 0, 320, 200, _gamePlayBuffer);
+
+ _screen->drawShape(0, _sceneShapes[shape], x, y, 2, flag);
+
+ flagAnimObjsForRefresh();
+ refreshAnimObjectsIfNeed();
+ _screen->showMouse();
+ return 0;
+}
+
int KyraEngine_v3::o3_drawSceneShapeOnPage(ScriptState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_drawSceneShapeOnPage(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
const int shape = stackPos(0);
@@ -1096,7 +1149,7 @@ void KyraEngine_v3::setupOpcodeTable() {
// 0x1c
OpcodeUnImpl();
OpcodeUnImpl();
- OpcodeUnImpl();
+ Opcode(o3_addItemToCurScene);
Opcode(o3_objectChat);
// 0x20
Opcode(o3_checkForItem);
@@ -1136,7 +1189,7 @@ void KyraEngine_v3::setupOpcodeTable() {
// 0x3c
Opcode(o3_removeItemsFromScene);
OpcodeUnImpl();
- OpcodeUnImpl();
+ Opcode(o3_drawSceneShape);
Opcode(o3_drawSceneShapeOnPage);
// 0x40
Opcode(o3_checkInRect);