/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* 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 3 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, see .
*
*/
#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/followpathlight.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/diary.h"
#include "engines/stark/services/global.h"
#include "engines/stark/services/resourceprovider.h"
#include "engines/stark/services/userinterface.h"
#include "engines/stark/services/settings.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 kScriptPauseSkippable:
return opScriptPauseSkippable(script, _arguments[1].referenceValue);
case kExit2DLocation:
return opExit2DLocation();
case kGoto2DLocation:
return opGoto2DLocation(_arguments[0].stringValue, _arguments[1].stringValue);
case kRumbleScene:
return opRumbleScene(script, _arguments[1].intValue, _arguments[2].intValue);
case kFadeScene:
return opFadeScene(script, _arguments[1].intValue, _arguments[2].intValue, _arguments[3].intValue);
case kSwayScene:
return opSwayScene(_arguments[1].intValue, _arguments[2].intValue, _arguments[3].intValue, _arguments[4].intValue);
case kGameEnd:
return opGameEnd();
case kInventoryOpen:
return opInventoryOpen(_arguments[1].intValue);
case kFloatScene:
return opFloatScene(_arguments[1].intValue, _arguments[2].intValue, _arguments[3].intValue);
case kBookOfSecretsOpen:
return opBookOfSecretsOpen();
case kDoNothing:
return opDoNothing();
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(script, _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 kItemAnimFollowPath:
return opItemAnimFollowPath(script, _arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].intValue, _arguments[4].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 kFullMotionVideoPlay:
return opFullMotionVideoPlay(script, _arguments[1].referenceValue, _arguments[2].intValue);
case kAnimSetFrame:
return opAnimSetFrame(_arguments[1].referenceValue, _arguments[2].referenceValue);
case kDiaryEnableEntry:
return opDiaryEnableEntry(_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 kLightFollowPath:
return opLightFollowPath(script, _arguments[1].referenceValue, _arguments[2].referenceValue, _arguments[3].referenceValue, _arguments[4].intValue, _arguments[5].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 kItemRotateDirection:
return opItemRotateDirection(script, _arguments[1].referenceValue, _arguments[2].intValue, _arguments[3].intValue, _arguments[4].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