From 5c628fedd2a21d4aee5f984dd1a1a4bcfc63024e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 20 Jan 2012 17:12:14 +1100 Subject: [PATCH] MORTEVIELLE: Expand on the mouse/keyboard handling code --- engines/mortevielle/mortevielle.cpp | 74 ++++++++++++++++++++++++----- engines/mortevielle/mortevielle.h | 5 ++ engines/mortevielle/mouse.cpp | 62 +++++------------------- 3 files changed, 79 insertions(+), 62 deletions(-) diff --git a/engines/mortevielle/mortevielle.cpp b/engines/mortevielle/mortevielle.cpp index 97d36e9a34b..0e6db5447f9 100644 --- a/engines/mortevielle/mortevielle.cpp +++ b/engines/mortevielle/mortevielle.cpp @@ -40,6 +40,7 @@ MortevielleEngine::MortevielleEngine(OSystem *system, const ADGameDescription *g Engine(system), _gameDescription(gameDesc) { g_vm = this; _lastGameFrame = 0; + _mouseButtons = 0; } MortevielleEngine::~MortevielleEngine() { @@ -164,11 +165,19 @@ bool MortevielleEngine::handleEvents() { case Common::EVENT_LBUTTONUP: case Common::EVENT_RBUTTONDOWN: case Common::EVENT_RBUTTONUP: - case Common::EVENT_MBUTTONDOWN: - case Common::EVENT_MBUTTONUP: case Common::EVENT_MOUSEMOVE: + _mousePos = event.mouse; x_s = event.mouse.x; y_s = event.mouse.y; + + if (event.type == Common::EVENT_LBUTTONDOWN) + _mouseButtons |= 1; + else if (event.type == Common::EVENT_LBUTTONUP) + _mouseButtons &= ~1; + else if (event.type == Common::EVENT_RBUTTONDOWN) + _mouseButtons |= 2; + else if (event.type == Common::EVENT_RBUTTONUP) + _mouseButtons &= ~2; break; case Common::EVENT_KEYDOWN: @@ -182,20 +191,57 @@ bool MortevielleEngine::handleEvents() { } /** - * Add the specified key to the event queue + * Add the specified key to the pending keypress stack */ void MortevielleEngine::addKeypress(Common::Event &evt) { - // Check for control keypresses - if (evt.kbd.hasFlags(Common::KBD_CTRL) && (evt.kbd.keycode >= Common::KEYCODE_a) && - (evt.kbd.keycode <= Common::KEYCODE_z)) { - _keypresses.push(evt.kbd.keycode - Common::KEYCODE_a + 1); - return; + // Character to add + char ch = evt.kbd.ascii; + + // Handle alphabetic keys + if ((evt.kbd.keycode >= Common::KEYCODE_a) && (evt.kbd.keycode <= Common::KEYCODE_z)) { + if (evt.kbd.hasFlags(Common::KBD_CTRL)) + ch = evt.kbd.keycode - Common::KEYCODE_a + 1; + else + ch = evt.kbd.keycode - Common::KEYCODE_a + 'A'; + } else if ((evt.kbd.keycode >= Common::KEYCODE_F1) && (evt.kbd.keycode <= Common::KEYCODE_F12)) { + // Handle function keys + ch = 59 + evt.kbd.keycode - Common::KEYCODE_F1; + } else { + // Series of special cases + switch (evt.kbd.keycode) { + case Common::KEYCODE_KP4: + case Common::KEYCODE_LEFT: + ch = '4'; + case Common::KEYCODE_KP2: + case Common::KEYCODE_DOWN: + ch = '2'; + case Common::KEYCODE_KP6: + case Common::KEYCODE_RIGHT: + ch = '6'; + case Common::KEYCODE_KP8: + case Common::KEYCODE_UP: + ch = '8'; + case Common::KEYCODE_KP7: + ch = '7'; + case Common::KEYCODE_KP1: + ch = '1'; + case Common::KEYCODE_KP9: + ch = '9'; + case Common::KEYCODE_KP3: + ch = '3'; + case Common::KEYCODE_KP5: + ch = '5'; + case Common::KEYCODE_RETURN: + ch = '\13'; + case Common::KEYCODE_ESCAPE: + ch = '\33'; + default: + break; + } } - // Handle function keys - if ((evt.kbd.keycode >= Common::KEYCODE_F1) && (evt.kbd.keycode <= Common::KEYCODE_F12)) { - _keypresses.push(59 + evt.kbd.keycode - Common::KEYCODE_F1); - } + if (ch != 0) + _keypresses.push(ch); } static byte CURSOR_ARROW_DATA[16 * 16] = { @@ -225,6 +271,10 @@ void MortevielleEngine::initMouse() { CursorMan.showMouse(true); } +void MortevielleEngine::setMousePos(const Common::Point &pt) { + _mousePos = pt; +} + /*-------------------------------------------------------------------------*/ Common::Error MortevielleEngine::run() { diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h index 2ea48c63b8e..3010ae8664b 100644 --- a/engines/mortevielle/mortevielle.h +++ b/engines/mortevielle/mortevielle.h @@ -51,6 +51,8 @@ private: const ADGameDescription *_gameDescription; Common::Stack _keypresses; uint32 _lastGameFrame; + int _mouseButtons; + Common::Point _mousePos; Common::ErrorCode initialise(); Common::ErrorCode loadMortDat(); @@ -70,6 +72,9 @@ public: bool keyPressed(); int getChar(); + Common::Point getMousePos() const { return _mousePos; } + void setMousePos(const Common::Point &pt); + int getMouseButtons() const { return _mouseButtons; } }; extern MortevielleEngine *g_vm; diff --git a/engines/mortevielle/mouse.cpp b/engines/mortevielle/mouse.cpp index 2fc6e1033b3..2ea8434a1cd 100644 --- a/engines/mortevielle/mouse.cpp +++ b/engines/mortevielle/mouse.cpp @@ -28,6 +28,7 @@ #include "common/endian.h" #include "common/rect.h" #include "mortevielle/mouse.h" +#include "mortevielle/mortevielle.h" #include "mortevielle/var_mor.h" namespace Mortevielle { @@ -271,67 +272,28 @@ void pos_mouse(int x, int y) { if (y > 199) y = 199; else if (y < 0) y = 0; if ((x == x_s) && (y == y_s)) return; - if (int_m) { - { - reg.ax = 4; - reg.cx = x; - reg.dx = y; - } - intr(0x33, reg); - } - hide_mouse(); - x_s = x; - y_s = y; - switch (gd) { - case ams : { - p_o_s = ((uint)y_s >> 1) * 80 + ((uint)x_s >> 3) + (y_s & 1) * 0x2000; - } - break; - /*cga : begin - P_O_S:=(Y_S shr 1)*80+X_S shr 2+(Y_S and 1)*$2000; - end;*/ - case ega : { - p_o_s = y_s * 80 + ((uint)x_s >> 3); - } - break; - } /* case Gd */ - show_mouse(); + + // Set the new position + g_vm->setMousePos(Common::Point(x, y)); } void read_pos_mouse(int &x, int &y, int &c) { - registres reg; - - if (int_m) { - reg.ax = 3; - intr(0x33, reg); - x = reg.cx; - y = reg.dx; - c = reg.bx; - } else { - c = 0; - x = x_s; - y = y_s; - } + x = g_vm->getMousePos().x; + y = g_vm->getMousePos().y; + c = g_vm->getMouseButtons(); } void mov_mouse(bool &funct, char &key) { bool p_key; char in1, in2; int x, y, cx, cy, cd; - registres reg; - if (int_m) { - reg.ax = 3; - intr(0x33, reg); - x = reg.cx; - y = reg.dx; - cd = reg.bx; - pos_mouse(x, y); - if (cd != 0) { - clic = true; - return; - } + // If mouse button clicked, return it + if (g_vm->getMouseButtons() != 0) { + clic = true; + return; } + funct = false; key = '\377'; p_key = keypressed();