aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/bladerunner/game_constants.h18
-rw-r--r--engines/bladerunner/script/ai/howie_lee.cpp192
-rw-r--r--engines/bladerunner/script/scene/ct01.cpp118
-rw-r--r--engines/bladerunner/script/scene/ct12.cpp11
-rw-r--r--engines/bladerunner/script/scene/ma02.cpp2
-rw-r--r--engines/bladerunner/script/scene/ma04.cpp9
6 files changed, 256 insertions, 94 deletions
diff --git a/engines/bladerunner/game_constants.h b/engines/bladerunner/game_constants.h
index e412adf944..a88693bd64 100644
--- a/engines/bladerunner/game_constants.h
+++ b/engines/bladerunner/game_constants.h
@@ -143,7 +143,7 @@ enum Clues {
kClueLicensePlate = 37,
kClueLicensePlateMatch = 38,
kClueLabPaintTransfer = 39,
- kClueDispatchHitAndRun = 40, // is never acquired
+ kClueDispatchHitAndRun = 40, // is now acquired in restored Cut Content
kClueInceptShotRoy = 41,
kClueInceptShotsLeon = 42,
kCluePhoneCallGuzza = 43,
@@ -446,7 +446,7 @@ enum Flags {
kFlagRC02Left = 4,
// 5 is never used
kFlagRC02RunciterInterview = 6,
- // 7 is never used
+ kFlagCT01TalkToHowieAboutDeadZuben = 7, // Re-purposed. Original: 7 is never used
kFlagRC01toRC02 = 8,
kFlagRC02toRC01 = 9,
kFlagDR01toDR04 = 10,
@@ -469,7 +469,7 @@ enum Flags {
kFlagCT01Evidence1Linked = 27,
kFlagCT01Evidence2Linked = 28,
kFlagCT01ZubenLeft = 29,
- kFlagNotUsed30 = 30, // is never set
+ kFlagCT01TalkToHowieAfterZubenMissing = 30, // New, it is now set/unset to restore cut content there. Original: is never set
kFlagCT01ZubenGone = 31,
kFlagCT01GordoTalk = 32,
kFlagMA02toMA06 = 33,
@@ -2247,6 +2247,18 @@ enum GoalLuther {
kGoalLutherGone = 599
};
+enum GoalHowieLee {
+ kGoalHowieLeeDefault = 0,
+ kGoalHowieLeeMovesInDiner01 = 1,
+ kGoalHowieLeeMovesInDiner02 = 2,
+ kGoalHowieLeeMovesInDiner03 = 3,
+ kGoalHowieLeeGoesToCT04GarbageBin = 4,
+ kGoalHowieLeeGoesToFreeSlotH = 5,
+ kGoalHowieLeeMovesInDiner06 = 6, // Unused goal?
+ kGoalHowieLeeStopMoving = 50,
+ kGoalHowieLeeGoesToFreeSlotC = 100
+};
+
enum GoalTransient {
kGoalTransientDefault = 0,
kGoalTransientCT04Leave = 2
diff --git a/engines/bladerunner/script/ai/howie_lee.cpp b/engines/bladerunner/script/ai/howie_lee.cpp
index 3675fc1b60..87012302b2 100644
--- a/engines/bladerunner/script/ai/howie_lee.cpp
+++ b/engines/bladerunner/script/ai/howie_lee.cpp
@@ -36,47 +36,79 @@ void AIScriptHowieLee::Initialize() {
var_45DFB8 = false;
Actor_Put_In_Set(kActorHowieLee, kSetCT01_CT12);
- Actor_Set_At_Waypoint(kActorHowieLee, 67, 605);
- Actor_Set_Goal_Number(kActorHowieLee, 0);
+ Actor_Set_At_Waypoint(kActorHowieLee, 67, 605); // in kSetCT01_CT12
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
}
bool AIScriptHowieLee::Update() {
- if (Actor_Query_Goal_Number(kActorHowieLee) < 100
- && Global_Variable_Query(kVariableChapter) == 2
- ) {
- Actor_Set_Goal_Number(kActorHowieLee, 100);
- }
- if (Global_Variable_Query(kVariableChapter) > 1) {
- return true;
+ if (_vm->_cutContent) {
+ // keep Howie in Acts 2 and 3
+ // Howie in Acts 2 and 3 will have a routine with existing waypoints/goals,
+ // so no need to add new goals (> 100) for those Acts
+ if (Actor_Query_Goal_Number(kActorHowieLee) < 100
+ && Global_Variable_Query(kVariableChapter) == 4
+ ) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToFreeSlotC);
+ }
+
+ if (Global_Variable_Query(kVariableChapter) > 3) {
+ return true;
+ }
+ } else {
+ if (Actor_Query_Goal_Number(kActorHowieLee) < 100
+ && Global_Variable_Query(kVariableChapter) == 2
+ ) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToFreeSlotC);
+ }
+
+ if (Global_Variable_Query(kVariableChapter) > 1) {
+ return true;
+ }
}
- if (Actor_Query_Goal_Number(kActorHowieLee) == 0) {
- Actor_Set_Goal_Number(kActorHowieLee, 1);
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeDefault) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeMovesInDiner01);
}
+ // In the original code this is used (in Act 1) to get Howie back to the Diner
+ // from goals kGoalHowieLeeGoesToCT04GarbageBin or kGoalHowieLeeGoesToFreeSlotH
+ // It might cause a blink-in issue, depending when update() will be called for Howie
+ // This is kept as a backup while similar code is placed in the CT01 and CT02 scenes InitializeScene()
+ // that will handle Howie appearing there immediately (fix for blink in)
if ( Game_Flag_Query(kFlagMcCoyInChinaTown)
&& !Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)
+ && Global_Variable_Query(kVariableChapter) == 1 // added condition - in cut content don't force Howie to return to CT01 here after Act 1
) {
AI_Movement_Track_Flush(kActorHowieLee);
- AI_Movement_Track_Append(kActorHowieLee, 67, 0);
- Actor_Set_Goal_Number(kActorHowieLee, 0);
+ AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
}
- if ( Actor_Query_Goal_Number(kActorHowieLee) == 1
- && Game_Flag_Query(kFlagCT01BoughtHowieLeeFood)
- && !Game_Flag_Query(kFlagMcCoyInChinaTown)
#if BLADERUNNER_ORIGINAL_BUGS
+ if ( Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner01
+ && Game_Flag_Query(kFlagCT01BoughtHowieLeeFood)
+ && !Game_Flag_Query(kFlagMcCoyInChinaTown) ) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+ return true;
+ }
#else
// Prevents possibility of Howie Lee from blinking in/out of existence
- // when the flyout loop is playing
- // and when McCoy enters and exits the Spinner with the spinner doors animation restored
- && Player_Query_Current_Scene() != kSceneCT01
-#endif // BLADERUNNER_ORIGINAL_BUGS
+ // when the fly-out loop is playing and/or when McCoy enters and exits the Spinner with the spinner doors animation restored
+ if ((Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner01
+ || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner02
+ || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03
+ || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner06
+ || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeDefault)
+ && Game_Flag_Query(kFlagCT01BoughtHowieLeeFood)
+ && !Game_Flag_Query(kFlagMcCoyInChinaTown)
+ && Player_Query_Current_Scene() != kSceneCT01
+ && Player_Query_Current_Scene() != kSceneCT12
) {
- Actor_Set_Goal_Number(kActorHowieLee, 4);
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
return true;
}
+#endif // BLADERUNNER_ORIGINAL_BUGS
return false;
}
@@ -86,36 +118,73 @@ void AIScriptHowieLee::TimerExpired(int timer) {
}
void AIScriptHowieLee::CompletedMovementTrack() {
- if (Actor_Query_Goal_Number(kActorHowieLee) == 1) {
- Actor_Set_Goal_Number(kActorHowieLee, 2);
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner01) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeMovesInDiner02);
return; // true;
}
- if (Actor_Query_Goal_Number(kActorHowieLee) == 2) {
- Actor_Set_Goal_Number(kActorHowieLee, 3);
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner02) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeMovesInDiner03);
return; // true;
}
- if (Actor_Query_Goal_Number(kActorHowieLee) == 3) {
- Actor_Set_Goal_Number(kActorHowieLee, 0);
- return; // true;
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03) {
+ if (_vm->_cutContent) {
+ //
+ // *after Act 1* Howie will be going to the Garbage Bin "regularly"
+ // if McCoy is not in scenes CT01 and CT12 (where Howie is visible working at the diner)
+ // otherwise he'll do the short cycle (goals 0, 1, 2, 3)
+ // This will result in Howie not being at the Diner sometimes even when McCoy is in Chinatown area
+ // This won't happen in Act 1, since he is most useful during that Act
+ if (Global_Variable_Query(kVariableChapter) > 1
+ && Player_Query_Current_Scene() != kSceneCT01
+ && Player_Query_Current_Scene() != kSceneCT12
+ && Player_Query_Current_Scene() != kSceneCT04
+ ) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+ return; // true;
+ } else {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ return; // true;
+ }
+ } else {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ return; // true;
+ }
}
- // Bug/intentional in original game?
- if (Actor_Query_Goal_Number(kActorHowieLee) == 3) {
- Actor_Set_Goal_Number(kActorHowieLee, 4);
- return; // true;
+#if BLADERUNNER_ORIGINAL_BUGS
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+ return; // true;
}
+#endif // BLADERUNNER_ORIGINAL_BUGS
- if (Actor_Query_Goal_Number(kActorHowieLee) == 4) {
- Actor_Set_Goal_Number(kActorHowieLee, 5);
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeGoesToCT04GarbageBin) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToFreeSlotH);
return; // true;
}
- if (Actor_Query_Goal_Number(kActorHowieLee) == 5) {
- Actor_Set_Goal_Number(kActorHowieLee, 0);
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeGoesToFreeSlotH) {
+#if BLADERUNNER_ORIGINAL_BUGS
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
return; // true;
+#else
+ // don't blink-in and also only return to diner routine if McCoy is actually in Chinatown
+ if (Game_Flag_Query(kFlagMcCoyInChinaTown)
+ && Player_Query_Current_Scene() != kSceneCT01
+ && Player_Query_Current_Scene() != kSceneCT12
+ ) {
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ return; // true;
+ } else {
+ // return to "garbage bin" goal instead of blinking in
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+ return; // true;
+ }
+#endif // BLADERUNNER_ORIGINAL_BUGS
}
+
// return false;
}
@@ -128,7 +197,7 @@ void AIScriptHowieLee::ClickedByPlayer() {
}
void AIScriptHowieLee::EnteredScene(int sceneId) {
- if (Actor_Query_Goal_Number(kActorHowieLee) == 4
+ if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeGoesToCT04GarbageBin
&& Actor_Query_In_Set(kActorHowieLee, kSetCT03_CT04)
) {
if ( Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
@@ -139,7 +208,7 @@ void AIScriptHowieLee::EnteredScene(int sceneId) {
// return false;
}
- if (!Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
+ if (Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
&& Game_Flag_Query(kFlagCT04HomelessBodyInDumpster)
&& !Game_Flag_Query(kFlagCT04HomelessBodyFound)
&& Random_Query(1, 10) == 1
@@ -152,6 +221,17 @@ void AIScriptHowieLee::EnteredScene(int sceneId) {
}
void AIScriptHowieLee::OtherAgentEnteredThisScene(int otherActorId) {
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+ // prevent player from actually meeting hovering Howie half-body in kSetCT03_CT04
+ if (otherActorId == kActorMcCoy
+ && Actor_Query_In_Set(kActorHowieLee, kSetCT03_CT04)
+ ) {
+ AI_Movement_Track_Flush(kActorHowieLee);
+ AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ }
+#endif // BLADERUNNER_ORIGINAL_BUGS
// return false;
}
@@ -181,55 +261,55 @@ int AIScriptHowieLee::GetFriendlinessModifierIfGetsClue(int otherActorId, int cl
bool AIScriptHowieLee::GoalChanged(int currentGoalNumber, int newGoalNumber) {
switch (newGoalNumber) {
- case 1:
+ case kGoalHowieLeeMovesInDiner01:
AI_Movement_Track_Flush(kActorHowieLee);
if (Random_Query(1, 2) == 1) {
- AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720);
+ AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720); // in kSetCT01_CT12
} else {
- AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640);
+ AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640); // in kSetCT01_CT12
}
AI_Movement_Track_Repeat(kActorHowieLee);
return true;
- case 2:
+ case kGoalHowieLeeMovesInDiner02:
AI_Movement_Track_Flush(kActorHowieLee);
if (Random_Query(1, 2) == 1) {
- AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641);
+ AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641); // in kSetCT01_CT12
} else {
- AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720);
+ AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720); // in kSetCT01_CT12
}
AI_Movement_Track_Repeat(kActorHowieLee);
return true;
- case 3:
+ case kGoalHowieLeeMovesInDiner03:
AI_Movement_Track_Flush(kActorHowieLee);
if (Random_Query(1, 2) == 1) {
- AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640);
+ AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640); // in kSetCT01_CT12
} else {
- AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641);
+ AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641); // in kSetCT01_CT12
}
AI_Movement_Track_Repeat(kActorHowieLee);
return true;
- case 4:
+ case kGoalHowieLeeGoesToCT04GarbageBin:
AI_Movement_Track_Flush(kActorHowieLee);
- AI_Movement_Track_Append(kActorHowieLee, 66, 30);
+ AI_Movement_Track_Append(kActorHowieLee, 66, 30); // in kSetCT03_CT04
AI_Movement_Track_Repeat(kActorHowieLee);
return true;
- case 5:
+ case kGoalHowieLeeGoesToFreeSlotH:
AI_Movement_Track_Flush(kActorHowieLee);
- AI_Movement_Track_Append(kActorHowieLee, 40, 60);
+ AI_Movement_Track_Append(kActorHowieLee, 40, 60); // in kSetFreeSlotH
AI_Movement_Track_Repeat(kActorHowieLee);
return true;
- case 6:
+ case kGoalHowieLeeMovesInDiner06: // Unused goal?
AI_Movement_Track_Flush(kActorHowieLee);
- AI_Movement_Track_Append(kActorHowieLee, 67, 90);
+ AI_Movement_Track_Append(kActorHowieLee, 67, 90); // in kSetCT01_CT12
AI_Movement_Track_Repeat(kActorHowieLee);
return true;
- case 50:
+ case kGoalHowieLeeStopMoving:
AI_Movement_Track_Flush(kActorHowieLee);
return false;
- case 100:
+ case kGoalHowieLeeGoesToFreeSlotC:
AI_Movement_Track_Flush(kActorHowieLee);
Actor_Put_In_Set(kActorHowieLee, kSetFreeSlotC);
- Actor_Set_At_Waypoint(kActorHowieLee, 35, 0);
+ Actor_Set_At_Waypoint(kActorHowieLee, 35, 0); // in kSetFreeSlotC
return false;
}
return false;
diff --git a/engines/bladerunner/script/scene/ct01.cpp b/engines/bladerunner/script/scene/ct01.cpp
index 138fada1a2..3eb06e2160 100644
--- a/engines/bladerunner/script/scene/ct01.cpp
+++ b/engines/bladerunner/script/scene/ct01.cpp
@@ -72,7 +72,7 @@ void SceneScriptCT01::InitializeScene() {
// so the loop will be prevented from playing when he is there.
if ( Global_Variable_Query(kVariableChapter) < 4
&& Actor_Query_Which_Set_In(kActorGordo) != kSetCT01_CT12
- && Random_Query(1, 3) == 1
+ && Random_Query(1, 2) == 1
){
// enhancement: don't always play
Scene_Loop_Start_Special(kSceneLoopModeLoseControl, kCT01LoopInshot, false);
@@ -115,6 +115,17 @@ void SceneScriptCT01::InitializeScene() {
Ambient_Sounds_Add_Sound(kSfxTHNDER3, 20, 40, 33, 50, -100, 100, -101, -101, 0, 0);
Ambient_Sounds_Add_Sound(kSfxTHNDER4, 20, 40, 33, 50, -100, 100, -101, -101, 0, 0);
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+ if (!Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)
+ && Global_Variable_Query(kVariableChapter) == 1
+ ) {
+ AI_Movement_Track_Flush(kActorHowieLee);
+ AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ }
+#endif // BLADERUNNER_ORIGINAL_BUGS
+
if (Game_Flag_Query(kFlagSpinnerAtCT01)) {
Scene_Loop_Set_Default(kCT01LoopMainLoop);
} else {
@@ -146,8 +157,8 @@ bool SceneScriptCT01::ClickedOn3DObject(const char *objectName, bool a2) {
// if ("ASIANSITTINGANDEATI" == objectName) { //bug?
if (Object_Query_Click("ASIANSITTINGANDEATI", objectName)) {
Actor_Face_Object(kActorMcCoy, "ASIANSITTINGANDEATI", true);
- Actor_Says(kActorMcCoy, 365, 13);
- Actor_Says(kActorHowieLee, 160, 13);
+ Actor_Says(kActorMcCoy, 365, 13); // Excuse me, pal!
+ Actor_Says(kActorHowieLee, 160, 13); // I take care of you soon, McCoy. Real busy tonight.
return true;
}
return false;
@@ -155,7 +166,7 @@ bool SceneScriptCT01::ClickedOn3DObject(const char *objectName, bool a2) {
bool SceneScriptCT01::ClickedOnActor(int actorId) {
if (actorId == kActorHowieLee) {
- Actor_Set_Goal_Number(kActorHowieLee, 50);
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeStopMoving);
if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, -335.23f, -6.5f, 578.97f, 12, true, false, false)) {
Actor_Face_Actor(kActorMcCoy, kActorHowieLee, true);
Actor_Face_Actor(kActorHowieLee, kActorMcCoy, true);
@@ -163,30 +174,60 @@ bool SceneScriptCT01::ClickedOnActor(int actorId) {
Actor_Says(kActorMcCoy, 260, 18);
Actor_Says(kActorHowieLee, 0, 14);
Game_Flag_Set(kFlagCT01McCoyTalkedToHowieLee);
- Actor_Set_Goal_Number(kActorHowieLee, 0);
- return true;
- }
-
- if (!Game_Flag_Query(kFlagNotUsed30)
- && Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) >= 40
- ) {
- dialogueWithHowieLee();
- Actor_Set_Goal_Number(kActorHowieLee, 0);
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
return true;
}
- if (Game_Flag_Query(kFlagCT01ZubenGone)) {
- Actor_Says(kActorMcCoy, 330, 17);
- Actor_Says(kActorHowieLee, 130, 13);
- Actor_Says(kActorHowieLee, 140, 14);
- } else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) < 50) {
- Actor_Says(kActorMcCoy, 330, 13);
- Actor_Says(kActorHowieLee, 160, 15);
+ if (_vm->_cutContent) {
+ // Howie begins with friendliness of 60
+ if (!Game_Flag_Query(kFlagCT01TalkToHowieAfterZubenMissing)) {
+ dialogueWithHowieLee();
+ } else {
+ if (Game_Flag_Query(kFlagCT01ZubenGone) && !Game_Flag_Query(kFlagCT01TalkToHowieAboutDeadZuben)) {
+ Game_Flag_Set(kFlagCT01TalkToHowieAboutDeadZuben);
+ Actor_Says(kActorMcCoy, 330, 17);
+ Actor_Says(kActorHowieLee, 130, 13);
+ Actor_Says(kActorHowieLee, 140, 14);
+ if (_vm->_cutContent) {
+ Actor_Says(kActorMcCoy, 315, 16);
+ }
+ Actor_Modify_Friendliness_To_Other(kActorHowieLee, kActorMcCoy, -10);
+ } else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) < 50) {
+ Actor_Says(kActorMcCoy, 310, 11); // keeping out of trouble...?
+ Actor_Says(kActorHowieLee, 190, 13); // I look like I got time for chit-er chat-er?
+ } else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) <= 55) {
+ Actor_Says(kActorMcCoy, 330, 13);
+ Actor_Says(kActorHowieLee, 160, 15); // real busy tonight
+ } else { // friendly > 55
+ Actor_Says(kActorMcCoy, 310, 11);
+ Actor_Says(kActorHowieLee, 10, 16);
+ }
+ }
} else {
- Actor_Says(kActorMcCoy, 310, 11);
- Actor_Says(kActorHowieLee, 10, 16);
+ // Original: Howie begins with friendliness of 60, max can be 65, lowest is 52
+ if (!Game_Flag_Query(kFlagCT01TalkToHowieAfterZubenMissing)
+ && Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) >= 40
+ ) {
+ dialogueWithHowieLee();
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ return true;
+ }
+ // In the original Howie's friendliness to McCoy can never go below 52
+ // and the flag kFlagCT01TalkToHowieAfterZubenMissing is never set
+ // so the code below was un-triggered
+ if (Game_Flag_Query(kFlagCT01ZubenGone)) {
+ Actor_Says(kActorMcCoy, 330, 17);
+ Actor_Says(kActorHowieLee, 130, 13);
+ Actor_Says(kActorHowieLee, 140, 14);
+ } else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) < 50) {
+ Actor_Says(kActorMcCoy, 330, 13);
+ Actor_Says(kActorHowieLee, 160, 15);
+ } else { // friendly >= 50
+ Actor_Says(kActorMcCoy, 310, 11);
+ Actor_Says(kActorHowieLee, 10, 16);
+ }
}
- Actor_Set_Goal_Number(kActorHowieLee, 0);
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
return true;
}
}
@@ -538,8 +579,9 @@ void SceneScriptCT01::dialogueWithHowieLee() {
DM_Add_To_List_Never_Repeat_Once_Selected(80, 3, 4, 8); // EMPLOYEE
}
- if (Actor_Clue_Query(kActorMcCoy, kClueCarColorAndMake)
- && Actor_Clue_Query(kActorMcCoy, kClueDispatchHitAndRun) // this clue is never obtained
+ if ((Actor_Clue_Query(kActorMcCoy, kClueCarColorAndMake)
+ || (_vm->_cutContent && Actor_Clue_Query(kActorMcCoy, kClueLabPaintTransfer)))
+ && Actor_Clue_Query(kActorMcCoy, kClueDispatchHitAndRun) // this clue is now acquired in restored Cut Content
) {
DM_Add_To_List_Never_Repeat_Once_Selected(90, 5, 4, 5); // HIT AND RUN
}
@@ -586,9 +628,14 @@ void SceneScriptCT01::dialogueWithHowieLee() {
case 60: // MORE RUNCITER CLUES
if (Actor_Clue_Query(kActorMcCoy, kClueSushiMenu)) {
Actor_Says(kActorMcCoy, 270, 11);
- Actor_Says(kActorHowieLee, 40, 15);
+ Actor_Says(kActorHowieLee, 40, 15); // You do Howie a favor? Distribute...
+ // TODO Possible YES/NO option for McCoy? -> and friendliness adjustment accordingly
} else {
+#if BLADERUNNER_ORIGINAL_BUGS
Actor_Says(kActorMcCoy, 270, 11);
+#else
+ Actor_Says(kActorMcCoy, 280, 11);
+#endif // BLADERUNNER_ORIGINAL_BUGS
Actor_Says(kActorHowieLee, 30, 14);
}
Actor_Modify_Friendliness_To_Other(kActorHowieLee, kActorMcCoy, 5);
@@ -596,14 +643,17 @@ void SceneScriptCT01::dialogueWithHowieLee() {
break;
case 70: // SMALL TALK
- Actor_Says(kActorMcCoy, 290, 13);
- if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) > 49
- && (Global_Variable_Query(kVariableChinyen) > 10
- || Query_Difficulty_Level() == kGameDifficultyEasy
- )
+ Actor_Says(kActorMcCoy, 290, 13); // what's real fresh tonight
+ if (((!_vm->_cutContent && Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) > 49)
+ || Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) > 59)
+ && (Global_Variable_Query(kVariableChinyen) > 10
+ || Query_Difficulty_Level() == kGameDifficultyEasy)
) {
Actor_Says(kActorHowieLee, 50, kAnimationModeTalk);
Actor_Says(kActorHowieLee, 60, kAnimationModeTalk);
+ if (_vm->_cutContent) {
+ Actor_Says(kActorMcCoy, 320, 13);
+ }
Actor_Face_Actor(kActorHowieLee, kActorMcCoy, true);
Actor_Says(kActorHowieLee, 70, 16);
Actor_Says(kActorMcCoy, 325, 13);
@@ -612,7 +662,11 @@ void SceneScriptCT01::dialogueWithHowieLee() {
}
Game_Flag_Set(kFlagCT01BoughtHowieLeeFood);
} else {
- Actor_Says(kActorHowieLee, 130, 15);
+ Actor_Says(kActorHowieLee, 130, 15); // nothing now
+ if (_vm->_cutContent) {
+ Actor_Says(kActorMcCoy, 8565, 14); // really?
+ Actor_Says(kActorHowieLee, 80, 16); // No, sir. Any luck...
+ }
}
break;
diff --git a/engines/bladerunner/script/scene/ct12.cpp b/engines/bladerunner/script/scene/ct12.cpp
index 3419766d3b..88b59cad33 100644
--- a/engines/bladerunner/script/scene/ct12.cpp
+++ b/engines/bladerunner/script/scene/ct12.cpp
@@ -70,6 +70,17 @@ void SceneScriptCT12::InitializeScene() {
Game_Flag_Set(kFlagCT12GaffSpinner);
}
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+ if (!Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)
+ && Global_Variable_Query(kVariableChapter) == 1
+ ) {
+ AI_Movement_Track_Flush(kActorHowieLee);
+ AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+ Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+ }
+#endif // BLADERUNNER_ORIGINAL_BUGS
+
if (Game_Flag_Query(kFlagCT01toCT12)
&& Game_Flag_Query(kFlagSpinnerAtCT01)
) {
diff --git a/engines/bladerunner/script/scene/ma02.cpp b/engines/bladerunner/script/scene/ma02.cpp
index f10fd59f64..af95d8a146 100644
--- a/engines/bladerunner/script/scene/ma02.cpp
+++ b/engines/bladerunner/script/scene/ma02.cpp
@@ -71,7 +71,7 @@ void SceneScriptMA02::InitializeScene() {
&& Game_Flag_Query(kFlagMcCoyIsHelpingReplicants)
&& !Actor_Clue_Query(kActorMcCoy, kClueCrystalsCigarette)
) {
- Overlay_Play("MA02OVER", 0, 1, 0, 0);
+ Overlay_Play("MA02OVER", 0, true, false, 0);
}
}
diff --git a/engines/bladerunner/script/scene/ma04.cpp b/engines/bladerunner/script/scene/ma04.cpp
index fc84ad9104..9bf36a6ed8 100644
--- a/engines/bladerunner/script/scene/ma04.cpp
+++ b/engines/bladerunner/script/scene/ma04.cpp
@@ -257,7 +257,7 @@ void SceneScriptMA04::PlayerWalkedIn() {
Player_Gains_Control();
}
if (isPhoneMessageWaiting() || isPhoneRinging()) {
- Overlay_Play("MA04OVER", 0, 1, 0, 0);
+ Overlay_Play("MA04OVER", 0, true, false, 0);
}
if (Game_Flag_Query(kFlagMA04McCoySleeping)) {
Loop_Actor_Walk_To_XYZ(kActorMcCoy, -7139.0f, 954.0f, 1746.0f, 0, true, false, false);
@@ -272,7 +272,7 @@ void SceneScriptMA04::PlayerWalkedIn() {
Sound_Play(kSfxVIDFONE1, 100, 0, 0, 50);
Loop_Actor_Walk_To_XYZ(kActorMcCoy, -7176.0f, 954.0f, 1806.0f, 0, false, false, false);
Actor_Face_Heading(kActorMcCoy, 256, true);
- Actor_Says(kActorMcCoy, 2680, 0);
+ Actor_Says(kActorMcCoy, 2680, kAnimationModeIdle);
Sound_Play(kSfxSPNBEEP9, 100, 0, 0, 50);
Delay(500);
Actor_Says(kActorGuzza, 0, 3);
@@ -311,6 +311,11 @@ void SceneScriptMA04::PlayerWalkedIn() {
}
Loop_Actor_Walk_To_XYZ(kActorMcCoy, -7199.0f, 955.0f, 1675.0f, 0, true, false, false);
Game_Flag_Set(kFlagChapter1Ending);
+
+ if (_vm->_cutContent) {
+ Game_Flag_Set(kFlagCT01TalkToHowieAfterZubenMissing);
+ }
+
Async_Actor_Walk_To_XYZ(kActorMcCoy, -7204.0f, 956.17f, 1568.0f, 0, false);
Set_Enter(kSetMA05, kSceneMA05);
}