TITANIC: Fix arrow movements ignoring restricted moves

This commit is contained in:
Paul Gilbert 2017-08-04 22:20:25 -04:00
parent e44c5bdcc6
commit 3a798b09be
2 changed files with 29 additions and 1 deletions

View File

@ -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<CGameObject *> gameObjects;
// Scan for a restricted object covering the link
for (CTreeItem *treeItem = scan(this); treeItem; treeItem = treeItem->scan(this)) {
CGameObject *gameObject = dynamic_cast<CGameObject *>(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

View File

@ -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;