aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/script.cpp')
-rw-r--r--engines/saga/script.cpp130
1 files changed, 95 insertions, 35 deletions
diff --git a/engines/saga/script.cpp b/engines/saga/script.cpp
index 2df5c4da14..262d63c51f 100644
--- a/engines/saga/script.cpp
+++ b/engines/saga/script.cpp
@@ -456,6 +456,9 @@ void Script::doVerb() {
} else {
scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
}
+ // IHNM never sets scriptModuleNumber to 0
+ if (_vm->getGameType() == GType_IHNM)
+ scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
} else {
if (_pendingVerb == getVerbType(kVerbUse)) {
if ((objectTypeId(_pendingObject[1]) > kGameObjectNone) && (objectType < objectTypeId(_pendingObject[1]))) {
@@ -464,9 +467,15 @@ void Script::doVerb() {
}
}
- if (objectType == kGameObjectHitZone) {
+ if (objectType == 0)
+ return;
+ else if (objectType == kGameObjectHitZone) {
scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0]));
+
+ if (hitZone == NULL)
+ return;
+
if ((hitZone->getFlags() & kHitZoneExit) == 0) {
scriptEntrypointNumber = hitZone->getScriptNumber();
}
@@ -479,27 +488,27 @@ void Script::doVerb() {
} else {
scriptModuleNumber = 0;
}
+ // IHNM never sets scriptModuleNumber to 0
+ if (_vm->getGameType() == GType_IHNM)
+ scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
}
}
}
if (scriptEntrypointNumber > 0) {
- // WORKAROUND: Fixes bug #1690045 "ITE: Item description missing / ScummVM crash"
- if (!(_vm->_scene->currentSceneNumber() == 278 && (_pendingObject[0] == 16419 || _pendingObject[1] == 16419) && _vm->getGameType() == GType_ITE)) {
- event.type = kEvTOneshot;
- event.code = kScriptEvent;
- event.op = kEventExecNonBlocking;
- event.time = 0;
- event.param = scriptModuleNumber;
- event.param2 = scriptEntrypointNumber;
- event.param3 = _pendingVerb; // Action
- event.param4 = _pendingObject[0]; // Object
- event.param5 = _pendingObject[1]; // With Object
- event.param6 = (objectType == kGameObjectActor) ? _pendingObject[0] : ID_PROTAG; // Actor
-
- _vm->_events->queue(&event);
- }
+ event.type = kEvTOneshot;
+ event.code = kScriptEvent;
+ event.op = kEventExecNonBlocking;
+ event.time = 0;
+ event.param = scriptModuleNumber;
+ event.param2 = scriptEntrypointNumber;
+ event.param3 = _pendingVerb; // Action
+ event.param4 = _pendingObject[0]; // Object
+ event.param5 = _pendingObject[1]; // With Object
+ event.param6 = (objectType == kGameObjectActor) ? _pendingObject[0] : ID_PROTAG; // Actor
+
+ _vm->_events->queue(&event);
} else {
_vm->getExcuseInfo(_pendingVerb, excuseText, excuseSampleResourceId);
@@ -589,6 +598,7 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
const HitZone *hitZone;
Point specialPoint;
+ _vm->incrementMouseClickCount();
_vm->_actor->abortSpeech();
if ((_vm->_actor->_protagonist->_currentAction != kActionWait) &&
@@ -629,10 +639,19 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
}
if (hitZone != NULL) {
- if (hitZone->getFlags() & kHitZoneNoWalk) {
- _vm->_actor->actorFaceTowardsPoint(ID_PROTAG, pickLocation);
- doVerb();
- return;
+ if (_vm->getGameType() == GType_ITE) {
+ if (hitZone->getFlags() & kHitZoneNoWalk) {
+ _vm->_actor->actorFaceTowardsPoint(ID_PROTAG, pickLocation);
+ doVerb();
+ return;
+ }
+ } else {
+ if (_vm->getGameType() == GType_IHNM) {
+ if ((hitZone->getFlags() & kHitZoneNoWalk) && (_pendingVerb != getVerbType(kVerbWalkTo))) {
+ doVerb();
+ return;
+ }
+ }
}
if (hitZone->getFlags() & kHitZoneProject) {
@@ -653,26 +672,64 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
}
}
- if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
- (_pendingVerb == getVerbType(kVerbPickUp)) ||
- (_pendingVerb == getVerbType(kVerbOpen)) ||
- (_pendingVerb == getVerbType(kVerbClose)) ||
- (_pendingVerb == getVerbType(kVerbUse))) {
- _vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
- } else {
- if (_pendingVerb == getVerbType(kVerbLookAt)) {
- if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) {
+ if (_vm->getGameType() == GType_ITE) {
+ if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
+ (_pendingVerb == getVerbType(kVerbPickUp)) ||
+ (_pendingVerb == getVerbType(kVerbOpen)) ||
+ (_pendingVerb == getVerbType(kVerbClose)) ||
+ (_pendingVerb == getVerbType(kVerbUse))) {
_vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+ } else {
+ if (_pendingVerb == getVerbType(kVerbLookAt)) {
+ if (objectTypeId(_pendingObject[0]) != kGameObjectActor ) {
+ _vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+ } else {
+ doVerb();
+ }
} else {
- doVerb();
+ if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
+ (_pendingVerb == getVerbType(kVerbGive))) {
+ doVerb();
+ }
}
+ }
+ }
+
+ if (_vm->getGameType() == GType_IHNM) {
+
+ if ((_pendingVerb == getVerbType(kVerbWalkTo)) ||
+ (_pendingVerb == getVerbType(kVerbPickUp)) ||
+ (_pendingVerb == getVerbType(kVerbOpen)) ||
+ (_pendingVerb == getVerbType(kVerbClose)) ||
+ (_pendingVerb == getVerbType(kVerbUse))) {
+ _vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+
+ // Auto-use no-walk hitzones in IHNM, needed for Benny's chapter
+ if (_pendingVerb == getVerbType(kVerbWalkTo) &&
+ hitZone != NULL && (hitZone->getFlags() & kHitZoneNoWalk)) {
+ _pendingVerb = getVerbType(kVerbUse);
+ if (objectTypeId(_pendingObject[0]) == kGameObjectActor) {
+ _vm->_actor->actorFaceTowardsObject(ID_PROTAG, _pendingObject[0]);
+ doVerb();
+ }
+ }
} else {
- if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
- (_pendingVerb == getVerbType(kVerbGive))) {
+ if (_pendingVerb == getVerbType(kVerbLookAt)) {
+ if (objectTypeId(_pendingObject[0]) != kGameObjectActor) {
+ _vm->_actor->actorWalkTo(ID_PROTAG, pickLocation);
+ } else {
+ _vm->_actor->actorFaceTowardsObject(ID_PROTAG, _pendingObject[0]);
doVerb();
+ }
+ } else {
+ if ((_pendingVerb == getVerbType(kVerbTalkTo)) ||
+ (_pendingVerb == getVerbType(kVerbGive))) {
+ doVerb();
+ }
}
}
}
+
}
void Script::whichObject(const Point& mousePoint) {
@@ -710,7 +767,8 @@ void Script::whichObject(const Point& mousePoint) {
} else {
actor = _vm->_actor->getActor(newObjectId);
objectId = newObjectId;
- objectFlags = kObjUseWith;
+ if (_vm->getGameType() == GType_ITE)
+ objectFlags = kObjUseWith;
newRightButtonVerb = getVerbType(kVerbTalkTo);
if ((_currentVerb == getVerbType(kVerbPickUp)) ||
@@ -718,8 +776,10 @@ void Script::whichObject(const Point& mousePoint) {
(_currentVerb == getVerbType(kVerbClose)) ||
((_currentVerb == getVerbType(kVerbGive)) && !_firstObjectSet) ||
((_currentVerb == getVerbType(kVerbUse)) && !(actor->_flags & kFollower))) {
- objectId = ID_NOTHING;
- newObjectId = ID_NOTHING;
+ if (_vm->getGameType() == GType_ITE) {
+ objectId = ID_NOTHING;
+ newObjectId = ID_NOTHING;
+ }
}
}
}