diff options
author | Filippos Karapetis | 2010-07-26 08:21:43 +0000 |
---|---|---|
committer | Filippos Karapetis | 2010-07-26 08:21:43 +0000 |
commit | d85e01640609f59bd1b3a8e9ffb3f16677832fac (patch) | |
tree | c031b76c5197dc4aac085e126c0c88e3661c35fc /engines/sci/engine | |
parent | 8d04588880548ef25102f15343ad970f274f6e09 (diff) | |
download | scummvm-rg350-d85e01640609f59bd1b3a8e9ffb3f16677832fac.tar.gz scummvm-rg350-d85e01640609f59bd1b3a8e9ffb3f16677832fac.tar.bz2 scummvm-rg350-d85e01640609f59bd1b3a8e9ffb3f16677832fac.zip |
SCI: Fixed bug #3034506, "QFG4 Demo: kPalette Subfunction Sig Mismatch", plus another sig mismatch on kDrawCel later on, when Dr. Cranium talks
svn-id: r51304
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/kernel_tables.h | 4 | ||||
-rw-r--r-- | engines/sci/engine/kgraphics.cpp | 5 | ||||
-rw-r--r-- | engines/sci/engine/workarounds.cpp | 12 | ||||
-rw-r--r-- | engines/sci/engine/workarounds.h | 2 |
4 files changed, 19 insertions, 4 deletions
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 943d0cab9d..ff754ab92d 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -210,7 +210,7 @@ static const SciKernelMapSubEntry kPalVary_subops[] = { static const SciKernelMapSubEntry kPalette_subops[] = { { SIG_SCIALL, 1, MAP_CALL(PaletteSetFromResource), "i(i)", NULL }, { SIG_SCIALL, 2, MAP_CALL(PaletteSetFlag), "iii", NULL }, - { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", NULL }, + { SIG_SCIALL, 3, MAP_CALL(PaletteUnsetFlag), "iii", kPaletteUnsetFlag_workarounds }, { SIG_SCIALL, 4, MAP_CALL(PaletteSetIntensity), "iii(i)", NULL }, { SIG_SCIALL, 5, MAP_CALL(PaletteFindColor), "iii", NULL }, { SIG_SCIALL, 6, MAP_CALL(PaletteAnimate), "i*", NULL }, @@ -332,7 +332,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, kDrawCel_workarounds }, // for kq6 hires and qfg4 demo { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index cf260bc4e1..dae2197533 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1000,8 +1000,9 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { uint16 y = argv[4].toUint16(); int16 priority = (argc > 5) ? argv[5].toSint16() : -1; uint16 paletteNo = (argc > 6) ? argv[6].toUint16() : 0; - bool hiresMode = (argc > 7) ? true : false; - reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; + // QFG4 demo calls this with an extra integer parameter (room 22, when Dr. Cranium speaks) + bool hiresMode = (argc > 7 && argv[6].segment != 0) ? true : false; + reg_t upscaledHiresHandle = (argc > 7 && argv[6].segment != 0) ? argv[7] : NULL_REG; g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index dd65b8e8a1..af30753c03 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -111,6 +111,12 @@ const SciWorkaroundEntry kAbs_workarounds[] = { }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kDrawCel_workarounds[] = { + { GID_QFG4, 371, 22, 0, "GloryWindow", "<noname 196>", -1, 0, { WORKAROUND_STILLCALL, 0 } }, // when Dr. Cranium talks, gets called with 1 extra parameter + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kDisplay_workarounds[] = { { GID_ISLANDBRAIN, 300, 300, 0, "geneDude", "show", -1, 0, { WORKAROUND_IGNORE, 0 } }, // when looking at the gene explanation chart - a parameter is an object { GID_SQ4, 391, 391, 0, "doCatalog", "mode", 0x84, 0, { WORKAROUND_IGNORE, 0 } }, // clicking on catalog in roboter sale - a parameter is an object @@ -186,6 +192,12 @@ const SciWorkaroundEntry kMemory_workarounds[] = { }; // gameID, room,script,lvl, object-name, method-name, call,index, workaround +const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[] = { + { GID_QFG4, 100, 100, 0, "doMovie", "<noname 144>", -1, 0, { WORKAROUND_IGNORE, 0 } }, // after the Sierra logo, no flags are passed, thus the call is meaningless + SCI_WORKAROUNDENTRY_TERMINATOR +}; + +// gameID, room,script,lvl, object-name, method-name, call,index, workaround const SciWorkaroundEntry kSetPort_workarounds[] = { { GID_LSL6, 740, 740, 0, "rm740", "drawPic", -1, 0, { WORKAROUND_IGNORE, 0 } }, // ending scene, is called with additional 3 (!) parameters SCI_WORKAROUNDENTRY_TERMINATOR diff --git a/engines/sci/engine/workarounds.h b/engines/sci/engine/workarounds.h index 5eaf8721a2..cbd31d0849 100644 --- a/engines/sci/engine/workarounds.h +++ b/engines/sci/engine/workarounds.h @@ -73,6 +73,7 @@ extern const SciWorkaroundEntry opcodeOrWorkarounds[]; extern const SciWorkaroundEntry opcodeDptoaWorkarounds[]; extern const SciWorkaroundEntry uninitializedReadWorkarounds[]; extern const SciWorkaroundEntry kAbs_workarounds[]; +extern const SciWorkaroundEntry kDrawCel_workarounds[]; extern const SciWorkaroundEntry kDisplay_workarounds[]; extern const SciWorkaroundEntry kDisposeScript_workarounds[]; extern const SciWorkaroundEntry kDoSoundFade_workarounds[]; @@ -83,6 +84,7 @@ extern const SciWorkaroundEntry kGraphFillBoxForeground_workarounds[]; extern const SciWorkaroundEntry kGraphFillBoxAny_workarounds[]; extern const SciWorkaroundEntry kGraphRedrawBox_workarounds[]; extern const SciWorkaroundEntry kMemory_workarounds[]; +extern const SciWorkaroundEntry kPaletteUnsetFlag_workarounds[]; extern const SciWorkaroundEntry kSetPort_workarounds[]; extern const SciWorkaroundEntry kUnLoad_workarounds[]; extern const SciWorkaroundEntry kStrCpy_workarounds[]; |