diff options
-rw-r--r-- | engines/kyra/items_v3.cpp | 9 | ||||
-rw-r--r-- | engines/kyra/kyra_v3.h | 5 | ||||
-rw-r--r-- | engines/kyra/script_v3.cpp | 31 |
3 files changed, 42 insertions, 3 deletions
diff --git a/engines/kyra/items_v3.cpp b/engines/kyra/items_v3.cpp index 4417ba4aa5..aecf4337ce 100644 --- a/engines/kyra/items_v3.cpp +++ b/engines/kyra/items_v3.cpp @@ -64,6 +64,15 @@ int KyraEngine_v3::findFreeItem() { return -1; } +int KyraEngine_v3::findFreeInventorySlot() { + debugC(9, kDebugLevelMain, "KyraEngine_v3::findFreeInventorySlot()"); + for (int i = 0; i < 10; ++i) { + if (_mainCharacter.inventory[i] == 0xFFFF) + return i; + } + 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) { diff --git a/engines/kyra/kyra_v3.h b/engines/kyra/kyra_v3.h index bb99f1f39d..ac7625e8ee 100644 --- a/engines/kyra/kyra_v3.h +++ b/engines/kyra/kyra_v3.h @@ -539,6 +539,8 @@ private: void makeCharFacingMouse(); + int findFreeInventorySlot(); + // talk object struct TalkObject { char filename[13]; @@ -704,6 +706,9 @@ private: int o3_setCharacterAnimFrameFromFacing(ScriptState *script); int o3_showBadConscience(ScriptState *script); int o3_hideBadConscience(ScriptState *script); + int o3_setInventorySlot(ScriptState *script); + int o3_getInventorySlot(ScriptState *script); + int o3_addItemToInventory(ScriptState *script); int o3_addItemToCurScene(ScriptState *script); int o3_objectChat(ScriptState *script); int o3_checkForItem(ScriptState *script); diff --git a/engines/kyra/script_v3.cpp b/engines/kyra/script_v3.cpp index c4bba4c81d..fd9f95faf0 100644 --- a/engines/kyra/script_v3.cpp +++ b/engines/kyra/script_v3.cpp @@ -185,6 +185,31 @@ int KyraEngine_v3::o3_hideBadConscience(ScriptState *script) { return 0; } +int KyraEngine_v3::o3_setInventorySlot(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setInventorySlot(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); + const int slot = MAX<int16>(0, MIN<int16>(10, stackPos(0))); + return (_mainCharacter.inventory[slot] = stackPos(1)); +} + +int KyraEngine_v3::o3_getInventorySlot(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getInventorySlot(%p) (%d)", (const void *)script, stackPos(0)); + return _mainCharacter.inventory[stackPos(0)]; +} + +int KyraEngine_v3::o3_addItemToInventory(ScriptState *script) { + debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_addItemToInventory(%p) (%d)", (const void *)script, stackPos(0)); + int slot = findFreeInventorySlot(); + if (slot >= 0) { + _mainCharacter.inventory[slot] = stackPos(0); + if (_inventoryState) { + _screen->hideMouse(); + redrawInventory(0); + _screen->showMouse(); + } + } + return slot; +} + 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); @@ -1252,10 +1277,10 @@ void KyraEngine_v3::setupOpcodeTable() { // 0x18 OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(o3_setInventorySlot); + Opcode(o3_getInventorySlot); // 0x1c - OpcodeUnImpl(); + Opcode(o3_addItemToInventory); OpcodeUnImpl(); Opcode(o3_addItemToCurScene); Opcode(o3_objectChat); |