diff --git a/engines/asylum/resources/actor.cpp b/engines/asylum/resources/actor.cpp index 41c4b39e062..08e473a5206 100644 --- a/engines/asylum/resources/actor.cpp +++ b/engines/asylum/resources/actor.cpp @@ -1502,8 +1502,110 @@ void Actor::processNext(ActorIndex nextActor, int32 actionAreaId, ActorDirection updateDirection(); } -bool Actor::process_4069B0(int32 *x, int32 *y) { - error("[Actor::process_4069B0] Not implemented!"); +bool Actor::canInteract(Common::Point *point, int32* param) { + Actor *player = getScene()->getActor(); + + uint32 offset = 65; + if (getWorld()->chapter != kChapter2 || _index != 8) + offset = 40; + + int32 parameter = 5; + Common::Point pt = _point1 + _point2; + + if (getWorld()->chapter != kChapter2 || _index != 1) { + Common::Point diff = *player->getPoint1() - _point1; + + if (abs(diff.y) <= abs(diff.x)) { + + if (diff.x < 0) { + + parameter = 2; + pt.x -= offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 3; + pt.x -= offset; + pt.y += offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 1; + pt.x -= offset; + pt.y -= offset; + + } else { + + parameter = 6; + pt.x += offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 5; + pt.x += offset; + pt.y += offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 7; + pt.x += offset; + pt.y -= offset; + } + + } else { + + if (diff.y >= 0) { + + parameter = 4; + pt.y += offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 3; + pt.x -= offset; + pt.y += offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 5; + pt.x += offset; + pt.y += offset; + + } else { + + parameter = 0; + pt.y -= offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 1; + pt.x -= offset; + pt.y -= offset; + if (getScene()->findActionArea(kActionAreaType2, pt) != -1) + goto processActor; + + parameter = 7; + pt.x += offset; + pt.y -= offset; + } + } + } else { + parameter = 5; + pt.x += offset; + pt.y += offset; + } + + if (getScene()->findActionArea(kActionAreaType2, pt) == -1) + return false; + +processActor: + if (!process(pt)) + return false; + + *point = pt; + *param = abs(parameter + 4) & 7; + + return true; } bool Actor::canMove(Common::Point *point, ActorDirection direction, uint32 distance, bool hasDelta) { diff --git a/engines/asylum/resources/actor.h b/engines/asylum/resources/actor.h index 323e99aee8d..e66ae2f1228 100644 --- a/engines/asylum/resources/actor.h +++ b/engines/asylum/resources/actor.h @@ -256,7 +256,7 @@ public: bool process(const Common::Point &point); void processStatus(int32 actorX, int32 actorY, bool doSpeech); void processNext(ActorIndex nextActor, int32 actionAreaId, ActorDirection nextDirection, const Common::Point &nextPosition, bool invertPriority, const Common::Point &nextPositionOffset); - bool process_4069B0(int32 *x, int32 *y); + bool canInteract(Common::Point *point, int* param); bool canMove(Common::Point *point, ActorDirection direction, uint32 count, bool hasDelta); void move(ActorDirection dir, uint32 distance); void addReactionHive(int32 reactionIndex, int32 numberValue01Add); diff --git a/engines/asylum/resources/script.cpp b/engines/asylum/resources/script.cpp index 809fff9af61..27bbce8a952 100644 --- a/engines/asylum/resources/script.cpp +++ b/engines/asylum/resources/script.cpp @@ -1673,13 +1673,12 @@ IMPLEMENT_OPCODE(Interact) _currentQueueEntry->currentLine = cmd->param3; } } else { - int32 x = 0; - int32 y = 0; // FIXME: is is set somewhere else? + Common::Point point; - if (actor->process_4069B0(&x, &cmd->param4) == 1) { - getScene()->getActor()->processStatus(x, y, (bool)cmd->param4); - cmd->param6 = x; - cmd->param7 = y; + if (actor->canInteract(&point, &cmd->param4) == 1) { + getScene()->getActor()->processStatus(point.x, point.y, (bool)cmd->param4); + cmd->param6 = point.x; + cmd->param7 = point.y; if (cmd->param2 == 1) { cmd->param2 = 2;