aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/workarounds.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/workarounds.h')
-rw-r--r--engines/sci/engine/workarounds.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h
index be066d5fc7..9f38ab13ee 100644
--- a/engines/sci/engine/workarounds.h
+++ b/engines/sci/engine/workarounds.h
@@ -26,8 +26,37 @@
#ifndef SCI_ENGINE_WORKAROUNDS_H
#define SCI_ENGINE_WORKAROUNDS_H
+#include "sci/engine/vm_types.h"
+#include "sci/sci.h"
+
namespace Sci {
+enum SciWorkaroundType {
+ WORKAROUND_NONE, // only used by terminator or when no workaround was found
+ WORKAROUND_IGNORE, // ignore kernel call
+ WORKAROUND_STILLCALL, // still do kernel call
+ WORKAROUND_FAKE // fake kernel call / replace temp value / fake opcode
+};
+
+struct SciWorkaroundSolution {
+ SciWorkaroundType type;
+ uint16 value;
+};
+
+struct SciWorkaroundEntry {
+ SciGameId gameId;
+ int roomNr;
+ int scriptNr;
+ int16 inheritanceLevel;
+ const char *objectName;
+ const char *methodName;
+ int localCallOffset;
+ int index;
+ SciWorkaroundSolution newValue;
+};
+
+#define SCI_WORKAROUNDENTRY_TERMINATOR { (SciGameId)0, -1, -1, 0, NULL, NULL, -1, 0, { WORKAROUND_NONE, 0 } }
+
// gameID, room,script,lvl, object-name, method-name, call,index, workaround
static const SciWorkaroundEntry opcodeDivWorkarounds[] = {
{ GID_QFG1VGA, 301, 928, 0, "Blink", "init", -1, 0, { WORKAROUND_FAKE, 0 } }, // when entering inn, gets called with 1 parameter, but 2nd parameter is used for div which happens to be an object
@@ -159,6 +188,8 @@ static const SciWorkaroundEntry kStrCpy_workarounds[] = {
SCI_WORKAROUNDENTRY_TERMINATOR
};
+#undef FAKE
+
} // End of namespace Sci
#endif // SCI_ENGINE_WORKAROUNDS_H