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
This commit is contained in:
Thanasis Antoniou 2019-11-05 02:14:43 +02:00
parent 8c063e95c2
commit 1428aae357

View File

@ -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) {