aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/script/ai/generic_walker_b.cpp
diff options
context:
space:
mode:
authorPeter Kohaut2018-02-25 19:31:52 +0100
committerPeter Kohaut2018-02-25 22:38:52 +0100
commit62b75b99908f9cf1ea60bd4dfa415395e80d5c78 (patch)
tree91f2b2b058252ea4c7d7fe8e8e4a7d71850d7099 /engines/bladerunner/script/ai/generic_walker_b.cpp
parent842c67fc34fdc1ff932c8cf70c768e6ad8157038 (diff)
downloadscummvm-rg350-62b75b99908f9cf1ea60bd4dfa415395e80d5c78.tar.gz
scummvm-rg350-62b75b99908f9cf1ea60bd4dfa415395e80d5c78.tar.bz2
scummvm-rg350-62b75b99908f9cf1ea60bd4dfa415395e80d5c78.zip
BLADERUNNER: Added Generic Walker actors
Fixed isseue of duplicating items in world Fixed fog issue with incorrect rendering in special occasions Added basic debugger console Refactored looping code for better readability
Diffstat (limited to 'engines/bladerunner/script/ai/generic_walker_b.cpp')
-rw-r--r--engines/bladerunner/script/ai/generic_walker_b.cpp458
1 files changed, 458 insertions, 0 deletions
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