aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/kyra/animator_v3.cpp17
-rw-r--r--engines/kyra/gui_v3.cpp23
-rw-r--r--engines/kyra/items_v3.cpp113
-rw-r--r--engines/kyra/kyra_v3.h8
-rw-r--r--engines/kyra/scene_v3.cpp14
-rw-r--r--engines/kyra/staticres.cpp8
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