aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorMartin Kiewitz2009-12-04 17:38:24 +0000
committerMartin Kiewitz2009-12-04 17:38:24 +0000
commita5f1808c83844c21a5e22543157fa341536b5406 (patch)
tree8a428484c3fa52e29cbaffa3f758785772d6f8f2 /engines/sci/engine
parent055c8b087b383eeb556e9f0db03f9da8a7ad2a91 (diff)
downloadscummvm-rg350-a5f1808c83844c21a5e22543157fa341536b5406.tar.gz
scummvm-rg350-a5f1808c83844c21a5e22543157fa341536b5406.tar.bz2
scummvm-rg350-a5f1808c83844c21a5e22543157fa341536b5406.zip
SCI: SciEvent created, kernel_sleep() created
svn-id: r46252
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/kernel.cpp22
-rw-r--r--engines/sci/engine/kernel.h1
-rw-r--r--engines/sci/engine/kevent.cpp70
-rw-r--r--engines/sci/engine/kmisc.cpp5
-rw-r--r--engines/sci/engine/state.h3
5 files changed, 42 insertions, 59 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index 9766043b8e..c334d6af0b 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -25,6 +25,7 @@
#include "sci/sci.h"
#include "sci/engine/kernel.h"
+#include "sci/event.h"
#include "sci/resource.h"
#include "sci/engine/state.h"
#include "sci/engine/kernel_types.h"
@@ -671,6 +672,27 @@ bool kernel_matches_signature(SegManager *segMan, const char *sig, int argc, con
return (*sig == 0 || (*sig & KSIG_ELLIPSIS));
}
+void kernel_sleep(SciEvent *event, uint32 msecs ) {
+ uint32 time;
+ const uint32 wakeup_time = g_system->getMillis() + msecs;
+
+ while (true) {
+ // let backend process events and update the screen
+ event->get(SCI_EVT_PEEK);
+ // TODO: we need to call SciGuiCursor::refreshPosition() before each screen update to limit the mouse cursor position
+ g_system->updateScreen();
+ time = g_system->getMillis();
+ if (time + 10 < wakeup_time) {
+ g_system->delayMillis(10);
+ } else {
+ if (time < wakeup_time)
+ g_system->delayMillis(wakeup_time - time);
+ break;
+ }
+
+ }
+}
+
void Kernel::setDefaultKernelNames() {
_kernelNames = Common::StringList(sci_default_knames, SCI_KNAMES_DEFAULT_ENTRIES_NR);
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index 9294b6a172..56fdf47c9e 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -242,7 +242,6 @@ extern Common::Rect get_nsrect(EngineState *s, reg_t object, byte clip);
*/
void process_sound_events(EngineState *s);
-
/******************** Constants ********************/
/* Maximum length of a savegame name (including terminator character) */
diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp
index 133e6dc3e5..e57cd55b0e 100644
--- a/engines/sci/engine/kevent.cpp
+++ b/engines/sci/engine/kevent.cpp
@@ -29,6 +29,7 @@
#include "sci/gfx/operations.h"
#include "sci/console.h"
#include "sci/debug.h" // for g_debug_simulated_key
+#include "sci/event.h"
#include "sci/gui/gui.h"
#include "sci/gui/gui_cursor.h"
@@ -39,7 +40,7 @@ namespace Sci {
reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
int mask = argv[0].toUint16();
reg_t obj = argv[1];
- sci_event_t e;
+ sciEvent curEvent;
int oldx, oldy;
int modifier_mask = getSciVersion() <= SCI_VERSION_01 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK;
SegManager *segMan = s->_segMan;
@@ -59,7 +60,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
oldx = mousePos.x;
oldy = mousePos.y;
- e = gfxop_get_event(s->gfx_state, mask);
+ curEvent = s->_event->get(mask);
s->parser_event = NULL_REG; // Invalidate parser event
@@ -68,17 +69,17 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
//s->_gui->moveCursor(s->gfx_state->pointer_pos.x, s->gfx_state->pointer_pos.y);
- switch (e.type) {
+ switch (curEvent.type) {
case SCI_EVT_QUIT:
quit_vm();
break;
case SCI_EVT_KEYBOARD:
- if ((e.buckybits & SCI_EVM_LSHIFT) && (e.buckybits & SCI_EVM_RSHIFT) && (e.data == '-')) {
+ if ((curEvent.buckybits & SCI_EVM_LSHIFT) && (curEvent.buckybits & SCI_EVM_RSHIFT) && (curEvent.data == '-')) {
printf("Debug mode activated\n");
g_debugState.seeking = kDebugSeekNothing;
g_debugState.runningStep = 0;
- } else if ((e.buckybits & SCI_EVM_CTRL) && (e.data == '`')) {
+ } else if ((curEvent.buckybits & SCI_EVM_CTRL) && (curEvent.data == '`')) {
printf("Debug mode activated\n");
g_debugState.seeking = kDebugSeekNothing;
g_debugState.runningStep = 0;
@@ -86,50 +87,9 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
PUT_SEL32V(segMan, obj, type, SCI_EVT_KEYBOARD); // Keyboard event
s->r_acc = make_reg(0, 1);
- // TODO: Remove this as soon as ScummVM handles Ctrl-Alt-X to us
- if ((e.buckybits == SCI_EVM_CTRL) && (e.character = 'x'))
- e.buckybits |= SCI_EVM_ALT;
-
- if (e.buckybits & SCI_EVM_ALT) {
- // If Alt is pressed, we need to convert the actual key to a DOS scancode
- switch (e.character) {
- case 'a': e.character = 30 << 8; break;
- case 'b': e.character = 48 << 8; break;
- case 'c': e.character = 46 << 8; break;
- case 'd': e.character = 32 << 8; break;
- case 'e': e.character = 18 << 8; break;
- case 'f': e.character = 33 << 8; break;
- case 'g': e.character = 34 << 8; break;
- case 'h': e.character = 35 << 8; break;
- case 'i': e.character = 33 << 8; break;
- case 'j': e.character = 23 << 8; break;
- case 'k': e.character = 37 << 8; break;
- case 'l': e.character = 38 << 8; break;
- case 'm': e.character = 50 << 8; break;
- case 'n': e.character = 49 << 8; break;
- case 'o': e.character = 24 << 8; break;
- case 'p': e.character = 25 << 8; break;
- case 'q': e.character = 16 << 8; break;
- case 'r': e.character = 19 << 8; break;
- case 's': e.character = 31 << 8; break;
- case 't': e.character = 20 << 8; break;
- case 'u': e.character = 22 << 8; break;
- case 'v': e.character = 47 << 8; break;
- case 'w': e.character = 17 << 8; break;
- case 'x': e.character = 45 << 8; break;
- case 'y': e.character = 21 << 8; break;
- case 'z': e.character = 44 << 8; break;
- }
- } else if (e.buckybits & SCI_EVM_CTRL) {
- // Control is pressed...
- if ((e.character >= 97) && (e.character <= 121)) {
- e.character -= 96; // 'a' -> 0x01, etc.
- }
- }
-
- PUT_SEL32V(segMan, obj, message, e.character);
+ PUT_SEL32V(segMan, obj, message, curEvent.character);
// We only care about the translated character
- PUT_SEL32V(segMan, obj, modifiers, e.buckybits&modifier_mask);
+ PUT_SEL32V(segMan, obj, modifiers, curEvent.buckybits&modifier_mask);
}
break;
@@ -137,15 +97,15 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
case SCI_EVT_MOUSE_PRESS:
// track left buttton clicks, if requested
- if (e.type == SCI_EVT_MOUSE_PRESS && e.data == 1 && g_debug_track_mouse_clicks) {
+ if (curEvent.type == SCI_EVT_MOUSE_PRESS && curEvent.data == 1 && g_debug_track_mouse_clicks) {
((SciEngine *)g_engine)->getSciDebugger()->DebugPrintf("Mouse clicked at %d, %d\n",
mousePos.x, mousePos.y);
}
- if (mask & e.type) {
+ if (mask & curEvent.type) {
int extra_bits = 0;
- switch (e.data) {
+ switch (curEvent.data) {
case 2:
extra_bits = SCI_EVM_LSHIFT | SCI_EVM_RSHIFT;
break;
@@ -155,9 +115,9 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
break;
}
- PUT_SEL32V(segMan, obj, type, e.type);
+ PUT_SEL32V(segMan, obj, type, curEvent.type);
PUT_SEL32V(segMan, obj, message, 0);
- PUT_SEL32V(segMan, obj, modifiers, (e.buckybits | extra_bits)&modifier_mask);
+ PUT_SEL32V(segMan, obj, modifiers, (curEvent.buckybits | extra_bits)&modifier_mask);
s->r_acc = make_reg(0, 1);
}
break;
@@ -172,7 +132,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
// A SCI event occured, and we have been asked to stop, so open the debug console
Console *con = ((Sci::SciEngine*)g_engine)->getSciDebugger();
con->DebugPrintf("SCI event occured: ");
- switch (e.type) {
+ switch (curEvent.type) {
case SCI_EVT_QUIT:
con->DebugPrintf("quit event\n");
break;
@@ -184,7 +144,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
con->DebugPrintf("mouse click event\n");
break;
default:
- con->DebugPrintf("unknown or no event (event type %d)\n", e.type);
+ con->DebugPrintf("unknown or no event (event type %d)\n", curEvent.type);
}
con->attach();
diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp
index 41c36a8bc3..bbf4cf72d5 100644
--- a/engines/sci/engine/kmisc.cpp
+++ b/engines/sci/engine/kmisc.cpp
@@ -27,6 +27,7 @@
#include "sci/sci.h"
#include "sci/debug.h"
+#include "sci/event.h"
#include "sci/engine/state.h"
#include "sci/engine/kernel.h"
#include "sci/engine/gc.h"
@@ -44,8 +45,6 @@ reg_t kRestartGame(EngineState *s, int argc, reg_t *argv) {
return NULL_REG;
}
-void gfxop_sleep(GfxState *gfx, uint32 duration);
-
/* kGameIsRestarting():
** Returns the restarting_flag in acc
*/
@@ -69,7 +68,7 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) {
uint32 neededSleep = 30;
if (duration < neededSleep) {
- gfxop_sleep(s->gfx_state, neededSleep - duration);
+ kernel_sleep(s->_event, neededSleep - duration);
s->_lastAnimateTime = g_system->getMillis();
} else {
s->_lastAnimateTime = curTime;
diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h
index 486f5cda87..7e78867cf3 100644
--- a/engines/sci/engine/state.h
+++ b/engines/sci/engine/state.h
@@ -48,6 +48,7 @@ namespace Common {
namespace Sci {
+class SciEvent;
class Menubar;
class SciGui;
class SciGuiCursor;
@@ -143,6 +144,8 @@ public:
SciGui *_gui; /* Currently active Gui */
+ SciEvent *_event; // Event handling
+
GfxState *gfx_state; /**< Graphics state and driver */
AudioPlayer *_audio;