diff options
-rw-r--r-- | engines/kyra/animator_v3.cpp | 17 | ||||
-rw-r--r-- | engines/kyra/gui_v3.cpp | 23 | ||||
-rw-r--r-- | engines/kyra/items_v3.cpp | 113 | ||||
-rw-r--r-- | engines/kyra/kyra_v3.h | 8 | ||||
-rw-r--r-- | engines/kyra/scene_v3.cpp | 14 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 8 |
6 files changed, 178 insertions, 5 deletions
diff --git a/engines/kyra/animator_v3.cpp b/engines/kyra/animator_v3.cpp index 5acfb76196..078b914e86 100644 --- a/engines/kyra/animator_v3.cpp +++ b/engines/kyra/animator_v3.cpp @@ -636,5 +636,22 @@ void KyraEngine_v3::addItemToAnimList(int item) { animObj->needRefresh = 1; } +void KyraEngine_v3::deleteItemAnimEntry(int item) { + debugC(9, kDebugLevelAnimator, "KyraEngine_v3::deleteItemAnimEntry(%d)", item); + AnimObj *animObj = &_animObjects[17+item]; + + restorePage3(); + + animObj->shapePtr = 0; + animObj->shapeIndex = 0xFFFF; + animObj->shapeIndex2 = 0xFFFF; + animObj->needRefresh = 1; + + refreshAnimObjectsIfNeed(); + + animObj->enabled = 0; + _animList = deleteAnimListEntry(_animList, animObj); +} + } // end of namespace Kyra diff --git a/engines/kyra/gui_v3.cpp b/engines/kyra/gui_v3.cpp index 315be352e9..c797ca0812 100644 --- a/engines/kyra/gui_v3.cpp +++ b/engines/kyra/gui_v3.cpp @@ -50,6 +50,29 @@ void KyraEngine_v3::showMessage(const char *string, uint8 c0, uint8 c1) { _screen->showMouse(); } +void KyraEngine_v3::showMessageFromCCode(int string, uint8 c0, int) { + debugC(9, kDebugLevelMain, "KyraEngine_v3::showMessageFromCCode(%d, %d, -)", string, c0); + showMessage((const char*)getTableEntry(_cCodeFile, string), c0, 0xF0); +} + +void KyraEngine_v3::updateItemCommand(int item, int str, uint8 c0) { + debugC(9, kDebugLevelMain, "KyraEngine_v3::updateItemCommand(%d, %d, %d)", item, str, c0); + char buffer[100]; + char *src = (char*)getTableEntry(_itemFile, item); + + while (*src != ' ') + ++src; + ++src; + + *src = toupper(*src); + + strcpy(buffer, src); + strcat(buffer, " "); + strcat(buffer, (const char*)getTableEntry(_cCodeFile, str)); + + showMessage(buffer, c0, 0xF0); +} + void KyraEngine_v3::updateCommandLine() { debugC(9, kDebugLevelMain, "KyraEngine_v3::updateCommandLine()"); if (_restoreCommandLine) { diff --git a/engines/kyra/items_v3.cpp b/engines/kyra/items_v3.cpp index 8cb3980356..931367657b 100644 --- a/engines/kyra/items_v3.cpp +++ b/engines/kyra/items_v3.cpp @@ -24,6 +24,7 @@ */ #include "kyra/kyra_v3.h" +#include "kyra/timer.h" namespace Kyra { @@ -187,8 +188,8 @@ bool KyraEngine_v3::dropItem(int unk1, uint16 item, int x, int y, int unk2) { if (processItemDrop(_mainCharacter.sceneId, item, x, y, unk1, unk2)) return true; - //if (countAllItems() >= 50) - //showMessageFromCCode(14, 0xB3, 0); + if (countAllItems() >= 50) + showMessageFromCCode(14, 0xB3, 0); } if (!_chatText) @@ -294,10 +295,10 @@ bool KyraEngine_v3::processItemDrop(uint16 sceneId, uint16 item, int x, int y, i itemDropDown(x, y, itemX, itemY, freeItemSlot, item, (unk1 == 0) ? 1 : 0); if (!unk1 && unk2) { - //int itemStr = 1; + int itemStr = 1; //if (_lang == 1) // itemStr = getItemCommandStringDrop(item); - //updateCommandLineEx(item+54, itemStr, 0xD6); + updateItemCommand(item, itemStr, 0xFF); } return true; @@ -390,7 +391,35 @@ 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); - //XXX + _screen->hideMouse(); + + if (itemListMagic(_itemInHand, itemPos)) + return; + + if (_itemInHand == 43) { + removeHandItem(); + return; + } + + deleteItemAnimEntry(itemPos); + + int itemId = _itemList[itemPos].id; + _itemList[itemPos].id = _itemInHand; + _itemInHand = itemId; + + addItemToAnimList(itemPos); + playSoundEffect(0x0B, 0xC8); + setMouseCursor(_itemInHand); + int str2 = 0; + + //if (_lang == 1) + // str2 = getItemCommandStringPickUp(itemId); + + updateItemCommand(itemId, str2, 0xFF); + _screen->showMouse(); + + if (runScript) + runSceneScript6(); } bool KyraEngine_v3::isDropable(int x, int y) { @@ -408,5 +437,79 @@ bool KyraEngine_v3::isDropable(int x, int y) { return true; } +bool KyraEngine_v3::itemListMagic(int handItem, int itemSlot) { + debugC(9, kDebugLevelMain, "KyraEngine_v3::itemListMagic(%d, %d)", handItem, itemSlot); + + uint16 item = _itemList[itemSlot].id; + if (_curChapter == 1 && handItem == 3 && item == 3 && queryGameFlag(0x76)) { + //eelScript(); + return true; + } else if ((handItem == 6 || handItem == 7) && item == 2) { + int animObjIndex = -1; + for (int i = 17; i <= 66; ++i) { + if (_animObjects[i].shapeIndex2 == 250) + animObjIndex = i; + } + + assert(animObjIndex != -1); + + _screen->hideMouse(); + playSoundEffect(0x93, 0xC8); + for (int i = 109; i <= 141; ++i) { + _animObjects[animObjIndex].shapeIndex = i+248; + _animObjects[animObjIndex].needRefresh = true; + delay(1, true); + } + + deleteItemAnimEntry(itemSlot); + _itemList[itemSlot].id = 0xFFFF; + _screen->showMouse(); + return true; + } + + if (_mainCharacter.sceneId == 51 && queryGameFlag(0x19B) && !queryGameFlag(0x19C) + && ((item == 63 && handItem == 56) || (item == 56 && handItem == 63))) { + + if (queryGameFlag(0x1AC)) { + setGameFlag(0x19C); + setGameFlag(0x1AD); + } else { + setGameFlag(0x1AE); + } + + _timer->setCountdown(12, 1); + _timer->enable(12); + } + + for (int i = 0; _itemMagicTable[i] != 0xFF; i += 4) { + if (_itemMagicTable[i+0] != handItem || _itemMagicTable[i+1] != item) + continue; + + uint8 resItem = _itemMagicTable[i+2]; + uint8 newItem = _itemMagicTable[i+3]; + + playSoundEffect(0x0F, 0xC8); + + _itemList[itemSlot].id = resItem; + + _screen->hideMouse(); + deleteItemAnimEntry(itemSlot); + addItemToAnimList(itemSlot); + + if (newItem == 0xFE) + removeHandItem(); + else if (newItem != 0xFF) + setHandItem(newItem); + _screen->showMouse(); + + if (_lang != 1) + updateItemCommand(resItem, 3, 0xFF); + + return true; + } + + return false; +} + } // end of namespace Kyra diff --git a/engines/kyra/kyra_v3.h b/engines/kyra/kyra_v3.h index dd7164a668..b7718adcba 100644 --- a/engines/kyra/kyra_v3.h +++ b/engines/kyra/kyra_v3.h @@ -237,6 +237,7 @@ private: void showIdleAnim(); void addItemToAnimList(int item); + void deleteItemAnimEntry(int item); // interface uint8 *_interface; @@ -246,6 +247,9 @@ private: void loadInterface(); void showMessage(const char *string, uint8 c0, uint8 c1); + void showMessageFromCCode(int string, uint8 c0, int); + void updateItemCommand(int item, int str, uint8 c0); + void updateCommandLine(); void restoreCommandLine(); void updateCLState(); @@ -320,6 +324,9 @@ private: bool isDropable(int x, int y); + static const uint8 _itemMagicTable[]; + bool itemListMagic(int handItem, int itemSlot); + // -> hand item void setMouseCursor(uint16 item); @@ -414,6 +421,7 @@ private: int runSceneScript2(); bool _noStartupChat; void runSceneScript4(int unk1); + void runSceneScript6(); void runSceneScript8(); int _sceneMinX, _sceneMaxX; diff --git a/engines/kyra/scene_v3.cpp b/engines/kyra/scene_v3.cpp index 08dded4801..27144ff505 100644 --- a/engines/kyra/scene_v3.cpp +++ b/engines/kyra/scene_v3.cpp @@ -822,6 +822,20 @@ void KyraEngine_v3::runSceneScript4(int unk1) { _noStartupChat = true; } +void KyraEngine_v3::runSceneScript6() { + debugC(9, kDebugLevelMain, "KyraEngine_v3::runSceneScript6()"); + _scriptInterpreter->initScript(&_sceneScriptState, &_sceneScriptData); + + _sceneScriptState.regs[0] = _mainCharacter.sceneId; + _sceneScriptState.regs[1] = _mouseX; + _sceneScriptState.regs[2] = _mouseY; + _sceneScriptState.regs[3] = _itemInHand; + + _scriptInterpreter->startScript(&_sceneScriptState, 6); + while (_scriptInterpreter->validScript(&_sceneScriptState)) + _scriptInterpreter->runScript(&_sceneScriptState); +} + void KyraEngine_v3::runSceneScript8() { debugC(9, kDebugLevelMain, "KyraEngine_v3::runSceneScript8()"); _scriptInterpreter->startScript(&_sceneScriptState, 8); diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 2d564393ef..1bbafd481b 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -2342,6 +2342,14 @@ const uint8 KyraEngine_v3::_trashItemList[] = { 0x39, 0x40, 0x3E, 0x3D, 0x3C, 0x3F, 0xFF }; +const uint8 KyraEngine_v3::_itemMagicTable[] = { + 0x06, 0x05, 0x07, 0xFE, 0x05, 0x06, 0x07, 0xFE, + 0x03, 0x00, 0x22, 0xFE, 0x00, 0x03, 0x22, 0xFE, + 0x10, 0x00, 0x20, 0x0F, 0x00, 0x10, 0x0F, 0x20, + 0x10, 0x22, 0x21, 0x0F, 0x22, 0x10, 0x0F, 0x21, + 0xFF, 0xFF, 0xFF, 0xFF +}; + } // End of namespace Kyra |