void NavigationScene::createMouseCursor() { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; uint32 mouseCursorFileHash; int areaType; if (_mouseCursor) { deleteSprite((Sprite**)&_mouseCursor); } mouseCursorFileHash = navigationItem.mouseCursorFileHash; if (mouseCursorFileHash == 0) mouseCursorFileHash = 0x63A40028; if (_itemsTypes) { areaType = _itemsTypes[_navigationIndex]; } else if (navigationItem.middleSmackerFileHash != 0 || navigationItem.middleFlag) { areaType = 0; } else { areaType = 1; } insertNavigationMouse(mouseCursorFileHash, areaType); sendPointMessage(_mouseCursor, 0x4002, _vm->getMousePos()); }
bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { for (uint i = 0; i < _collisionSprites.size(); i++) { Sprite *sprite = _collisionSprites[i]; if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) { return true; } } return false; }
void Scene1608::upCarAtHome() { Scene::update(); if (_mouseClicked) { if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) { sendMessage(_asCar, 0x200A, 0); SetUpdateHandler(&Scene1608::upGettingOutOfCar); } else { sendPointMessage(_asCar, 0x2004, _mouseClickPos); SetMessageHandler(&Scene1608::hmRidingCar); SetUpdateHandler(&Scene1608::upRidingCar); } _mouseClicked = false; } updateKlaymenCliprect(); }
void Scene1608::upRidingCar() { Scene::update(); if (_mouseClicked) { sendPointMessage(_asCar, 0x2004, _mouseClickPos); _mouseClicked = false; } if (_asCar->getX() < 300) { if (_carClipFlag) { _carClipFlag = false; _asCar->setClipRect(_clipRect1); if (!_asCar->isDoDeltaX()) sendMessage(_asCar, 0x200E, 0); } } else if (!_carClipFlag) { _carClipFlag = true; _asCar->setClipRect(_clipRect3); } }
void Scene::processMessageList() { debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymenBusy = %d", _isMessageListBusy, _isKlaymenBusy); if (_isMessageListBusy || _isKlaymenBusy) return; _isMessageListBusy = true; if (!_messageList) { _messageList2 = NULL; _messageListStatus = 0; } if (_messageList && _klaymen) { #if 0 debug("MessageList: %p, %d", (void*)_messageList, _messageList->size()); for (uint i = 0; i < _messageList->size(); ++i) { if (i == _messageListIndex) debugN("**"); else debugN(" "); debug("(%08X, %08X)", (*_messageList)[i].messageNum, (*_messageList)[i].messageValue); } debug("--------------------------------"); #endif while (_messageList && _messageListIndex < _messageListCount && !_isKlaymenBusy) { uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; ++_messageListIndex; if (_messageListIndex == _messageListCount) sendMessage(_klaymen, 0x1021, 0); if (_doConvertMessages) messageNum = convertMessageNum(messageNum); if (messageNum == 0x1009 || messageNum == 0x1024) { sendMessage(_parentModule, messageNum, messageParam); } else if (messageNum == 0x100A) { _messageValue = messageParam; sendMessage(_parentModule, messageNum, messageParam); } else if (messageNum == 0x4001) { _isKlaymenBusy = true; sendPointMessage(_klaymen, 0x4001, _mouseClickPos); } else if (messageNum == 0x100D) { if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0) continue; } else if (messageNum == 0x101A) { _messageListStatus = 0; } else if (messageNum == 0x101B) { _messageListStatus = 2; } else if (messageNum == 0x1020) { _canAcceptInput = false; } else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) { if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) { _isMessageListBusy = false; return; } } else if (messageNum != 0x4003) { _isKlaymenBusy = true; if (_klaymen->hasMessageHandler() && sendMessage(_klaymen, messageNum, messageParam) != 0) { _isKlaymenBusy = false; } } if (_messageListIndex == _messageListCount) { _canAcceptInput = true; _messageList = NULL; } } } _isMessageListBusy = false; }
int NavigationScene::getNavigationAreaType() { NPoint mousePos; mousePos.x = _mouseCursor->getX(); mousePos.y = _mouseCursor->getY(); return sendPointMessage(_mouseCursor, 0x2064, mousePos); }
void NavigationScene::handleNavigation(const NPoint &mousePos) { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; bool oldIsWalkingForward = _isWalkingForward; bool oldIsTurning = _isTurning; uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos); switch (direction) { case 0: if (navigationItem.leftSmackerFileHash != 0) { _smackerFileHash = navigationItem.leftSmackerFileHash; _interactive = false; _isWalkingForward = false; _isTurning = true; do { _navigationIndex--; if (_navigationIndex < 0) _navigationIndex = _navigationList->size() - 1; } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); } else { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } break; case 1: if (navigationItem.rightSmackerFileHash != 0) { _smackerFileHash = navigationItem.rightSmackerFileHash; _interactive = false; _isWalkingForward = false; _isTurning = true; do { _navigationIndex++; if (_navigationIndex >= (int)_navigationList->size()) _navigationIndex = 0; } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); } else { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } break; case 2: case 3: case 4: if (navigationItem.middleFlag) { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } else if (navigationItem.middleSmackerFileHash != 0) { _smackerFileHash = navigationItem.middleSmackerFileHash; _interactive = false; _isWalkingForward = true; _isTurning = false; _leaveSceneAfter = true; } break; } if (oldIsTurning != _isTurning) _vm->_soundMan->setSoundThreePlayFlag(_isTurning); if (oldIsWalkingForward != _isWalkingForward) _vm->_soundMan->setTwoSoundsPlayFlag(_isWalkingForward); }