diff options
-rw-r--r-- | engines/sci/engine/kernel.h | 27 | ||||
-rw-r--r-- | engines/sci/engine/workarounds.h | 31 |
2 files changed, 32 insertions, 26 deletions
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 8de95f56ef..8467a640af 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -40,6 +40,7 @@ namespace Sci { struct Node; // from segment.h struct List; // from segment.h struct SelectorCache; // from selector.h +struct SciWorkaroundEntry; // from workarounds.h /** * @defgroup VocabularyResources Vocabulary resources in SCI @@ -120,32 +121,6 @@ enum { /* Generic description: */ typedef reg_t KernelFunctionCall(EngineState *s, int argc, reg_t *argv); -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 } } - struct KernelSubFunction { KernelFunctionCall *function; const char *name; 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 |