diff options
author | Martin Kiewitz | 2010-08-31 15:50:46 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-08-31 15:50:46 +0000 |
commit | fa7c6a9969806d2163d81153a3b3610b65ea12e4 (patch) | |
tree | 2fd4bee487ecd37a154b3c83db5ce4c52b8bd8ba /engines/sci/graphics | |
parent | b5a17ca628e984fa13190c64fb5caef6108369ca (diff) | |
download | scummvm-rg350-fa7c6a9969806d2163d81153a3b3610b65ea12e4.tar.gz scummvm-rg350-fa7c6a9969806d2163d81153a3b3610b65ea12e4.tar.bz2 scummvm-rg350-fa7c6a9969806d2163d81153a3b3610b65ea12e4.zip |
SCI: adding workaround for platform-specific
incompatibility with some sierra games. Some games open a new menu, set mouse cursor within that menu and expect the mouse cursor to be in there and will close it, if it's outside. In case of Wiimote/touch interfaces this logic won't work of course. Fixes island of dr. brain and QfG1VGA on Wii and touch-interface platforms
svn-id: r52474
Diffstat (limited to 'engines/sci/graphics')
-rw-r--r-- | engines/sci/graphics/cursor.cpp | 35 | ||||
-rw-r--r-- | engines/sci/graphics/cursor.h | 10 |
2 files changed, 45 insertions, 0 deletions
diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp index a906899113..8e69d034c8 100644 --- a/engines/sci/graphics/cursor.cpp +++ b/engines/sci/graphics/cursor.cpp @@ -266,6 +266,16 @@ void GfxCursor::kernelSetMacCursor(GuiResourceId viewNum, int loopNum, int celNu kernelShow(); } +// this list contains all mandatory set cursor changes, that need special handling +// ffs. GfxCursor::setPosition (below) +// Game, newPosition, validRect +static const SciCursorSetPositionWorkarounds setPositionWorkarounds[] = { + { GID_ISLANDBRAIN, 84, 109, 46, 76, 174, 243 }, // island of dr. brain / game menu + { GID_LSL5, 23, 171, 0, 0, 26, 320 }, // larry 5 / skip forward helper + { GID_QFG1VGA, 64, 174, 40, 37, 74, 284 }, // Quest For Glory 1 VGA / run/walk/sleep sub-menu + { (SciGameId)0, -1, -1, -1, -1, -1, -1 } +}; + void GfxCursor::setPosition(Common::Point pos) { // Don't set position, when cursor is not visible. // This fixes eco quest 1 (floppy) right at the start, which is setting @@ -282,6 +292,31 @@ void GfxCursor::setPosition(Common::Point pos) { _screen->adjustToUpscaledCoordinates(pos.y, pos.x); g_system->warpMouse(pos.x, pos.y); } + + // Some games display a new menu, set mouse position somewhere within and + // expect it to be in there. This is fine for a real mouse, but on wii using + // wii-mote or touch interfaces this won't work. In fact on those platforms + // the menus will close immediately because of that behaviour. + // We identify those cases and set a reaction-rect. If the mouse it outside + // of that rect, we won't report the position back to the scripts. + // As soon as the mouse was inside once, we will revert to normal behaviour + // Currently this code is enabled for all platforms, especially because we can't + // differentiate between e.g. Windows used via mouse and Windows used via touchscreen + // The workaround won't hurt real-mouse platforms + const SciGameId gameId = g_sci->getGameId(); + const SciCursorSetPositionWorkarounds *workaround; + workaround = setPositionWorkarounds; + while (workaround->newPositionX != -1) { + if (workaround->gameId == gameId + && ((workaround->newPositionX == pos.x) && (workaround->newPositionY == pos.y))) { + EngineState *s = g_sci->getEngineState(); + s->_cursorWorkaroundActive = true; + s->_cursorWorkaroundPoint = pos; + s->_cursorWorkaroundRect = Common::Rect(workaround->rectLeft, workaround->rectTop, workaround->rectRight, workaround->rectBottom); + return; + } + workaround++; + } } Common::Point GfxCursor::getPosition() { diff --git a/engines/sci/graphics/cursor.h b/engines/sci/graphics/cursor.h index 787841f5be..10cd5d8a85 100644 --- a/engines/sci/graphics/cursor.h +++ b/engines/sci/graphics/cursor.h @@ -40,6 +40,16 @@ class GfxPalette; typedef Common::HashMap<int, GfxView *> CursorCache; +struct SciCursorSetPositionWorkarounds { + SciGameId gameId; + int16 newPositionY; + int16 newPositionX; + int16 rectTop; + int16 rectLeft; + int16 rectBottom; + int16 rectRight; +}; + class GfxCursor { public: GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *screen); |