aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/game_v1.cpp
diff options
context:
space:
mode:
authorSven Hesse2006-06-29 12:55:57 +0000
committerSven Hesse2006-06-29 12:55:57 +0000
commit27a8b8a255478ebe76fb616e7d5dba0b8f433dce (patch)
treeb89a6172d493552179273241322c75e88206c115 /engines/gob/game_v1.cpp
parent221afd715a0806405de3e86bc30323a208096cc7 (diff)
downloadscummvm-rg350-27a8b8a255478ebe76fb616e7d5dba0b8f433dce.tar.gz
scummvm-rg350-27a8b8a255478ebe76fb616e7d5dba0b8f433dce.tar.bz2
scummvm-rg350-27a8b8a255478ebe76fb616e7d5dba0b8f433dce.zip
- Renamed a few mult-variables to something more fitting
- Fixed a small mistake, making the entering animation work - Correcting Game_v2::playTot() so that the loading screen is shown - Updated most of the collisions stuff, the objects names hint stuff works now svn-id: r23346
Diffstat (limited to 'engines/gob/game_v1.cpp')
-rw-r--r--engines/gob/game_v1.cpp744
1 files changed, 743 insertions, 1 deletions
diff --git a/engines/gob/game_v1.cpp b/engines/gob/game_v1.cpp
index 3bbb59a873..053061f2ba 100644
--- a/engines/gob/game_v1.cpp
+++ b/engines/gob/game_v1.cpp
@@ -59,6 +59,9 @@ void Game_v1::playTot(int16 skipPlay) {
char *savedIP;
int16 i;
+ if (skipPlay < 0)
+ skipPlay = 0;
+
oldNestLevel = _vm->_inter->_nestLevel;
oldBreakFrom = _vm->_inter->_breakFromLevel;
oldCaptureCounter = _vm->_scenery->_pCaptureCounter;
@@ -83,7 +86,7 @@ void Game_v1::playTot(int16 skipPlay) {
else
_vm->_cdrom->stopPlaying();
_vm->_draw->animateCursor(4);
- _vm->_inter->initControlVars();
+ _vm->_inter->initControlVars(1);
_vm->_mult->initAll();
_vm->_mult->zeroMultData();
@@ -627,4 +630,743 @@ void Game_v1::prepareStart(void) {
_startTimeKey = _vm->_util->getTimeKey();
}
+void Game_v1::collisionsBlock(void) {
+ InputDesc descArray[20];
+ int16 array[250];
+ char count;
+ int16 collResId;
+ char *startIP;
+ int16 curCmd;
+ int16 cmd;
+ int16 cmdHigh;
+ int16 key;
+ int16 flags;
+ int16 left;
+ int16 top;
+ int16 width;
+ int16 height;
+ int16 var_22;
+ int16 index;
+ int16 curEditIndex;
+ int16 deltaTime;
+ int16 descIndex2;
+ int16 stackPos2;
+ int16 descIndex;
+ int16 timeVal;
+ char *str;
+ int16 savedCollStackSize;
+ int16 i;
+ int16 counter;
+ int16 var_24;
+ int16 var_26;
+ int16 _collStackPos;
+ Collision *collPtr;
+ int16 timeKey;
+ char *savedIP;
+
+ if (_shouldPushColls)
+ pushCollisions(1);
+
+ collResId = -1;
+ _vm->_global->_inter_execPtr++;
+ count = *_vm->_global->_inter_execPtr++;
+ _handleMouse = _vm->_global->_inter_execPtr[0];
+ deltaTime = 1000 * (byte)_vm->_global->_inter_execPtr[1];
+ descIndex2 = (byte)_vm->_global->_inter_execPtr[2];
+ stackPos2 = (byte)_vm->_global->_inter_execPtr[3];
+ descIndex = (byte)_vm->_global->_inter_execPtr[4];
+
+ if (stackPos2 != 0 || descIndex != 0)
+ deltaTime /= 100;
+
+ timeVal = deltaTime;
+ _vm->_global->_inter_execPtr += 6;
+
+ startIP = _vm->_global->_inter_execPtr;
+ WRITE_VAR(16, 0);
+ var_22 = 0;
+ index = 0;
+ curEditIndex = 0;
+
+ for (curCmd = 0; curCmd < count; curCmd++) {
+ array[curCmd] = 0;
+ cmd = *_vm->_global->_inter_execPtr++;
+
+ if ((cmd & 0x40) != 0) {
+ cmd -= 0x40;
+ cmdHigh = (byte)*_vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr++;
+ cmdHigh <<= 8;
+ } else {
+ cmdHigh = 0;
+ }
+
+ if ((cmd & 0x80) != 0) {
+ left = _vm->_parse->parseValExpr();
+ top = _vm->_parse->parseValExpr();
+ width = _vm->_parse->parseValExpr();
+ height = _vm->_parse->parseValExpr();
+ } else {
+ left = _vm->_inter->load16();
+ top = _vm->_inter->load16();
+ width = _vm->_inter->load16();
+ height = _vm->_inter->load16();
+ }
+ cmd &= 0x7f;
+
+ debugC(1, DEBUG_COLLISIONS, "collisionsBlock(%d)", cmd);
+
+ switch (cmd) {
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+
+ _vm->_util->waitKey();
+ var_22 = 1;
+ key = _vm->_parse->parseVarIndex();
+ descArray[index].fontIndex = _vm->_inter->load16();
+ descArray[index].backColor = *_vm->_global->_inter_execPtr++;
+ descArray[index].frontColor = *_vm->_global->_inter_execPtr++;
+
+ if (cmd < 5 || cmd > 8) {
+ descArray[index].ptr = 0;
+ } else {
+ descArray[index].ptr = _vm->_global->_inter_execPtr + 2;
+ _vm->_global->_inter_execPtr += _vm->_inter->load16();
+ }
+
+ if (left == -1)
+ break;
+
+ if ((cmd & 1) == 0) {
+ addNewCollision(curCmd + 0x8000, left,
+ top,
+ left +
+ width *
+ _vm->_draw->_fonts[descArray[index].fontIndex]->
+ itemWidth - 1, top + height - 1, cmd, key,
+ 0,
+ _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ } else {
+ addNewCollision(curCmd + 0x8000, left,
+ top,
+ left +
+ width *
+ _vm->_draw->_fonts[descArray[index].fontIndex]->
+ itemWidth - 1, top + height - 1, cmd, key,
+ 0, 0);
+ }
+ index++;
+ break;
+
+ case 21:
+ key = _vm->_inter->load16();
+ array[curCmd] = _vm->_inter->load16();
+ flags = _vm->_inter->load16() & 3;
+
+ addNewCollision(curCmd + 0x8000, left, top,
+ left + width - 1,
+ top + height - 1,
+ (flags << 4) + cmdHigh + 2, key,
+ _vm->_global->_inter_execPtr - (char *)_totFileData, 0);
+
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ break;
+
+ case 20:
+ collResId = curCmd;
+ // Fall through to case 2
+
+ case 2:
+ key = _vm->_inter->load16();
+ array[curCmd] = _vm->_inter->load16();
+ flags = _vm->_inter->load16() & 3;
+
+ addNewCollision(curCmd + 0x8000, left, top,
+ left + width - 1,
+ top + height - 1,
+ (flags << 4) + cmdHigh + 2, key, 0,
+ _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ break;
+
+ case 0:
+ _vm->_global->_inter_execPtr += 6;
+ startIP = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ key = curCmd + 0xA000;
+
+ addNewCollision(curCmd + 0x8000, left, top,
+ left + width - 1,
+ top + height - 1,
+ cmd + cmdHigh, key,
+ startIP - (char *)_totFileData,
+ _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ break;
+
+ case 1:
+ key = _vm->_inter->load16();
+ array[curCmd] = _vm->_inter->load16();
+ flags = _vm->_inter->load16() & 3;
+
+ startIP = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ if (key == 0)
+ key = curCmd + 0xa000;
+
+ addNewCollision(curCmd + 0x8000, left, top,
+ left + width - 1,
+ top + height - 1,
+ (flags << 4) + cmd + cmdHigh, key,
+ startIP - (char *)_totFileData,
+ _vm->_global->_inter_execPtr - (char *)_totFileData);
+
+ _vm->_global->_inter_execPtr += 2;
+ _vm->_global->_inter_execPtr += READ_LE_UINT16(_vm->_global->_inter_execPtr);
+ break;
+ }
+ }
+
+ _forceHandleMouse = 0;
+ _vm->_util->waitKey();
+
+ do {
+ if (var_22 != 0) {
+ key =
+ multiEdit(deltaTime, index, &curEditIndex,
+ descArray, 0, 0);
+
+ if (key == 0x1c0d) {
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].id & 0x8000) == 0)
+ continue;
+
+ if ((_collisionAreas[i].flags & 1) != 0)
+ continue;
+
+ if ((_collisionAreas[i].flags & 0x0f) <= 2)
+ continue;
+
+ collResId = _collisionAreas[i].id;
+ _activeCollResId = collResId;
+ collResId &= 0x7fff;
+ _activeCollIndex = i;
+ break;
+ }
+ break;
+ }
+ } else {
+ key =
+ checkCollisions(_handleMouse, -deltaTime,
+ &_activeCollResId, &_activeCollIndex);
+ }
+
+ if ((key & 0xff) >= ' ' && (key & 0xff) <= 0xff &&
+ (key >> 8) > 1 && (key >> 8) < 12) {
+ key = '0' + (((key >> 8) - 1) % 10) + (key & 0xff00);
+ }
+
+ if (_activeCollResId == 0) {
+ if (key != 0) {
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].
+ id & 0x8000) == 0)
+ continue;
+
+ if (_collisionAreas[i].key == key
+ || _collisionAreas[i].key ==
+ 0x7fff) {
+
+ _activeCollResId =
+ _collisionAreas[i].id;
+ _activeCollIndex = i;
+ break;
+ }
+ }
+
+ if (_activeCollResId == 0) {
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].id & 0x8000) == 0)
+ continue;
+
+ if ((_collisionAreas[i].key & 0xff00) != 0)
+ continue;
+
+ if (_collisionAreas[i].key == 0)
+ continue;
+
+ if (adjustKey(key & 0xff) == adjustKey(_collisionAreas[i].key) || _collisionAreas[i].key == 0x7fff) {
+ _activeCollResId = _collisionAreas[i].id;
+ _activeCollIndex = i;
+ break;
+ }
+ }
+ }
+ } else {
+
+ if (deltaTime != 0 && VAR(16) == 0) {
+ if (stackPos2 != 0) {
+ _collStackPos = 0;
+ collPtr = _collisionAreas;
+
+ for (i = 0, collPtr = _collisionAreas; collPtr->left != -1; i++, collPtr++) {
+ if ((collPtr->id & 0x8000) == 0)
+ continue;
+
+ _collStackPos++;
+ if (_collStackPos != stackPos2)
+ continue;
+
+ _activeCollResId = collPtr->id;
+ _activeCollIndex = i;
+ WRITE_VAR(2, _vm->_global->_inter_mouseX);
+ WRITE_VAR(3, _vm->_global->_inter_mouseY);
+ WRITE_VAR(4, _mouseButtons);
+ WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
+
+ if (collPtr->funcLeave != 0) {
+ timeKey = _vm->_util->getTimeKey();
+ savedIP = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr = (char *)_totFileData + collPtr->funcLeave;
+ _shouldPushColls = 1;
+ savedCollStackSize = _collStackSize;
+ _vm->_inter->funcBlock(0);
+
+ if (savedCollStackSize != _collStackSize)
+ popCollisions();
+
+ _shouldPushColls = 0;
+ _vm->_global->_inter_execPtr = savedIP;
+ deltaTime = timeVal - (_vm->_util->getTimeKey() - timeKey);
+
+ if (deltaTime < 2)
+ deltaTime = 2;
+ }
+
+ if (VAR(16) == 0)
+ _activeCollResId = 0;
+ break;
+ }
+ } else {
+ if (descIndex != 0) {
+ counter = 0;
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].id & 0x8000) == 0)
+ continue;
+
+ counter++;
+ if (counter != descIndex)
+ continue;
+
+ _activeCollResId = _collisionAreas[i].id;
+ _activeCollIndex = i;
+ break;
+ }
+ } else {
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].id & 0x8000) == 0)
+ continue;
+
+ _activeCollResId = _collisionAreas[i].id;
+ _activeCollIndex = i;
+ break;
+ }
+ }
+ }
+ } else {
+ if (descIndex2 != 0) {
+ counter = 0;
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].id & 0x8000) == 0)
+ continue;
+
+ counter++;
+ if (counter != descIndex2)
+ continue;
+
+ _activeCollResId = _collisionAreas[i].id;
+ _activeCollIndex = i;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (_activeCollResId == 0)
+ continue;
+
+ if (_collisionAreas[_activeCollIndex].funcLeave != 0)
+ continue;
+
+ WRITE_VAR(2, _vm->_global->_inter_mouseX);
+ WRITE_VAR(3, _vm->_global->_inter_mouseY);
+ WRITE_VAR(4, _mouseButtons);
+ WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
+
+ if (_collisionAreas[_activeCollIndex].funcEnter != 0) {
+ savedIP = _vm->_global->_inter_execPtr;
+ _vm->_global->_inter_execPtr = (char *)_totFileData +
+ _collisionAreas[_activeCollIndex].
+ funcEnter;
+
+ _shouldPushColls = 1;
+
+ _collStackPos = _collStackSize;
+ _vm->_inter->funcBlock(0);
+ if (_collStackPos != _collStackSize)
+ popCollisions();
+ _shouldPushColls = 0;
+ _vm->_global->_inter_execPtr = savedIP;
+ }
+
+ WRITE_VAR(16, 0);
+ _activeCollResId = 0;
+ }
+ while (_activeCollResId == 0 && !_vm->_inter->_terminate && !_vm->_quitRequested);
+
+ if (((uint16)_activeCollResId & ~0x8000) == collResId) {
+ _collStackPos = 0;
+ var_24 = 0;
+ var_26 = 1;
+ for (i = 0; i < 250; i++) {
+ if (_collisionAreas[i].left == -1)
+ continue;
+
+ if ((_collisionAreas[i].id & 0x8000) == 0)
+ continue;
+
+ if ((_collisionAreas[i].flags & 0x0f) < 3)
+ continue;
+
+ if ((_collisionAreas[i].flags & 0x0f) > 10)
+ continue;
+
+ if ((_collisionAreas[i].flags & 0x0f) > 8) {
+ char *ptr;
+ strcpy(_tempStr,
+ _vm->_global->_inter_variables + _collisionAreas[i].key);
+ while ((ptr = strchr(_tempStr, ' ')) != 0) {
+ _vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
+ ptr = strchr(_tempStr, ' ');
+ }
+ strcpy(_vm->_global->_inter_variables + _collisionAreas[i].key, _tempStr);
+ }
+
+ if ((_collisionAreas[i].flags & 0x0f) >= 5 &&
+ (_collisionAreas[i].flags & 0x0f) <= 8) {
+ str = descArray[var_24].ptr;
+
+ strcpy(_tempStr, _vm->_global->_inter_variables + _collisionAreas[i].key);
+
+ if ((_collisionAreas[i].flags & 0x0f) < 7)
+ _vm->_util->prepareStr(_tempStr);
+
+ int16 pos = 0;
+ do {
+ strcpy(_collStr, str);
+ pos += strlen(str) + 1;
+
+ str += strlen(str) + 1;
+
+ if ((_collisionAreas[i].flags & 0x0f) < 7)
+ _vm->_util->prepareStr(_collStr);
+
+ if (strcmp(_tempStr, _collStr) == 0) {
+ VAR(17)++;
+ WRITE_VAR(17 + var_26, 1);
+ break;
+ }
+ } while (READ_LE_UINT16(descArray[var_24].ptr - 2) > pos);
+ _collStackPos++;
+ } else {
+ VAR(17 + var_26) = 2;
+ }
+ var_24++;
+ var_26++;
+ }
+
+ if (_collStackPos != (int16)VAR(17))
+ WRITE_VAR(17, 0);
+ else
+ WRITE_VAR(17, 1);
+ }
+
+ savedIP = 0;
+ if (!_vm->_inter->_terminate) {
+ savedIP = (char *)_totFileData +
+ _collisionAreas[_activeCollIndex].funcLeave;
+
+ WRITE_VAR(2, _vm->_global->_inter_mouseX);
+ WRITE_VAR(3, _vm->_global->_inter_mouseY);
+ WRITE_VAR(4, _mouseButtons);
+
+ if (VAR(16) == 0) {
+ WRITE_VAR(16, array[(uint16)_activeCollResId & ~0x8000]);
+ }
+ }
+
+ for (curCmd = 0; curCmd < count; curCmd++) {
+ freeCollision(curCmd + 0x8000);
+ }
+ _vm->_global->_inter_execPtr = savedIP;
+}
+
+int16 Game_v1::multiEdit(int16 time, int16 index, int16 *pCurPos, InputDesc * inpDesc,
+ int16 *collResId, int16 *collIndex) {
+ Collision *collArea;
+ int16 descInd;
+ int16 key;
+ int16 found = -1;
+ int16 i;
+
+ descInd = 0;
+ for (i = 0; i < 250; i++) {
+ collArea = &_collisionAreas[i];
+
+ if (collArea->left == -1)
+ continue;
+
+ if ((collArea->id & 0x8000) == 0)
+ continue;
+
+ if ((collArea->flags & 0x0f) < 3)
+ continue;
+
+ if ((collArea->flags & 0x0f) > 10)
+ continue;
+
+ strcpy(_tempStr, _vm->_global->_inter_variables + collArea->key);
+
+ _vm->_draw->_destSpriteX = collArea->left;
+ _vm->_draw->_destSpriteY = collArea->top;
+ _vm->_draw->_spriteRight = collArea->right - collArea->left + 1;
+ _vm->_draw->_spriteBottom = collArea->bottom - collArea->top + 1;
+
+ _vm->_draw->_destSurface = 21;
+
+ _vm->_draw->_backColor = inpDesc[descInd].backColor;
+ _vm->_draw->_frontColor = inpDesc[descInd].frontColor;
+ _vm->_draw->_textToPrint = _tempStr;
+ _vm->_draw->_transparency = 1;
+ _vm->_draw->_fontIndex = inpDesc[descInd].fontIndex;
+ _vm->_draw->spriteOperation(DRAW_FILLRECT);
+ _vm->_draw->_destSpriteY +=
+ ((collArea->bottom - collArea->top + 1) - 8) / 2;
+
+ _vm->_draw->spriteOperation(DRAW_PRINTTEXT);
+ descInd++;
+ }
+
+ for (i = 0; i < 40; i++) {
+ WRITE_VAR_OFFSET(i * 4 + 0x44, 0);
+ }
+
+ while (1) {
+ descInd = 0;
+
+ for (i = 0; i < 250; i++) {
+ collArea = &_collisionAreas[i];
+
+ if (collArea->left == -1)
+ continue;
+
+ if ((collArea->id & 0x8000) == 0)
+ continue;
+
+ if ((collArea->flags & 0x0f) < 3)
+ continue;
+
+ if ((collArea->flags & 0x0f) > 10)
+ continue;
+
+ if (descInd == *pCurPos) {
+ found = i;
+ break;
+ }
+
+ descInd++;
+ }
+
+ assert(found != -1);
+
+ collArea = &_collisionAreas[found];
+
+ key = inputArea(collArea->left, collArea->top,
+ collArea->right - collArea->left + 1,
+ collArea->bottom - collArea->top + 1,
+ inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
+ _vm->_global->_inter_variables + collArea->key,
+ inpDesc[*pCurPos].fontIndex, collArea->flags, &time);
+
+ if (_vm->_inter->_terminate)
+ return 0;
+
+ switch (key) {
+ case 0:
+ if (_activeCollResId == 0)
+ return 0;
+
+ if ((_collisionAreas[_activeCollIndex].
+ flags & 0x0f) < 3)
+ return 0;
+
+ if ((_collisionAreas[_activeCollIndex].
+ flags & 0x0f) > 10)
+ return 0;
+
+ *pCurPos = 0;
+ for (i = 0; i < 250; i++) {
+ collArea = &_collisionAreas[i];
+
+ if (collArea->left == -1)
+ continue;
+
+ if ((collArea->id & 0x8000) == 0)
+ continue;
+
+ if ((collArea->flags & 0x0f) < 3)
+ continue;
+
+ if ((collArea->flags & 0x0f) > 10)
+ continue;
+
+ if (i == _activeCollIndex)
+ break;
+
+ pCurPos[0]++;
+ }
+ break;
+
+ case 0x3b00:
+ case 0x3c00:
+ case 0x3d00:
+ case 0x3e00:
+ case 0x3f00:
+ case 0x4000:
+ case 0x4100:
+ case 0x4200:
+ case 0x4300:
+ case 0x4400:
+ return key;
+
+ case 0x1c0d:
+
+ if (index == 1)
+ return key;
+
+ if (*pCurPos == index - 1) {
+ *pCurPos = 0;
+ break;
+ }
+
+ pCurPos[0]++;
+ break;
+
+ case 0x5000:
+ if (index - 1 > *pCurPos)
+ pCurPos[0]++;
+ break;
+
+ case 0x4800:
+ if (*pCurPos > 0)
+ pCurPos[0]--;
+ break;
+ }
+ }
+}
+
+int16 Game_v1::checkMousePoint(int16 all, int16 *resId, int16 *resIndex) {
+ Collision *ptr;
+ int16 i;
+
+ if (resId != 0)
+ *resId = 0;
+
+ *resIndex = 0;
+
+ ptr = _collisionAreas;
+ for (i = 0; ptr->left != -1; ptr++, i++) {
+ if (all) {
+ if ((ptr->flags & 0xf) > 1)
+ continue;
+
+ if ((ptr->flags & 0xff00) != 0)
+ continue;
+
+ if (_vm->_global->_inter_mouseX < ptr->left
+ || _vm->_global->_inter_mouseX > ptr->right
+ || _vm->_global->_inter_mouseY < ptr->top
+ || _vm->_global->_inter_mouseY > ptr->bottom)
+ continue;
+
+ if (resId != 0)
+ *resId = ptr->id;
+
+ *resIndex = i;
+ return ptr->key;
+ } else {
+ if ((ptr->flags & 0xff00) != 0)
+ continue;
+
+ if ((ptr->flags & 0xf) != 1 && (ptr->flags & 0xf) != 2)
+ continue;
+
+ if ((ptr->flags & 0xf0) >> 4 != _mouseButtons - 1
+ && (ptr->flags & 0xf0) >> 4 != 2)
+ continue;
+
+ if (_vm->_global->_inter_mouseX < ptr->left
+ || _vm->_global->_inter_mouseX > ptr->right
+ || _vm->_global->_inter_mouseY < ptr->top
+ || _vm->_global->_inter_mouseY > ptr->bottom)
+ continue;
+
+ if (resId != 0)
+ *resId = ptr->id;
+ *resIndex = i;
+ return ptr->key;
+ }
+ }
+
+ if (_mouseButtons != 1 && all == 0)
+ return 0x11b;
+
+ return 0;
+}
+
} // End of namespace Gob