reg_t kGetEvent(state_t *s, int funct_nr, int argc, reg_t *argv) { int mask = UKPV(0); reg_t obj = argv[1]; sci_event_t e; int oldx, oldy; int modifier_mask = SCI_VERSION_MAJOR(s->version)==0 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK; if (s->kernel_opt_flags & KERNEL_OPT_FLAG_GOT_2NDEVENT) { /* Penalty time- too many requests to this function without ** waiting! */ int delay = s->script_000->locals_block->locals[SCI_VARIABLE_GAME_SPEED].offset; gfxop_usleep(s->gfx_state, (1000000 * delay) / 60); } /*If there's a simkey pending, and the game wants a keyboard event, use the *simkey instead of a normal event*/ if (_kdebug_cheap_event_hack && (mask & SCI_EVT_KEYBOARD)) { PUT_SEL32V(obj, type, SCI_EVT_KEYBOARD); /*Keyboard event*/ PUT_SEL32V(obj, message, _kdebug_cheap_event_hack); PUT_SEL32V(obj, modifiers, SCI_EVM_NUMLOCK); /*Numlock on*/ PUT_SEL32V(obj, x, s->gfx_state->pointer_pos.x); PUT_SEL32V(obj, y, s->gfx_state->pointer_pos.y); _kdebug_cheap_event_hack = 0; return make_reg(0, 1); } oldx = s->gfx_state->pointer_pos.x; oldy = s->gfx_state->pointer_pos.y; e = gfxop_get_event(s->gfx_state, mask); s->parser_event = NULL_REG; /* Invalidate parser event */ PUT_SEL32V(obj, x, s->gfx_state->pointer_pos.x); PUT_SEL32V(obj, y, s->gfx_state->pointer_pos.y); /* gfxop_set_pointer_position(s->gfx_state, gfx_point(s->gfx_state->pointer_pos.x, s->gfx_state->pointer_pos.y)); */ if (e.type) s->kernel_opt_flags &= ~(KERNEL_OPT_FLAG_GOT_EVENT | KERNEL_OPT_FLAG_GOT_2NDEVENT); else { if (s->kernel_opt_flags & KERNEL_OPT_FLAG_GOT_EVENT) s->kernel_opt_flags |= KERNEL_OPT_FLAG_GOT_2NDEVENT; else s->kernel_opt_flags |= KERNEL_OPT_FLAG_GOT_EVENT; } switch(e.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 == '-')) { sciprintf("Debug mode activated\n"); script_debug_flag = 1; /* Enter debug mode */ _debug_seeking = _debug_step_running = 0; s->onscreen_console = 0; } else if ((e.buckybits & SCI_EVM_CTRL) && (e.data == '`')) { script_debug_flag = 1; /* Enter debug mode */ _debug_seeking = _debug_step_running = 0; s->onscreen_console = 1; } else if ((e.buckybits & SCI_EVM_CTRL) && (e.data == '1')) { if (s->visual) s->visual->print(GFXW(s->visual), 0); } else { PUT_SEL32V(obj, type, SCI_EVT_KEYBOARD); /*Keyboard event*/ s->r_acc=make_reg(0, 1); PUT_SEL32V(obj, message, e.character); /* We only care about the translated ** character */ PUT_SEL32V(obj, modifiers, e.buckybits&modifier_mask); } } break; case SCI_EVT_MOUSE_RELEASE: case SCI_EVT_MOUSE_PRESS: { int extra_bits=0; if(mask & e.type) { switch(e.data) { case 2: extra_bits=SCI_EVM_LSHIFT|SCI_EVM_RSHIFT; break; case 3: extra_bits=SCI_EVM_CTRL; default:break; } PUT_SEL32V(obj, type, e.type); PUT_SEL32V(obj, message, 1); PUT_SEL32V(obj, modifiers, (e.buckybits|extra_bits)&modifier_mask); s->r_acc = make_reg(0, 1); } } break; default: { s->r_acc = NULL_REG; /* Unknown or no event */ } } if ((s->r_acc.offset) && (stop_on_event)) { stop_on_event = 0; script_debug_flag = 1; } return s->r_acc; }
reg_t kGetEvent(EngineState *s, int funct_nr, int argc, reg_t *argv) { int mask = argv[0].toUint16(); reg_t obj = argv[1]; sci_event_t e; int oldx, oldy; int modifier_mask = s->_version <= SCI_VERSION_0 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK; if (s->kernel_opt_flags & KERNEL_OPT_FLAG_GOT_2NDEVENT) { // Penalty time- too many requests to this function without waiting! int delay = s->script_000->locals_block->_locals[SCI_VARIABLE_GAME_SPEED].offset; gfxop_sleep(s->gfx_state, delay * 1000 / 60); } // If there's a simkey pending, and the game wants a keyboard event, use the // simkey instead of a normal event if (g_debug_simulated_key && (mask & SCI_EVT_KEYBOARD)) { PUT_SEL32V(obj, type, SCI_EVT_KEYBOARD); // Keyboard event PUT_SEL32V(obj, message, g_debug_simulated_key); PUT_SEL32V(obj, modifiers, SCI_EVM_NUMLOCK); // Numlock on PUT_SEL32V(obj, x, s->gfx_state->pointer_pos.x); PUT_SEL32V(obj, y, s->gfx_state->pointer_pos.y); g_debug_simulated_key = 0; return make_reg(0, 1); } oldx = s->gfx_state->pointer_pos.x; oldy = s->gfx_state->pointer_pos.y; e = gfxop_get_event(s->gfx_state, mask); s->parser_event = NULL_REG; // Invalidate parser event PUT_SEL32V(obj, x, s->gfx_state->pointer_pos.x); PUT_SEL32V(obj, y, s->gfx_state->pointer_pos.y); //gfxop_set_pointer_position(s->gfx_state, Common::Point(s->gfx_state->pointer_pos.x, s->gfx_state->pointer_pos.y)); if (e.type) s->kernel_opt_flags &= ~(KERNEL_OPT_FLAG_GOT_EVENT | KERNEL_OPT_FLAG_GOT_2NDEVENT); else { if (s->kernel_opt_flags & KERNEL_OPT_FLAG_GOT_EVENT) s->kernel_opt_flags |= KERNEL_OPT_FLAG_GOT_2NDEVENT; else s->kernel_opt_flags |= KERNEL_OPT_FLAG_GOT_EVENT; } switch (e.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 == '-')) { printf("Debug mode activated\n"); scriptState.seeking = kDebugSeekNothing; scriptState.runningStep = 0; } else if ((e.buckybits & SCI_EVM_CTRL) && (e.data == '`')) { printf("Debug mode activated\n"); scriptState.seeking = kDebugSeekNothing; scriptState.runningStep = 0; } else { PUT_SEL32V(obj, type, SCI_EVT_KEYBOARD); // Keyboard event s->r_acc = make_reg(0, 1); PUT_SEL32V(obj, message, e.character); // We only care about the translated // character PUT_SEL32V(obj, modifiers, e.buckybits&modifier_mask); } break; case SCI_EVT_MOUSE_RELEASE: case SCI_EVT_MOUSE_PRESS: { int extra_bits = 0; // track left buttton clicks, if requested if (e.type == SCI_EVT_MOUSE_PRESS && e.data == 1 && g_debug_track_mouse_clicks) { ((SciEngine *)g_engine)->getSciDebugger()->DebugPrintf("Mouse clicked at %d, %d\n", s->gfx_state->pointer_pos.x, s->gfx_state->pointer_pos.y); } if (mask & e.type) { switch (e.data) { case 2: extra_bits = SCI_EVM_LSHIFT | SCI_EVM_RSHIFT; break; case 3: extra_bits = SCI_EVM_CTRL; default: break; } PUT_SEL32V(obj, type, e.type); PUT_SEL32V(obj, message, 1); PUT_SEL32V(obj, modifiers, (e.buckybits | extra_bits)&modifier_mask); s->r_acc = make_reg(0, 1); } break; } default: s->r_acc = NULL_REG; // Unknown or no event } if ((s->r_acc.offset) && (scriptState.stopOnEvent)) { scriptState.stopOnEvent = false; // 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) { case SCI_EVT_QUIT: con->DebugPrintf("quit event\n"); break; case SCI_EVT_KEYBOARD: con->DebugPrintf("keyboard event\n"); break; case SCI_EVT_MOUSE_RELEASE: case SCI_EVT_MOUSE_PRESS: con->DebugPrintf("mouse click event\n"); break; default: con->DebugPrintf("unknown or no event (event type %d)\n", e.type); } con->attach(); con->onFrame(); } return s->r_acc; }