diff options
-rw-r--r-- | engines/bladerunner/game_constants.h | 18 | ||||
-rw-r--r-- | engines/bladerunner/script/ai/howie_lee.cpp | 192 | ||||
-rw-r--r-- | engines/bladerunner/script/scene/ct01.cpp | 118 | ||||
-rw-r--r-- | engines/bladerunner/script/scene/ct12.cpp | 11 | ||||
-rw-r--r-- | engines/bladerunner/script/scene/ma02.cpp | 2 | ||||
-rw-r--r-- | engines/bladerunner/script/scene/ma04.cpp | 9 |
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); } |