/* ResidualVM - A 3D game interpreter * * ResidualVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the AUTHORS * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "engines/stark/resources/command.h" #include "engines/stark/debug.h" #include "engines/stark/formats/xrc.h" #include "engines/stark/movement/followpath.h" #include "engines/stark/movement/turn.h" #include "engines/stark/movement/walk.h" #include "engines/stark/resources/anim.h" #include "engines/stark/resources/animhierarchy.h" #include "engines/stark/resources/animscript.h" #include "engines/stark/resources/bookmark.h" #include "engines/stark/resources/bonesmesh.h" #include "engines/stark/resources/camera.h" #include "engines/stark/resources/dialog.h" #include "engines/stark/resources/floor.h" #include "engines/stark/resources/floorfield.h" #include "engines/stark/resources/fmv.h" #include "engines/stark/resources/item.h" #include "engines/stark/resources/knowledge.h" #include "engines/stark/resources/layer.h" #include "engines/stark/resources/light.h" #include "engines/stark/resources/location.h" #include "engines/stark/resources/path.h" #include "engines/stark/resources/pattable.h" #include "engines/stark/resources/script.h" #include "engines/stark/resources/scroll.h" #include "engines/stark/resources/sound.h" #include "engines/stark/resources/speech.h" #include "engines/stark/resources/string.h" #include "engines/stark/resources/textureset.h" #include "engines/stark/services/services.h" #include "engines/stark/services/dialogplayer.h" #include "engines/stark/services/global.h" #include "engines/stark/services/resourceprovider.h" #include "engines/stark/services/userinterface.h" #include "common/random.h" namespace Stark { namespace Resources { Command::~Command() { } Command::Command(Object *parent, byte subType, uint16 index, const Common::String &name) : Object(parent, subType, index, name) { _type = TYPE; } Command *Command::execute(uint32 callMode, Script *script) { switch (_subType) { case kCommandBegin: return opScriptBegin(); case kScriptCall: return opScriptCall(script, _arguments[1].referenceValue, _arguments[2].intValue); case kDialogCall: return opDialogCall(script, _arguments[1].referenceValue, _arguments[2].intValue); case kSetInteractiveMode: return opSetInteractiveMode(_arguments[1].intValue); case kLocationGoTo: case kLocationGoToNewCD: return opLocationGoTo(_arguments[0].stringValue, _arguments[1].stringValue, _arguments[2].referenceValue, _arguments[3].intValue); case kScriptPause: return opScriptPause(script, _arguments[1].referenceValue); case kScriptAbort: return opScriptAbort(_arguments[1].referenceValue, _arguments[2].intValue); case kWalkTo: return opWalkTo(script, _arguments[2].referenceValue, _arguments[3].intValue); case kGameLoop: return opScriptPauseGameLoop(script, _arguments[1].intValue); case kScriptPauseRandom: return opScriptPauseRandom(script, _arguments[1].referenceValue); case kExit2DLocation: return opExit2DLocation(); case kGoto2DLocation: return opGoto2DLocation(_arguments[0].stringValue, _arguments[1].stringValue); case kRumbleScene: return opRumbleScene(_arguments[1].intValue, _arguments[2].intValue); case kFadeScene: return opFadeScene(_arguments[1].intValue, _arguments[2].intValue, _arguments[3].intValue); case kGameEnd: return opGameEnd(); case kInventoryOpen: return opInventoryOpen(_arguments[1].intValue); case kItem3DPlaceOn: return opItem3DPlaceOn(_arguments[1].referenceValue, _arguments[2].referenceValue); case kItem3DWalkTo: return opItem3DWalkTo(script, _arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue); case kItem3DFollowPath: case kItem2DFollowPath: return opItemFollowPath(script, _arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue, _arguments[4].intValue); case kItemLookAt: return opItemLookAt(script, _arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue, _arguments[4].intValue); case kItemEnable: return opItemEnable(_arguments[1].referenceValue, _arguments[2].intValue); case kItemSelectInInventory: return opItemSelectInInventory(_arguments[1].referenceValue); case kItemSetActivity: return opItemSetActivity(_arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue); case kUseAnimHierarchy: return opUseAnimHierachy(_arguments[1].referenceValue); case kPlayAnimation: return opPlayAnimation(script, _arguments[1].referenceValue, _arguments[2].intValue); case kShowPlay: return opShowPlay(script, _arguments[1].referenceValue, _arguments[2].intValue); case kScriptEnable: return opScriptEnable(_arguments[1].referenceValue, _arguments[2].intValue); case kKnowledgeSetBoolean: return opKnowledgeSetBoolean(_arguments[1].referenceValue, _arguments[2].intValue); case kKnowledgeSetInteger: return opKnowledgeSetInteger(_arguments[1].referenceValue, _arguments[2].intValue); case kKnowledgeAddInteger: return opKnowledgeAddInteger(_arguments[1].referenceValue, _arguments[2].intValue); case kKnowledgeSetIntRandom: return opKnowledgeSetIntRandom(_arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue); case kKnowledgeSubValue: return opKnowledgeSubValue(_arguments[1].referenceValue, _arguments[2].referenceValue); case kEnableFloorField: return opEnableFloorField(_arguments[1].referenceValue, _arguments[2].intValue); case kPlayAnimScriptItem: return opPlayAnimScriptItem(script, _arguments[1].referenceValue, _arguments[2].intValue); case kKnowledgeAssignBool: return opKnowledgeAssignBool(_arguments[1].referenceValue, _arguments[2].referenceValue); case kKnowledgeAssignNegatedBool: return opKnowledgeAssignNegatedBool(_arguments[1].referenceValue, _arguments[2].referenceValue); case kKnowledgeAssignInteger: return opKnowledgeAssignInteger(_arguments[1].referenceValue, _arguments[2].referenceValue); case kLocationScrollTo: return opLocationScrollTo(script, _arguments[1].referenceValue, _arguments[2].intValue); case kSoundPlay: return opSoundPlay(script, _arguments[1].referenceValue, _arguments[2].intValue); case kItemLookDirection: return opItemLookDirection(script, _arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue); case kStopPlayingSound: return opStopPlayingSound(_arguments[1].referenceValue); case kLayerGoTo: return opLayerGoTo(_arguments[1].referenceValue); case kLayerEnable: return opLayerEnable(_arguments[1].referenceValue, _arguments[2].intValue); case kLocationScrollSet: return opLocationScrollSet(_arguments[1].referenceValue); case kPlayFullMotionVideo: return opPlayFullMotionVideo(script, _arguments[1].referenceValue, _arguments[2].intValue); case kAnimSetFrame: return opAnimSetFrame(_arguments[1].referenceValue, _arguments[2].referenceValue); case kEnableDiaryEntry: return opEnableDiaryEntry(_arguments[1].referenceValue); case kPATChangeTooltip: return opPATChangeTooltip(_arguments[1].referenceValue, _arguments[2].referenceValue); case kSoundChange: return opSoundChange(script, _arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue, _arguments[4].intValue, _arguments[5].intValue); case kLightSetColor: return opLightSetColor(_arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue, _arguments[4].intValue); case kItem3DRunTo: return opItem3DRunTo(script, _arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue); case kItemPlaceDirection: return opItemPlaceDirection(_arguments[1].referenceValue, _arguments[2].intValue); case kActivateTexture: return opActivateTexture(_arguments[1].referenceValue); case kActivateMesh: return opActivateMesh(_arguments[1].referenceValue); case kItem3DSetWalkTarget: return opItem3DSetWalkTarget(_arguments[1].referenceValue, _arguments[2].referenceValue); case kSpeakWithoutTalking: return opSpeakWithoutTalking(script, _arguments[1].referenceValue, _arguments[2].intValue); case kIsOnFloorField: return opIsOnFloorField(_arguments[2].referenceValue, _arguments[3].referenceValue); case kIsItemEnabled: return opIsItemEnabled(_arguments[2].referenceValue); case kIsScriptEnabled: return opIsScriptEnabled(_arguments[2].referenceValue); case kIsKnowledgeBooleanSet: return opIsKnowledgeBooleanSet(_arguments[2].referenceValue); case kIsKnowledgeIntegerInRange: return opIsKnowledgeIntegerInRange(_arguments[2].referenceValue, _arguments[3].intValue, _arguments[4].intValue); case kIsKnowledgeIntegerAbove: return opIsKnowledgeIntegerAbove(_arguments[2].referenceValue, _arguments[3].intValue); case kIsKnowledgeIntegerEqual: return opIsKnowledgeIntegerEqual(_arguments[2].referenceValue, _arguments[3].intValue); case kIsKnowledgeIntegerLower: return opIsKnowledgeIntegerLower(_arguments[2].referenceValue, _arguments[3].intValue); case kIsScriptActive: return opIsScriptActive(_arguments[2].referenceValue); case kIsRandom: return opIsRandom(_arguments[2].intValue); case kIsAnimScriptItemReached: return opIsAnimScriptItemReached(_arguments[2].referenceValue); case kIsItemOnPlace: return opIsItemOnPlace(_arguments[2].referenceValue, _arguments[3].referenceValue); case kIsItemNearPlace: return opIsItemNearPlace(_arguments[2].referenceValue, _arguments[3].referenceValue, _arguments[4].intValue); case kIsAnimPlaying: return opIsAnimPlaying(_arguments[2].referenceValue); case kIsItemActivity: return opIsItemActivity(_arguments[2].referenceValue, _arguments[3].intValue); case kIsAnimAtTime: return opIsAnimAtTime(_arguments[2].referenceValue, _arguments[3].intValue); case kIsLocation2D: return opIsLocation2D(); case kIsInventoryOpen: return opIsInventoryOpen(); default: warning("Unimplemented command %d - %s", _subType, _name.c_str()); printData(); break; } return nextCommand(); } Command *Command::opScriptBegin() { return nextCommand(); } Command *Command::opScriptCall(Script *script, const ResourceReference &scriptRef, int32 synchronous) { Script *calleeScript = scriptRef.resolve