From ad7400524b8e024577169f7dd4cb4d586ee37fa0 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 7 Mar 2011 01:07:53 -0500 Subject: MOHAWK: Make Riven use original executables for cursors It will try both Windows and Macintosh executables. The hardcoded cursors have been removed. --- engines/mohawk/cursors.cpp | 201 ++++-------- engines/mohawk/cursors.h | 34 +- engines/mohawk/riven.cpp | 13 +- engines/mohawk/riven_cursors.h | 670 -------------------------------------- engines/mohawk/riven_external.cpp | 38 ++- engines/mohawk/riven_scripts.cpp | 1 + 6 files changed, 120 insertions(+), 837 deletions(-) delete mode 100644 engines/mohawk/riven_cursors.h diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp index fe4b434f9c..fdf19b624a 100644 --- a/engines/mohawk/cursors.cpp +++ b/engines/mohawk/cursors.cpp @@ -28,11 +28,11 @@ #include "mohawk/resource.h" #include "mohawk/graphics.h" #include "mohawk/myst.h" -#include "mohawk/riven_cursors.h" #include "common/macresman.h" #include "common/system.h" #include "common/winexe_ne.h" +#include "common/winexe_pe.h" #include "graphics/cursorman.h" #include "graphics/wincursor.h" @@ -84,15 +84,16 @@ void CursorManager::setCursor(uint16 id) { setDefaultCursor(); } -void CursorManager::decodeMacXorCursor(Common::SeekableReadStream *stream, byte *cursor) { +void CursorManager::setMacXorCursor(Common::SeekableReadStream *stream) { assert(stream); - assert(cursor); + + byte cursorBitmap[16 * 16]; // Get black and white data for (int i = 0; i < 32; i++) { byte imageByte = stream->readByte(); for (int b = 0; b < 8; b++) - cursor[i * 8 + b] = (imageByte & (0x80 >> b)) ? 1 : 2; + cursorBitmap[i * 8 + b] = (imageByte & (0x80 >> b)) ? 1 : 2; } // Apply mask data @@ -100,28 +101,18 @@ void CursorManager::decodeMacXorCursor(Common::SeekableReadStream *stream, byte byte imageByte = stream->readByte(); for (int b = 0; b < 8; b++) if ((imageByte & (0x80 >> b)) == 0) - cursor[i * 8 + b] = 0; + cursorBitmap[i * 8 + b] = 0; } -} -void CursorManager::setStandardCursor(Common::SeekableReadStream *stream) { - // The Broderbund devs decided to rip off the Mac format, it seems. - // However, they reversed the x/y hotspot. That makes it totally different!!!! - assert(stream); - - byte cursorBitmap[16 * 16]; - decodeMacXorCursor(stream, cursorBitmap); uint16 hotspotY = stream->readUint16BE(); uint16 hotspotX = stream->readUint16BE(); CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, 0); CursorMan.replaceCursorPalette(s_bwPalette, 1, 2); - - delete stream; } void DefaultCursorManager::setCursor(uint16 id) { - setStandardCursor(_vm->getResource(_tag, id)); + setMacXorCursor(_vm->getResource(_tag, id)); } MystCursorManager::MystCursorManager(MohawkEngine_Myst *vm) : _vm(vm) { @@ -168,119 +159,6 @@ void MystCursorManager::setDefaultCursor() { setCursor(kDefaultMystCursor); } -void RivenCursorManager::setCursor(uint16 id) { - // All of Riven's cursors are hardcoded. See riven_cursors.h for these definitions. - - switch (id) { - case 1002: - // Zip Mode - CursorMan.replaceCursor(s_zipModeCursor, 16, 16, 8, 8, 0); - CursorMan.replaceCursorPalette(s_zipModeCursorPalette, 1, ARRAYSIZE(s_zipModeCursorPalette) / 3); - break; - case 2003: - // Hand Over Object - CursorMan.replaceCursor(s_objectHandCursor, 16, 16, 8, 8, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 2004: - // Grabbing/Using Object - CursorMan.replaceCursor(s_grabbingHandCursor, 13, 13, 6, 6, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3000: - // Standard Hand - CursorMan.replaceCursor(s_standardHandCursor, 15, 16, 6, 0, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3001: - // Pointing Left - CursorMan.replaceCursor(s_pointingLeftCursor, 15, 13, 0, 3, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3002: - // Pointing Right - CursorMan.replaceCursor(s_pointingRightCursor, 15, 13, 14, 3, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3003: - // Pointing Down (Palm Up) - CursorMan.replaceCursor(s_pointingDownCursorPalmUp, 13, 16, 3, 15, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3004: - // Pointing Up (Palm Up) - CursorMan.replaceCursor(s_pointingUpCursorPalmUp, 13, 16, 3, 0, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3005: - // Pointing Left (Curved) - CursorMan.replaceCursor(s_pointingLeftCursorBent, 15, 13, 0, 5, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3006: - // Pointing Right (Curved) - CursorMan.replaceCursor(s_pointingRightCursorBent, 15, 13, 14, 5, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 3007: - // Pointing Down (Palm Down) - CursorMan.replaceCursor(s_pointingDownCursorPalmDown, 15, 16, 7, 15, 0); - CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 3); - break; - case 4001: - // Red Marble - CursorMan.replaceCursor(s_redMarbleCursor, 12, 12, 5, 5, 0); - CursorMan.replaceCursorPalette(s_redMarbleCursorPalette, 1, ARRAYSIZE(s_redMarbleCursorPalette) / 3); - break; - case 4002: - // Orange Marble - CursorMan.replaceCursor(s_orangeMarbleCursor, 12, 12, 5, 5, 0); - CursorMan.replaceCursorPalette(s_orangeMarbleCursorPalette, 1, ARRAYSIZE(s_orangeMarbleCursorPalette) / 3); - break; - case 4003: - // Yellow Marble - CursorMan.replaceCursor(s_yellowMarbleCursor, 12, 12, 5, 5, 0); - CursorMan.replaceCursorPalette(s_yellowMarbleCursorPalette, 1, ARRAYSIZE(s_yellowMarbleCursorPalette) / 3); - break; - case 4004: - // Green Marble - CursorMan.replaceCursor(s_greenMarbleCursor, 12, 12, 5, 5, 0); - CursorMan.replaceCursorPalette(s_greenMarbleCursorPalette, 1, ARRAYSIZE(s_greenMarbleCursorPalette) / 3); - break; - case 4005: - // Blue Marble - CursorMan.replaceCursor(s_blueMarbleCursor, 12, 12, 5, 5, 0); - CursorMan.replaceCursorPalette(s_blueMarbleCursorPalette, 1, ARRAYSIZE(s_blueMarbleCursorPalette) / 3); - break; - case 4006: - // Violet Marble - CursorMan.replaceCursor(s_violetMarbleCursor, 12, 12, 5, 5, 0); - CursorMan.replaceCursorPalette(s_violetMarbleCursorPalette, 1, ARRAYSIZE(s_violetMarbleCursorPalette) / 3); - break; - case 5000: - // Pellet - CursorMan.replaceCursor(s_pelletCursor, 8, 8, 4, 4, 0); - CursorMan.replaceCursorPalette(s_pelletCursorPalette, 1, ARRAYSIZE(s_pelletCursorPalette) / 3); - break; - case 9000: - // Hide Cursor - CursorMan.showMouse(false); - break; - default: - error("Cursor %d does not exist!", id); - } - - if (id != 9000) // Show Cursor - CursorMan.showMouse(true); - - // Should help in cases where we need to hide the cursor immediately. - g_system->updateScreen(); -} - -void RivenCursorManager::setDefaultCursor() { - setCursor(kRivenMainCursor); -} - NECursorManager::NECursorManager(const Common::String &appName) { _exe = new Common::NEResources(); @@ -333,22 +211,33 @@ void MacCursorManager::setCursor(uint16 id) { return; } - Common::SeekableReadStream *stream = _resFork->getResource(MKID_BE('CURS'), id); + // Try a color cursor first + Common::SeekableReadStream *stream = _resFork->getResource(MKID_BE('crsr'), id); - if (!stream) { - setDefaultCursor(); + if (stream) { + byte *cursor, *palette; + int width, height, hotspotX, hotspotY, keyColor, palSize; + + _resFork->convertCrsrCursor(stream, &cursor, width, height, hotspotX, hotspotY, keyColor, true, &palette, palSize); + + CursorMan.replaceCursor(cursor, width, height, hotspotX, hotspotY, keyColor); + CursorMan.replaceCursorPalette(palette, 0, palSize); + + delete[] cursor; + delete[] palette; + delete stream; return; } - byte cursorBitmap[16 * 16]; - decodeMacXorCursor(stream, cursorBitmap); - uint16 hotspotX = stream->readUint16BE(); - uint16 hotspotY = stream->readUint16BE(); + // Fall back to b&w cursors + stream = _resFork->getResource(MKID_BE('CURS'), id); - CursorMan.replaceCursor(cursorBitmap, 16, 16, hotspotX, hotspotY, 0); - CursorMan.replaceCursorPalette(s_bwPalette, 1, 2); - - delete stream; + if (stream) { + setMacXorCursor(stream); + delete stream; + } else { + setDefaultCursor(); + } } LivingBooksCursorManager_v2::LivingBooksCursorManager_v2() { @@ -367,10 +256,40 @@ LivingBooksCursorManager_v2::~LivingBooksCursorManager_v2() { void LivingBooksCursorManager_v2::setCursor(uint16 id) { if (_sysArchive && _sysArchive->hasResource(ID_TCUR, id)) { - setStandardCursor(_sysArchive->getResource(ID_TCUR, id)); + setMacXorCursor(_sysArchive->getResource(ID_TCUR, id)); } else { // TODO: Handle generated cursors } } +PECursorManager::PECursorManager(const Common::String &appName) { + _exe = new Common::PEResources(); + + if (!_exe->loadFromEXE(appName)) { + // Not all have cursors anyway, so this is not a problem + delete _exe; + _exe = 0; + } +} + +PECursorManager::~PECursorManager() { + delete _exe; +} + +void PECursorManager::setCursor(uint16 id) { + if (_exe) { + Graphics::WinCursorGroup *cursorGroup = Graphics::WinCursorGroup::createCursorGroup(*_exe, id); + + if (cursorGroup) { + Graphics::WinCursor *cursor = cursorGroup->cursors[0].cursor; + CursorMan.replaceCursor(cursor->getSurface(), cursor->getWidth(), cursor->getHeight(), cursor->getHotspotX(), cursor->getHotspotY(), cursor->getKeyColor()); + CursorMan.replaceCursorPalette(cursor->getPalette(), 0, 256); + return; + } + } + + // Last resort (not all have cursors) + setDefaultCursor(); +} + } // End of namespace Mohawk diff --git a/engines/mohawk/cursors.h b/engines/mohawk/cursors.h index a542ddb7c3..ae48b558b7 100644 --- a/engines/mohawk/cursors.h +++ b/engines/mohawk/cursors.h @@ -31,6 +31,7 @@ namespace Common { class MacResManager; class NEResources; + class PEResources; class SeekableReadStream; class String; } @@ -82,11 +83,8 @@ public: virtual void setDefaultCursor(); protected: - // Handles the Mac version of the xor/and map cursor - void decodeMacXorCursor(Common::SeekableReadStream *stream, byte *cursor); - - // Set a tCUR resource as the current cursor - void setStandardCursor(Common::SeekableReadStream *stream); + // Set a Mac XOR/AND map cursor to the screen + void setMacXorCursor(Common::SeekableReadStream *stream); }; // The default Mohawk cursor manager @@ -120,19 +118,7 @@ private: MystBitmap *_bmpDecoder; }; - -// The cursor manager for Riven -// Uses hardcoded cursors -class RivenCursorManager : public CursorManager { -public: - RivenCursorManager() {} - ~RivenCursorManager() {} - - void setCursor(uint16 id); - void setDefaultCursor(); -}; - -// The cursor manager for NE exe's +// The cursor manager for NE EXE's class NECursorManager : public CursorManager { public: NECursorManager(const Common::String &appName); @@ -169,6 +155,18 @@ private: MohawkArchive *_sysArchive; }; +// The cursor manager for PE EXE's +class PECursorManager : public CursorManager { +public: + PECursorManager(const Common::String &appName); + ~PECursorManager(); + + void setCursor(uint16 id); + +private: + Common::PEResources *_exe; +}; + } // End of namespace Mohawk #endif diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index abc7f5304e..19adf3fe2f 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -120,7 +120,15 @@ Common::Error MohawkEngine_Riven::run() { _externalScriptHandler = new RivenExternal(this); _optionsDialog = new RivenOptionsDialog(this); _scriptMan = new RivenScriptManager(this); - _cursor = new RivenCursorManager(); + + // Create the cursor manager + // TODO: Error handling when none can be found + if (Common::File::exists("rivendmo.exe")) + _cursor = new PECursorManager("rivendmo.exe"); + else if (Common::File::exists("riven.exe")) + _cursor = new PECursorManager("riven.exe"); + else // last resort: try the Mac executable + _cursor = new MacCursorManager("Riven"); _rnd = new Common::RandomSource(); g_eventRec.registerRandomSource(*_rnd, "riven"); @@ -135,6 +143,7 @@ Common::Error MohawkEngine_Riven::run() { // Start at main cursor _cursor->setCursor(kRivenMainCursor); + _system->updateScreen(); // Let's begin, shall we? if (getFeatures() & GF_DEMO) { @@ -488,10 +497,12 @@ void MohawkEngine_Riven::checkHotspotChange() { if (_curHotspot != hotspotIndex) { _curHotspot = hotspotIndex; _cursor->setCursor(_hotspots[_curHotspot].mouse_cursor); + _system->updateScreen(); } } else { _curHotspot = -1; _cursor->setCursor(kRivenMainCursor); + _system->updateScreen(); } } diff --git a/engines/mohawk/riven_cursors.h b/engines/mohawk/riven_cursors.h deleted file mode 100644 index dadfdf0549..0000000000 --- a/engines/mohawk/riven_cursors.h +++ /dev/null @@ -1,670 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -namespace Mohawk { - -////////////////////////////////////////////// -// Cursors and Cursor Palettes -////////////////////////////////////////////// - -//////////////////////////////////////// -// Zip Mode Cursor (16x16): -// Shown when a zip mode spot is active -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Yellow (0xDCFF00) -//////////////////////////////////////// -static const byte s_zipModeCursor[] = { - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 1, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 1, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 2, 1, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 1, 2, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 2, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -}; - - -//////////////////////////////////////// -// Zip Mode Cursor Palette: -// Palette For The Zip Mode Cursor -//////////////////////////////////////// -static const byte s_zipModeCursorPalette[] = { - 0x00, 0x00, 0x00, // Black - 0xDC, 0xFF, 0x00 // Yellow -}; - - -//////////////////////////////////////// -// Hand Over Object Cursor (16x16): -// Shown when over a hotspot that's interactive -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_objectHandCursor[] = { - 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 0, 1, 2, 3, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 1, 1, 2, 3, 1, 2, 3, 1, 0, 0, 0, - 0, 0, 1, 2, 3, 1, 1, 4, 3, 1, 2, 3, 1, 0, 1, 0, - 0, 0, 0, 1, 2, 3, 1, 2, 3, 1, 4, 3, 1, 1, 2, 1, - 0, 0, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, - 0, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 3, 1, 2, 3, 1, - 1, 2, 2, 1, 1, 2, 2, 2, 4, 2, 4, 2, 2, 4, 2, 1, - 1, 3, 4, 2, 1, 2, 4, 2, 2, 2, 2, 2, 4, 4, 1, 0, - 0, 1, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 0, - 0, 0, 1, 3, 2, 2, 2, 2, 2, 2, 2, 4, 4, 3, 1, 0, - 0, 0, 1, 3, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 0, 0, - 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 1, 0, 0, - 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 4, 3, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 4, 3, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 4, 3, 1, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Grabbing Hand Cursor (13x13): -// Shown when interacting with an object -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_grabbingHandCursor[] = { - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 2, 3, 1, 1, 1, 0, 0, 0, - 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 0, - 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 1, 2, 1, - 0, 1, 1, 2, 2, 2, 4, 2, 4, 2, 2, 4, 1, - 1, 2, 1, 2, 4, 2, 2, 2, 2, 2, 4, 4, 1, - 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, - 1, 3, 2, 2, 2, 2, 2, 2, 2, 4, 4, 3, 1, - 1, 3, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 0, - 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 1, 0, - 0, 0, 1, 2, 2, 2, 2, 2, 4, 3, 1, 0, 0, - 0, 0, 0, 1, 2, 2, 2, 2, 4, 3, 1, 0, 0, - 0, 0, 0, 1, 2, 2, 2, 2, 4, 3, 1, 0, 0 -}; - - -//////////////////////////////////////// -// Standard Hand Cursor (15x16): -// Standard Cursor -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_standardHandCursor[] = { - 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 4, 4, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 0, 1, 2, 4, 1, 1, 1, 1, 1, 0, 0, - 1, 4, 2, 1, 0, 1, 2, 4, 1, 4, 1, 4, 1, 1, 1, - 0, 1, 3, 2, 1, 1, 2, 4, 1, 4, 1, 4, 1, 4, 1, - 0, 0, 1, 4, 2, 1, 2, 2, 4, 2, 4, 2, 1, 4, 1, - 0, 0, 1, 4, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 1, - 0, 0, 0, 1, 4, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, - 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, - 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 1, 0, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 4, 3, 1, 0, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 4, 3, 1, 0 -}; - - -//////////////////////////////////////// -// Pointing Left Cursor (15x13): -// Cursor When Over A Hotspot That Allows You To Move Left -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingLeftCursor[] = { - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 3, 2, 2, 2, 1, 1, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 3, 1, 1, - 1, 4, 2, 2, 2, 2, 1, 2, 3, 2, 2, 2, 4, 4, 4, - 1, 4, 4, 4, 4, 4, 1, 2, 1, 3, 4, 2, 2, 2, 2, - 0, 1, 1, 1, 1, 1, 1, 2, 1, 3, 3, 4, 2, 2, 2, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 4, 4, 2, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 4, 1, 3, 4, 2, 2, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 4, 2, 2, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 4, 2, 4, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, - 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Pointing Right Cursor (15x13): -// Cursor When Over A Hotspot That Allows You To Move Right -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingRightCursor[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 2, 2, 2, 3, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 3, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, - 4, 4, 4, 2, 2, 2, 3, 2, 1, 4, 4, 4, 4, 4, 1, - 2, 2, 2, 2, 4, 3, 1, 2, 1, 2, 2, 2, 2, 4, 1, - 2, 2, 2, 4, 3, 3, 1, 2, 1, 1, 1, 1, 1, 1, 0, - 2, 4, 4, 3, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 2, 2, 4, 3, 1, 4, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 2, 2, 4, 3, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 4, 2, 4, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Pointing Down Cursor (Palm Up)(13x16): -// Cursor When Over A Hotspot That Allows You To Move Down -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingDownCursorPalmUp[] = { - 0, 0, 1, 4, 2, 2, 2, 2, 2, 4, 1, 0, 0, - 0, 0, 1, 4, 2, 2, 4, 2, 2, 2, 4, 1, 0, - 0, 1, 3, 4, 2, 2, 4, 4, 4, 4, 4, 1, 0, - 0, 1, 4, 2, 2, 4, 3, 3, 3, 1, 1, 1, 1, - 1, 2, 2, 2, 4, 3, 3, 1, 1, 2, 1, 2, 1, - 1, 2, 2, 2, 3, 3, 3, 4, 1, 2, 1, 2, 1, - 1, 2, 2, 3, 1, 1, 1, 2, 1, 2, 1, 2, 1, - 1, 3, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, - 0, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, - 0, 0, 1, 2, 4, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 4, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Pointing Up Cursor (Palm Up)(13x16): -// Cursor When Over A Hotspot That Allows You To Move Up -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingUpCursorPalmUp[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 4, 4, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 1, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 2, 4, 1, 0, 0, - 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 0, - 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 3, 1, - 1, 2, 1, 2, 1, 2, 1, 1, 1, 3, 2, 2, 1, - 1, 2, 1, 2, 1, 4, 3, 3, 3, 2, 2, 2, 1, - 1, 2, 1, 2, 1, 1, 3, 3, 4, 2, 2, 2, 1, - 1, 1, 1, 1, 3, 3, 3, 4, 2, 2, 4, 1, 0, - 0, 1, 4, 4, 4, 4, 4, 2, 2, 4, 3, 1, 0, - 0, 1, 4, 2, 2, 2, 4, 2, 2, 4, 1, 0, 0, - 0, 0, 1, 4, 2, 2, 2, 2, 2, 4, 1, 0, 0 -}; - - -//////////////////////////////////////// -// Pointing Left Cursor (Bent)(15x13): -// Cursor When Over A Hotspot That Allows You To Turn Left 180 Degrees -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingLeftCursorBent[] = { - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 3, 2, 2, 2, 1, 1, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 3, 1, 1, - 1, 3, 2, 4, 4, 2, 1, 2, 3, 3, 2, 2, 4, 4, 4, - 1, 2, 4, 3, 3, 4, 1, 2, 1, 3, 4, 2, 2, 2, 2, - 1, 4, 4, 1, 1, 1, 1, 2, 1, 1, 3, 4, 2, 2, 2, - 1, 1, 1, 0, 0, 1, 1, 1, 1, 3, 3, 3, 4, 4, 2, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 4, 1, 3, 4, 3, 2, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 4, 2, 2, - 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 4, 2, 4, - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, - 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Pointing Right Cursor (Bent)(15x13): -// Cursor When Over A Hotspot That Allows You To Turn Right 180 Degrees -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingRightCursorBent[] = { - 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 2, 2, 2, 3, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 3, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, - 4, 4, 4, 2, 2, 3, 3, 2, 1, 2, 4, 4, 2, 3, 1, - 2, 2, 2, 2, 4, 3, 1, 2, 1, 4, 3, 3, 4, 2, 1, - 2, 2, 2, 4, 3, 1, 1, 2, 1, 1, 1, 1, 4, 4, 1, - 2, 4, 4, 3, 3, 3, 1, 1, 1, 1, 0, 0, 1, 1, 1, - 2, 3, 4, 3, 1, 4, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 2, 2, 4, 3, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 4, 2, 4, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Pointing Down Cursor (Palm Down)(15x16): -// Similar to Standard Cursor -// -// 0 = Transparent -// 1 = Black (0x000000) -// 2 = Light Peach (0xEDCD96) -// 3 = Brown (0x8A672F) -// 4 = Dark Peach (0xE89A62) -//////////////////////////////////////// -static const byte s_pointingDownCursorPalmDown[] = { - 0, 1, 3, 4, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 0, 1, 3, 4, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, - 0, 1, 3, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, - 1, 3, 4, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, - 1, 3, 4, 2, 2, 2, 2, 2, 2, 2, 4, 1, 0, 0, 0, - 1, 3, 2, 3, 2, 2, 2, 2, 2, 1, 2, 4, 1, 0, 0, - 1, 4, 1, 2, 2, 3, 2, 3, 2, 1, 2, 4, 1, 0, 0, - 1, 4, 1, 4, 1, 4, 1, 4, 4, 1, 1, 2, 3, 1, 0, - 0, 1, 1, 4, 1, 4, 1, 4, 2, 1, 0, 1, 2, 4, 1, - 0, 0, 1, 1, 1, 1, 1, 4, 2, 1, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 4, 4, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 4, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 4, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 3, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 4, 4, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 -}; - -//////////////////////////////////////// -// Hand Cursor Palette: -// Palette For All Hand Cursors -//////////////////////////////////////// -static const byte s_handCursorPalette[] = { - 0x00, 0x00, 0x00, // Black - 0xED, 0xCD, 0x96, // Light Peach - 0x8A, 0x67, 0x2F, // Brown - 0xE8, 0x9A, 0x62 // Dark Peach -}; - - -//////////////////////////////////////// -// Pellet Cursor (8x8): -// Cursor When Using The Pellet In The Frog Trap -// -// 0 = Transparent -// 1 = Light Olive Green (0x5D6730) -// 2 = Maroon (0x5E3333) -// 3 = Light Gray (0x555555) -// 4 = Medium Gray (0x444444) -// 5 = Dark Gray (0x333333) -// 6 = Dark Green (0x2D3300) -// 7 = Darkest Gray (0x222222) -//////////////////////////////////////// -static const byte s_pelletCursor[] = { - 0, 0, 1, 1, 2, 3, 0, 0, - 0, 2, 1, 4, 1, 2, 5, 0, - 4, 1, 4, 1, 2, 1, 5, 4, - 4, 2, 1, 2, 1, 1, 2, 6, - 6, 4, 2, 1, 4, 4, 1, 5, - 5, 6, 5, 2, 1, 2, 4, 4, - 0, 7, 5, 5, 4, 2, 5, 0, - 0, 0, 5, 6, 6, 5, 0, 0 -}; - -//////////////////////////////////////// -// Pellet Cursor Palette: -// Palette For The Pellet Cursor -//////////////////////////////////////// -static const byte s_pelletCursorPalette[] = { - 0x5D, 0x67, 0x30, - 0x5E, 0x33, 0x33, - 0x55, 0x55, 0x55, - 0x44, 0x44, 0x44, - 0x33, 0x33, 0x33, - 0x2D, 0x33, 0x00, - 0x22, 0x22, 0x22 -}; - -//////////////////////////////////////// -// Red Marble Cursor (12x12): -// Cursor When Holding The Red Marble -//////////////////////////////////////// -static const byte s_redMarbleCursor[] = { - 0, 0, 0, 0, 1, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 3, 4, 2, 5, 2, 2, 2, 2, 0, 0, - 0, 6, 1, 1, 2, 2, 5, 2, 2, 2, 2, 0, - 0, 6, 3, 4, 5, 2, 2, 7, 8, 5, 2, 0, - 9, 6, 10,11,2, 2, 2, 12,13,2, 2, 2, - 14,10,6, 4, 1, 2, 8, 2, 2, 5, 2, 2, - 15,16,6, 3, 1, 2, 2, 2, 2, 2, 2, 5, - 17,9,18, 3, 4, 4, 4, 5, 2, 5, 1, 2, - 0, 16,9, 6, 6, 19,1, 20,1, 4, 11,0, - 0, 17,15,18,9, 10,6, 10,3, 21,4, 0, - 0, 0, 18,15,9, 18,6, 22,10,23,0, 0, - 0, 0, 0, 0, 15,15,16,9, 0, 0, 0, 0 -}; - - -//////////////////////////////////////// -// Red Marble Cursor Palette: -// Palette For The Red Marble Cursor -//////////////////////////////////////// -static const byte s_redMarbleCursorPalette[] = { - 0xb8, 0x33, 0x32, - 0xe5, 0x33, 0x31, - 0x98, 0x06, 0x00, - 0xb8, 0x00, 0x34, - 0xe6, 0x00, 0x34, - 0x7a, 0x04, 0x00, - 0xe8, 0x9a, 0x62, - 0xea, 0x31, 0x67, - 0x6a, 0x03, 0x00, - 0x8c, 0x00, 0x35, - 0xb6, 0x36, 0x00, - 0xed, 0xcd, 0x96, - 0xe9, 0x66, 0x65, - 0x5b, 0x35, 0x00, - 0x5b, 0x02, 0x00, - 0x5f, 0x00, 0x35, - 0x4c, 0x01, 0x00, - 0x5e, 0x33, 0x33, - 0x89, 0x05, 0x00, - 0xb6, 0x08, 0x00, - 0xa7, 0x07, 0x00, - 0x88, 0x36, 0x00, - 0x8b, 0x33, 0x33 -}; - -//////////////////////////////////////// -// Orange Marble Cursor (12x12): -// Cursor When Holding The Orange Marble -//////////////////////////////////////// -static const byte s_orangeMarbleCursor[] = { - 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, - 0, 0, 4, 5, 2, 2, 3, 3, 3, 3, 0, 0, - 0, 6, 7, 4, 2, 1, 2, 2, 3, 3, 3, 0, - 0, 6, 6, 7, 1, 2, 3, 8, 9, 2, 10,0, - 11,12,7, 4, 2, 3, 3, 13,9, 2, 2, 1, - 14,15,6, 4, 2, 16,3, 3, 2, 1, 1, 1, - 14,14,12,17,4, 2, 2, 1, 2, 1, 2, 1, - 14,18,12,6, 4, 4, 4, 19,2, 19,20,4, - 0, 14,14,15,6, 15,6, 4, 4, 4, 4, 0, - 0, 14,11,14,14,12,12,12,17,6, 17,0, - 0, 0, 14,14,17,14,17,6, 6, 17,0, 0, - 0, 0, 0, 0, 14,11,14,11,0, 0, 0, 0 -}; - -//////////////////////////////////////// -// Orange Marble Cursor Palette: -// Palette For The Orange Marble Cursor -//////////////////////////////////////// -static const byte s_orangeMarbleCursorPalette[] = { - 0xe1, 0x9e, 0x00, - 0xe3, 0x9b, 0x28, - 0xe2, 0xcf, 0x20, - 0xb5, 0x6a, 0x00, - 0xb6, 0x9b, 0x29, - 0x87, 0x69, 0x00, - 0xb7, 0x67, 0x2f, - 0xe9, 0xff, 0x93, - 0xe1, 0xff, 0x5a, - 0xe0, 0xd0, 0x00, - 0x5e, 0x33, 0x33, - 0x88, 0x36, 0x00, - 0xf3, 0xff, 0xc9, - 0x5b, 0x35, 0x00, - 0x8b, 0x33, 0x33, - 0xe6, 0xce, 0x5f, - 0x8a, 0x67, 0x2f, - 0x5d, 0x67, 0x30, - 0xe2, 0x6a, 0x00, - 0xb3, 0x9d, 0x00 -}; - -//////////////////////////////////////// -// Yellow Marble Cursor (12x12): -// Cursor When Holding The Yellow Marble -//////////////////////////////////////// -static const byte s_yellowMarbleCursor[] = { - 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, - 0, 0, 3, 4, 1, 1, 1, 5, 6, 6, 0, 0, - 0, 3, 3, 7, 1, 1, 1, 1, 2, 1, 6, 0, - 0, 3, 3, 3, 3, 1, 1, 8, 6, 1, 6, 0, - 9, 9, 3, 3, 1, 1, 2, 10,8, 1, 1, 2, - 11,9, 3, 3, 1, 1, 1, 1, 1, 1, 5, 1, - 9, 9, 12,3, 3, 1, 1, 1, 1, 1, 1, 1, - 9, 9, 9, 3, 3, 3, 3, 3, 1, 1, 1, 1, - 0, 11,9, 9, 12,3, 3, 3, 3, 3, 3, 0, - 0, 9, 9, 13,9, 14,12,3, 3, 3, 3, 0, - 0, 0, 9, 9, 9, 12,14,3, 13,3, 0, 0, - 0, 0, 0, 0, 11,9, 11,9, 0, 0, 0, 0 -}; - -//////////////////////////////////////// -// Yellow Marble Cursor Palette: -// Palette For The Yellow Marble Cursor -//////////////////////////////////////// -static const byte s_yellowMarbleCursorPalette[] = { - 0xb3, 0xd0, 0x00, - 0xb0, 0xff, 0x00, - 0x86, 0x9c, 0x00, - 0x87, 0xd0, 0x00, - 0xe0, 0xd0, 0x00, - 0xdc, 0xff, 0x00, - 0xb3, 0x9d, 0x00, - 0xdc, 0xff, 0x11, - 0x5a, 0x68, 0x00, - 0xe1, 0xff, 0x5a, - 0x5d, 0x67, 0x30, - 0x87, 0x69, 0x00, - 0x88, 0x9b, 0x2a, - 0x5a, 0x9c, 0x00 -}; - -//////////////////////////////////////// -// Green Marble Cursor (12x12): -// Cursor When Holding The Green Marble -//////////////////////////////////////// -static const byte s_greenMarbleCursor[] = { - 0, 0, 0, 0, 1, 2, 3, 3, 0, 0, 0, 0, - 0, 0, 4, 5, 2, 1, 2, 3, 6, 6, 0, 0, - 0, 7, 5, 8, 8, 1, 1, 2, 3, 6, 6, 0, - 0, 7, 7, 4, 8, 1, 2, 9, 6, 2, 6, 0, - 10,7, 7, 4, 1, 2, 3, 11,12,2, 2, 3, - 13,13,7, 4, 1, 2, 3, 2, 1, 2, 2, 3, - 14,13,7, 7, 5, 1, 1, 8, 2, 1, 1, 2, - 15,16,13,7, 4, 4, 5, 5, 1, 8, 1, 1, - 0, 15,13,7, 7, 7, 4, 4, 4, 5, 8, 0, - 0, 14,16,15,13, 7, 7, 7, 4,17,5, 0, - 0, 0, 10,16,13,13,13,17,18,17,0, 0, - 0, 0, 0, 0, 15,10,19,10,0, 0, 0, 0 -}; - -//////////////////////////////////////// -// Green Marble Cursor Palette: -// Palette For The Green Marble Cursor -//////////////////////////////////////// -static const byte s_greenMarbleCursorPalette[] = { - 0x0e, 0xd0, 0x00, - 0x0f, 0xe1, 0x00, - 0x10, 0xf2, 0x00, - 0x0b, 0x9c, 0x00, - 0x0c, 0xad, 0x00, - 0x11, 0xff, 0x00, - 0x09, 0x8a, 0x00, - 0x0d, 0xbe, 0x00, - 0x30, 0xff, 0x5a, - 0x0d, 0x67, 0x30, - 0x6b, 0xff, 0x92, - 0x00, 0xff, 0x28, - 0x08, 0x79, 0x00, - 0x05, 0x57, 0x00, - 0x30, 0x67, 0x30, - 0x06, 0x68, 0x00, - 0x00, 0x9b, 0x2c, - 0x2e, 0x9c, 0x00, - 0x2e, 0x68, 0x00 -}; - -//////////////////////////////////////// -// Blue Marble Cursor (12x12): -// Cursor When Holding The Blue Marble -//////////////////////////////////////// -static const byte s_blueMarbleCursor[] = { - 0, 0, 0, 0, 1, 2, 3, 3, 0, 0, 0, 0, - 0, 0, 4, 5, 2, 2, 6, 3, 7, 3, 0, 0, - 0, 8, 9, 5, 10,11,2, 6, 3, 3, 7, 0, - 0, 12,13,9, 10,11,6, 14,7, 6, 3, 0, - 15,8, 4, 13,2, 6, 3, 16,17,6, 6, 3, - 18,15,19,13,10,7, 3, 6, 2, 2, 6, 7, - 20,8, 18,4, 21,11,2, 10,6, 2, 2, 2, - 15,15,18,8, 13,9, 21,5, 11,10,2, 1, - 0, 8, 15,19,15,13,13,21,21,5, 9, 0, - 0, 22,20,15, 8,19,15,19,4, 9, 4, 0, - 0, 0, 15,20,15,15,19,15,9, 15,0, 0, - 0, 0, 0, 0, 20,15, 8,15,0, 0, 0, 0 -}; - -//////////////////////////////////////// -// Blue Marble Cursor Palette: -// Palette For The Blue Marble Cursor -//////////////////////////////////////// -static const byte s_blueMarbleCursorPalette[] = { - 0x6b, 0x00, 0xd2, - 0x66, 0x00, 0xe3, - 0x72, 0x00, 0xff, - 0x53, 0x2d, 0x9d, - 0x4e, 0x00, 0xaf, - 0x6d, 0x00, 0xf5, - 0x7d, 0x00, 0xff, - 0x44, 0x00, 0x69, - 0x56, 0x00, 0x9d, - 0x56, 0x00, 0xc0, - 0x5e, 0x00, 0xd2, - 0x2b, 0x31, 0x68, - 0x3f, 0x00, 0x8c, - 0x91, 0x22, 0xff, - 0x41, 0x31, 0x68, - 0xd7, 0x95, 0xff, - 0x77, 0x22, 0xff, - 0x2f, 0x00, 0x69, - 0x37, 0x00, 0x7a, - 0x27, 0x00, 0x58, - 0x46, 0x00, 0x9d, - 0x33, 0x33, 0x33 -}; - -//////////////////////////////////////// -// Violet Marble Cursor (12x12): -// Cursor When Holding The Violet Marble -//////////////////////////////////////// -static const byte s_violetMarbleCursor[] = { - 0, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, - 0, 0, 3, 3, 1, 1, 1, 4, 2, 4, 0, 0, - 0, 3, 3, 3, 1, 5, 1, 1, 4, 2, 4, 0, - 0, 3, 3, 3, 3, 1, 1, 6, 4, 1, 2, 0, - 3, 7, 8, 3, 1, 1, 4, 9, 4, 1, 1, 4, - 8, 7, 8, 3, 10,4, 1, 1, 1, 1, 4, 1, - 8, 3, 8, 7, 3, 1, 1, 5, 1, 1, 1, 1, - 7, 7, 11,3, 3, 3, 3, 3, 1, 3, 1, 1, - 0, 8, 7, 7, 8, 8, 7, 3, 3, 3, 1, 0, - 0, 7, 8, 3, 11,7, 3, 11,3, 10,3, 0, - 0, 0, 8, 7, 3, 3, 7, 3, 3, 3, 0, 0, - 0, 0, 0, 0, 8, 7, 11,3, 0, 0, 0, 0 -}; - -//////////////////////////////////////// -// Violet Marble Cursor Palette: -// Palette For The Violet Marble Cursor -//////////////////////////////////////// -static const byte s_violetMarbleCursorPalette[] = { - 0xaa, 0x00, 0xd1, - 0xd8, 0x00, 0xff, - 0x76, 0x00, 0x9d, - 0xb5, 0x00, 0xff, - 0x87, 0x00, 0xd2, - 0xd7, 0x22, 0xff, - 0x68, 0x00, 0x69, - 0x44, 0x00, 0x69, - 0xd7, 0x5e, 0xff, - 0x9c, 0x00, 0x9d, - 0x56, 0x00, 0x9d -}; - -} // End of namespace Mohawk diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 7da5515411..e6ea25c9a6 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -316,6 +316,7 @@ void RivenExternal::checkSliderCursorChange(uint16 startHotspot) { _vm->_cursor->setCursor(kRivenOpenHandCursor); else _vm->_cursor->setCursor(kRivenMainCursor); + _vm->_system->updateScreen(); break; } } @@ -341,6 +342,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u // We've clicked down, so show the closed hand cursor _vm->_cursor->setCursor(kRivenClosedHandCursor); + _vm->_system->updateScreen(); bool done = false; while (!done) { @@ -862,6 +864,7 @@ void RivenExternal::xbcheckcatch(uint16 argc, uint16 *argv) { void RivenExternal::xbait(uint16 argc, uint16 *argv) { // Set the cursor to the pellet _vm->_cursor->setCursor(kRivenPelletCursor); + _vm->_system->updateScreen(); // Loop until the player lets go (or quits) Common::Event event; @@ -881,6 +884,7 @@ void RivenExternal::xbait(uint16 argc, uint16 *argv) { // Set back the cursor _vm->_cursor->setCursor(kRivenMainCursor); + _vm->_system->updateScreen(); // Set the bait if we put it on the plate if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) { @@ -899,8 +903,8 @@ void RivenExternal::xbfreeytram(uint16 argc, uint16 *argv) { void RivenExternal::xbaitplate(uint16 argc, uint16 *argv) { // Remove the pellet from the plate and put it in your hand _vm->_gfx->drawPLST(3); - _vm->_gfx->updateScreen(); _vm->_cursor->setCursor(kRivenPelletCursor); + _vm->_gfx->updateScreen(); // Loop until the player lets go (or quits) Common::Event event; @@ -920,6 +924,7 @@ void RivenExternal::xbaitplate(uint16 argc, uint16 *argv) { // Set back the cursor _vm->_cursor->setCursor(kRivenMainCursor); + _vm->_system->updateScreen(); // Set the bait if we put it on the plate, remove otherwise if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) { @@ -988,23 +993,27 @@ void RivenExternal::xvalvecontrol(uint16 argc, uint16 *argv) { if (*valve == 0 && changeY <= -10) { *valve = 1; _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_video->playMovieBlockingRiven(2); _vm->refreshCard(); } else if (*valve == 1) { if (changeX >= 0 && changeY >= 10) { *valve = 0; _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_video->playMovieBlockingRiven(3); _vm->refreshCard(); } else if (changeX <= -10 && changeY <= 10) { *valve = 2; _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_video->playMovieBlockingRiven(1); _vm->refreshCard(); } } else if (*valve == 2 && changeX >= 10) { *valve = 1; _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_video->playMovieBlockingRiven(4); _vm->refreshCard(); } @@ -1219,6 +1228,7 @@ void RivenExternal::xgisland1490_domecheck(uint16 argc, uint16 *argv) { void RivenExternal::xgplateau3160_dopools(uint16 argc, uint16 *argv) { // Play the deactivation of a pool if one is active and a different one is activated _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_video->playMovieBlockingRiven(*_vm->getVar("glkbtns") * 2); } @@ -1522,11 +1532,13 @@ void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) { // Run the gallows's carriage _vm->_cursor->setCursor(kRivenHideCursor); // Hide the cursor - _vm->_video->playMovieBlockingRiven(1); // Play handle movie + _vm->_system->updateScreen(); // Update + _vm->_video->playMovieBlockingRiven(1); // Play handle movie _vm->_gfx->scheduleTransition(15); // Set pan down transition _vm->changeToCard(_vm->matchRMAPToCard(0x18e77)); // Change to card facing up _vm->_cursor->setCursor(kRivenHideCursor); // Hide the cursor (again) - _vm->_video->playMovieBlockingRiven(4); // Play carriage beginning to drop + _vm->_system->updateScreen(); // Update + _vm->_video->playMovieBlockingRiven(4); // Play carriage beginning to drop _vm->_gfx->scheduleTransition(14); // Set pan up transition _vm->changeToCard(_vm->matchRMAPToCard(0x183a9)); // Change to card looking straight again _vm->_video->playMovieBlockingRiven(2); @@ -1560,19 +1572,22 @@ void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) { } _vm->_cursor->setCursor(kRivenHideCursor); // Hide the cursor + _vm->_system->updateScreen(); // Update if (gotClick) { _vm->_gfx->scheduleTransition(16); // Schedule dissolve transition _vm->changeToCard(_vm->matchRMAPToCard(0x18d4d)); // Move forward _vm->_cursor->setCursor(kRivenHideCursor); // Hide the cursor + _vm->_system->updateScreen(); // Update _vm->_system->delayMillis(500); // Delay a half second before changing again _vm->_gfx->scheduleTransition(12); // Schedule pan left transition _vm->changeToCard(_vm->matchRMAPToCard(0x18ab5)); // Turn right _vm->_cursor->setCursor(kRivenHideCursor); // Hide the cursor - _vm->_video->playMovieBlockingRiven(1); // Play carriage ride movie + _vm->_system->updateScreen(); // Update + _vm->_video->playMovieBlockingRiven(1); // Play carriage ride movie _vm->changeToCard(_vm->matchRMAPToCard(0x17167)); // We have arrived at the top } else - _vm->_video->playMovieBlockingRiven(3); // Too slow! + _vm->_video->playMovieBlockingRiven(3); // Too slow! } void RivenExternal::xjdome25_resetsliders(uint16 argc, uint16 *argv) { @@ -1603,6 +1618,7 @@ int RivenExternal::jspitElevatorLoop() { _vm->_cursor->setCursor(kRivenClosedHandCursor); _vm->_system->updateScreen(); + for (;;) { while (_vm->_system->getEventManager()->pollEvent(event)) { switch (event.type) { @@ -1766,6 +1782,7 @@ void RivenExternal::xschool280_playwhark(uint16 argc, uint16 *argv) { // Hide the cursor _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); // Play the spin movie _vm->_video->playMovieBlockingRiven(spinMLST); @@ -1831,6 +1848,7 @@ void RivenExternal::xorollcredittime(uint16 argc, uint16 *argv) { void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { // Hide the cursor _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); // Let's hook onto our video VideoHandle video = _vm->_video->findVideoHandleRiven(argv[0]); @@ -1873,6 +1891,8 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { _vm->_cursor->setCursor(kRivenOpenHandCursor); else _vm->_cursor->setCursor(kRivenMainCursor); + + _vm->_system->updateScreen(); // OK, Gehn has opened the trap book and has asked us to go in. Let's watch // and see what the player will do... @@ -1887,7 +1907,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { _vm->_cursor->setCursor(kRivenOpenHandCursor); else _vm->_cursor->setCursor(kRivenMainCursor); - updateScreen = false; // Don't update twice, changing the cursor already updates the screen + updateScreen = true; break; case Common::EVENT_LBUTTONUP: if (hotspotRect.contains(_vm->_system->getEventManager()->getMousePos())) { @@ -1899,7 +1919,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { _vm->_gfx->updateScreen(); // Update the screen _vm->_sound->playSound(0); // Play the link sound _vm->_video->activateMLST(7, _vm->getCurCard()); // Activate Gehn Link Video - _vm->_video->playMovieBlockingRiven(1); // Play Gehn Link Video + _vm->_video->playMovieBlockingRiven(1); // Play Gehn Link Video *_vm->getVar("agehn") = 4; // Set Gehn to the trapped state *_vm->getVar("atrapbook") = 1; // We've got the trap book again _vm->_sound->playSound(0); // Play the link sound again @@ -1924,6 +1944,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { // Hide the cursor again _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); // If there was no click and this is the third time Gehn asks us to // use the trap book, he will shoot the player. Dead on arrival. @@ -2012,6 +2033,7 @@ uint16 RivenExternal::getComboDigit(uint32 correctCombo, uint32 digit) { void RivenExternal::xgwatch(uint16 argc, uint16 *argv) { // Hide the cursor _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); uint32 *prisonCombo = _vm->getVar("pcorrectorder"); uint32 soundTime = _vm->_system->getMillis() - 500; // Start the first sound instantly @@ -2173,6 +2195,7 @@ void RivenExternal::xtexterior300_telescopedown(uint16 argc, uint16 *argv) { // ...the telescope can't move down anymore. // Play the sound of not being able to move _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_sound->playSoundBlocking(13); } } else { @@ -2206,6 +2229,7 @@ void RivenExternal::xtexterior300_telescopeup(uint16 argc, uint16 *argv) { if (*telescopePos == 5) { // Play the sound of not being able to move _vm->_cursor->setCursor(kRivenHideCursor); + _vm->_system->updateScreen(); _vm->_sound->playSoundBlocking(13); return; } diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index 5d459354e9..98452e1e09 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -424,6 +424,7 @@ void RivenScript::stopSound(uint16 op, uint16 argc, uint16 *argv) { void RivenScript::changeCursor(uint16 op, uint16 argc, uint16 *argv) { debug(2, "Change to cursor %d", argv[0]); _vm->_cursor->setCursor(argv[0]); + _vm->_system->updateScreen(); } // Command 14: pause script execution (delay in ms, u1) -- cgit v1.2.3