diff options
-rw-r--r-- | engines/supernova/state.cpp | 96 |
1 files changed, 80 insertions, 16 deletions
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp index bfd0951eac..8871721065 100644 --- a/engines/supernova/state.cpp +++ b/engines/supernova/state.cpp @@ -528,15 +528,40 @@ void GameManager::resetInputState() { } void GameManager::processInput() { + enum { + onNone, + onObject, + onCmdButton, + onInventory, + onInventoryArrowUp, + onInventoryArrowDown + } mouseLocation; + + if (_mouseField >= 0 && _mouseField < 256) + mouseLocation = onObject; + else if (_mouseField >= 256 && _mouseField < 512) + mouseLocation = onCmdButton; + else if (_mouseField >= 512 && _mouseField < 768) + mouseLocation = onInventory; + else if (_mouseField == 768) + mouseLocation = onInventoryArrowUp; + else if (_mouseField == 769) + mouseLocation = onInventoryArrowDown; + else + mouseLocation = onNone; + if (_mouseClickType == Common::EVENT_LBUTTONUP) { if (_vm->_messageDisplayed) { // Hide the message and consume the event _vm->removeMessage(); - return; + if (mouseLocation != onCmdButton) + return; } - if (((_mouseField >= 0) && (_mouseField < 256)) || - ((_mouseField >= 512) && (_mouseField < 768))) { + switch(mouseLocation) { + case onObject: + case onInventory: + // Fallthrough if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) { if (Object::isNullObject(_inputObject[0])) { _inputObject[0] = _currentInputObject; @@ -551,27 +576,34 @@ void GameManager::processInput() { if (!Object::isNullObject(_currentInputObject)) _processInput = true; } - } else if (_mouseField >= 256 && _mouseField < 512) { + break; + case onCmdButton: resetInputState(); _inputVerb = static_cast<Action>(_mouseField - 256); - } else if (_mouseField == 768) { + break; + case onInventoryArrowUp: if (_inventoryScroll >= 2) _inventoryScroll -= 2; - } else if (_mouseField == 769) { + break; + case onInventoryArrowDown: if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory)) _inventoryScroll += 2; + break; + case onNone: + break; } + } else if (_mouseClickType == Common::EVENT_RBUTTONUP) { if (_vm->_messageDisplayed) { // Hide the message and consume the event _vm->removeMessage(); return; } + if (Object::isNullObject(_currentInputObject)) return; - if (((_mouseField >= 0) && (_mouseField < 256)) || - ((_mouseField >= 512) && (_mouseField < 768))) { + if (mouseLocation == onObject || mouseLocation == onInventory) { _inputObject[0] = _currentInputObject; ObjectTypes type = _inputObject[0]->_type; if (type & OPENABLE) @@ -628,27 +660,59 @@ void GameManager::processInput() { } if (_mouseField != field) { - if (_mouseField >= 768) + switch (mouseLocation) { + case onInventoryArrowUp: + case onInventoryArrowDown: + // Fallthrough _guiInventoryArrow[_mouseField - 768].setHighlight(false); - else if (_mouseField >= 512) + break; + case onInventory: _guiInventory[_mouseField - 512].setHighlight(false); - else if (_mouseField >= 256) + break; + case onCmdButton: _guiCommandButton[_mouseField - 256].setHighlight(false); - else if (_mouseField != -1) { + break; + case onObject: + case onNone: + // Fallthrough + break; } Object::setObjectNull(_currentInputObject); _mouseField = field; - if (_mouseField >= 768) + if (_mouseField >= 0 && _mouseField < 256) + mouseLocation = onObject; + else if (_mouseField >= 256 && _mouseField < 512) + mouseLocation = onCmdButton; + else if (_mouseField >= 512 && _mouseField < 768) + mouseLocation = onInventory; + else if (_mouseField == 768) + mouseLocation = onInventoryArrowUp; + else if (_mouseField == 769) + mouseLocation = onInventoryArrowDown; + else + mouseLocation = onNone; + + switch (mouseLocation) { + case onInventoryArrowUp: + case onInventoryArrowDown: + // Fallthrough _guiInventoryArrow[_mouseField - 768].setHighlight(true); - else if (_mouseField >= 512) { + break; + case onInventory: _guiInventory[_mouseField - 512].setHighlight(true); _currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll); - } else if (_mouseField >= 256) + break; + case onCmdButton: _guiCommandButton[_mouseField - 256].setHighlight(true); - else if (_mouseField != -1) + break; + case onObject: _currentInputObject = _currentRoom->getObject(_mouseField); + break; + case onNone: + break; + } } } } |