diff options
-rw-r--r-- | saga/actor.cpp | 22 | ||||
-rw-r--r-- | saga/sprite.cpp | 13 |
2 files changed, 30 insertions, 5 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)) { diff --git a/saga/sprite.cpp b/saga/sprite.cpp index ac07ec3cf4..64447eefa0 100644 --- a/saga/sprite.cpp +++ b/saga/sprite.cpp @@ -338,10 +338,14 @@ int Sprite::drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, spriteSourceRect.right = width; spriteSourceRect.bottom = height; - spriteDestRect.left = 0; - spriteDestRect.top = 0; - spriteDestRect.right = ds->clip_rect.right; - spriteDestRect.bottom = MIN(ds->clip_rect.bottom, (int16)maskHeight); + SCENE_BGINFO bg_info; + + _vm->_scene->getBGInfo(&bg_info); + + spriteDestRect.left = bg_info.bg_x; + spriteDestRect.top = bg_info.bg_y; + spriteDestRect.right = bg_info.bg_x + bg_info.bg_w; + spriteDestRect.bottom = bg_info.bg_y + bg_info.bg_h; ci.dst_rect = &spriteDestRect; ci.src_rect = &spriteSourceRect; @@ -353,7 +357,6 @@ int Sprite::drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, return SUCCESS; } - // Finally, draw the occluded sprite src_row_p = spriteBuffer + ci.src_draw_x + (ci.src_draw_y * width); |