aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThanasis Antoniou2019-03-04 16:53:23 +0200
committerThanasis Antoniou2019-03-04 16:53:23 +0200
commit9c562da4ede87ba5b4ad174fb804bd2529cf38e7 (patch)
tree5cac10a0beaa5b25fa7ce3e160028c0abbc2dc17
parentdc74061311e9581d834fae5bbdf9eeb218248068 (diff)
downloadscummvm-rg350-9c562da4ede87ba5b4ad174fb804bd2529cf38e7.tar.gz
scummvm-rg350-9c562da4ede87ba5b4ad174fb804bd2529cf38e7.tar.bz2
scummvm-rg350-9c562da4ede87ba5b4ad174fb804bd2529cf38e7.zip
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).
-rw-r--r--engines/bladerunner/script/ai/zuben.cpp4
-rw-r--r--engines/bladerunner/script/scene/ma04.cpp13
-rw-r--r--engines/bladerunner/script/scene/ps04.cpp65
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)