diff options
Diffstat (limited to 'engines/bladerunner/script')
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); |