2009-02-17 15:02:16 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-05-13 16:52:41 +00:00
|
|
|
#include "sci/sci.h"
|
2009-02-27 02:23:40 +00:00
|
|
|
#include "sci/engine/state.h"
|
2009-02-24 05:51:55 +00:00
|
|
|
#include "sci/engine/kernel.h"
|
2009-10-28 13:20:30 +00:00
|
|
|
#include "sci/gfx/operations.h"
|
2009-06-04 11:28:05 +00:00
|
|
|
#include "sci/console.h"
|
|
|
|
#include "sci/debug.h" // for g_debug_simulated_key
|
2009-10-04 22:43:30 +00:00
|
|
|
#include "sci/gui/gui.h"
|
2009-10-07 21:29:47 +00:00
|
|
|
#include "sci/gui/gui_cursor.h"
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-21 10:23:36 +00:00
|
|
|
namespace Sci {
|
|
|
|
|
2009-02-15 06:10:59 +00:00
|
|
|
#define SCI_VARIABLE_GAME_SPEED 3
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) {
|
2009-06-07 15:53:30 +00:00
|
|
|
int mask = argv[0].toUint16();
|
2009-02-15 06:10:59 +00:00
|
|
|
reg_t obj = argv[1];
|
|
|
|
sci_event_t e;
|
|
|
|
int oldx, oldy;
|
2009-09-23 10:55:35 +00:00
|
|
|
int modifier_mask = getSciVersion() <= SCI_VERSION_01 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK;
|
2009-10-04 18:38:18 +00:00
|
|
|
SegManager *segMan = s->_segMan;
|
2009-11-04 12:19:05 +00:00
|
|
|
const Common::Point mousePos = s->_gui->getCursorPos();
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-19 18:40:03 +00:00
|
|
|
// If there's a simkey pending, and the game wants a keyboard event, use the
|
|
|
|
// simkey instead of a normal event
|
2009-06-04 11:28:05 +00:00
|
|
|
if (g_debug_simulated_key && (mask & SCI_EVT_KEYBOARD)) {
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, type, SCI_EVT_KEYBOARD); // Keyboard event
|
|
|
|
PUT_SEL32V(segMan, obj, message, g_debug_simulated_key);
|
|
|
|
PUT_SEL32V(segMan, obj, modifiers, SCI_EVM_NUMLOCK); // Numlock on
|
|
|
|
PUT_SEL32V(segMan, obj, x, mousePos.x);
|
|
|
|
PUT_SEL32V(segMan, obj, y, mousePos.y);
|
2009-06-04 11:28:05 +00:00
|
|
|
g_debug_simulated_key = 0;
|
2009-02-15 06:10:59 +00:00
|
|
|
return make_reg(0, 1);
|
|
|
|
}
|
2009-02-15 22:28:12 +00:00
|
|
|
|
2009-10-07 21:29:47 +00:00
|
|
|
oldx = mousePos.x;
|
|
|
|
oldy = mousePos.y;
|
2009-02-15 06:10:59 +00:00
|
|
|
e = gfxop_get_event(s->gfx_state, mask);
|
|
|
|
|
2009-02-19 18:40:03 +00:00
|
|
|
s->parser_event = NULL_REG; // Invalidate parser event
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, x, mousePos.x);
|
|
|
|
PUT_SEL32V(segMan, obj, y, mousePos.y);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-10-07 21:29:47 +00:00
|
|
|
//s->_gui->moveCursor(s->gfx_state->pointer_pos.x, s->gfx_state->pointer_pos.y);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-15 22:28:12 +00:00
|
|
|
switch (e.type) {
|
|
|
|
case SCI_EVT_QUIT:
|
|
|
|
quit_vm();
|
|
|
|
break;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-26 02:21:55 +00:00
|
|
|
case SCI_EVT_KEYBOARD:
|
2009-02-19 18:40:03 +00:00
|
|
|
if ((e.buckybits & SCI_EVM_LSHIFT) && (e.buckybits & SCI_EVM_RSHIFT) && (e.data == '-')) {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Debug mode activated\n");
|
2009-09-17 13:21:19 +00:00
|
|
|
g_debugState.seeking = kDebugSeekNothing;
|
|
|
|
g_debugState.runningStep = 0;
|
2009-02-15 22:28:12 +00:00
|
|
|
} else if ((e.buckybits & SCI_EVM_CTRL) && (e.data == '`')) {
|
2009-07-06 10:39:22 +00:00
|
|
|
printf("Debug mode activated\n");
|
2009-09-17 13:21:19 +00:00
|
|
|
g_debugState.seeking = kDebugSeekNothing;
|
|
|
|
g_debugState.runningStep = 0;
|
2009-02-15 22:28:12 +00:00
|
|
|
} else {
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, type, SCI_EVT_KEYBOARD); // Keyboard event
|
2009-02-15 22:28:12 +00:00
|
|
|
s->r_acc = make_reg(0, 1);
|
2009-12-04 13:49:43 +00:00
|
|
|
|
2009-12-04 14:32:32 +00:00
|
|
|
// 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...
|
2009-12-04 13:49:43 +00:00
|
|
|
if ((e.character >= 97) && (e.character <= 121)) {
|
|
|
|
e.character -= 96; // 'a' -> 0x01, etc.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, message, e.character);
|
2009-12-04 13:49:43 +00:00
|
|
|
// We only care about the translated character
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, modifiers, e.buckybits&modifier_mask);
|
2009-02-15 22:28:12 +00:00
|
|
|
}
|
2009-02-26 02:21:55 +00:00
|
|
|
break;
|
2009-02-15 22:28:12 +00:00
|
|
|
|
|
|
|
case SCI_EVT_MOUSE_RELEASE:
|
2009-10-07 22:45:50 +00:00
|
|
|
case SCI_EVT_MOUSE_PRESS:
|
2009-02-15 22:28:12 +00:00
|
|
|
|
2009-05-30 20:01:43 +00:00
|
|
|
// track left buttton clicks, if requested
|
2009-06-04 11:28:05 +00:00
|
|
|
if (e.type == SCI_EVT_MOUSE_PRESS && e.data == 1 && g_debug_track_mouse_clicks) {
|
2009-07-03 14:22:50 +00:00
|
|
|
((SciEngine *)g_engine)->getSciDebugger()->DebugPrintf("Mouse clicked at %d, %d\n",
|
2009-10-07 21:29:47 +00:00
|
|
|
mousePos.x, mousePos.y);
|
2009-05-30 20:01:43 +00:00
|
|
|
}
|
|
|
|
|
2009-02-15 22:28:12 +00:00
|
|
|
if (mask & e.type) {
|
2009-10-07 22:45:50 +00:00
|
|
|
int extra_bits = 0;
|
|
|
|
|
2009-02-15 22:28:12 +00:00
|
|
|
switch (e.data) {
|
|
|
|
case 2:
|
|
|
|
extra_bits = SCI_EVM_LSHIFT | SCI_EVM_RSHIFT;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
extra_bits = SCI_EVM_CTRL;
|
|
|
|
default:
|
|
|
|
break;
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, type, e.type);
|
|
|
|
PUT_SEL32V(segMan, obj, message, 0);
|
|
|
|
PUT_SEL32V(segMan, obj, modifiers, (e.buckybits | extra_bits)&modifier_mask);
|
2009-02-15 22:28:12 +00:00
|
|
|
s->r_acc = make_reg(0, 1);
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
2009-02-26 02:21:55 +00:00
|
|
|
break;
|
2009-02-15 22:28:12 +00:00
|
|
|
|
2009-02-26 02:21:55 +00:00
|
|
|
default:
|
2009-02-19 18:40:03 +00:00
|
|
|
s->r_acc = NULL_REG; // Unknown or no event
|
2009-02-15 22:28:12 +00:00
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-09-17 13:21:19 +00:00
|
|
|
if ((s->r_acc.offset) && (g_debugState.stopOnEvent)) {
|
|
|
|
g_debugState.stopOnEvent = false;
|
2009-06-06 16:43:13 +00:00
|
|
|
|
|
|
|
// A SCI event occured, and we have been asked to stop, so open the debug console
|
2009-07-03 14:22:50 +00:00
|
|
|
Console *con = ((Sci::SciEngine*)g_engine)->getSciDebugger();
|
2009-06-06 16:43:13 +00:00
|
|
|
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();
|
2009-02-15 22:28:12 +00:00
|
|
|
}
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
return s->r_acc;
|
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kMapKeyToDir(EngineState *s, int argc, reg_t *argv) {
|
2009-02-15 06:10:59 +00:00
|
|
|
reg_t obj = argv[0];
|
2009-10-04 18:38:18 +00:00
|
|
|
SegManager *segMan = s->_segMan;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-10-18 19:42:56 +00:00
|
|
|
if (GET_SEL32V(segMan, obj, type) == SCI_EVT_KEYBOARD) { // Keyboard
|
2009-02-15 06:10:59 +00:00
|
|
|
int mover = -1;
|
2009-10-18 19:42:56 +00:00
|
|
|
switch (GET_SEL32V(segMan, obj, message)) {
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_HOME:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 8;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_UP:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 1;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_PGUP:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 2;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_LEFT:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 7;
|
|
|
|
break;
|
2009-02-15 06:10:59 +00:00
|
|
|
case SCI_K_CENTER:
|
2009-02-15 22:28:12 +00:00
|
|
|
case 76:
|
|
|
|
mover = 0;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_RIGHT:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 3;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_END:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 6;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_DOWN:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 5;
|
|
|
|
break;
|
2009-02-25 19:52:17 +00:00
|
|
|
case SCI_K_PGDOWN:
|
2009-02-15 22:28:12 +00:00
|
|
|
mover = 4;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (mover >= 0) {
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, type, SCI_EVT_JOYSTICK);
|
|
|
|
PUT_SEL32V(segMan, obj, message, mover);
|
2009-02-15 06:10:59 +00:00
|
|
|
return make_reg(0, 1);
|
2009-02-26 02:21:55 +00:00
|
|
|
} else
|
|
|
|
return NULL_REG;
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return s->r_acc;
|
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kGlobalToLocal(EngineState *s, int argc, reg_t *argv) {
|
2009-02-19 18:40:03 +00:00
|
|
|
reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars
|
2009-10-04 18:38:18 +00:00
|
|
|
SegManager *segMan = s->_segMan;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
if (obj.segment) {
|
2009-10-18 19:42:56 +00:00
|
|
|
int16 x = GET_SEL32V(segMan, obj, x);
|
|
|
|
int16 y = GET_SEL32V(segMan, obj, y);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-10-07 21:29:47 +00:00
|
|
|
s->_gui->globalToLocal(&x, &y);
|
2009-10-03 20:49:18 +00:00
|
|
|
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, x, x);
|
|
|
|
PUT_SEL32V(segMan, obj, y, y);
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return s->r_acc;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kLocalToGlobal(EngineState *s, int argc, reg_t *argv) {
|
2009-02-19 18:40:03 +00:00
|
|
|
reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars
|
2009-10-04 18:38:18 +00:00
|
|
|
SegManager *segMan = s->_segMan;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
if (obj.segment) {
|
2009-10-18 19:42:56 +00:00
|
|
|
int16 x = GET_SEL32V(segMan, obj, x);
|
|
|
|
int16 y = GET_SEL32V(segMan, obj, y);
|
2009-10-03 20:49:18 +00:00
|
|
|
|
2009-10-07 21:29:47 +00:00
|
|
|
s->_gui->localToGlobal(&x, &y);
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-10-18 19:42:56 +00:00
|
|
|
PUT_SEL32V(segMan, obj, x, x);
|
|
|
|
PUT_SEL32V(segMan, obj, y, y);
|
2009-02-15 06:10:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return s->r_acc;
|
|
|
|
}
|
|
|
|
|
- Changed the unimplemented debug SCI kernel functions (InspectObj, ShowSends, ShowObjs, ShowFree, StackUsage and Profiler) to be dummy functions - we have our own debugger, and don't use these functions for debugging
- Removed the function number parameter from all kernel functions, as it's no longer needed, and removed the FAKE_FUNCT_NR hack
- Removed kUnknown() and kStub()
- Dummy/unknown kernel functions are no longer invoked, and a warning is shown instead, with the paremeters passed to them
Note: there is an evil hack used for debugging scripts in invoke_selector(), which probably no longer works now
svn-id: r44461
2009-09-29 14:24:07 +00:00
|
|
|
reg_t kJoystick(EngineState *s, int argc, reg_t *argv) {
|
2009-05-16 14:24:12 +00:00
|
|
|
// Subfunction 12 sets/gets joystick repeat rate
|
|
|
|
debug(5, "Unimplemented syscall 'Joystick()'");
|
2009-02-15 06:10:59 +00:00
|
|
|
return NULL_REG;
|
|
|
|
}
|
2009-02-21 10:23:36 +00:00
|
|
|
|
|
|
|
} // End of namespace Sci
|