MORTEVIELLE: Expand on the mouse/keyboard handling code

This commit is contained in:
Paul Gilbert 2012-01-20 17:12:14 +11:00 committed by Strangerke
parent 3caa20a618
commit 5c628fedd2
3 changed files with 79 additions and 62 deletions

View File

@ -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() {

View File

@ -51,6 +51,8 @@ private:
const ADGameDescription *_gameDescription;
Common::Stack<int> _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;

View File

@ -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();