TOLTECS: - Hopefully fixed a bug in findRectAtPoint which causes the game to crash before the first scene

- sfHandleInput
This commit is contained in:
Benjamin Haisch 2010-06-18 14:18:44 +00:00 committed by Willem Jan Palenstijn
parent 8ea6831825
commit 2acf1bf6f5
3 changed files with 30 additions and 9 deletions

View File

@ -920,10 +920,12 @@ void ScriptInterpreter::sfSetGuiHeight() {
void ScriptInterpreter::sfFindMouseInRectIndex1() {
int16 index = -1;
if (_vm->_mouseY < _vm->_cameraHeight) {
index = _vm->findRectAtPoint(getSlotData(arg16(5)) + arg16(3),
int16 slotIndex = arg16(5);
index = _vm->findRectAtPoint(getSlotData(slotIndex) + arg16(3),
_vm->_mouseX + _vm->_cameraX,
_vm->_mouseY + _vm->_cameraY,
arg16(11) + 1, arg16(7));
arg16(11) + 1, arg16(7),
getSlotData(slotIndex) + _slots[slotIndex].size);
}
localWrite16(arg16(9), index);
}
@ -932,10 +934,12 @@ void ScriptInterpreter::sfFindMouseInRectIndex2() {
int16 index = -1;
if (_vm->_sceneResIndex != 0) {
if (_vm->_mouseY < _vm->_cameraHeight) {
index = _vm->findRectAtPoint(getSlotData(arg16(5)) + arg16(3),
int16 slotIndex = arg16(5);
index = _vm->findRectAtPoint(getSlotData(slotIndex) + arg16(3),
_vm->_mouseX + _vm->_cameraX,
_vm->_mouseY + _vm->_cameraY,
0, arg16(7));
0, arg16(7),
getSlotData(slotIndex) + _slots[slotIndex].size);
}
}
localWrite16(arg16(9), index);
@ -1066,7 +1070,14 @@ void ScriptInterpreter::sfClearScreen() {
void ScriptInterpreter::sfHandleInput() {
// TODO: Recheck what this does
int16 varOfs = arg16(3);
localWrite16(varOfs, 0);
int16 keyCode = 0;
if (_vm->_rightButtonDown) {
keyCode = 1;
} else {
// TODO: Handle Escape
// TODO: Set keyboard scancode
}
localWrite16(varOfs, keyCode);
}
void ScriptInterpreter::sfRunOptionsScreen() {

View File

@ -245,6 +245,7 @@ void ToltecsEngine::updateScreen() {
//printf("_guiHeight = %d\n", _guiHeight); fflush(stdout);
if (_screen->_guiRefresh && _guiHeight > 0 && _cameraHeight > 0) {
// Update the GUI when needed and it's visible
_system->copyRectToScreen((const byte *)_screen->_frontScreen + _cameraHeight * 640,
640, 0, _cameraHeight, 640, _guiHeight);
_screen->_guiRefresh = false;
@ -263,6 +264,9 @@ void ToltecsEngine::updateInput() {
while (eventMan->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_KEYDOWN:
_keyState = event.kbd;
//debug("key: flags = %02X; keycode = %d", _keyState.flags, _keyState.keycode);
// FIXME: This is just for debugging
switch (event.kbd.keycode) {
@ -276,6 +280,9 @@ void ToltecsEngine::updateInput() {
break;
}
break;
case Common::EVENT_KEYUP:
_keyState.reset();
break;
case Common::EVENT_QUIT:
quitGame();
@ -540,11 +547,12 @@ void ToltecsEngine::walk(byte *walkData) {
}
int16 ToltecsEngine::findRectAtPoint(byte *rectData, int16 x, int16 y, int16 index, int16 itemSize) {
int16 ToltecsEngine::findRectAtPoint(byte *rectData, int16 x, int16 y, int16 index, int16 itemSize,
byte *rectDataEnd) {
rectData += index * itemSize;
while (1) {
while (rectData < rectDataEnd) {
int16 rectY = READ_LE_UINT16(rectData);
if (rectY == -10)
break;

View File

@ -98,7 +98,8 @@ public:
void walk(byte *walkData);
int16 findRectAtPoint(byte *rectData, int16 x, int16 y, int16 index, int16 itemSize);
int16 findRectAtPoint(byte *rectData, int16 x, int16 y, int16 index, int16 itemSize,
byte *rectDataEnd);
public:
@ -130,6 +131,7 @@ public:
int16 _walkSpeedY, _walkSpeedX;
Common::KeyState _keyState;
int16 _mouseX, _mouseY;
int16 _mouseCounter;
bool _mouseButtonPressedFlag;