aboutsummaryrefslogtreecommitdiff
path: root/engines/supernova2/rooms.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/supernova2/rooms.cpp')
-rw-r--r--engines/supernova2/rooms.cpp470
1 files changed, 398 insertions, 72 deletions
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a769b8ce26..6d22da76de 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -28,6 +28,7 @@
#include "supernova2/supernova2.h"
#include "supernova2/state.h"
#include "supernova2/rooms.h"
+#include "supernova2/graphics.h"
namespace Supernova2 {
@@ -192,7 +193,6 @@ bool Room::interact(Action verb, Object &obj1, Object &obj2) {
Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _restTime = 0;
_fileNumber = -1;
_id = INTRO;
@@ -273,55 +273,6 @@ void Intro::titleScreen() {
CursorMan.showMouse(true);
}
-bool Intro::tvSay(int mod1, int mod2, int rest, MessagePosition pos, StringId id) {
- Common::KeyCode key = Common::KEYCODE_INVALID;
- const Common::String& text = _vm->getGameString(id);
-
- _vm->renderMessage(text, pos);
- int animation_count = (text.size() + 20) * (10 - rest) * _vm->_textSpeed / 400;
- _restTime = (text.size() + 20) * rest * _vm->_textSpeed / 400;
-
- while (animation_count) {
- if (mod1)
- _vm->renderImage(mod1);
-
- if (_gm->waitOnInput(2, key)) {
- _vm->removeMessage();
- return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
- }
- if (mod2)
- _vm->renderImage(mod2);
-
- if (_gm->waitOnInput(2, key)) {
- _vm->removeMessage();
- return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
- }
- animation_count--;
- }
- if (_restTime == 0)
- _vm->removeMessage();
-
- return true;
-}
-
-bool Intro::tvRest(int mod1, int mod2, int rest) {
- Common::KeyCode key = Common::KEYCODE_INVALID;
- while (rest) {
- _vm->renderImage(mod1);
- if (_gm->waitOnInput(2, key)) {
- _vm->removeMessage();
- return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
- }
- _vm->renderImage(mod2);
- if (_gm->waitOnInput(2, key)) {
- _vm->removeMessage();
- return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
- }
- rest--;
- }
- return true;
-}
-
bool Intro::displayThoughtMessage(StringId id) {
Common::KeyCode key = Common::KEYCODE_INVALID;
const Common::String& text = _vm->getGameString(id);
@@ -429,28 +380,28 @@ bool Intro::tvDialogue() {
_vm->setCurrentImage(42);
_vm->renderImage(0);
- if(!tvSay(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
+ if(!_gm->talk(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
return false;
_vm->renderImage(4);
_gm->wait(3);
_vm->renderImage(6);
- if(!tvSay(8, 6, 7, kMessageLeft, kStringIntroTV2))
+ if(!_gm->talk(8, 6, 7, kMessageLeft, kStringIntroTV2))
return false;
debug("%d", _vm->shouldQuit());
_vm->renderImage(10);
- if(!tvRest(8, 6, _restTime))
+ if(!_gm->talkRest(8, 6, _gm->_restTime))
return false;
_vm->removeMessage();
- if(!tvSay(8, 6, 0, kMessageLeft, kStringIntroTV3))
+ if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV3))
return false;
- if(!tvSay(8, 6, 0, kMessageLeft, kStringIntroTV4))
+ if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV4))
return false;
_vm->renderImage(10 + 128);
@@ -459,62 +410,62 @@ bool Intro::tvDialogue() {
_gm->wait(3);
_vm->renderImage(7);
- if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV5))
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV5))
return false;
- if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV6))
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV6))
return false;
- if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV7))
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV7))
return false;
- if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
return false;
- if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
return false;
- if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV10))
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV10))
return false;
- if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
return false;
- if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
return false;
- if(!tvSay(9, 7, 8, kMessageCenter, kStringIntroTV13))
+ if(!_gm->talk(9, 7, 8, kMessageCenter, kStringIntroTV13))
return false;
_vm->renderImage(4);
- if(!tvRest(9, 7, 1))
+ if(!_gm->talkRest(9, 7, 1))
return false;
_vm->renderImage(4 + 128);
- if(!tvRest(9, 7, 3))
+ if(!_gm->talkRest(9, 7, 3))
return false;
_vm->renderImage(4);
- if(!tvRest(9, 7, 1))
+ if(!_gm->talkRest(9, 7, 1))
return false;
_vm->renderImage(6);
- if(!tvRest(9, 7, _restTime - 5))
+ if(!_gm->talkRest(9, 7, _gm->_restTime - 5))
return false;
_vm->removeMessage();
- if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
return false;
- if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
return false;
- if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV16))
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV16))
return false;
return true;
@@ -810,6 +761,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
_gm->_state._tipsy = false;
_vm->paletteFadeOut();
_vm->_system->fillScreen(kColorBlack);
+ _vm->paletteFadeIn();
Common::String text = _vm->getGameString(kStringWillPassOut);
_vm->renderMessage(text);
_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
@@ -1163,8 +1115,10 @@ Checkout::Checkout(Supernova2Engine *vm, GameManager *gm) {
_shown[0] = kShownTrue;
_var1 = false;
- _var2 = false;
+ _var2 = 0;
_var3 = false;
+ _var4 = false;
+ _var5 = false;
_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, KP_ENTRANCE, EXIT, 0, 0, 0, NULLROOM, 3);
_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CULTURE_PALACE, 22);
@@ -1193,9 +1147,381 @@ void Checkout::animation() {
}
bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
+ static StringId dialCheckout1[3] = {
+ kStringCheckout1,
+ kStringCheckout2,
+ kStringCheckout3
+ };
+ static StringId dialCheckout2[2] = {
+ kStringYes,
+ kStringNo
+ };
+ static StringId dialStage1[3] = {
+ kStringCheckout4,
+ kStringCheckout5,
+ kStringCheckout6
+ };
+ static StringId dialStage2[2] = {
+ kStringCheckout7,
+ kStringCheckout8
+ };
+ static StringId dialStage3[3] = {
+ kStringCheckout9,
+ kStringCheckout10,
+ kStringCheckout11
+ };
+ static StringId dialStage4[3] = {
+ kStringCheckout12,
+ kStringCheckout13
+ };
+ if (verb == ACTION_WALK && obj1._id == KP_ENTRANCE) {
+ if (_var4) {
+ _vm->renderImage(2);
+ _gm->reply(kStringCheckout14, 0, 0);
+ _vm->renderImage(2 + 128);
+ } else if (_var2 == 0) {
+ _vm->renderImage(2);
+ //_gm->reply("atnuhh", 0, 0);
+ _gm->reply(kStringCheckout15, 0, 0);
+ _vm->renderImage(2 + 128);
+ if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
+ _gm->say(kStringCheckout16);
+ _gm->reply(kStringCheckout17, 0, 0);
+ } else
+ _gm->say(kStringCheckout18);
+ _gm->drawGUI();
+ } else if (_var2 == 1) {
+ _gm->reply(kStringCheckout19, 1, 1 + 128);
+ } else {
+ if (_gm->_state._tipsy) {
+ _vm->setCurrentImage(22);
+ _vm->renderImage(0);
+ if (_var5 && _gm->_state._admission >= 2)
+ appearance();
+ else {
+ _gm->dialog(3, _gm->_dials, dialStage1, 0);
+ _gm->dialog(2, _gm->_dials, dialStage2, 0);
+ _vm->renderMessage(kStringCheckout20, 100, 70);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringCheckout21, 200, 40);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->say(kStringCheckout22);
+ _gm->dialog(3, _gm->_dials, dialStage3, 0);
+ _vm->renderMessage(kStringCheckout23, 120, 70);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->say(kStringCheckout24);
+ _vm->renderMessage(kStringCheckout25, 40, 100);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->dialog(2, _gm->_dials, dialStage4, 0);
+ _vm->playSound(kAudioStage1);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->playSound(kAudioStage1);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->playSound(kAudioStage2);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->playSound(kAudioStage2);
+ _vm->renderMessage(kStringCheckout26, 250, 80);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->playSound(kAudioStage1);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->removeMessage();
+ _vm->playSound(kAudioStage2);
+ _vm->renderMessage(kStringCheckout27, 140, 60);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->playSound(kAudioStage2);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _gm->wait(2);
+ _vm->removeMessage();
+ _vm->playSound(kAudioStage2);
+ _vm->renderMessage(kStringCheckout26, 180, 50);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringCheckout28, 50, 110);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->say(kStringCheckout29);
+ _vm->renderRoom(*this);
+ if (_var5)
+ _vm->renderMessage(kStringCheckout30);
+ else
+ _vm->renderMessage(kStringCheckout31);
+ _var4 = true;
+ _gm->drawGUI();
+ }
+ } else {
+ _vm->renderMessage(kStringCheckout32);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringCheckout33);
+ }
+ }
+ } else if (verb == ACTION_GIVE && obj1._id == CHIP && obj2._id == AXACUSSER &&
+ _var2 == 1) {
+ _gm->_inventory.remove(obj1);
+ _var5 = true;
+ _gm->reply(kStringCheckout37, 1, 1 + 128);
+ _var2 = 2;
+ _gm->drawGUI();
+ } else if (verb == ACTION_GIVE && obj1._id == CARD && obj2._id == AXACUSSER) {
+ _gm->_inventory.remove(*_gm->_rooms[CULTURE_PALACE]->getObject(4));
+ _gm->reply(kStringCheckout34, 1, 1 + 128);
+ _gm->reply(kStringCheckout35, 1, 1 + 128);
+ if (_gm->dialog(2, _gm->_dials, dialCheckout2, 0) == 1) {
+ _gm->reply(kStringCheckout36, 1, 1 + 128);
+ _var2 = 1;
+ } else {
+ _gm->reply(kStringCheckout37, 1, 1 + 128);
+ _var2 = 2;
+ }
+ _gm->drawGUI();
+ } else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+ if (_var4) {
+ _gm->say(kStringCheckout38);
+ _gm->reply(kStringCheckout39, 1, 1 + 128);
+ _gm->drawGUI();
+ } else {
+ switch (_var2) {
+ case 0:
+ addSentence(2, 1);
+ switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
+ case 0:
+ _gm->reply(kStringCheckout40, 1, 1 + 128);
+ _gm->say(kStringNo);
+ _gm->reply(kStringCheckout41, 1, 1 + 128);
+ _gm->say(kStringCheckout42);
+ break;
+ case 1:
+ _gm->reply(kStringCheckout43, 1, 1 + 128);
+ if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
+ _gm->say(kStringCheckout44);
+ return interact(ACTION_GIVE,
+ *_gm->_rooms[CULTURE_PALACE]->getObject(4),
+ *_gm->_rooms[CHECKOUT]->getObject(2));
+ } else {
+ _gm->say(kStringNo);
+ _gm->reply(kStringCheckout45, 1, 1 + 128);
+ _gm->say(kStringCheckout46);
+ }
+ break;
+ case 2:
+ _gm->reply(kStringCheckout47, 1, 1 + 128);
+ break;
+ }
+ _gm->drawGUI();
+ break;
+ case 1:
+ _gm->reply(kStringCheckout48, 1, 1 + 128);
+ break;
+ case 2:
+ _gm->reply(kStringCheckout49, 1, 1 + 128);
+ break;
+ }
+ }
+ } else
+ return false;
return true;
}
+void Checkout::appearance() {
+ int xp = 0;
+ _gm->playCD();
+ _vm->removeMessage();
+ _vm->playSound(kAudioAppearance1);
+ while (_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->paletteFadeOut();
+
+ _vm->setCurrentImage(39);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ _gm->wait(50);
+ _vm->setCurrentImage(40);
+ _vm->renderImage(0);
+ for (int i = 1; i < 11; i++) {
+ _gm->wait(3);
+ _vm->renderImage(i);
+ }
+ _vm->playSound(kAudioAppearance2);
+ _gm->wait(30);
+ _vm->renderImage(11);
+ _vm->playSound(kAudioAppearance2);
+ _gm->wait(60);
+
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->setCurrentImage(42);
+ _vm->renderImage(0);
+ _vm->renderImage(11);
+ _gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance1);
+ _gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance2);
+ _vm->renderImage(4);
+ _gm->wait(3);
+ _vm->renderImage(6);
+ _gm->talk(8, 6, 0, kMessageLeft, kStringAppearance3);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance4);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance5);
+ _gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance6);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance7);
+ _gm->talk(8, 6, 0, kMessageLeft, kStringAppearance8);
+ _gm->talk(12, 13, 4, kMessageCenter, kStringAppearance9);
+ _vm->renderImage(4);
+ _gm->talkRest(12, 13, 1);
+ _vm->renderImage(4 + 128);
+ _gm->talkRest(12, 13, 4);
+ _vm->renderImage(4);
+ _gm->talkRest(12, 13, 1);
+ _vm->renderImage(6);
+ _gm->talkRest(12, 13, _gm->_restTime + 6);
+ _vm->removeMessage();
+ _gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance10);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance11);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance12);
+ _gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance13);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance14);
+ _gm->talk(12, 13, 0, kMessageCenter, kStringAppearance15);
+ _gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance16);
+ _gm->talk(12, 13, 2, kMessageCenter, kStringAppearance17);
+ _vm->renderImage(4);
+ _gm->talkRest(12, 13, 1);
+ _vm->renderImage(4 + 128);
+ _gm->talkRest(12, 13, 4);
+ _vm->renderImage(4);
+ _gm->talkRest(12, 13, 1);
+ _vm->renderImage(6);
+ _gm->talkRest(12, 13, _gm->_restTime + 6);
+ _vm->removeMessage();
+ _gm->talk(8, 6, 0, kMessageLeft, kStringAppearance18);
+ _gm->talk(12, 13, 1, kMessageCenter, kStringAppearance19);
+ _vm->renderImage(4);
+ _gm->talkRest(12, 13, 1);
+ _vm->renderImage(4 + 128);
+ _gm->talkRest(12, 13, 4);
+ _vm->renderImage(4);
+ _gm->talkRest(12, 13, 1);
+ _vm->renderImage(6);
+ _gm->talkRest(12, 13, _gm->_restTime + 6);
+ _vm->removeMessage();
+ _gm->talk(8, 6, 0, kMessageLeft, kStringAppearance20);
+ _gm->talk(12, 13, 1, kMessageCenter, kStringAppearance21);
+ _vm->renderImage(17);
+ _gm->wait(2);
+ _vm->renderImage(18);
+ _gm->wait(2);
+ _vm->renderImage(19);
+ _gm->wait(2);
+ _vm->renderImage(20);
+ _gm->wait(3);
+ _vm->renderImage(21);
+ _vm->renderImage(19);
+ _gm->wait(1);
+ _vm->renderImage(21+128);
+ _vm->renderImage(22);
+ _vm->renderImage(18);
+ _gm->wait(1);
+ _vm->renderImage(22+128);
+ _vm->renderImage(23);
+ _gm->wait(1);
+ _vm->renderImage(23+128);
+ _vm->renderImage(24);
+ _vm->renderImage(17);
+ _gm->wait(1);
+ _vm->renderImage(24+128);
+ _vm->renderImage(25);
+ _gm->wait(1);
+ _vm->renderImage(25+128);
+ _vm->renderImage(32);
+ _vm->renderImage(11);
+ _vm->renderImage(26);
+ _vm->playSound(kAudioAppearance3);
+ _gm->wait(2);
+ _vm->renderImage(32+128);
+ _vm->renderImage(33);
+ _vm->renderImage(27);
+ _gm->wait(2);
+ _vm->renderImage(33+128);
+ _vm->renderImage(34);
+ _vm->renderImage(28);
+ _gm->wait(2);
+ _vm->renderImage(29);
+ _gm->wait(2);
+ _vm->renderImage(30);
+ _gm->wait(2);
+ _vm->renderImage(31);
+ _gm->wait(2);
+ _gm->wait(50);
+ _vm->paletteFadeOut();
+
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->paletteFadeIn();
+ _vm->renderMessage(kStringAppearance22);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance23);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance24);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance25);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance26);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance27);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->setCurrentImage(44);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+
+ MS2Image *image = _vm->_screen->getCurrentImage();
+
+ int i = 0;
+ do {
+ _vm->renderImage(1);
+ _gm->wait(1);
+ _vm->renderImage(1 + 128);
+ image->_section[1].x1 += xp;
+ image->_section[1].x2 += xp;
+ image->_section[1].y1 -= 2;
+ image->_section[1].y2 -= 2;
+ i++;
+ if (i == 6) {
+ i = 0;
+ xp++;
+ }
+ } while (image->_section[1].y1 < 200);
+ _vm->paletteFadeOut();
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->paletteFadeIn();
+ _vm->renderMessage(kStringAppearance28);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance29);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance30);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringAppearance31);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->changeRoom(SHIP);
+ _gm->_state._dark = true;
+ _gm->drawGUI();
+}
+
City1::City1(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;