aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/script/script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/bladerunner/script/script.cpp')
-rw-r--r--engines/bladerunner/script/script.cpp205
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--;
}