diff options
| author | Thanasis Antoniou | 2019-05-13 03:27:07 +0300 |
|---|---|---|
| committer | Thanasis Antoniou | 2019-05-13 03:29:00 +0300 |
| commit | 7f6b9750d7c77afa469aac82f75bb46bf75ddf3e (patch) | |
| tree | f5ff009f7bc43078c4a67a0f60832f3074e3a2f8 /engines | |
| parent | 9207f7270b9be7b72f7b65f5df6957c56c3bdc31 (diff) | |
| download | scummvm-rg350-7f6b9750d7c77afa469aac82f75bb46bf75ddf3e.tar.gz scummvm-rg350-7f6b9750d7c77afa469aac82f75bb46bf75ddf3e.tar.bz2 scummvm-rg350-7f6b9750d7c77afa469aac82f75bb46bf75ddf3e.zip | |
BLADERUNNER: Howie restored content
Howie will now be in Chinatown in Acts 2 and 3, but won't always be in the diner
This gives him more probability to discover the homeless body if in dumpster and also enables some extra dialogue
Diffstat (limited to 'engines')
| -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); } |
