aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/supernova2/ms2_def.h36
-rw-r--r--engines/supernova2/resman.cpp19
-rw-r--r--engines/supernova2/resman.h4
-rw-r--r--engines/supernova2/rooms.cpp470
-rw-r--r--engines/supernova2/rooms.h6
-rw-r--r--engines/supernova2/screen.cpp11
-rw-r--r--engines/supernova2/screen.h6
-rw-r--r--engines/supernova2/sound.h7
-rw-r--r--engines/supernova2/state.cpp69
-rw-r--r--engines/supernova2/state.h5
-rw-r--r--engines/supernova2/supernova2.cpp4
-rw-r--r--engines/supernova2/supernova2.h1
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);