From b5ad2b9db52e4184829c02830a9d2b22b6f85dde Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 6 Nov 2014 21:52:05 -0500 Subject: ACCESS: Inventory item merge zoom partially working --- engines/access/inventory.cpp | 61 +++++++++++++++++++++++++++++++++++++++++--- engines/access/inventory.h | 2 ++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/engines/access/inventory.cpp b/engines/access/inventory.cpp index 86e73c1cec..2dc73a2864 100644 --- a/engines/access/inventory.cpp +++ b/engines/access/inventory.cpp @@ -308,10 +308,11 @@ void InventoryManager::chooseItem() { int selIndex; while (!_vm->shouldQuit()) { + // Check for events + events.pollEvents(); g_system->delayMillis(10); // Poll events and wait for a click on a known area - events.pollEvents(); if (!events._leftButton || ((selIndex = coordIndexOf()) == -1)) continue; @@ -319,7 +320,7 @@ void InventoryManager::chooseItem() { if (selIndex == 25) _vm->_useItem = -1; break; - } else if (selIndex < (int)_items.size()) { + } else if (selIndex < (int)_items.size() && _items[selIndex] != -1) { _boxNum = selIndex; _vm->copyBF2Vid(); combineItems(); @@ -417,7 +418,7 @@ void InventoryManager::combineItems() { } int destBox = events.checkMouseBox1(_invCoords); - if (destBox >= 0 && destBox != _boxNum && destBox < _items.size() + if (destBox >= 0 && destBox != _boxNum && destBox < (int)_items.size() && _items[destBox] != -1) { int itemA = invItem; int itemB = _items[destBox]; @@ -432,9 +433,19 @@ void InventoryManager::combineItems() { _items[destBox] = combinedItem; _tempLOff[destBox] = _inv[combinedItem]._name; - // TODO: zoomIcon calls? + // Zoom out the old two items and zoom in the new combined item + events.hideCursor(); + zoomIcon(itemA, itemB, destBox, true); + Common::Rect destRect(_invCoords[destBox].left, _invCoords[destBox].top, + _invCoords[destBox].left + 46, _invCoords[destBox].top + 35); + _vm->_buffer2.copyBlock(&_vm->_buffer1, destRect); + screen._screenYOff = 0; + + zoomIcon(itemB, -1, destBox, true); + zoomIcon(combinedItem, -1, destBox, false); _boxNum = destBox; + events.showCursor(); return; } } @@ -443,6 +454,48 @@ void InventoryManager::combineItems() { putInvIcon(_boxNum, invItem); } +void InventoryManager::zoomIcon(int zoomItem, int backItem, int zoomBox, bool shrink) { + Screen &screen = *_vm->_screen; + screen._screenYOff = 0; + SpriteResource *sprites = _vm->_objectsTable[99]; + + int8 zoomScale = shrink ? -1 : 1; + int8 zoomInc = shrink ? -1 : 1; + Common::Rect boxRect(_invCoords[zoomBox].left, _invCoords[zoomBox].top, + _invCoords[zoomBox].left + 46, _invCoords[zoomBox].top + 35); + + while (!_vm->shouldQuit() && zoomScale != 0) { + _vm->_events->pollEvents(); + g_system->delayMillis(5); + + _vm->_buffer2.copyBlock(&_vm->_buffer1, boxRect); + if (backItem != -1) { + _iconDisplayFlag = false; + putInvIcon(zoomBox, backItem); + } + + _vm->_scale = zoomScale; + screen.setScaleTable(zoomScale); + + int xv = screen._scaleTable1[boxRect.width() + 1]; + if (xv) { + int yv = screen._scaleTable1[boxRect.height() + 1]; + if (yv) { + // The zoomed size is positive in both directions, so show zoomed item + Common::Rect scaledBox(xv, yv); + scaledBox.moveTo(boxRect.left + (boxRect.width() - xv + 1) / 2, + boxRect.top + (boxRect.height() - yv + 1) / 2); + + _vm->_buffer2.sPlotF(sprites->getFrame(zoomItem), scaledBox); + } + } + + screen.copyBlock(&_vm->_buffer2, boxRect); + + zoomScale += zoomInc; + } +} + void InventoryManager::synchronize(Common::Serializer &s) { int count = _inv.size(); s.syncAsUint16LE(count); diff --git a/engines/access/inventory.h b/engines/access/inventory.h index eff142c9c9..f2b1f5e182 100644 --- a/engines/access/inventory.h +++ b/engines/access/inventory.h @@ -102,6 +102,8 @@ private: void outlineIcon(int itemIndex); void combineItems(); + + void zoomIcon(int zoomItem, int backItem, int zoomBox, bool shrink); public: Common::Array _inv; int _startInvItem; -- cgit v1.2.3