From 674e44f55b8ce29e51e1eb5cdb9c316fd5b6ddaa Mon Sep 17 00:00:00 2001 From: Thanasis Antoniou Date: Fri, 17 May 2019 14:26:03 +0300 Subject: [PATCH] BLADERUNNER: Howie Lee AI and Leary overlap fixes --- engines/bladerunner/script/ai/howie_lee.cpp | 11 ++++------- engines/bladerunner/script/scene/ct01.cpp | 3 +-- engines/bladerunner/script/scene/ct12.cpp | 3 +-- engines/bladerunner/script/scene/dr05.cpp | 2 +- engines/bladerunner/script/scene/ps04.cpp | 5 +++++ engines/bladerunner/script/scene/rc01.cpp | 9 +++++++++ 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/engines/bladerunner/script/ai/howie_lee.cpp b/engines/bladerunner/script/ai/howie_lee.cpp index fb70160b8e0..87fed51786f 100644 --- a/engines/bladerunner/script/ai/howie_lee.cpp +++ b/engines/bladerunner/script/ai/howie_lee.cpp @@ -76,10 +76,8 @@ bool AIScriptHowieLee::Update() { // 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 - ) { + if (Game_Flag_Query(kFlagMcCoyInChinaTown) + && !Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)) { AI_Movement_Track_Flush(kActorHowieLee); AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12 Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault); @@ -131,15 +129,14 @@ void AIScriptHowieLee::CompletedMovementTrack() { if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03) { if (_vm->_cutContent) { // - // *after Act 1* Howie will be going to the Garbage Bin "regularly" + // *after Act 1* Howie will be going to the Garbage Bin "semi-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 + && Random_Query(1, 5) == 1 ) { Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin); return; // true; diff --git a/engines/bladerunner/script/scene/ct01.cpp b/engines/bladerunner/script/scene/ct01.cpp index 3eb06e21604..754d939cba0 100644 --- a/engines/bladerunner/script/scene/ct01.cpp +++ b/engines/bladerunner/script/scene/ct01.cpp @@ -118,8 +118,7 @@ void SceneScriptCT01::InitializeScene() { #if BLADERUNNER_ORIGINAL_BUGS #else if (!Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12) - && Global_Variable_Query(kVariableChapter) == 1 - ) { + && Global_Variable_Query(kVariableChapter) < 4) { AI_Movement_Track_Flush(kActorHowieLee); AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12 Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault); diff --git a/engines/bladerunner/script/scene/ct12.cpp b/engines/bladerunner/script/scene/ct12.cpp index 5eb48765bcc..27995a86459 100644 --- a/engines/bladerunner/script/scene/ct12.cpp +++ b/engines/bladerunner/script/scene/ct12.cpp @@ -73,8 +73,7 @@ void SceneScriptCT12::InitializeScene() { #if BLADERUNNER_ORIGINAL_BUGS #else if (!Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12) - && Global_Variable_Query(kVariableChapter) == 1 - ) { + && Global_Variable_Query(kVariableChapter) < 4) { AI_Movement_Track_Flush(kActorHowieLee); AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12 Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault); diff --git a/engines/bladerunner/script/scene/dr05.cpp b/engines/bladerunner/script/scene/dr05.cpp index df43d2c899d..0ae0f289999 100644 --- a/engines/bladerunner/script/scene/dr05.cpp +++ b/engines/bladerunner/script/scene/dr05.cpp @@ -111,7 +111,7 @@ bool SceneScriptDR05::ClickedOnItem(int itemId, bool a2) { if (itemId == kItemChain && Player_Query_Combat_Mode() - && Actor_Query_Goal_Number(kActorMoraji) == kGoalOfficerLearyDefault + && Actor_Query_Goal_Number(kActorMoraji) == kGoalMorajiDefault ) { Overlay_Play("DR05OVER", 1, false, true, 0); Item_Remove_From_World(kItemChain); diff --git a/engines/bladerunner/script/scene/ps04.cpp b/engines/bladerunner/script/scene/ps04.cpp index 108d8a763dd..c8564960163 100644 --- a/engines/bladerunner/script/scene/ps04.cpp +++ b/engines/bladerunner/script/scene/ps04.cpp @@ -364,6 +364,11 @@ void SceneScriptPS04::dialogueWithGuzza() { Delay(1000); Actor_Face_Actor(kActorGuzza, kActorMcCoy, true); Delay(1000); + // if McCoy confesses before the body is dumped, then the body should be found (even if in dumpster) + if (!Game_Flag_Query(kFlagCT04HomelessBodyThrownAway)) { + Game_Flag_Set(kFlagCT04HomelessBodyFound); + // return false; + } } Actor_Says(kActorGuzza, 700, 34); Actor_Says(kActorMcCoy, 4100, 13); diff --git a/engines/bladerunner/script/scene/rc01.cpp b/engines/bladerunner/script/scene/rc01.cpp index c07ff463f29..93bbc0b5aff 100644 --- a/engines/bladerunner/script/scene/rc01.cpp +++ b/engines/bladerunner/script/scene/rc01.cpp @@ -113,6 +113,15 @@ void SceneScriptRC01::InitializeScene() { } } else { if (!Game_Flag_Query(kFlagRC02toRC01) && !Game_Flag_Query(kFlagRC03toRC01)) { +#if BLADERUNNER_ORIGINAL_BUGS +#else + // set leary at his original position since otherwise he may overlap badly + // with scenery during the video loop of the spinner landing + // This only applies in Act 1, before the flag kFlagRC01PoliceDone is set + if (Actor_Query_Is_In_Current_Set(kActorOfficerLeary)) { + Actor_Set_At_XYZ(kActorOfficerLeary, -261.80f, 6.00f, 79.58f, 512); + } +#endif // BLADERUNNER_ORIGINAL_BUGS Scene_Loop_Start_Special(kSceneLoopModeLoseControl, kRC01LoopInshotWithCrowd, false); } Scene_Loop_Set_Default(kRC01LoopWithCrowd);