aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/script
diff options
context:
space:
mode:
Diffstat (limited to 'engines/bladerunner/script')
-rw-r--r--engines/bladerunner/script/ai/_template.cpp113
-rw-r--r--engines/bladerunner/script/ai/generic_walker_a.cpp483
-rw-r--r--engines/bladerunner/script/ai/generic_walker_b.cpp458
-rw-r--r--engines/bladerunner/script/ai/generic_walker_c.cpp462
-rw-r--r--engines/bladerunner/script/ai/mccoy.cpp2
-rw-r--r--engines/bladerunner/script/ai_script.cpp16
-rw-r--r--engines/bladerunner/script/ai_script.h33
-rw-r--r--engines/bladerunner/script/init_script.cpp4
-rw-r--r--engines/bladerunner/script/scene/bb02.cpp2
-rw-r--r--engines/bladerunner/script/scene/ct02.cpp8
-rw-r--r--engines/bladerunner/script/scene/ct12.cpp2
-rw-r--r--engines/bladerunner/script/scene/dr04.cpp4
-rw-r--r--engines/bladerunner/script/scene/hc03.cpp4
-rw-r--r--engines/bladerunner/script/scene/hf04.cpp4
-rw-r--r--engines/bladerunner/script/scene/hf05.cpp2
-rw-r--r--engines/bladerunner/script/scene/hf06.cpp2
-rw-r--r--engines/bladerunner/script/scene/kp03.cpp8
-rw-r--r--engines/bladerunner/script/scene/ma05.cpp2
-rw-r--r--engines/bladerunner/script/scene/ma06.cpp2
-rw-r--r--engines/bladerunner/script/scene/nr08.cpp2
-rw-r--r--engines/bladerunner/script/scene/nr10.cpp2
-rw-r--r--engines/bladerunner/script/scene/nr11.cpp4
-rw-r--r--engines/bladerunner/script/scene/rc01.cpp8
-rw-r--r--engines/bladerunner/script/scene/tb07.cpp2
-rw-r--r--engines/bladerunner/script/scene/ug01.cpp2
-rw-r--r--engines/bladerunner/script/scene/ug10.cpp6
-rw-r--r--engines/bladerunner/script/scene/ug13.cpp4
-rw-r--r--engines/bladerunner/script/scene/ug15.cpp2
-rw-r--r--engines/bladerunner/script/script.cpp2
29 files changed, 1601 insertions, 44 deletions
diff --git a/engines/bladerunner/script/ai/_template.cpp b/engines/bladerunner/script/ai/_template.cpp
new file mode 100644
index 0000000000..af7c685a72
--- /dev/null
+++ b/engines/bladerunner/script/ai/_template.cpp
@@ -0,0 +1,113 @@
+/* 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 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 "bladerunner/script/ai_script.h"
+
+namespace BladeRunner {
+
+AIScriptGenericWalkerA::AIScriptGenericWalkerA(BladeRunnerEngine *vm) : AIScriptBase(vm) {
+}
+
+void AIScriptGenericWalkerA::Initialize() {
+ _animationStateNext = 0;
+ _animationNext = 0;
+ _animationFrame = 0;
+ _animationState = 0;
+}
+
+bool AIScriptGenericWalkerA::Update() {
+ return false;
+}
+
+void AIScriptGenericWalkerA::TimerExpired(int timer) {
+}
+
+void AIScriptGenericWalkerA::CompletedMovementTrack() {
+}
+
+void AIScriptGenericWalkerA::ReceivedClue(int clueId, int fromActorId) {
+}
+
+void AIScriptGenericWalkerA::ClickedByPlayer() {
+}
+
+void AIScriptGenericWalkerA::EnteredScene(int sceneId) {
+}
+
+void AIScriptGenericWalkerA::OtherAgentEnteredThisScene(int otherActorId) {
+}
+
+void AIScriptGenericWalkerA::OtherAgentExitedThisScene(int otherActorId) {
+}
+
+void AIScriptGenericWalkerA::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
+}
+
+void AIScriptGenericWalkerA::ShotAtAndMissed() {
+}
+
+bool AIScriptGenericWalkerA::ShotAtAndHit() {
+ return false;
+}
+
+void AIScriptGenericWalkerA::Retired(int byActorId) {
+}
+
+int AIScriptGenericWalkerA::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
+ return 0;
+}
+
+bool AIScriptGenericWalkerA::GoalChanged(int currentGoalNumber, int newGoalNumber) {
+ return false;
+}
+
+bool AIScriptGenericWalkerA::UpdateAnimation(int *animation, int *frame) {
+ *animation = 0;
+ *frame = _animationFrame;
+ return true;
+}
+
+bool AIScriptGenericWalkerA::ChangeAnimationMode(int mode) {
+ return true;
+}
+
+void AIScriptGenericWalkerA::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
+ *animationState = _animationState;
+ *animationFrame = _animationFrame;
+ *animationStateNext = _animationStateNext;
+ *animationNext = _animationNext;
+}
+
+void AIScriptGenericWalkerA::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
+ _animationState = animationState;
+ _animationFrame = animationFrame;
+ _animationStateNext = animationStateNext;
+ _animationNext = animationNext;
+}
+
+bool AIScriptGenericWalkerA::ReachedMovementTrackWaypoint(int waypointId) {
+ return true;
+}
+
+void AIScriptGenericWalkerA::FledCombat() {}
+
+} // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/ai/generic_walker_a.cpp b/engines/bladerunner/script/ai/generic_walker_a.cpp
new file mode 100644
index 0000000000..4bb5b14b47
--- /dev/null
+++ b/engines/bladerunner/script/ai/generic_walker_a.cpp
@@ -0,0 +1,483 @@
+/* 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 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 "bladerunner/script/ai_script.h"
+
+namespace BladeRunner {
+enum kGenericWalkerAStates {
+ kGenericWalkerAStatesIdle = 0,
+ kGenericWalkerAStatesWalk = 1,
+ kGenericWalkerAStatesDie = 2,
+ kGenericWalkerAStatesGun = 3
+};
+
+AIScriptGenericWalkerA::AIScriptGenericWalkerA(BladeRunnerEngine *vm) : AIScriptBase(vm) {
+ isInside = false;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+}
+
+void AIScriptGenericWalkerA::Initialize() {
+ _animationState = kGenericWalkerAStatesIdle;
+ _animationFrame = 0;
+ _animationStateNext = 0;
+ isInside = false;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+ Actor_Set_Goal_Number(kActorGenwalkerA, 0);
+}
+
+bool AIScriptGenericWalkerA::Update() {
+ switch (Actor_Query_Goal_Number(kActorGenwalkerA)) {
+ case 0:
+ if (prepareWalker()) {
+ return true;
+ }
+ break;
+ case 1:
+ if (deltaX != 0.0f || deltaZ != 0.0f) {
+ movingUpdate();
+ }
+ break;
+ case 200:
+ Actor_Face_Actor(kActorGenwalkerA, kActorMcCoy, true);
+ break;
+ }
+ return false;
+}
+
+void AIScriptGenericWalkerA::TimerExpired(int timer) {
+ if (timer == 2) {
+ AI_Countdown_Timer_Reset(kActorGenwalkerA, 2);
+ Game_Flag_Reset(kFlagGenericWalkerWaiting);
+ return;// true;
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerA::CompletedMovementTrack() {
+ if (Actor_Query_Goal_Number(kActorGenwalkerA) > 0) {
+ Actor_Set_Goal_Number(kActorGenwalkerA, 0);
+ if (!Game_Flag_Query(kFlagGenericWalkerWaiting)) {
+ Game_Flag_Set(kFlagGenericWalkerWaiting);
+ AI_Countdown_Timer_Reset(kActorGenwalkerA, 2);
+ AI_Countdown_Timer_Start(kActorGenwalkerA, 2, Random_Query(6, 10));
+ }
+ // return true;
+ }
+ // return false;
+}
+
+void AIScriptGenericWalkerA::ReceivedClue(int clueId, int fromActorId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerA::ClickedByPlayer() {
+ Actor_Face_Actor(kActorMcCoy, kActorGenwalkerA, true);
+ if (Actor_Query_Goal_Number(kActorGenwalkerA) == 200) {
+ Actor_Says(kActorMcCoy, 5290, 18);
+ } else {
+ switch (Random_Query(1, 10)) {
+ case 1:
+ Actor_Says(kActorMcCoy, 365, 3);
+ break;
+ case 2:
+ Actor_Says(kActorMcCoy, 755, 3);
+ break;
+ case 3:
+ Actor_Says(kActorMcCoy, 940, 3);
+ break;
+ case 4:
+ Actor_Says(kActorMcCoy, 4560, 3);
+ break;
+ case 5:
+ Actor_Says(kActorMcCoy, 4870, 3);
+ break;
+ case 6:
+ Actor_Says(kActorMcCoy, 5125, 3);
+ break;
+ case 7:
+ Actor_Says(kActorMcCoy, 8450, 3);
+ break;
+ case 8:
+ Actor_Says(kActorMcCoy, 1085, 3);
+ break;
+ case 9:
+ Actor_Says(kActorMcCoy, 365, 3);
+ break;
+ case 10:
+ Actor_Says(kActorMcCoy, 7415, 3);
+ break;
+ }
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerA::EnteredScene(int sceneId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerA::OtherAgentEnteredThisScene(int otherActorId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerA::OtherAgentExitedThisScene(int otherActorId) {
+ if (Actor_Query_Goal_Number(kActorGenwalkerA) && otherActorId == kActorMcCoy) {
+ Actor_Set_Goal_Number(kActorGenwalkerA, 0);
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerA::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
+ //return false;
+}
+
+void AIScriptGenericWalkerA::ShotAtAndMissed() {
+ //return false;
+}
+
+bool AIScriptGenericWalkerA::ShotAtAndHit() {
+ if (Actor_Query_Goal_Number(kActorGenwalkerA)) {
+ AI_Movement_Track_Flush(kActorGenwalkerA);
+ _animationState = kGenericWalkerAStatesDie;
+ _animationFrame = 0;
+ Sound_Play(203, 100, 0, 0, 50);
+ movingStart();
+ return true;
+ }
+ return false;
+}
+
+void AIScriptGenericWalkerA::Retired(int byActorId) {
+ //return false;
+}
+
+int AIScriptGenericWalkerA::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
+ return 0;
+}
+
+bool AIScriptGenericWalkerA::GoalChanged(int currentGoalNumber, int newGoalNumber) {
+ if (newGoalNumber == 0) {
+ AI_Movement_Track_Flush(kActorGenwalkerA);
+ Actor_Put_In_Set(kActorGenwalkerA, kSetFreeSlotH);
+ Global_Variable_Set(kVariableGenericWalkerAModel, -1);
+ return false;
+ } else if (newGoalNumber == 1) {
+ return true;
+ } else if (newGoalNumber == 200) {
+ Actor_Put_In_Set(kActorGenwalkerA, kSetRC04);
+ Actor_Set_At_XYZ(kActorGenwalkerA, 0.0, 36.0, -172.0, 491);
+ Actor_Change_Animation_Mode(kActorGenwalkerA, kAnimationModeCombatIdle);
+ return true;
+ }
+ return false;
+}
+
+bool AIScriptGenericWalkerA::UpdateAnimation(int *animation, int *frame) {
+ switch (_animationState) {
+ case kGenericWalkerAStatesIdle:
+ switch (Global_Variable_Query(kVariableGenericWalkerAModel)) {
+ case 0:
+ *animation = 426;
+ break;
+ case 1:
+ *animation = 430;
+ break;
+ case 2:
+ *animation = 437;
+ break;
+ case 3:
+ *animation = 431;
+ break;
+ case 4:
+ *animation = 427;
+ break;
+ case 5:
+ *animation = 433;
+ break;
+ }
+ _animationFrame = 0;
+ break;
+ case kGenericWalkerAStatesWalk:
+ switch (Global_Variable_Query(kVariableGenericWalkerAModel)){
+ case 0:
+ *animation = 424;
+ break;
+ case 1:
+ *animation = 428;
+ break;
+ case 2:
+ *animation = 436;
+ break;
+ case 3:
+ *animation = 429;
+ break;
+ case 4:
+ *animation = 425;
+ break;
+ case 5:
+ *animation = 432;
+ break;
+ }
+ ++_animationFrame;
+ if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
+ _animationFrame = 0;
+ }
+ break;
+ case kGenericWalkerAStatesDie:
+ *animation = 874;
+ ++_animationFrame;
+ if (++_animationFrame >= Slice_Animation_Query_Number_Of_Frames(874))
+ {
+ _animationFrame = 0;
+ Actor_Set_Goal_Number(kActorGenwalkerA, 0);
+ _animationState = kGenericWalkerAStatesIdle;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+ }
+ break;
+ case kGenericWalkerAStatesGun:
+ *animation = 440;
+ ++_animationFrame;
+ if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(440)) {
+ _animationFrame = 0;
+ }
+ break;
+ }
+ *frame = _animationFrame;
+ return true;
+}
+
+bool AIScriptGenericWalkerA::ChangeAnimationMode(int mode) {
+ switch (mode) {
+ case kAnimationModeIdle:
+ _animationState = kGenericWalkerAStatesIdle;
+ _animationFrame = 0;
+ break;
+ case kAnimationModeWalk:
+ _animationState = kGenericWalkerAStatesWalk;
+ _animationFrame = 0;
+ break;
+ case kAnimationModeCombatIdle:
+ _animationState = kGenericWalkerAStatesGun;
+ _animationFrame = 0;
+ break;
+ }
+ return true;
+}
+
+void AIScriptGenericWalkerA::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
+ *animationState = _animationState;
+ *animationFrame = _animationFrame;
+ *animationStateNext = _animationStateNext;
+ *animationNext = _animationNext;
+}
+
+void AIScriptGenericWalkerA::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
+ _animationState = animationState;
+ _animationFrame = animationFrame;
+ _animationStateNext = animationStateNext;
+ _animationNext = animationNext;
+}
+
+bool AIScriptGenericWalkerA::ReachedMovementTrackWaypoint(int waypointId) {
+ return true;
+}
+
+void AIScriptGenericWalkerA::FledCombat() {
+ //return false;
+}
+
+void AIScriptGenericWalkerA::movingStart() {
+ float mccoyX, mccoyY, mccoyZ;
+ float walkerX, walkerY, walkerZ;
+
+ Actor_Query_XYZ(kActorMcCoy, &mccoyX, &mccoyY, &mccoyZ);
+ Actor_Query_XYZ(kActorGenwalkerA, &walkerX, &walkerY, &walkerZ);
+
+ deltaX = walkerX - mccoyX;
+ deltaZ = walkerZ - mccoyZ;
+
+ float dist = sqrt(deltaX * deltaX + deltaZ * deltaZ);
+ if (dist == 0.0f) {
+ deltaZ = 0.0f;
+ deltaX = 0.0f;
+ } else {
+ deltaX *= 10.0f / dist;
+ deltaZ *= 10.0f / dist;
+ }
+}
+
+void AIScriptGenericWalkerA::movingUpdate() {
+ float walkerX, walkerY, walkerZ;
+
+ Actor_Query_XYZ(kActorGenwalkerA, &walkerX, &walkerY, &walkerZ);
+ int facing = Actor_Query_Facing_1024(kActorGenwalkerA);
+
+ walkerX += deltaX;
+ walkerZ += deltaZ;
+
+ deltaX = deltaX * 0.97f;
+ deltaZ = deltaZ * 0.97f;
+
+ Actor_Set_At_XYZ(kActorGenwalkerA, walkerX, walkerY, walkerZ, facing);
+
+}
+
+bool AIScriptGenericWalkerA::prepareWalker() {
+ if (Game_Flag_Query(kFlagGenericWalkerWaiting) || Global_Variable_Query(35) < 0 || !preparePath()) {
+ return false;
+ }
+
+ int model = 0;
+ do {
+ if (isInside) {
+ model = Random_Query(3, 5);
+ } else {
+ model = Random_Query(0, 5);
+ }
+ }
+ while (model == Global_Variable_Query(kVariableGenericWalkerBModel) || model == Global_Variable_Query(kVariableGenericWalkerCModel));
+
+ Global_Variable_Set(kVariableGenericWalkerAModel, model);
+ Game_Flag_Set(kFlagGenericWalkerWaiting);
+ AI_Countdown_Timer_Reset(kActorGenwalkerA, 2);
+ AI_Countdown_Timer_Start(kActorGenwalkerA, 2, Random_Query(4, 12));
+ Actor_Set_Goal_Number(kActorGenwalkerA, 1);
+ return true;
+}
+
+bool AIScriptGenericWalkerA::preparePath() {
+ AI_Movement_Track_Flush(kActorGenwalkerA);
+ int set = Player_Query_Current_Set();
+
+ if (set == kSetAR01_AR02) {
+ isInside = false;
+ int waypointStart = Random_Query(155, 158);
+ int waypointEnd = 0;
+ AI_Movement_Track_Append(kActorGenwalkerA, waypointStart, 0);
+ do {
+ waypointEnd = Random_Query(155, 158);
+ } while (waypointEnd == waypointStart);
+ if ((waypointStart == 155 || waypointStart == 156) && (waypointEnd == 157 || waypointEnd == 158)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 159, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 160, 0);
+ if (Random_Query(0, 3) == 0) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerA, 161, Random_Query(15, 30), 904);
+ }
+ } else if ((waypointEnd == 155 || waypointEnd == 156) && (waypointStart == 157 || waypointStart == 158)) {
+ if (Random_Query(0, 3) == 0) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerA, 161, Random_Query(15, 30), 904);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerA, 160, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 159, 0);
+ } else if ((waypointStart == 155 && waypointEnd == 156) || (waypointStart == 156 && waypointEnd == 155)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 159, 0);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerA, waypointEnd, 0);
+ AI_Movement_Track_Repeat(kActorGenwalkerA);
+ return true;
+ }
+
+ if (set == kSetCT01_CT12) {
+ isInside = false;
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 54, 1);
+ if (Random_Query(1, 3) == 1) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 56, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 43, 1);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerA, 53, 1);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerA, 40, 1);
+ AI_Movement_Track_Repeat(kActorGenwalkerA);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerA, 53, 1);
+ if (Random_Query(1, 3) == 1) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 43, 1);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerA, 54, 1);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerA, 40, 1);
+ AI_Movement_Track_Repeat(kActorGenwalkerA);
+ }
+ return true;
+ }
+
+ if (set == kSetHC01_HC02_HC03_HC04) {
+ isInside = true;
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 164, 0);
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 162, 0);
+ } else if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 162, 0);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerA, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 162, 0);
+ }
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerA, 162, 0);
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 164, 0);
+ } else {
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerA, 166, 0, 30);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerA, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 164, 0);
+ }
+ }
+ AI_Movement_Track_Repeat(kActorGenwalkerA);
+ return true;
+ }
+
+ if (set == kSetRC03) {
+ isInside = false;
+ int waypointStart = 0;
+ int waypointEnd = 0;
+ do {
+ waypointStart = Random_Query(167, 171);
+ } while (waypointEnd == 168 || waypointEnd == 169);
+ do {
+ waypointEnd = Random_Query(167, 171);
+ } while (waypointEnd == waypointStart || waypointEnd == 168 || waypointEnd == 169);
+ AI_Movement_Track_Append(kActorGenwalkerA, waypointStart, 0);
+ if (waypointStart == 170) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 169, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 168, 0);
+ } else if (waypointEnd == 170) {
+ AI_Movement_Track_Append(kActorGenwalkerA, 168, 0);
+ AI_Movement_Track_Append(kActorGenwalkerA, 169, 0);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerA, waypointEnd, 0);
+ AI_Movement_Track_Repeat(kActorGenwalkerA);
+ return true;
+ }
+
+ return false;
+}
+
+} // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/ai/generic_walker_b.cpp b/engines/bladerunner/script/ai/generic_walker_b.cpp
new file mode 100644
index 0000000000..a2ff58113f
--- /dev/null
+++ b/engines/bladerunner/script/ai/generic_walker_b.cpp
@@ -0,0 +1,458 @@
+/* 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 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 "bladerunner/script/ai_script.h"
+
+namespace BladeRunner {
+enum kGenericWalkerBStates {
+ kGenericWalkerBStatesIdle = 0,
+ kGenericWalkerBStatesWalk = 1,
+ kGenericWalkerBStatesDie = 2
+};
+
+AIScriptGenericWalkerB::AIScriptGenericWalkerB(BladeRunnerEngine *vm) : AIScriptBase(vm) {
+ isInside = false;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+}
+
+void AIScriptGenericWalkerB::Initialize() {
+ _animationState = kGenericWalkerBStatesIdle;
+ _animationFrame = 0;
+ _animationStateNext = 0;
+ isInside = false;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+ Actor_Set_Goal_Number(kActorGenwalkerB, 0);
+}
+
+bool AIScriptGenericWalkerB::Update() {
+ switch (Actor_Query_Goal_Number(kActorGenwalkerB)) {
+ case 0:
+ if (prepareWalker()) {
+ return true;
+ }
+ break;
+ case 1:
+ if (deltaX != 0.0f || deltaZ != 0.0f) {
+ movingUpdate();
+ }
+ break;
+ }
+ return false;
+}
+
+void AIScriptGenericWalkerB::TimerExpired(int timer) {
+ if (timer == 2) {
+ AI_Countdown_Timer_Reset(kActorGenwalkerB, 2);
+ Game_Flag_Reset(kFlagGenericWalkerWaiting);
+ return;// true;
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerB::CompletedMovementTrack() {
+ if (Actor_Query_Goal_Number(kActorGenwalkerB) > 0) {
+ Actor_Set_Goal_Number(kActorGenwalkerB, 0);
+ if (!Game_Flag_Query(kFlagGenericWalkerWaiting)) {
+ Game_Flag_Set(kFlagGenericWalkerWaiting);
+ AI_Countdown_Timer_Reset(kActorGenwalkerB, 2);
+ AI_Countdown_Timer_Start(kActorGenwalkerB, 2, Random_Query(6, 10));
+ }
+ // return true;
+ }
+ // return false;
+}
+
+void AIScriptGenericWalkerB::ReceivedClue(int clueId, int fromActorId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerB::ClickedByPlayer() {
+ Actor_Face_Actor(kActorMcCoy, kActorGenwalkerB, true);
+ switch (Random_Query(1, 10)) {
+ case 1:
+ Actor_Says(kActorMcCoy, 365, 3);
+ break;
+ case 2:
+ Actor_Says(kActorMcCoy, 755, 3);
+ break;
+ case 3:
+ Actor_Says(kActorMcCoy, 940, 3);
+ break;
+ case 4:
+ Actor_Says(kActorMcCoy, 4560, 3);
+ break;
+ case 5:
+ Actor_Says(kActorMcCoy, 4870, 3);
+ break;
+ case 6:
+ Actor_Says(kActorMcCoy, 5125, 3);
+ break;
+ case 7:
+ Actor_Says(kActorMcCoy, 8450, 3);
+ break;
+ case 8:
+ Actor_Says(kActorMcCoy, 1085, 3);
+ break;
+ case 9:
+ Actor_Says(kActorMcCoy, 365, 3);
+ break;
+ case 10:
+ Actor_Says(kActorMcCoy, 7415, 3);
+ break;
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerB::EnteredScene(int sceneId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerB::OtherAgentEnteredThisScene(int otherActorId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerB::OtherAgentExitedThisScene(int otherActorId) {
+ if (Actor_Query_Goal_Number(kActorGenwalkerB) && otherActorId == kActorMcCoy) {
+ Actor_Set_Goal_Number(kActorGenwalkerB, 0);
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerB::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
+ //return false;
+}
+
+void AIScriptGenericWalkerB::ShotAtAndMissed() {
+ //return false;
+}
+
+bool AIScriptGenericWalkerB::ShotAtAndHit() {
+ if (Actor_Query_Goal_Number(kActorGenwalkerB)) {
+ AI_Movement_Track_Flush(kActorGenwalkerB);
+ _animationState = kGenericWalkerBStatesDie;
+ _animationFrame = 0;
+ Sound_Play(203, 100, 0, 0, 50);
+ movingStart();
+ return true;
+ }
+ return false;
+}
+
+void AIScriptGenericWalkerB::Retired(int byActorId) {
+ //return false;
+}
+
+int AIScriptGenericWalkerB::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
+ return 0;
+}
+
+bool AIScriptGenericWalkerB::GoalChanged(int currentGoalNumber, int newGoalNumber) {
+ if (newGoalNumber == 0) {
+ AI_Movement_Track_Flush(kActorGenwalkerB);
+ Actor_Put_In_Set(kActorGenwalkerB, kSetFreeSlotH);
+ Global_Variable_Set(kVariableGenericWalkerBModel, -1);
+ return false;
+ } else if (newGoalNumber == 1) {
+ return true;
+ }
+ return false;
+}
+
+bool AIScriptGenericWalkerB::UpdateAnimation(int *animation, int *frame) {
+ switch (_animationState) {
+ case kGenericWalkerBStatesIdle:
+ switch (Global_Variable_Query(kVariableGenericWalkerBModel)) {
+ case 0:
+ *animation = 426;
+ break;
+ case 1:
+ *animation = 430;
+ break;
+ case 2:
+ *animation = 437;
+ break;
+ case 3:
+ *animation = 431;
+ break;
+ case 4:
+ *animation = 427;
+ break;
+ case 5:
+ *animation = 433;
+ break;
+ }
+ _animationFrame = 0;
+ break;
+ case kGenericWalkerBStatesWalk:
+ switch (Global_Variable_Query(kVariableGenericWalkerBModel)){
+ case 0:
+ *animation = 424;
+ break;
+ case 1:
+ *animation = 428;
+ break;
+ case 2:
+ *animation = 436;
+ break;
+ case 3:
+ *animation = 429;
+ break;
+ case 4:
+ *animation = 425;
+ break;
+ case 5:
+ *animation = 432;
+ break;
+ }
+ ++_animationFrame;
+ if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
+ _animationFrame = 0;
+ }
+ break;
+ case kGenericWalkerBStatesDie:
+ *animation = 874;
+ ++_animationFrame;
+ if (++_animationFrame >= Slice_Animation_Query_Number_Of_Frames(874))
+ {
+ _animationFrame = 0;
+ Actor_Set_Goal_Number(kActorGenwalkerB, 0);
+ _animationState = kGenericWalkerBStatesIdle;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+ }
+ break;
+ }
+ *frame = _animationFrame;
+ return true;
+}
+
+bool AIScriptGenericWalkerB::ChangeAnimationMode(int mode) {
+ switch (mode) {
+ case kAnimationModeIdle:
+ _animationState = kGenericWalkerBStatesIdle;
+ _animationFrame = 0;
+ break;
+ case kAnimationModeWalk:
+ _animationState = kGenericWalkerBStatesWalk;
+ _animationFrame = 0;
+ break;
+ }
+ return true;
+}
+
+void AIScriptGenericWalkerB::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
+ *animationState = _animationState;
+ *animationFrame = _animationFrame;
+ *animationStateNext = _animationStateNext;
+ *animationNext = _animationNext;
+}
+
+void AIScriptGenericWalkerB::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
+ _animationState = animationState;
+ _animationFrame = animationFrame;
+ _animationStateNext = animationStateNext;
+ _animationNext = animationNext;
+}
+
+bool AIScriptGenericWalkerB::ReachedMovementTrackWaypoint(int waypointId) {
+ return true;
+}
+
+void AIScriptGenericWalkerB::FledCombat() {
+ //return false;
+}
+
+void AIScriptGenericWalkerB::movingStart() {
+ float mccoyX, mccoyY, mccoyZ;
+ float walkerX, walkerY, walkerZ;
+
+ Actor_Query_XYZ(kActorMcCoy, &mccoyX, &mccoyY, &mccoyZ);
+ Actor_Query_XYZ(kActorGenwalkerB, &walkerX, &walkerY, &walkerZ);
+
+ deltaX = walkerX - mccoyX;
+ deltaZ = walkerZ - mccoyZ;
+
+ float dist = sqrt(deltaX * deltaX + deltaZ * deltaZ);
+ if (dist == 0.0f) {
+ deltaZ = 0.0f;
+ deltaX = 0.0f;
+ } else {
+ deltaX *= 10.0f / dist;
+ deltaZ *= 10.0f / dist;
+ }
+}
+
+void AIScriptGenericWalkerB::movingUpdate() {
+ float walkerX, walkerY, walkerZ;
+
+ Actor_Query_XYZ(kActorGenwalkerB, &walkerX, &walkerY, &walkerZ);
+ int facing = Actor_Query_Facing_1024(kActorGenwalkerB);
+
+ walkerX += deltaX;
+ walkerZ += deltaZ;
+
+ deltaX = deltaX * 0.97f;
+ deltaZ = deltaZ * 0.97f;
+
+ Actor_Set_At_XYZ(kActorGenwalkerB, walkerX, walkerY, walkerZ, facing);
+}
+
+bool AIScriptGenericWalkerB::prepareWalker() {
+ if (Game_Flag_Query(kFlagGenericWalkerWaiting) || Global_Variable_Query(35) < 0 || !preparePath()) {
+ return false;
+ }
+
+ int model = 0;
+ do {
+ if (isInside) {
+ model = Random_Query(3, 5);
+ } else {
+ model = Random_Query(0, 5);
+ }
+ }
+ while (model == Global_Variable_Query(kVariableGenericWalkerAModel) || model == Global_Variable_Query(kVariableGenericWalkerCModel));
+
+ Global_Variable_Set(kVariableGenericWalkerBModel, model);
+ Game_Flag_Set(kFlagGenericWalkerWaiting);
+ AI_Countdown_Timer_Reset(kActorGenwalkerB, 2);
+ AI_Countdown_Timer_Start(kActorGenwalkerB, 2, Random_Query(4, 12));
+ Actor_Set_Goal_Number(kActorGenwalkerB, 1);
+ return true;
+}
+
+bool AIScriptGenericWalkerB::preparePath() {
+ AI_Movement_Track_Flush(kActorGenwalkerB);
+ int set = Player_Query_Current_Set();
+
+ if (set == kSetAR01_AR02) {
+ isInside = false;
+ int waypointStart = Random_Query(155, 158);
+ int waypointEnd = 0;
+ AI_Movement_Track_Append(kActorGenwalkerB, waypointStart, 0);
+ do {
+ waypointEnd = Random_Query(155, 158);
+ } while (waypointEnd == waypointStart);
+ if ((waypointStart == 155 || waypointStart == 156) && (waypointEnd == 157 || waypointEnd == 158)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 159, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 160, 0);
+ if (Random_Query(0, 3) == 0) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerB, 161, Random_Query(15, 30), 904);
+ }
+ } else if ((waypointEnd == 155 || waypointEnd == 156) && (waypointStart == 157 || waypointStart == 158)) {
+ if (Random_Query(0, 3) == 0) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerB, 161, Random_Query(15, 30), 904);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerB, 160, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 159, 0);
+ } else if ((waypointStart == 155 && waypointEnd == 156) || (waypointStart == 156 && waypointEnd == 155)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 159, 0);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerB, waypointEnd, 0);
+ AI_Movement_Track_Repeat(kActorGenwalkerB);
+ return true;
+ }
+
+ if (set == kSetCT01_CT12) {
+ isInside = false;
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 54, 1);
+ if (Random_Query(1, 3) == 1) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 56, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 43, 1);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerB, 53, 1);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerB, 40, 1);
+ AI_Movement_Track_Repeat(kActorGenwalkerB);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerB, 53, 1);
+ if (Random_Query(1, 3) == 1) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 43, 1);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerB, 54, 1);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerB, 40, 1);
+ AI_Movement_Track_Repeat(kActorGenwalkerB);
+ }
+ return true;
+ }
+
+ if (set == kSetHC01_HC02_HC03_HC04) {
+ isInside = true;
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 164, 0);
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 162, 0);
+ } else if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 162, 0);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerB, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 162, 0);
+ }
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerB, 162, 0);
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 164, 0);
+ } else if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 164, 0);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerB, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 164, 0);
+ }
+ }
+ AI_Movement_Track_Repeat(kActorGenwalkerB);
+ return true;
+ }
+
+ if (set == kSetRC03) {
+ isInside = false;
+ int waypointStart = 0;
+ int waypointEnd = 0;
+ do {
+ waypointStart = Random_Query(167, 171);
+ } while (waypointEnd == 168 || waypointEnd == 169);
+ do {
+ waypointEnd = Random_Query(167, 171);
+ } while (waypointEnd == waypointStart || waypointEnd == 168 || waypointEnd == 169);
+ AI_Movement_Track_Append(kActorGenwalkerB, waypointStart, 0);
+ if (waypointStart == 170) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 169, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 168, 0);
+ } else if (waypointEnd == 170) {
+ AI_Movement_Track_Append(kActorGenwalkerB, 168, 0);
+ AI_Movement_Track_Append(kActorGenwalkerB, 169, 0);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerB, waypointEnd, 0);
+ AI_Movement_Track_Repeat(kActorGenwalkerB);
+ return true;
+ }
+
+ return false;
+}
+
+} // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/ai/generic_walker_c.cpp b/engines/bladerunner/script/ai/generic_walker_c.cpp
new file mode 100644
index 0000000000..0f86c239ad
--- /dev/null
+++ b/engines/bladerunner/script/ai/generic_walker_c.cpp
@@ -0,0 +1,462 @@
+/* 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 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 "bladerunner/script/ai_script.h"
+
+namespace BladeRunner {
+enum kGenericWalkerCStates {
+ kGenericWalkerCStatesIdle = 0,
+ kGenericWalkerCStatesWalk = 1,
+ kGenericWalkerCStatesDie = 2,
+ kGenericWalkerCStatesGun = 3
+};
+
+AIScriptGenericWalkerC::AIScriptGenericWalkerC(BladeRunnerEngine *vm) : AIScriptBase(vm) {
+ isInside = false;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+}
+
+void AIScriptGenericWalkerC::Initialize() {
+ _animationState = kGenericWalkerCStatesIdle;
+ _animationFrame = 0;
+ _animationStateNext = 0;
+ isInside = false;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+ Actor_Set_Goal_Number(kActorGenwalkerC, 0);
+}
+
+bool AIScriptGenericWalkerC::Update() {
+ switch (Actor_Query_Goal_Number(kActorGenwalkerC)) {
+ case 0:
+ if (prepareWalker()) {
+ return true;
+ }
+ break;
+ case 1:
+ if (deltaX != 0.0f || deltaZ != 0.0f) {
+ movingUpdate();
+ }
+ break;
+ }
+ return false;
+}
+
+void AIScriptGenericWalkerC::TimerExpired(int timer) {
+ if (timer == 2) {
+ AI_Countdown_Timer_Reset(kActorGenwalkerC, 2);
+ Game_Flag_Reset(kFlagGenericWalkerWaiting);
+ return;// true;
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerC::CompletedMovementTrack() {
+ if (Actor_Query_Goal_Number(kActorGenwalkerC) > 0) {
+ Actor_Set_Goal_Number(kActorGenwalkerC, 0);
+ if (!Game_Flag_Query(kFlagGenericWalkerWaiting)) {
+ Game_Flag_Set(kFlagGenericWalkerWaiting);
+ AI_Countdown_Timer_Reset(kActorGenwalkerC, 2);
+ AI_Countdown_Timer_Start(kActorGenwalkerC, 2, Random_Query(6, 10));
+ }
+ // return true;
+ }
+ // return false;
+}
+
+void AIScriptGenericWalkerC::ReceivedClue(int clueId, int fromActorId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerC::ClickedByPlayer() {
+ Actor_Face_Actor(kActorMcCoy, kActorGenwalkerC, true);
+ switch (Random_Query(1, 10)) {
+ case 1:
+ Actor_Says(kActorMcCoy, 365, 3);
+ break;
+ case 2:
+ Actor_Says(kActorMcCoy, 755, 3);
+ break;
+ case 3:
+ Actor_Says(kActorMcCoy, 940, 3);
+ break;
+ case 4:
+ Actor_Says(kActorMcCoy, 4560, 3);
+ break;
+ case 5:
+ Actor_Says(kActorMcCoy, 4870, 3);
+ break;
+ case 6:
+ Actor_Says(kActorMcCoy, 5125, 3);
+ break;
+ case 7:
+ Actor_Says(kActorMcCoy, 8450, 3);
+ break;
+ case 8:
+ Actor_Says(kActorMcCoy, 1085, 3);
+ break;
+ case 9:
+ Actor_Says(kActorMcCoy, 365, 3);
+ break;
+ case 10:
+ Actor_Says(kActorMcCoy, 7415, 3);
+ break;
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerC::EnteredScene(int sceneId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerC::OtherAgentEnteredThisScene(int otherActorId) {
+ //return false;
+}
+
+void AIScriptGenericWalkerC::OtherAgentExitedThisScene(int otherActorId) {
+ if (Actor_Query_Goal_Number(kActorGenwalkerC) && otherActorId == kActorMcCoy) {
+ Actor_Set_Goal_Number(kActorGenwalkerC, 0);
+ }
+ //return false;
+}
+
+void AIScriptGenericWalkerC::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
+ //return false;
+}
+
+void AIScriptGenericWalkerC::ShotAtAndMissed() {
+ //return false;
+}
+
+bool AIScriptGenericWalkerC::ShotAtAndHit() {
+ if (Actor_Query_Goal_Number(kActorGenwalkerC)) {
+ AI_Movement_Track_Flush(kActorGenwalkerC);
+ _animationState = kGenericWalkerCStatesDie;
+ _animationFrame = 0;
+ Sound_Play(203, 100, 0, 0, 50);
+ movingStart();
+ return true;
+ }
+ return false;
+}
+
+void AIScriptGenericWalkerC::Retired(int byActorId) {
+ //return false;
+}
+
+int AIScriptGenericWalkerC::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
+ return 0;
+}
+
+bool AIScriptGenericWalkerC::GoalChanged(int currentGoalNumber, int newGoalNumber) {
+ if (newGoalNumber == 0) {
+ AI_Movement_Track_Flush(kActorGenwalkerC);
+ Actor_Put_In_Set(kActorGenwalkerC, kSetFreeSlotH);
+ Global_Variable_Set(kVariableGenericWalkerCModel, -1);
+ return false;
+ } else if (newGoalNumber == 1) {
+ return true;
+ }
+ return false;
+}
+
+bool AIScriptGenericWalkerC::UpdateAnimation(int *animation, int *frame) {
+ switch (_animationState) {
+ case kGenericWalkerCStatesIdle:
+ switch (Global_Variable_Query(kVariableGenericWalkerCModel)) {
+ case 0:
+ *animation = 426;
+ break;
+ case 1:
+ *animation = 430;
+ break;
+ case 2:
+ *animation = 437;
+ break;
+ case 3:
+ *animation = 431;
+ break;
+ case 4:
+ *animation = 427;
+ break;
+ case 5:
+ *animation = 433;
+ break;
+ }
+ _animationFrame = 0;
+ break;
+ case kGenericWalkerCStatesWalk:
+ switch (Global_Variable_Query(kVariableGenericWalkerCModel)){
+ case 0:
+ *animation = 424;
+ break;
+ case 1:
+ *animation = 428;
+ break;
+ case 2:
+ *animation = 436;
+ break;
+ case 3:
+ *animation = 429;
+ break;
+ case 4:
+ *animation = 425;
+ break;
+ case 5:
+ *animation = 432;
+ break;
+ }
+ ++_animationFrame;
+ if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
+ _animationFrame = 0;
+ }
+ break;
+ case kGenericWalkerCStatesDie:
+ *animation = 874;
+ ++_animationFrame;
+ if (++_animationFrame >= Slice_Animation_Query_Number_Of_Frames(874))
+ {
+ _animationFrame = 0;
+ Actor_Set_Goal_Number(kActorGenwalkerC, 0);
+ _animationState = kGenericWalkerCStatesIdle;
+ deltaX = 0.0f;
+ deltaZ = 0.0f;
+ }
+ break;
+ }
+ *frame = _animationFrame;
+ return true;
+}
+
+bool AIScriptGenericWalkerC::ChangeAnimationMode(int mode) {
+ switch (mode) {
+ case kAnimationModeIdle:
+ _animationState = kGenericWalkerCStatesIdle;
+ _animationFrame = 0;
+ break;
+ case kAnimationModeWalk:
+ _animationState = kGenericWalkerCStatesWalk;
+ _animationFrame = 0;
+ break;
+ }
+ return true;
+}
+
+void AIScriptGenericWalkerC::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
+ *animationState = _animationState;
+ *animationFrame = _animationFrame;
+ *animationStateNext = _animationStateNext;
+ *animationNext = _animationNext;
+}
+
+void AIScriptGenericWalkerC::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
+ _animationState = animationState;
+ _animationFrame = animationFrame;
+ _animationStateNext = animationStateNext;
+ _animationNext = animationNext;
+}
+
+bool AIScriptGenericWalkerC::ReachedMovementTrackWaypoint(int waypointId) {
+ return true;
+}
+
+void AIScriptGenericWalkerC::FledCombat() {
+ //return false;
+}
+
+void AIScriptGenericWalkerC::movingStart() {
+ float mccoyX, mccoyY, mccoyZ;
+ float walkerX, walkerY, walkerZ;
+
+ Actor_Query_XYZ(kActorMcCoy, &mccoyX, &mccoyY, &mccoyZ);
+ Actor_Query_XYZ(kActorGenwalkerC, &walkerX, &walkerY, &walkerZ);
+
+ deltaX = walkerX - mccoyX;
+ deltaZ = walkerZ - mccoyZ;
+
+ float dist = sqrt(deltaX * deltaX + deltaZ * deltaZ);
+ if (dist == 0.0f) {
+ deltaZ = 0.0f;
+ deltaX = 0.0f;
+ } else {
+ deltaX *= 10.0f / dist;
+ deltaZ *= 10.0f / dist;
+ }
+}
+
+void AIScriptGenericWalkerC::movingUpdate() {
+ float walkerX, walkerY, walkerZ;
+
+ Actor_Query_XYZ(kActorGenwalkerC, &walkerX, &walkerY, &walkerZ);
+ int facing = Actor_Query_Facing_1024(kActorGenwalkerC);
+
+ walkerX += deltaX;
+ walkerZ += deltaZ;
+
+ deltaX = deltaX * 0.97f;
+ deltaZ = deltaZ * 0.97f;
+
+ Actor_Set_At_XYZ(kActorGenwalkerC, walkerX, walkerY, walkerZ, facing);
+
+}
+
+bool AIScriptGenericWalkerC::prepareWalker() {
+ if (Game_Flag_Query(kFlagGenericWalkerWaiting) || Global_Variable_Query(35) < 2 || !preparePath()) {
+ return false;
+ }
+
+ int model = 0;
+ do {
+ if (isInside) {
+ model = Random_Query(3, 5);
+ } else {
+ model = Random_Query(0, 5);
+ }
+ }
+ // Here is probably bug in original code, because it not using kVariableGenericWalkerBModel but kVariableGenericWalkerCModel
+ while (model == Global_Variable_Query(kVariableGenericWalkerAModel) || model == Global_Variable_Query(kVariableGenericWalkerBModel));
+
+
+ Global_Variable_Set(kVariableGenericWalkerCModel, model);
+ Game_Flag_Set(kFlagGenericWalkerWaiting);
+ AI_Countdown_Timer_Reset(kActorGenwalkerC, 2);
+ AI_Countdown_Timer_Start(kActorGenwalkerC, 2, Random_Query(4, 12));
+ Actor_Set_Goal_Number(kActorGenwalkerC, 1);
+ return true;
+}
+
+bool AIScriptGenericWalkerC::preparePath() {
+ AI_Movement_Track_Flush(kActorGenwalkerC);
+ int set = Player_Query_Current_Set();
+
+ if (set == kSetAR01_AR02) {
+ isInside = false;
+ int waypointStart = Random_Query(155, 158);
+ int waypointEnd = 0;
+ AI_Movement_Track_Append(kActorGenwalkerC, waypointStart, 0);
+ do {
+ waypointEnd = Random_Query(155, 158);
+ } while (waypointEnd == waypointStart);
+ if ((waypointStart == 155 || waypointStart == 156) && (waypointEnd == 157 || waypointEnd == 158)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 159, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 160, 0);
+ if (Random_Query(0, 3) == 0) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerC, 161, Random_Query(15, 30), 904);
+ }
+ } else if ((waypointEnd == 155 || waypointEnd == 156) && (waypointStart == 157 || waypointStart == 158)) {
+ if (Random_Query(0, 3) == 0) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerC, 161, Random_Query(15, 30), 904);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerC, 160, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 159, 0);
+ } else if ((waypointStart == 155 && waypointEnd == 156) || (waypointStart == 156 && waypointEnd == 155)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 159, 0);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerC, waypointEnd, 0);
+ AI_Movement_Track_Repeat(kActorGenwalkerC);
+ return true;
+ }
+
+ if (set == kSetCT01_CT12) {
+ isInside = false;
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 54, 1);
+ if (Random_Query(1, 3) == 1) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 56, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 43, 1);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerC, 53, 1);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerC, 40, 1);
+ AI_Movement_Track_Repeat(kActorGenwalkerC);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerC, 53, 1);
+ if (Random_Query(1, 3) == 1) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 43, 1);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerC, 54, 1);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerC, 40, 1);
+ AI_Movement_Track_Repeat(kActorGenwalkerC);
+ }
+ return true;
+ }
+
+ if (set == kSetHC01_HC02_HC03_HC04) {
+ isInside = true;
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 164, 0);
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 162, 0);
+ } else if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 162, 0);
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerC, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 162, 0);
+ }
+ } else {
+ AI_Movement_Track_Append(kActorGenwalkerC, 162, 0);
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 164, 0);
+ } else {
+ if (Random_Query(0, 1)) {
+ AI_Movement_Track_Append_With_Facing(kActorGenwalkerC, 166, 0, 30);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerC, 163, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 164, 0);
+ }
+ }
+ AI_Movement_Track_Repeat(kActorGenwalkerC);
+ return true;
+ }
+
+ if (set == kSetRC03) {
+ isInside = false;
+ int waypointStart = 0;
+ int waypointEnd = 0;
+ do {
+ waypointStart = Random_Query(167, 171);
+ } while (waypointEnd == 168 || waypointEnd == 169);
+ do {
+ waypointEnd = Random_Query(167, 171);
+ } while (waypointEnd == waypointStart || waypointEnd == 168 || waypointEnd == 169);
+ AI_Movement_Track_Append(kActorGenwalkerC, waypointStart, 0);
+ if (waypointStart == 170) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 169, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 168, 0);
+ } else if (waypointEnd == 170) {
+ AI_Movement_Track_Append(kActorGenwalkerC, 168, 0);
+ AI_Movement_Track_Append(kActorGenwalkerC, 169, 0);
+ }
+ AI_Movement_Track_Append(kActorGenwalkerC, waypointEnd, 0);
+ AI_Movement_Track_Repeat(kActorGenwalkerC);
+ return true;
+ }
+
+ return false;
+}
+
+} // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/ai/mccoy.cpp b/engines/bladerunner/script/ai/mccoy.cpp
index b38e328fe0..f86a328373 100644
--- a/engines/bladerunner/script/ai/mccoy.cpp
+++ b/engines/bladerunner/script/ai/mccoy.cpp
@@ -1699,7 +1699,7 @@ void AIScriptMcCoy::sub_4054F0() {
if ((z < 220.0f) && (-210.0f < x) && (-70.0f > x)) {
Game_Flag_Set(682);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
Actor_Set_Goal_Number(kActorMcCoy, 390);
Actor_Query_XYZ(kActorFreeSlotA, &x, &y, &z);
if (-200.0 < x && -62.0f > x) {
diff --git a/engines/bladerunner/script/ai_script.cpp b/engines/bladerunner/script/ai_script.cpp
index 7b211aaa4c..4c03d61d66 100644
--- a/engines/bladerunner/script/ai_script.cpp
+++ b/engines/bladerunner/script/ai_script.cpp
@@ -44,6 +44,9 @@ AIScripts::AIScripts(BladeRunnerEngine *vm, int actorCount) {
_AIScripts[kActorOfficerLeary] = new AIScriptOfficerLeary(_vm);
_AIScripts[kActorLeon] = new AIScriptLeon(_vm);
_AIScripts[kActorMaggie] = new AIScriptMaggie(_vm);
+ _AIScripts[kActorGenwalkerA] = new AIScriptGenericWalkerA(_vm);
+ _AIScripts[kActorGenwalkerB] = new AIScriptGenericWalkerB(_vm);
+ _AIScripts[kActorGenwalkerC] = new AIScriptGenericWalkerC(_vm);
}
AIScripts::~AIScripts() {
@@ -64,13 +67,14 @@ void AIScripts::initialize(int actor) {
void AIScripts::update(int actor) {
assert(actor < _actorCount);
- if (this->_actorUpdating[actor] != 1) {
- this->_actorUpdating[actor] = true;
- ++this->_inScriptCounter;
- if (_AIScripts[actor])
+ if (!_actorUpdating[actor]) {
+ _actorUpdating[actor] = true;
+ ++_inScriptCounter;
+ if (_AIScripts[actor]) {
_AIScripts[actor]->Update();
- --this->_inScriptCounter;
- this->_actorUpdating[actor] = false;
+ }
+ --_inScriptCounter;
+ _actorUpdating[actor] = false;
}
}
diff --git a/engines/bladerunner/script/ai_script.h b/engines/bladerunner/script/ai_script.h
index 066de29445..8577682463 100644
--- a/engines/bladerunner/script/ai_script.h
+++ b/engines/bladerunner/script/ai_script.h
@@ -156,6 +156,39 @@ DECLARE_SCRIPT(Maggie)
float sub_44B200(int actorId, float x, float y, float z);
END_SCRIPT
+DECLARE_SCRIPT(GenericWalkerA)
+ bool isInside;
+ float deltaX;
+ float deltaZ;
+
+ void movingStart();
+ void movingUpdate();
+ bool prepareWalker();
+ bool preparePath();
+END_SCRIPT
+
+DECLARE_SCRIPT(GenericWalkerB)
+ bool isInside;
+ float deltaX;
+ float deltaZ;
+
+ void movingStart();
+ void movingUpdate();
+ bool prepareWalker();
+ bool preparePath();
+END_SCRIPT
+
+DECLARE_SCRIPT(GenericWalkerC)
+ bool isInside;
+ float deltaX;
+ float deltaZ;
+
+ void movingStart();
+ void movingUpdate();
+ bool prepareWalker();
+ bool preparePath();
+END_SCRIPT
+
#undef DECLARE_SCRIPT
#undef END_SCRIPT
diff --git a/engines/bladerunner/script/init_script.cpp b/engines/bladerunner/script/init_script.cpp
index 2c0b530118..fcb8968e31 100644
--- a/engines/bladerunner/script/init_script.cpp
+++ b/engines/bladerunner/script/init_script.cpp
@@ -59,8 +59,8 @@ void InitScript::Init_Globals() {
Global_Variable_Set(i, 0);
Global_Variable_Set(35, 2);
- Global_Variable_Set(1, 1);
- Global_Variable_Set(2, 100);
+ Global_Variable_Set(kVariableChapter, 1);
+ Global_Variable_Set(kVariableChinyen, 100);
Set_Score(0, 0);
Set_Score(1, 64);
diff --git a/engines/bladerunner/script/scene/bb02.cpp b/engines/bladerunner/script/scene/bb02.cpp
index a507f4dd67..fed5ee9c0f 100644
--- a/engines/bladerunner/script/scene/bb02.cpp
+++ b/engines/bladerunner/script/scene/bb02.cpp
@@ -100,7 +100,7 @@ bool SceneScriptBB02::ClickedOnExit(int exitId) {
if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, -12.0f, -415.06f, -27.0f, 0, 1, false, 0)) {
Player_Loses_Control();
if (!Game_Flag_Query(493)) {
- Scene_Loop_Start_Special(kSceneLoopMode2, 0, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 0, true);
}
Game_Flag_Set(332);
Game_Flag_Reset(493);
diff --git a/engines/bladerunner/script/scene/ct02.cpp b/engines/bladerunner/script/scene/ct02.cpp
index e94e0ba719..499ad13695 100644
--- a/engines/bladerunner/script/scene/ct02.cpp
+++ b/engines/bladerunner/script/scene/ct02.cpp
@@ -152,7 +152,7 @@ void SceneScriptCT02::sub_401ACC() {
Actor_Set_Goal_Number(kActorZuben, 8);
Game_Flag_Set(293);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
}
break;
case 280:
@@ -165,7 +165,7 @@ void SceneScriptCT02::sub_401ACC() {
Actor_Set_Goal_Number(kActorZuben, 8);
Game_Flag_Set(293);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
}
break;
case 290:
@@ -181,7 +181,7 @@ void SceneScriptCT02::sub_401ACC() {
Actor_Set_Goal_Number(kActorZuben, 8);
Game_Flag_Set(293);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
}
break;
case 300:
@@ -192,7 +192,7 @@ void SceneScriptCT02::sub_401ACC() {
Actor_Set_Goal_Number(kActorZuben, 8);
Game_Flag_Set(293);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
}
break;
}
diff --git a/engines/bladerunner/script/scene/ct12.cpp b/engines/bladerunner/script/scene/ct12.cpp
index e8d3a5b804..5acf2fe898 100644
--- a/engines/bladerunner/script/scene/ct12.cpp
+++ b/engines/bladerunner/script/scene/ct12.cpp
@@ -271,7 +271,7 @@ void SceneScriptCT12::PlayerWalkedIn() {
}
void SceneScriptCT12::PlayerWalkedOut() {
- Game_Flag_Reset(443);
+ Game_Flag_Reset(kFlagGenericWalkerWaiting);
if (Game_Flag_Query(433)) {
Game_Flag_Reset(176);
Game_Flag_Set(259);
diff --git a/engines/bladerunner/script/scene/dr04.cpp b/engines/bladerunner/script/scene/dr04.cpp
index 81302e4e3f..937fd105b2 100644
--- a/engines/bladerunner/script/scene/dr04.cpp
+++ b/engines/bladerunner/script/scene/dr04.cpp
@@ -184,7 +184,7 @@ void SceneScriptDR04::SceneFrameAdvanced(int frame) {
Game_Flag_Reset(515);
Game_Flag_Reset(271);
Scene_Loop_Set_Default(1);
- Scene_Loop_Start_Special(kSceneLoopMode2, 6, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 6, true);
Music_Stop(4);
Actor_Set_Goal_Number(kActorMoraji, 99);
} else {
@@ -192,7 +192,7 @@ void SceneScriptDR04::SceneFrameAdvanced(int frame) {
Game_Flag_Reset(271);
Game_Flag_Set(272);
Scene_Loop_Set_Default(1);
- Scene_Loop_Start_Special(kSceneLoopMode2, 6, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 6, true);
Item_Remove_From_World(78);
}
switch (frame) {
diff --git a/engines/bladerunner/script/scene/hc03.cpp b/engines/bladerunner/script/scene/hc03.cpp
index 092fcca70b..7b89fc6652 100644
--- a/engines/bladerunner/script/scene/hc03.cpp
+++ b/engines/bladerunner/script/scene/hc03.cpp
@@ -100,7 +100,7 @@ bool SceneScriptHC03::ClickedOnItem(int itemId, bool a2) {
if (itemId == 121) {
if (a2) {
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
Game_Flag_Set(403);
Item_Remove_From_World(121);
Unobstacle_Object("GPscisGate", true);
@@ -146,7 +146,7 @@ bool SceneScriptHC03::ClickedOnExit(int exitId) {
Set_Enter(75, kSceneUG02);
} else {
Scene_Loop_Set_Default(6);
- Scene_Loop_Start_Special(kSceneLoopMode2, 5, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 5, true);
Game_Flag_Set(388);
}
}
diff --git a/engines/bladerunner/script/scene/hf04.cpp b/engines/bladerunner/script/scene/hf04.cpp
index 09a849c781..192d0e92a1 100644
--- a/engines/bladerunner/script/scene/hf04.cpp
+++ b/engines/bladerunner/script/scene/hf04.cpp
@@ -108,14 +108,14 @@ void SceneScriptHF04::SceneFrameAdvanced(int frame) {
if (Game_Flag_Query(585)) {
Game_Flag_Reset(585);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
//return true;
return;
}
if (Game_Flag_Query(586)) {
Game_Flag_Reset(586);
Scene_Loop_Set_Default(0);
- Scene_Loop_Start_Special(kSceneLoopMode2, 5, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 5, true);
//return true;
return;
}
diff --git a/engines/bladerunner/script/scene/hf05.cpp b/engines/bladerunner/script/scene/hf05.cpp
index e98bc8c805..ff497ebbe8 100644
--- a/engines/bladerunner/script/scene/hf05.cpp
+++ b/engines/bladerunner/script/scene/hf05.cpp
@@ -92,7 +92,7 @@ bool SceneScriptHF05::ClickedOn3DObject(const char *objectName, bool a2) {
Actor_Face_Heading(kActorMcCoy, 0, false);
Actor_Change_Animation_Mode(kActorMcCoy, 23);
Scene_Loop_Set_Default(5);
- Scene_Loop_Start_Special(kSceneLoopMode2, 4, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 4, true);
if (sub_4048C0()) {
if (sub_4048C0() == 3) {
Actor_Face_Heading(kActorDektora, 0, false);
diff --git a/engines/bladerunner/script/scene/hf06.cpp b/engines/bladerunner/script/scene/hf06.cpp
index f06e099406..7a41c9eda2 100644
--- a/engines/bladerunner/script/scene/hf06.cpp
+++ b/engines/bladerunner/script/scene/hf06.cpp
@@ -263,7 +263,7 @@ void SceneScriptHF06::sub_401EF4() {
Actor_Change_Animation_Mode(kActorSteele, 6);
Delay(500);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
Sound_Play(562, 50, 0, 0, 50);
Game_Flag_Set(559);
Scene_Exits_Disable();
diff --git a/engines/bladerunner/script/scene/kp03.cpp b/engines/bladerunner/script/scene/kp03.cpp
index bb8c005240..cb96e8bfe3 100644
--- a/engines/bladerunner/script/scene/kp03.cpp
+++ b/engines/bladerunner/script/scene/kp03.cpp
@@ -69,7 +69,7 @@ bool SceneScriptKP03::ClickedOn3DObject(const char *objectName, bool a2) {
if (Object_Query_Click("BRACK MID", objectName) && !Game_Flag_Query(422)) {
if (a2) {
Scene_Loop_Set_Default(5);
- Scene_Loop_Start_Special(kSceneLoopMode2, 4, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 4, true);
Actor_Change_Animation_Mode(kActorMcCoy, 39);
Actor_Retired_Here(kActorMcCoy, 72, 18, 1, -1);
Game_Flag_Set(422);
@@ -90,7 +90,7 @@ bool SceneScriptKP03::ClickedOn3DObject(const char *objectName, bool a2) {
Game_Flag_Set(484);
Game_Flag_Reset(421);
Scene_Loop_Set_Default(7);
- Scene_Loop_Start_Special(kSceneLoopMode2, 0, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 0, false);
Actor_Voice_Over(1110, kActorVoiceOver);
Actor_Voice_Over(1120, kActorVoiceOver);
} else {
@@ -178,7 +178,7 @@ void SceneScriptKP03::SceneFrameAdvanced(int frame) {
}
if (v1 != -1) {
Scene_Loop_Set_Default(5);
- Scene_Loop_Start_Special(kSceneLoopMode2, 4, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 4, true);
Game_Flag_Set(422);
Game_Flag_Reset(421);
Unclickable_Object("BRACK MID");
@@ -244,7 +244,7 @@ void SceneScriptKP03::sub_401E54() {
Game_Flag_Set(484);
Game_Flag_Reset(421);
Scene_Loop_Set_Default(7);
- Scene_Loop_Start_Special(kSceneLoopMode2, 7, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 7, false);
Actor_Set_Goal_Number(kActorSteele, 413);
Actor_Says(kActorMcCoy, 2195, 14);
Ambient_Sounds_Play_Sound(151, 40, -60, -60, 0);
diff --git a/engines/bladerunner/script/scene/ma05.cpp b/engines/bladerunner/script/scene/ma05.cpp
index 519f43e30b..a10086168c 100644
--- a/engines/bladerunner/script/scene/ma05.cpp
+++ b/engines/bladerunner/script/scene/ma05.cpp
@@ -117,7 +117,7 @@ void SceneScriptMA05::PlayerWalkedIn() {
Music_Play(2, 52, 0, 2, -1, 0, 0);
if ((Random_Query(0, 4) == 1 || (Game_Flag_Query(kFlagChapter1Ending) && !Game_Flag_Query(kFlagChapter1Ended))) && Global_Variable_Query(kVariableChapter) == 1) {
Scene_Loop_Set_Default(kMA05LoopMain);
- Scene_Loop_Start_Special(kSceneLoopMode2, kMA05LoopSpinner, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, kMA05LoopSpinner, true);
Sound_Play(69, 100, 0, 0, 50);
}
if (Game_Flag_Query(kFlagChapter1Ending) && !Game_Flag_Query(kFlagChapter1Ended)) {
diff --git a/engines/bladerunner/script/scene/ma06.cpp b/engines/bladerunner/script/scene/ma06.cpp
index 3f385271e8..cf69ded5f3 100644
--- a/engines/bladerunner/script/scene/ma06.cpp
+++ b/engines/bladerunner/script/scene/ma06.cpp
@@ -134,7 +134,7 @@ void SceneScriptMA06::activateElevator() {
Player_Gains_Control();
int floor = Elevator_Activate(kElevatorMA);
Player_Loses_Control();
- Scene_Loop_Start_Special(kSceneLoopMode2, 1, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, kMA06LoopMain, true);
if (floor > 1) {
Game_Flag_Set(kFlagMA06toMA07);
} else if (floor == 1) {
diff --git a/engines/bladerunner/script/scene/nr08.cpp b/engines/bladerunner/script/scene/nr08.cpp
index ef54702191..9af74908eb 100644
--- a/engines/bladerunner/script/scene/nr08.cpp
+++ b/engines/bladerunner/script/scene/nr08.cpp
@@ -150,7 +150,7 @@ void SceneScriptNR08::SceneFrameAdvanced(int frame) {
Game_Flag_Set(636);
Scene_Exits_Disable();
Scene_Loop_Set_Default(1);
- Scene_Loop_Start_Special(kSceneLoopMode2, 3, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 3, true);
}
if (frame == 95) {
Actor_Put_In_Set(kActorDektora, 91);
diff --git a/engines/bladerunner/script/scene/nr10.cpp b/engines/bladerunner/script/scene/nr10.cpp
index c3f7bd85a7..f580463187 100644
--- a/engines/bladerunner/script/scene/nr10.cpp
+++ b/engines/bladerunner/script/scene/nr10.cpp
@@ -71,7 +71,7 @@ bool SceneScriptNR10::ClickedOn3DObject(const char *objectName, bool a2) {
Ambient_Sounds_Remove_Looping_Sound(452, true);
Sound_Play(453, 52, 0, 0, 50);
Scene_Loop_Set_Default(0);
- Scene_Loop_Start_Special(kSceneLoopMode2, 0, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 0, true);
Un_Combat_Target_Object("BOX18");
Scene_Exits_Enable();
return true;
diff --git a/engines/bladerunner/script/scene/nr11.cpp b/engines/bladerunner/script/scene/nr11.cpp
index 20a1706704..95ef4b7d84 100644
--- a/engines/bladerunner/script/scene/nr11.cpp
+++ b/engines/bladerunner/script/scene/nr11.cpp
@@ -122,7 +122,7 @@ bool SceneScriptNR11::ClickedOn3DObject(const char *objectName, bool a2) {
}
Actor_Set_Goal_Number(kActorMcCoy, 230);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
} else if (Actor_Query_Goal_Number(kActorDektora) == 250) {
if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, 24.0f, 0.33f, 0.0f, 0, 1, false, 0)) {
Actor_Face_XYZ(kActorMcCoy, -180.0f, 0.0f, -170.0f, true);
@@ -260,7 +260,7 @@ void SceneScriptNR11::SceneFrameAdvanced(int frame) {
}
Actor_Set_Goal_Number(kActorMcCoy, 230);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
Game_Flag_Reset(635);
} else {
if (frame < 61 || frame > 120) {
diff --git a/engines/bladerunner/script/scene/rc01.cpp b/engines/bladerunner/script/scene/rc01.cpp
index 11eb28ee86..83d12d0f39 100644
--- a/engines/bladerunner/script/scene/rc01.cpp
+++ b/engines/bladerunner/script/scene/rc01.cpp
@@ -50,12 +50,12 @@ void SceneScriptRC01::InitializeScene() {
#if BLADERUNNER_DEBUG_GAME
//TODO: not part of game, remove
Game_Flag_Set(kFlagIntroPlayed); // force skip intro
- Game_Flag_Set(kFlagRC02toRC01); // no landing
+ Game_Flag_Set(kFlagRC02toRC01); // no landing
// Game_Flag_Set(kFlagRC01PoliceDone);
// Game_Flag_Set(kFlagKIAPrivacyAddon);
// Game_Flag_Set(kFlagZubenRetired);
// Game_Flag_Set(kFlagSpinnerToMA01);
- // Set_Enter(kSetMA02_MA04, kSceneMA02);
+ // Set_Enter(kSetMA02_MA04, kSceneMA04);
// Spinner_Set_Selectable_Destination_Flag(0, true);
// Spinner_Set_Selectable_Destination_Flag(1, true);
@@ -70,6 +70,10 @@ void SceneScriptRC01::InitializeScene() {
// ESPER_Flag_To_Activate();
// Voight_Kampff_Activate(kActorLucy, 50);
+
+ // Global_Variable_Set(kVariableChapter, 2);
+ // Chapter_Enter(2, kSetRC03, kSceneRC03);
+
#endif
if (!Game_Flag_Query(kFlagIntroPlayed)) {
diff --git a/engines/bladerunner/script/scene/tb07.cpp b/engines/bladerunner/script/scene/tb07.cpp
index 21041fdd72..b45bc1e794 100644
--- a/engines/bladerunner/script/scene/tb07.cpp
+++ b/engines/bladerunner/script/scene/tb07.cpp
@@ -254,7 +254,7 @@ void SceneScriptTB07::sub_401B0C() {
Actor_Set_At_XYZ(kActorTyrell, 68.0f, 12.0f, 288.0f, 0);
Actor_Change_Animation_Mode(kActorTyrell, 0);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, false);
Actor_Start_Speech_Sample(kActorTyrell, 0);
Loop_Actor_Walk_To_XYZ(kActorTyrell, 44.0f, 12.0f, 176.0f, 0, 0, false, 0);
Actor_Face_Actor(kActorTyrell, kActorMcCoy, true);
diff --git a/engines/bladerunner/script/scene/ug01.cpp b/engines/bladerunner/script/scene/ug01.cpp
index 8c60aabd38..138f962cfc 100644
--- a/engines/bladerunner/script/scene/ug01.cpp
+++ b/engines/bladerunner/script/scene/ug01.cpp
@@ -80,7 +80,7 @@ bool SceneScriptUG01::ClickedOn3DObject(const char *objectName, bool a2) {
if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, -9.0f, -50.13f, -148.0f, 0, 1, false, 0) && !Game_Flag_Query(324)) {
Actor_Says(kActorMcCoy, 8525, 13);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
Game_Flag_Set(324);
} else {
Actor_Says(kActorMcCoy, 8525, 13);
diff --git a/engines/bladerunner/script/scene/ug10.cpp b/engines/bladerunner/script/scene/ug10.cpp
index 123693d8ef..bca6765e8f 100644
--- a/engines/bladerunner/script/scene/ug10.cpp
+++ b/engines/bladerunner/script/scene/ug10.cpp
@@ -74,7 +74,7 @@ void SceneScriptUG10::SceneLoaded() {
Obstacle_Object("SLUICEGATE_LEVER", true);
if (Global_Variable_Query(kVariableChapter) == 4 && !Game_Flag_Query(474) && Game_Flag_Query(172) && !Game_Flag_Query(693)) {
Scene_Loop_Set_Default(1);
- Scene_Loop_Start_Special(kSceneLoopMode2, 6, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 6, true);
Game_Flag_Set(693);
//return true;
}
@@ -158,13 +158,13 @@ bool SceneScriptUG10::ClickedOn2DRegion(int region) {
} else if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, 4.98f, 0.38f, 83.15f, 0, 1, false, 0)) {
if (Game_Flag_Query(474)) {
Scene_Loop_Set_Default(1);
- Scene_Loop_Start_Special(kSceneLoopMode2, 0, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 0, false);
Game_Flag_Reset(474);
Obstacle_Object("BOX01 BRIDGE", true);
Player_Loses_Control();
} else {
Scene_Loop_Set_Default(4);
- Scene_Loop_Start_Special(kSceneLoopMode2, 3, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 3, false);
Game_Flag_Set(474);
Unobstacle_Object("BOX01 BRIDGE", true);
Player_Loses_Control();
diff --git a/engines/bladerunner/script/scene/ug13.cpp b/engines/bladerunner/script/scene/ug13.cpp
index 09e33e8b1e..cdfa8ad806 100644
--- a/engines/bladerunner/script/scene/ug13.cpp
+++ b/engines/bladerunner/script/scene/ug13.cpp
@@ -87,13 +87,13 @@ bool SceneScriptUG13::ClickedOn3DObject(const char *objectName, bool a2) {
Actor_Face_Object(kActorMcCoy, "BOLLARD", true);
if (Game_Flag_Query(431)) {
Scene_Loop_Set_Default(1);
- Scene_Loop_Start_Special(kSceneLoopMode2, 0, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 0, false);
Game_Flag_Reset(431);
Game_Flag_Set(436);
return true;
} else {
Scene_Loop_Set_Default(4);
- Scene_Loop_Start_Special(kSceneLoopMode2, 3, false);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 3, false);
Game_Flag_Set(431);
Scene_Exit_Remove(0);
return true;
diff --git a/engines/bladerunner/script/scene/ug15.cpp b/engines/bladerunner/script/scene/ug15.cpp
index 760e9c42f8..8477e5b46f 100644
--- a/engines/bladerunner/script/scene/ug15.cpp
+++ b/engines/bladerunner/script/scene/ug15.cpp
@@ -168,7 +168,7 @@ void SceneScriptUG15::SceneFrameAdvanced(int frame) {
Game_Flag_Set(724);
Game_Flag_Set(682);
Scene_Loop_Set_Default(3);
- Scene_Loop_Start_Special(kSceneLoopMode2, 2, true);
+ Scene_Loop_Start_Special(kSceneLoopModeOnce, 2, true);
Actor_Set_Goal_Number(kActorMcCoy, 390);
Actor_Query_XYZ(kActorFreeSlotA, &x, &y, &z);
if (-200.0f < x && -62.0f > x) {
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index f88f330e2f..b7b6e477d8 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -848,7 +848,7 @@ void ScriptBase::Scene_Loop_Set_Default(int loopId) {
}
void ScriptBase::Scene_Loop_Start_Special(int sceneLoopMode, int loopId, bool immediately) {
- if (sceneLoopMode == kSceneLoopModeChangeSet) {
+ if (sceneLoopMode == kSceneLoopModeOnce) {
immediately = true;
}
_vm->_scene->loopStartSpecial(sceneLoopMode, loopId, immediately);