aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/agos/agos.h1
-rw-r--r--engines/agos/detection_tables.h4
-rw-r--r--engines/agos/intern.h21
-rw-r--r--engines/agos/script_ff.cpp47
4 files changed, 60 insertions, 13 deletions
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() {