diff options
Diffstat (limited to 'engines/supernova2/rooms.cpp')
-rw-r--r-- | engines/supernova2/rooms.cpp | 470 |
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; |