From 93e7e72285baf7312ca13ee68bf3568584c561b9 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Wed, 26 Feb 2014 22:37:44 +0100 Subject: AGOS: Add missing loyalty rating to Feeble Files 4CD version This attempts to restore the missing loyalty rating setting to the 4CD version of The Feeble Files. So far only for the English version, since that's all I have, but it would not surprised me if the other versions are similar. --- engines/agos/agos.h | 1 + engines/agos/detection_tables.h | 4 ++-- engines/agos/intern.h | 21 +++++++++--------- engines/agos/script_ff.cpp | 47 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 60 insertions(+), 13 deletions(-) (limited to 'engines/agos') diff --git a/engines/agos/agos.h b/engines/agos/agos.h index 34ab328999..69ad765231 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -1927,6 +1927,7 @@ public: void off_listSaveGames(); void off_checkCD(); void off_screenTextBox(); + void off_b2Set(); void off_isAdjNoun(); void off_hyperLinkOn(); void off_hyperLinkOff(); diff --git a/engines/agos/detection_tables.h b/engines/agos/detection_tables.h index 26c2e7e90d..77fc88c6bb 100644 --- a/engines/agos/detection_tables.h +++ b/engines/agos/detection_tables.h @@ -2622,7 +2622,7 @@ static const AGOSGameDescription gameDescriptions[] = { GType_FF, GID_FEEBLEFILES, - GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED + GF_OLD_BUNDLE | GF_TALKIE | GF_PACKED | GF_BROKEN_FF_RATING }, // The Feeble Files - English Windows 4CD @@ -2645,7 +2645,7 @@ static const AGOSGameDescription gameDescriptions[] = { GType_FF, GID_FEEBLEFILES, - GF_OLD_BUNDLE | GF_TALKIE + GF_OLD_BUNDLE | GF_TALKIE | GF_BROKEN_FF_RATING }, // The Feeble Files - French Windows 4CD diff --git a/engines/agos/intern.h b/engines/agos/intern.h index 8b7ab32315..3f5c8c519b 100644 --- a/engines/agos/intern.h +++ b/engines/agos/intern.h @@ -246,16 +246,17 @@ enum SubObjectFlags { }; enum GameFeatures { - GF_TALKIE = 1 << 0, - GF_OLD_BUNDLE = 1 << 1, - GF_CRUNCHED = 1 << 2, - GF_CRUNCHED_GAMEPC = 1 << 3, - GF_ZLIBCOMP = 1 << 4, - GF_32COLOR = 1 << 5, - GF_EGA = 1 << 6, - GF_PLANAR = 1 << 7, - GF_DEMO = 1 << 8, - GF_PACKED = 1 << 9 + GF_TALKIE = 1 << 0, + GF_OLD_BUNDLE = 1 << 1, + GF_CRUNCHED = 1 << 2, + GF_CRUNCHED_GAMEPC = 1 << 3, + GF_ZLIBCOMP = 1 << 4, + GF_32COLOR = 1 << 5, + GF_EGA = 1 << 6, + GF_PLANAR = 1 << 7, + GF_DEMO = 1 << 8, + GF_PACKED = 1 << 9, + GF_BROKEN_FF_RATING = 1 << 10 }; enum GameFileTypes { diff --git a/engines/agos/script_ff.cpp b/engines/agos/script_ff.cpp index d942a88e9a..ae0df84b14 100644 --- a/engines/agos/script_ff.cpp +++ b/engines/agos/script_ff.cpp @@ -243,7 +243,7 @@ void AGOSEngine_Feeble::setupOpcodes() { /* 164 */ OPCODE(oe2_getDollar2), OPCODE(off_isAdjNoun), - OPCODE(oe2_b2Set), + OPCODE(off_b2Set), OPCODE(oe2_b2Clear), /* 168 */ OPCODE(oe2_b2Zero), @@ -467,6 +467,31 @@ void AGOSEngine_Feeble::off_isAdjNoun() { setScriptCondition(false); } +void AGOSEngine_Feeble::off_b2Set() { + // 166: set bit2 + uint bit = getVarOrByte(); + _bitArrayTwo[bit / 16] |= (1 << (bit & 15)); + + if (getFeatures() & GF_BROKEN_FF_RATING) { + // WORKAROUND: The 4CD version of The Feeble File is missing the + // opcodes to set the loyalty rating. This approximates the script + // from the 2CD version. See bug #6525. + + switch (bit) { + case 152: + // Kicking vending machine: Possibility of Undesirable Character Flaws + writeVariable(120, 1); + break; + case 153: + // Confessing: Confirmed Minor Character Flaws + writeVariable(120, 2); + break; + default: + break; + } + } +} + void AGOSEngine_Feeble::off_hyperLinkOn() { // 171: oracle hyperlink on hyperLinkOn(getVarOrWord()); @@ -565,6 +590,26 @@ void AGOSEngine_Feeble::off_loadVideo() { assert(_moviePlayer); _moviePlayer->load(); + + if (getFeatures() & GF_BROKEN_FF_RATING) { + // WORKAROUND: The 4CD version of The Feeble File is missing the + // opcodes to set the loyalty rating. This approximates the script + // from the 2CD version. See bug #6525. + + if (strcmp((const char *)filename, "MainMin.smk") == 0) { + // Being sent to Cygnus Alpha: Suspected Subversive Activity + writeVariable(120, 3); + } else if (strcmp((const char *)filename, "fxmadsam.smk") == 0) { + // Escaping from Cygnus Alpha: Confirmed Subversive Activity + writeVariable(120, 4); + } else if (strcmp((const char *)filename, "Statue1.smk") == 0) { + // Being brought before Filbert: Confirmed Treasonous Activity + writeVariable(120, 5); + } else if (strcmp((const char *)filename, "IceTrench.smk") == 0) { + // Arriving at rebel base: Freedom Fighters Operative + writeVariable(120, 6); + } + } } void AGOSEngine_Feeble::off_playVideo() { -- cgit v1.2.3