aboutsummaryrefslogtreecommitdiff
path: root/sword2
diff options
context:
space:
mode:
Diffstat (limited to 'sword2')
-rw-r--r--sword2/console.cpp9
-rw-r--r--sword2/controls.cpp36
-rw-r--r--sword2/debug.cpp10
-rw-r--r--sword2/driver/_mouse.cpp39
-rw-r--r--sword2/driver/animation.cpp4
-rw-r--r--sword2/driver/driver96.h71
-rw-r--r--sword2/driver/rdwin.cpp45
-rw-r--r--sword2/function.cpp4
-rw-r--r--sword2/module.mk1
-rw-r--r--sword2/mouse.cpp65
-rw-r--r--sword2/resman.cpp7
-rw-r--r--sword2/speech.cpp18
-rw-r--r--sword2/sword2.cpp118
-rw-r--r--sword2/sword2.h41
14 files changed, 222 insertions, 246 deletions
diff --git a/sword2/console.cpp b/sword2/console.cpp
index 4d9acfe3fc..fdb0088751 100644
--- a/sword2/console.cpp
+++ b/sword2/console.cpp
@@ -302,12 +302,17 @@ bool Debugger::Cmd_Var(int argc, const char **argv) {
}
bool Debugger::Cmd_Rect(int argc, const char **argv) {
+ uint32 filter = _vm->setEventFilter(0);
+
_definingRectangles = !_definingRectangles;
- if (_definingRectangles)
+ if (_definingRectangles) {
+ _vm->setEventFilter(filter & ~(RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP));
DebugPrintf("Mouse rectangles enabled\n");
- else
+ } else {
+ _vm->setEventFilter(filter | RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP);
DebugPrintf("Mouse rectangles disabled\n");
+ }
_draggingRectangle = 0;
return true;
diff --git a/sword2/controls.cpp b/sword2/controls.cpp
index 69cc36103a..dfd0c448be 100644
--- a/sword2/controls.cpp
+++ b/sword2/controls.cpp
@@ -304,6 +304,8 @@ void Dialog::setResult(int result) {
}
int Dialog::run() {
+ uint32 oldFilter = _gui->_vm->setEventFilter(0);
+
int i;
paint();
@@ -316,17 +318,16 @@ int Dialog::run() {
_gui->_vm->_graphics->processMenu();
_gui->_vm->_graphics->updateDisplay(false);
- int16 newMouseX = _gui->_vm->_input->_mouseX;
- int16 newMouseY = _gui->_vm->_input->_mouseY + 40;
+ int16 newMouseX = _gui->_vm->_mouseX;
+ int16 newMouseY = _gui->_vm->_mouseY + 40;
- MouseEvent *me = _gui->_vm->_input->mouseEvent();
- KeyboardEvent ke;
- int32 keyboardStatus = _gui->_vm->_input->readKey(&ke);
+ MouseEvent *me = _gui->_vm->mouseEvent();
+ KeyboardEvent *ke = _gui->_vm->keyboardEvent();
- if (keyboardStatus == RD_OK) {
- if (ke.keycode == 27)
+ if (ke) {
+ if (ke->keycode == 27)
setResult(0);
- else if (ke.keycode == '\n' || ke.keycode == '\r')
+ else if (ke->keycode == '\n' || ke->keycode == '\r')
setResult(1);
}
@@ -391,8 +392,8 @@ int Dialog::run() {
if (newMouseX != oldMouseX || newMouseY != oldMouseY)
_widgets[i]->onMouseMove(newMouseX, newMouseY);
- if (keyboardStatus == RD_OK)
- _widgets[i]->onKey(&ke);
+ if (ke)
+ _widgets[i]->onKey(ke);
_widgets[i]->onTick();
}
@@ -406,6 +407,7 @@ int Dialog::run() {
setResult(0);
}
+ _gui->_vm->setEventFilter(oldFilter);
return _result;
}
@@ -1480,19 +1482,13 @@ void SaveLoadDialog::saveLoadError(byte* text) {
// Wait for ESC or mouse click
while (1) {
- MouseEvent *me;
-
_gui->_vm->_graphics->updateDisplay();
- if (_gui->_vm->_input->keyWaiting()) {
- KeyboardEvent ke;
-
- _gui->_vm->_input->readKey(&ke);
- if (ke.keycode == 27)
- break;
- }
+ KeyboardEvent *ke = _gui->_vm->keyboardEvent();
+ if (ke && ke->keycode == 27)
+ break;
- me = _gui->_vm->_input->mouseEvent();
+ MouseEvent *me = _gui->_vm->mouseEvent();
if (me && (me->buttons & RD_LEFTBUTTONDOWN))
break;
diff --git a/sword2/debug.cpp b/sword2/debug.cpp
index b16555e5e8..97b5d5f6ba 100644
--- a/sword2/debug.cpp
+++ b/sword2/debug.cpp
@@ -183,14 +183,14 @@ void Debugger::buildDebugText(void) {
if (_vm->_mouseTouching)
sprintf(buf, "mouse %d,%d (id %d: %s)",
- _vm->_input->_mouseX + _vm->_thisScreen.scroll_offset_x,
- _vm->_input->_mouseY + _vm->_thisScreen.scroll_offset_y,
+ _vm->_mouseX + _vm->_thisScreen.scroll_offset_x,
+ _vm->_mouseY + _vm->_thisScreen.scroll_offset_y,
_vm->_mouseTouching,
_vm->fetchObjectName(_vm->_mouseTouching, name));
else
sprintf(buf, "mouse %d,%d (not touching)",
- _vm->_input->_mouseX + _vm->_thisScreen.scroll_offset_x,
- _vm->_input->_mouseY + _vm->_thisScreen.scroll_offset_y);
+ _vm->_mouseX + _vm->_thisScreen.scroll_offset_x,
+ _vm->_mouseY + _vm->_thisScreen.scroll_offset_y);
makeDebugTextBlock(buf, 0, 30);
@@ -311,7 +311,7 @@ void Debugger::drawDebugGraphics(void) {
// mouse marker & coords
if (_displayMouseMarker)
- plotCrossHair(_vm->_input->_mouseX + _vm->_thisScreen.scroll_offset_x, _vm->_input->_mouseY + _vm->_thisScreen.scroll_offset_y, 215);
+ plotCrossHair(_vm->_mouseX + _vm->_thisScreen.scroll_offset_x, _vm->_mouseY + _vm->_thisScreen.scroll_offset_y, 215);
// mouse area rectangle / sprite box rectangle when testing anims
diff --git a/sword2/driver/_mouse.cpp b/sword2/driver/_mouse.cpp
index c4fe24a18a..223669a777 100644
--- a/sword2/driver/_mouse.cpp
+++ b/sword2/driver/_mouse.cpp
@@ -25,45 +25,6 @@ namespace Sword2 {
#define MOUSEFLASHFRAME 6
-/**
- * Logs the mouse button event passed in buttons. The button events were
- * originaly defined as RD_LEFTBUTTONDOWN, RD_LEFTBUTTONUP, RD_RIGHTBUTTONDOWN
- * and RD_RIGHTBUTTONUP. ScummVM adds RD_WHEELDOWN and RD_WHEELUP.
- */
-
-void Input::logMouseEvent(uint16 buttons) {
- // We need to leave the one, which is the current event, alone!
- if (_mouseBacklog == MAX_MOUSE_EVENTS - 1)
- return;
-
- _mouseLog[(_mouseBacklog + _mouseLogPos) % MAX_MOUSE_EVENTS].buttons = buttons;
- _mouseBacklog++;
-}
-
-bool Input::checkForMouseEvents(void) {
- return _mouseBacklog != 0;
-}
-
-/**
- * Get the next pending mouse event.
- * @return a pointer to the mouse event, or NULL of there is none
- */
-
-MouseEvent *Input::mouseEvent(void) {
- MouseEvent *me;
-
- if (_mouseBacklog) {
- me = &_mouseLog[_mouseLogPos];
- if (++_mouseLogPos == MAX_MOUSE_EVENTS)
- _mouseLogPos = 0;
-
- _mouseBacklog--;
- return me;
- }
-
- return NULL;
-}
-
void Graphics::decompressMouse(byte *decomp, byte *comp, int width, int height, int pitch, int xOff, int yOff) {
int32 size = width * height;
int32 i = 0;
diff --git a/sword2/driver/animation.cpp b/sword2/driver/animation.cpp
index b7d177ed84..f975b4be7d 100644
--- a/sword2/driver/animation.cpp
+++ b/sword2/driver/animation.cpp
@@ -424,9 +424,9 @@ int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], byte
_vm->_graphics->updateDisplay();
- KeyboardEvent ke;
+ KeyboardEvent *ke = _vm->keyboardEvent();
- if ((_vm->_input->readKey(&ke) == RD_OK && ke.keycode == 27) || _vm->_quit) {
+ if ((ke && ke->keycode == 27) || _vm->_quit) {
_snd->stopHandle(handle);
skipCutscene = true;
break;
diff --git a/sword2/driver/driver96.h b/sword2/driver/driver96.h
index 6356b9a287..0bf6803c4e 100644
--- a/sword2/driver/driver96.h
+++ b/sword2/driver/driver96.h
@@ -43,10 +43,6 @@ enum {
RDERR_OPENVERSIONFILE,
- // Keyboard error codes
-
- RDERR_NOKEYWAITING,
-
// Sprite drawing error codes
RDERR_NOTIMPLEMENTED,
@@ -77,17 +73,6 @@ enum {
RDERR_INVALIDID
};
-// Mouse button defines
-
-enum {
- RD_LEFTBUTTONDOWN = 0x01,
- RD_LEFTBUTTONUP = 0x02,
- RD_RIGHTBUTTONDOWN = 0x04,
- RD_RIGHTBUTTONUP = 0x08,
- RD_WHEELUP = 0x10,
- RD_WHEELDOWN = 0x20
-};
-
// Sprite defines
enum {
@@ -176,16 +161,6 @@ enum {
// Structure definitions
-struct MouseEvent {
- uint16 buttons;
-};
-
-struct KeyboardEvent {
- uint16 ascii;
- int keycode;
- int modifiers;
-};
-
#if !defined(__GNUC__)
#pragma START_PACK_STRUCTS
#endif
@@ -230,52 +205,6 @@ struct MovieTextObject {
uint16 *speech;
};
-// Input handling class
-
-// Mouse buffer size
-#define MAX_MOUSE_EVENTS 16
-
-// Key buffer size
-#define MAX_KEY_BUFFER 32
-
-class Input {
-private:
- Sword2Engine *_vm;
-
- uint8 _mouseBacklog;
- uint8 _mouseLogPos;
- MouseEvent _mouseLog[MAX_MOUSE_EVENTS];
-
- void logMouseEvent(uint16 buttons);
-
- // The number of key presses waiting to be processed.
- uint8 _keyBacklog;
-
- // Index of the next key to read from the buffer.
- uint8 _keyLogPos;
-
- // The keyboard buffer
- KeyboardEvent _keyBuffer[MAX_KEY_BUFFER];
-
- void writeKey(uint16 ascii, int keycode, int modifiers);
-
-public:
- int16 _mouseX;
- int16 _mouseY;
-
- Input(Sword2Engine *vm) :
- _vm(vm), _mouseBacklog(0), _mouseLogPos(0), _keyBacklog(0),
- _keyLogPos(0), _mouseX(0), _mouseY(0) {};
-
- void parseEvents(void);
-
- MouseEvent *mouseEvent(void);
- bool checkForMouseEvents(void);
-
- bool keyWaiting(void);
- int32 readKey(KeyboardEvent *ev);
-};
-
} // End of namespace Sword2
#endif
diff --git a/sword2/driver/rdwin.cpp b/sword2/driver/rdwin.cpp
index e6bdc9cccd..f981fd1151 100644
--- a/sword2/driver/rdwin.cpp
+++ b/sword2/driver/rdwin.cpp
@@ -24,49 +24,6 @@
namespace Sword2 {
-// ---------------------------------------------------------------------------
-// OSystem Event Handler. Full of cross platform goodness and 99% fat free!
-// ---------------------------------------------------------------------------
-
-void Input::parseEvents(void) {
- OSystem::Event event;
-
- while (_vm->_system->poll_event(&event)) {
- switch (event.event_code) {
- case OSystem::EVENT_KEYDOWN:
- writeKey(event.kbd.ascii, event.kbd.keycode, event.kbd.flags);
- break;
- case OSystem::EVENT_MOUSEMOVE:
- _mouseX = event.mouse.x;
- _mouseY = event.mouse.y - MENUDEEP;
- break;
- case OSystem::EVENT_LBUTTONDOWN:
- logMouseEvent(RD_LEFTBUTTONDOWN);
- break;
- case OSystem::EVENT_RBUTTONDOWN:
- logMouseEvent(RD_RIGHTBUTTONDOWN);
- break;
- case OSystem::EVENT_LBUTTONUP:
- logMouseEvent(RD_LEFTBUTTONUP);
- break;
- case OSystem::EVENT_RBUTTONUP:
- logMouseEvent(RD_RIGHTBUTTONUP);
- break;
- case OSystem::EVENT_WHEELUP:
- logMouseEvent(RD_WHEELUP);
- break;
- case OSystem::EVENT_WHEELDOWN:
- logMouseEvent(RD_WHEELDOWN);
- break;
- case OSystem::EVENT_QUIT:
- _vm->closeGame();
- break;
- default:
- break;
- }
- }
-}
-
/**
* Tell updateDisplay() that the scene needs to be completely updated.
*/
@@ -100,7 +57,7 @@ void Graphics::markAsDirty(int16 x0, int16 y0, int16 x1, int16 y1) {
*/
void Graphics::updateDisplay(bool redrawScene) {
- _vm->_input->parseEvents();
+ _vm->parseEvents();
fadeServer();
if (redrawScene) {
diff --git a/sword2/function.cpp b/sword2/function.cpp
index eab786fcb2..4fd756d529 100644
--- a/sword2/function.cpp
+++ b/sword2/function.cpp
@@ -662,9 +662,9 @@ int32 Logic::fnPlayCredits(int32 *params) {
_vm->_graphics->updateDisplay();
- KeyboardEvent ke;
+ KeyboardEvent *ke = _vm->keyboardEvent();
- if (_vm->_input->readKey(&ke) == RD_OK && ke.keycode == 27) {
+ if (ke && ke->keycode == 27) {
if (!abortCredits) {
abortCredits = true;
_vm->_graphics->fadeDown();
diff --git a/sword2/module.mk b/sword2/module.mk
index 1b83bb5dd1..c697ae04d3 100644
--- a/sword2/module.mk
+++ b/sword2/module.mk
@@ -28,7 +28,6 @@ MODULE_OBJS := \
sword2/walker.o \
sword2/driver/d_draw.o \
sword2/driver/d_sound.o \
- sword2/driver/keyboard.o \
sword2/driver/menu.o \
sword2/driver/_mouse.o \
sword2/driver/palette.o \
diff --git a/sword2/mouse.cpp b/sword2/mouse.cpp
index ad8286b30f..81e3b5634d 100644
--- a/sword2/mouse.cpp
+++ b/sword2/mouse.cpp
@@ -107,7 +107,7 @@ void Sword2Engine::mouseEngine(void) {
systemMenuMouse();
break;
case MOUSE_holding:
- if (_input->_mouseY < 400) {
+ if (_mouseY < 400) {
_mouseMode = MOUSE_normal;
debug(5, " releasing");
}
@@ -118,13 +118,13 @@ void Sword2Engine::mouseEngine(void) {
}
int Sword2Engine::menuClick(int menu_items) {
- if (_input->_mouseX < RDMENU_ICONSTART)
+ if (_mouseX < RDMENU_ICONSTART)
return -1;
- if (_input->_mouseX > RDMENU_ICONSTART + menu_items * (RDMENU_ICONWIDE + RDMENU_ICONSPACING) - RDMENU_ICONSPACING)
+ if (_mouseX > RDMENU_ICONSTART + menu_items * (RDMENU_ICONWIDE + RDMENU_ICONSPACING) - RDMENU_ICONSPACING)
return -1;
- return (_input->_mouseX - RDMENU_ICONSTART) / (RDMENU_ICONWIDE + RDMENU_ICONSPACING);
+ return (_mouseX - RDMENU_ICONSTART) / (RDMENU_ICONWIDE + RDMENU_ICONSPACING);
}
void Sword2Engine::systemMenuMouse(void) {
@@ -144,7 +144,7 @@ void Sword2Engine::systemMenuMouse(void) {
// If the mouse is moved off the menu, close it. Unless the player is
// dead, in which case the menu should always be visible.
- if (_input->_mouseY > 0 && !Logic::_scriptVars[DEAD]) {
+ if (_mouseY > 0 && !Logic::_scriptVars[DEAD]) {
_mouseMode = MOUSE_normal;
_graphics->hideMenu(RDMENU_TOP);
return;
@@ -152,12 +152,12 @@ void Sword2Engine::systemMenuMouse(void) {
// Check if the user left-clicks anywhere in the menu area.
- me = _input->mouseEvent();
+ me = mouseEvent();
if (!me || !(me->buttons & RD_LEFTBUTTONDOWN))
return;
- if (_input->_mouseY > 0)
+ if (_mouseY > 0)
return;
hit = menuClick(ARRAYSIZE(icon_list));
@@ -266,7 +266,7 @@ void Sword2Engine::dragMouse(void) {
// objects in the scene, so if the mouse moves off the inventory menu,
// then close it.
- if (_input->_mouseY < 400) {
+ if (_mouseY < 400) {
_mouseMode = MOUSE_normal;
_graphics->hideMenu(RDMENU_BOTTOM);
return;
@@ -278,7 +278,7 @@ void Sword2Engine::dragMouse(void) {
// Now do the normal click stuff
- me = _input->mouseEvent();
+ me = mouseEvent();
if (!me)
return;
@@ -319,8 +319,8 @@ void Sword2Engine::dragMouse(void) {
// These might be required by the action script about to be run
- Logic::_scriptVars[MOUSE_X] = _input->_mouseX + _thisScreen.scroll_offset_x;
- Logic::_scriptVars[MOUSE_Y] = _input->_mouseY + _thisScreen.scroll_offset_y;
+ Logic::_scriptVars[MOUSE_X] = _mouseX + _thisScreen.scroll_offset_x;
+ Logic::_scriptVars[MOUSE_Y] = _mouseY + _thisScreen.scroll_offset_y;
// For scripts to know what's been clicked. First used for
// 'room_13_turning_script' in object 'biscuits_13'
@@ -387,13 +387,13 @@ void Sword2Engine::menuMouse(void) {
// If the mouse is moved off the menu, close it.
- if (_input->_mouseY < 400) {
+ if (_mouseY < 400) {
_mouseMode = MOUSE_normal;
_graphics->hideMenu(RDMENU_BOTTOM);
return;
}
- me = _input->mouseEvent();
+ me = mouseEvent();
if (!me)
return;
@@ -471,7 +471,7 @@ void Sword2Engine::normalMouse(void) {
// big-object menu lock situation, of if the player is dragging an
// object.
- if (_input->_mouseY < 0 && !_mouseModeLocked && !Logic::_scriptVars[OBJECT_HELD]) {
+ if (_mouseY < 0 && !_mouseModeLocked && !Logic::_scriptVars[OBJECT_HELD]) {
_mouseMode = MOUSE_system_menu;
if (_mouseTouching) {
@@ -490,7 +490,7 @@ void Sword2Engine::normalMouse(void) {
// Check if the cursor has moved onto the inventory menu area. No
// inventory in big-object menu lock situation,
- if (_input->_mouseY > 399 && !_mouseModeLocked) {
+ if (_mouseY > 399 && !_mouseModeLocked) {
// If an object is being held, i.e. if the mouse cursor has a
// luggage, go to drag mode instead of menu mode, but the menu
// is still opened.
@@ -523,7 +523,7 @@ void Sword2Engine::normalMouse(void) {
mouseOnOff();
- me = _input->mouseEvent();
+ me = mouseEvent();
if (!me)
return;
@@ -539,8 +539,8 @@ void Sword2Engine::normalMouse(void) {
if (button_down) {
// set both (x1,y1) and (x2,y2) to this point
- _debugger->_rectX1 = _debugger->_rectX2 = (uint32) _input->_mouseX + _thisScreen.scroll_offset_x;
- _debugger->_rectY1 = _debugger->_rectY2 = (uint32) _input->_mouseY + _thisScreen.scroll_offset_y;
+ _debugger->_rectX1 = _debugger->_rectX2 = (uint32) _mouseX + _thisScreen.scroll_offset_x;
+ _debugger->_rectY1 = _debugger->_rectY2 = (uint32) _mouseY + _thisScreen.scroll_offset_y;
_debugger->_draggingRectangle = 1;
}
} else if (_debugger->_draggingRectangle == 1) {
@@ -552,8 +552,8 @@ void Sword2Engine::normalMouse(void) {
_debugger->_draggingRectangle = 2;
} else {
// drag rectangle
- _debugger->_rectX2 = (uint32) _input->_mouseX + _thisScreen.scroll_offset_x;
- _debugger->_rectY2 = (uint32) _input->_mouseY + _thisScreen.scroll_offset_y;
+ _debugger->_rectX2 = (uint32) _mouseX + _thisScreen.scroll_offset_x;
+ _debugger->_rectY2 = (uint32) _mouseY + _thisScreen.scroll_offset_y;
}
} else {
// currently locked to avoid knocking out of place
@@ -582,8 +582,7 @@ void Sword2Engine::normalMouse(void) {
// Now do the normal click stuff
- // We only care about down clicks when the mouse is over an object. We
- // ignore mouse releases
+ // We only care about down clicks when the mouse is over an object.
if (!_mouseTouching || !button_down)
return;
@@ -618,8 +617,8 @@ void Sword2Engine::normalMouse(void) {
// These might be required by the action script about to be run
- Logic::_scriptVars[MOUSE_X] = _input->_mouseX + _thisScreen.scroll_offset_x;
- Logic::_scriptVars[MOUSE_Y] = _input->_mouseY + _thisScreen.scroll_offset_y;
+ Logic::_scriptVars[MOUSE_X] = _mouseX + _thisScreen.scroll_offset_x;
+ Logic::_scriptVars[MOUSE_Y] = _mouseY + _thisScreen.scroll_offset_y;
if (_mouseTouching == Logic::_scriptVars[EXIT_CLICK_ID] && (me->buttons & RD_LEFTBUTTONDOWN)) {
// It's the exit double click situation. Let the existing
@@ -693,7 +692,7 @@ void Sword2Engine::mouseOnOff(void) {
// don't detect objects that are hidden behind the menu bars (ie. in
// the scrolled-off areas of the screen)
- if (_input->_mouseY < 0 || _input->_mouseY > 399) {
+ if (_mouseY < 0 || _mouseY > 399) {
pointer_type = 0;
_mouseTouching = 0;
} else {
@@ -823,10 +822,10 @@ uint32 Sword2Engine::checkMouseList(void) {
// mouse-detection-box
if (_mouseList[i].priority == priority &&
- _input->_mouseX + _thisScreen.scroll_offset_x >= _mouseList[i].x1 &&
- _input->_mouseX + _thisScreen.scroll_offset_x <= _mouseList[i].x2 &&
- _input->_mouseY + _thisScreen.scroll_offset_y >= _mouseList[i].y1 &&
- _input->_mouseY + _thisScreen.scroll_offset_y <= _mouseList[i].y2) {
+ _mouseX + _thisScreen.scroll_offset_x >= _mouseList[i].x1 &&
+ _mouseX + _thisScreen.scroll_offset_x <= _mouseList[i].x2 &&
+ _mouseY + _thisScreen.scroll_offset_y >= _mouseList[i].y1 &&
+ _mouseY + _thisScreen.scroll_offset_y <= _mouseList[i].y2) {
// Record id
_mouseTouching = _mouseList[i].id;
@@ -994,8 +993,8 @@ void Sword2Engine::createPointerText(uint32 text_id, uint32 pointer_res) {
// line reference number
_pointerTextBlocNo = _fontRenderer->buildNewBloc(
- text + 2, _input->_mouseX + xOffset,
- _input->_mouseY + yOffset,
+ text + 2, _mouseX + xOffset,
+ _mouseY + yOffset,
POINTER_TEXT_WIDTH, POINTER_TEXT_PEN,
RDSPR_TRANS | RDSPR_DISPLAYALIGN,
_speechFontId, justification);
@@ -1066,7 +1065,7 @@ void Sword2Engine::registerMouse(ObjectMouse *ob_mouse) {
void Sword2Engine::monitorPlayerActivity(void) {
// if there is at least one mouse event outstanding
- if (_input->checkForMouseEvents()) {
+ if (checkForMouseEvents()) {
// reset activity delay counter
_playerActivityDelay = 0;
} else {
@@ -1133,7 +1132,7 @@ int32 Logic::fnAddHuman(int32 *params) {
}
// if mouse is over menu area
- if (_vm->_input->_mouseY > 399) {
+ if (_vm->_mouseY > 399) {
if (_vm->_mouseMode != MOUSE_holding) {
// VITAL - reset things & rebuild the menu
_vm->_mouseMode = MOUSE_normal;
diff --git a/sword2/resman.cpp b/sword2/resman.cpp
index dfdf4cde98..1788855b43 100644
--- a/sword2/resman.cpp
+++ b/sword2/resman.cpp
@@ -860,14 +860,11 @@ void ResourceManager::getCd(int cd) {
// CD2: "RBSII2"
while (1) {
- KeyboardEvent ke;
- MouseEvent *me;
-
- me = _vm->_input->mouseEvent();
+ MouseEvent *me = _vm->mouseEvent();
if (me && (me->buttons & (RD_LEFTBUTTONDOWN | RD_RIGHTBUTTONDOWN)))
break;
- if (_vm->_input->readKey(&ke) == RD_OK)
+ if (_vm->keyboardEvent())
break;
_vm->_graphics->updateDisplay();
diff --git a/sword2/speech.cpp b/sword2/speech.cpp
index 73e5c060eb..6f7937574c 100644
--- a/sword2/speech.cpp
+++ b/sword2/speech.cpp
@@ -135,11 +135,11 @@ int32 Logic::fnChoose(int32 *params) {
}
// The menu is there - we're just waiting for a click. We only care
- // about left clicks and ignore mouse releases.
+ // about left clicks.
- MouseEvent *me = _vm->_input->mouseEvent();
+ MouseEvent *me = _vm->mouseEvent();
- if (!me || !(me->buttons & RD_LEFTBUTTONDOWN) || _vm->_input->_mouseY < 400)
+ if (!me || !(me->buttons & RD_LEFTBUTTONDOWN) || _vm->_mouseY < 400)
return IR_REPEAT;
// Check for click on a menu.
@@ -200,7 +200,7 @@ int32 Logic::fnEndConversation(int32 *params) {
_vm->_graphics->hideMenu(RDMENU_BOTTOM);
- if (_vm->_input->_mouseY > 399) {
+ if (_vm->_mouseY > 399) {
// Will wait for cursor to move off the bottom menu
_vm->_mouseMode = MOUSE_holding;
}
@@ -995,8 +995,8 @@ int32 Logic::fnISpeak(int32 *params) {
// So that we can go to the options panel while text & speech is
// being tested
- if (_scriptVars[SYSTEM_TESTING_TEXT] == 0 || _vm->_input->_mouseY > 0) {
- MouseEvent *me = _vm->_input->mouseEvent();
+ if (_scriptVars[SYSTEM_TESTING_TEXT] == 0 || _vm->_mouseY > 0) {
+ MouseEvent *me = _vm->mouseEvent();
// Note that we now have TWO click-delays - one for LEFT
// button, one for RIGHT BUTTON
@@ -1004,7 +1004,7 @@ int32 Logic::fnISpeak(int32 *params) {
if ((!_leftClickDelay && me && (me->buttons & RD_LEFTBUTTONDOWN)) ||
(!_rightClickDelay && me && (me->buttons & RD_RIGHTBUTTONDOWN))) {
// Mouse click, after click_delay has expired -> end
- // the speech. We ignore mouse releases
+ // the speech.
// if testing text & speech
if (_scriptVars[SYSTEM_TESTING_TEXT]) {
@@ -1018,10 +1018,6 @@ int32 Logic::fnISpeak(int32 *params) {
}
}
- // Trash anything that's buffered
- while (_vm->_input->mouseEvent())
- ;
-
speechFinished = true;
// if speech sample playing, halt it prematurely
diff --git a/sword2/sword2.cpp b/sword2/sword2.cpp
index c44697457f..873efcd851 100644
--- a/sword2/sword2.cpp
+++ b/sword2/sword2.cpp
@@ -120,6 +120,11 @@ Sword2Engine::Sword2Engine(GameDetector *detector, OSystem *syst)
_mixer->setVolume(256);
_mixer->setMusicVolume(256);
+ _keyboardEvent.pending = false;
+ _mouseEvent.pending = false;
+
+ _mouseX = _mouseY = 0;
+
// get some falling RAM and put it in your pocket, never let it slip
// away
@@ -137,7 +142,6 @@ Sword2Engine::Sword2Engine(GameDetector *detector, OSystem *syst)
_logic = new Logic(this);
_fontRenderer = new FontRenderer(this);
_gui = new Gui(this);
- _input = new Input(this);
_sound = new Sound(this);
_lastPaletteRes = 0;
@@ -194,7 +198,6 @@ Sword2Engine::~Sword2Engine() {
delete _debugger;
delete _graphics;
delete _sound;
- delete _input;
delete _gui;
delete _fontRenderer;
delete _logic;
@@ -221,7 +224,9 @@ void Sword2Engine::errorString(const char *buf1, char *buf2) {
}
int32 Sword2Engine::initialiseGame(void) {
- // init engine drivers
+ // During normal gameplay, we care neither about mouse button releases
+ // nor the scroll wheel.
+ setEventFilter(RD_LEFTBUTTONUP | RD_RIGHTBUTTONUP | RD_WHEELUP | RD_WHEELDOWN);
// initialise global script variables
// res 1 is the globals list
@@ -258,6 +263,101 @@ void Sword2Engine::closeGame(void) {
_quit = true;
}
+bool Sword2Engine::checkForMouseEvents(void) {
+ return _mouseEvent.pending;
+}
+
+MouseEvent *Sword2Engine::mouseEvent(void) {
+ if (!_mouseEvent.pending)
+ return NULL;
+
+ _mouseEvent.pending = false;
+ return &_mouseEvent;
+}
+
+KeyboardEvent *Sword2Engine::keyboardEvent(void) {
+ if (!_keyboardEvent.pending)
+ return NULL;
+
+ _keyboardEvent.pending = false;
+ return &_keyboardEvent;
+}
+
+uint32 Sword2Engine::setEventFilter(uint32 filter) {
+ uint32 oldFilter = _eventFilter;
+
+ _eventFilter = filter;
+ return oldFilter;
+}
+
+/**
+ * OSystem Event Handler. Full of cross platform goodness and 99% fat free!
+ */
+
+void Sword2Engine::parseEvents(void) {
+ OSystem::Event event;
+
+ while (_system->poll_event(&event)) {
+ switch (event.event_code) {
+ case OSystem::EVENT_KEYDOWN:
+ if (!(_eventFilter & RD_KEYDOWN)) {
+ _keyboardEvent.pending = true;
+ _keyboardEvent.ascii = event.kbd.ascii;
+ _keyboardEvent.keycode = event.kbd.keycode;
+ _keyboardEvent.modifiers = event.kbd.flags;
+ }
+ break;
+ case OSystem::EVENT_MOUSEMOVE:
+ if (!(_eventFilter & RD_KEYDOWN)) {
+ _mouseX = event.mouse.x;
+ _mouseY = event.mouse.y - RDMENU_MENUDEEP;
+ }
+ break;
+ case OSystem::EVENT_LBUTTONDOWN:
+ if (!(_eventFilter & RD_LEFTBUTTONDOWN)) {
+ _mouseEvent.pending = true;
+ _mouseEvent.buttons = RD_LEFTBUTTONDOWN;
+ }
+ break;
+ case OSystem::EVENT_RBUTTONDOWN:
+ if (!(_eventFilter & RD_RIGHTBUTTONDOWN)) {
+ _mouseEvent.pending = true;
+ _mouseEvent.buttons = RD_RIGHTBUTTONDOWN;
+ }
+ break;
+ case OSystem::EVENT_LBUTTONUP:
+ if (!(_eventFilter & RD_LEFTBUTTONUP)) {
+ _mouseEvent.pending = true;
+ _mouseEvent.buttons = RD_LEFTBUTTONUP;
+ }
+ break;
+ case OSystem::EVENT_RBUTTONUP:
+ if (!(_eventFilter & RD_RIGHTBUTTONUP)) {
+ _mouseEvent.pending = true;
+ _mouseEvent.buttons = RD_RIGHTBUTTONUP;
+ }
+ break;
+ case OSystem::EVENT_WHEELUP:
+ if (!(_eventFilter & RD_WHEELUP)) {
+ _mouseEvent.pending = true;
+ _mouseEvent.buttons = RD_WHEELUP;
+ }
+ break;
+ case OSystem::EVENT_WHEELDOWN:
+ if (!(_eventFilter & RD_WHEELDOWN)) {
+ _mouseEvent.pending = true;
+ _mouseEvent.buttons = RD_WHEELDOWN;
+ }
+ break;
+ case OSystem::EVENT_QUIT:
+ closeGame();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
void Sword2Engine::gameCycle(void) {
// do one game cycle
@@ -290,8 +390,6 @@ void Sword2Engine::gameCycle(void) {
}
void Sword2Engine::go() {
- KeyboardEvent ke;
-
_quit = false;
debug(5, "CALLING: readOptionSettings");
@@ -354,13 +452,13 @@ void Sword2Engine::go() {
}
#endif
- if (_input->keyWaiting()) {
- _input->readKey(&ke);
+ KeyboardEvent *ke = keyboardEvent();
- if ((ke.modifiers == OSystem::KBD_CTRL && ke.keycode == 'd') || ke.ascii == '#' || ke.ascii == '~') {
+ if (ke) {
+ if ((ke->modifiers == OSystem::KBD_CTRL && ke->keycode == 'd') || ke->ascii == '#' || ke->ascii == '~') {
_debugger->attach();
- } else if (ke.modifiers == 0 || ke.modifiers == OSystem::KBD_SHIFT) {
- switch (ke.keycode) {
+ } else if (ke->modifiers == 0 || ke->modifiers == OSystem::KBD_SHIFT) {
+ switch (ke->keycode) {
case 'p':
if (_gamePaused)
unpauseGame();
diff --git a/sword2/sword2.h b/sword2/sword2.h
index 588dd72106..da50953151 100644
--- a/sword2/sword2.h
+++ b/sword2/sword2.h
@@ -50,8 +50,37 @@ class FontRenderer;
class Gui;
class Debugger;
+enum {
+ RD_LEFTBUTTONDOWN = 0x01,
+ RD_LEFTBUTTONUP = 0x02,
+ RD_RIGHTBUTTONDOWN = 0x04,
+ RD_RIGHTBUTTONUP = 0x08,
+ RD_WHEELUP = 0x10,
+ RD_WHEELDOWN = 0x20,
+ RD_KEYDOWN = 0x40,
+ RD_MOUSEMOVE = 0x80
+};
+
+struct MouseEvent {
+ bool pending;
+ uint16 buttons;
+};
+
+struct KeyboardEvent {
+ bool pending;
+ uint16 ascii;
+ int keycode;
+ int modifiers;
+};
+
class Sword2Engine : public Engine {
private:
+ uint32 _eventFilter;
+
+ // The event "buffers"
+ MouseEvent _mouseEvent;
+ KeyboardEvent _keyboardEvent;
+
uint32 _bootParam;
int32 _saveSlot;
@@ -146,7 +175,6 @@ public:
MemoryManager *_memory;
ResourceManager *_resman;
- Input *_input;
Sound *_sound;
Graphics *_graphics;
Logic *_logic;
@@ -161,6 +189,17 @@ public:
uint32 _controlsFontId;
uint32 _redFontId;
+ int16 _mouseX;
+ int16 _mouseY;
+
+ uint32 setEventFilter(uint32 filter);
+
+ void parseEvents(void);
+
+ bool checkForMouseEvents(void);
+ MouseEvent *mouseEvent(void);
+ KeyboardEvent *keyboardEvent(void);
+
void resetRenderLists(void);
void buildDisplay(void);
void displayMsg(byte *text, int time);