const char *SagaEngine::getObjectName(uint16 objectId) const { ActorData *actor; ObjectData *obj; const HitZone *hitZone; // Disable the object names in IHNM when the chapter is 8 if (getGameId() == GID_IHNM && _scene->currentChapterNumber() == 8) return ""; switch (objectTypeId(objectId)) { case kGameObjectObject: obj = _actor->getObj(objectId); if (getGameId() == GID_ITE) return _script->_mainStrings.getString(obj->_nameIndex); return _actor->_objectsStrings.getString(obj->_nameIndex); case kGameObjectActor: actor = _actor->getActor(objectId); return _actor->_actorsStrings.getString(actor->_nameIndex); case kGameObjectHitZone: hitZone = _scene->_objectMap->getHitZone(objectIdToIndex(objectId)); if (hitZone == NULL) return ""; return _scene->_sceneStrings.getString(hitZone->getNameIndex()); } warning("SagaEngine::getObjectName name not found for 0x%X", objectId); return NULL; }
// Script function #28 (0x1C) void Script::sfEnableZone(SCRIPTFUNC_PARAMS) { uint16 objectId = thread->pop(); int16 flag = thread->pop(); HitZone *hitZone; if (objectTypeId(objectId) == kGameObjectHitZone) { hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId)); } else { hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId)); } if (flag) { hitZone->setFlag(kHitZoneEnabled); } else { hitZone->clearFlag(kHitZoneEnabled); _vm->_actor->_protagonist->_lastZone = NULL; } }
// Script function #7 (0x07) // Param1: actor id // Param2: action // Param3: theObject // Param4: withObject void Script::sfScriptDoAction(SCRIPTFUNC_PARAMS) { uint16 objectId = thread->pop(); uint16 action = thread->pop(); uint16 theObject = thread->pop(); uint16 withObject = thread->pop(); int16 scriptEntryPointNumber; int16 moduleNumber; ActorData *actor; ObjectData *obj; const HitZone *hitZone; Event event; // If the player uses an object and then immediately reuses that object // (without it being shown in the verb area), the object returned is wrong (0), // so we make it equal to the second object here. // Fixes bug #1861863 - "ITE: Crash when using Eeah with Eeah" if (theObject == 0 && objectId == 0 && withObject > 0) theObject = objectId = withObject; switch (objectTypeId(objectId)) { case kGameObjectObject: obj = _vm->_actor->getObj(objectId); scriptEntryPointNumber = obj->_scriptEntrypointNumber; if (scriptEntryPointNumber <= 0) { return; } moduleNumber = 0; if (_vm->getGameId() == GID_IHNM) moduleNumber = _vm->_scene->getScriptModuleNumber(); break; case kGameObjectActor: actor = _vm->_actor->getActor(objectId); scriptEntryPointNumber = actor->_scriptEntrypointNumber; if (scriptEntryPointNumber <= 0) { return; } if (actor->_flags & (kProtagonist | kFollower)) { moduleNumber = 0; } else { moduleNumber = _vm->_scene->getScriptModuleNumber(); } if (_vm->getGameId() == GID_IHNM) moduleNumber = _vm->_scene->getScriptModuleNumber(); break; case kGameObjectHitZone: case kGameObjectStepZone: if (objectTypeId(objectId) == kGameObjectHitZone) hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId)); else hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId)); if (hitZone == NULL) return; scriptEntryPointNumber = hitZone->getScriptNumber(); moduleNumber = _vm->_scene->getScriptModuleNumber(); break; default: // Unknown case, do nothing warning("Script::sfScriptDoAction wrong object type 0x%X", objectId); return; } event.type = kEvTOneshot; event.code = kScriptEvent; event.op = kEventExecNonBlocking; event.time = 0; event.param = moduleNumber; event.param2 = scriptEntryPointNumber; event.param3 = action; // Action event.param4 = theObject; // Object event.param5 = withObject; // With Object event.param6 = objectId; _vm->_events->queue(event); }
// Script function #7 (0x07) // Param1: actor id // Param2: action // Param3: theObject // Param4: withObject void Script::sfScriptDoAction(SCRIPTFUNC_PARAMS) { uint16 objectId; uint16 action; uint16 theObject; uint16 withObject; int16 scriptEntryPointNumber; int16 moduleNumber; ActorData *actor; ObjectData *obj; const HitZone *hitZone; Event event; objectId = thread->pop(); action = thread->pop(); theObject = thread->pop(); withObject = thread->pop(); switch (objectTypeId(objectId)) { case kGameObjectObject: obj = _vm->_actor->getObj(objectId); scriptEntryPointNumber = obj->_scriptEntrypointNumber; if (scriptEntryPointNumber <= 0) { return; } moduleNumber = 0; break; case kGameObjectActor: actor = _vm->_actor->getActor(objectId); scriptEntryPointNumber = actor->_scriptEntrypointNumber; if (scriptEntryPointNumber <= 0) { return; } if (actor->_flags & (kProtagonist | kFollower)) { moduleNumber = 0; } else { moduleNumber = _vm->_scene->getScriptModuleNumber(); } break; case kGameObjectHitZone: case kGameObjectStepZone: if (objectTypeId(objectId) == kGameObjectHitZone) { hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId)); } else { hitZone = _vm->_scene->_actionMap->getHitZone(objectIdToIndex(objectId)); } scriptEntryPointNumber = hitZone->getScriptNumber(); moduleNumber = _vm->_scene->getScriptModuleNumber(); break; default: error("Script::sfScriptDoAction wrong object type 0x%X", objectId); } event.type = kEvTOneshot; event.code = kScriptEvent; event.op = kEventExecNonBlocking; event.time = 0; event.param = moduleNumber; event.param2 = scriptEntryPointNumber; event.param3 = action; // Action event.param4 = theObject; // Object event.param5 = withObject; // With Object event.param6 = objectId; _vm->_events->queue(&event); }