diff options
-rw-r--r-- | engines/titanic/core/view_item.cpp | 53 | ||||
-rw-r--r-- | engines/titanic/core/view_item.h | 1 | ||||
-rw-r--r-- | engines/titanic/input_translator.cpp | 18 | ||||
-rw-r--r-- | engines/titanic/input_translator.h | 6 | ||||
-rw-r--r-- | engines/titanic/pet_control/pet_conversations.cpp | 21 | ||||
-rw-r--r-- | engines/titanic/pet_control/pet_glyphs.cpp | 15 |
6 files changed, 83 insertions, 31 deletions
diff --git a/engines/titanic/core/view_item.cpp b/engines/titanic/core/view_item.cpp index 243d47f3fd..2b585160ea 100644 --- a/engines/titanic/core/view_item.cpp +++ b/engines/titanic/core/view_item.cpp @@ -36,6 +36,7 @@ BEGIN_MESSAGE_MAP(CViewItem, CNamedItem) ON_MESSAGE(MouseButtonUpMsg) ON_MESSAGE(MouseDoubleClickMsg) ON_MESSAGE(MouseMoveMsg) + ON_MESSAGE(VirtualKeyCharMsg) END_MESSAGE_MAP() CViewItem::CViewItem() : CNamedItem() { @@ -337,4 +338,56 @@ CString CViewItem::getNodeViewName() const { return CString::format("%s.%s", node->getName().c_str(), getName().c_str()); } +bool CViewItem::VirtualKeyCharMsg(CVirtualKeyCharMsg *msg) { + enum Movement { LEFT, RIGHT, FORWARDS, BACKWARDS }; + Movement move; + + switch (msg->_keyState.keycode) { + case Common::KEYCODE_LEFT: + case Common::KEYCODE_KP4: + // Left arrow + move = LEFT; + break; + case Common::KEYCODE_RIGHT: + case Common::KEYCODE_KP6: + // Right arrow + move = RIGHT; + break; + case Common::KEYCODE_UP: + case Common::KEYCODE_KP8: + // Up arrow + move = FORWARDS; + break; + case Common::KEYCODE_DOWN: + case Common::KEYCODE_KP2: + // Down arrow + move = BACKWARDS; + break; + default: + return false; + } + + // Iterate through the links to find an appropriate link + for (CTreeItem *treeItem = getFirstChild(); treeItem; + treeItem = treeItem->scan(this)) { + CLinkItem *link = dynamic_cast<CLinkItem *>(treeItem); + if (!link) + continue; + + CursorId c = link->_cursorId; + if ((move == LEFT && c == CURSOR_MOVE_LEFT) || + (move == RIGHT && c == CURSOR_MOVE_RIGHT) || + (move == FORWARDS && (c == CURSOR_MOVE_FORWARD || + c == CURSOR_MOVE_THROUGH || c == CURSOR_DOWN)) || + (move == BACKWARDS && c == CURSOR_BACKWARDS)) { + // Found a matching link + CGameManager *gm = getGameManager(); + gm->_gameState.triggerLink(link); + return true; + } + } + + return false; +} + } // End of namespace Titanic diff --git a/engines/titanic/core/view_item.h b/engines/titanic/core/view_item.h index ceb8a020da..e18536dc36 100644 --- a/engines/titanic/core/view_item.h +++ b/engines/titanic/core/view_item.h @@ -36,6 +36,7 @@ class CViewItem : public CNamedItem { bool MouseButtonUpMsg(CMouseButtonUpMsg *msg); bool MouseMoveMsg(CMouseMoveMsg *msg); bool MouseDoubleClickMsg(CMouseDoubleClickMsg *msg); + bool VirtualKeyCharMsg(CVirtualKeyCharMsg *msg); private: CTreeItem *_buttonUpTargets[4]; private: diff --git a/engines/titanic/input_translator.cpp b/engines/titanic/input_translator.cpp index cd0dbc7d56..bd805258d5 100644 --- a/engines/titanic/input_translator.cpp +++ b/engines/titanic/input_translator.cpp @@ -86,12 +86,12 @@ void CInputTranslator::mouseWheel(bool wheelUp, const Point &pt) { } void CInputTranslator::keyDown(const Common::KeyState &keyState) { - if (keyState.keycode >= Common::KEYCODE_F1 && keyState.keycode <= Common::KEYCODE_F5) { + if (isSpecialKey(keyState.keycode)) { CVirtualKeyCharMsg msg(keyState); _inputHandler->handleMessage(msg); } - if (keyState.ascii <= 127) { + if (keyState.ascii > 0 && keyState.ascii <= 127) { CKeyCharMsg msg(keyState.ascii); _inputHandler->handleMessage(msg); } @@ -101,4 +101,18 @@ bool CInputTranslator::isMousePressed() const { return g_vm->_events->getSpecialButtons() & (MK_LBUTTON | MK_RBUTTON | MK_MBUTTON); } +bool CInputTranslator::isSpecialKey(Common::KeyCode key) { + if ((key >= Common::KEYCODE_F1 && key <= Common::KEYCODE_F8) || + (key >= Common::KEYCODE_KP1 && key <= Common::KEYCODE_KP9)) + return true; + + if (key == Common::KEYCODE_PAGEUP || key == Common::KEYCODE_PAGEDOWN || + key == Common::KEYCODE_HOME || key == Common::KEYCODE_END || + key == Common::KEYCODE_LEFT || key == Common::KEYCODE_RIGHT || + key == Common::KEYCODE_UP || key == Common::KEYCODE_DOWN) + return true; + + return false; +} + } // End of namespace Titanic diff --git a/engines/titanic/input_translator.h b/engines/titanic/input_translator.h index cb53a2c396..0e1b5de1b1 100644 --- a/engines/titanic/input_translator.h +++ b/engines/titanic/input_translator.h @@ -36,6 +36,12 @@ private: * Converts the special buttons bitset into a buttons bitset */ int getButtons(int special) const; + + /** + * Returns true if a key down contains a special non-ascii key + * that should still be passed onto the game + */ + bool isSpecialKey(Common::KeyCode key); public: CInputHandler *_inputHandler; public: diff --git a/engines/titanic/pet_control/pet_conversations.cpp b/engines/titanic/pet_control/pet_conversations.cpp index 6db804ee16..0a31f44bbf 100644 --- a/engines/titanic/pet_control/pet_conversations.cpp +++ b/engines/titanic/pet_control/pet_conversations.cpp @@ -461,37 +461,30 @@ TTnpcScript *CPetConversations::getNPCScript(const CString &name) const { bool CPetConversations::handleKey(const Common::KeyState &keyState) { switch (keyState.keycode) { - case Common::KEYCODE_UP: - case Common::KEYCODE_KP8: - scrollUp(); - break; - case Common::KEYCODE_DOWN: - case Common::KEYCODE_KP2: - scrollDown(); - break; case Common::KEYCODE_PAGEUP: case Common::KEYCODE_KP9: scrollUpPage(); - break; + return true; case Common::KEYCODE_PAGEDOWN: case Common::KEYCODE_KP3: scrollDownPage(); - break; + return true; case Common::KEYCODE_HOME: case Common::KEYCODE_KP7: scrollToTop(); - break; + return true; case Common::KEYCODE_END: case Common::KEYCODE_KP1: scrollToBottom(); - break; + return true; default: - if (keyState.ascii > 0 && keyState.ascii) { + if (keyState.ascii > 0 && keyState.ascii <= 127) { if (_textInput.handleKey(keyState.ascii)) // Text line finished, so process line textLineEntered(_textInput.getText()); + return true; } - return true; + break; } return false; diff --git a/engines/titanic/pet_control/pet_glyphs.cpp b/engines/titanic/pet_control/pet_glyphs.cpp index 0f640294fc..5ce2283f6e 100644 --- a/engines/titanic/pet_control/pet_glyphs.cpp +++ b/engines/titanic/pet_control/pet_glyphs.cpp @@ -415,21 +415,6 @@ bool CPetGlyphs::KeyCharMsg(int key) { } bool CPetGlyphs::VirtualKeyCharMsg(CVirtualKeyCharMsg *msg) { - Common::KeyCode key = msg->_keyState.keycode; - - switch (key) { - case Common::KEYCODE_LEFT: - decSelection(); - return true; - - case Common::KEYCODE_RIGHT: - incSelection(); - return true; - - default: - break; - } - if (_highlightIndex >= 0) { CPetGlyph *glyph = getGlyph(_highlightIndex); if (glyph && glyph->VirtualKeyCharMsg(msg)) |