From f6033afa0252384e618adebd0f1aef5867a312f8 Mon Sep 17 00:00:00 2001 From: richiesams Date: Sun, 11 Aug 2013 13:42:00 -0500 Subject: ZVISION: Change CursorManager to go through CursorMan instead going directly to OSystem This had to be done so the cursor didn't disappear after the user went to GMM or debug console --- engines/zvision/cursor_manager.cpp | 29 +++++++++++++++++++---------- engines/zvision/cursor_manager.h | 9 ++++++++- 2 files changed, 27 insertions(+), 11 deletions(-) (limited to 'engines/zvision') diff --git a/engines/zvision/cursor_manager.cpp b/engines/zvision/cursor_manager.cpp index 0115ec9d3c..6f60ddf018 100644 --- a/engines/zvision/cursor_manager.cpp +++ b/engines/zvision/cursor_manager.cpp @@ -24,6 +24,7 @@ #include "common/system.h" #include "graphics/pixelformat.h" +#include "graphics/cursorman.h" #include "zvision/zvision.h" #include "zvision/cursor_manager.h" @@ -44,8 +45,7 @@ const char *CursorManager::_zNemCursorFileNames[] = { "00act", "arrow", "back", CursorManager::CursorManager(ZVision *engine, const Graphics::PixelFormat *pixelFormat) : _engine(engine), _pixelFormat(pixelFormat), - _cursorIsPushed(false), - _currentCursor("idle") { + _cursorIsPushed(false) { // WARNING: The index 11 is hardcoded. If you change the order of _cursorNames/_zgiCursorFileNames/_zNemCursorFileNames, you HAVE to change the index accordingly if (_engine->getGameId() == ZorkNemesis) { Common::String name(Common::String::format("%sa.zcr", _zNemCursorFileNames[11])); @@ -53,15 +53,20 @@ CursorManager::CursorManager(ZVision *engine, const Graphics::PixelFormat *pixel } else if (_engine->getGameId() == ZorkGrandInquisitor) { _idleCursor = ZorkCursor(_zgiCursorFileNames[11]); } + revertToIdle(); } void CursorManager::initialize() { - _engine->_system->setMouseCursor(_idleCursor.getSurface(), _idleCursor.getWidth(), _idleCursor.getHeight(), _idleCursor.getHotspotX(), _idleCursor.getHotspotY(), _idleCursor.getKeyColor(), false, _pixelFormat); - _engine->_system->showMouse(true); + CursorMan.showMouse(true); } -void CursorManager::changeCursor(Common::String &cursorName, bool pushed) { - _cursorIsPushed = pushed; +void CursorManager::changeCursor(const Common::String &cursorName) { + changeCursor(cursorName, _cursorIsPushed); +} + +void CursorManager::changeCursor(const Common::String &cursorName, bool pushed) { + if (_cursorIsPushed != pushed) + _cursorIsPushed = pushed; if (cursorName == "idle" && !pushed) { revertToIdle(); @@ -71,7 +76,9 @@ void CursorManager::changeCursor(Common::String &cursorName, bool pushed) { // WARNING: The range of this loop is hardcoded to the length of _cursorNames for (int i = 0; i < 18; i++) { if (_engine->getGameId() == ZorkNemesis) { - if (_cursorNames[i] == cursorName) { + if (cursorName.equals(_cursorNames[i])) { + _currentCursor = cursorName; + // ZNem uses a/b at the end of the file to signify not pushed/pushed respectively Common::String pushedFlag = pushed ? "b" : "a"; Common::String name = Common::String::format("%s%s.zcr", _zNemCursorFileNames[i], pushedFlag.c_str()); @@ -80,7 +87,9 @@ void CursorManager::changeCursor(Common::String &cursorName, bool pushed) { return; } } else if (_engine->getGameId() == ZorkGrandInquisitor) { - if (_cursorNames[i] == cursorName) { + if (cursorName.equals(_cursorNames[i])) { + _currentCursor = cursorName; + if (!pushed) { changeCursor(ZorkCursor(_zgiCursorFileNames[i])); } else { @@ -100,7 +109,7 @@ void CursorManager::changeCursor(Common::String &cursorName, bool pushed) { } void CursorManager::changeCursor(const ZorkCursor &cursor) { - _engine->_system->setMouseCursor(cursor.getSurface(), cursor.getWidth(), cursor.getHeight(), cursor.getHotspotX(), cursor.getHotspotY(), cursor.getKeyColor(), false, _pixelFormat); + CursorMan.replaceCursor(cursor.getSurface(), cursor.getWidth(), cursor.getHeight(), cursor.getHotspotX(), cursor.getHotspotY(), cursor.getKeyColor(), false, _pixelFormat); } void CursorManager::cursorDown(bool pushed) { @@ -113,7 +122,7 @@ void CursorManager::cursorDown(bool pushed) { void CursorManager::revertToIdle() { _currentCursor = "idle"; - _engine->_system->setMouseCursor(_idleCursor.getSurface(), _idleCursor.getWidth(), _idleCursor.getHeight(), _idleCursor.getHotspotX(), _idleCursor.getHotspotY(), _idleCursor.getKeyColor(), false, _pixelFormat); + CursorMan.replaceCursor(_idleCursor.getSurface(), _idleCursor.getWidth(), _idleCursor.getHeight(), _idleCursor.getHotspotX(), _idleCursor.getHotspotY(), _idleCursor.getKeyColor(), false, _pixelFormat); } } // End of namespace ZVision diff --git a/engines/zvision/cursor_manager.h b/engines/zvision/cursor_manager.h index 914538591d..9f624c82cc 100644 --- a/engines/zvision/cursor_manager.h +++ b/engines/zvision/cursor_manager.h @@ -36,6 +36,12 @@ namespace ZVision { class ZVision; +/** + * Class to manage cursor changes. The actual changes have to be done + * through CursorMan. Otherwise the cursor will disappear after GMM + * or debug console. + * TODO: Figure out a way to get rid of the extraneous data copying due to having to use CursorMan + */ class CursorManager { public: CursorManager(ZVision *engine, const Graphics::PixelFormat *pixelFormat); @@ -54,7 +60,8 @@ private: public: void initialize(); - void changeCursor(Common::String &cursorName, bool pushed); + void changeCursor(const Common::String &cursorName); + void changeCursor(const Common::String &cursorName, bool pushed); void cursorDown(bool pushed); void revertToIdle(); -- cgit v1.2.3