diff --git a/engines/access/amazon/amazon_resources.cpp b/engines/access/amazon/amazon_resources.cpp index 0807a979cce9..c2eab7b5c26e 100644 --- a/engines/access/amazon/amazon_resources.cpp +++ b/engines/access/amazon/amazon_resources.cpp @@ -1352,6 +1352,94 @@ const int CHAPTER_JUMP[14] = { 0, 12, 10, 15, 19, 25, 31, 36, 45, 46, 29, 55, 61, 0 }; +const int COMBO_TABLE[85][4] = { + { -1, -1, -1, -1 }, + { 12, 3, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 24, 25, -1, -1 }, + { 10, 24, -1, -1 }, + { -1, -1, -1, -1 }, + { 8, 24, -1, -1 }, + { -1, -1, -1, -1 }, + { 1, 3, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 7, 25, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 80, 81, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 41, 42, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 39, 40, -1, -1 }, + { 38, 40, -1, -1 }, + { -1, -1, -1, -1 }, + { 32, 42, 77, 78 }, + { -1, -1, -1, -1 }, + { 60, 61, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 73, 72, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 64, 67, -1, -1 }, + { -1, -1, -1, -1 }, + { 59, 60, -1, -1 }, + { 58, 60, -1, -1 }, + { 43, 61, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 56, 67, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 50, 72, -1, -1 }, + { 75, 77, -1, -1 }, + { 74, 77, -1, -1 }, + { -1, -1, -1, -1 }, + { 41, 78, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { 29, 81, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 }, + { -1, -1, -1, -1 } +}; + } // End of namespace Amazon } // End of namespace Access diff --git a/engines/access/amazon/amazon_resources.h b/engines/access/amazon/amazon_resources.h index d8d37b5a5f7b..2be9b4dd4bf9 100644 --- a/engines/access/amazon/amazon_resources.h +++ b/engines/access/amazon/amazon_resources.h @@ -64,6 +64,8 @@ extern const int CHAPTER_TABLE[14][5]; extern const int CHAPTER_JUMP[14]; +extern const int COMBO_TABLE[85][4]; + } // End of namespace Amazon } // End of namespace Access diff --git a/engines/access/events.cpp b/engines/access/events.cpp index 0a754305b2d1..0b7a34841e86 100644 --- a/engines/access/events.cpp +++ b/engines/access/events.cpp @@ -250,5 +250,18 @@ Common::Point EventsManager::calcRawMouse() { return pt; } +int EventsManager::checkMouseBox1(Common::Array &rects) { + int i = 0; + for (i = 0;; i++) { + if (rects[i].left == -1) + return -1; + + if ((_mousePos.x > rects[i].left) && (_mousePos.x < rects[i].right) + && (_mousePos.y > rects[i].top) && (_mousePos.y < rects[i].bottom)) + return i; + } +} + + } // End of namespace Access diff --git a/engines/access/events.h b/engines/access/events.h index 313a039831b4..b29b54159e58 100644 --- a/engines/access/events.h +++ b/engines/access/events.h @@ -121,6 +121,8 @@ class EventsManager { Common::Point &getMousePos() { return _mousePos; } Common::Point calcRawMouse(); + + int checkMouseBox1(Common::Array &rects); }; } // End of namespace Access diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp index bb735d45a913..f31379a2fa90 100644 --- a/engines/access/inventory.cpp +++ b/engines/access/inventory.cpp @@ -28,6 +28,26 @@ namespace Access { +void InventoryEntry::load(const Common::String &name, const int *data) { + _value = 0; + _name = name; + _otherItem1 = *data++; + _newItem1 = *data++; + _otherItem2 = *data++; + _newItem2 = *data; +} + +int InventoryEntry::checkItem(int itemId) { + if (_otherItem1 == itemId) + return _newItem1; + else if (_otherItem2 == itemId) + return _newItem2; + else + return -1; +} + +/*------------------------------------------------------------------------*/ + InventoryManager::InventoryManager(AccessEngine *vm) : Manager(vm) { _startInvItem = 0; _startInvBox = 0; @@ -39,9 +59,12 @@ InventoryManager::InventoryManager(AccessEngine *vm) : Manager(vm) { _iconDisplayFlag = true; const char *const *names; + const int *combineP; + switch (vm->getGameID()) { case GType_Amazon: names = Amazon::INVENTORY_NAMES; + combineP = &Amazon::COMBO_TABLE[0][0]; _inv.resize(85); break; case GType_MartianMemorandum: @@ -52,8 +75,9 @@ InventoryManager::InventoryManager(AccessEngine *vm) : Manager(vm) { error("Unknown game"); } - for (uint i = 0; i < _inv.size(); ++i) - _names.push_back(names[i]); + for (uint i = 0; i < _inv.size(); ++i, combineP += 4) { + _inv[i].load(names[i], combineP); + } for (uint i = 0; i < 26; ++i) { const int *r = INVCOORDS[i]; @@ -62,7 +86,7 @@ InventoryManager::InventoryManager(AccessEngine *vm) : Manager(vm) { } int &InventoryManager::operator[](int idx) { - return _inv[idx]; + return _inv[idx]._value; } int InventoryManager::useItem() { @@ -255,9 +279,9 @@ void InventoryManager::getList() { _tempLOff.clear(); for (uint i = 0; i < _inv.size(); ++i) { - if (_inv[i] == 1) { + if (_inv[i]._value == 1) { _items.push_back(i); - _tempLOff.push_back(_names[i]); + _tempLOff.push_back(_inv[i]._name); } } } @@ -351,7 +375,69 @@ void InventoryManager::outlineIcon(int itemIndex) { } void InventoryManager::combineItems() { - warning("TODO: combineItems"); + Screen &screen = *_vm->_screen; + EventsManager &events = *_vm->_events; + screen._leftSkip = screen._rightSkip = 0; + screen._topSkip = screen._bottomSkip = 0; + screen._screenYOff = 0; + + Common::Point tempMouse = events._mousePos; + Common::Point lastMouse = events._mousePos; + + Common::Rect &inv = _invCoords[_boxNum]; + Common::Rect r(inv.left, inv.top, inv.left + 46, inv.top + 35); + Common::Point tempBox(inv.left, inv.top); + Common::Point lastBox(inv.left, inv.top); + + _vm->_buffer2.copyBlock(&_vm->_buffer1, r); + SpriteResource *sprites = _vm->_objectsTable[99]; + int invItem = _items[_boxNum]; + events.pollEvents(); + + // Item drag handling loop + while (!_vm->shouldQuit() && events._leftButton) { + // Poll for events + events.pollEvents(); + g_system->delayMillis(10); + + // Check positioning + if (lastMouse == events._mousePos) + continue; + + lastMouse = events._mousePos; + Common::Rect lastRect(lastBox.x, lastBox.y, lastBox.x + 46, lastBox.y + 35); + screen.copyBlock(&_vm->_buffer2, lastRect); + + int xp = MAX(events._mousePos.x - tempMouse.x + tempBox.x, 0); + int yp = MAX(events._mousePos.y - tempMouse.y + tempBox.y, 0); + screen.plotImage(sprites, invItem, Common::Point(xp, yp)); + } + + int destBox = events.checkMouseBox1(_invCoords); + if (destBox >= 0 && destBox != _boxNum && destBox < _items.size() + && _items[destBox] != -1) { + int itemA = invItem; + int itemB = _items[destBox]; + + // Check whether the items can be combined + int combinedItem = _inv[itemA].checkItem(itemB); + if (combinedItem != -1) { + _inv[combinedItem]._value = 1; + _inv[itemA]._value = 2; + _inv[itemB]._value = 2; + _items[_boxNum] = -1; + _items[destBox] = combinedItem; + _tempLOff[destBox] = _inv[combinedItem]._name; + + // TODO: zoomIcon calls? + + _boxNum = destBox; + return; + } + } + + _iconDisplayFlag = true; + putInvIcon(_boxNum, invItem); } void InventoryManager::synchronize(Common::Serializer &s) { @@ -362,7 +448,7 @@ void InventoryManager::synchronize(Common::Serializer &s) { _inv.resize(count); for (int i = 0; i < count; ++i) - s.syncAsUint16LE((*this)[i]); + s.syncAsUint16LE(_inv[i]._value); } } // End of namespace Access diff --git a/engines/access/inventory.h b/engines/access/inventory.h index 0ff902025043..eff142c9c961 100644 --- a/engines/access/inventory.h +++ b/engines/access/inventory.h @@ -32,6 +32,21 @@ namespace Access { +class InventoryEntry { +public: + Common::String _name; + int _value; + + int _otherItem1; + int _newItem1; + int _otherItem2; + int _newItem2; + + void load(const Common::String &name, const int *data); + + int checkItem(int itemId); +}; + class InventoryManager : public Manager { struct SavedFields { int _vWindowHeight; @@ -58,7 +73,6 @@ class InventoryManager : public Manager { ASurface _savedScreen; SavedFields _fields; bool _iconDisplayFlag; - Common::StringArray _names; Common::Array _tempLPtr; Common::StringArray _tempLOff; int _boxNum; @@ -89,7 +103,7 @@ class InventoryManager : public Manager { void combineItems(); public: - Common::Array _inv; + Common::Array _inv; int _startInvItem; int _startInvBox; bool _invChangeFlag; diff --git a/engines/access/scripts.cpp b/engines/access/scripts.cpp index c46d7b972f7a..6c4c37491fdd 100644 --- a/engines/access/scripts.cpp +++ b/engines/access/scripts.cpp @@ -554,18 +554,6 @@ void Scripts::cmdTexSpeak() { findNull(); } -int Scripts::checkMouseBox1(Common::Rect *rectArr) { - int i = 0; - for (i = 0; ; i++){ - if (rectArr[i].left == -1) - return -1; - - if ((_vm->_events->_mousePos.x > rectArr[i].left) && (_vm->_events->_mousePos.x < rectArr[i].right) - && (_vm->_events->_mousePos.y > rectArr[i].top) && (_vm->_events->_mousePos.y < rectArr[i].bottom)) - return i; - } -} - void Scripts::cmdTexChoice() { static Common::Point cMouse[7] = { Common::Point(0, 76), Common::Point(77, 154), Common::Point(155, 232), @@ -595,9 +583,9 @@ void Scripts::cmdTexChoice() { _vm->_bubbleBox->calcBubble(tmpStr); _vm->_bubbleBox->printBubble(tmpStr); - Common::Rect responseCoords[2]; - responseCoords[0] = _vm->_bubbleBox->_bounds; - responseCoords[1] = Common::Rect(0, 0, 0, 0); + Common::Array responseCoords; + responseCoords.push_back(_vm->_bubbleBox->_bounds); + responseCoords.push_back(Common::Rect(0, 0, 0, 0)); _vm->_screen->_printOrg.y = _vm->_bubbleBox->_bounds.bottom + 11; findNull(); @@ -655,7 +643,7 @@ void Scripts::cmdTexChoice() { } } else { _vm->_events->debounceLeft(); - choice = checkMouseBox1(responseCoords); + choice = _vm->_events->checkMouseBox1(responseCoords); } } } while ((choice == -1) || ((choice == 2) && choice3Fl)); diff --git a/engines/access/scripts.h b/engines/access/scripts.h index f4128f4e310b..ab80c1cd9fc6 100644 --- a/engines/access/scripts.h +++ b/engines/access/scripts.h @@ -44,8 +44,6 @@ class Scripts: public Manager { virtual void executeSpecial(int commandIndex, int param1, int param2) = 0; virtual void executeCommand(int commandIndex); - int checkMouseBox1(Common::Rect *rectArr); - /** * Print a given message to the screen in a bubble box */