diff options
Diffstat (limited to 'engines/bladerunner/script/script.cpp')
-rw-r--r-- | engines/bladerunner/script/script.cpp | 205 |
1 files changed, 165 insertions, 40 deletions
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp index 45b23120d5..bc6679051c 100644 --- a/engines/bladerunner/script/script.cpp +++ b/engines/bladerunner/script/script.cpp @@ -48,7 +48,8 @@ #include "bladerunner/waypoints.h" #include "bladerunner/script/ai_00_mccoy.h" -#include "bladerunner/script/aiscript_officer_leroy.h" +#include "bladerunner/script/ai_15_runciter.h" +#include "bladerunner/script/ai_23_officer_leroy.h" namespace BladeRunner { @@ -190,7 +191,7 @@ void ScriptBase::Actor_Set_At_XYZ(int actorId, float x, float y, float z, int di } void ScriptBase::Actor_Set_At_Waypoint(int actorId, int waypointId, int angle) { - _vm->_actors[actorId]->setAtWaypoint(waypointId, angle, 0, 0); + _vm->_actors[actorId]->setAtWaypoint(waypointId, angle, 0, false); } bool ScriptBase::Region_Check(int left, int top, int right, int down) { @@ -500,11 +501,11 @@ bool ScriptBase::Actor_Query_In_Between_Two_Actors(int actorId, int otherActor1I float z1 = _vm->_actors[otherActor1Id]->getZ(); float x2 = _vm->_actors[otherActor2Id]->getX(); float z2 = _vm->_actors[otherActor2Id]->getZ(); - return _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1, z1, x2, z1) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 - 12.0f, z1 - 12.0f, x2 - 12.0f, z2 - 12.0f) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 + 12.0f, z1 - 12.0f, x2 + 12.0f, z2 - 12.0f) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 + 12.0f, z1 + 12.0f, x2 + 12.0f, z2 + 12.0f) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 - 12.0f, z1 + 12.0f, x2 - 12.0f, z2 + 12.0f); + return _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1, z1, x2, z1) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 - 12.0f, z1 - 12.0f, x2 - 12.0f, z2 - 12.0f) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 + 12.0f, z1 - 12.0f, x2 + 12.0f, z2 - 12.0f) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 + 12.0f, z1 + 12.0f, x2 + 12.0f, z2 + 12.0f) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 - 12.0f, z1 + 12.0f, x2 - 12.0f, z2 + 12.0f); } void ScriptBase::Actor_Set_Goal_Number(int actorId, int goalNumber) { @@ -542,26 +543,61 @@ int ScriptBase::Actor_Query_Animation_Mode(int actorId) { } bool ScriptBase::Loop_Actor_Walk_To_Actor(int actorId, int otherActorId, int a3, int a4, bool run) { - //TODO - warning("Loop_Actor_Walk_To_Actor(%d, %d, %d, %d, %d)", actorId, otherActorId, a3, a4, run); - return false; + _vm->gameWaitForActive(); + + if (actorId == _vm->_walkingActorId) { + run = true; + } + _vm->_playerActorIdle = false; + bool isRunning; + bool result = _vm->_actors[actorId]->loopWalkToActor(otherActorId, a3, a4, run, true, &isRunning); + if (_vm->_playerActorIdle) { + result = true; + _vm->_playerActorIdle = false; + } + if (isRunning == 1) { + _vm->_walkingActorId = actorId; + } + Global_Variable_Set(37, actorId); + Global_Variable_Set(38, isRunning); + return result; } bool ScriptBase::Loop_Actor_Walk_To_Item(int actorId, int itemId, int a3, int a4, bool run) { - //TODO - warning("Loop_Actor_Walk_To_Item(%d, %d, %d, %d, %d)", actorId, itemId, a3, a4, run); - return false; + _vm->gameWaitForActive(); + + if (_vm->_walkingActorId == actorId) { + run = true; + } + _vm->_playerActorIdle = false; + bool isRunning; + bool result = _vm->_actors[actorId]->loopWalkToItem(itemId, a3, a4, run, true, &isRunning); + if (_vm->_playerActorIdle == 1) { + result = true; + _vm->_playerActorIdle = false; + } + if (isRunning == 1) { + _vm->_walkingActorId = actorId; + } + Global_Variable_Set(37, actorId); + Global_Variable_Set(38, isRunning); + return result; } bool ScriptBase::Loop_Actor_Walk_To_Scene_Object(int actorId, const char *objectName, int destinationOffset, bool a4, bool run) { _vm->gameWaitForActive(); - if(_vm->_walkingActorId == actorId) { + if (_vm->_walkingActorId == actorId) { run = true; } + _vm->_playerActorIdle = false; bool isRunning; bool result = _vm->_actors[actorId]->loopWalkToSceneObject(objectName, destinationOffset, a4, run, true, &isRunning); - if(isRunning == 1) { + if (_vm->_playerActorIdle) { + result = true; + _vm->_playerActorIdle = false; + } + if (isRunning == 1) { _vm->_walkingActorId = actorId; } Global_Variable_Set(37, actorId); @@ -1070,28 +1106,21 @@ void ScriptBase::Scene_2D_Region_Remove(int index) { _vm->_scene->_regions->remove(index); } -void ScriptBase::World_Waypoint_Set(int waypointId, int sceneId, float x, float y, float z) { - //TODO - warning("World_Waypoint_Set(%d, %d, %f, %f, %f)", waypointId, sceneId, x, y, z); +void ScriptBase::World_Waypoint_Set(int waypointId, int setId, float x, float y, float z) { + _vm->_waypoints->set(waypointId, setId, Vector3(x, y, z)); } // ScriptBase::World_Waypoint_Reset float ScriptBase::World_Waypoint_Query_X(int waypointId) { - //TODO - warning("World_Waypoint_Query_X(%d)", waypointId); - return 0.0f; + return _vm->_waypoints->getX(waypointId); } float ScriptBase::World_Waypoint_Query_Y(int waypointId) { - //TODO - warning("World_Waypoint_Query_Y(%d)", waypointId); - return 0.0f; + return _vm->_waypoints->getY(waypointId); } float ScriptBase::World_Waypoint_Query_Z(int waypointId) { - //TODO - warning("World_Waypoint_Query_Z(%d)", waypointId); - return 0.0f; + return _vm->_waypoints->getZ(waypointId); } void ScriptBase::Combat_Cover_Waypoint_Set_Data(int combatCoverId, int a2, int sceneId, int a4, float x, float y, float z) { @@ -1243,7 +1272,7 @@ void ScriptBase::Actor_Retired_Here(int actorId, int width, int height, int reti actor->getXYZ(&actorPosition.x, &actorPosition.y, &actorPosition.z); actor->retire(retired, width, height, retiredByActorId); actor->setAtXYZ(actorPosition, actor->getFacing(), true, 0, true); - _vm->_sceneObjects->setRetired(actorId, true); + _vm->_sceneObjects->setRetired(actorId + SCENE_OBJECTS_ACTORS_OFFSET, true); } void ScriptBase::Clickable_Object(const char *objectName) { @@ -1335,26 +1364,28 @@ void ScriptBase::I_Sez(const char *str) { } void ScriptBase::AI_Countdown_Timer_Start(int actorId, signed int timer, int seconds) { -// if (timer >= 0 && timer <= 2) -// _vm->_actors[actorId]->timerSet(timer, 1000 * seconds); + if (timer >= 0 && timer <= 2) { + _vm->_actors[actorId]->countdownTimerStart(timer, 1000 * seconds); + } } void ScriptBase::AI_Countdown_Timer_Reset(int actorId, int timer) { -// if (timer >= 0 && timer <= 2) -// _vm->_actors[actorId]->timerReset(timer); + if (timer >= 0 && timer <= 2) { + _vm->_actors[actorId]->countdownTimerReset(timer); + } } void ScriptBase::AI_Movement_Track_Unpause(int actorId) { - //_vm->_actors[actorId]->movementTrackUnpause(); + _vm->_actors[actorId]->movementTrackUnpause(); } void ScriptBase::AI_Movement_Track_Pause(int actorId) { - //_vm->_actors[actorId]->movementTrackPause(); + _vm->_actors[actorId]->movementTrackPause(); } void ScriptBase::AI_Movement_Track_Repeat(int actorId) { _vm->_actors[actorId]->_movementTrack->repeat(); - //_vm->_actors[actorId]->movementTrackRepeat(1); + _vm->_actors[actorId]->movementTrackNext(true); } void ScriptBase::AI_Movement_Track_Append_Run_With_Facing(int actorId, int waypointId, int delay, int angle) { @@ -1423,37 +1454,131 @@ void ScriptBase::VK_Play_Speech_Line(int actorIndex, int a2, float a3) { warning("VK_Play_Speech_Line(%d, %d, %g)", actorIndex, a2, a3); } -AIScripts::AIScripts(BladeRunnerEngine *vm) : _vm(vm), _inScriptCounter(0) { - for (int i = 0; i != 100; ++i) +AIScripts::AIScripts(BladeRunnerEngine *vm, int actorsCount) : _vm(vm), _inScriptCounter(0) { + _actorsCount = actorsCount; + _actorUpdating = new bool[actorsCount]; + _AIScripts = new AIScriptBase*[actorsCount]; + for (int i = 0; i < actorsCount; ++i) { _AIScripts[i] = nullptr; + _actorUpdating[i] = false; + } _AIScripts[0] = new AIScript_McCoy(_vm); + _AIScripts[15] = new AIScript_Runciter(_vm); _AIScripts[23] = new AIScript_Officer_Leroy(_vm); } AIScripts::~AIScripts() { - for (int i = 0; i != 100; ++i) { + for (int i = 0; i < _actorsCount; ++i) { delete _AIScripts[i]; _AIScripts[i] = nullptr; } + delete[] _AIScripts; + delete[] _actorUpdating; } void AIScripts::Initialize(int actor) { + assert(actor < _actorsCount); if (_AIScripts[actor]) _AIScripts[actor]->Initialize(); } +void AIScripts::Update(int actor) { + assert(actor < _actorsCount); + if (this->_actorUpdating[actor] != 1) { + this->_actorUpdating[actor] = true; + ++this->_inScriptCounter; + if (_AIScripts[actor]) + _AIScripts[actor]->Update(); + --this->_inScriptCounter; + this->_actorUpdating[actor] = false; + } +} + +void AIScripts::TimerExpired(int actor, int timer) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) { + _AIScripts[actor]->TimerExpired(timer); + } + _inScriptCounter--; +} + +void AIScripts::CompletedMovementTrack(int actor) { + assert(actor < _actorsCount); + if (!_vm->_actors[actor]->inCombat()) { + _inScriptCounter++; + if (_AIScripts[actor]) { + _AIScripts[actor]->CompletedMovementTrack(); + } + _inScriptCounter--; + } +} + +void AIScripts::EnteredScene(int actor, int setId) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) { + _AIScripts[actor]->EnteredScene(setId); + } + _inScriptCounter--; +} + +void AIScripts::OtherAgentEnteredThisScene(int actor, int otherActorId) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) { + _AIScripts[actor]->OtherAgentEnteredThisScene(otherActorId); + } + _inScriptCounter--; +} + +void AIScripts::OtherAgentExitedThisScene(int actor, int otherActorId) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) { + _AIScripts[actor]->OtherAgentExitedThisScene(otherActorId); + } + _inScriptCounter--; +} + +void AIScripts::GoalChanged(int actor, int currentGoalNumber, int newGoalNumber) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) { + _AIScripts[actor]->GoalChanged(currentGoalNumber, newGoalNumber); + } + _inScriptCounter--; +} + +bool AIScripts::ReachedMovementTrackWaypoint(int actor, int waypointId) { + assert(actor < _actorsCount); + bool result = false; + if (!_vm->_actors[actor]->inCombat()) { + _inScriptCounter++; + if (_AIScripts[actor]) { + result = _AIScripts[actor]->ReachedMovementTrackWaypoint(waypointId); + } + _inScriptCounter--; + } + return result; +} + void AIScripts::UpdateAnimation(int actor, int *animation, int *frame) { + assert(actor < _actorsCount); _inScriptCounter++; - if (_AIScripts[actor]) + if (_AIScripts[actor]) { _AIScripts[actor]->UpdateAnimation(animation, frame); + } _inScriptCounter--; } void AIScripts::ChangeAnimationMode(int actor, int mode) { + assert(actor < _actorsCount); _inScriptCounter++; - if (_AIScripts[actor]) + if (_AIScripts[actor]) { _AIScripts[actor]->ChangeAnimationMode(mode); + } _inScriptCounter--; } |