/* 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$ * */ #include "common/endian.h" #include "common/stream.h" #include "gob/gob.h" #include "gob/game.h" #include "gob/global.h" #include "gob/util.h" #include "gob/dataio.h" #include "gob/draw.h" #include "gob/goblin.h" #include "gob/inter.h" #include "gob/mult.h" #include "gob/parse.h" #include "gob/scenery.h" #include "gob/video.h" #include "gob/videoplayer.h" #include "gob/sound/sound.h" namespace Gob { Game_Fascination::Game_Fascination(GobEngine *vm) : Game_v2(vm) { } int16 Game_Fascination::checkCollisions(byte handleMouse, int16 deltaTime, int16 *pResId, int16 *pResIndex) { int16 resIndex; int16 key; int16 oldIndex; int16 oldId; int16 newkey; uint32 timeKey; _scrollHandleMouse = handleMouse != 0; if (deltaTime >= -1) { _lastCollKey = 0; _lastCollAreaIndex = 0; _lastCollId = 0; } if (pResId != 0) *pResId = 0; resIndex = 0; if ((_vm->_draw->_cursorIndex == -1) && (handleMouse != 0) && (_lastCollKey == 0)) { _lastCollKey = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex); if ((_lastCollKey != 0) && (_lastCollId & 0x8000)) collAreaSub(_lastCollAreaIndex, 1); } if (handleMouse != 0) { if ((handleMouse==1) && (_vm->_draw->_renderFlags & RENDERFLAG_UNKNOWN)) warning("checkCollisions : RENDERFLAG_UNKNOWN - Unknown behavior"); _vm->_draw->animateCursor(-1); } timeKey = _vm->_util->getTimeKey(); while (1) { if (_vm->_inter->_terminate || _vm->shouldQuit()) { if (handleMouse) _vm->_draw->blitCursor(); return 0; } if (!_vm->_draw->_noInvalidated) { if (handleMouse != 0) _vm->_draw->animateCursor(-1); else _vm->_draw->blitInvalidated(); _vm->_video->waitRetrace(); } key = checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_mouseButtons, handleMouse); if ((handleMouse == 0) && (_mouseButtons != 0)) { _vm->_util->waitMouseRelease(0); key = 3; } if (key != 0) { if (handleMouse & 1) _vm->_draw->blitCursor(); if (pResId != 0) *pResId = 0; if (pResIndex != 0) *pResIndex = 0; if (_lastCollKey != 0) collAreaSub(_lastCollAreaIndex, 0); _lastCollKey = 0; if (key != 0) return key; } if (handleMouse != 0) { if (_mouseButtons != 0) { if (deltaTime > 0) { _vm->_draw->animateCursor(2); _vm->_util->delay(deltaTime); } else if (handleMouse & 1) _vm->_util->waitMouseRelease(1); _vm->_draw->animateCursor(-1); if (pResId != 0) *pResId = 0; key = checkMousePoint(0, pResId, &resIndex); if (pResIndex != 0) *pResIndex = resIndex; if ((key != 0) || ((pResId != 0) && (*pResId != 0))) { if ((handleMouse & 1) && ((deltaTime <= 0) || (_mouseButtons == 0))) _vm->_draw->blitCursor(); if ((_lastCollKey != 0) && (key != _lastCollKey)) collAreaSub(_lastCollAreaIndex, 0); _lastCollKey = 0; return key; } if (handleMouse & 4) return 0; if (_lastCollKey != 0) collAreaSub(_lastCollAreaIndex, 0); _lastCollKey = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex); if ((_lastCollKey != 0) && (_lastCollId & 0x8000)) collAreaSub(_lastCollAreaIndex, 1); } else if ((_vm->_global->_inter_mouseX != _vm->_draw->_cursorX) || (_vm->_global->_inter_mouseY != _vm->_draw->_cursorY)) { oldIndex = _lastCollAreaIndex; oldId = _lastCollId; newkey = checkMousePoint(1, &_lastCollId, &_lastCollAreaIndex); if (newkey != _lastCollKey) { if ((_lastCollKey != 0) && (oldId & 0x8000)) collAreaSub(oldIndex, 0); _lastCollKey = newkey; if ((newkey != 0) && (_lastCollId & 0x8000)) collAreaSub(_lastCollAreaIndex, 1); } } } if ((deltaTime < 0) && (key == 0) && (_mouseButtons == 0)) { uint32 curtime = _vm->_util->getTimeKey(); if ((curtime + deltaTime) > timeKey) { if (pResId != 0) *pResId = 0; if (pResIndex != 0) *pResIndex = 0; return 0; } } if (handleMouse != 0) _vm->_draw->animateCursor(-1); _vm->_util->delay(10); } } } // End of namespace Gob