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/bladerunner/script/ai | |
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/bladerunner/script/ai')
-rw-r--r-- | engines/bladerunner/script/ai/howie_lee.cpp | 192 |
1 files changed, 136 insertions, 56 deletions
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; |