From 9c562da4ede87ba5b4ad174fb804bd2529cf38e7 Mon Sep 17 00:00:00 2001 From: Thanasis Antoniou Date: Mon, 4 Mar 2019 16:53:23 +0200 Subject: BLADERUNNER: retirement bounty exploit fix And small dialogue bits with Guzza when reporting in now only play in Act 1 where they make sense. Also, don't allow McCoy to get the retirement bonus twice in Act 1. Also don't allow him to get money (100 cy) from Guzza if he has enough (>=300). --- engines/bladerunner/script/ai/zuben.cpp | 4 ++ engines/bladerunner/script/scene/ma04.cpp | 13 +++++-- engines/bladerunner/script/scene/ps04.cpp | 65 +++++++++++++++++++++++++++---- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/engines/bladerunner/script/ai/zuben.cpp b/engines/bladerunner/script/ai/zuben.cpp index 8c960315e5..8b85126f64 100644 --- a/engines/bladerunner/script/ai/zuben.cpp +++ b/engines/bladerunner/script/ai/zuben.cpp @@ -1162,7 +1162,11 @@ bool AIScriptZuben::ChangeAnimationMode(int mode) { break; case kAnimationModeDie: Actor_Set_Targetable(kActorZuben, false); +#if BLADERUNNER_ORIGINAL_BUGS + // original code uses no voice here +#else Sound_Play_Speech_Line(kActorZuben, 9020, 75, 0, 99); // add Zuben's death rattle here +#endif // BLADERUNNER_ORIGINAL_BUGS switch (_animationState) { case 2: case 4: diff --git a/engines/bladerunner/script/scene/ma04.cpp b/engines/bladerunner/script/scene/ma04.cpp index 0325f27ad7..d9640d3f61 100644 --- a/engines/bladerunner/script/scene/ma04.cpp +++ b/engines/bladerunner/script/scene/ma04.cpp @@ -575,15 +575,22 @@ void SceneScriptMA04::sleep() { Game_Flag_Set(kFlagChapter2Intro); Global_Variable_Set(kVariableChapter, 2); Chapter_Enter(2, kSetMA02_MA04, kSceneMA04); +#if BLADERUNNER_ORIGINAL_BUGS if (Query_Difficulty_Level() != 0) { if (!Game_Flag_Query(kFlagZubenBountyPaid)) { Global_Variable_Increment(kVariableChinyen, 200); } -#if BLADERUNNER_ORIGINAL_BUGS // ensure valid kFlagZubenBountyPaid flag state -#else + } +#else // ensure valid kFlagZubenBountyPaid flag state + // NOTE If not for the "Report Im" to Guzza, it would be simpler to have McCoy get the money as soon as he retires Zuben + // so that would be in a single place in the code + if (!Game_Flag_Query(kFlagZubenBountyPaid) && Game_Flag_Query(kFlagZubenRetired)) { // get retirement money at end of day 1 only if Zuben was retired. + if (Query_Difficulty_Level() != 0) { + Global_Variable_Increment(kVariableChinyen, 200); + } Game_Flag_Set(kFlagZubenBountyPaid); // not a proper bug, but was missing from original code, so the flag would remain in non-consistent state in this case -#endif // BLADERUNNER_ORIGINAL_BUGS } +#endif // BLADERUNNER_ORIGINAL_BUGS } else { Set_Enter(kSetMA02_MA04, kSceneMA04); } diff --git a/engines/bladerunner/script/scene/ps04.cpp b/engines/bladerunner/script/scene/ps04.cpp index 10f26d23f4..51fbbf6e8f 100644 --- a/engines/bladerunner/script/scene/ps04.cpp +++ b/engines/bladerunner/script/scene/ps04.cpp @@ -176,6 +176,7 @@ void SceneScriptPS04::dialogueWithGuzza() { case 120: // MONEY Actor_Says(kActorMcCoy, 4000, 18); +#if BLADERUNNER_ORIGINAL_BUGS Actor_Clue_Acquire(kActorMcCoy, kClueGuzzasCash, true, kActorGuzza); Actor_Says(kActorGuzza, 520, 33); Actor_Says(kActorMcCoy, 4055, 13); @@ -188,6 +189,30 @@ void SceneScriptPS04::dialogueWithGuzza() { if (Query_Difficulty_Level() != 0) { Global_Variable_Increment(kVariableChinyen, 100); } +#else + if (Global_Variable_Query(kVariableChinyen) < 300) { // basically if McCoy hasn't retired Zuben or drunk away his money at the bar + Actor_Clue_Acquire(kActorMcCoy, kClueGuzzasCash, true, kActorGuzza); + Actor_Says(kActorGuzza, 520, 33); + Actor_Says(kActorMcCoy, 4055, 13); + Actor_Says(kActorGuzza, 530, 31); + Actor_Says(kActorMcCoy, 4060, 13); + Actor_Says(kActorGuzza, 540, 31); + Actor_Says(kActorGuzza, 550, 32); + Actor_Says(kActorMcCoy, 4065, 18); + Actor_Says(kActorGuzza, 560, 34); + if (Query_Difficulty_Level() != 0) { + Global_Variable_Increment(kVariableChinyen, 100); + } + } else { // Guzza denies the loan + Actor_Says(kActorGuzza, 470, 33); // Hey, I'd love to be your own personal ATM but the department's strapped right now. + Actor_Says(kActorGuzza, 480, 31); + Actor_Says(kActorGuzza, 490, 31); + Actor_Says(kActorGuzza, 500, 32); + Actor_Says(kActorMcCoy, 4045, 16); + Actor_Says(kActorGuzza, 510, 31); + Actor_Says(kActorMcCoy, 4050, 18); + } +#endif // BLADERUNNER_ORIGINAL_BUGS break; case 130: // REPORT IN @@ -206,8 +231,15 @@ void SceneScriptPS04::dialogueWithGuzza() { Actor_Face_Actor(kActorMcCoy, kActorGuzza, true); Actor_Says(kActorMcCoy, 3930, 13); Actor_Face_Actor(kActorGuzza, kActorMcCoy, true); - Actor_Says(kActorGuzza, 180, 34); - Actor_Says(kActorMcCoy, 3935, 13); +#if BLADERUNNER_ORIGINAL_BUGS + Actor_Says(kActorGuzza, 180, 34); // But I'm proud of you McCoy. Why don't you take the rest of the day off? + Actor_Says(kActorMcCoy, 3935, 13); // Thanks. +#else + if (Global_Variable_Query(kVariableChapter) == 1) { // only play this dialogue (about day off) on day one. It doesn't fit in the next days + Actor_Says(kActorGuzza, 180, 34); // But I'm proud of you McCoy. Why don't you take the rest of the day off? + Actor_Says(kActorMcCoy, 3935, 13); // Thanks. + } +#endif // BLADERUNNER_ORIGINAL_BUGS Actor_Says(kActorGuzza, 190, 30); Actor_Says(kActorMcCoy, 3940, 16); Actor_Says(kActorGuzza, 200, 31); @@ -221,21 +253,40 @@ void SceneScriptPS04::dialogueWithGuzza() { Actor_Says(kActorGuzza, 260, 33); Actor_Says(kActorGuzza, 270, 32); Game_Flag_Set(kFlagPS04GuzzaTalkZubenRetired); +#if BLADERUNNER_ORIGINAL_BUGS if (Query_Difficulty_Level() != 0) { Global_Variable_Increment(kVariableChinyen, 200); } Game_Flag_Set(kFlagZubenBountyPaid); +#else + if (!Game_Flag_Query(kFlagZubenBountyPaid)) { // get retirement money only if haven't been auto-paid at end of Day 1 (sleep trigger) + if (Query_Difficulty_Level() != 0) { + Global_Variable_Increment(kVariableChinyen, 200); + } + Game_Flag_Set(kFlagZubenBountyPaid); // not a proper bug, but was missing from original code, so the flag would remain in non-consistent state in this case + } +#endif // BLADERUNNER_ORIGINAL_BUGS } else if ( Game_Flag_Query(kFlagZubenSpared) && !Game_Flag_Query(kFlagPS04GuzzaTalkZubenEscaped) ) { Actor_Says(kActorMcCoy, 3955, 13); Actor_Says(kActorGuzza, 280, 30); Actor_Says(kActorMcCoy, 3960, 18); - Actor_Says(kActorGuzza, 290, 32); - Actor_Says(kActorGuzza, 300, 31); - Actor_Says(kActorMcCoy, 3965, 13); - Actor_Says(kActorGuzza, 310, 33); - Actor_Says(kActorGuzza, 320, 34); +#if BLADERUNNER_ORIGINAL_BUGS + Actor_Says(kActorGuzza, 290, 32); // Don't push it kid. You look like you're beat anyway. + Actor_Says(kActorGuzza, 300, 31); // Why don't you rest them dogs the rest of the day. + Actor_Says(kActorMcCoy, 3965, 13); // I still got plenty energy. + Actor_Says(kActorGuzza, 310, 33); // That's an order McCoy. + Actor_Says(kActorGuzza, 320, 34); // I'm ordering you to relax. +#else + if (Global_Variable_Query(kVariableChapter) == 1) { // only play this dialogue (about day off) on day one. It doesn't fit in the next days + Actor_Says(kActorGuzza, 290, 32); // Don't push it kid. You look like you're beat anyway. + Actor_Says(kActorGuzza, 300, 31); // Why don't you rest them dogs the rest of the day. + Actor_Says(kActorMcCoy, 3965, 13); // I still got plenty energy. + Actor_Says(kActorGuzza, 310, 33); // That's an order McCoy. + Actor_Says(kActorGuzza, 320, 34); // I'm ordering you to relax. + } +#endif // BLADERUNNER_ORIGINAL_BUGS Game_Flag_Set(kFlagPS04GuzzaTalkZubenEscaped); } else if ( ( Actor_Clue_Query(kActorMcCoy, kClueChopstickWrapper) -- cgit v1.2.3