Check if a zone type is NULL for both ITE and IHNM, as it's done in the original. This fixes the crash in IHNM when entering the second floor of the zeppelin and the crash in ITE when interacting with the bowl in the tunnel, outside the prison. Removed the two relevant hacks
svn-id: r27108
This commit is contained in:
parent
95821c97ee
commit
2f033e7a4c
2 changed files with 26 additions and 31 deletions
|
@ -464,7 +464,9 @@ void Script::doVerb() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objectType == kGameObjectHitZone) {
|
if (objectType == NULL)
|
||||||
|
return;
|
||||||
|
else if (objectType == kGameObjectHitZone) {
|
||||||
scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
|
scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
|
||||||
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0]));
|
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0]));
|
||||||
if ((hitZone->getFlags() & kHitZoneExit) == 0) {
|
if ((hitZone->getFlags() & kHitZoneExit) == 0) {
|
||||||
|
@ -485,21 +487,18 @@ void Script::doVerb() {
|
||||||
|
|
||||||
if (scriptEntrypointNumber > 0) {
|
if (scriptEntrypointNumber > 0) {
|
||||||
|
|
||||||
// WORKAROUND: Fixes bug #1690045 "ITE: Item description missing / ScummVM crash"
|
event.type = kEvTOneshot;
|
||||||
if (!(_vm->_scene->currentSceneNumber() == 278 && (_pendingObject[0] == 16419 || _pendingObject[1] == 16419) && _vm->getGameType() == GType_ITE)) {
|
event.code = kScriptEvent;
|
||||||
event.type = kEvTOneshot;
|
event.op = kEventExecNonBlocking;
|
||||||
event.code = kScriptEvent;
|
event.time = 0;
|
||||||
event.op = kEventExecNonBlocking;
|
event.param = scriptModuleNumber;
|
||||||
event.time = 0;
|
event.param2 = scriptEntrypointNumber;
|
||||||
event.param = scriptModuleNumber;
|
event.param3 = _pendingVerb; // Action
|
||||||
event.param2 = scriptEntrypointNumber;
|
event.param4 = _pendingObject[0]; // Object
|
||||||
event.param3 = _pendingVerb; // Action
|
event.param5 = _pendingObject[1]; // With Object
|
||||||
event.param4 = _pendingObject[0]; // Object
|
event.param6 = (objectType == kGameObjectActor) ? _pendingObject[0] : ID_PROTAG; // Actor
|
||||||
event.param5 = _pendingObject[1]; // With Object
|
|
||||||
event.param6 = (objectType == kGameObjectActor) ? _pendingObject[0] : ID_PROTAG; // Actor
|
|
||||||
|
|
||||||
_vm->_events->queue(&event);
|
_vm->_events->queue(&event);
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_vm->getExcuseInfo(_pendingVerb, excuseText, excuseSampleResourceId);
|
_vm->getExcuseInfo(_pendingVerb, excuseText, excuseSampleResourceId);
|
||||||
|
@ -620,7 +619,9 @@ void Script::playfieldClick(const Point& mousePoint, bool leftButton) {
|
||||||
|
|
||||||
hitZone = NULL;
|
hitZone = NULL;
|
||||||
|
|
||||||
if (objectTypeId(_pendingObject[0]) == kGameObjectHitZone) {
|
if (objectTypeId(_pendingObject[0]) == NULL)
|
||||||
|
return;
|
||||||
|
else if (objectTypeId(_pendingObject[0]) == kGameObjectHitZone) {
|
||||||
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0]));
|
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(_pendingObject[0]));
|
||||||
} else {
|
} else {
|
||||||
if ((_pendingVerb == getVerbType(kVerbUse)) && (objectTypeId(_pendingObject[1]) == kGameObjectHitZone)) {
|
if ((_pendingVerb == getVerbType(kVerbUse)) && (objectTypeId(_pendingObject[1]) == kGameObjectHitZone)) {
|
||||||
|
|
|
@ -386,11 +386,13 @@ void Script::sfScriptDoAction(SCRIPTFUNC_PARAMS) {
|
||||||
break;
|
break;
|
||||||
case kGameObjectHitZone:
|
case kGameObjectHitZone:
|
||||||
case kGameObjectStepZone:
|
case kGameObjectStepZone:
|
||||||
if (objectTypeId(objectId) == kGameObjectHitZone) {
|
if (objectTypeId(objectId) == NULL)
|
||||||
|
return;
|
||||||
|
else if (objectTypeId(objectId) == kGameObjectHitZone)
|
||||||
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId));
|
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId));
|
||||||
} else {
|
else
|
||||||
hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId));
|
hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId));
|
||||||
}
|
|
||||||
scriptEntryPointNumber = hitZone->getScriptNumber();
|
scriptEntryPointNumber = hitZone->getScriptNumber();
|
||||||
moduleNumber = _vm->_scene->getScriptModuleNumber();
|
moduleNumber = _vm->_scene->getScriptModuleNumber();
|
||||||
break;
|
break;
|
||||||
|
@ -729,20 +731,12 @@ void Script::sfEnableZone(SCRIPTFUNC_PARAMS) {
|
||||||
int16 flag = thread->pop();
|
int16 flag = thread->pop();
|
||||||
HitZone *hitZone;
|
HitZone *hitZone;
|
||||||
|
|
||||||
if (objectTypeId(objectId) == kGameObjectHitZone) {
|
if (objectTypeId(objectId) == NULL)
|
||||||
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId));
|
|
||||||
} else if (_vm->getGameType() == GType_IHNM && _vm->_scene->currentChapterNumber() == 1 &&
|
|
||||||
_vm->_scene->currentSceneNumber() == 14) {
|
|
||||||
// HACK: Don't disable the requested hitzone in room 14 in chapter 1 (Gorrister) of IHNM
|
|
||||||
// Apparently, this is used in that room to disable the tear at the very end of the
|
|
||||||
// corridor. This fixes the staircase in scenes 4 and 14
|
|
||||||
// FIXME: Remove this hack
|
|
||||||
warning("HACK: Prevent crash at staircase with Gorrister");
|
|
||||||
// Do nothing
|
|
||||||
return;
|
return;
|
||||||
} else {
|
else if (objectTypeId(objectId) == kGameObjectHitZone)
|
||||||
|
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId));
|
||||||
|
else
|
||||||
hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId));
|
hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId));
|
||||||
}
|
|
||||||
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
hitZone->setFlag(kHitZoneEnabled);
|
hitZone->setFlag(kHitZoneEnabled);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue