diff options
Diffstat (limited to 'engines/hugo/mouse.cpp')
-rw-r--r-- | engines/hugo/mouse.cpp | 144 |
1 files changed, 77 insertions, 67 deletions
diff --git a/engines/hugo/mouse.cpp b/engines/hugo/mouse.cpp index b305489568..385dce2703 100644 --- a/engines/hugo/mouse.cpp +++ b/engines/hugo/mouse.cpp @@ -43,6 +43,7 @@ #include "hugo/inventory.h" #include "hugo/route.h" #include "hugo/util.h" +#include "hugo/object.h" namespace Hugo { @@ -59,34 +60,38 @@ enum seqTextMouse { kMsExit = 1 }; -MouseHandler::MouseHandler(HugoEngine &vm) : _vm(vm) { +MouseHandler::MouseHandler(HugoEngine *vm) : _vm(vm) { } -// Shadow-blit supplied string into dib_a at cx,cy and add to display list +/** +* Shadow-blit supplied string into dib_a at cx,cy and add to display list +*/ void MouseHandler::cursorText(char *buffer, int16 cx, int16 cy, uif_t fontId, int16 color) { debugC(1, kDebugMouse, "cursorText(%s, %d, %d, %d, %d)", buffer, cx, cy, fontId, color); - _vm.screen().loadFont(fontId); + _vm->_screen->loadFont(fontId); // Find bounding rect for string - int16 sdx = _vm.screen().stringLength(buffer); - int16 sdy = _vm.screen().fontHeight() + 1; // + 1 for shadow + int16 sdx = _vm->_screen->stringLength(buffer); + int16 sdy = _vm->_screen->fontHeight() + 1; // + 1 for shadow int16 sx = (cx < XPIX / 2) ? cx + SX_OFF : cx - sdx - SX_OFF / 2; int16 sy = cy + SY_OFF; // Display the string and add rect to display list - _vm.screen().shadowStr(sx, sy, buffer, _TBRIGHTWHITE); - _vm.screen().displayList(D_ADD, sx, sy, sdx, sdy); + _vm->_screen->shadowStr(sx, sy, buffer, _TBRIGHTWHITE); + _vm->_screen->displayList(D_ADD, sx, sy, sdx, sdy); } -// Find the exit hotspot containing cx, cy. -// Return hotspot index or -1 if not found. +/** +* Find the exit hotspot containing cx, cy. +* Return hotspot index or -1 if not found. +*/ int16 MouseHandler::findExit(int16 cx, int16 cy) { debugC(2, kDebugMouse, "findExit(%d, %d)", cx, cy); int i = 0; - for (hotspot_t *hotspot = _vm._hotspots; hotspot->screenIndex >= 0; i++, hotspot++) { - if (hotspot->screenIndex == *_vm._screen_p) { + for (hotspot_t *hotspot = _vm->_hotspots; hotspot->screenIndex >= 0; i++, hotspot++) { + if (hotspot->screenIndex == *_vm->_screen_p) { if (cx >= hotspot->x1 && cx <= hotspot->x2 && cy >= hotspot->y1 && cy <= hotspot->y2) return i; } @@ -94,13 +99,15 @@ int16 MouseHandler::findExit(int16 cx, int16 cy) { return -1; } -// Process a mouse right click at coord cx, cy over object objid +/** +* Process a mouse right click at coord cx, cy over object objid +*/ void MouseHandler::processRightClick(int16 objId, int16 cx, int16 cy) { debugC(1, kDebugMouse, "Process_rclick(%d, %d, %d)", objId, cx, cy); - status_t &gameStatus = _vm.getGameStatus(); + status_t &gameStatus = _vm->getGameStatus(); - if (gameStatus.storyModeFl || _vm._hero->pathType == QUIET) // Make sure user has control + if (gameStatus.storyModeFl || _vm->_hero->pathType == QUIET) // Make sure user has control return; bool foundFl = false; // TRUE if route found to object @@ -111,79 +118,80 @@ void MouseHandler::processRightClick(int16 objId, int16 cx, int16 cy) { else if (gameStatus.inventoryObjId == objId) gameStatus.inventoryObjId = -1; // Same icon - deselect it else - _vm.useObject(objId); // Use status.objid on object + _vm->_object->useObject(objId); // Use status.objid on object } else { // Clicked over viewport object - object_t *obj = &_vm._objects[objId]; + object_t *obj = &_vm->_object->_objects[objId]; int16 x, y; switch (obj->viewx) { // Where to walk to case -1: // Walk to object position - if (_vm.findObjectSpace(obj, &x, &y)) - foundFl = _vm.route().startRoute(GO_GET, objId, x, y); + if (_vm->_object->findObjectSpace(obj, &x, &y)) + foundFl = _vm->_route->startRoute(GO_GET, objId, x, y); if (!foundFl) // Can't get there, try to use from here - _vm.useObject(objId); + _vm->_object->useObject(objId); break; case 0: // Immediate use - _vm.useObject(objId); // Pick up or use object + _vm->_object->useObject(objId); // Pick up or use object break; default: // Walk to view point if possible - if (!_vm.route().startRoute(GO_GET, objId, obj->viewx, obj->viewy)) { - if (_vm._hero->cycling == INVISIBLE)// If invisible do - _vm.useObject(objId); // immediate use + if (!_vm->_route->startRoute(GO_GET, objId, obj->viewx, obj->viewy)) { + if (_vm->_hero->cycling == INVISIBLE)// If invisible do + _vm->_object->useObject(objId); // immediate use else - Utils::Box(BOX_ANY, "%s", _vm._textMouse[kMsNoWayText]); // Can't get there + Utils::Box(BOX_ANY, "%s", _vm->_textMouse[kMsNoWayText]); // Can't get there } break; } } } -// Process a left mouse click over: -// 1. An icon - show description -// 2. An object - walk to and show description -// 3. An icon scroll arrow - scroll the iconbar -// 4. Nothing - attempt to walk there -// 5. Exit - walk to exit hotspot +/** Process a left mouse click over: +* 1. An icon - show description +* 2. An object - walk to and show description +* 3. An icon scroll arrow - scroll the iconbar +* 4. Nothing - attempt to walk there +* 5. Exit - walk to exit hotspot +*/ void MouseHandler::processLeftClick(int16 objId, int16 cx, int16 cy) { debugC(1, kDebugMouse, "Process_lclick(%d, %d, %d)", objId, cx, cy); int16 i, x, y; object_t *obj; - status_t &gameStatus = _vm.getGameStatus(); + status_t &gameStatus = _vm->getGameStatus(); - if (gameStatus.storyModeFl || _vm._hero->pathType == QUIET) // Make sure user has control + if (gameStatus.storyModeFl || _vm->_hero->pathType == QUIET) // Make sure user has control return; switch (objId) { case -1: // Empty space - attempt to walk there - _vm.route().startRoute(GO_SPACE, 0, cx, cy); + _vm->_route->startRoute(GO_SPACE, 0, cx, cy); break; case LEFT_ARROW: // A scroll arrow - scroll the iconbar case RIGHT_ARROW: // Scroll the iconbar and display results - _vm.inventory().processInventory((objId == LEFT_ARROW) ? INV_LEFT : INV_RIGHT); - _vm.screen().moveImage(_vm.screen().getIconBuffer(), 0, 0, XPIX, INV_DY, XPIX, _vm.screen().getFrontBuffer(), 0, DIBOFF_Y, XPIX); - _vm.screen().moveImage(_vm.screen().getIconBuffer(), 0, 0, XPIX, INV_DY, XPIX, _vm.screen().getBackBuffer(), 0, DIBOFF_Y, XPIX); - _vm.screen().displayList(D_ADD, 0, DIBOFF_Y, XPIX, INV_DY); + _vm->_inventory->processInventory((objId == LEFT_ARROW) ? INV_LEFT : INV_RIGHT); + _vm->_screen->moveImage(_vm->_screen->getIconBuffer(), 0, 0, XPIX, INV_DY, XPIX, _vm->_screen->getFrontBuffer(), 0, DIBOFF_Y, XPIX); + _vm->_screen->moveImage(_vm->_screen->getIconBuffer(), 0, 0, XPIX, INV_DY, XPIX, _vm->_screen->getBackBuffer(), 0, DIBOFF_Y, XPIX); + _vm->_screen->displayList(D_ADD, 0, DIBOFF_Y, XPIX, INV_DY); break; case EXIT_HOTSPOT: // Walk to exit hotspot i = findExit(cx, cy); - x = _vm._hotspots[i].viewx; - y = _vm._hotspots[i].viewy; + x = _vm->_hotspots[i].viewx; + y = _vm->_hotspots[i].viewy; if (x >= 0) { // Hotspot refers to an exit // Special case of immediate exit if (gameStatus.jumpExitFl) { // Get rid of iconbar if necessary if (gameStatus.inventoryState != I_OFF) gameStatus.inventoryState = I_UP; - _vm.scheduler().insertActionList(_vm._hotspots[i].actIndex); + _vm->_scheduler->insertActionList(_vm->_hotspots[i].actIndex); } else { // Set up route to exit spot - if (_vm._hotspots[i].direction == Common::KEYCODE_RIGHT) + if (_vm->_hotspots[i].direction == Common::KEYCODE_RIGHT) x -= HERO_MAX_WIDTH; - else if (_vm._hotspots[i].direction == Common::KEYCODE_LEFT) + else if (_vm->_hotspots[i].direction == Common::KEYCODE_LEFT) x += HERO_MAX_WIDTH; - if (!_vm.route().startRoute(GO_EXIT, i, x, y)) - Utils::Box(BOX_ANY, "%s", _vm._textMouse[kMsNoWayText]); // Can't get there + if (!_vm->_route->startRoute(GO_EXIT, i, x, y)) + Utils::Box(BOX_ANY, "%s", _vm->_textMouse[kMsNoWayText]); // Can't get there } // Get rid of any attached icon @@ -191,29 +199,29 @@ void MouseHandler::processLeftClick(int16 objId, int16 cx, int16 cy) { } break; default: // Look at an icon or object - obj = &_vm._objects[objId]; + obj = &_vm->_object->_objects[objId]; // Over iconbar - immediate description if (gameStatus.inventoryState == I_ACTIVE && cy < INV_DY + DIBOFF_Y) - _vm.lookObject(obj); + _vm->_object->lookObject(obj); else { bool foundFl = false; // TRUE if route found to object switch (obj->viewx) { // Clicked over viewport object case -1: // Walk to object position - if (_vm.findObjectSpace(obj, &x, &y)) - foundFl = _vm.route().startRoute(GO_LOOK, objId, x, y); + if (_vm->_object->findObjectSpace(obj, &x, &y)) + foundFl = _vm->_route->startRoute(GO_LOOK, objId, x, y); if (!foundFl) // Can't get there, immediate description - _vm.lookObject(obj); + _vm->_object->lookObject(obj); break; case 0: // Immediate description - _vm.lookObject(obj); + _vm->_object->lookObject(obj); break; default: // Walk to view point if possible - if (!_vm.route().startRoute(GO_LOOK, objId, obj->viewx, obj->viewy)) { - if (_vm._hero->cycling == INVISIBLE) // If invisible do - _vm.lookObject(obj); // immediate decription + if (!_vm->_route->startRoute(GO_LOOK, objId, obj->viewx, obj->viewy)) { + if (_vm->_hero->cycling == INVISIBLE) // If invisible do + _vm->_object->lookObject(obj); // immediate decription else - Utils::Box(BOX_ANY, "%s", _vm._textMouse[kMsNoWayText]); // Can't get there + Utils::Box(BOX_ANY, "%s", _vm->_textMouse[kMsNoWayText]); // Can't get there } break; } @@ -222,14 +230,16 @@ void MouseHandler::processLeftClick(int16 objId, int16 cx, int16 cy) { } } -// Process mouse activity +/** +* Process mouse activity +*/ void MouseHandler::mouseHandler() { debugC(2, kDebugMouse, "mouseHandler"); - int16 cx = _vm.getMouseX(); - int16 cy = _vm.getMouseY(); + int16 cx = _vm->getMouseX(); + int16 cy = _vm->getMouseY(); - status_t &gameStatus = _vm.getGameStatus(); + status_t &gameStatus = _vm->getGameStatus(); gameStatus.cx = cx; // Save cursor coords gameStatus.cy = cy; @@ -242,8 +252,8 @@ void MouseHandler::mouseHandler() { if (gameStatus.inventoryObjId != -1) { // Find index of icon int16 iconId; // Find index of dragged icon - for (iconId = 0; iconId < _vm._maxInvent; iconId++) { - if (gameStatus.inventoryObjId == _vm._invent[iconId]) + for (iconId = 0; iconId < _vm->_maxInvent; iconId++) { + if (gameStatus.inventoryObjId == _vm->_invent[iconId]) break; } @@ -260,20 +270,20 @@ void MouseHandler::mouseHandler() { icony = MIN(icony, YPIX - INV_DY); // Copy the icon and add to display list - _vm.screen().moveImage(_vm.screen().getGUIBuffer(), ux, uy, INV_DX, INV_DY, XPIX, _vm.screen().getFrontBuffer(), iconx, icony, XPIX); - _vm.screen().displayList(D_ADD, iconx, icony, INV_DX, INV_DY); + _vm->_screen->moveImage(_vm->_screen->getGUIBuffer(), ux, uy, INV_DX, INV_DY, XPIX, _vm->_screen->getFrontBuffer(), iconx, icony, XPIX); + _vm->_screen->displayList(D_ADD, iconx, icony, INV_DX, INV_DY); } int16 objId = -1; // Current source object // Process cursor over an object or icon if (gameStatus.inventoryState == I_ACTIVE) // Check inventory icon bar first - objId = _vm.inventory().processInventory(INV_GET, cx, cy); + objId = _vm->_inventory->processInventory(INV_GET, cx, cy); if (objId == -1) // No match, check rest of view - objId = _vm.findObject(cx, cy); + objId = _vm->_object->findObject(cx, cy); if (objId >= 0) { // Got a match // Display object name next to cursor (unless CURSOR_NOCHAR) // Note test for swapped hero name - char *name = _vm._arrayNouns[_vm._objects[(objId == HERO) ? _vm._heroImage : objId].nounIndex][CURSOR_NAME]; + char *name = _vm->_arrayNouns[_vm->_object->_objects[(objId == HERO) ? _vm->_heroImage : objId].nounIndex][CURSOR_NAME]; if (name[0] != CURSOR_NOCHAR) cursorText(name, cx, cy, U_FONT8, _TBRIGHTWHITE); @@ -285,9 +295,9 @@ void MouseHandler::mouseHandler() { // Process cursor over an exit hotspot if (objId == -1) { int i = findExit(cx, cy); - if (i != -1 && _vm._hotspots[i].viewx >= 0) { + if (i != -1 && _vm->_hotspots[i].viewx >= 0) { objId = EXIT_HOTSPOT; - cursorText(_vm._textMouse[kMsExit], cx, cy, U_FONT8, _TBRIGHTWHITE); + cursorText(_vm->_textMouse[kMsExit], cx, cy, U_FONT8, _TBRIGHTWHITE); } } |