aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/script/ai/officer_leary.cpp
diff options
context:
space:
mode:
authorThanasis Antoniou2019-05-19 14:33:12 +0300
committerThanasis Antoniou2019-05-19 14:34:01 +0300
commitea3a9f211da74ffd3aa35328147566160a73d680 (patch)
tree0dd73d3e45466cb420c3e8ace2e9ecbc9e76fa8e /engines/bladerunner/script/ai/officer_leary.cpp
parent10ac612b9019aa299f3182180745ba6d215e93e5 (diff)
downloadscummvm-rg350-ea3a9f211da74ffd3aa35328147566160a73d680.tar.gz
scummvm-rg350-ea3a9f211da74ffd3aa35328147566160a73d680.tar.bz2
scummvm-rg350-ea3a9f211da74ffd3aa35328147566160a73d680.zip
BLADERUNNER: Cleanup of police AI and fix for rat ai
Diffstat (limited to 'engines/bladerunner/script/ai/officer_leary.cpp')
-rw-r--r--engines/bladerunner/script/ai/officer_leary.cpp216
1 files changed, 131 insertions, 85 deletions
diff --git a/engines/bladerunner/script/ai/officer_leary.cpp b/engines/bladerunner/script/ai/officer_leary.cpp
index 9b9fa3fabf..d803b06c31 100644
--- a/engines/bladerunner/script/ai/officer_leary.cpp
+++ b/engines/bladerunner/script/ai/officer_leary.cpp
@@ -45,18 +45,18 @@ void AIScriptOfficerLeary::Initialize() {
bool AIScriptOfficerLeary::Update() {
if (Global_Variable_Query(kVariableChapter) == 4
- && Actor_Query_Goal_Number(kActorOfficerLeary) < 300
+ && Actor_Query_Goal_Number(kActorOfficerLeary) < kGoalOfficerLearyStartOfAct4
) {
AI_Movement_Track_Flush(kActorOfficerLeary);
- Actor_Set_Goal_Number(kActorOfficerLeary, 300);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyStartOfAct4);
return false;
}
if (Global_Variable_Query(kVariableChapter) == 5
- && Actor_Query_Goal_Number(kActorOfficerLeary) < 400
+ && Actor_Query_Goal_Number(kActorOfficerLeary) < kGoalOfficerLearyStartOfAct5
) {
AI_Movement_Track_Flush(kActorOfficerLeary);
- Actor_Set_Goal_Number(kActorOfficerLeary, 400);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyStartOfAct5);
return false;
}
@@ -68,7 +68,7 @@ bool AIScriptOfficerLeary::Update() {
&& Global_Variable_Query(kVariableChapter) < 3
) {
Game_Flag_Set(kFlagRC01PoliceDone);
- Actor_Set_Goal_Number(kActorOfficerLeary, 3);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyPoliceDoneFromRC01);
return false;
}
@@ -96,67 +96,68 @@ bool AIScriptOfficerLeary::Update() {
&& !Game_Flag_Query(kFlagUG07PoliceLeave)
) {
Game_Flag_Set(kFlagUG07PoliceLeave);
- Actor_Set_Goal_Number(kActorOfficerLeary, 305);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyHuntingAroundAct4);
return false;
}
- if (Actor_Query_Goal_Number(kActorOfficerLeary) == 310
+ if (Actor_Query_Goal_Number(kActorOfficerLeary) == kGoalOfficerLearyAttackMcCoyAct4
&& Actor_Query_Which_Set_In(kActorOfficerLeary) != Player_Query_Current_Set()
) {
Non_Player_Actor_Combat_Mode_Off(kActorOfficerLeary);
- Actor_Set_Goal_Number(kActorOfficerLeary, 305);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyHuntingAroundAct4);
return false;
}
- if (Actor_Query_Goal_Number(kActorOfficerLeary) == 599
+ if (Actor_Query_Goal_Number(kActorOfficerLeary) == kGoalOfficerLearyDead
&& Actor_Query_Which_Set_In(kActorOfficerLeary) != Player_Query_Current_Set()
) {
+ // dead officer gets revived and re-used
Actor_Set_Health(kActorOfficerLeary, 40, 40);
- Actor_Set_Goal_Number(kActorOfficerLeary, 305);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyHuntingAroundAct4);
return false;
}
- if (Actor_Query_Goal_Number(kActorOfficerLeary) == 305) {
+ if (Actor_Query_Goal_Number(kActorOfficerLeary) == kGoalOfficerLearyHuntingAroundAct4) {
switch (Actor_Query_Which_Set_In(kActorOfficerLeary)) {
case kSetDR01_DR02_DR04:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 0, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetBB01:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 1, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetCT11:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 5, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetMA07:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 7, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetNR01:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 3, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetRC03:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 18, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetUG01:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 11, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
@@ -164,31 +165,31 @@ bool AIScriptOfficerLeary::Update() {
case kSetUG05:
case kSetUG06:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 10, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetUG08:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 13, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetUG10:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 14, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetUG12:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 16, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
case kSetUG14:
if (Actor_Query_Which_Set_In(kActorOfficerLeary) == Player_Query_Current_Set()) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 310);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyAttackMcCoyAct4);
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 17, 4, 7, 8, -1, -1, -1, 10, 300, 0);
}
break;
@@ -201,8 +202,8 @@ void AIScriptOfficerLeary::TimerExpired(int timer) {
if (timer == kActorTimerAIScriptCustomTask1) {
AI_Countdown_Timer_Reset(kActorOfficerLeary, kActorTimerAIScriptCustomTask1);
if (Actor_Query_In_Set(kActorMcCoy, kSetHF05)) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 430);
- Actor_Set_Goal_Number(kActorOfficerGrayford, 430);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyPoliceAboutToAttackHF05);
+ Actor_Set_Goal_Number(kActorOfficerGrayford, kGoalOfficerGrayfordPoliceAboutToAttackHF05);
} else {
Game_Flag_Set(kFlagHF05PoliceAttacked);
}
@@ -231,14 +232,16 @@ void AIScriptOfficerLeary::CompletedMovementTrack() {
if (goal > 308) {
return;
}
- if (goal == 305) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 306);
+ if (goal == kGoalOfficerLearyHuntingAroundAct4) {
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyPrepareToHuntAroundAct4);
return;
}
- if (goal == 307) {
+ if (goal == kGoalOfficerLearyBlockingUG07) {
+ // UG07 before McCoy visits his apartment in Act 4
Non_Player_Actor_Combat_Mode_On(kActorOfficerLeary, 0, 1, kActorMcCoy, 12, kAnimationModeCombatIdle, kAnimationModeCombatWalk, kAnimationModeCombatRun, 0, -1, -1, 15, 300, 0);
}
if (goal == 308) {
+ // goal 308 (and 309) are never triggered in the original code
Actor_Change_Animation_Mode(kActorOfficerLeary, 4);
Actor_Face_Actor(kActorOfficerLeary, kActorMcCoy, true);
Actor_Set_Goal_Number(kActorOfficerLeary, 309);
@@ -246,10 +249,10 @@ void AIScriptOfficerLeary::CompletedMovementTrack() {
}
void AIScriptOfficerLeary::ReceivedClue(int clueId, int fromActorId) {
- if (clueId == 222) {
+ if (clueId == kClueMcCoyRetiredZuben) {
Actor_Modify_Friendliness_To_Other(kActorOfficerLeary, kActorMcCoy, 5);
}
- if (clueId == 215) {
+ if (clueId == kClueMcCoyLetZubenEscape) {
Actor_Modify_Friendliness_To_Other(kActorOfficerLeary, kActorMcCoy, -4);
}
}
@@ -267,14 +270,15 @@ void AIScriptOfficerLeary::OtherAgentEnteredCombatMode(int otherActorId, int com
void AIScriptOfficerLeary::ShotAtAndMissed() {}
bool AIScriptOfficerLeary::ShotAtAndHit() {
- if (Actor_Query_Goal_Number(kActorOfficerLeary) == 307) {
+ // Leary is invincible while blocking the UG07 (before McCoy visits his apartment in Act 4)
+ if (Actor_Query_Goal_Number(kActorOfficerLeary) == kGoalOfficerLearyBlockingUG07) {
Actor_Set_Health(kActorOfficerLeary, 50, 50);
}
return false;
}
void AIScriptOfficerLeary::Retired(int byActorId) {
- Actor_Set_Goal_Number(kActorOfficerLeary, 599);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyDead);
Game_Flag_Set(kFlagMcCoyRetiredHuman);
}
@@ -283,27 +287,27 @@ int AIScriptOfficerLeary::GetFriendlinessModifierIfGetsClue(int otherActorId, in
return 0;
}
switch (clueId) {
- case 242:
+ case kClueMcCoyIsInsane:
return -6;
- case 240:
+ case kClueMcCoyIsAnnoying:
return -2;
- case 239:
+ case kClueMcCoyIsStupid:
return -5;
- case 228:
+ case kClueMcCoyRetiredLutherLance:
return 2;
- case 227:
+ case kClueMcCoyShotZubenInTheBack:
return 4;
- case 226:
+ case kClueMcCoyRetiredSadik:
return 4;
- case 225:
+ case kClueMcCoyRetiredGordo:
return 3;
- case 224:
+ case kClueMcCoyRetiredDektora:
return 3;
- case 223:
+ case kClueMcCoyRetiredLucy:
return 2;
- case 222:
+ case kClueMcCoyRetiredZuben:
return 3;
- case 215:
+ case kClueMcCoyLetZubenEscape:
return -5;
}
return 0;
@@ -312,6 +316,7 @@ int AIScriptOfficerLeary::GetFriendlinessModifierIfGetsClue(int otherActorId, in
bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber) {
switch (newGoalNumber) {
case kGoalOfficerLearyRC01WalkToCrowd:
+ // kSetRC01
AI_Movement_Track_Flush(kActorOfficerLeary);
if (Random_Query(1, 2) == 1) {
AI_Movement_Track_Append(kActorOfficerLeary, 57, 7);
@@ -344,10 +349,11 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyDefault);
}
return true;
- case 3:
+ case kGoalOfficerLearyPoliceDoneFromRC01:
+ // kSetFreeSlotG -> kSetFreeSlotC
AI_Movement_Track_Flush(kActorOfficerLeary);
- AI_Movement_Track_Append(kActorOfficerLeary, 39, Random_Query(120, 240));
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 0);
+ AI_Movement_Track_Append(kActorOfficerLeary, 39, Random_Query(120, 240)); // kSetFreeSlotG
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 0); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
return true;
#if BLADERUNNER_ORIGINAL_BUGS
@@ -357,22 +363,25 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
AI_Countdown_Timer_Start(kActorOfficerLeary, kActorTimerAIScriptCustomTask0, 4); // wait a few seconds before starting taking notes again
return true;
#endif // BLADERUNNER_ORIGINAL_BUGS
- case 99:
+ case kGoalOfficerLearyEndOfAct1:
AI_Movement_Track_Flush(kActorOfficerLeary);
return false;
- case 102:
+ case kGoalOfficerLearyVisitsBulletBob:
+ // kSetRC04
+ // Leary visits Bullet Bob shop - un-triggered
AI_Movement_Track_Flush(kActorOfficerLeary);
AI_Movement_Track_Append(kActorOfficerLeary, 107, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 108, 0);
AI_Movement_Track_Repeat(kActorOfficerLeary);
return true;
- case 300:
- Actor_Set_Goal_Number(kActorOfficerLeary, 305);
+ case kGoalOfficerLearyStartOfAct4:
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyHuntingAroundAct4);
return true;
- case 305:
+ case kGoalOfficerLearyHuntingAroundAct4:
AI_Movement_Track_Flush(kActorOfficerLeary);
switch (Random_Query(1, 10)) {
case 1:
+ // kSetNR01
AI_Movement_Track_Append(kActorOfficerLeary, 398, 15);
AI_Movement_Track_Append(kActorOfficerLeary, 399, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 400, 0);
@@ -383,6 +392,7 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 2:
+ // kSetCT11
AI_Movement_Track_Append(kActorOfficerLeary, 385, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 242, 2);
AI_Movement_Track_Append(kActorOfficerLeary, 386, 2);
@@ -390,6 +400,7 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 3:
+ // kSetDR01_DR02_DR04
AI_Movement_Track_Append(kActorOfficerLeary, 390, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 391, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 392, 5);
@@ -398,21 +409,24 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 4:
+ // kSetRC03 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 381, 15);
AI_Movement_Track_Append(kActorOfficerLeary, 382, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 383, 15);
AI_Movement_Track_Append(kActorOfficerLeary, 382, 3);
AI_Movement_Track_Append(kActorOfficerLeary, 384, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 5:
+ // kSetBB01 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 388, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 389, 10);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 6:
+ // kSetCT11 - identical to case 2
AI_Movement_Track_Append(kActorOfficerLeary, 385, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 242, 2);
AI_Movement_Track_Append(kActorOfficerLeary, 386, 2);
@@ -424,6 +438,7 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
// When the police officer is there as well he will kill McCoy because player cannot control him.
case 7:
+ // kSetMA07 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 394, 15);
AI_Movement_Track_Append(kActorOfficerLeary, 395, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 396, 0);
@@ -431,23 +446,29 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
AI_Movement_Track_Append(kActorOfficerLeary, 396, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 395, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 430, 15);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
#else
case 7:
- // fall through
-#endif
+ // kSetFreeSlotC
+ // just put him away for a few seconds
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
+ AI_Movement_Track_Repeat(kActorOfficerLeary);
+ break;
+#endif // BLADERUNNER_ORIGINAL_BUGS
case 8:
switch (Random_Query(1, 7)) {
case 1:
+ // kSetUG10 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 302, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 407, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 408, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 2:
+ // kSetUG14
AI_Movement_Track_Append(kActorOfficerLeary, 536, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 537, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 538, 1);
@@ -456,110 +477,134 @@ bool AIScriptOfficerLeary::GoalChanged(int currentGoalNumber, int newGoalNumber)
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 3:
+ // kSetUG04 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 296, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 409, 2);
AI_Movement_Track_Append(kActorOfficerLeary, 296, 10);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 4:
+ // kSetUG05 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 411, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 412, 5);
AI_Movement_Track_Append(kActorOfficerLeary, 411, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 5:
+ // kSetUG06 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 413, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 414, 0);
AI_Movement_Track_Append_With_Facing(kActorOfficerLeary, 431, 0, 1017);
AI_Movement_Track_Append(kActorOfficerLeary, 432, 10);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 6:
+ // kSetUG07 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 415, 0);
AI_Movement_Track_Append_With_Facing(kActorOfficerLeary, 416, 0, 620);
AI_Movement_Track_Append(kActorOfficerLeary, 417, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 418, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
break;
case 7:
+ // kSetUG01 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 405, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 406, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
return false;
default:
return false;
}
- // is falling through here - a bug in original game?
- // fall through
+#if BLADERUNNER_ORIGINAL_BUGS
+ // fall through - a bug in original game
+#else
+ break;
+#endif // BLADERUNNER_ORIGINAL_BUGS
case 9:
- if (Random_Query(1, 2) - 1 == 1) {
+ if (Random_Query(1, 2) == 2) {
+ // kSetUG09 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 433, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 434, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 435, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
return false;
}
+ // kSetUG08 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 420, 10);
AI_Movement_Track_Append(kActorOfficerLeary, 422, 2);
AI_Movement_Track_Append(kActorOfficerLeary, 421, 1);
AI_Movement_Track_Append_With_Facing(kActorOfficerLeary, 422, 4, 182);
AI_Movement_Track_Append(kActorOfficerLeary, 420, 10);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
- // is falling through here - a bug in original game?
- // fall through
+#if BLADERUNNER_ORIGINAL_BUGS
+ // fall through - a bug in original game
+#else
+ return false;
+#endif // BLADERUNNER_ORIGINAL_BUGS
case 10:
+ // kSetUG12 -> kSetFreeSlotC
AI_Movement_Track_Append(kActorOfficerLeary, 310, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 307, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 309, 0);
AI_Movement_Track_Append(kActorOfficerLeary, 310, 0);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 30);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 30); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
return false;
default:
return false;
}
- // fall through
- case 306:
- Actor_Set_Goal_Number(kActorOfficerLeary, 305);
+#if BLADERUNNER_ORIGINAL_BUGS
+ // fall through - a bug in original game
+#else
+ return false;
+#endif // BLADERUNNER_ORIGINAL_BUGS
+ case kGoalOfficerLearyPrepareToHuntAroundAct4:
+ // aux goal in order to immediately switch back to kGoalOfficerLearyHuntingAroundAct4 goal
+ // and run GoalChanged() for kGoalOfficerLearyHuntingAroundAct4 again
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyHuntingAroundAct4);
return true;
- case 307:
+ case kGoalOfficerLearyBlockingUG07:
+ // kSetUG07
AI_Movement_Track_Flush(kActorOfficerLeary);
AI_Movement_Track_Append_With_Facing(kActorOfficerLeary, 416, 0, 556);
Actor_Change_Animation_Mode(kActorOfficerLeary, 4);
AI_Movement_Track_Repeat(kActorOfficerLeary);
return true;
case 308:
+ // kSetCT01_CT12
+ // never triggered - TODO a bug? Could be related to cut McCoy's arrest from Grayford
AI_Movement_Track_Flush(kActorOfficerLeary);
AI_Movement_Track_Append_Run_With_Facing(kActorOfficerLeary, 440, 2, 355);
AI_Movement_Track_Append_Run_With_Facing(kActorOfficerLeary, 441, 0, 825);
AI_Movement_Track_Repeat(kActorOfficerLeary);
return true;
- case 400:
+ case kGoalOfficerLearyStartOfAct5:
+ // kSetFreeSlotC
AI_Movement_Track_Flush(kActorOfficerLeary);
- AI_Movement_Track_Append(kActorOfficerLeary, 35, 0);
+ AI_Movement_Track_Append(kActorOfficerLeary, 35, 0); // kSetFreeSlotC
AI_Movement_Track_Repeat(kActorOfficerLeary);
- Actor_Set_Goal_Number(kActorOfficerLeary, 410);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyDummyGoalAct5);
return true;
- case 420:
+ case kGoalOfficerLearyPoliceWait120SecondsToAttackHF05:
AI_Countdown_Timer_Reset(kActorOfficerLeary, kActorTimerAIScriptCustomTask1);
AI_Countdown_Timer_Start(kActorOfficerLeary, kActorTimerAIScriptCustomTask1, 120);
- Actor_Set_Goal_Number(kActorOfficerLeary, 410);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyDummyGoalAct5);
return true;
- case 425:
+ case kGoalOfficerLearyPoliceWait60SecondsToAttackHF05:
AI_Countdown_Timer_Reset(kActorOfficerLeary, kActorTimerAIScriptCustomTask1);
AI_Countdown_Timer_Start(kActorOfficerLeary, kActorTimerAIScriptCustomTask1, 60);
- Actor_Set_Goal_Number(kActorOfficerLeary, 410);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyDummyGoalAct5);
return true;
- case 430:
- Actor_Set_Goal_Number(kActorOfficerLeary, 410);
- Actor_Set_Goal_Number(kActorOfficerGrayford, 410);
+ case kGoalOfficerLearyPoliceAboutToAttackHF05:
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyDummyGoalAct5);
+ Actor_Set_Goal_Number(kActorOfficerGrayford, kGoalOfficerGrayfordDummyGoalAct5);
return false;
default:
return false;
@@ -1252,6 +1297,7 @@ void AIScriptOfficerLeary::SetAnimationState(int animationState, int animationFr
bool AIScriptOfficerLeary::ReachedMovementTrackWaypoint(int waypointId) {
if (waypointId == 57 || waypointId == 58) {
+ // Interrogating crowd in kSetRC01
Game_Flag_Set(kFlagOfficerLearyTakingNotes);
AI_Countdown_Timer_Reset(kActorOfficerLeary, kActorTimerAIScriptCustomTask2);
AI_Countdown_Timer_Start(kActorOfficerLeary, kActorTimerAIScriptCustomTask2, 6);
@@ -1260,7 +1306,7 @@ bool AIScriptOfficerLeary::ReachedMovementTrackWaypoint(int waypointId) {
}
void AIScriptOfficerLeary::FledCombat() {
- Actor_Set_Goal_Number(kActorOfficerLeary, 300);
+ Actor_Set_Goal_Number(kActorOfficerLeary, kGoalOfficerLearyStartOfAct4);
}
} // End of namespace BladeRunner