[Scummvm-cvs-logs] SF.net SVN: scummvm:[54469] scummvm/trunk/engines/mohawk

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Thu Nov 25 05:49:11 CET 2010


Revision: 54469
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54469&view=rev
Author:   mthreepwood
Date:     2010-11-25 04:49:11 +0000 (Thu, 25 Nov 2010)

Log Message:
-----------
MOHAWK: Refactor cursor handling

Cursor handling has now been moved to a new CursorManager class (which is subclassed for Myst/Riven) from the GraphicsManager classes. This will be needed for Living Books which will have a class for Windows and Mac cursors (coming soon!).

Modified Paths:
--------------
    scummvm/trunk/engines/mohawk/graphics.cpp
    scummvm/trunk/engines/mohawk/graphics.h
    scummvm/trunk/engines/mohawk/module.mk
    scummvm/trunk/engines/mohawk/mohawk.cpp
    scummvm/trunk/engines/mohawk/mohawk.h
    scummvm/trunk/engines/mohawk/myst.cpp
    scummvm/trunk/engines/mohawk/myst_scripts.cpp
    scummvm/trunk/engines/mohawk/riven.cpp
    scummvm/trunk/engines/mohawk/riven_external.cpp
    scummvm/trunk/engines/mohawk/riven_scripts.cpp

Added Paths:
-----------
    scummvm/trunk/engines/mohawk/cursors.cpp
    scummvm/trunk/engines/mohawk/cursors.h

Added: scummvm/trunk/engines/mohawk/cursors.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/cursors.cpp	                        (rev 0)
+++ scummvm/trunk/engines/mohawk/cursors.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -0,0 +1,195 @@
+/* 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$
+ *
+ */
+
+#include "mohawk/bitmap.h"
+#include "mohawk/cursors.h"
+#include "mohawk/resource.h"
+#include "mohawk/graphics.h"
+#include "mohawk/myst.h"
+#include "mohawk/riven_cursors.h"
+
+#include "common/system.h"
+#include "graphics/cursorman.h"
+
+namespace Mohawk {
+
+void CursorManager::showCursor() {
+	CursorMan.showMouse(true);
+}
+
+void CursorManager::hideCursor() {
+	CursorMan.showMouse(false);
+}
+
+MystCursorManager::MystCursorManager(MohawkEngine_Myst *vm) : _vm(vm) {
+	_bmpDecoder = new MystBitmap();
+}
+
+MystCursorManager::~MystCursorManager() {
+	delete _bmpDecoder;
+}
+
+void MystCursorManager::showCursor() {
+	CursorMan.showMouse(true);
+	_vm->_needsUpdate = true;
+}
+
+void MystCursorManager::hideCursor() {
+	CursorMan.showMouse(false);
+	_vm->_needsUpdate = true;
+}
+
+void MystCursorManager::setCursor(uint16 id) {
+	// Both Myst and Myst ME use the "MystBitmap" format for cursor images.
+	MohawkSurface *mhkSurface = _bmpDecoder->decodeImage(_vm->getResource(ID_WDIB, id));
+	Graphics::Surface *surface = mhkSurface->getSurface();
+	Common::SeekableReadStream *clrcStream = _vm->getResource(ID_CLRC, id);
+	uint16 hotspotX = clrcStream->readUint16LE();
+	uint16 hotspotY = clrcStream->readUint16LE();
+	delete clrcStream;
+
+	// Myst ME stores some cursors as 24bpp images instead of 8bpp
+	if (surface->bytesPerPixel == 1) {
+		CursorMan.replaceCursor((byte *)surface->pixels, surface->w, surface->h, hotspotX, hotspotY, 0);
+		CursorMan.replaceCursorPalette(mhkSurface->getPalette(), 0, 256);
+	} else {
+		Graphics::PixelFormat pixelFormat = g_system->getScreenFormat();
+		CursorMan.replaceCursor((byte *)surface->pixels, surface->w, surface->h, hotspotX, hotspotY, pixelFormat.RGBToColor(255, 255, 255), 1, &pixelFormat);
+	}
+
+	_vm->_needsUpdate = true;
+	delete mhkSurface;
+}
+
+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) / 4);
+		break;
+	case 2003:
+		// Hand Over Object
+		CursorMan.replaceCursor(s_objectHandCursor, 16, 16, 8, 8, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 2004:
+		// Grabbing/Using Object
+		CursorMan.replaceCursor(s_grabbingHandCursor, 13, 13, 6, 6, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3000:
+		// Standard Hand
+		CursorMan.replaceCursor(s_standardHandCursor, 15, 16, 6, 0, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3001:
+		// Pointing Left
+		CursorMan.replaceCursor(s_pointingLeftCursor, 15, 13, 0, 3, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3002:
+		// Pointing Right
+		CursorMan.replaceCursor(s_pointingRightCursor, 15, 13, 14, 3, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3003:
+		// Pointing Down (Palm Up)
+		CursorMan.replaceCursor(s_pointingDownCursorPalmUp, 13, 16, 3, 15, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3004:
+		// Pointing Up (Palm Up)
+		CursorMan.replaceCursor(s_pointingUpCursorPalmUp, 13, 16, 3, 0, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3005:
+		// Pointing Left (Curved)
+		CursorMan.replaceCursor(s_pointingLeftCursorBent, 15, 13, 0, 5, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3006:
+		// Pointing Right (Curved)
+		CursorMan.replaceCursor(s_pointingRightCursorBent, 15, 13, 14, 5, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 3007:
+		// Pointing Down (Palm Down)
+		CursorMan.replaceCursor(s_pointingDownCursorPalmDown, 15, 16, 7, 15, 0);
+		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
+		break;
+	case 4001:
+		// Red Marble
+		CursorMan.replaceCursor(s_redMarbleCursor, 12, 12, 5, 5, 0);
+		CursorMan.replaceCursorPalette(s_redMarbleCursorPalette, 1, ARRAYSIZE(s_redMarbleCursorPalette) / 4);
+		break;
+	case 4002:
+		// Orange Marble
+		CursorMan.replaceCursor(s_orangeMarbleCursor, 12, 12, 5, 5, 0);
+		CursorMan.replaceCursorPalette(s_orangeMarbleCursorPalette, 1, ARRAYSIZE(s_orangeMarbleCursorPalette) / 4);
+		break;
+	case 4003:
+		// Yellow Marble
+		CursorMan.replaceCursor(s_yellowMarbleCursor, 12, 12, 5, 5, 0);
+		CursorMan.replaceCursorPalette(s_yellowMarbleCursorPalette, 1, ARRAYSIZE(s_yellowMarbleCursorPalette) / 4);
+		break;
+	case 4004:
+		// Green Marble
+		CursorMan.replaceCursor(s_greenMarbleCursor, 12, 12, 5, 5, 0);
+		CursorMan.replaceCursorPalette(s_greenMarbleCursorPalette, 1, ARRAYSIZE(s_greenMarbleCursorPalette) / 4);
+		break;
+	case 4005:
+		// Blue Marble
+		CursorMan.replaceCursor(s_blueMarbleCursor, 12, 12, 5, 5, 0);
+		CursorMan.replaceCursorPalette(s_blueMarbleCursorPalette, 1, ARRAYSIZE(s_blueMarbleCursorPalette) / 4);
+		break;
+	case 4006:
+		// Violet Marble
+		CursorMan.replaceCursor(s_violetMarbleCursor, 12, 12, 5, 5, 0);
+		CursorMan.replaceCursorPalette(s_violetMarbleCursorPalette, 1, ARRAYSIZE(s_violetMarbleCursorPalette) / 4);
+		break;
+	case 5000:
+		// Pellet
+		CursorMan.replaceCursor(s_pelletCursor, 8, 8, 4, 4, 0);
+		CursorMan.replaceCursorPalette(s_pelletCursorPalette, 1, ARRAYSIZE(s_pelletCursorPalette) / 4);
+		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();
+}
+
+} // End of namespace Mohawk


Property changes on: scummvm/trunk/engines/mohawk/cursors.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Added: scummvm/trunk/engines/mohawk/cursors.h
===================================================================
--- scummvm/trunk/engines/mohawk/cursors.h	                        (rev 0)
+++ scummvm/trunk/engines/mohawk/cursors.h	2010-11-25 04:49:11 UTC (rev 54469)
@@ -0,0 +1,97 @@
+/* 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$
+ *
+ */
+
+#ifndef MOHAWK_CURSORS_H
+#define MOHAWK_CURSORS_H
+
+#include "common/scummsys.h"
+
+namespace Mohawk {
+
+// 803-805 are animated, one large bmp which is in chunks - these are NEVER USED
+// Other cursors (200, 300, 400, 500, 600, 700) are not the same in each stack
+enum {
+	kDefaultMystCursor = 100,				// The default hand
+	kWhitePageCursor = 800,					// Holding a white page
+	kRedPageCursor = 801,					// Holding a red page
+	kBluePageCursor = 802,					// Holding a blue page
+	// kDroppingWhitePageAnimCursor = 803,
+	// kDroppingRedPageAnimCursor = 804,
+	// kDroppingBluePageAnimCursor = 805,
+	kNewMatchCursor = 900,					// Match that has not yet been lit
+	kLitMatchCursor = 901,					// Match that's burning
+	kDeadMatchCursor = 902,					// Match that's been extinguished
+	kKeyCursor = 903, 						// Key in Lighthouse in Stoneship
+	kRotateClockwiseCursor = 904, 			// Rotate gear clockwise (boiler on Myst)
+	kRotateCounterClockwiseCursor = 905,	// Rotate gear counter clockwise (boiler on Myst)
+	kMystZipModeCursor = 999				// Zip Mode cursor
+};
+
+enum {
+	kRivenOpenHandCursor = 2003,
+	kRivenClosedHandCursor = 2004,
+	kRivenMainCursor = 3000,
+	kRivenPelletCursor = 5000,
+	kRivenHideCursor = 9000
+};
+
+class MohawkEngine_Myst;
+class MystBitmap;
+
+class CursorManager {
+public:
+	CursorManager() {}
+	virtual ~CursorManager() {}
+
+	virtual void showCursor();
+	virtual void hideCursor();
+	virtual void setCursor(uint16 id) = 0;
+};
+
+class MystCursorManager : public CursorManager {
+public:
+	MystCursorManager(MohawkEngine_Myst *vm);
+	~MystCursorManager();
+
+	void showCursor();
+	void hideCursor();
+	void setCursor(uint16 id);
+
+private:
+	MohawkEngine_Myst *_vm;
+	MystBitmap *_bmpDecoder;
+};
+
+class RivenCursorManager : public CursorManager {
+public:
+	RivenCursorManager() {}
+	~RivenCursorManager() {}
+
+	void setCursor(uint16 id);
+};
+
+} // End of namespace Mohawk
+
+#endif


Property changes on: scummvm/trunk/engines/mohawk/cursors.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Modified: scummvm/trunk/engines/mohawk/graphics.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/graphics.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/graphics.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -27,11 +27,9 @@
 #include "mohawk/graphics.h"
 #include "mohawk/myst.h"
 #include "mohawk/riven.h"
-#include "mohawk/riven_cursors.h"
 
 #include "engines/util.h"
 
-#include "graphics/cursorman.h"
 #include "graphics/primitives.h"
 #include "gui/message.h"
 
@@ -296,36 +294,6 @@
 	}
 }
 
-void MystGraphics::showCursor(void) {
-	CursorMan.showMouse(true);
-	_vm->_needsUpdate = true;
-}
-
-void MystGraphics::hideCursor(void) {
-	CursorMan.showMouse(false);
-	_vm->_needsUpdate = true;
-}
-
-void MystGraphics::changeCursor(uint16 cursor) {
-	// Both Myst and Myst ME use the "MystBitmap" format for cursor images.
-	MohawkSurface *mhkSurface = _bmpDecoder->decodeImage(_vm->getResource(ID_WDIB, cursor));
-	Graphics::Surface *surface = mhkSurface->getSurface();
-	Common::SeekableReadStream *clrcStream = _vm->getResource(ID_CLRC, cursor);
-	uint16 hotspotX = clrcStream->readUint16LE();
-	uint16 hotspotY = clrcStream->readUint16LE();
-	delete clrcStream;
-
-	// Myst ME stores some cursors as 24bpp images instead of 8bpp
-	if (surface->bytesPerPixel == 1) {
-		CursorMan.replaceCursor((byte *)surface->pixels, surface->w, surface->h, hotspotX, hotspotY, 0);
-		CursorMan.replaceCursorPalette(mhkSurface->getPalette(), 0, 256);
-	} else
-		CursorMan.replaceCursor((byte *)surface->pixels, surface->w, surface->h, hotspotX, hotspotY, _pixelFormat.RGBToColor(255, 255, 255), 1, &_pixelFormat);
-
-	_vm->_needsUpdate = true;
-	delete mhkSurface;
-}
-
 void MystGraphics::drawRect(Common::Rect rect, bool active) {
 	// Useful with debugging. Shows where hotspots are on the screen and whether or not they're active.
 	if (rect.left < 0 || rect.top < 0 || rect.right > 544 || rect.bottom > 333 || !rect.isValidRect() || rect.width() == 0 || rect.height() == 0)
@@ -571,115 +539,6 @@
 	_scheduledTransition = -1; // Clear scheduled transition
 }
 
-void RivenGraphics::changeCursor(uint16 num) {
-	// All of Riven's cursors are hardcoded. See riven_cursors.h for these definitions.
-
-	switch (num) {
-	case 1002:
-		// Zip Mode
-		CursorMan.replaceCursor(s_zipModeCursor, 16, 16, 8, 8, 0);
-		CursorMan.replaceCursorPalette(s_zipModeCursorPalette, 1, ARRAYSIZE(s_zipModeCursorPalette) / 4);
-		break;
-	case 2003:
-		// Hand Over Object
-		CursorMan.replaceCursor(s_objectHandCursor, 16, 16, 8, 8, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 2004:
-		// Grabbing/Using Object
-		CursorMan.replaceCursor(s_grabbingHandCursor, 13, 13, 6, 6, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3000:
-		// Standard Hand
-		CursorMan.replaceCursor(s_standardHandCursor, 15, 16, 6, 0, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3001:
-		// Pointing Left
-		CursorMan.replaceCursor(s_pointingLeftCursor, 15, 13, 0, 3, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3002:
-		// Pointing Right
-		CursorMan.replaceCursor(s_pointingRightCursor, 15, 13, 14, 3, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3003:
-		// Pointing Down (Palm Up)
-		CursorMan.replaceCursor(s_pointingDownCursorPalmUp, 13, 16, 3, 15, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3004:
-		// Pointing Up (Palm Up)
-		CursorMan.replaceCursor(s_pointingUpCursorPalmUp, 13, 16, 3, 0, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3005:
-		// Pointing Left (Curved)
-		CursorMan.replaceCursor(s_pointingLeftCursorBent, 15, 13, 0, 5, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3006:
-		// Pointing Right (Curved)
-		CursorMan.replaceCursor(s_pointingRightCursorBent, 15, 13, 14, 5, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 3007:
-		// Pointing Down (Palm Down)
-		CursorMan.replaceCursor(s_pointingDownCursorPalmDown, 15, 16, 7, 15, 0);
-		CursorMan.replaceCursorPalette(s_handCursorPalette, 1, ARRAYSIZE(s_handCursorPalette) / 4);
-		break;
-	case 4001:
-		// Red Marble
-		CursorMan.replaceCursor(s_redMarbleCursor, 12, 12, 5, 5, 0);
-		CursorMan.replaceCursorPalette(s_redMarbleCursorPalette, 1, ARRAYSIZE(s_redMarbleCursorPalette) / 4);
-		break;
-	case 4002:
-		// Orange Marble
-		CursorMan.replaceCursor(s_orangeMarbleCursor, 12, 12, 5, 5, 0);
-		CursorMan.replaceCursorPalette(s_orangeMarbleCursorPalette, 1, ARRAYSIZE(s_orangeMarbleCursorPalette) / 4);
-		break;
-	case 4003:
-		// Yellow Marble
-		CursorMan.replaceCursor(s_yellowMarbleCursor, 12, 12, 5, 5, 0);
-		CursorMan.replaceCursorPalette(s_yellowMarbleCursorPalette, 1, ARRAYSIZE(s_yellowMarbleCursorPalette) / 4);
-		break;
-	case 4004:
-		// Green Marble
-		CursorMan.replaceCursor(s_greenMarbleCursor, 12, 12, 5, 5, 0);
-		CursorMan.replaceCursorPalette(s_greenMarbleCursorPalette, 1, ARRAYSIZE(s_greenMarbleCursorPalette) / 4);
-		break;
-	case 4005:
-		// Blue Marble
-		CursorMan.replaceCursor(s_blueMarbleCursor, 12, 12, 5, 5, 0);
-		CursorMan.replaceCursorPalette(s_blueMarbleCursorPalette, 1, ARRAYSIZE(s_blueMarbleCursorPalette) / 4);
-		break;
-	case 4006:
-		// Violet Marble
-		CursorMan.replaceCursor(s_violetMarbleCursor, 12, 12, 5, 5, 0);
-		CursorMan.replaceCursorPalette(s_violetMarbleCursorPalette, 1, ARRAYSIZE(s_violetMarbleCursorPalette) / 4);
-		break;
-	case 5000:
-		// Pellet
-		CursorMan.replaceCursor(s_pelletCursor, 8, 8, 4, 4, 0);
-		CursorMan.replaceCursorPalette(s_pelletCursorPalette, 1, ARRAYSIZE(s_pelletCursorPalette) / 4);
-		break;
-	case 9000:
-		// Hide Cursor
-		CursorMan.showMouse(false);
-		break;
-	default:
-		error("Cursor %d does not exist!", num);
-	}
-
-	if (num != 9000) // Show Cursor
-		CursorMan.showMouse(true);
-
-	// Should help in cases where we need to hide the cursor immediately.
-	_vm->_system->updateScreen();
-}
-
 void RivenGraphics::showInventory() {
 	// Don't redraw the inventory
 	if (_inventoryDrawn)

Modified: scummvm/trunk/engines/mohawk/graphics.h
===================================================================
--- scummvm/trunk/engines/mohawk/graphics.h	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/graphics.h	2010-11-25 04:49:11 UTC (rev 54469)
@@ -41,33 +41,6 @@
 class MohawkBitmap;
 class MystBitmap;
 
-enum {
-	kRivenOpenHandCursor = 2003,
-	kRivenClosedHandCursor = 2004,
-	kRivenMainCursor = 3000,
-	kRivenPelletCursor = 5000,
-	kRivenHideCursor = 9000
-};
-
-// 803-805 are animated, one large bmp which is in chunks
-// Other cursors (200, 300, 400, 500, 600, 700) are not the same in each stack
-enum {
-	kDefaultMystCursor = 100,				// The default hand
-	kWhitePageCursor = 800,					// Holding a white page
-	kRedPageCursor = 801,					// Holding a red page
-	kBluePageCursor = 802,					// Holding a blue page
-	// kDroppingWhitePageAnimCursor = 803,
-	// kDroppingRedPageAnimCursor = 804,
-	// kDroppingBluePageAnimCursor = 805,
-	kNewMatchCursor = 900,					// Match that has not yet been lit
-	kLitMatchCursor = 901,					// Match that's burning
-	kDeadMatchCursor = 902,					// Match that's been extinguished
-	kKeyCursor = 903, 						// Key in Lighthouse in Stoneship
-	kRotateClockwiseCursor = 904, 			// Rotate gear clockwise (boiler on Myst)
-	kRotateCounterClockwiseCursor = 905,	// Rotate gear counter clockwise (boiler on Myst)
-	kMystZipModeCursor = 999				// Zip Mode cursor
-};
-
 class MohawkSurface {
 public:
 	MohawkSurface();
@@ -125,9 +98,6 @@
 	void loadExternalPictureFile(uint16 stack);
 	void copyImageSectionToScreen(uint16 image, Common::Rect src, Common::Rect dest);
 	void copyImageToScreen(uint16 image, Common::Rect dest);
-	void showCursor();
-	void hideCursor();
-	void changeCursor(uint16);
 	void updateScreen();
 
 	void drawRect(Common::Rect rect, bool active);
@@ -180,7 +150,6 @@
 	void copyImageToScreen(uint16, uint32, uint32, uint32, uint32);
 	void updateScreen();
 	bool _updatesEnabled;
-	void changeCursor(uint16);
 	Common::Array<uint16> _activatedPLSTs;
 	void drawPLST(uint16 x);
 	void drawRect(Common::Rect rect, bool active);

Modified: scummvm/trunk/engines/mohawk/module.mk
===================================================================
--- scummvm/trunk/engines/mohawk/module.mk	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/module.mk	2010-11-25 04:49:11 UTC (rev 54469)
@@ -3,6 +3,7 @@
 MODULE_OBJS = \
 	bitmap.o \
 	console.o \
+	cursors.o \
 	detection.o \
 	dialogs.o \
 	graphics.o \

Modified: scummvm/trunk/engines/mohawk/mohawk.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/mohawk.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/mohawk.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -47,12 +47,18 @@
 
 	_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
 	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
+
+	_sound = 0;
+	_video = 0;
+	_pauseDialog = 0;
+	_cursor = 0;
 }
 
 MohawkEngine::~MohawkEngine() {
 	delete _sound;
 	delete _video;
 	delete _pauseDialog;
+	delete _cursor;
 
 	for (uint32 i = 0; i < _mhk.size(); i++)
 		delete _mhk[i];

Modified: scummvm/trunk/engines/mohawk/mohawk.h
===================================================================
--- scummvm/trunk/engines/mohawk/mohawk.h	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/mohawk.h	2010-11-25 04:49:11 UTC (rev 54469)
@@ -76,6 +76,7 @@
 class PauseDialog;
 class MohawkArchive;
 class VideoManager;
+class CursorManager;
 
 class MohawkEngine : public ::Engine {
 protected:
@@ -99,6 +100,7 @@
 
 	Sound *_sound;
 	VideoManager *_video;
+	CursorManager *_cursor;
 
 	virtual Common::SeekableReadStream *getResource(uint32 tag, uint16 id);
 	bool hasResource(uint32 tag, uint16 id);

Modified: scummvm/trunk/engines/mohawk/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/myst.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -27,6 +27,7 @@
 #include "common/debug-channels.h"
 #include "common/translation.h"
 
+#include "mohawk/cursors.h"
 #include "mohawk/graphics.h"
 #include "mohawk/myst.h"
 #include "mohawk/myst_saveload.h"
@@ -238,6 +239,7 @@
 	_loadDialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"));
 	_loadDialog->setSaveMode(false);
 	_optionsDialog = new MystOptionsDialog(this);
+	_cursor = new MystCursorManager(this);
 
 	// Start us on the first stack.
 	if (getGameType() == GType_MAKINGOF)
@@ -273,8 +275,8 @@
 	loadHelp(10000);
 
 	// Set the cursor
-	_gfx->changeCursor(_currentCursor);
-	_gfx->showCursor();
+	_cursor->setCursor(_currentCursor);
+	_cursor->showCursor();
 
 	Common::Event event;
 	while (!shouldQuit()) {
@@ -822,7 +824,7 @@
 
 void MohawkEngine_Myst::setMainCursor(uint16 cursor) {
 	_currentCursor = _mainCursor = cursor;
-	_gfx->changeCursor(_currentCursor);
+	_cursor->setCursor(_currentCursor);
 }
 
 void MohawkEngine_Myst::checkCursorHints() {
@@ -841,7 +843,7 @@
 					_currentCursor = _cursorHints[i].variableHint.values[var_value];
 					if (_currentCursor == 0)
 						_currentCursor = _mainCursor;
-					_gfx->changeCursor(_currentCursor);
+					_cursor->setCursor(_currentCursor);
 				}
 			} else if (_currentCursor != _cursorHints[i].cursor) {
 				if (_cursorHints[i].cursor == 0)
@@ -849,14 +851,14 @@
 				else
 					_currentCursor = _cursorHints[i].cursor;
 
-				_gfx->changeCursor(_currentCursor);
+				_cursor->setCursor(_currentCursor);
 			}
 			return;
 		}
 
 	if (_currentCursor != _mainCursor) {
 		_currentCursor = _mainCursor;
-		_gfx->changeCursor(_currentCursor);
+		_cursor->setCursor(_currentCursor);
 	}
 }
 

Modified: scummvm/trunk/engines/mohawk/myst_scripts.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_scripts.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/myst_scripts.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -23,6 +23,7 @@
  *
  */
 
+#include "mohawk/cursors.h"
 #include "mohawk/myst.h"
 #include "mohawk/graphics.h"
 #include "mohawk/myst_scripts.h"
@@ -1017,7 +1018,7 @@
 		debugC(kDebugScript, "Cursor: %d", argv[0]);
 
 		// TODO: Not sure if this needs to change mainCursor or similar...
-		_vm->_gfx->changeCursor(argv[0]);
+		_vm->_cursor->setCursor(argv[0]);
 	} else
 		unknown(op, var, argc, argv);
 }
@@ -1027,7 +1028,7 @@
 
 	if (argc == 0) {
 		debugC(kDebugScript, "Opcode %d: Hide Cursor", op);
-		_vm->_gfx->hideCursor();
+		_vm->_cursor->hideCursor();
 	} else
 		unknown(op, var, argc, argv);
 }
@@ -1037,7 +1038,7 @@
 
 	if (argc == 0) {
 		debugC(kDebugScript, "Opcode %d: Show Cursor", op);
-		_vm->_gfx->showCursor();
+		_vm->_cursor->showCursor();
 	} else
 		unknown(op, var, argc, argv);
 }

Modified: scummvm/trunk/engines/mohawk/riven.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/riven.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/riven.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -29,6 +29,7 @@
 #include "common/keyboard.h"
 #include "common/translation.h"
 
+#include "mohawk/cursors.h"
 #include "mohawk/graphics.h"
 #include "mohawk/resource.h"
 #include "mohawk/riven.h"
@@ -111,6 +112,7 @@
 	_externalScriptHandler = new RivenExternal(this);
 	_optionsDialog = new RivenOptionsDialog(this);
 	_scriptMan = new RivenScriptManager(this);
+	_cursor = new RivenCursorManager();
 
 	_rnd = new Common::RandomSource();
 	g_eventRec.registerRandomSource(*_rnd, "riven");
@@ -124,7 +126,7 @@
 		error("Could not open extras.mhk");
 
 	// Start at main cursor
-	_gfx->changeCursor(kRivenMainCursor);
+	_cursor->setCursor(kRivenMainCursor);
 
 	// Let's begin, shall we?
 	if (getFeatures() & GF_DEMO) {
@@ -478,11 +480,11 @@
 	if (foundHotspot) {
 		if (_curHotspot != hotspotIndex) {
 			_curHotspot = hotspotIndex;
-			_gfx->changeCursor(_hotspots[_curHotspot].mouse_cursor);
+			_cursor->setCursor(_hotspots[_curHotspot].mouse_cursor);
 		}
 	} else {
 		_curHotspot = -1;
-		_gfx->changeCursor(kRivenMainCursor);
+		_cursor->setCursor(kRivenMainCursor);
 	}
 }
 

Modified: scummvm/trunk/engines/mohawk/riven_external.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/riven_external.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/riven_external.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -23,6 +23,7 @@
  *
  */
 
+#include "mohawk/cursors.h"
 #include "mohawk/graphics.h"
 #include "mohawk/riven.h"
 #include "mohawk/riven_external.h"
@@ -310,9 +311,9 @@
 	for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
 		if (_vm->_hotspots[i + startHotspot].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
 			if (_sliderState & (1 << (24 - i)))
-				_vm->_gfx->changeCursor(kRivenOpenHandCursor);
+				_vm->_cursor->setCursor(kRivenOpenHandCursor);
 			else
-				_vm->_gfx->changeCursor(kRivenMainCursor);
+				_vm->_cursor->setCursor(kRivenMainCursor);
 			break;
 		}
 	}
@@ -337,7 +338,7 @@
 		return;
 
 	// We've clicked down, so show the closed hand cursor
-	_vm->_gfx->changeCursor(kRivenClosedHandCursor);
+	_vm->_cursor->setCursor(kRivenClosedHandCursor);
 
 	bool done = false;
 	while (!done) {
@@ -826,7 +827,7 @@
 	else if (argv[0] == 2)
 		_vm->_sound->playSLST(1, _vm->getCurCard());
 
-	_vm->_gfx->changeCursor(kRivenHideCursor);
+	_vm->_cursor->setCursor(kRivenHideCursor);
 	_vm->_video->playMovieBlocking(11);
 }
 
@@ -858,7 +859,7 @@
 
 void RivenExternal::xbait(uint16 argc, uint16 *argv) {
 	// Set the cursor to the pellet
-	_vm->_gfx->changeCursor(kRivenPelletCursor);
+	_vm->_cursor->setCursor(kRivenPelletCursor);
 
 	// Loop until the player lets go (or quits)
 	Common::Event event;
@@ -877,7 +878,7 @@
 	}
 
 	// Set back the cursor
-	_vm->_gfx->changeCursor(kRivenMainCursor);
+	_vm->_cursor->setCursor(kRivenMainCursor);
 
 	// Set the bait if we put it on the plate
 	if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
@@ -897,7 +898,7 @@
 	// Remove the pellet from the plate and put it in your hand
 	_vm->_gfx->drawPLST(3);
 	_vm->_gfx->updateScreen();
-	_vm->_gfx->changeCursor(kRivenPelletCursor);
+	_vm->_cursor->setCursor(kRivenPelletCursor);
 
 	// Loop until the player lets go (or quits)
 	Common::Event event;
@@ -916,7 +917,7 @@
 	}
 
 	// Set back the cursor
-	_vm->_gfx->changeCursor(kRivenMainCursor);
+	_vm->_cursor->setCursor(kRivenMainCursor);
 
 	// Set the bait if we put it on the plate, remove otherwise
 	if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
@@ -967,7 +968,7 @@
 	bool done = false;
 
 	// Set the cursor to the closed position
-	_vm->_gfx->changeCursor(kRivenClosedHandCursor);
+	_vm->_cursor->setCursor(kRivenClosedHandCursor);
 	_vm->_system->updateScreen();
 
 	while (!done) {
@@ -984,24 +985,24 @@
 				// FIXME: These values for changes in x/y could be tweaked.
 				if (*valve == 0 && changeY <= -10) {
 					*valve = 1;
-					_vm->_gfx->changeCursor(kRivenHideCursor);
+					_vm->_cursor->setCursor(kRivenHideCursor);
 					_vm->_video->playMovieBlocking(2);
 					_vm->refreshCard();
 				} else if (*valve == 1) {
 					if (changeX >= 0 && changeY >= 10) {
 						*valve = 0;
-						_vm->_gfx->changeCursor(kRivenHideCursor);
+						_vm->_cursor->setCursor(kRivenHideCursor);
 						_vm->_video->playMovieBlocking(3);
 						_vm->refreshCard();
 					} else if (changeX <= -10 && changeY <= 10) {
 						*valve = 2;
-						_vm->_gfx->changeCursor(kRivenHideCursor);
+						_vm->_cursor->setCursor(kRivenHideCursor);
 						_vm->_video->playMovieBlocking(1);
 						_vm->refreshCard();
 					}
 				} else if (*valve == 2 && changeX >= 10) {
 					*valve = 1;
-					_vm->_gfx->changeCursor(kRivenHideCursor);
+					_vm->_cursor->setCursor(kRivenHideCursor);
 					_vm->_video->playMovieBlocking(4);
 					_vm->refreshCard();
 				}
@@ -1081,7 +1082,7 @@
 
 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->_gfx->changeCursor(kRivenHideCursor);
+	_vm->_cursor->setCursor(kRivenHideCursor);
 	_vm->_video->playMovieBlocking(*_vm->getVar("glkbtns") * 2);
 }
 
@@ -1289,11 +1290,11 @@
 void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) {
 	// Run the gallows's carriage
 
-	_vm->_gfx->changeCursor(kRivenHideCursor);         // Hide the cursor
+	_vm->_cursor->setCursor(kRivenHideCursor);         // Hide the cursor
 	_vm->_video->playMovieBlocking(1);                 // Play handle movie
 	_vm->_gfx->scheduleTransition(15);                 // Set pan down transition
 	_vm->changeToCard(_vm->matchRMAPToCard(0x18e77));  // Change to card facing up
-	_vm->_gfx->changeCursor(kRivenHideCursor);         // Hide the cursor (again)
+	_vm->_cursor->setCursor(kRivenHideCursor);         // Hide the cursor (again)
 	_vm->_video->playMovieBlocking(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
@@ -1327,16 +1328,16 @@
 		_vm->_system->delayMillis(10);
 	}
 
-	_vm->_gfx->changeCursor(kRivenHideCursor);             // Hide the cursor
+	_vm->_cursor->setCursor(kRivenHideCursor);             // Hide the cursor
 
 	if (gotClick) {
 		_vm->_gfx->scheduleTransition(16);                 // Schedule dissolve transition
 		_vm->changeToCard(_vm->matchRMAPToCard(0x18d4d));  // Move forward
-		_vm->_gfx->changeCursor(kRivenHideCursor);         // Hide the cursor
+		_vm->_cursor->setCursor(kRivenHideCursor);         // Hide the cursor
 		_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->_gfx->changeCursor(kRivenHideCursor);         // Hide the cursor
+		_vm->_cursor->setCursor(kRivenHideCursor);         // Hide the cursor
 		_vm->_video->playMovieBlocking(1);                 // Play carriage ride movie
 		_vm->changeToCard(_vm->matchRMAPToCard(0x17167));  // We have arrived at the top
 	} else
@@ -1369,7 +1370,7 @@
 	Common::Event event;
 	int changeLevel = 0;
 
-	_vm->_gfx->changeCursor(kRivenClosedHandCursor);
+	_vm->_cursor->setCursor(kRivenClosedHandCursor);
 	_vm->_system->updateScreen();
 	for (;;) {
 		while (_vm->_system->getEventManager()->pollEvent(event)) {
@@ -1385,7 +1386,7 @@
 				_vm->_system->updateScreen();
 				break;
 			case Common::EVENT_LBUTTONUP:
-				_vm->_gfx->changeCursor(kRivenMainCursor);
+				_vm->_cursor->setCursor(kRivenMainCursor);
 				_vm->_system->updateScreen();
 				return changeLevel;
 			default:
@@ -1527,7 +1528,7 @@
 
 void RivenExternal::xbookclick(uint16 argc, uint16 *argv) {
 	// Hide the cursor
-	_vm->_gfx->changeCursor(kRivenHideCursor);
+	_vm->_cursor->setCursor(kRivenHideCursor);
 
 	// Let's hook onto our video
 	VideoHandle video = _vm->_video->findVideoHandle(argv[0]);
@@ -1567,9 +1568,9 @@
 
 	// Update our hotspot stuff
 	if (hotspotRect.contains(_vm->_system->getEventManager()->getMousePos()))
-		_vm->_gfx->changeCursor(kRivenOpenHandCursor);
+		_vm->_cursor->setCursor(kRivenOpenHandCursor);
 	else
-		_vm->_gfx->changeCursor(kRivenMainCursor);
+		_vm->_cursor->setCursor(kRivenMainCursor);
 	
 	// OK, Gehn has opened the trap book and has asked us to go in. Let's watch
 	// and see what the player will do...
@@ -1581,9 +1582,9 @@
 			switch (event.type) {
 			case Common::EVENT_MOUSEMOVE:
 				if (hotspotRect.contains(_vm->_system->getEventManager()->getMousePos()))
-					_vm->_gfx->changeCursor(kRivenOpenHandCursor);
+					_vm->_cursor->setCursor(kRivenOpenHandCursor);
 				else
-					_vm->_gfx->changeCursor(kRivenMainCursor);
+					_vm->_cursor->setCursor(kRivenMainCursor);
 				updateScreen = false; // Don't update twice, changing the cursor already updates the screen
 				break;
 			case Common::EVENT_LBUTTONUP:
@@ -1591,7 +1592,7 @@
 					// OK, we've used the trap book! We go for ride lady!
 					_vm->_scriptMan->stopAllScripts();                  // Stop all running scripts (so we don't remain in the cage)
 					_vm->_video->stopVideos();                          // Stop all videos
-					_vm->_gfx->changeCursor(kRivenHideCursor);          // Hide the cursor
+					_vm->_cursor->setCursor(kRivenHideCursor);          // Hide the cursor
 					_vm->_gfx->drawPLST(3);                             // Black out the screen
 					_vm->_gfx->updateScreen();                          // Update the screen
 					_vm->_sound->playSound(0);                          // Play the link sound
@@ -1620,7 +1621,7 @@
 		return;
 
 	// Hide the cursor again
-	_vm->_gfx->changeCursor(kRivenHideCursor);
+	_vm->_cursor->setCursor(kRivenHideCursor);
 
 	// 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.
@@ -1717,7 +1718,7 @@
 
 void RivenExternal::xgwatch(uint16 argc, uint16 *argv) {
 	// Hide the cursor
-	_vm->_gfx->changeCursor(kRivenHideCursor);
+	_vm->_cursor->setCursor(kRivenHideCursor);
 
 	uint32 *prisonCombo = _vm->getVar("pcorrectorder");
 	uint32 soundTime = _vm->_system->getMillis() - 500; // Start the first sound instantly
@@ -1878,7 +1879,7 @@
 		} else {
 			// ...the telescope can't move down anymore.
 			// Play the sound of not being able to move
-			_vm->_gfx->changeCursor(kRivenHideCursor);
+			_vm->_cursor->setCursor(kRivenHideCursor);
 			_vm->_sound->playSoundBlocking(13);
 		}
 	} else {
@@ -1905,7 +1906,7 @@
 	// Check if we can't move up anymore
 	if (*telescopePos == 5) {
 		// Play the sound of not being able to move
-		_vm->_gfx->changeCursor(kRivenHideCursor);
+		_vm->_cursor->setCursor(kRivenHideCursor);
 		_vm->_sound->playSoundBlocking(13);
 		return;
 	}

Modified: scummvm/trunk/engines/mohawk/riven_scripts.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/riven_scripts.cpp	2010-11-25 02:59:56 UTC (rev 54468)
+++ scummvm/trunk/engines/mohawk/riven_scripts.cpp	2010-11-25 04:49:11 UTC (rev 54469)
@@ -23,6 +23,7 @@
  *
  */
 
+#include "mohawk/cursors.h"
 #include "mohawk/graphics.h"
 #include "mohawk/riven.h"
 #include "mohawk/riven_external.h"
@@ -401,7 +402,7 @@
 // Command 13: set mouse cursor (cursor_id)
 void RivenScript::changeCursor(uint16 op, uint16 argc, uint16 *argv) {
 	debug(2, "Change to cursor %d", argv[0]);
-	_vm->_gfx->changeCursor(argv[0]);
+	_vm->_cursor->setCursor(argv[0]);
 }
 
 // Command 14: pause script execution (delay in ms, u1)


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list