diff options
author | Matthew Stewart | 2018-07-17 20:49:59 -0400 |
---|---|---|
committer | Eugene Sandulenko | 2018-08-09 08:37:30 +0200 |
commit | 639c02b76f591fe17ee78b6a72da46c4782fd4d5 (patch) | |
tree | d850a636fda0dbaf945a31c56660d3eedcdfab45 /engines/startrek/events.cpp | |
parent | 52cfe602712ad39174379d56e1b45b7121fefda6 (diff) | |
download | scummvm-rg350-639c02b76f591fe17ee78b6a72da46c4782fd4d5.tar.gz scummvm-rg350-639c02b76f591fe17ee78b6a72da46c4782fd4d5.tar.bz2 scummvm-rg350-639c02b76f591fe17ee78b6a72da46c4782fd4d5.zip |
STARTREK: Fix sound, support MT32.
Also jump to the first mission after the intro.
Diffstat (limited to 'engines/startrek/events.cpp')
-rw-r--r-- | engines/startrek/events.cpp | 159 |
1 files changed, 83 insertions, 76 deletions
diff --git a/engines/startrek/events.cpp b/engines/startrek/events.cpp index 4685fded59..6315899efc 100644 --- a/engines/startrek/events.cpp +++ b/engines/startrek/events.cpp @@ -23,89 +23,72 @@ namespace StarTrek { -/** - * Doesn't return until an event occurs. - */ -void StarTrekEngine::pollSystemEvents(bool queueEvents) { +void StarTrekEngine::pollEvents(bool queueEvents) { Common::Event event; TrekEvent trekEvent; + while (_eventMan->pollEvent(event)) { + trekEvent.mouse = event.mouse; + trekEvent.kbd = event.kbd; + + switch (event.type) { + case Common::EVENT_QUIT: + _system->quit(); + break; - while (!queueEvents || _eventQueue.empty()) { - while (_eventMan->pollEvent(event)) { - trekEvent.mouse = event.mouse; - trekEvent.kbd = event.kbd; - - switch (event.type) { - case Common::EVENT_QUIT: - _system->quit(); - break; - - case Common::EVENT_MOUSEMOVE: - if (queueEvents) { - trekEvent.type = TREKEVENT_MOUSEMOVE; - addEventToQueue(trekEvent); - } - - // WORKAROUND: this improves the responsiveness of the mouse. - _system->updateScreen(); - break; - - case Common::EVENT_LBUTTONDOWN: - if (queueEvents) { - trekEvent.type = TREKEVENT_LBUTTONDOWN; - addEventToQueue(trekEvent); - } - break; - - case Common::EVENT_RBUTTONDOWN: - if (queueEvents) { - trekEvent.type = TREKEVENT_RBUTTONDOWN; - addEventToQueue(trekEvent); - } - break; - - case Common::EVENT_KEYDOWN: - if (queueEvents) { - trekEvent.type = TREKEVENT_KEYDOWN; - addEventToQueue(trekEvent); - } - break; - - default: - break; + case Common::EVENT_MOUSEMOVE: + if (queueEvents) { + trekEvent.type = TREKEVENT_MOUSEMOVE; + addEventToQueue(trekEvent); } - } - // Check for tick event - uint nextFrame = _frameStartMillis + 1000 / 18.206; - uint millis = _system->getMillis(); + // WORKAROUND: this improves the responsiveness of the mouse. + _system->updateScreen(); + break; - if (millis >= nextFrame) { - _clockTicks++; + case Common::EVENT_LBUTTONDOWN: + if (queueEvents) { + trekEvent.type = TREKEVENT_LBUTTONDOWN; + addEventToQueue(trekEvent); + } + break; - _frameStartMillis = millis; + case Common::EVENT_RBUTTONDOWN: + if (queueEvents) { + trekEvent.type = TREKEVENT_RBUTTONDOWN; + addEventToQueue(trekEvent); + } + break; + case Common::EVENT_KEYDOWN: if (queueEvents) { - TrekEvent tickEvent; - tickEvent.type = TREKEVENT_TICK; - tickEvent.tick = _clockTicks; - addEventToQueue(tickEvent); + trekEvent.type = TREKEVENT_KEYDOWN; + addEventToQueue(trekEvent); } - } + break; - if (queueEvents && !_eventQueue.empty()) + default: break; + } + } +} - // Wait a 60th of a second before checking for events again - int delay = 1000 / 60; - millis = _system->getMillis(); - if (millis + delay > nextFrame) - delay = nextFrame - millis; - if (delay > 0) - _system->delayMillis(delay); +void StarTrekEngine::waitForNextTick(bool queueEvents) { + pollEvents(queueEvents); - if (!queueEvents) - break; + uint nextFrame = _frameStartMillis + 1000 / 18.206; + uint millis = _system->getMillis(); + + if (millis < nextFrame) + _system->delayMillis(nextFrame - millis); + + _clockTicks++; + _frameStartMillis = nextFrame; + + if (queueEvents) { + TrekEvent tickEvent; + tickEvent.type = TREKEVENT_TICK; + tickEvent.tick = _clockTicks; + addEventToQueue(tickEvent); } } @@ -117,11 +100,35 @@ void StarTrekEngine::initializeEventsAndMouse() { // TODO: mouse } -/** - * Returns false if there is no event waiting. - */ -bool StarTrekEngine::getNextEvent(TrekEvent *e) { - pollSystemEvents(); // TODO: put this somewhere else? +bool StarTrekEngine::getNextEvent(TrekEvent *e, bool poll) { + while (poll && _eventQueue.empty()) { + pollEvents(true); + + // Check for tick event + uint nextFrame = _frameStartMillis + 1000 / 18.206; + uint millis = _system->getMillis(); + + if (millis >= nextFrame) { + _clockTicks++; + _frameStartMillis = millis; + + TrekEvent tickEvent; + tickEvent.type = TREKEVENT_TICK; + tickEvent.tick = _clockTicks; + addEventToQueue(tickEvent); + } + + if (!_eventQueue.empty()) + break; + + // Still no events; wait a 60th of a second before checking for events again + int delay = 1000 / 60; + millis = _system->getMillis(); + if (millis + delay > nextFrame) + delay = nextFrame - millis; + if (delay > 0) + _system->delayMillis(delay); + } if (_eventQueue.empty()) return false; @@ -143,8 +150,8 @@ void StarTrekEngine::removeNextEvent() { _eventQueue.pop_front(); } -bool StarTrekEngine::popNextEvent(TrekEvent *e) { - if (!getNextEvent(e)) +bool StarTrekEngine::popNextEvent(TrekEvent *e, bool poll) { + if (!getNextEvent(e, poll)) return false; removeNextEvent(); |