diff options
-rw-r--r-- | engines/mads/game.cpp | 2 | ||||
-rw-r--r-- | engines/mads/screen.cpp | 92 | ||||
-rw-r--r-- | engines/mads/screen.h | 11 | ||||
-rw-r--r-- | engines/mads/user_interface.cpp | 110 | ||||
-rw-r--r-- | engines/mads/user_interface.h | 26 |
5 files changed, 132 insertions, 109 deletions
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index e2e956e8cb..9296b95d47 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -175,7 +175,7 @@ void Game::sectionLoop() { // Reset the user interface _screenObjects._forceRescan = true; _screenObjects._inputMode = kInputBuildingSentences; - _scene._userInterface._scrollerY = 0; + _scene._userInterface._scrollbarActive = SCROLLBAR_NONE; _player._loadsFirst = true; diff --git a/engines/mads/screen.cpp b/engines/mads/screen.cpp index 519dcabccd..9824a3e7cc 100644 --- a/engines/mads/screen.cpp +++ b/engines/mads/screen.cpp @@ -261,13 +261,10 @@ ScreenObjects::ScreenObjects(MADSEngine *vm) : _vm(vm) { _v7FED6 = 0; _v8332A = 0; _category = CAT_NONE; - _newDescId = 0; - _newDescId = 0; + _spotId = 0; _released = false; _uiCount = 0; _selectedObject = -1; - _scrollerY = -1; - _milliTime = 0; _eventFlag = false; _baseTime = 0; } @@ -292,14 +289,14 @@ void ScreenObjects::check(bool scanFlag) { if (!_vm->_events->_mouseButtons || _inputMode != kInputBuildingSentences) _vm->_events->_rightMousePressed = false; - if ((_vm->_events->_mouseMoved || _vm->_game->_scene._userInterface._scrollerY + if ((_vm->_events->_mouseMoved || userInterface._scrollbarActive || _v8332A || _forceRescan) && scanFlag) { _category = CAT_NONE; _selectedObject = scanBackwards(_vm->_events->currentPos(), LAYER_GUI); if (_selectedObject > 0) { ScreenObject &scrObject = (*this)[_selectedObject]; _category = (ScrCategory)(scrObject._category & 7); - _newDescId = scrObject._descId; + _spotId = scrObject._descId; } // Handling for easy mouse @@ -335,13 +332,13 @@ void ScreenObjects::check(bool scanFlag) { scene._userInterface._category = CAT_NONE; } - if (_vm->_events->_mouseButtons || _vm->_easyMouse || scene._userInterface._scrollerY) - checkScroller(); + if (_vm->_events->_mouseButtons || _vm->_easyMouse || userInterface._scrollbarActive) + scene._userInterface.updateInventoryScroller(); if (_vm->_events->_mouseButtons || _vm->_easyMouse) scene._action.set(); - _forceRescan = 0; + _forceRescan = false; } scene._action.refresh(); @@ -380,83 +377,6 @@ int ScreenObjects::scanBackwards(const Common::Point &pt, int layer) { return 0; } -void ScreenObjects::checkScroller() { - UserInterface &userInterface = _vm->_game->_scene._userInterface; - Common::Array<int> &inventoryList = _vm->_game->_objects._inventoryList; - - if (_inputMode != kInputBuildingSentences) - return; - - userInterface._scrollerY = 0; - - if ((_category == CAT_INV_SCROLLER || (_scrollerY == 3 && _vm->_events->_mouseStatusCopy)) - && (_vm->_events->_mouseStatusCopy || _vm->_easyMouse)) { - if ((_vm->_events->_vD2 || (_vm->_easyMouse && !_vm->_events->_mouseStatusCopy)) - && _category == CAT_INV_SCROLLER) { - _currentDescId = _newDescId; - } - } - - if (_newDescId == _currentDescId || _scrollerY == 3) { - _vm->_game->_scene._userInterface._scrollerY = _currentDescId; - uint32 currentMilli = g_system->getMillis(); - uint32 timeInc = _eventFlag ? 100 : 380; - - if (_vm->_events->_vD2 || (_milliTime + timeInc) <= currentMilli) { - _eventFlag = _vm->_events->_vD2 < 1; - _milliTime = currentMilli; - - switch (_currentDescId) { - case 1: - // Scroll up - if (userInterface._inventoryTopIndex > 0 && inventoryList.size() > 0) { - --userInterface._inventoryTopIndex; - userInterface._inventoryChanged = true; - } - break; - - case 2: - // Scroll down - if (userInterface._inventoryTopIndex < (int)inventoryList.size() && - inventoryList.size() > 0) { - ++userInterface._inventoryTopIndex; - userInterface._inventoryChanged = true; - } - break; - - case 3: { - // Inventory slider - int newIndex = CLIP((int)_vm->_events->currentPos().y - 170, 0, 17) - * inventoryList.size() / 10; - if (newIndex >= (int)inventoryList.size()) - newIndex = inventoryList.size() - 1; - - if (inventoryList.size() > 0) { - userInterface._inventoryChanged = newIndex != userInterface._inventoryTopIndex; - userInterface._inventoryTopIndex = newIndex; - } - break; - } - - default: - break; - } - - if (userInterface._inventoryChanged) { - int dummy; - userInterface.updateSelection(CAT_INV_LIST, 0, &dummy); - } - } - } - - if (userInterface._scrollerY != _scrollerY || - userInterface._objectY != _objectY) - userInterface.scrollerChanged(); - - _scrollerY = userInterface._scrollerY; - _objectY = userInterface._objectY; -} - void ScreenObjects::elementHighlighted() { Scene &scene = _vm->_game->_scene; UserInterface &userInterface = scene._userInterface; diff --git a/engines/mads/screen.h b/engines/mads/screen.h index 11b81346f1..5be627a428 100644 --- a/engines/mads/screen.h +++ b/engines/mads/screen.h @@ -140,15 +140,8 @@ class ScreenObjects : public Common::Array<ScreenObject> { private: MADSEngine *_vm; int _objectY; - int _scrollerY; int scanBackwards(const Common::Point &pt, int layer); - - /** - * Checks for the mouse being on the user interface inventory scroller, - * and update the scroller and selected inventory object as necessary - */ - void checkScroller(); public: InputMode _inputMode; int _v7FED6; @@ -156,13 +149,11 @@ public: int _forceRescan; int _selectedObject; ScrCategory _category; - int _newDescId; - int _currentDescId; bool _released; int _uiCount; - uint32 _milliTime; bool _eventFlag; uint32 _baseTime; + int _spotId; /* * Constructor diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp index 3ae571c41c..a850c9a68f 100644 --- a/engines/mads/user_interface.cpp +++ b/engines/mads/user_interface.cpp @@ -208,11 +208,15 @@ UserInterface::UserInterface(MADSEngine *vm) : _vm(vm), _dirtyAreas(vm), _scrollFlag = false; _category = CAT_NONE; _inventoryTopIndex = 0; - _objectY = 0; _selectedInvIndex = -1; _selectedActionIndex = 0; _selectedItemVocabIdx = -1; - _scrollerY = 0; + _scrollbarActive = SCROLLBAR_NONE; + _scrollbarOldActive = SCROLLBAR_NONE; + _scrollbarStrokeType = SCROLLBAR_NONE; + _scrollbarQuickly = false; + _scrollbarMilliTime = 0; + _scrollbarElevator = _scrollbarOldElevator = 0; _highlightedCommandIndex = -1; _highlightedInvIndex = -1; _highlightedItemVocabIndex = -1; @@ -327,11 +331,95 @@ void UserInterface::drawItemVocabList() { } void UserInterface::drawScrolller() { - if (_scrollerY > 0) - writeVocab(CAT_INV_SCROLLER, _scrollerY); + if (_scrollbarActive) + writeVocab(CAT_INV_SCROLLER, _scrollbarActive); writeVocab(CAT_INV_SCROLLER, 4); } +void UserInterface::updateInventoryScroller() { + ScreenObjects &screenObjects = _vm->_game->_screenObjects; + Common::Array<int> &inventoryList = _vm->_game->_objects._inventoryList; + + if (screenObjects._inputMode != kInputBuildingSentences) + return; + + _scrollbarActive = SCROLLBAR_NONE; + + if (( + (screenObjects._category == CAT_INV_SCROLLER) || + (screenObjects._category != CAT_INV_SCROLLER && _scrollbarOldActive == SCROLLBAR_ELEVATOR) + ) && (_vm->_events->_mouseStatusCopy || _vm->_easyMouse)) { + if ((_vm->_events->_mouseClicked || (_vm->_easyMouse && !_vm->_events->_mouseStatusCopy)) + && (screenObjects._category == CAT_INV_SCROLLER)) + _scrollbarStrokeType = (ScrollbarActive)screenObjects._spotId; + + if (screenObjects._spotId == _scrollbarStrokeType || _scrollbarOldActive == SCROLLBAR_ELEVATOR) { + _scrollbarActive = _scrollbarStrokeType; + uint32 currentMilli = g_system->getMillis(); + uint32 timeInc = _scrollbarQuickly ? 100 : 380; + + if (_vm->_events->_mouseClicked || (_vm->_events->_mouseStatusCopy && (_scrollbarMilliTime + timeInc) <= currentMilli)) { + _scrollbarQuickly = _vm->_events->_vD2 < 1; + _scrollbarMilliTime = currentMilli; + + switch (_scrollbarStrokeType) { + case 1: + // Scroll up + if (_inventoryTopIndex > 0 && inventoryList.size() > 0) { + --_inventoryTopIndex; + _inventoryChanged = true; + } + break; + + case 2: + // Scroll down + if (_inventoryTopIndex < ((int)inventoryList.size() - 1) && inventoryList.size() > 1) { + ++_inventoryTopIndex; + _inventoryChanged = true; + } + break; + + case 3: { + // Inventory slider + int newIndex = CLIP((int)_vm->_events->currentPos().y - 170, 0, 17) + * inventoryList.size() / 10; + if (newIndex >= (int)inventoryList.size()) + newIndex = inventoryList.size() - 1; + + if (inventoryList.size() > 0) { + _inventoryChanged = newIndex != _inventoryTopIndex; + _inventoryTopIndex = newIndex; + } + break; + } + + default: + break; + } + + if (_inventoryChanged) { + int dummy; + updateSelection(CAT_INV_LIST, 0, &dummy); + } + } + } + } + + if (_scrollbarActive != _scrollbarOldActive || _scrollbarElevator != _scrollbarOldElevator) + scrollbarChanged(); + + _scrollbarOldActive = _scrollbarActive; + _scrollbarOldElevator = _scrollbarElevator; +} + +void UserInterface::scrollbarChanged() { + Common::Rect r(73, 4, 73 + 9, 4 + 38); + _uiSlots.add(r); + _uiSlots.draw(false, false); + drawScrolller(); + updateRect(r); +} + void UserInterface::writeVocab(ScrCategory category, int id) { Common::Rect bounds; if (!getBounds(category, id, bounds)) @@ -393,7 +481,8 @@ void UserInterface::writeVocab(ScrCategory category, int id) { break; } - font->setColorMode((id == 4) || (_scrollerY == 3) ? SELMODE_HIGHLIGHTED : SELMODE_UNSELECTED); + font->setColorMode((id == 4) || (_scrollbarActive == SCROLLBAR_ELEVATOR) ? + SELMODE_HIGHLIGHTED : SELMODE_UNSELECTED); font->writeString(this, vocabStr, Common::Point(bounds.left, bounds.top)); break; default: @@ -561,7 +650,7 @@ bool UserInterface::getBounds(ScrCategory category, int v, Common::Rect &bounds) break; case 4: // Thumb - bounds.top = _objectY + 14; + bounds.top = _scrollbarElevator + 14; bounds.setHeight(1); break; default: @@ -753,6 +842,7 @@ void UserInterface::selectObject(int invIndex) { void UserInterface::updateSelection(ScrCategory category, int newIndex, int *idx) { Game &game = *_vm->_game; + Common::Array<int> &invList = game._objects._inventoryList; Common::Rect bounds; if (category == CAT_INV_LIST && _inventoryChanged) { @@ -764,11 +854,11 @@ void UserInterface::updateSelection(ScrCategory category, int newIndex, int *idx updateRect(bounds); _inventoryChanged = false; - if (game._objects._inventoryList.size() > 1) { - _objectY = 0; + if (invList.size() < 2) { + _scrollbarElevator = 0; } else { - int v = _inventoryTopIndex * 18 / (game._objects._inventoryList.size() - 1); - _objectY = MIN(v, 17); + int v = _inventoryTopIndex * 18 / (invList.size() - 1); + _scrollbarElevator = MIN(v, 17); } } else { int oldIndex = *idx; diff --git a/engines/mads/user_interface.h b/engines/mads/user_interface.h index 46ba478f5b..f06917310e 100644 --- a/engines/mads/user_interface.h +++ b/engines/mads/user_interface.h @@ -33,6 +33,14 @@ namespace MADS { enum { IMG_SPINNING_OBJECT = 200, IMG_TEXT_UPDATE = 201 }; +enum ScrollbarActive { + SCROLLBAR_NONE = 0, // No state + SCROLLBAR_UP = 1, // Up butotn + SCROLLBAR_DOWN = 2, // Down button + SCROLLBAR_ELEVATOR = 3, // Elevator bar + SCROLLBAR_THUMB = 4 // Scrollbar thumb +}; + class AnimFrameEntry; class UISlot { @@ -96,6 +104,7 @@ private: bool _scrollFlag; int _noSegmentsActive; int _someSegmentsActive; + ScrollbarActive _scrollbarStrokeType; /** * Loads the elements of the user interface @@ -138,6 +147,11 @@ private: void drawScrolller(); /** + * Called when the inventory scrollbar has changed + */ + void scrollbarChanged(); + + /** * Draw a UI textual element */ void writeVocab(ScrCategory category, int id); @@ -153,11 +167,10 @@ public: Common::Rect _drawBounds; Common::Rect *_rectP; int _inventoryTopIndex; - int _objectY; int _selectedInvIndex; int _selectedActionIndex; int _selectedItemVocabIdx; - int _scrollerY; + ScrollbarActive _scrollbarActive, _scrollbarOldActive; int _highlightedCommandIndex; int _highlightedInvIndex; int _highlightedItemVocabIndex; @@ -165,6 +178,9 @@ public: int _categoryIndexes[8]; Common::StringArray _talkStrings; Common::Array<int> _talkIds; + bool _scrollbarQuickly; + uint32 _scrollbarMilliTime; + int _scrollbarElevator, _scrollbarOldElevator; public: /** * Constructor @@ -219,6 +235,12 @@ public: void scrollInventory(); + /** + * Checks for the mouse being on the user interface inventory scroller, + * and update the scroller highlight and selected inventory object as necessary + */ + void updateInventoryScroller(); + void emptyTalkList(); }; |