From 3a798b09bea2bd49536e061388ad58d5a6d0742c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 4 Aug 2017 22:20:25 -0400 Subject: TITANIC: Fix arrow movements ignoring restricted moves --- engines/titanic/core/view_item.cpp | 24 +++++++++++++++++++++++- engines/titanic/core/view_item.h | 6 ++++++ 2 files changed, 29 insertions(+), 1 deletion(-) (limited to 'engines/titanic') diff --git a/engines/titanic/core/view_item.cpp b/engines/titanic/core/view_item.cpp index 2b585160ea..5f51cfc931 100644 --- a/engines/titanic/core/view_item.cpp +++ b/engines/titanic/core/view_item.cpp @@ -374,7 +374,7 @@ bool CViewItem::VirtualKeyCharMsg(CVirtualKeyCharMsg *msg) { if (!link) continue; - CursorId c = link->_cursorId; + CursorId c = getLinkCursor(link); if ((move == LEFT && c == CURSOR_MOVE_LEFT) || (move == RIGHT && c == CURSOR_MOVE_RIGHT) || (move == FORWARDS && (c == CURSOR_MOVE_FORWARD || @@ -390,4 +390,26 @@ bool CViewItem::VirtualKeyCharMsg(CVirtualKeyCharMsg *msg) { return false; } +CursorId CViewItem::getLinkCursor(CLinkItem *link) { + Common::Point pt(link->_bounds.left, link->_bounds.top); + Common::Array gameObjects; + + // Scan for a restricted object covering the link + for (CTreeItem *treeItem = scan(this); treeItem; treeItem = treeItem->scan(this)) { + CGameObject *gameObject = dynamic_cast(treeItem); + if (gameObject) { + if (gameObject->checkPoint(pt, false, true)) + gameObjects.push_back(gameObject); + } + } + + for (int idx = (int)gameObjects.size() - 1; idx >= 0; --idx) { + if (gameObjects[idx]->_cursorId == CURSOR_INVALID) + return CURSOR_INVALID; + } + + // No obscuring objects, so we're free to return the link's cursor + return link->_cursorId; +} + } // End of namespace Titanic diff --git a/engines/titanic/core/view_item.h b/engines/titanic/core/view_item.h index e18536dc36..d8ec3c1b98 100644 --- a/engines/titanic/core/view_item.h +++ b/engines/titanic/core/view_item.h @@ -54,6 +54,12 @@ private: * Handles mouse button up messages */ void handleButtonUpMsg(CMouseButtonUpMsg *msg); + + /** + * Gets the cursor for a link, taking into account any + * "restricted" surface that may be covering it + */ + CursorId getLinkCursor(CLinkItem *link); protected: int _field24; CResourceKey _resourceKey; -- cgit v1.2.3