aboutsummaryrefslogtreecommitdiff
path: root/engines/cge/events.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cge/events.cpp')
-rw-r--r--engines/cge/events.cpp109
1 files changed, 58 insertions, 51 deletions
diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp
index dc6e65722d..50544255a8 100644
--- a/engines/cge/events.cpp
+++ b/engines/cge/events.cpp
@@ -33,10 +33,6 @@
namespace CGE {
-CGEEvent Evt[EVT_MAX];
-
-uint16 EvtHead = 0, EvtTail = 0;
-
/*----------------- KEYBOARD interface -----------------*/
const uint16 Keyboard::_code[0x60] = {
@@ -85,8 +81,7 @@ const uint16 Keyboard::_scummVmCodes[0x60] = {
0
};
-Keyboard::Keyboard() {
- _client = NULL;
+Keyboard::Keyboard() : _client(NULL) {
Common::set_to(&_key[0], &_key[0x60], false);
_current = 0;
}
@@ -99,9 +94,14 @@ Sprite *Keyboard::setClient(Sprite *spr) {
return spr;
}
-bool Keyboard::getKey(uint16 keycode, int &cgeCode) {
+bool Keyboard::getKey(Common::Event &event, int &cgeCode) {
+ Common::KeyCode keycode = event.kbd.keycode;
if ((keycode == Common::KEYCODE_LCTRL) || (keycode == Common::KEYCODE_RCTRL)) {
- cgeCode = 29;
+ cgeCode = kKeyCtrl;
+ return true;
+ }
+ if ((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) {
+ cgeCode = kKeyAlt;
return true;
}
if (keycode == Common::KEYCODE_KP_ENTER) {
@@ -110,8 +110,8 @@ bool Keyboard::getKey(uint16 keycode, int &cgeCode) {
}
// Scan through the ScummVM mapping list
- for (int idx = 0; idx < 0x60; ++idx) {
- if (_scummVmCodes[idx] == keycode) {
+ for (int idx = 0; idx < 0x60; idx++) {
+ if (_scummVmCodes[idx] == event.kbd.ascii) {
cgeCode = idx;
return true;
}
@@ -122,7 +122,7 @@ bool Keyboard::getKey(uint16 keycode, int &cgeCode) {
void Keyboard::newKeyboard(Common::Event &event) {
int keycode;
- if (!getKey(event.kbd.keycode, keycode))
+ if (!getKey(event, keycode))
return;
if (event.type == Common::EVENT_KEYUP) {
@@ -134,15 +134,20 @@ void Keyboard::newKeyboard(Common::Event &event) {
_current = Keyboard::_code[keycode];
if (_client) {
- CGEEvent &evt = Evt[EvtHead];
- EvtHead = (EvtHead + 1) % EVT_MAX;
+ CGEEvent &evt = _eventManager->getNextEvent();
evt._x = _current; // Keycode
- evt._msk = KEYB; // Event mask
- evt._ptr = _client; // Sprite pointer
+ evt._mask = kEventKeyb; // Event mask
+ evt._spritePtr = _client; // Sprite pointer
}
}
}
+uint16 Keyboard::lastKey() {
+ uint16 cur = _current;
+ _current = 0;
+ return cur;
+}
+
/*----------------- MOUSE interface -----------------*/
Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0), _vm(vm) {
@@ -163,13 +168,13 @@ Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0)
Common::copy(ms, ms + 2, seq);
setSeq(seq);
- BMP_PTR *MC = new BMP_PTR[3];
+ BitmapPtr *MC = new BitmapPtr[3];
MC[0] = new Bitmap("MOUSE", true);
MC[1] = new Bitmap("DUMMY", true);
MC[2] = NULL;
setShapeList(MC);
- gotoxy(kScrWidth/2, kScrHeight/2);
+ gotoxy(kScrWidth / 2, kScrHeight / 2);
_z = 127;
step(1);
}
@@ -180,11 +185,6 @@ Mouse::~Mouse() {
}
-//void Mouse::setFun()
-//{
-//}
-
-
void Mouse::on() {
if (_seqPtr && _exist) {
_active = true;
@@ -211,30 +211,29 @@ void Mouse::newMouse(Common::Event &event) {
if (!_active)
return;
- CGEEvent &evt = Evt[EvtHead];
- EvtHead = (EvtHead + 1) % EVT_MAX;
+ CGEEvent &evt = _eventManager->getNextEvent();
evt._x = event.mouse.x;
evt._y = event.mouse.y;
- evt._ptr = spriteAt(evt._x, evt._y);
+ evt._spritePtr = spriteAt(evt._x, evt._y);
switch (event.type) {
case Common::EVENT_MOUSEMOVE:
- evt._msk = ROLL;
+ evt._mask = kMouseRoll;
break;
case Common::EVENT_LBUTTONDOWN:
- evt._msk = L_DN;
+ evt._mask = kMouseLeftDown;
_buttons |= 1;
break;
case Common::EVENT_LBUTTONUP:
- evt._msk = L_UP;
+ evt._mask = kMouseLeftUp;
_buttons &= ~1;
break;
case Common::EVENT_RBUTTONDOWN:
- evt._msk = R_DN;
+ evt._mask = kMouseRightDown;
_buttons |= 2;
break;
case Common::EVENT_RBUTTONUP:
- evt._msk = R_UP;
+ evt._mask = kMouseRightUp;
_buttons &= ~2;
break;
default:
@@ -246,6 +245,8 @@ void Mouse::newMouse(Common::Event &event) {
EventManager::EventManager() {
_quitFlag = false;
+ _eventQueueHead = 0;
+ _eventQueueTail = 0;
}
void EventManager::poll() {
@@ -277,27 +278,27 @@ void EventManager::poll() {
}
void EventManager::handleEvents() {
- while (EvtTail != EvtHead) {
- CGEEvent e = Evt[EvtTail];
- if (e._msk) {
- if (_mouse->_hold && e._ptr != _mouse->_hold)
- _mouse->_hold->touch(e._msk | ATTN, e._x - _mouse->_hold->_x, e._y - _mouse->_hold->_y);
+ while (_eventQueueTail != _eventQueueHead) {
+ CGEEvent e = _eventQueue[_eventQueueTail];
+ if (e._mask) {
+ if (_mouse->_hold && e._spritePtr != _mouse->_hold)
+ _mouse->_hold->touch(e._mask | kEventAttn, e._x - _mouse->_hold->_x, e._y - _mouse->_hold->_y);
// update mouse cursor position
- if (e._msk & ROLL)
+ if (e._mask & kMouseRoll)
_mouse->gotoxy(e._x, e._y);
// activate current touched SPRITE
- if (e._ptr) {
- if (e._msk & KEYB)
- e._ptr->touch(e._msk, e._x, e._y);
+ if (e._spritePtr) {
+ if (e._mask & kEventKeyb)
+ e._spritePtr->touch(e._mask, e._x, e._y);
else
- e._ptr->touch(e._msk, e._x - e._ptr->_x, e._y - e._ptr->_y);
+ e._spritePtr->touch(e._mask, e._x - e._spritePtr->_x, e._y - e._spritePtr->_y);
} else if (_sys)
- _sys->touch(e._msk, e._x, e._y);
+ _sys->touch(e._mask, e._x, e._y);
- if (e._msk & L_DN) {
- _mouse->_hold = e._ptr;
+ if (e._mask & kMouseLeftDown) {
+ _mouse->_hold = e._spritePtr;
if (_mouse->_hold) {
_mouse->_hold->_flags._hold = true;
@@ -308,7 +309,7 @@ void EventManager::handleEvents() {
}
}
- if (e._msk & L_UP) {
+ if (e._mask & kMouseLeftUp) {
if (_mouse->_hold) {
_mouse->_hold->_flags._hold = false;
_mouse->_hold = NULL;
@@ -317,10 +318,10 @@ void EventManager::handleEvents() {
///Touched = e.Ptr;
// discard Text if button released
- if (e._msk & (L_UP | R_UP))
+ if (e._mask & (kMouseLeftUp | kMouseRightUp))
killText();
}
- EvtTail = (EvtTail + 1) % EVT_MAX;
+ _eventQueueTail = (_eventQueueTail + 1) % kEventMax;
}
if (_mouse->_hold) {
if (_mouse->_hold->_flags._drag)
@@ -328,14 +329,20 @@ void EventManager::handleEvents() {
}
}
-void EventManager::clrEvt(Sprite *spr) {
+void EventManager::clearEvent(Sprite *spr) {
if (spr) {
uint16 e;
- for (e = EvtTail; e != EvtHead; e = (e + 1) % EVT_MAX)
- if (Evt[e]._ptr == spr)
- Evt[e]._msk = 0;
+ for (e = _eventQueueTail; e != _eventQueueHead; e = (e + 1) % kEventMax)
+ if (_eventQueue[e]._spritePtr == spr)
+ _eventQueue[e]._mask = 0;
} else
- EvtTail = EvtHead;
+ _eventQueueTail = _eventQueueHead;
}
+CGEEvent &EventManager::getNextEvent() {
+ CGEEvent &evt = _eventQueue[_eventQueueHead];
+ _eventQueueHead = (_eventQueueHead + 1) % kEventMax;
+
+ return evt;
+}
} // End of namespace CGE