scummvm/engines/bladerunner/script/ai/steele.cpp
2023-07-05 14:57:58 +03:00

2383 lines
71 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "bladerunner/script/ai_script.h"
namespace BladeRunner {
AIScriptSteele::AIScriptSteele(BladeRunnerEngine *vm) : AIScriptBase(vm) {
_resumeIdleAfterFramesetCompletesFlag = false;
// _varChooseIdleAnimation can have valid values: 0, 1, 3 (value 2 is skipped)
_varChooseIdleAnimation = 0;
_varNumOfTimesToHoldCurrentFrame = 0;
}
void AIScriptSteele::Initialize() {
_animationFrame = 0;
_animationState = 0;
_animationStateNext = 0;
_animationNext = 0;
_resumeIdleAfterFramesetCompletesFlag = false;
_varChooseIdleAnimation = 0;
_varNumOfTimesToHoldCurrentFrame = 0;
Actor_Put_In_Set(kActorSteele, kSetFreeSlotG);
Actor_Set_At_Waypoint(kActorSteele, 39, 0);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleDefault);
Actor_Clue_Acquire(kActorSteele, kClueCrimeSceneNotes, true, -1);
}
bool AIScriptSteele::Update() {
if ( Global_Variable_Query(kVariableMcCoyEvidenceMissed) > 5
&& !Actor_Clue_Query(kActorSteele, kClueMcCoyIsStupid)
) {
Actor_Clue_Acquire(kActorSteele, kClueMcCoyIsStupid, true, -1);
return true;
}
switch (Global_Variable_Query(kVariableChapter)) {
case 1:
if (Game_Flag_Query(kFlagMcCoyInRunciters)
&& Game_Flag_Query(kFlagSteeleInRunciters)
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotC1);
return true;
}
if (Game_Flag_Query(kFlagMcCoyInChinaTown)
&& Game_Flag_Query(kFlagSteeleInChinaTown)
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotC2);
return true;
}
if (Game_Flag_Query(kFlagMcCoyInPoliceStation)
&& Game_Flag_Query(kFlagSteeleInPoliceStation)
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotG3);
return true;
}
if ( Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleDefault
&& !Game_Flag_Query(kFlagMcCoyInRunciters)
&& Player_Query_Current_Scene() != kSceneRC01
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToRC01);
Game_Flag_Set(kFlagSteeleInRunciters);
return true;
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleInterviewGrigorian) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleDefault);
return true;
}
break;
case 2:
if ( Game_Flag_Query(kFlagTB05Entered)
&& !Game_Flag_Query(kFlagTB02SteeleEnter)
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToTB02);
Game_Flag_Set(kFlagTB02SteeleEnter);
return true;
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleGoToTB02
&& Game_Flag_Query(kFlagTB02SteeleTalk)) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleLeaveTB02);
return true;
}
if (!Game_Flag_Query(kFlagSteeleWalkingAround)
&& Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleGoToPoliceStation
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleWalkAround);
Game_Flag_Set(kFlagSteeleWalkingAround);
return true;
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleWalkAroundRestart) {
Game_Flag_Reset(kFlagSteeleWalkingAround);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToPoliceStation);
return true;
}
break;
case 3:
if (Global_Variable_Query(kVariableChapter) != 3) { // TODO A BUG? why is this here? double check? redundant?
break;
}
if (Actor_Query_Goal_Number(kActorSteele) < kGoalSteeleStartChapter3) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleStartChapter3);
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR01TalkToGordo
&& Player_Query_Current_Scene() == kSceneNR01
&& Actor_Query_In_Between_Two_Actors(kActorMcCoy, kActorSteele, kActorGordo)
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01ShootMcCoy);
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR11Entered) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR11Decide);
return true;
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR01PrepareTalkAboutShotGun) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01TalkAboutShotGun);
return true;
}
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR01PrepareShotByMcCoy) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01ShotByMcCoy);
return true;
}
break;
case 4:
if (Actor_Query_Goal_Number(kActorSteele) < kGoalSteeleStartChapter4) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleStartChapter4);
}
break;
case 5:
if (Game_Flag_Query(kFlagMcCoyIsHelpingReplicants)
&& Actor_Query_Goal_Number(kActorSteele) < kGoalSteeleStartChapter5
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleStartChapter5);
return true;
}
break;
default:
break;
}
if ( Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleGone
&& !Actor_Query_In_Set(kActorSteele, kSetFreeSlotI)
) {
if (Actor_Query_Which_Set_In(kActorMcCoy) != Actor_Query_Which_Set_In(kActorSteele)) {
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 41, 100);
AI_Movement_Track_Repeat(kActorSteele);
}
}
return false;
}
void AIScriptSteele::TimerExpired(int timer) {
if (timer == kActorTimerAIScriptCustomTask0
&& Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR11StartWaiting
) {
if (Player_Query_Current_Scene() == kSceneNR11) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR11Enter);
} else {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR11StopWaiting);
}
return; // true;
}
if (timer == kActorTimerAIScriptCustomTask1) {
int goal = Actor_Query_Goal_Number(kActorSteele);
AI_Countdown_Timer_Reset(kActorSteele, kActorTimerAIScriptCustomTask1);
if (goal == kGoalSteeleKP03Exploded) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleKP03Dying);
} else if (goal == kGoalSteeleKP03Dying) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleKP03Dead);
}
}
return; // false;
}
void AIScriptSteele::CompletedMovementTrack() {
switch (Actor_Query_Goal_Number(kActorSteele)) {
case kGoalSteeleGoToRC01:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToRC02);
break;
case kGoalSteeleGoToRC02:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotC1);
break;
case kGoalSteeleGoToFreeSlotC1:
if (Random_Query(1, 3) == 1) {
Actor_Clues_Transfer_New_To_Mainframe(kActorSteele);
Actor_Clues_Transfer_New_From_Mainframe(kActorSteele);
}
if (Query_Score(kActorMcCoy) > Query_Score(kActorSteele)
&& Query_Score(kActorMcCoy) < 75
) {
Set_Score(kActorSteele, Random_Query(2, 5) + Query_Score(kActorMcCoy));
}
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotG1);
break;
case kGoalSteeleGoToFreeSlotG1:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToCT01);
break;
case kGoalSteeleGoToCT01:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotC2);
break;
case kGoalSteeleGoToFreeSlotC2:
if (Random_Query(1, 3) == 1) {
Actor_Clues_Transfer_New_To_Mainframe(kActorSteele);
Actor_Clues_Transfer_New_From_Mainframe(kActorSteele);
}
if (Query_Score(kActorMcCoy) > Query_Score(kActorSteele)
&& Query_Score(kActorMcCoy) < 75
) {
Set_Score(kActorSteele, Random_Query(2, 5) + Query_Score(kActorMcCoy));
}
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotG2);
break;
case kGoalSteeleGoToFreeSlotG2:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToPoliceShootingRange);
break;
case kGoalSteeleGoToPoliceShootingRange:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToPS02);
break;
case kGoalSteeleGoToPS02:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToFreeSlotG3);
break;
case kGoalSteeleGoToFreeSlotG3:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleInterviewGrigorian);
break;
case kGoalSteeleApprehendIzo:
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleApprehendIzo) { //why is this here? double check?
Player_Set_Combat_Mode(false);
if (Actor_Query_Goal_Number(kActorIzo) != kGoalIzoDie) {
if (Actor_Query_In_Between_Two_Actors(kActorMcCoy, kActorSteele, kActorIzo)) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleIzoBlockedByMcCoy);
} else if (Game_Flag_Query(kFlagIzoIsReplicant)) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleShootIzo);
} else {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleArrestIzo);
}
}
}
break;
case kGoalSteeleLeaveTB02:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToPoliceStation);
break;
case kGoalSteeleWalkAround:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleWalkAroundRestart);
break;
case kGoalSteeleHF02ShootLucy:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleHF02LucyShotBySteele);
break;
case kGoalSteeleKP01Leave:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleKP01Left);
break;
case kGoalSteeleKP06Enter:
Player_Set_Combat_Mode(false);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 2265, 11);
Actor_Says(kActorSteele, 640, 58);
Actor_Says(kActorMcCoy, 2270, 12);
Actor_Says(kActorSteele, 650, 59);
Actor_Says(kActorMcCoy, 2275, 16);
Actor_Says(kActorMcCoy, 2280, 15);
Actor_Says(kActorSteele, 660, 60);
Actor_Says(kActorSteele, 670, 59);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleKP06Leave);
Player_Set_Combat_Mode(true);
Loop_Actor_Walk_To_XYZ(kActorMcCoy, -731.0f, 8.26f, -657.0f, 0, false, false, false);
Ambient_Sounds_Remove_All_Non_Looping_Sounds(true);
Ambient_Sounds_Remove_All_Looping_Sounds(1u);
Game_Flag_Set(kFlagKP06toKP07);
Set_Enter(kSetKP07, kSceneKP07);
break;
}
return; //true;
}
void AIScriptSteele::ReceivedClue(int clueId, int fromActorId) {
//return false;
}
void AIScriptSteele::ClickedByPlayer() {
int goal = Actor_Query_Goal_Number(kActorSteele);
if (goal == kGoalSteeleGone) {
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 8630, 14);
return; //true;
}
if (goal > 399
|| Global_Variable_Query(kVariableChapter) > 2
) {
return; //true;
}
if (goal == kGoalSteeleHF02ShootLucy) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleHF02LucyShotBySteele);
return; //true;
}
if (goal == kGoalSteeleNR01ConfrontGordo) {
return; //true;
}
#if BLADERUNNER_ORIGINAL_BUGS
#else
if (goal == kGoalSteeleApprehendIzo
|| goal == kGoalSteeleArrestIzo
|| goal == kGoalSteeleShootIzo
) {
// don't interrupt Steele before she apprehends Izo
return; //true;
}
#endif // BLADERUNNER_ORIGINAL_BUGS
AI_Movement_Track_Pause(kActorSteele);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
switch (Random_Query(1, 3)) {
case 1:
Actor_Says(kActorMcCoy, 3970, 15);
Actor_Says(kActorSteele, 2700, 15);
break;
case 2:
Actor_Says(kActorMcCoy, 3970, 15);
Actor_Says(kActorSteele, 2060, 15);
break;
case 3:
Actor_Says(kActorMcCoy, 3970, 15);
Actor_Says(kActorSteele, 1750, 15);
break;
}
AI_Movement_Track_Unpause(kActorSteele);
return; //false;
}
void AIScriptSteele::EnteredSet(int setId) {
#if BLADERUNNER_ORIGINAL_BUGS
#else
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleGoToRC01) {
if (!Actor_Clue_Query(kActorMcCoy, kClueOfficersStatement))
{
// no random factor here, Steele will definitely get this clue in this case
// McCoy can still get this clue on his own (directly from the officer, if the officer is still at Runciters) -- even if McCoy got it from the mainframe via Steele
Actor_Clue_Acquire(kActorSteele, kClueOfficersStatement, true, kActorOfficerLeary); // Steele will upload this to the mainframe when she heads to the Police Station
Global_Variable_Increment(kVariableMcCoyEvidenceMissed, 1); // unused? but consistent with missing the other clues
return; //true;
}
}
#endif // BLADERUNNER_ORIGINAL_BUGS
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleGoToRC02) {
if (!Game_Flag_Query(kFlagRC51ChopstickWrapperTaken)
&& Random_Query(1, 3) == 1
) {
Actor_Clue_Acquire(kActorSteele, kClueChopstickWrapper, true, -1);
Game_Flag_Set(kFlagRC51ChopstickWrapperTaken);
if (Game_Flag_Query(kFlagRC51Discovered)) {
Item_Remove_From_World(kItemChopstickWrapper);
}
Global_Variable_Increment(kVariableMcCoyEvidenceMissed, 1);
return; //true;
}
if (!Game_Flag_Query(kFlagRC51CandyTaken)
&& Random_Query(1, 3) == 1
) {
Actor_Clue_Acquire(kActorSteele, kClueCandy, true, -1);
Game_Flag_Set(kFlagRC51CandyTaken);
if (Game_Flag_Query(kFlagRC51Discovered)) {
Item_Remove_From_World(kItemCandy);
}
return; //true;
}
if (!Game_Flag_Query(kFlagRC51ToyDogTaken)
&& Random_Query(1, 20) == 1
) {
Actor_Clue_Acquire(kActorSteele, kClueToyDog, true, -1);
Game_Flag_Set(kFlagRC51ToyDogTaken);
if (Game_Flag_Query(kFlagRC51Discovered)) {
Item_Remove_From_World(kItemToyDog);
}
return; //true;
}
}
if ( Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleGoToCT01
&& Actor_Query_In_Set(kActorSteele, kSetCT03_CT04)
&& Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
&& !Game_Flag_Query(kFlagCT04HomelessBodyInDumpster)
#if BLADERUNNER_ORIGINAL_BUGS
#else
&& !Game_Flag_Query(kFlagCT04HomelessBodyThrownAway)
#endif // BLADERUNNER_ORIGINAL_BUGS
&& !Game_Flag_Query(kFlagCT04HomelessBodyFound)
) {
Game_Flag_Set(kFlagCT04HomelessBodyFound);
return; //true;
}
return; //false;
}
void AIScriptSteele::OtherAgentEnteredThisSet(int otherActorId) {
// return false;
}
void AIScriptSteele::OtherAgentExitedThisSet(int otherActorId) {
// return false;
}
void AIScriptSteele::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {
if (otherActorId == kActorMcCoy
&& Actor_Query_Goal_Number(kActorSteele) == 410
)
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleKP03ShootMcCoy);
}
void AIScriptSteele::ShotAtAndMissed() {
// return false;
}
bool AIScriptSteele::ShotAtAndHit() {
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR01TalkToGordo) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01PrepareShotByMcCoy);
}
if (/* !a1 && */ Actor_Query_In_Set(kActorSteele, kSetHF06))
Non_Player_Actor_Combat_Mode_On(kActorSteele, kActorCombatStateUncover, true, kActorMcCoy, 15, kAnimationModeCombatIdle, kAnimationModeCombatWalk, kAnimationModeCombatRun, 0, 0, 100, 25, 300, false);
return false;
}
void AIScriptSteele::Retired(int byActorId) {
Game_Flag_Set(kFlagSteeleDead);
if (Actor_Query_Goal_Number(kActorSteele) == 450) {
Scene_Exits_Enable();
Game_Flag_Set(kFlagKP03BombDisarmed);
}
if (Actor_Query_Goal_Number(kActorSteele) != kGoalSteeleGone) {
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatDie);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGone);
}
}
int AIScriptSteele::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) {
if (otherActorId != kActorMcCoy) {
return 0;
}
switch (clueId) {
case kClueMcCoyRecoveredHoldensBadge:
// fall through
case kClueMcCoyRetiredLucy:
// fall through
case kClueMcCoyRetiredDektora:
// fall through
case kClueMcCoyRetiredSadik:
// fall through
case kClueMcCoyShotZubenInTheBack:
// fall through
case kClueMcCoyRetiredLutherLance:
// fall through
case kClueClovisOrdersMcCoysDeath:
// fall through
case kClueMcCoyIsKind:
// fall through
case kClueMcCoyIsInsane:
return 5;
case kClueMcCoyKilledRunciter1:
// fall through
case kClueMcCoyShotGuzza:
// fall through
case kClueMcCoyKilledRunciter2:
return 0; // TODO shouldn't this be a negative number?
case kClueMcCoyLetZubenEscape:
return -4;
case kClueMcCoyWarnedIzo:
// fall through
case kClueMcCoyHelpedIzoIzoIsAReplicant:
// fall through
case kClueMcCoyHelpedDektora:
// fall through
case kClueMcCoyHelpedLucy:
// fall through
case kClueMcCoyHelpedGordo:
return -5;
case kClueMcCoyRetiredZuben:
return 4;
case kClueMcCoyIsStupid:
return -3;
case kClueMcCoyIsAnnoying:
return -2;
}
return 0;
}
double AIScriptSteele::comp_distance(int actorId, float a5, float a6, int a1, float a2, float a3, float a4) {
float actorZ;
float actorX;
float actorY;
Actor_Query_XYZ(actorId, &actorX, &actorY, &actorZ);
return sqrt((a4 - actorZ) * (a4 - actorZ) + (a2 - actorX) * (a2 - actorX) + (a3 - actorY) * (a3 - actorY));
}
bool AIScriptSteele::GoalChanged(int currentGoalNumber, int newGoalNumber) {
if (currentGoalNumber == kGoalSteeleGone) {
return false;
}
switch (newGoalNumber) {
// Chapter 1
case kGoalSteeleGoToRC01:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 12, 5);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToRC02:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 61, 30);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToFreeSlotC1:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 35, 45);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToFreeSlotG1:
AI_Movement_Track_Flush(kActorSteele);
Game_Flag_Set(kFlagSteeleInChinaTown);
Game_Flag_Reset(kFlagSteeleInRunciters);
AI_Movement_Track_Append(kActorSteele, 39, 45);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToCT01:
AI_Movement_Track_Flush(kActorSteele);
if (Random_Query(1, 10) == 1) {
AI_Movement_Track_Append(kActorSteele, 63, 20);
} else {
AI_Movement_Track_Append(kActorSteele, 64, 10);
}
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToFreeSlotC2:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 35, 45);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToFreeSlotG2:
AI_Movement_Track_Flush(kActorSteele);
Game_Flag_Set(kFlagSteeleInPoliceStation);
Game_Flag_Reset(kFlagSteeleInChinaTown);
AI_Movement_Track_Append(kActorSteele, 39, 45);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToPoliceShootingRange:
AI_Movement_Track_Flush(kActorSteele);
if (Random_Query(1, 2) == 1) {
AI_Movement_Track_Append(kActorSteele, 19, 10);
} else {
AI_Movement_Track_Append(kActorSteele, 35, 30);
}
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToPS02:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 62, 1);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToFreeSlotG3:
AI_Movement_Track_Flush(kActorSteele);
Game_Flag_Reset(kFlagSteeleInPoliceStation);
AI_Movement_Track_Append(kActorSteele, 39, 30);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleInterviewGrigorian:
Actor_Clue_Acquire(kActorSteele, kClueGrigorianInterviewA, true, kActorGrigorian);
if (Game_Flag_Query(kFlagIzoIsReplicant)) {
Actor_Clue_Acquire(kActorSteele, kClueGrigorianInterviewB1, true, kActorGrigorian);
} else {
Actor_Clue_Acquire(kActorSteele, kClueGrigorianInterviewB2, true, kActorGrigorian);
}
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleDefault);
return true;
// Chapter 2
case kGoalSteeleApprehendIzo:
AI_Movement_Track_Flush(kActorSteele);
if (Game_Flag_Query(kFlagIzoIsReplicant)) {
AI_Movement_Track_Append_Run(kActorSteele, 202, 0);
AI_Movement_Track_Append_Run(kActorSteele, 203, 0);
} else {
AI_Movement_Track_Append(kActorSteele, 174, 0);
AI_Movement_Track_Append_Run(kActorSteele, 175, 0);
}
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToTB02:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 192, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleLeaveTB02:
Loop_Actor_Walk_To_XYZ(kActorSteele, -187.82f, 0.08f, 1460.74f, 0, false, false, false);
Actor_Face_Heading(kActorSteele, 802, false);
Loop_Actor_Travel_Stairs(kActorSteele, 10, false, kAnimationModeIdle);
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 35, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleGoToPoliceStation:
if (Random_Query(1, 2) == 1) {
Actor_Clues_Transfer_New_To_Mainframe(kActorSteele);
Actor_Clues_Transfer_New_From_Mainframe(kActorSteele);
}
if (Query_Score(kActorMcCoy) > Query_Score(kActorSteele)
&& Query_Score(kActorMcCoy) < 75
) {
Set_Score(kActorSteele, Random_Query(2, 5) + Query_Score(kActorMcCoy));
}
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 35, Random_Query(45, 120));
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleWalkAround:
AI_Movement_Track_Flush(kActorSteele);
if (Random_Query(1, 5) == 1) { // Animoid row & Bradbury building
AI_Movement_Track_Append(kActorSteele, 222, 0);
AI_Movement_Track_Append_With_Facing(kActorSteele, 223, 3, 973);
AI_Movement_Track_Append(kActorSteele, 224, 5);
AI_Movement_Track_Append(kActorSteele, 216, 5);
AI_Movement_Track_Append(kActorSteele, 217, 0);
AI_Movement_Track_Append(kActorSteele, 218, 0);
AI_Movement_Track_Append(kActorSteele, 210, 0);
AI_Movement_Track_Append(kActorSteele, 211, 0);
AI_Movement_Track_Append(kActorSteele, 204, 0);
AI_Movement_Track_Append(kActorSteele, 205, 0);
AI_Movement_Track_Append(kActorSteele, 206, 0);
AI_Movement_Track_Append(kActorSteele, 39, 20);
AI_Movement_Track_Append(kActorSteele, 35, 60);
AI_Movement_Track_Append(kActorSteele, 39, 20);
AI_Movement_Track_Append(kActorSteele, 228, 0);
AI_Movement_Track_Append(kActorSteele, 229, 10);
AI_Movement_Track_Repeat(kActorSteele);
} else if (Random_Query(1, 3) == 1) { // Chinatown & DNA row
AI_Movement_Track_Append(kActorSteele, 232, 0);
AI_Movement_Track_Append(kActorSteele, 233, 0);
AI_Movement_Track_Append(kActorSteele, 234, 3);
AI_Movement_Track_Append(kActorSteele, 237, 0);
AI_Movement_Track_Append(kActorSteele, 238, 0);
AI_Movement_Track_Append(kActorSteele, 239, 0);
AI_Movement_Track_Append(kActorSteele, 240, 10);
AI_Movement_Track_Append(kActorSteele, 39, 120);
AI_Movement_Track_Append(kActorSteele, 243, 0);
AI_Movement_Track_Append(kActorSteele, 244, 10);
AI_Movement_Track_Repeat(kActorSteele);
} else { // Police station
AI_Movement_Track_Append(kActorSteele, 248, 0);
AI_Movement_Track_Append(kActorSteele, 249, 0);
AI_Movement_Track_Append(kActorSteele, 250, 10);
AI_Movement_Track_Append(kActorSteele, 253, 0);
AI_Movement_Track_Append_With_Facing(kActorSteele, 254, 3, 1015);
AI_Movement_Track_Append_With_Facing(kActorSteele, 255, 2, 1015);
AI_Movement_Track_Append_With_Facing(kActorSteele, 256, 3, 1015);
AI_Movement_Track_Append(kActorSteele, 257, 0);
AI_Movement_Track_Append(kActorSteele, 39, 30);
AI_Movement_Track_Append(kActorSteele, 35, 120);
AI_Movement_Track_Append(kActorSteele, 39, 30);
AI_Movement_Track_Repeat(kActorSteele);
}
return true;
case kGoalSteeleShootIzo:
Actor_Force_Stop_Walking(kActorMcCoy);
Sound_Play(kSfxSMCAL3, 100, 0, 0, 50);
// Scene_Exits_Enable() is done in Izo's kGoalIzoDie - CompletedMovementTrack() case
Actor_Set_Goal_Number(kActorIzo, kGoalIzoDie);
Actor_Change_Animation_Mode(kActorMcCoy, kAnimationModeIdle);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Loop_Actor_Walk_To_Actor(kActorSteele, 0, 48, false, true);
Actor_Says(kActorSteele, 1860, kAnimationModeTalk);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 4825, 18);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 1870, kAnimationModeTalk);
Actor_Says(kActorSteele, 1880, kAnimationModeTalk);
Actor_Says(kActorMcCoy, 4830, 13);
Actor_Says(kActorSteele, 1890, kAnimationModeTalk);
Actor_Says(kActorSteele, 1900, kAnimationModeTalk);
Actor_Face_Actor(kActorSteele, kActorIzo, true);
Actor_Says(kActorSteele, 1910, kAnimationModeTalk);
Actor_Says(kActorSteele, 1920, kAnimationModeTalk);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 1930, kAnimationModeTalk);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleLeaveRC03);
#if BLADERUNNER_ORIGINAL_BUGS
Player_Gains_Control(); // redundant - causes "WARNING: Unbalanced call to BladeRunnerEngine::playerGainsControl"
#endif // BLADERUNNER_ORIGINAL_BUGS
return true;
case kGoalSteeleArrestIzo:
Actor_Force_Stop_Walking(kActorMcCoy);
Actor_Face_Actor(kActorSteele, kActorIzo, true);
Actor_Change_Animation_Mode(kActorIzo, kAnimationModeIdle);
Actor_Face_Actor(kActorIzo, kActorSteele, true);
Actor_Says_With_Pause(kActorSteele, 2010, 0.0f, kAnimationModeCombatIdle);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
Loop_Actor_Walk_To_Actor(kActorSteele, kActorIzo, 60, false, false);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
_animationState = 23;
_animationFrame = 0;
Actor_Says(kActorIzo, 660, kAnimationModeTalk);
Actor_Says_With_Pause(kActorSteele, 2020, 0.0f, kAnimationModeCombatIdle);
Actor_Says_With_Pause(kActorSteele, 2030, 0.0f, kAnimationModeCombatIdle);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
Actor_Says(kActorIzo, 670, kAnimationModeTalk);
Actor_Says(kActorSteele, 2040, kAnimationModeCombatIdle);
Actor_Says(kActorIzo, 680, kAnimationModeTalk);
Actor_Says(kActorSteele, 2050, kAnimationModeTalk);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 2060, kAnimationModeTalk);
Actor_Says(kActorMcCoy, 4845, kAnimationModeTalk);
Actor_Says(kActorSteele, 2070, kAnimationModeTalk);
Actor_Says(kActorSteele, 2080, kAnimationModeTalk);
Actor_Face_Actor(kActorSteele, kActorIzo, true);
Actor_Says(kActorSteele, 2090, kAnimationModeTalk);
Actor_Says_With_Pause(kActorSteele, 2100, 1.0f, kAnimationModeTalk);
Actor_Says(kActorIzo, 690, kAnimationModeTalk);
Actor_Says(kActorSteele, 2110, kAnimationModeTalk);
Actor_Says(kActorSteele, 2120, kAnimationModeTalk);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 2140, kAnimationModeTalk);
Actor_Says(kActorMcCoy, 4850, kAnimationModeTalk);
Actor_Says(kActorSteele, 2150, kAnimationModeTalk);
// Scene_Exits_Enable() is done in Izo's kGoalIzoGetArrested - CompletedMovementTrack() case
Actor_Set_Goal_Number(kActorIzo, kGoalIzoGetArrested);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleLeaveRC03);
#if BLADERUNNER_ORIGINAL_BUGS
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleDefault); // TODO - a bug? why set to default here?
#endif // BLADERUNNER_ORIGINAL_BUGS
return true;
case kGoalSteeleIzoBlockedByMcCoy:
Actor_Force_Stop_Walking(kActorMcCoy);
Actor_Set_Goal_Number(kActorIzo, kGoalIzoRC03RunAway);
Actor_Says(kActorSteele, 1940, kAnimationModeTalk);
Loop_Actor_Walk_To_Actor(kActorSteele, kActorMcCoy, 60, false, true);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorSteele, 1950, kAnimationModeTalk);
Actor_Says(kActorMcCoy, 4835, 14);
Actor_Says(kActorSteele, 1980, kAnimationModeTalk);
Actor_Says(kActorMcCoy, 4840, 15);
Actor_Says(kActorSteele, 1990, kAnimationModeTalk);
Actor_Says(kActorSteele, 2000, kAnimationModeTalk);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleLeaveRC03);
Scene_Exits_Enable();
return true;
case 126: // not used anywhere
return true;
case kGoalSteeleLeaveRC03:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 174, 0);
AI_Movement_Track_Append(kActorSteele, 35, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
// Chapter 3
case 200:
AI_Movement_Track_Flush(kActorSteele);
return true;
case kGoalSteeleStartChapter3:
if (Query_Score(kActorMcCoy) > Query_Score(kActorSteele)
&& Query_Score(kActorMcCoy) < 75
) {
Set_Score(kActorSteele, Random_Query(2, 5) + Query_Score(kActorMcCoy));
}
if (Game_Flag_Query(kFlagBulletBobDead)) {
Game_Flag_Set(kFlagSteeleKnowsBulletBobIsDead);
}
AI_Movement_Track_Flush(kActorSteele);
Actor_Put_In_Set(kActorSteele, kSetFreeSlotC);
Actor_Set_At_Waypoint(kActorSteele, 35, 0);
return true;
case kGoalSteeleNR11StartWaiting:
AI_Countdown_Timer_Reset(kActorSteele, kActorTimerAIScriptCustomTask0);
AI_Countdown_Timer_Start(kActorSteele, kActorTimerAIScriptCustomTask0, 15);
return true;
case kGoalSteeleNR11StopWaiting:
AI_Countdown_Timer_Reset(kActorSteele, kActorTimerAIScriptCustomTask0);
return true;
case kGoalSteeleNR11Enter:
if (comp_distance(kActorMcCoy, -4.0, 0.33f, 0.0f, 100.0f, 0.33f, -4.0f) < 48.0f) {
Loop_Actor_Walk_To_XYZ(kActorMcCoy, 32.0f, 0.33f, 17.0f, 0, false, false, false);
}
AI_Countdown_Timer_Reset(kActorSteele, kActorTimerAIScriptCustomTask0);
Player_Loses_Control();
if (Actor_Query_Goal_Number(kActorDektora) == kGoalSteeleNR01ConfrontGordo) {
Async_Actor_Walk_To_XYZ(kActorMcCoy, -15.53f, 0.33f, 73.49f, 0, false);
}
Actor_Put_In_Set(kActorSteele, kSetNR11);
Actor_Set_At_XYZ(kActorSteele, 100.0f, -51.56f, 0.0, 0);
_animationState = 10;
_animationFrame = 0;
return true;
case kGoalSteeleNR11Entered:
// fall through
case 216:
// fall through
case kGoalSteeleNR01PrepareShotByMcCoy:
return true;
case kGoalSteeleNR11Decide:
Player_Gains_Control();
switch (Actor_Query_Goal_Number(kActorDektora)) {
case kGoalDektoraNR11Hiding:
Actor_Face_Heading(kActorMcCoy, 954, false);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
Delay(2000);
Actor_Says(kActorSteele, 1700, 58);
Actor_Says(kActorMcCoy, 3800, 3);
Actor_Says(kActorSteele, 1710, 59);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR11Shoot);
break;
case kGoalDektoraNR11WalkAway:
Actor_Face_Actor(kActorSteele, kActorDektora, true);
Actor_Says(kActorSteele, 1790, 3);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorMcCoy, 3830, 17);
Actor_Says(kActorSteele, 1800, 17);
Actor_Says(kActorMcCoy, 3835, 18);
Actor_Says(kActorSteele, 1810, 16);
Game_Flag_Set(kFlagDektoraRanAway);
Actor_Set_Goal_Number(kActorDektora, kGoalDektoraGone);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNRxxGoToSpinner);
break;
case kGoalDektoraNR11FallThroughWindow:
Actor_Modify_Friendliness_To_Other(kActorSteele, kActorMcCoy, 6);
Actor_Says(kActorSteele, 1750, 12);
Actor_Says(kActorMcCoy, 3815, 19);
Actor_Says(kActorSteele, 1760, 13);
Actor_Says(kActorMcCoy, 3820, 18);
Actor_Says(kActorSteele, 1770, 14);
Actor_Says(kActorSteele, 1780, 15);
Actor_Says(kActorMcCoy, 3825, 14);
Game_Flag_Set(kFlagDektoraRanAway);
Actor_Set_Goal_Number(kActorDektora, kGoalDektoraGone);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNRxxGoToSpinner);
}
return true;
case kGoalSteeleNR11Shoot:
Game_Flag_Set(kFlagNR11SteeleShoot);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatAttack);
Scene_Exits_Disable();
return true;
case kGoalSteeleNR01WaitForMcCoy:
AI_Movement_Track_Flush(kActorSteele);
Actor_Put_In_Set(kActorSteele, kSetNR01);
Actor_Set_At_XYZ(kActorSteele, 94.03f, 23.88f, -794.46f, 685);
return true;
case kGoalSteeleNR01GoToNR08:
AI_Movement_Track_Flush(kActorSteele);
Actor_Put_In_Set(kActorSteele, kSetNR05_NR08);
Actor_Set_At_XYZ(kActorSteele, -1034.09f, 0.32f, 224.77f, 440);
Game_Flag_Set(kFlagChapter4Starting);
Set_Enter(kSetNR05_NR08, kSceneNR08);
return true;
case kGoalSteeleNR01GoToNR02:
Game_Flag_Set(kFlagNR01toNR02);
Set_Enter(kSetNR02, kSceneNR02);
return true;
case kGoalSteeleNR01GoToHF03:
Game_Flag_Set(kFlagHF01toHF03);
Game_Flag_Reset(kFlagMcCoyInNightclubRow);
Game_Flag_Set(kFlagMcCoyInHysteriaHall);
Actor_Put_In_Set(kActorSteele, kSetHF03);
Actor_Set_At_XYZ(kActorSteele, 291.0f, 47.76f, -892.0f, 453);
Set_Enter(kSetHF03, kSceneHF03);
return true;
case kGoalSteeleHF03McCoyChasingLucy:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append_Run(kActorSteele, 372, 0);
AI_Movement_Track_Append(kActorSteele, 35, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleNR08WalkOut:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append_Run(kActorSteele, 467, 0);
AI_Movement_Track_Append(kActorSteele, 35, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleNR10Wait:
Actor_Put_In_Set(kActorSteele, kSetNR10);
Actor_Set_At_XYZ(kActorSteele, -118.13f, 2.84f, -197.90f, 305);
return true;
case kGoalSteeleHF02ConfrontLucy:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Flush(kActorLucy);
Actor_Put_In_Set(kActorSteele, kSetHF02);
Actor_Set_At_XYZ(kActorSteele, 254.94f, 47.76f, -262.58f, 210);
Actor_Put_In_Set(kActorLucy, kSetHF02);
Actor_Set_At_XYZ(kActorLucy, 596.49f, 47.76f, -260.04f, 731);
return true;
case kGoalSteeleHF02ShootLucy:
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatAttack);
Delay(500);
Actor_Change_Animation_Mode(kActorLucy, kAnimationModeDie);
Actor_Set_Targetable(kActorLucy, false);
Actor_Retired_Here(kActorLucy, 36, 18, true, -1);
Delay(1000);
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append_Run(kActorSteele, 380, 0);
AI_Movement_Track_Repeat(kActorSteele);
Delay(500);
ADQ_Add(kActorLucy, 340, kAnimationModeDie);
return true;
case kGoalSteeleHF02LucyShotBySteele:
AI_Movement_Track_Flush(kActorSteele);
Player_Loses_Control();
Delay(500);
Actor_Says(kActorSteele, 0, 14);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 1540, 16);
Actor_Says(kActorSteele, 10, 13);
Actor_Says(kActorSteele, 20, 18);
Actor_Says(kActorMcCoy, 1545, 13);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 30, 18);
Actor_Says(kActorSteele, 40, 18);
Actor_Says(kActorMcCoy, 1550, 13);
Actor_Face_Actor(kActorSteele, kActorLucy, true);
Actor_Says(kActorSteele, 50, 12);
Actor_Says(kActorMcCoy, 1555, 13);
Actor_Says(kActorSteele, 60, 12);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 80, 16);
Actor_Says(kActorMcCoy, 1560, 13);
Delay(500);
Game_Flag_Set(kFlagSpinnerMissing);
Player_Gains_Control();
if (Game_Flag_Query(kFlagSpinnerAtNR01)) {
Actor_Put_In_Set(kActorSteele, kSetNR01);
Actor_Set_At_XYZ(kActorSteele, 12.17f, 23.88f, -533.37f, 674);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetNR01, kSceneNR01);
} else {
Actor_Put_In_Set(kActorSteele, kSetHF01);
Actor_Set_At_XYZ(kActorSteele, 324.32f, 8.0f, -465.87f, 674);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetHF01, kSceneHF04);
}
return true;
case kGoalSteeleHF02LucyRanAway:
Player_Loses_Control();
Delay(500);
Actor_Put_In_Set(kActorSteele, kSetHF02);
Actor_Set_At_XYZ(kActorSteele, 254.94f, 47.76f, -262.58f, 210);
return true;
case kGoalSteeleHF02LucyShotByMcCoy:
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 1560, 14);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 100, 13);
Actor_Says(kActorMcCoy, 1575, 13);
Actor_Says(kActorSteele, 120, 15);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleHFxxGoToSpinner);
return true;
case kGoalSteeleHF02LucyLostByMcCoy:
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 150, 13);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 1580, 13);
Actor_Says(kActorSteele, 160, 14);
Actor_Says(kActorMcCoy, 1585, 16);
Actor_Says(kActorSteele, 170, 16);
Actor_Says(kActorSteele, 180, 17);
Actor_Says(kActorMcCoy, 1590, 17);
Actor_Says(kActorSteele, 200, 15);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleHFxxGoToSpinner);
return true;
case kGoalSteeleHFxxGoToSpinner:
Actor_Says(kActorSteele, 130, 13);
Actor_Says(kActorSteele, 140, 13);
Delay(500);
Game_Flag_Set(kFlagSpinnerMissing);
Player_Gains_Control();
if (Game_Flag_Query(kFlagSpinnerAtNR01)) {
Actor_Put_In_Set(kActorSteele, kSetNR01);
Actor_Set_At_XYZ(kActorSteele, 12.17f, 23.88f, -533.37f, 674);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetNR01, kSceneNR01);
} else {
Actor_Put_In_Set(kActorSteele, kSetHF01);
Actor_Set_At_XYZ(kActorSteele, 324.32f, 8.0f, -465.87f, 674);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetHF01, kSceneHF01);
}
return true;
case kGoalSteeleNR01ConfrontGordo:
AI_Movement_Track_Flush(kActorSteele);
Actor_Put_In_Set(kActorSteele, kSetNR01);
Actor_Set_At_XYZ(kActorSteele, 94.03f, 23.88f, -794.46f, 685);
if (Game_Flag_Query(kFlagSpinnerAtNR01)) {
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
}
Game_Flag_Set(kFlagSteeleAimingAtGordo);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeIdle);
_varChooseIdleAnimation = 3;
return true;
case kGoalSteeleNR01TalkToGordo:
Actor_Set_Targetable(kActorSteele, true);
return true;
case kGoalSteeleNR01ShootGordo:
Player_Loses_Control();
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatAttack);
Sound_Play(kSfxSMCAL3, 100, 0, 0, 50);
Game_Flag_Reset(kFlagSteeleAimingAtGordo);
Actor_Set_Targetable(kActorSteele, false);
Actor_Set_Goal_Number(kActorGordo, kGoalGordoNR01Die);
Delay(1500);
Player_Set_Combat_Mode(false);
Actor_Says(kActorSteele, 1070, 14);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 1260, 16);
Actor_Says(kActorSteele, 1270, 13);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 3065, 18);
Actor_Says(kActorSteele, 1280, 13);
Actor_Says(kActorSteele, 1290, 13);
Game_Flag_Set(kFlagGordoRanAway);
Player_Gains_Control();
if (Game_Flag_Query(kFlagSpinnerAtHF01)) {
Actor_Put_In_Set(kActorSteele, kSetHF01);
Actor_Set_At_XYZ(kActorSteele, 324.32f, 8.0f, -465.87f, 674);
Game_Flag_Set(kFlagSpinnerMissing);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetHF01, kSceneHF01);
} else {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleTalkAboutMissingSpinner);
}
return true;
case kGoalSteeleNR01ShootMcCoy:
ADQ_Flush();
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatAttack);
Sound_Play(kSfxSMCAL3, 100, 0, 0, 50);
Actor_Force_Stop_Walking(kActorMcCoy);
Actor_Change_Animation_Mode(kActorMcCoy, kAnimationModeDie);
Actor_Retired_Here(kActorMcCoy, 12, 12, true, -1);
Actor_Set_Goal_Number(kActorGordo, kGoalGordoNR01ReleaseHostage);
Actor_Says(kActorSteele, 1250, kAnimationModeTalk);
return true;
case kGoalSteeleNR01McCoyShotGordo:
Game_Flag_Reset(kFlagSteeleAimingAtGordo);
ADQ_Flush();
Game_Flag_Set(kFlagGordoRanAway);
Actor_Set_Targetable(kActorSteele, false);
Delay(1000);
Player_Set_Combat_Mode(false);
Player_Loses_Control();
_animationState = 40;
_animationFrame = 0;
Delay(2000);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeIdle);
Actor_Change_Animation_Mode(kActorMcCoy, kAnimationModeIdle);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 1080, 17);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 3025, 14);
Actor_Says(kActorSteele, 1090, 16);
Actor_Face_Actor(kActorSteele, kActorGordo, true);
Actor_Says(kActorSteele, 1100, 13);
Actor_Says(kActorSteele, 1110, 17);
Actor_Says(kActorMcCoy, 3030, 19);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 1130, 15);
Actor_Says(kActorSteele, 1140, 12);
Player_Gains_Control();
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleTalkAboutMissingSpinner);
return true;
case kGoalSteeleNR01McCoyShotGun:
ADQ_Flush();
Actor_Change_Animation_Mode(kActorMcCoy, kAnimationModeCombatAttack);
Sound_Play(kSfxSMCAL3, 100, 0, 0, 50);
_animationState = 38;
_animationFrame = 0;
Actor_Set_Goal_Number(kActorGordo, kGoalGordoNR01ReleaseHostage);
Game_Flag_Reset(kFlagSteeleAimingAtGordo);
Game_Flag_Set(kFlagGordoRanAway);
Actor_Set_Targetable(kActorSteele, false);
Player_Loses_Control();
return true;
case kGoalSteeleNR01TalkAboutShotGun:
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 1160, 15);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 3035, 14);
Actor_Says(kActorSteele, 1170, 16);
Actor_Says(kActorMcCoy, 3040, 15);
Actor_Says(kActorSteele, 1180, 16);
Actor_Says(kActorMcCoy, 3045, 15);
Actor_Says(kActorMcCoy, 3055, 15);
Actor_Says(kActorSteele, 1190, 16);
Actor_Says(kActorMcCoy, 3060, 15);
Actor_Says(kActorSteele, 1200, 16);
Actor_Says(kActorSteele, 1210, 14);
Actor_Modify_Friendliness_To_Other(kActorSteele, kActorMcCoy, -5);
Actor_Modify_Friendliness_To_Other(kActorClovis, kActorMcCoy, 2);
Player_Set_Combat_Mode(false);
Music_Stop(2u);
Player_Gains_Control();
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleTalkAboutMissingSpinner);
return true;
case kGoalSteeleNR01ShotByMcCoy:
ADQ_Flush();
Player_Loses_Control();
Game_Flag_Reset(kFlagSteeleAimingAtGordo);
Actor_Set_Targetable(kActorSteele, false);
Actor_Set_Goal_Number(kActorGordo, kGoalGordoNR01ReleaseHostage);
Actor_Start_Speech_Sample(kActorSteele, 1150);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatDie);
Delay(5000);
Actor_Set_Goal_Number(kActorMcCoy, kGoalMcCoyArrested);
return true;
case kGoalSteeleNRxxGoToSpinner:
Delay(500);
Game_Flag_Set(kFlagSpinnerMissing);
Player_Gains_Control();
if (Game_Flag_Query(kFlagSpinnerAtNR01)) {
Actor_Put_In_Set(kActorSteele, kSetNR01);
Actor_Set_At_XYZ(kActorSteele, 12.17f, 23.88f, -533.37f, 674);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetNR01, kSceneNR01);
} else {
Actor_Put_In_Set(kActorSteele, kSetHF01);
Actor_Set_At_XYZ(kActorSteele, 324.32f, 8.0f, -465.87f, 674);
Game_Flag_Reset(kFlagSpinnerAtNR01);
Game_Flag_Reset(kFlagSpinnerAtHF01);
Set_Enter(kSetHF01, kSceneHF01);
}
return true;
case kGoalSteeleTalkAboutMissingSpinner:
Actor_Says(kActorMcCoy, 2970, 15);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 840, 16);
Actor_Says(kActorMcCoy, 2975, 15);
Actor_Says(kActorSteele, 850, 16);
Actor_Says(kActorDispatcher, 0, kAnimationModeTalk);
Actor_Says(kActorDispatcher, 10, kAnimationModeTalk);
if (_vm->_cutContent) {
Actor_Says(kActorDispatcher, 20, kAnimationModeTalk);
}
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorMcCoy, 2980, 12);
Actor_Says(kActorSteele, 860, 14);
Actor_Says(kActorMcCoy, 2985, 13);
Actor_Says(kActorSteele, 870, 15);
Actor_Says(kActorMcCoy, 2990, 16);
Actor_Says(kActorSteele, 880, 17);
Actor_Says(kActorSteele, 890, 18);
Actor_Says(kActorMcCoy, 2995, 12);
Actor_Says(kActorSteele, 900, 13);
Actor_Says(kActorMcCoy, 3000, 13);
Actor_Says(kActorSteele, 920, 12);
Actor_Says(kActorDispatcher, 30, kAnimationModeTalk);
Actor_Says(kActorMcCoy, 3005, 14);
Actor_Says(kActorSteele, 930, 16);
Actor_Says(kActorSteele, 950, 13);
Actor_Says(kActorMcCoy, 3010, 15);
Actor_Says(kActorSteele, 960, 15);
Actor_Says(kActorSteele, 970, 13);
Actor_Says(kActorMcCoy, 3015, 12);
Actor_Says(kActorSteele, 980, 17);
if (Player_Query_Current_Scene() == kSceneNR01) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01StartChapter4);
} else {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleHF01StartChapter4);
}
return true;
case kGoalSteeleImmediatelyStartChapter4:
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01StartChapter4);
return true;
case kGoalSteeleNR01StartChapter4:
Loop_Actor_Walk_To_XYZ(kActorMcCoy, -281.0f, 31.93f, -1061.0f, 0, false, true, false);
Actor_Face_Heading(kActorMcCoy, 45, false);
Loop_Actor_Travel_Stairs(kActorMcCoy, 3, false, kAnimationModeIdle);
Global_Variable_Set(kVariableChapter, 4);
Scene_Exits_Enable();
Actor_Set_Health(kActorMcCoy, 50, 50);
Game_Flag_Set(kFlagMutantsActive);
Game_Flag_Set(kFlagNR01toUG06);
Game_Flag_Set(kFlagChapter4Intro);
Chapter_Enter(4, kSetUG06, kSceneUG06);
return true;
case kGoalSteeleHF01StartChapter4:
Game_Flag_Set(kFlagChapter4Starting);
Global_Variable_Set(kVariableChapter, 4);
Scene_Exits_Enable();
Game_Flag_Set(kFlagMutantsActive);
Game_Flag_Set(kFlagChapter4Intro);
Chapter_Enter(4, kSetUG06, kSceneUG06);
return true;
case kGoalSteeleStartChapter4:
if (Query_Score(kActorMcCoy) > Query_Score(kActorSteele) && Query_Score(kActorMcCoy) < 75) {
Set_Score(kActorSteele, Random_Query(2, 5) + Query_Score(kActorMcCoy));
}
if (Query_Score(kActorMcCoy) > Query_Score(kActorSteele) && Query_Score(kActorMcCoy) > 74) {
Actor_Modify_Friendliness_To_Other(kActorSteele, kActorMcCoy, 3);
}
Actor_Set_Goal_Number(kActorSteele, 305);
return true;
case 305:
Actor_Put_In_Set(kActorSteele, kSetFreeSlotC);
Actor_Set_At_Waypoint(kActorSteele, 35, 0);
return true;
case kGoalSteeleStartChapter5:
// fall through
case 401:
// fall through
case kGoalSteeleKP01Left:
return true;
case 410:
Actor_Set_Targetable(kActorSteele, true);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Start_Speech_Sample(kActorSteele, 2510);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Delay(3000);
Async_Actor_Walk_To_XYZ(kActorSteele, -109.0f, -36.55f, 26.0f, 0, false);
return true;
case kGoalSteeleKP03Walk:
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
Actor_Says(kActorSteele, 430, 14);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
Delay(4000);
Async_Actor_Walk_To_XYZ(kActorSteele, -109.0f, -36.55f, 26.0f, 0, false);
return true;
case kGoalSteeleKP03StopWalking:
Actor_Force_Stop_Walking(kActorSteele);
return true;
case kGoalSteeleKP03Leave:
Async_Actor_Walk_To_XYZ(kActorSteele, 1.0, -36.55f, 111.0f, 0, false);
return true;
case kGoalSteeleKP03Exploded:
Actor_Force_Stop_Walking(kActorSteele);
Actor_Change_Animation_Mode(kActorSteele, 51);
AI_Countdown_Timer_Start(kActorSteele, kActorTimerAIScriptCustomTask1, 2);
return true;
case kGoalSteeleKP03Dying:
Actor_Set_At_XYZ(kActorSteele, -48.83f, -36.55f, 69.98f, 280);
Loop_Actor_Walk_To_Actor(kActorMcCoy, kActorSteele, 36, false, true);
Actor_Face_Actor(kActorMcCoy, kActorSteele, true);
if (Game_Flag_Query(kFlagMcCoyIsHelpingReplicants)) {
Actor_Says(kActorSteele, 400, 3);
Actor_Says(kActorMcCoy, 2165, 14);
Actor_Says(kActorSteele, 410, 3);
Actor_Says(kActorMcCoy, 2170, 14);
Actor_Says(kActorSteele, 420, 3);
} else {
Actor_Says(kActorSteele, 440, 3);
Actor_Says(kActorMcCoy, 2175, 14);
Actor_Says(kActorSteele, 450, 3);
Actor_Says(kActorSteele, 460, 3);
Actor_Says(kActorSteele, 470, 3);
}
AI_Countdown_Timer_Start(kActorSteele, kActorTimerAIScriptCustomTask1, 3);
return true;
case kGoalSteeleKP03ShootMcCoy:
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatAttack);
Actor_Change_Animation_Mode(kActorMcCoy, kAnimationModeDie);
Actor_Retired_Here(kActorMcCoy, 72, 18, true, -1);
return true;
case kGoalSteeleKP03Dead:
Actor_Set_Targetable(kActorSteele, false);
Game_Flag_Set(kFlagSteeleDead);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGone);
Actor_Retired_Here(kActorSteele, 60, 12, true, -1);
return true;
case kGoalSteeleKP01Wait:
Actor_Put_In_Set(kActorSteele, kSetKP01);
Actor_Set_At_XYZ(kActorSteele, 20.0f, -12.2f, -97.0f, 907);
Actor_Change_Animation_Mode(kActorSteele, 43);
return true;
case kGoalSteeleKP01TalkToMcCoy:
Game_Flag_Reset(kFlagSteeleSmoking);
Delay(2000);
Actor_Face_Actor(kActorSteele, kActorMcCoy, true);
Actor_Says(kActorSteele, 360, -1);
Loop_Actor_Walk_To_Actor(kActorMcCoy, kActorSteele, 48, false, false);
Actor_Says(kActorMcCoy, 2150, 14);
Actor_Says(kActorSteele, 370, 15);
Actor_Says(kActorMcCoy, 2155, 12);
Actor_Says(kActorSteele, 380, 16);
Actor_Says(kActorMcCoy, 2160, 18);
Actor_Says(kActorSteele, 390, 13);
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleKP01Leave);
return true;
case kGoalSteeleKP01Leave:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append(kActorSteele, 530, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleKP05Enter:
Actor_Put_In_Set(kActorSteele, kSetKP05_KP06);
Actor_Set_At_XYZ(kActorSteele, -1110.0f, 0.0f, 952.0f, 155);
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
return true;
case kGoalSteeleKP05Leave:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append_Run(kActorSteele, 541, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleKP06Enter:
Actor_Set_At_Waypoint(kActorSteele, 542, 0);
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append_Run(kActorSteele, 543, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case kGoalSteeleKP06Leave:
AI_Movement_Track_Flush(kActorSteele);
AI_Movement_Track_Append_Run(kActorSteele, 542, 0);
AI_Movement_Track_Repeat(kActorSteele);
return true;
case 450:
Actor_Put_In_Set(kActorSteele, kSetKP05_KP06);
Actor_Set_At_XYZ(kActorSteele, -947.39f, 0.0f, 728.89f, 0);
return true;
case 499:
AI_Movement_Track_Flush(kActorSteele);
Actor_Put_In_Set(kActorSteele, kSetKP05_KP06);
Actor_Set_At_XYZ(kActorSteele, -782.15f, 8.26f, -263.64f, 52);
return true;
default:
return false;
}
}
bool AIScriptSteele::UpdateAnimation(int *animation, int *frame) {
switch (_animationState) {
case 0:
switch (_varChooseIdleAnimation) {
case 0:
*animation = kModelAnimationSteeleIdle;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationSteeleIdle)) {
_animationFrame = 0;
if (Game_Flag_Query(kFlagSteeleSmoking)) {
_animationState = 41;
_varChooseIdleAnimation = 1;
_varNumOfTimesToHoldCurrentFrame = 0;
}
}
break;
case 1:
Game_Flag_Set(kFlagSteeleSmoking);
_animationState = 41;
_varChooseIdleAnimation = 1;
_varNumOfTimesToHoldCurrentFrame = 0;
break;
case 3:
*animation = kModelAnimationSteeleWithGunAimingToRightIdle;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationSteeleWithGunAimingToRightIdle)) {
_animationFrame = 0;
}
break;
}
break;
case 1:
_animationFrame = 0;
*animation = _animationNext;
_animationState = _animationStateNext;
break;
case 2:
*animation = kModelAnimationSteeleWalking;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 3:
*animation = kModelAnimationSteeleRunning;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 4:
*animation = kModelAnimationSteeleWithGunWalking;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 5:
*animation = kModelAnimationSteeleWithGunRunning;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 6:
*animation = kModelAnimationSteeleClimbStairsUp;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 7:
*animation = kModelAnimationSteeleClimbStairsDown;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 8:
*animation = kModelAnimationSteeleWithGunClimbStairsUp;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 9:
*animation = kModelAnimationSteeleWithGunClimbStairsDown;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 10:
*animation = kModelAnimationSteeleClimbUpTrapDoor;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeIdle);
*animation = kModelAnimationSteeleIdle;
_animationFrame = 0;
_animationState = 0;
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR11Enter) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR11Entered);
}
}
break;
case 11:
*animation = kModelAnimationSteeleClimbLadderUp;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 12:
*animation = kModelAnimationSteeleClimbLadderDown;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
}
break;
case 13:
*animation = kModelAnimationSteeleHopOffLadderDown;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
_animationState = 0;
}
break;
case 14:
*animation = kModelAnimationSteeleATalk;
if (_animationFrame == 0 && _resumeIdleAfterFramesetCompletesFlag
) {
*animation = kModelAnimationSteeleIdle;
_animationFrame = 0;
_animationState = 0;
_resumeIdleAfterFramesetCompletesFlag = false;
} else {
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
}
}
break;
case 15:
*animation = kModelAnimationSteeleBTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 14;
*animation = kModelAnimationSteeleATalk;
}
break;
case 16:
*animation = kModelAnimationSteeleSmallLeftHandMoveTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 14;
*animation = kModelAnimationSteeleATalk;
}
break;
case 17:
*animation = kModelAnimationSteeleProtestTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 14;
*animation = kModelAnimationSteeleATalk;
}
break;
case 18:
*animation = kModelAnimationSteeleDismissTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 14;
*animation = kModelAnimationSteeleATalk;
}
break;
case 19:
*animation = kModelAnimationSteeleDismissTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 14;
*animation = kModelAnimationSteeleATalk;
}
break;
case 20:
*animation = kModelAnimationSteeleWithGunAimingTalk;
if (_animationFrame == 0 && _resumeIdleAfterFramesetCompletesFlag
) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunShooting;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
_resumeIdleAfterFramesetCompletesFlag = false;
} else {
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
}
}
break;
case 21:
*animation = kModelAnimationSteeleWithGunAimingTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 20;
*animation = kModelAnimationSteeleWithGunAimingTalk;
}
break;
case 22:
*animation = kModelAnimationSteeleWithGunAimingTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 20;
*animation = kModelAnimationSteeleWithGunAimingTalk;
}
break;
case 23:
*animation = kModelAnimationSteeleWithGunIdle;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
}
break;
case 24:
*animation = kModelAnimationSteeleWithGunHolsterGun;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
*animation = kModelAnimationSteeleIdle;
_animationFrame = 0;
_animationState = 0;
}
break;
case 25:
*animation = kModelAnimationSteeleWithGunUnholsterGun;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunIdle;
}
break;
case 26:
*animation = kModelAnimationSteeleWithGunShooting;
++_animationFrame;
if (_animationFrame == 3) {
int snd;
if (Random_Query(1, 2) == 1) {
snd = 9010;
} else {
snd = 9015;
}
Sound_Play_Speech_Line(kActorSteele, snd, 75, 0, 99);
}
if (_animationFrame == 4) {
Actor_Combat_AI_Hit_Attempt(kActorSteele);
}
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunIdle;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
if (Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleNR11Shoot) {
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatAttack);
_animationState = 26;
_animationFrame = 0;
*animation = kModelAnimationSteeleWithGunShooting;
}
}
break;
case 27:
*animation = kModelAnimationSteeleWithGunStrafeFast;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunIdle;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
}
break;
case 28:
*animation = kModelAnimationSteeleWithGunStrafeSlow;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunIdle;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
}
break;
case 29:
*animation = kModelAnimationSteeleWithGunGotHitRight;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunIdle;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
}
break;
case 30:
*animation = kModelAnimationSteeleWithGunGotHitLeft;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 23;
*animation = kModelAnimationSteeleWithGunIdle;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeCombatIdle);
}
break;
case 31:
*animation = kModelAnimationSteeleGotHitRight;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
*animation = kModelAnimationSteeleIdle;
_animationFrame = 0;
_animationState = 0;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeIdle);
}
break;
case 32:
*animation = kModelAnimationSteeleGotHitLeft;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
*animation = kModelAnimationSteeleIdle;
_animationFrame = 0;
_animationState = 0;
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeIdle);
}
break;
case 33:
*animation = kModelAnimationSteeleWithGunShotDead;
if (_animationFrame < Slice_Animation_Query_Number_Of_Frames(*animation) - 1)
++_animationFrame;
break;
case 34:
*animation = kModelAnimationSteeleShotDead;
if (_animationFrame < Slice_Animation_Query_Number_Of_Frames(*animation) - 1)
++_animationFrame;
break;
case 35:
*animation = kModelAnimationSteeleWithGunShotDead;
if (_animationFrame < Slice_Animation_Query_Number_Of_Frames(*animation) - 1)
++_animationFrame;
break;
case 36:
*animation = kModelAnimationSteeleWithGunAimingToRightIdle;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
}
break;
case 37:
if (_animationFrame == 0 && _resumeIdleAfterFramesetCompletesFlag
) {
_animationFrame = 0;
_animationState = 0;
_varChooseIdleAnimation = 3;
_resumeIdleAfterFramesetCompletesFlag = false;
*animation = kModelAnimationSteeleWithGunAimingToRightTalk;
} else {
*animation = kModelAnimationSteeleWithGunAimingToRightTalk;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
}
}
break;
case 38:
*animation = kModelAnimationSteeleWithGunAimingToRightHandHit;
++_animationFrame;
if (_animationFrame > 5) {
Actor_Change_Animation_Mode(kActorSteele, kAnimationModeIdle);
_animationState = 0;
_animationFrame = 0;
*animation = kModelAnimationSteeleIdle;
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleNR01PrepareTalkAboutShotGun);
}
break;
case 39:
*animation = kModelAnimationSteeleWithGunAimingToRightShoot;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationFrame = 0;
_animationState = 36;
*animation = kModelAnimationSteeleWithGunAimingToRightIdle;
}
break;
case 40:
*animation = kModelAnimationSteeleWithGunAimingToRightHolster;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
*animation = kModelAnimationSteeleIdle;
_animationFrame = 0;
_animationState = 0;
_varChooseIdleAnimation = 0;
}
break;
case 41:
switch (_varChooseIdleAnimation) {
case 0:
*animation = kModelAnimationSteeleIdle;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(kModelAnimationSteeleIdle)) {
_animationFrame = 0;
if (!Game_Flag_Query(kFlagSteeleSmoking)) {
_varChooseIdleAnimation = 3;
} else if (Random_Query(1, 3) == 1) {
_varChooseIdleAnimation = 1;
}
}
break;
case 1:
*animation = kModelAnimationSteeleTakeCigPuff;
if (_varNumOfTimesToHoldCurrentFrame != 0) {
--_varNumOfTimesToHoldCurrentFrame;
} else {
++_animationFrame;
if (_animationFrame >= 6
&& _animationFrame <= 9
) {
_varNumOfTimesToHoldCurrentFrame = Random_Query(1, 3);
break;
}
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) {
_animationFrame = 0;
if (Game_Flag_Query(kFlagSteeleSmoking)) {
_varChooseIdleAnimation = 0;
} else {
_varChooseIdleAnimation = 3;
}
}
}
break;
case 3:
*animation = kModelAnimationSteeleThrowCigAndStepOnIt;
++_animationFrame;
if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) {
_animationState = 0;
_animationFrame = 0;
_varChooseIdleAnimation = 0;
Game_Flag_Reset(kFlagSteeleSmoking);
}
break;
}
break;
default:
// Dummy placeholder, kModelAnimationZubenIdle (406) is a Zuben animation
*animation = kModelAnimationZubenIdle;
_animationFrame = 0;
debugC(6, kDebugAnimation, "AIScriptSteele::UpdateAnimation() - Current _animationState (%d) is placeholder", _animationState);
break;
}
*frame = _animationFrame;
return true;
}
bool AIScriptSteele::ChangeAnimationMode(int mode) {
switch (mode) {
case kAnimationModeIdle:
if (Game_Flag_Query(kFlagSteeleAimingAtGordo)) {
_varChooseIdleAnimation = 3;
} else {
_varChooseIdleAnimation = 0;
}
switch (_animationState) {
case 0:
// fall through
case 24:
// fall through
case 34:
// fall through
case 35:
// fall through
case 41:
return true;
case 4:
_animationState = 23;
_animationFrame = 0;
break;
case 14:
// fall through
case 15:
// fall through
case 16:
// fall through
case 17:
// fall through
case 18:
// fall through
case 19:
_resumeIdleAfterFramesetCompletesFlag = true;
break;
case 20:
// fall through
case 21:
// fall through
case 22:
// fall through
case 37:
_resumeIdleAfterFramesetCompletesFlag = true;
_animationState = 23;
_animationFrame = 0;
break;
case 23:
// fall through
case 26:
_animationState = 24;
_animationFrame = 0;
break;
default:
_animationFrame = 0;
if (Game_Flag_Query(kFlagSteeleSmoking)) {
_animationState = 41;
_varChooseIdleAnimation = 1;
} else {
_animationState = 0;
}
break;
}
break;
case kAnimationModeWalk:
if ((_animationState != 4
&& _animationState != 23
&& _animationState != 25
&& _animationState != 26
)
|| _animationState > 26
) {
if (Actor_Query_Goal_Number(kActorSteele) != kGoalSteeleApprehendIzo
&& Actor_Query_Goal_Number(kActorSteele) != kGoalSteeleArrestIzo
) {
_animationState = 2;
_animationFrame = 0;
} else {
_animationState = 4;
_animationFrame = 0;
}
} else {
_animationState = 4;
_animationFrame = 0;
}
break;
case kAnimationModeRun:
if (Actor_Query_Goal_Number(kActorSteele) != kGoalSteeleApprehendIzo
&& Actor_Query_Goal_Number(kActorSteele) != kGoalSteeleArrestIzo
&& _animationState != 23
) {
_animationState = 3;
_animationFrame = 0;
} else {
_animationState = 5;
_animationFrame = 0;
}
break;
case kAnimationModeTalk:
if (_animationState != 35) {
if (Game_Flag_Query(kFlagSteeleAimingAtGordo)) {
_animationState = 37;
_animationFrame = 0;
_resumeIdleAfterFramesetCompletesFlag = false;
} else {
if (_animationState > 0) {
_animationState = 14;
_animationFrame = 0;
} else {
_animationState = 1;
_animationFrame = 0;
_animationStateNext = 14;
_animationNext = kModelAnimationSteeleATalk;
}
_resumeIdleAfterFramesetCompletesFlag = false;
}
}
break;
case kAnimationModeCombatIdle:
if (_animationState > 0) {
if (_animationState > 25
|| (_animationState != 23
&& _animationState != 25)
) {
_animationState = 23;
_animationFrame = 0;
}
} else {
_animationState = 25;
_animationFrame = 0;
}
break;
case kAnimationModeCombatAttack:
if (Game_Flag_Query(kFlagSteeleAimingAtGordo)) {
_animationState = 39;
} else {
_animationState = 26;
}
_animationFrame = 0;
break;
case kAnimationModeCombatWalk:
_animationState = 4;
_animationFrame = 0;
break;
case kAnimationModeCombatRun:
_animationState = 5;
_animationFrame = 0;
break;
case 12:
if (_animationState > 0) {
_animationState = 15;
_animationFrame = 0;
} else {
_animationState = 1;
_animationFrame = 0;
_animationStateNext = 15;
_animationNext = kModelAnimationSteeleBTalk;
}
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 13:
if (_animationState > 0) {
_animationState = 16;
_animationFrame = 0;
} else {
_animationState = 1;
_animationFrame = 0;
_animationStateNext = 16;
_animationNext = kModelAnimationSteeleSmallLeftHandMoveTalk;
}
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 14:
if (_animationState > 0) {
_animationState = 17;
_animationFrame = 0;
} else {
_animationState = 1;
_animationFrame = 0;
_animationStateNext = 17;
_animationNext = kModelAnimationSteeleProtestTalk;
}
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 15:
if (_animationState > 0) {
_animationState = 18;
_animationFrame = 0;
} else {
_animationState = 1;
_animationFrame = 0;
_animationStateNext = 18;
_animationNext = kModelAnimationSteeleDismissTalk;
}
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 16:
if (_animationState > 0) {
_animationState = 19;
_animationFrame = 0;
} else {
_animationState = 1;
_animationFrame = 0;
_animationStateNext = 19;
_animationNext = kModelAnimationSteeleDismissTalk;
}
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case kAnimationModeHit:
if (_animationState > 28) {
if (Random_Query(0, 1)) {
_animationState = 31;
} else {
_animationState = 32;
}
} else if (Random_Query(0, 1)) {
_animationState = 29;
} else {
_animationState = 30;
}
_animationFrame = 0;
break;
case kAnimationModeCombatHit:
if (Random_Query(0, 1)) {
_animationState = 29;
} else {
_animationState = 30;
}
_animationFrame = 0;
break;
case 43:
Game_Flag_Set(kFlagSteeleSmoking);
_animationState = 41;
_animationFrame = 0;
_varNumOfTimesToHoldCurrentFrame = 0;
_varChooseIdleAnimation = 1;
break;
case kAnimationModeWalkUp:
_animationState = 6;
_animationFrame = 0;
break;
case kAnimationModeWalkDown:
_animationState = 7;
_animationFrame = 0;
break;
case kAnimationModeCombatWalkUp:
_animationState = 8;
_animationFrame = 0;
break;
case kAnimationModeCombatWalkDown:
_animationState = 9;
_animationFrame = 0;
break;
case kAnimationModeDie:
if (_animationState != 33
&& _animationState != 34
) {
if (_animationState > 26
|| (_animationState != 23
&& _animationState != 25
&& _animationState != 26
)
) {
_animationState = 34;
_animationFrame = 0;
} else {
_animationState = 33;
_animationFrame = 0;
}
}
break;
case kAnimationModeCombatDie:
if (_animationState != 33) {
_animationState = 33;
_animationFrame = 0;
}
break;
case 51:
_animationState = 35;
_animationFrame = 0;
break;
case 58:
_animationState = 20;
_animationFrame = 0;
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 59:
_animationState = 21;
_animationFrame = 0;
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 60:
_animationState = 22;
_animationFrame = 0;
_resumeIdleAfterFramesetCompletesFlag = false;
break;
case 86:
_animationState = 10;
_animationFrame = 0;
break;
}
return true;
}
void AIScriptSteele::QueryAnimationState(int *animationState, int *animationFrame, int *animationStateNext, int *animationNext) {
*animationState = _animationState;
*animationFrame = _animationFrame;
*animationStateNext = _animationStateNext;
*animationNext = _animationNext;
}
void AIScriptSteele::SetAnimationState(int animationState, int animationFrame, int animationStateNext, int animationNext) {
_animationState = animationState;
_animationFrame = animationFrame;
_animationStateNext = animationStateNext;
_animationNext = animationNext;
}
bool AIScriptSteele::ReachedMovementTrackWaypoint(int waypointId) {
if (waypointId == 174
&& Actor_Query_Goal_Number(kActorSteele) == kGoalSteeleLeaveRC03
) {
Actor_Set_Goal_Number(kActorSteele, kGoalSteeleGoToPoliceStation);
}
return true;
}
void AIScriptSteele::FledCombat() {
// return false;
}
} // End of namespace BladeRunner