aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/supernova/rooms.cpp165
-rw-r--r--engines/supernova/rooms.h6
-rw-r--r--engines/supernova/state.cpp26
-rw-r--r--engines/supernova/state.h2
-rw-r--r--engines/supernova/supernova.cpp2
5 files changed, 136 insertions, 65 deletions
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index fde692e317..6aefe80cbb 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -160,8 +160,7 @@ void Intro::titleScreen() {
_gm->wait2(1);
CursorMan.showMouse(true);
_vm->playSoundMod(kMusicIntro);
- _gm->getKeyInput();
- _gm->_key.reset();
+ _gm->getInput();
// TODO: render animated text
_vm->playSound(kAudioVoiceYeah);
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle));
@@ -187,35 +186,48 @@ void Intro::titleFadeIn() {
}
}
-void Intro::animate(int filenumber, int section1, int section2, int duration) {
+bool Intro::animate(int filenumber, int section1, int section2, int duration) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
while (duration) {
_vm->renderImage(filenumber, section1);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key))
+ return key != Common::KEYCODE_ESCAPE;
_vm->renderImage(filenumber, section2);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key))
+ return key != Common::KEYCODE_ESCAPE;
--duration;
}
+ return true;
}
-void Intro::animate(int filenumber, int section1, int section2, int duration,
+bool Intro::animate(int filenumber, int section1, int section2, int duration,
MessagePosition position, StringID textId) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(textId);
_vm->renderMessage(text, position);
int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
while (delay) {
if (section1)
_vm->renderImage(filenumber, section1);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
if (section2)
_vm->renderImage(filenumber, section2);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
--delay;
}
_vm->removeMessage();
+ return true;
}
-void Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
+bool Intro::animate(int filenumber, int section1, int section2, int section3, int section4,
int duration, MessagePosition position, StringID textId) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(textId);
_vm->renderMessage(text, position);
if (duration == 0)
@@ -224,26 +236,34 @@ void Intro::animate(int filenumber, int section1, int section2, int section3, in
while(duration) {
_vm->renderImage(filenumber, section1);
_vm->renderImage(filenumber, section3);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
_vm->renderImage(filenumber, section2);
_vm->renderImage(filenumber, section4);
- _gm->wait2(2);
+ if (_gm->waitOnInput(2, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE;
+ }
duration--;
}
_vm->removeMessage();
+ return true;
}
void Intro::cutscene() {
#define exitOnEscape(X) do { \
- _gm->wait2(X); \
- if (_gm->keyPressed(Common::KEYCODE_ESCAPE, true)) \
+ Common::KeyCode key = Common::KEYCODE_INVALID; \
+ if (_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) \
return; \
} while (0);
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene1);
+ if (!animate(31, 0, 0, 0, kMessageNormal, kStringIntroCutscene1))
+ return;
_vm->_menuBrightness = 0;
_vm->paletteBrightness();
exitOnEscape(1);
@@ -252,13 +272,18 @@ void Intro::cutscene() {
_vm->renderImage(9, 1);
_vm->renderImage(9, 9);
_vm->paletteFadeIn();
- animate(9,11,10,6,kMessageRight,kStringIntroCutscene2);
+ if (!animate(9,11,10,6,kMessageRight,kStringIntroCutscene2))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(4);
_vm->renderImage(9, 4);
- animate(9, 11,10,3); // test duration
+ if (!animate(9, 11,10,3)) {// test duration
+ _vm->removeMessage();
+ return;
+ }
_vm->removeMessage();
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 2);
@@ -267,7 +292,8 @@ void Intro::cutscene() {
exitOnEscape(6);
_vm->renderImage(9, 6);
exitOnEscape(6);
- animate(9, 0,0,0,kMessageLeft,kStringIntroCutscene4);
+ if (!animate(9, 0,0,0,kMessageLeft,kStringIntroCutscene4))
+ return;
_vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
exitOnEscape(28);
_vm->removeMessage();
@@ -283,7 +309,12 @@ void Intro::cutscene() {
_vm->renderMessage(textCounting[i], kMessageLeft);
for (int j = 0; j < 28; ++j) {
_vm->renderImage(31, (j % 3) + 1);
- exitOnEscape(1);
+ Common::KeyCode key = Common::KEYCODE_INVALID;
+ if (_gm->waitOnInput(1, key)) {
+ if (key == Common::KEYCODE_ESCAPE)
+ return;
+ break;
+ }
}
_vm->removeMessage();
}
@@ -306,29 +337,40 @@ void Intro::cutscene() {
_vm->paletteBrightness();
_vm->renderBox(0, 138, 320, 62, kColorBlack);
_vm->paletteBrightness();
- animate(9, 11,10,0,kMessageRight,kStringIntroCutscene12);
+ if (!animate(9, 11,10,0,kMessageRight,kStringIntroCutscene12))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 4);
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene13);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene14);
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene13))
+ return;
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene14))
+ return;
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 14);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene15);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene16);
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene15))
+ return;
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene16))
+ return;
exitOnEscape(20);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene17);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene18);
- animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene19);
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene17))
+ return;
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene18))
+ return;
+ if (!animate(9, 0,0,0,kMessageCenter,kStringIntroCutscene19))
+ return;
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 17);
- animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene20);
- animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene21);
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
+ if (!animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene20))
+ return;
+ if (!animate(9, 19,20,18,17,0,kMessageRight,kStringIntroCutscene21))
+ return;
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ return;
_vm->renderImage(9, 3);
exitOnEscape(3);
_vm->renderImage(9, 2);
@@ -345,16 +387,20 @@ void Intro::cutscene() {
_vm->renderImage(9, 16);
exitOnEscape(3);
_vm->renderImage(9, 15);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene22);
- animate(9, 19,20,0,kMessageRight,kStringIntroCutscene23);
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene22))
+ return;
+ if (!animate(9, 19,20,0,kMessageRight,kStringIntroCutscene23))
+ return;
exitOnEscape(10);
_vm->renderImage(9, 13);
exitOnEscape(2);
_vm->renderImage(9, 12);
exitOnEscape(2);
_vm->renderImage(9, 9);
- animate(9, 11,10,0,kMessageRight,kStringIntroCutscene24);
- animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3);
+ if (!animate(9, 11,10,0,kMessageRight,kStringIntroCutscene24))
+ return;
+ if (!animate(9, 5,4,0,kMessageLeft,kStringIntroCutscene3))
+ return;
_vm->paletteFadeOut();
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
@@ -363,20 +409,28 @@ void Intro::cutscene() {
_vm->_system->fillScreen(kColorBlack);
_vm->_menuBrightness = 255;
_vm->paletteBrightness();
- animate(9,0,0,0,kMessageNormal,kStringIntroCutscene25);
+ if (!animate(9,0,0,0,kMessageNormal,kStringIntroCutscene25))
+ return;
_vm->_menuBrightness = 5;
_vm->paletteBrightness();
_vm->renderImage(31, 0);
_vm->paletteFadeIn();
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene26);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene27);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene28);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene29);
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene26))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene27))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene28))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene29))
+ return;
exitOnEscape(54);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene30);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene31);
- animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene32);
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene30))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene31))
+ return;
+ if (!animate(31, 0,0,0,kMessageNormal,kStringIntroCutscene32))
+ return;
_vm->_brightness = 0;
_vm->paletteBrightness();
@@ -393,18 +447,27 @@ void Intro::cutscene() {
while (_vm->_mixer->isSoundHandleActive(_vm->_soundHandle))
;
exitOnEscape(30);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene33);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene33))
+ return;
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene34);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene35);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene36);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene37);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene34))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene35))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene36))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene37))
+ return;
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene38);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene39);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene38))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene39))
+ return;
exitOnEscape(18);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene40);
- animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene41);
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene40))
+ return;
+ if (!animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene41))
+ return;
exitOnEscape(36);
animate(22, 0,0,0,kMessageNormal,kStringIntroCutscene42);
_vm->removeMessage();
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 11d36b10d9..7e8890b30b 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -92,10 +92,10 @@ public:
virtual void onEntrance();
private:
- void animate(int filenumber, int section1, int section2, int duration);
- void animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
+ bool animate(int filenumber, int section1, int section2, int duration);
+ bool animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
StringID text);
- void animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
+ bool animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
MessagePosition position, StringID text);
void titleScreen();
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 6fa20aa790..a817f02be5 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -477,15 +477,6 @@ void GameManager::resetInputState() {
processInput();
}
-bool GameManager::keyPressed(Common::KeyCode keycode, bool equal) {
- _vm->updateEvents();
- bool ret = _key.keycode == keycode;
- _key.reset();
-
- return equal ? ret : !ret;
-}
-
-
void GameManager::processInput() {
if (_mouseClickType == Common::EVENT_LBUTTONUP) {
_vm->removeMessage();
@@ -990,10 +981,27 @@ void GameManager::errorTemp() {
void GameManager::wait2(int ticks) {
int32 end = _state._time + ticksToMsec(ticks);
do {
+ g_system->delayMillis(_vm->_delay);
_vm->updateEvents();
g_system->updateScreen();
+ } while (_state._time < end);
+}
+
+bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
+ keycode = Common::KEYCODE_INVALID;
+ int32 end = _state._time + ticksToMsec(ticks);
+ do {
g_system->delayMillis(_vm->_delay);
+ _vm->updateEvents();
+ g_system->updateScreen();
+ if (_keyPressed) {
+ keycode = _key.keycode;
+ _key.reset();
+ return true;
+ } else if (_mouseClicked)
+ return true;
} while (_state._time < end);
+ return false;
}
void GameManager::setAnimationTimer(int ticks) {
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 251ed2bace..bfadd8277c 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -147,10 +147,10 @@ public:
Common::EventType getMouseInput();
uint16 getKeyInput(bool blockForPrintChar = false);
void getInput();
- bool keyPressed(Common::KeyCode keycode, bool equal);
void mouseInput3();
void mouseWait(int delay);
void wait2(int ticks);
+ bool waitOnInput(int ticks, Common::KeyCode &keycode);
void turnOff();
void turnOn();
void screenShake();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 412470356a..31ca4689c4 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -202,7 +202,7 @@ void SupernovaEngine::updateEvents() {
case Common::EVENT_LBUTTONUP:
// fallthrough
case Common::EVENT_RBUTTONUP:
- if (_mixer->isSoundHandleActive(_soundHandle))
+ if (_gm->_currentRoom->getId() != INTRO && _mixer->isSoundHandleActive(_soundHandle))
return;
_gm->_mouseClicked = true;
// fallthrough