diff options
-rw-r--r-- | engines/supernova2/ms2_def.h | 36 | ||||
-rw-r--r-- | engines/supernova2/resman.cpp | 19 | ||||
-rw-r--r-- | engines/supernova2/resman.h | 4 | ||||
-rw-r--r-- | engines/supernova2/rooms.cpp | 470 | ||||
-rw-r--r-- | engines/supernova2/rooms.h | 6 | ||||
-rw-r--r-- | engines/supernova2/screen.cpp | 11 | ||||
-rw-r--r-- | engines/supernova2/screen.h | 6 | ||||
-rw-r--r-- | engines/supernova2/sound.h | 7 | ||||
-rw-r--r-- | engines/supernova2/state.cpp | 69 | ||||
-rw-r--r-- | engines/supernova2/state.h | 5 | ||||
-rw-r--r-- | engines/supernova2/supernova2.cpp | 4 | ||||
-rw-r--r-- | engines/supernova2/supernova2.h | 1 |
12 files changed, 524 insertions, 114 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index c1f3aa86ae..adf345c6af 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -199,24 +199,24 @@ kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kS kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan, kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation, kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot, -kString365, kString366, kString367, kString368, kString369, -kString370, kString371, kString372, kString373, kString374, -kString375, kString376, kString377, kString378, kString379, -kString380, kString381, kString382, kString383, kString384, -kString385, kString386, kString387, kString388, kString389, -kString390, kString391, kString392, kString393, kString394, -kString395, kString396, kString397, kString398, kString399, -kString400, kString401, kString402, kString403, kString404, -kString405, kString406, kString407, kString408, kString409, -kString410, kString411, kString412, kString413, kString414, -kString415, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon, -kStringIWillProof, kStringIWillPerform, kString422, kString423, kString424, -kString425, kString426, kString427, kString428, kString429, -kString430, kString431, kString432, kString433, kString434, -kString435, kString436, kString437, kString438, kString439, -kString440, kString441, kString442, kString443, kString444, -kString445, kString446, kString447, kString448, kString449, -kString450, kString451, kString452, kString453, kString454, +kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes, kStringNo, +kStringCheckout4, kStringCheckout5, kStringCheckout6, kStringCheckout7, kStringCheckout8, +kStringCheckout9, kStringCheckout10, kStringCheckout11, kStringCheckout12, kStringCheckout13, +kStringCheckout14, kStringCheckout15, kStringCheckout16, kStringCheckout17, kStringCheckout18, +kStringCheckout19, kStringCheckout20, kStringCheckout21, kStringCheckout22, kStringCheckout23, +kStringCheckout24, kStringCheckout25, kStringCheckout26, kStringCheckout27, kStringCheckout28, +kStringCheckout29, kStringCheckout30, kStringCheckout31, kStringCheckout32, kStringCheckout33, +kStringCheckout34, kStringCheckout35, kStringCheckout36, kStringCheckout37, kStringCheckout38, +kStringCheckout39, kStringCheckout40, kStringCheckout41, kStringCheckout42, kStringCheckout43, +kStringCheckout44, kStringCheckout45, kStringCheckout46, kStringCheckout47, kStringCheckout48, +kStringCheckout49, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon, +kStringIWillProof, kStringIWillPerform, kString422, kStringAppearance1, kStringAppearance2, +kStringAppearance3, kStringAppearance4, kStringAppearance5, kStringAppearance6, kStringAppearance7, +kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11, kStringAppearance12, +kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17, +kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22, +kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27, +kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kString454, kString455, kString456, kString457, kString458, kString459, kString460, kString461, kString462, kString463, kString464, kString465, kString466, kString467, kString468, kString469, diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp index b4becd80a7..29a272d8a4 100644 --- a/engines/supernova2/resman.cpp +++ b/engines/supernova2/resman.cpp @@ -46,15 +46,16 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version static const AudioInfo audioInfo[kAudioNumSamples] = { {55, 18230, -1}, - {47, 0, 16010}, + {47, 0, 16010}, {47, 16010, -1}, - {49, 8010, -1}, - {49, 0, 8010}, + {49, 8010, -1}, + {49, 0, 8010}, {53, 30020, -1}, - {53, 0, -1}, - {54, 0, -1}, - {55, 0, -1}, - {56, 0, -1}, + {55, 7010, 17020}, + {55, 0, 7010}, + {53, 5010, 30020}, + {55, 18230, -1}, + {55, 17020, 18230} }; static const byte mouseNormal[64] = { @@ -183,14 +184,14 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) { } } -const MS2Image *ResourceManager::getImage(int filenumber) const { +MS2Image *ResourceManager::getImage(int filenumber) { if (filenumber < 47) return &_images[filenumber]; else return nullptr; } -const byte *ResourceManager::getImage(CursorId id) const { +const byte *ResourceManager::getCursor(CursorId id) const { switch (id) { case kCursorNormal: return _cursorNormal; diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h index 325cfb20d8..edcd294e77 100644 --- a/engines/supernova2/resman.h +++ b/engines/supernova2/resman.h @@ -51,8 +51,8 @@ public: Audio::SeekableAudioStream *getSoundStream(AudioId index); Audio::AudioStream *getSoundStream(MusicId index); - const MS2Image *getImage(int filenumber) const; - const byte *getImage(CursorId id) const; + MS2Image *getImage(int filenumber); + const byte *getCursor(CursorId id) const; private: void initSoundFiles(); 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; diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h index 71c8637fd9..16865a0120 100644 --- a/engines/supernova2/rooms.h +++ b/engines/supernova2/rooms.h @@ -89,7 +89,6 @@ private: bool tvDialogue(); bool thoughts2(); - int _restTime; Common::String _introText; }; @@ -174,9 +173,12 @@ public: virtual bool interact(Action verb, Object &obj1, Object &obj2); private: + void appearance(); bool _var1; - bool _var2; + int _var2; bool _var3; + bool _var4; + bool _var5; }; class City1 : public Room { diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp index 9f04defb00..29aa52ecbd 100644 --- a/engines/supernova2/screen.cpp +++ b/engines/supernova2/screen.cpp @@ -181,7 +181,7 @@ Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan) , _textCursorY(0) , _messageShown(false) { - CursorMan.replaceCursor(_resMan->getImage(ResourceManager::kCursorNormal), + CursorMan.replaceCursor(_resMan->getCursor(ResourceManager::kCursorNormal), 16, 16, 0, 0, kColorCursorTransparent); CursorMan.replaceCursorPalette(initVGAPalette, 0, 16); CursorMan.showMouse(true); @@ -203,7 +203,7 @@ void Screen::setGuiBrightness(int brightness) { _guiBrightness = brightness; } -const MS2Image *Screen::getCurrentImage() const { +MS2Image *Screen::getCurrentImage() { return _currentImage; } @@ -460,7 +460,7 @@ int Screen::textWidth(const Common::String &text) { return Screen::textWidth(text.c_str()); } -void Screen::renderMessage(const char *text, MessagePosition position) { +void Screen::renderMessage(const char *text, MessagePosition position, int positionX, int positionY) { Common::String t(text); char *row[20]; Common::String::iterator p = t.begin(); @@ -518,6 +518,11 @@ void Screen::renderMessage(const char *text, MessagePosition position) { y = 142; } + if (positionX != -1 && positionY != -1) { + x = positionX; + y = positionY; + } + int message_columns = x - 3; int message_rows = y - 3; int message_width = rowWidthMax + 6; diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h index e952006beb..7b9c964e9c 100644 --- a/engines/supernova2/screen.h +++ b/engines/supernova2/screen.h @@ -139,7 +139,7 @@ public: void setViewportBrightness(int brightness); int getGuiBrightness() const; void setGuiBrightness(int brightness); - const MS2Image *getCurrentImage() const; + MS2Image *getCurrentImage(); const ImageInfo *getImageInfo(ImageId id) const; bool isMessageShown() const; void paletteFadeIn(int maxViewportBrightness); @@ -152,7 +152,7 @@ public: void saveScreen(const GuiElement &guiElement); void restoreScreen(); void renderRoom(Room &room); - void renderMessage(const char *text, MessagePosition position = kMessageNormal); + void renderMessage(const char *text, MessagePosition position = kMessageNormal, int positionX = -1, int positionY = -1); void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal); void renderMessage(StringId stringId, MessagePosition position = kMessageNormal, Common::String var1 = "", Common::String var2 = ""); @@ -181,7 +181,7 @@ private: private: Supernova2Engine *_vm; ResourceManager *_resMan; - const MS2Image *_currentImage; + MS2Image *_currentImage; ScreenBufferStack _screenBuffer; int _screenWidth; int _screenHeight; diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h index 2bbc982586..7798c7a38d 100644 --- a/engines/supernova2/sound.h +++ b/engines/supernova2/sound.h @@ -37,7 +37,12 @@ enum AudioId { kAudioTaxiLeaving, kAudioTaxiArriving, kAudioKiosk, - kAudioNumSamples = 10 //TODO find out how many samples there are + kAudioStage1, + kAudioStage2, + kAudioAppearance1, + kAudioAppearance2, + kAudioAppearance3, + kAudioNumSamples }; enum MusicId { diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index 4313aade76..25d3accd40 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -41,6 +41,7 @@ bool GameManager::serialize(Common::WriteStream *out) { out->writeByte(_state._poleMagnet); out->writeByte(_state._admission); out->writeByte(_state._tipsy); + out->writeByte(_state._dark); out->writeUint32LE(_state._eventTime); out->writeSint32LE(_state._eventCallback); @@ -74,6 +75,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) { _state._poleMagnet = in->readByte(); _state._admission = in->readByte(); _state._tipsy = in->readByte(); + _state._dark = in->readByte(); _state._eventTime = in->readUint32LE(); _state._eventCallback = (EventFunction)in->readSint32LE(); _vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money)); @@ -316,6 +318,7 @@ void GameManager::initState() { _mouseY = -1; _mouseField = -1; _inventoryScroll = 0; + _restTime = 0; _oldTime = g_system->getMillis(); _timerPaused = 0; _timePaused = false; @@ -340,6 +343,7 @@ void GameManager::initState() { _state._poleMagnet = false; _state._admission = 0; _state._tipsy = false; + _state._dark = false; _state._eventTime = kMaxTimerValue; _state._eventCallback = kNoFn; } @@ -925,11 +929,13 @@ void GameManager::reply(const char *text, int aus1, int aus2) { _vm->renderMessage(text, kMessageTop); for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) { - _vm->renderImage(aus1); + if (aus1) + _vm->renderImage(aus1); waitOnInput(2); if (_keyPressed || _mouseClicked) z = 1; - _vm->renderImage(aus2); + if (aus2) + _vm->renderImage(aus2); waitOnInput(2); if (_keyPressed || _mouseClicked) z = 1; @@ -1297,6 +1303,13 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { return true; } +void GameManager::drawGUI() { + drawMapExits(); + drawInventory(); + drawStatus(); + drawCommandBox(); +} + void GameManager::playCD() { CursorMan.showMouse(false); _vm->playSound(kMusicMadMonkeys); @@ -1611,10 +1624,58 @@ void GameManager::playerTakeOut() { takeObject(*o); } -void GameManager::sober() -{ +void GameManager::sober() { _state._tipsy = false; } +bool GameManager::talk(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 (waitOnInput(2, key)) { + _vm->removeMessage(); + return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit(); + } + if (mod2) + _vm->renderImage(mod2); + + if (waitOnInput(2, key)) { + _vm->removeMessage(); + return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit(); + } + animation_count--; + } + if (_restTime == 0) + _vm->removeMessage(); + + return true; +} + +bool GameManager::talkRest(int mod1, int mod2, int rest) { + Common::KeyCode key = Common::KEYCODE_INVALID; + while (rest) { + _vm->renderImage(mod1); + if (waitOnInput(2, key)) { + _vm->removeMessage(); + return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit(); + } + _vm->renderImage(mod2); + if (waitOnInput(2, key)) { + _vm->removeMessage(); + return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit(); + } + rest--; + } + return true; +} + } diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h index 32037fd5f7..2382cd0aec 100644 --- a/engines/supernova2/state.h +++ b/engines/supernova2/state.h @@ -42,6 +42,7 @@ struct GameState { bool _poleMagnet; char _admission; bool _tipsy; + bool _dark; EventFunction _eventCallback; uint32 _eventTime; }; @@ -145,6 +146,7 @@ public: int32 _oldTime; uint _timePaused; bool _timerPaused; + int _restTime; int32 _messageDuration; int32 _animationTimer; int _inventoryScroll; @@ -203,6 +205,9 @@ public: void playerTakeOut(); void sober(); void playCD(); + void drawGUI(); + bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id); + bool talkRest(int mod1, int mod2, int rest); private: int _prevImgId; diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp index 683d711cbe..0427172aad 100644 --- a/engines/supernova2/supernova2.cpp +++ b/engines/supernova2/supernova2.cpp @@ -291,6 +291,10 @@ void Supernova2Engine::renderMessage(StringId stringId, MessagePosition position _gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10; _screen->renderMessage(stringId, position, var1, var2); } +void Supernova2Engine::renderMessage(StringId stringId, int x, int y) { + _gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10; + _screen->renderMessage(getGameString(stringId).c_str(), kMessageNormal, x, y); +} void Supernova2Engine::removeMessage() { _screen->removeMessage(); diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h index 0e1b0c0e66..748eef3e19 100644 --- a/engines/supernova2/supernova2.h +++ b/engines/supernova2/supernova2.h @@ -113,6 +113,7 @@ public: void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal); void renderMessage(StringId stringId, MessagePosition position = kMessageNormal, Common::String var1 = "", Common::String var2 = ""); + void renderMessage(StringId stringId, int x, int y); void removeMessage(); void renderText(const uint16 character); void renderText(const char *text); |