diff options
Diffstat (limited to 'saga/actor.cpp')
-rw-r--r-- | saga/actor.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp index 5109293e5b..7b722c6f75 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -1256,11 +1256,33 @@ void Actor::calcScreenPosition(CommonObjectData *commonObjectData) { } uint16 Actor::hitTest(const Point &testPoint, bool skipProtagonist) { + // We can only interact with objects or actors that are inside the + // scene area. While this is usually the upper part of the screen, it + // could also be an inset. Note that other kinds of hit areas may be + // outside the inset, and that those are still perfectly fine to + // interact with. For example, the door entrance at the glass makers + // in ITE's ferret village. + + SCENE_BGINFO bg_info; + Common::Rect sceneRect; + + _vm->_scene->getBGInfo(&bg_info); + + sceneRect.left = bg_info.bg_x; + sceneRect.top = bg_info.bg_y; + sceneRect.right = bg_info.bg_x + bg_info.bg_w; + sceneRect.bottom = bg_info.bg_y + bg_info.bg_h; + + if (!sceneRect.contains(testPoint)) + return ID_NOTHING; + CommonObjectOrderList::iterator drawOrderIterator; CommonObjectDataPointer drawObject; int frameNumber; SpriteList *spriteList; + createDrawOrderList(); + for (drawOrderIterator = _drawOrderList.begin(); drawOrderIterator != _drawOrderList.end(); ++drawOrderIterator) { drawObject = drawOrderIterator.operator*(); if (skipProtagonist && (drawObject == _protagonist)) { |