From bd6cdf4ba22393d254de6b656edf7d33441fa704 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 5 Nov 2017 01:14:59 +0000 Subject: SUPERNOVA: Handle events during dialogs --- engines/supernova/rooms.cpp | 16 +++++++------- engines/supernova/state.cpp | 53 +++++++++++++++++++++++++++------------------ engines/supernova/state.h | 2 +- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp index eef4d16801..9c503a818f 100644 --- a/engines/supernova/rooms.cpp +++ b/engines/supernova/rooms.cpp @@ -742,10 +742,10 @@ void ShipSleepCabin::animation() { void ShipSleepCabin::onEntrance() { if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) { _vm->renderMessage(kStringShipSleepCabin14); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); _vm->renderMessage(kStringShipSleepCabin15); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); _vm->renderMessage(kStringShipSleepCabin16); _gm->_state._dream = false; @@ -1710,7 +1710,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) { _vm->renderMessage(kStringArsanoEntrance20); else { _vm->renderMessage(kStringArsanoEntrance21); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); _vm->renderMessage(kStringArsanoEntrance22); _gm->takeObject(*getObject(16)); @@ -1757,7 +1757,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) { getObject(4)->setProperty(WORN); getObject(5)->setProperty(WORN); getObject(6)->setProperty(WORN); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); } return false; @@ -2029,7 +2029,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) { _vm->_menuBrightness = 255; _vm->paletteBrightness(); _vm->renderMessage(kStringArsanoRoger39); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); _vm->_menuBrightness = 0; _vm->paletteBrightness(); @@ -2048,7 +2048,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) { getObject(6)->_click = 7; _vm->paletteFadeIn(); _vm->renderMessage(kStringArsanoRoger40); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); } else return false; @@ -2224,7 +2224,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) { _gm->wait2(18); _vm->renderMessage(kStringArsanoMeetup2_12); _gm->great(0); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); _vm->paletteFadeOut(); g_system->fillScreen(kColorBlack); @@ -3070,7 +3070,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) { _vm->_menuBrightness = 255; _vm->paletteBrightness(); _vm->renderMessage(kStringAxacussElevator_3); - _gm->mouseWait(_gm->_timer1); + _gm->waitOnInput(_gm->_timer1); _vm->removeMessage(); _vm->_menuBrightness = 0; _vm->paletteBrightness(); diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp index d3ab297417..0b569e4fc3 100644 --- a/engines/supernova/state.cpp +++ b/engines/supernova/state.cpp @@ -821,7 +821,7 @@ void GameManager::say(const char *text) { _vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25); for (int r = 0; r < numRows; ++r) _vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen); - mouseWait((t.size() + 20) * _vm->_textSpeed / 10); + waitOnInput((t.size() + 20) * _vm->_textSpeed / 10); _vm->renderBox(0, 138, 320, 62, kColorBlack); } @@ -837,12 +837,12 @@ void GameManager::reply(const char *text, int aus1, int aus2) { for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) { drawImage(aus1); - mouseWait(2); - if (_keyPressed) // ?? origin: key != -1, need to check what mouseWait does... + waitOnInput(2); + if (_keyPressed || _mouseClicked) z = 1; drawImage(aus2); - mouseWait(2); - if (_keyPressed) + waitOnInput(2); + if (_keyPressed || _mouseClicked) z = 1; } if (*text != '|') @@ -876,10 +876,12 @@ int GameManager::dialog(int num, byte rowLength[6], StringID text[6], int number rq += rowLength[i]; } + _guiEnabled = false; _currentSentence = -1; do { mouseInput3(); - } while (_currentSentence == -1); + } while (_currentSentence == -1 && !_vm->shouldQuit()); + _guiEnabled = true; _vm->renderBox(0, 138, 320, 62, kColorBlack); @@ -1012,33 +1014,33 @@ uint16 GameManager::getKeyInput(bool blockForPrintChar) { } Common::EventType GameManager::getMouseInput() { - while (true) { + while (!_vm->shouldQuit()) { _vm->updateEvents(); - if (_mouseClicked) { + if (_mouseClicked) return _mouseClickType; - } g_system->updateScreen(); g_system->delayMillis(_vm->_delay); } + return Common::EVENT_INVALID; } void GameManager::getInput() { while (true) { _vm->updateEvents(); - if (_mouseClicked || _keyPressed) { + if (_mouseClicked || _keyPressed) break; - } g_system->updateScreen(); g_system->delayMillis(_vm->_delay); } } -// TODO: Unify mouseInput3 and mouseWait with getMouseInput void GameManager::mouseInput3() { - // STUB -} -void GameManager::mouseWait(int delay) { - // STUB + do { + _vm->updateEvents(); + mousePosDialog(_mouseX, _mouseY); + g_system->updateScreen(); + g_system->delayMillis(_vm->_delay); + } while (!_mouseClicked && !_vm->shouldQuit()); } void GameManager::roomBrightness() { @@ -1086,7 +1088,16 @@ void GameManager::wait2(int ticks) { g_system->delayMillis(_vm->_delay); _vm->updateEvents(); g_system->updateScreen(); - } while (_state._time < end); + } while (_state._time < end && !_vm->shouldQuit()); +} + +void GameManager::waitOnInput(int ticks) { + int32 end = _state._time + ticksToMsec(ticks); + do { + g_system->delayMillis(_vm->_delay); + _vm->updateEvents(); + g_system->updateScreen(); + } while (_state._time < end && !_vm->shouldQuit() && !_keyPressed && !_mouseClicked); } bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) { @@ -1102,7 +1113,7 @@ bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) { return true; } else if (_mouseClicked) return true; - } while (_state._time < end); + } while (_state._time < end && !_vm->shouldQuit()); return false; } @@ -1440,10 +1451,10 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { } } else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) { _vm->renderMessage(kStringGenericInteract_10); - mouseWait(_timer1); + waitOnInput(_timer1); _vm->removeMessage(); _vm->renderMessage(kStringGenericInteract_11); - mouseWait(_timer1); + waitOnInput(_timer1); _vm->removeMessage(); _vm->renderImage(2, 0); _vm->setColor63(40); @@ -1648,7 +1659,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { _vm->renderMessage(kStringGenericInteract_30); else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) { _vm->renderMessage(kStringGenericInteract_31); - mouseWait(_timer1); + waitOnInput(_timer1); _vm->removeMessage(); _vm->renderMessage(kStringGenericInteract_32); } else { diff --git a/engines/supernova/state.h b/engines/supernova/state.h index 8b904d18a3..b67622ecdc 100644 --- a/engines/supernova/state.h +++ b/engines/supernova/state.h @@ -154,8 +154,8 @@ public: uint16 getKeyInput(bool blockForPrintChar = false); void getInput(); void mouseInput3(); - void mouseWait(int delay); void wait2(int ticks); + void waitOnInput(int ticks); bool waitOnInput(int ticks, Common::KeyCode &keycode); void turnOff(); void turnOn(); -- cgit v1.2.3