/* 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/resources/animscript.h" #include "engines/stark/resources/bookmark.h" #include "engines/stark/resources/bonesmesh.h" #include "engines/stark/resources/dialog.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/script.h" #include "engines/stark/resources/sound.h" #include "engines/stark/resources/speech.h" #include "engines/stark/resources/textureset.h" #include "engines/stark/services/services.h" #include "engines/stark/services/dialogplayer.h" #include "engines/stark/services/resourceprovider.h" #include "engines/stark/ui.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: return opLocationGoTo(_arguments[0].stringValue, _arguments[1].stringValue, _arguments[2].referenceValue, _arguments[3].intValue); case kScriptPause: return opScriptPause(script, _arguments[1].referenceValue); case kWalkTo: return opWalkTo(_arguments[1].intValue, _arguments[2].referenceValue, _arguments[3].intValue); case kGameLoop: return opGameLoop(_arguments[1].intValue); case kScriptPauseRandom: return opPauseRandom(script, _arguments[1].referenceValue); case kExit2DLocation: return opExit2DLocation(script); 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 kItem3DPlaceOn: return opItem3DPlaceOn(_arguments[1].referenceValue, _arguments[2].referenceValue); case kItem3DWalkTo: return opItem3DWalkTo(_arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue); case kItemLookAt: return opItemLookAt(_arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue, _arguments[4].intValue); case kItemEnable: return opItemEnable(_arguments[1].referenceValue, _arguments[2].intValue); case kItemSetActivity: return opItemSetActivity(_arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue); case kUseAnimHierarchy: return opUseAnimHierachy(_arguments[1].referenceValue); case kPlayAnimation: return opPlayAnimation(_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 kSetBoolean: return opSetBoolean(_arguments[1].referenceValue, _arguments[2].intValue); case kSetInteger: return opSetInteger(_arguments[1].referenceValue, _arguments[2].intValue); case kEnableFloorField: return opEnableFloorField(_arguments[1].referenceValue, _arguments[2].intValue); case kPlayAnimScriptItem: return opPlayAnimScriptItem(_arguments[1].referenceValue, _arguments[2].intValue); case kSoundPlay: return opSoundPlay(script, _arguments[1].referenceValue, _arguments[2].intValue); case kLookDirection: return opLookDirection(_arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue); case kStopPlayingSound: return opStopPlayingSound(_arguments[1].referenceValue); case kGoLayer: return opGoLayer(_arguments[1].referenceValue); case kScrollSet: return opScrollSet(_arguments[1].referenceValue); case kPlayFullMotionVideo: return opPlayFullMotionVideo(script, _arguments[1].referenceValue, _arguments[2].intValue); case kEnableDiaryEntry: return opEnableDiaryEntry(_arguments[1].referenceValue); case kChangeSound: return opChangeSound(_arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue, _arguments[4].intValue, _arguments[5].intValue); case kItem3DRunTo: return opItem3DRunTo(_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 kSetTarget: return opSetTarget(_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 kIsSet: return opIsSet(_arguments[2].referenceValue); case kIsIntegerInRange: return opIsIntegerInRange(_arguments[2].referenceValue, _arguments[3].intValue, _arguments[4].intValue); case kIsIntegerAbove: return opIsIntegerAbove(_arguments[2].referenceValue, _arguments[3].intValue); case kIsIntegerEqual: return opIsIntegerEqual(_arguments[2].referenceValue, _arguments[3].intValue); case kIsIntegerLower: return opIsIntegerLower(_arguments[2].referenceValue, _arguments[3].intValue); case kIsScriptActive: return opIsScriptActive(_arguments[2].referenceValue); case kIsRandom: return opIsRandom(_arguments[2].intValue); case kIsOnPlace: return opIsOnPlace(_arguments[0].intValue, _arguments[1].intValue, _arguments[2].referenceValue, _arguments[3].referenceValue); case kIsOnNearPlace: return opIsOnNearPlace(_arguments[0].intValue, _arguments[1].intValue, _arguments[2].referenceValue, _arguments[3].referenceValue, _arguments[4].intValue); case kIsAnimPlaying: return opIsAnimPlaying(_arguments[0].intValue, _arguments[1].intValue, _arguments[2].referenceValue); case kIsAnimAtTime: return opIsAnimAtTime(_arguments[0].intValue, _arguments[1].intValue, _arguments[2].referenceValue, _arguments[3].intValue); 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