From 1428aae3572f0ff2b389699df539c51a0527c4f9 Mon Sep 17 00:00:00 2001 From: Thanasis Antoniou Date: Tue, 5 Nov 2019 02:14:43 +0200 Subject: BLADERUNNER: #11239 Fix buggy state and saved games for Desk Clerk Resolves ticket #11239 Occurs when McCoy leaves the scene with Leon and Desk Clerk too fast, before Leon drops the clerk Crash happens only when using CDFRAMES, but the animation would be bugged even when using HDFRAMES.DAT --- engines/bladerunner/script/ai/desk_clerk.cpp | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'engines/bladerunner/script/ai') diff --git a/engines/bladerunner/script/ai/desk_clerk.cpp b/engines/bladerunner/script/ai/desk_clerk.cpp index 8b1e91fd43..d7110bc54f 100644 --- a/engines/bladerunner/script/ai/desk_clerk.cpp +++ b/engines/bladerunner/script/ai/desk_clerk.cpp @@ -122,6 +122,12 @@ bool AIScriptDeskClerk::GoalChanged(int currentGoalNumber, int newGoalNumber) { case kGoalDeskClerkRecovered: Actor_Put_In_Set(kActorDeskClerk, kSetCT09); Actor_Set_At_XYZ(kActorDeskClerk, 282.0f, 360.52f, 743.0f, 513); +#if BLADERUNNER_ORIGINAL_BUGS +#else + Actor_Change_Animation_Mode(kActorDeskClerk, kAnimationModeIdle); + _animationFrame = 0; + _animationState = 0; +#endif // BLADERUNNER_ORIGINAL_BUGS break; case kGoalDeskClerkKnockedOut: // fall through @@ -135,6 +141,32 @@ bool AIScriptDeskClerk::GoalChanged(int currentGoalNumber, int newGoalNumber) { bool AIScriptDeskClerk::UpdateAnimation(int *animation, int *frame) { +#if BLADERUNNER_ORIGINAL_BUGS +#else + // Fixing a bug for when the Clerk gets stuck in animation id 668, after Act 3: + // - when using HDFRAMES, the clerk will briefly be in the choking animation when McCoy re-enters + // - when using CDFRAMES, the game would crash with a message "Unable to locate page 2214 for animation 668 frame 4!" + // This occurs when: + // The player walks out too fast from the scene where Leon is choking the clerk in Act 3. + // Hence, Leon's AI script's OtherAgentExitedThisScene() is triggered, Leon is gone, + // and DeskClerk goal is set to kGoalDeskClerkKnockedOut which puts him in kSetFreeSlotH without changing his animation id. + // Thus later on, when the player leaves Chinatown and returns, DeskClerk's (update()) will set his goal to kGoalDeskClerkRecovered + // In Act 4, the CDFRAMES#.DAT method loads a reduced number of animations for DeskClerk causing the crash when McCoy visits the Yukon lobby. + // + // The following fix will work with awry saved games too (even from the original game in theory), + // that have this buggy state stored. + // We also include the rest of the problematic states that are missing animations in Act 4 + // (ie. all _animationState >= 6) + if (Global_Variable_Query(kVariableChapter) > 3 + && _animationState >= 6 + ) { + Actor_Change_Animation_Mode(kActorDeskClerk, kAnimationModeIdle); + *animation = 661; + _animationFrame = 0; + _animationState = 0; + } +#endif // BLADERUNNER_ORIGINAL_BUGS + switch (_animationState) { case 0: if (_flag1) { -- cgit v1.2.3