aboutsummaryrefslogtreecommitdiff
path: root/engines/supernova/supernova2/rooms.cpp
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-06-21 22:30:43 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commit3cf9cfbf78433e81ac5dcc39b31f5fa76983bde4 (patch)
tree883aacdbb2473884e15fc81c8f20fda6316a2850 /engines/supernova/supernova2/rooms.cpp
parenteb2a017a68e965b46881a2b41d9178d5e20b05b2 (diff)
downloadscummvm-rg350-3cf9cfbf78433e81ac5dcc39b31f5fa76983bde4.tar.gz
scummvm-rg350-3cf9cfbf78433e81ac5dcc39b31f5fa76983bde4.tar.bz2
scummvm-rg350-3cf9cfbf78433e81ac5dcc39b31f5fa76983bde4.zip
SUPERNOVA: Merge in the supernova2 engine.
Diffstat (limited to 'engines/supernova/supernova2/rooms.cpp')
-rw-r--r--engines/supernova/supernova2/rooms.cpp4758
1 files changed, 4758 insertions, 0 deletions
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
new file mode 100644
index 0000000000..01ccb59463
--- /dev/null
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -0,0 +1,4758 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "common/config-manager.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/supernova2/state.h"
+#include "supernova/supernova2/rooms.h"
+#include "supernova/supernova2/stringid.h"
+#include "supernova/graphics.h"
+
+namespace Supernova {
+
+Intro2::Intro2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = -1;
+ _id = INTRO2;
+
+ _objectState[0] = Object(_id, kStringKnife, kStringKnifeDescription, KNIFE, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+ _objectState[1] = Object(_id, kStringMoney, kStringDefaultDescription, MONEY, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+ _objectState[2] = Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+ _objectState[3] = Object(_id, kStringSuctionCup, kStringSuctionCupDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
+ _objectState[4] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+ _objectState[5] = Object(_id, kStringSpecialCard, kStringSpecialCardDescription, SP_KEYCARD, TAKE | COMBINABLE, 255, 255, 0);
+ _objectState[6] = Object(_id, kStringAlarmCracker, kStringAlarmCrackerDescription, ALARM_CRACKER, TAKE | COMBINABLE, 255, 255, 0);
+ _objectState[7] = Object(_id, kStringDinosaurHead, kStringDefaultDescription, NULLOBJECT, TAKE, 255, 255, 0);
+ _objectState[8] = Object(_id, kStringKeycard, kStringDefaultDescription, MUSCARD, TAKE, 255, 255, 0);
+
+ _introText =
+ _vm->getGameString(kStringIntro1) + '\0' +
+ _vm->getGameString(kStringIntro2) + '\0' +
+ _vm->getGameString(kStringIntro3) + '\0' +
+ _vm->getGameString(kStringIntro4) + '\0' +
+ _vm->getGameString(kStringIntro5) + '\0' +
+ "^Matthias Neef#" + '\0' +
+ "^Sascha Otterbach#" + '\0' +
+ "^Thomas Mazzoni#" + '\0' +
+ "^Matthias Klein#" + '\0' +
+ "^Gerrit Rothmaier#" + '\0' +
+ "^Thomas Hassler#" + '\0' +
+ "^Rene Kach#" + '\0' +
+ '\233' + '\0';
+}
+
+void Intro2::onEntrance() {
+ _gm->_guiEnabled = false;
+ _vm->_allowSaveGame = false;
+ _vm->_allowLoadGame = false;
+
+ titleScreen();
+ if (!(thoughts1() && tvDialogue() && thoughts2()))
+ _gm->_rooms[AIRPORT]->setRoomSeen(true);
+ _vm->paletteFadeOut();
+
+ for (int i = 0; i < 3; ++i)
+ _gm->_inventory.add(*_gm->_rooms[INTRO2]->getObject(i));
+
+ _gm->changeRoom(AIRPORT);
+ _gm->_guiEnabled = true;
+ _vm->_allowSaveGame = true;
+ _vm->_allowLoadGame = true;
+}
+
+void Intro2::titleScreen() {
+ CursorMan.showMouse(false);
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_screen->setViewportBrightness(0);
+ _vm->_screen->setGuiBrightness(0);
+ _vm->paletteBrightness();
+ _vm->setCurrentImage(1);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ _gm->wait(15);
+ _vm->renderImage(1);
+ _gm->wait(15);
+ _vm->renderImage(2);
+ const Common::String title1 = "V1.02";
+ _vm->_screen->renderText(title1, 295, 190, 3);
+
+ _vm->playSound(kMusicIntro);
+ Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
+ while (!_vm->shouldQuit()) {
+ _gm->updateEvents();
+ marquee.renderCharacter();
+ if (_gm->_mouseClicked || _gm->_keyPressed)
+ break;
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
+ _vm->stopSound();
+ _vm->paletteFadeOut();
+ CursorMan.showMouse(true);
+}
+
+bool Intro2::displayThoughtMessage(int id) {
+ Common::KeyCode key = Common::KEYCODE_INVALID;
+ const Common::String& text = _vm->getGameString(id);
+ _vm->renderMessage(text, kMessageNormal);
+ if (_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10, key)) {
+ _vm->removeMessage();
+ return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+ }
+ _vm->removeMessage();
+ return true;
+}
+
+bool Intro2::thoughts1() {
+ if(_vm->shouldQuit())
+ return false;
+
+ _vm->setCurrentImage(41);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+
+ if(!displayThoughtMessage(kStringIntro6))
+ return false;
+
+ if(!displayThoughtMessage(kStringIntro7))
+ return false;
+
+ if(!displayThoughtMessage(kStringIntro8))
+ return false;
+
+ _vm->paletteFadeOut();
+ return true;
+}
+
+bool Intro2::thoughts2() {
+ if(_vm->shouldQuit())
+ return false;
+
+ _vm->setCurrentImage(41);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+
+ if(!displayThoughtMessage(kStringIntro9))
+ return false;
+
+ if(!displayThoughtMessage(kStringIntro10))
+ return false;
+
+ if(!displayThoughtMessage(kStringIntro11))
+ return false;
+
+ _vm->paletteFadeOut();
+
+ _vm->setCurrentImage(2);
+ _vm->renderImage(0);
+ _vm->renderImage(1);
+ _vm->paletteFadeIn();
+
+ for (int i = 0; i < 35; i++)
+ {
+ _vm->renderImage((i % 3) + 2);
+ _gm->wait(3);
+ }
+ _vm->paletteFadeOut();
+
+ _vm->setCurrentImage(41);
+ _vm->renderImage(0);
+ _vm->renderImage(1);
+ _vm->paletteFadeIn();
+
+ if(!displayThoughtMessage(kStringIntro12))
+ return false;
+
+ if(!displayThoughtMessage(kStringIntro13))
+ return false;
+
+ if(!displayThoughtMessage(kStringIntro14))
+ return false;
+
+ _vm->paletteFadeOut();
+ return true;
+}
+
+bool Intro2::tvDialogue() {
+ if(_vm->shouldQuit())
+ return false;
+
+ _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(kAudioIntroDing);
+ _gm->wait(30);
+ _vm->renderImage(11);
+ _vm->playSound(kAudioIntroDing);
+ _gm->wait(60);
+
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->setCurrentImage(42);
+ _vm->renderImage(0);
+
+ if(!_gm->talk(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
+ return false;
+
+ _vm->renderImage(4);
+ _gm->wait(3);
+ _vm->renderImage(6);
+
+ if(!_gm->talk(8, 6, 7, kMessageLeft, kStringIntroTV2))
+ return false;
+ debug("%d", _vm->shouldQuit());
+
+ _vm->renderImage(10);
+
+ if(!_gm->talkRest(8, 6, _gm->_restTime))
+ return false;
+
+ _vm->removeMessage();
+
+ if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV3))
+ return false;
+
+ if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV4))
+ return false;
+
+ _vm->renderImage(10 + 128);
+ _gm->wait(3);
+ _vm->renderImage(5);
+ _gm->wait(3);
+ _vm->renderImage(7);
+
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV5))
+ return false;
+
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV6))
+ return false;
+
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV7))
+ return false;
+
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
+ return false;
+
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
+ return false;
+
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV10))
+ return false;
+
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
+ return false;
+
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
+ return false;
+
+ if(!_gm->talk(9, 7, 8, kMessageCenter, kStringIntroTV13))
+ return false;
+
+ _vm->renderImage(4);
+
+ if(!_gm->talkRest(9, 7, 1))
+ return false;
+
+ _vm->renderImage(4 + 128);
+
+ if(!_gm->talkRest(9, 7, 3))
+ return false;
+
+ _vm->renderImage(4);
+
+ if(!_gm->talkRest(9, 7, 1))
+ return false;
+
+ _vm->renderImage(6);
+
+ if(!_gm->talkRest(9, 7, _gm->_restTime - 5))
+ return false;
+
+ _vm->removeMessage();
+
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
+ return false;
+
+ if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
+ return false;
+
+ if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV16))
+ return false;
+
+ return true;
+}
+
+Airport::Airport(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 2;
+ _id = AIRPORT;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringSpaceship, kStringSpaceshipDescription, NULLOBJECT, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+ _objectState[1] = Object(_id, kStringVehicles, kStringVehiclesDescription, NULLOBJECT, EXIT, 1, 1, 0, TAXISTAND, 8);
+}
+
+void Airport::onEntrance() {
+ if (hasSeen() == false) {
+ _vm->renderMessage(kStringAirportEntrance);
+ }
+ setRoomSeen(true);
+}
+
+TaxiStand::TaxiStand(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 3;
+ _id = TAXISTAND;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[7] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringVehicle, kStringVehicleDescription, TAXI, NULLTYPE, 2, 2, 0, NULLROOM, 11);
+ _objectState[1] = Object(_id, kStringVehicle, kStringVehicleDescription, NULLOBJECT, NULLTYPE, 1, 1, 0);
+ _objectState[2] = Object(_id, kStringEntrance, kStringEntranceDescription, DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, NULLROOM, 1);
+ _objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + 128);
+ _objectState[4] = Object(_id, kStringDevice, kStringDeviceDescription, TRANSMITTER, TAKE | PRESS, 255, 255, 0);
+ _objectState[5] = Object(_id, kStringIdCard, kStringIdCardDescription, ID_CARD, TAKE | COMBINABLE, 255, 255, 0);
+ _objectState[6] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
+}
+
+void TaxiStand::onEntrance() {
+ setRoomSeen(true);
+}
+
+void TaxiStand::animation() {
+ if (isSectionVisible(4)) {
+ setSectionVisible(1, kShownFalse);
+ setSectionVisible(2, kShownFalse);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ }
+ else if (isSectionVisible(3))
+ setSectionVisible(4, kShownTrue);
+ else if (isSectionVisible(2))
+ setSectionVisible(3, kShownTrue);
+ else if (isSectionVisible(1))
+ setSectionVisible(2, kShownTrue);
+ else
+ setSectionVisible(1, kShownTrue);
+ _gm->setAnimationTimer(7);
+}
+
+bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_WALK && obj1._id == TAXI && isSectionVisible(6))
+ _gm->taxi();
+ else if ((verb == ACTION_WALK || verb == ACTION_OPEN) && obj1._id == DOOR)
+ _vm->renderMessage(obj1._description);
+ else
+ return false;
+ return true;
+}
+
+Street::Street(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 5;
+ _id = STREET;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, GAMES, 10);
+ _objectState[1] = Object(_id, kStringStaircase, kStringStaircaseDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+ _objectState[2] = Object(_id, kStringBusinessStreet, kStringBusinessStreetDescription, REAR_STREET, EXIT, 3, 3, 0, KIOSK, 3);
+ _objectState[3] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 7, 7, 22);
+ _objectState[4] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 6, 6, 0);
+ _objectState[5] = Object(_id, kStringPost, kStringLooksMetal, NULLOBJECT, NULLTYPE, 4, 4, 0);
+ _objectState[6] = Object(_id, kStringRailing, kStringLooksMetal, NULLOBJECT, NULLTYPE, 5, 5, 0);
+}
+
+void Street::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Street::animation() {
+ static int ltab[36] = {
+ 8, 9 + 128, 10, 11 + 128, 6, 12, 13 + 128, 9, 14, 15 + 128, 19,
+ 16, 17 + 128, 9 + 128, 18, 19 + 128, 6 + 128, 20, 21 + 128,
+ 8 + 128, 9, 10 + 128, 11, 6, 12 + 128, 13, 14 + 128, 15, 19,
+ 16 + 128, 17, 18 + 128, 19 + 128, 6 + 128, 20 + 128, 21
+ };
+
+ static int i, banks, light;
+
+ if (isSectionVisible(7))
+ setSectionVisible(7, kShownFalse);
+ else
+ setSectionVisible(7, kShownTrue);
+
+ if (++i == 4) {
+ i = 0;
+ switch (banks) {
+ case 0:
+ setSectionVisible(1, kShownTrue);
+ break;
+ case 1:
+ setSectionVisible(2, kShownTrue);
+ break;
+ case 2:
+ setSectionVisible(3, kShownTrue);
+ break;
+ case 3:
+ setSectionVisible(4, kShownTrue);
+ break;
+ case 4:
+ setSectionVisible(5, kShownTrue);
+ break;
+ case 5:
+ // fall through
+ case 7:
+ // fall through
+ case 9:
+ setSectionVisible(1, kShownFalse);
+ setSectionVisible(2, kShownFalse);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ setSectionVisible(5, kShownFalse);
+ break;
+ case 6:
+ // fall through
+ case 8:
+ setSectionVisible(1, kShownTrue);
+ setSectionVisible(2, kShownTrue);
+ setSectionVisible(3, kShownTrue);
+ setSectionVisible(4, kShownTrue);
+ setSectionVisible(5, kShownTrue);
+ break;
+ }
+ banks++;
+ if (banks == 10) banks = 0;
+ }
+ setSectionVisible(ltab[light], kShownTrue);
+ light++;
+ if (light == 36)
+ light = 0;
+ _gm->setAnimationTimer(2);
+}
+
+bool Street::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, KNIFE, ROD)) {
+ if (getObject(3)->_type & CARRIED)
+ _vm->renderMessage(kStringAlreadyHavePole);
+ else {
+ _vm->renderMessage(kStringSawPole);
+ _gm->takeObject(*getObject(3));
+ _vm->playSound(kAudioSuccess2);
+ }
+ } else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
+ Common::String text = _vm->getGameString(kStringOnlyShop);
+ _vm->renderMessage(text);
+ _gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+ _vm->removeMessage();
+ return false;
+ } else
+ return false;
+ return true;
+}
+
+Games::Games(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 6;
+ _id = GAMES;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringPoster, kStringPosterDescription, POSTER, UNNECESSARY, 3, 3, 0);
+ _objectState[1] = Object(_id, kStringCabin, kStringCabinFree, NULLOBJECT, EXIT, 1, 1, 0, CABIN2, 9);
+ _objectState[2] = Object(_id, kStringCabin, kStringCabinOccupied, OCCUPIED_CABIN, NULLTYPE, 0, 0, 0);
+ _objectState[3] = Object(_id, kStringFeet, kStringFeetDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+ _objectState[4] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
+}
+
+void Games::onEntrance() {
+ setRoomSeen(true);
+}
+
+bool Games::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_WALK && obj1._id == OCCUPIED_CABIN) {
+ _vm->renderMessage(kStringCabinOccupiedSay);
+ } else if (verb == ACTION_LOOK && obj1._id == POSTER) {
+ _gm->_state._taxiPossibility &= ~4; // add culture palace
+ return false;
+ } else
+ return false;
+ return true;
+}
+
+Cabin2::Cabin2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 7;
+ _id = CABIN2;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, GAMES, 22);
+ _objectState[1] = Object(_id, kStringHood, kStringHoodDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+ _objectState[2] = Object(_id, kString400Xa, kStringDefaultDescription, PRIZE, TAKE, 255, 255, 2 + 180);
+ _objectState[3] = Object(_id, kString10Xa, kStringDefaultDescription, BACK_MONEY, TAKE, 255, 255, 2 + 128);
+ _objectState[4] = Object(_id, kStringSlot, kStringSlotDescription1, SLOT1, COMBINABLE, 2, 2, 0);
+ _objectState[5] = Object(_id, kStringSlot, kStringSlotDescription2, NULLOBJECT, COMBINABLE, 3, 3, 0);
+ _objectState[6] = Object(_id, kStringChair, kStringChairDescription, CHAIR, NULLTYPE, 4, 4, 0);
+ _objectState[7] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE1, NULLTYPE, 5, 5, 0);
+ _objectState[8] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE2, NULLTYPE, 6, 6, 0);
+ _objectState[9] = Object(_id, kStringFace, kStringFaceDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+ _objectState[10] = Object(_id, kStringSign, kStringDefaultDescription, SIGN, UNNECESSARY, 1, 1, 0);
+}
+
+void Cabin2::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Cabin2::animation() {
+ if (_shown[kMaxSection - 1]) {
+ if (isSectionVisible(1))
+ _vm->renderImage(1 + 128);
+ else
+ _vm->renderImage(1);
+ }
+ _gm->setAnimationTimer(4);
+}
+
+bool Cabin2::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, MONEY, SLOT1)) {
+ if (isSectionVisible(2))
+ _vm->renderMessage(kStringTakeMoney);
+ else if (_shown[kMaxSection - 1])
+ _vm->renderMessage(kStringAlreadyPaid);
+ else if (_gm->_state._money < 10)
+ _vm->renderMessage(kStringNoMoney);
+ else {
+ _vm->renderMessage(kStringPay10Xa);
+ _gm->takeMoney(-10);
+ _shown[kMaxSection - 1] = true;
+ }
+ } else if (verb == ACTION_USE && obj1._id == CHAIR) {
+ if (_shown[kMaxSection - 1]) {
+ if (_shown[kMaxSection - 2]) {
+ _vm->paletteFadeOut();
+ _vm->setCurrentImage(31);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ _shown[kMaxSection - 1] = true;
+ _gm->getInput();
+ _vm->paletteFadeOut();
+ _vm->setCurrentImage(7);
+ _vm->renderImage(0);
+ setSectionVisible(1, kShownFalse);
+ _shown[kMaxSection - 1] = false;
+ _vm->renderRoom(*this);
+ _vm->renderImage(2);
+ _gm->drawGUI();
+ _vm->paletteFadeIn();
+ getObject(3)->_click = 8;
+ } else {
+ _gm->_state._tipsy = false;
+ _vm->paletteFadeOut();
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_screen->setViewportBrightness(255);
+ Common::String text = _vm->getGameString(kStringWillPassOut);
+ _vm->renderMessage(text);
+ _gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+ _vm->removeMessage();
+ _vm->paletteFadeOut();
+ _vm->saveGame(kSleepAutosaveSlot, "autosave");
+ _gm->_inventory.clear();
+ _gm->changeRoom(PYRAMID);
+ _gm->drawGUI();
+ }
+ } else
+ _vm->renderMessage(kStringRest);
+ } else if (verb == ACTION_TAKE && obj1._id == PRIZE) {
+ _vm->renderImage(2 + 128);
+ obj1._click = 255;
+ _gm->takeMoney(400);
+ } else if (verb == ACTION_TAKE && obj1._id == BACK_MONEY) {
+ _vm->renderImage(2 + 128);
+ obj1._click = 255;
+ _gm->takeMoney(10);
+ } else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE1) {
+ _vm->renderMessage(kStringCypher);
+ } else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE2) {
+ _gm->animationOff();
+ _vm->setCurrentImage(28);
+ _vm->renderImage(0);
+ _gm->getInput();
+ _vm->setCurrentImage(7);
+ _vm->renderRoom(*this);
+ _gm->drawGUI();
+ _gm->_state._addressKnown = true;
+ _gm->animationOn();
+ } else if (verb == ACTION_LOOK && obj1._id == SIGN) {
+ _gm->animationOff();
+ _vm->setCurrentImage(38);
+ _vm->renderImage(0);
+ _gm->getInput();
+ _vm->setCurrentImage(7);
+ _vm->renderRoom(*this);
+ _gm->drawGUI();
+ _gm->animationOn();
+ } else
+ return false;
+ return true;
+}
+
+Kiosk::Kiosk(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 19;
+ _id = KIOSK;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
+ _objectState[1] = Object(_id, kStringBooks, kStringDefaultDescription, BOOKS, UNNECESSARY, 0, 0, 0);
+ _objectState[2] = Object(_id, kStringDictionary, kStringDefaultDescription, LEXICON, UNNECESSARY, 1, 1, 0);
+ _objectState[3] = Object(_id, kStringPlant, kStringDefaultDescription, PLANT, UNNECESSARY, 2, 2, 0);
+ _objectState[4] = Object(_id, kStringMask, kStringDefaultDescription, BMASK, UNNECESSARY, 4, 4, 2 + 128);
+ _objectState[5] = Object(_id, kStringSnake, kStringDefaultDescription, SNAKE, UNNECESSARY, 3, 3, 0);
+ _objectState[6] = Object(_id, kStringCup, kStringDefaultDescription, CUP, UNNECESSARY, 5, 5, 0);
+ _objectState[7] = Object(_id, kStringJoystick, kStringDefaultDescription, JOYSTICK, UNNECESSARY, 6, 6, 0);
+ _objectState[8] = Object(_id, kStringToothbrush, kStringToothbrushDescription, TOOTHBRUSH, TAKE, 7, 7, 5 + 128);
+ _objectState[9] = Object(_id, kStringMusic, kStringMusicDescription, PLAYER, TAKE | COMBINABLE, 8, 8, 4 + 128);
+ _objectState[10] = Object(_id, kStringBottle, kStringBottleDescription, BOTTLE, TAKE, 9, 9, 3 + 128);
+ _objectState[11] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE1, UNNECESSARY, 10, 10, 0);
+ _objectState[12] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE2, UNNECESSARY, 11, 11, 0);
+ _objectState[13] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE3, UNNECESSARY, 12, 12, 0);
+ _objectState[14] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE4, UNNECESSARY, 13, 13, 0);
+ _objectState[15] = Object(_id, kStringBox, kStringDefaultDescription, BOX, UNNECESSARY, 14, 14, 0);
+ _objectState[16] = Object(_id, kStringFace, kStringDefaultDescription, FACES, UNNECESSARY, 15, 15, 0);
+ _objectState[17] = Object(_id, kStringSeller, kStringDefaultDescription, SELLER, TALK, 16, 16, 0);
+}
+
+void Kiosk::onEntrance() {
+ static int dialEntry[2] = {
+ kStringGoodEvening,
+ kStringHello
+ };
+
+ if (!hasSeen()) {
+ _gm->dialog(2, _gm->_dials, dialEntry, 0);
+ _vm->renderImage(6);
+ _vm->playSound(kAudioKiosk);
+ _gm->wait(8);
+ _vm->renderImage(6 + 128);
+ _gm->reply(kStringScaredMe, 1, 1 +128);
+ _gm->say(kStringHowSo);
+ _gm->reply(kStringDisguise, 1, 1 +128);
+ _gm->say(kStringWhatDisguise);
+ _gm->reply(kStringStopPretending, 1, 1 +128);
+ _gm->reply(kStringYouDisguised, 1, 1 +128);
+ _gm->say(kStringIAmHorstHummel);
+ _gm->reply(kStringGiveItUp, 1, 1 +128);
+ _gm->reply(kStringGestures, 1, 1 +128);
+ _gm->reply(kStringMovesDifferently, 1, 1 +128);
+ _gm->say(kStringHeIsRobot);
+ _gm->reply(kStringYouAreCrazy, 1, 1 +128);
+ _gm->say(kStringYouIdiot);
+ _gm->reply(kStringShutUp, 1, 1 +128);
+ _gm->drawGUI();
+ setRoomSeen(true);
+ }
+}
+
+void Kiosk::animation() {
+}
+
+bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
+ static int dialPrice[2] = {
+ kStringWillTakeIt,
+ kStringTooExpensive
+ };
+ static int dialSay[3] = {
+ kStringWouldBuy,
+ kStringMeHorstHummel,
+ kStringHaveMusicChip
+ };
+ static int dialSeller[16][3] = {
+ {kStringGreatMask, kStringThreeYears, kNoString},
+ {kStringStrongDrink, kNoString, kNoString},
+ {kStringMusicDevice, kNoString, kNoString},
+ {kStringArtusToothbrush, kStringSellInBulk, kNoString},
+ {kStringRarityBooks, kNoString, kNoString},
+ {kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words},
+ {kStringNotSale, kNoString, kNoString},
+ {kStringGaveOne, kStringExcited, kNoString},
+ {kStringFromGame, kNoString, kNoString},
+ {kStringRobust, kNoString, kNoString},
+ {kStringCheapSwill, kNoString, kNoString},
+ {kStringCheapSwill, kNoString, kNoString},
+ {kStringCheapSwill, kNoString, kNoString},
+ {kStringCheapSwill, kNoString, kNoString},
+ {kStringStickers, kNoString, kNoString},
+ {kStringDishes, kStringUgly, kStringSellsWell}
+ };
+
+ if (verb == ACTION_TAKE && !(obj1._type & CARRIED) &&
+ obj1._id >= BOTTLE && obj1._id <= TOOTHBRUSH) {
+ int price = 0;
+ switch (obj1._id) {
+ case BOTTLE:
+ price = 30;
+ break;
+ case PLAYER:
+ price = 50;
+ break;
+ case TOOTHBRUSH:
+ price = 5;
+ break;
+ default:
+ break;
+ }
+ Common::String format = _vm->getGameString(kStringThatCosts);
+ Common::String cost = Common::String::format(format.c_str(), price);
+ _vm->renderMessage(cost, kMessageTop);
+ _gm->reply(cost.c_str(), 1, 1 +128);
+
+ if (_gm->_state._money < price)
+ _gm->say(dialPrice[1]);
+ else if (_gm->dialog(2, _gm->_dials, dialPrice, 0) == 0) {
+ _gm->takeObject(obj1);
+ _gm->takeMoney(-price);
+ }
+ _gm->drawGUI();
+ } else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
+ for(int i = 0; i < 3; i++) {
+ _gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
+ }
+ } else if (verb == ACTION_TALK && obj1._id >= SELLER) {
+ int i = 2;
+ if (getObject(9)->_type & CARRIED)
+ i++;
+ switch (_gm->dialog(i, _gm->_dials, dialSay, 0)) {
+ case 0:
+ _gm->reply(kStringTakeALook, 1, 1 + 128);
+ break;
+ case 1:
+ _gm->reply(kStringNonsense, 1, 1 + 128);
+ break;
+ case 2:
+ _gm->reply(kStringImSorry, 1, 1 + 128);
+ break;
+ }
+ _gm->drawGUI();
+ } else
+ return false;
+ return true;
+}
+
+CulturePalace::CulturePalace(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 20;
+ _id = CULTURE_PALACE;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CHECKOUT, 6);
+ _objectState[1] = Object(_id, kStringCulturePalace, kStringFascinating, NULLOBJECT, NULLTYPE, 0, 0, 0);
+ _objectState[2] = Object(_id, kStringTaxis, kStringTaxisDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
+ _objectState[3] = Object(_id, kStringAxacussan, kStringDefaultDescription, AXACUSSER, TALK, 4, 4, 0);
+ _objectState[4] = Object(_id, kStringParticipationCard, kStringDefaultDescription, CARD, TAKE, 255, 255, 0);
+}
+
+void CulturePalace::onEntrance() {
+ setRoomSeen(true);
+}
+
+void CulturePalace::animation() {
+ static int i;
+ if (isSectionVisible(4))
+ setSectionVisible(4, kShownFalse);
+ else
+ setSectionVisible(4, kShownTrue);
+ i--;
+ if (i <= 0) {
+ if (isSectionVisible(3)) {
+ setSectionVisible(3, kShownFalse);
+ i = 4;
+ } else {
+ setSectionVisible(3, kShownTrue);
+ i = 10;
+ }
+ }
+ _gm->setAnimationTimer(2);
+}
+
+void CulturePalace::notEnoughMoney() {
+ _gm->reply(kStringWhat, 2, 1);
+ _gm->reply(kStringNotInformed, 2, 1);
+ _vm->renderImage(1 + 128);
+ setSectionVisible(2, kShownFalse);
+}
+
+bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
+ static int dial1[3] = {
+ kStringHorstHummel,
+ kStringNiceWeather,
+ kStringTellTicket,
+ };
+ static byte dials1[] = {1, 1, 2};
+
+ static int dial2[2] = {
+ kStringHereIsXa,
+ kStringYouAreCrazy
+ };
+ static int dial3[4] = {
+ kString500Xa,
+ kString1000Xa,
+ kString5000Xa,
+ kString10000Xa
+ };
+
+ int e;
+ if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+ if (_shown[kMaxSection - 3]) {
+ _vm->renderImage(1);
+ _gm->reply(kStringThankYou, 2, 1);
+ } else if (_shown[kMaxSection - 2]) {
+ _vm->renderImage(1);
+ _gm->reply(kStringWhatYouOffer, 2, 1);
+ } else {
+ _gm->say(kStringHello2);
+ _vm->renderImage(1);
+ _gm->reply(kStringWhatYouWant, 2, 1);
+ addSentence(1, 1);
+ switch (_gm->dialog(3, dials1, dial1, 1)) {
+ case 0:
+ _gm->reply(kStringWhoAreYou, 2, 1);
+ _gm->say(kStringHorstHummel2);
+ _gm->reply(kStringNeverHeard, 2, 1);
+ _gm->say(kStringYouDontKnow);
+ _gm->say(kStringImOnTV);
+ _gm->reply(kStringIDontKnow, 2, 1);
+ _gm->say(kStringFunny);
+ break;
+ case 1:
+ _gm->reply(kStringAha, 2, 1);
+ break;
+ case 2:
+ _gm->reply(kStringICan, 2, 1);
+ _gm->say(kStringFromWhom);
+ _gm->reply(kStringCost, 2, 1);
+ if(!_gm->_state._money)
+ addSentence(2, 1);
+ else if (_gm->dialog(2, _gm->_dials, dial2, 0)) {
+ _gm->reply(kStringAsYouSay, 2, 1);
+ addSentence(2, 1);
+ } else {
+ _gm->takeMoney(-1);
+ _gm->reply(kStringGetCard, 2, 1);
+ _gm->reply(kStringOnlyParticipation, 2, 1);
+ _gm->say(kStringWhatForIt);
+ _gm->reply(kStringMakeOffer, 2, 1);
+ _shown[kMaxSection - 2] = true;
+ }
+ break;
+ }
+ }
+ _vm->renderImage(1 + 128);
+ setSectionVisible(2, kShownFalse);
+ _gm->drawGUI();
+ }
+ else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _shown[kMaxSection - 2]) {
+ _vm->renderImage(1);
+ if (obj1._id != MONEY)
+ notEnoughMoney();
+ else {
+ if (_gm->_state._money >= 10000) {
+ if ((e = _gm->dialog(4, _gm->_dials, dial3, 0)) >= 2) {
+ _gm->reply(kStringGoodOffer, 2, 1);
+ _vm->playSound(kAudioSuccess2);
+ _gm->reply(kStringGiveCard, 2, 1);
+ if (e == 2)
+ _gm->takeMoney(-5000);
+ else
+ _gm->takeMoney(-10000);
+ _gm->takeObject(*getObject(4));
+ _vm->renderImage(1 + 128);
+ setSectionVisible(2, false);
+ _gm->reply(kStringIdiot, 0, 0);
+ _shown[kMaxSection - 2] = false;
+ _shown[kMaxSection - 3] = true;
+ _gm->_rooms[CHECKOUT]->addSentence(1,1);
+ _gm->drawGUI();
+ } else {
+ notEnoughMoney();
+ _gm->drawGUI();
+ }
+ } else
+ notEnoughMoney();
+ }
+ } else
+ return false;
+ return true;
+}
+
+Checkout::Checkout(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 21;
+ _id = CHECKOUT;
+ _shown[0] = kShownTrue;
+
+ _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);
+ _objectState[2] = Object(_id, kStringAxacussian, kStringDefaultDescription, AXACUSSER, TALK, 1, 1, 0);
+}
+
+void Checkout::onEntrance() {
+ if (!_shown[kMaxSection - 3]) {
+ _shown[kMaxSection - 3] = true;
+ _gm->reply(kStringAtMusicContest, 1, 1 + 128);
+ _gm->say(kStringNoImitation);
+ _gm->reply(kStringGoodJoke, 1, 1 + 128);
+ _gm->say(kStringIAmHorstHummel);
+ _gm->reply(kStringCommon, 1, 1 + 128);
+ _gm->say(kStringIWillProof);
+ _gm->say(kStringIWillPerform);
+ _gm->drawGUI();
+ }
+ setRoomSeen(true);
+}
+
+void Checkout::animation() {
+}
+
+bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
+ static int dialCheckout1[3] = {
+ kStringCheckout1,
+ kStringCheckout2,
+ kStringCheckout3
+ };
+ static int dialCheckout2[2] = {
+ kStringYes,
+ kStringNo
+ };
+ static int dialStage1[3] = {
+ kStringCheckout4,
+ kStringCheckout5,
+ kStringCheckout6
+ };
+ static int dialStage2[2] = {
+ kStringCheckout7,
+ kStringCheckout8
+ };
+ static int dialStage3[3] = {
+ kStringCheckout9,
+ kStringCheckout10,
+ kStringCheckout11
+ };
+ static int dialStage4[3] = {
+ kStringCheckout12,
+ kStringCheckout13
+ };
+ if (verb == ACTION_WALK && obj1._id == KP_ENTRANCE) {
+ if (_shown[kMaxSection - 4]) {
+ _vm->renderImage(2);
+ _gm->reply(kStringCheckout14, 0, 0);
+ _vm->renderImage(2 + 128);
+ } else if (_shown[kMaxSection - 2] == 0) {
+ _vm->renderImage(2);
+ _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 (_shown[kMaxSection - 2] == 1) {
+ _gm->reply(kStringCheckout19, 1, 1 + 128);
+ } else {
+ if (_gm->_state._tipsy) {
+ _vm->setCurrentImage(22);
+ _vm->renderImage(0);
+ if (_shown[kMaxSection - 5] && _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 (_shown[kMaxSection - 5])
+ _vm->renderMessage(kStringCheckout30);
+ else
+ _vm->renderMessage(kStringCheckout31);
+ _shown[kMaxSection - 4] = 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 &&
+ _shown[kMaxSection - 2] == 1) {
+ _gm->_inventory.remove(obj1);
+ _shown[kMaxSection - 5] = true;
+ _gm->reply(kStringCheckout37, 1, 1 + 128);
+ _shown[kMaxSection - 2] = 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);
+ _shown[kMaxSection - 2] = 1;
+ } else {
+ _gm->reply(kStringCheckout37, 1, 1 + 128);
+ _shown[kMaxSection - 2] = 2;
+ }
+ _gm->drawGUI();
+ } else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+ if (_shown[kMaxSection - 4]) {
+ _gm->say(kStringCheckout38);
+ _gm->reply(kStringCheckout39, 1, 1 + 128);
+ _gm->drawGUI();
+ } else {
+ switch (_shown[kMaxSection - 2]) {
+ 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::shouting() {
+ static int i = 0;
+ switch(i)
+ {
+ case 50:
+ _vm->renderMessage(kStringShout1, 100, 60);
+ break;
+ case 130:
+ _vm->renderMessage(kStringShout2, 50, 90);
+ break;
+ case 200:
+ _vm->renderMessage(kStringShout3, 200, 80);
+ break;
+ case 300:
+ _vm->renderMessage(kStringShout4, 70, 30);
+ break;
+ case 400:
+ _vm->renderMessage(kStringShout5, 190, 90);
+ break;
+ case 450:
+ _vm->renderMessage(kStringShout6, 160, 60);
+ break;
+ case 500:
+ _vm->renderMessage(kStringShout7, 180, 70);
+ break;
+ case 530:
+ _vm->renderMessage(kStringShout8, 50, 20);
+ break;
+ case 610:
+ _vm->renderMessage(kStringShout9, 230, 50);
+ break;
+ case 650:
+ _vm->renderMessage(kStringShout10, 100, 90);
+ break;
+ case 720:
+ _vm->renderMessage(kStringShout11, 176, 65);
+ break;
+ case 800:
+ _vm->renderMessage(kStringShout12, 60, 20);
+ break;
+ case 850:
+ _vm->renderMessage(kStringShout13, 160, 40);
+ break;
+ case 930:
+ _vm->renderMessage(kStringShout14, 60, 95);
+ break;
+ case 1000:
+ _vm->renderMessage(kStringShout15, 100, 65);
+ break;
+ case 70:
+ // fall through
+ case 150:
+ // fall through
+ case 220:
+ // fall through
+ case 320:
+ // fall through
+ case 420:
+ // fall through
+ case 470:
+ // fall through
+ case 520:
+ // fall through
+ case 550:
+ // fall through
+ case 630:
+ // fall through
+ case 680:
+ // fall through
+ case 740:
+ // fall through
+ case 820:
+ // fall through
+ case 870:
+ // fall through
+ case 950:
+ // fall through
+ case 1020:
+ _vm->removeMessage();
+ break;
+ default: {} //do nothing
+ }
+ i++;
+}
+
+void Checkout::appearance() {
+ _vm->_allowSaveGame = false;
+ _vm->_allowLoadGame = false;
+ int xp = 0;
+ CursorMan.showMouse(false);
+ _vm->playSound(kMusicMadMonkeys);
+ Common::KeyCode k = Common::KEYCODE_INVALID;
+ while(_vm->_sound->isPlaying()) {
+ if (_gm->waitOnInput(1, k))
+ break;
+ shouting();
+ }
+ _vm->_sound->stop();
+ _vm->removeMessage();
+ CursorMan.showMouse(true);
+ _vm->removeMessage();
+ _vm->playSound(kAudioAppearance1);
+ while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
+ _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->_screen->setViewportBrightness(255);
+ _vm->_screen->setGuiBrightness(255);
+ _vm->paletteBrightness();
+ _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->_screen->setViewportBrightness(0);
+ _vm->_screen->setGuiBrightness(0);
+ _vm->paletteBrightness();
+ _vm->setCurrentImage(44);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+
+ MSNImage *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->_screen->setViewportBrightness(255);
+ _vm->_screen->setGuiBrightness(255);
+ _vm->paletteBrightness();
+ _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;
+ _vm->_screen->setViewportBrightness(1);
+ _vm->paletteBrightness();
+ _gm->drawGUI();
+ _vm->_allowSaveGame = true;
+ _vm->_allowLoadGame = true;
+}
+
+City1::City1(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 23;
+ _id = CITY1;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringSign, kStringSign1Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
+ _objectState[1] = Object(_id, kStringSign, kStringSign2Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR2, 10);
+ _objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR2, 14);
+}
+
+void City1::onEntrance() {
+ setRoomSeen(true);
+}
+
+void City1::animation() {
+}
+
+bool City1::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
+ _objectState[0]._click = 255;
+ } else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
+ _objectState[0]._click = 2;
+ } else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
+ _objectState[1]._click = 255;
+ } else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
+ _objectState[1]._click = 3;
+ } else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
+ _gm->_state._elevatorNumber = 1;
+ } else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
+ _gm->_state._elevatorNumber = 2;
+ }
+ _gm->_rooms[ELEVATOR2]->getObject(5)->_exitRoom = CITY1;
+ _gm->_state._elevatorE = 0;
+ return false;
+}
+
+City2::City2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 23;
+ _id = CITY2;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringSign, kStringSign3Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
+ _objectState[1] = Object(_id, kStringSign, kStringSign4Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR2, 10);
+ _objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR2, 14);
+}
+
+void City2::onEntrance() {
+ setRoomSeen(true);
+}
+
+void City2::animation() {
+}
+
+bool City2::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
+ _objectState[0]._click = 255;
+ } else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
+ _objectState[0]._click = 2;
+ } else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
+ _objectState[1]._click = 255;
+ } else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
+ _objectState[1]._click = 3;
+ } else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
+ _gm->_state._elevatorNumber = 3;
+ } else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
+ _gm->_state._elevatorNumber = 4;
+ }
+ _gm->_rooms[ELEVATOR2]->getObject(5)->_exitRoom = CITY2;
+ _gm->_state._elevatorE = 0;
+ return false;
+}
+
+Elevator2::Elevator2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 24;
+ _id = ELEVATOR2;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringSlot, kStringDefaultDescription, SLOT, COMBINABLE, 0, 0, 0);
+ _objectState[1] = Object(_id, kStringBell, kStringDefaultDescription, BELL, PRESS, 1, 1, 0);
+ _objectState[2] = Object(_id, kStringDisplay, kStringDefaultDescription, DISPLAY, NULLTYPE, 2, 2, 0);
+ _objectState[3] = Object(_id, kStringKeypad, kStringKeypadDescription, KEYPAD, PRESS, 3, 3, 0);
+ _objectState[4] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | CLOSED, 4, 4, 0, APARTMENT, 3);
+ _objectState[5] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 255, 255, 0, CITY1, 22);
+}
+
+void Elevator2::onEntrance() {
+ if (_gm->_state._elevatorE)
+ _objectState[5]._type &= ~OPENED;
+ else
+ _objectState[5]._type |= OPENED;
+}
+
+void Elevator2::animation() {
+}
+
+bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
+ static int dialLuke1[4] = {
+ kStringElevator2,
+ kStringElevator3,
+ kStringElevator4,
+ kStringElevator5
+ };
+ static byte dialsLuke1[3] = {2,1,1};
+ static int dialBoss1[2] = {
+ kStringElevator6,
+ kStringElevator7
+ };
+ Common::String input;
+
+ if (verb == ACTION_LOOK && obj1._id == DISPLAY) {
+ Common::String format = _vm->getGameString(kStringElevator1);
+ Common::String display =
+ Common::String::format(format.c_str(), _gm->_state._elevatorE);
+ _vm->renderMessage(display);
+ } else if (verb == ACTION_PRESS && obj1._id == BELL) {
+ _vm->renderImage(8);
+ _vm->playSound(kAudioElevatorBell);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->renderImage(8 + 128);
+ if (_gm->_state._elevatorNumber == 4 && _gm->_state._elevatorE == 4 && !_gm->_state._toMuseum) {
+ _gm->wait(18);
+ _vm->renderImage(1);
+ _gm->wait(3);
+ _vm->renderImage(2);
+ setSectionVisible(1, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(3);
+ setSectionVisible(2, kShownFalse);
+ _gm->reply(kStringWhatYouWant, 4, 3);
+ switch (_gm->dialog(3, dialsLuke1, dialLuke1, 1)) {
+ case 0:
+ _gm->reply(kStringElevator11, 4, 3);
+ _vm->renderImage(2);
+ setSectionVisible(3, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(1);
+ setSectionVisible(2, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(1 + 128);
+ _vm->renderMessage(kStringElevator12);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderImage(1);
+ _gm->wait(3);
+ _vm->renderImage(2);
+ setSectionVisible(1, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(3);
+ setSectionVisible(2, kShownFalse);
+ _gm->reply(kStringElevator13, 4, 3);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ _vm->paletteFadeOut();
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_screen->setViewportBrightness(255);
+ _vm->renderMessage(kStringElevator14);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->_screen->setViewportBrightness(0);
+ _vm->setCurrentImage(26);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ _gm->reply(kStringElevator15, 1, 1 + 128);
+ _gm->say(kStringYes);
+ _gm->reply(kStringElevator16, 1, 1 + 128);
+ _gm->reply(kStringElevator17, 1, 1 + 128);
+ if (_gm->dialog(2, _gm->_dials, dialBoss1, 0)) {
+ _gm->reply(kStringElevator18, 1, 1 + 128);
+ _gm->reply(kStringElevator19, 1, 1 + 128);
+ _gm->say(kStringElevator20);
+ }
+ _gm->reply(kStringElevator21, 1, 1 + 128);
+ _gm->reply(kStringElevator22, 1, 1 + 128);
+ _gm->reply(kStringElevator23, 1, 1 + 128);
+ _gm->reply(kStringElevator24, 1, 1 + 128);
+ _gm->reply(kStringElevator25, 1, 1 + 128);
+ _gm->reply(kStringElevator26, 1, 1 + 128);
+ _gm->reply(kStringElevator27, 1, 1 + 128);
+ _gm->reply(kStringElevator28, 1, 1 + 128);
+ jobDescription();
+ return true;
+ case 1:
+ _gm->reply(kStringElevator59, 4, 3);
+ _vm->renderImage(2);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(1);
+ setSectionVisible(2, kShownFalse);
+ _vm->renderImage(1 + 128);
+ break;
+ case 2:
+ _gm->reply(kStringElevator60, 4, 3);
+ _vm->renderImage(2);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(1);
+ setSectionVisible(2, kShownFalse);
+ _vm->renderImage(1 + 128);
+ break;
+ }
+ _gm->drawGUI();
+ } else
+ _vm->renderMessage(kStringElevator61);
+ } else if ((verb == ACTION_USE || verb == ACTION_PRESS) && obj1._id == KEYPAD) {
+ _vm->renderMessage(kStringElevator62);
+ do {
+ _gm->edit(input, 237, 66, 2);
+ } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) &&
+ (_gm->_key.keycode != Common::KEYCODE_ESCAPE) && !_vm->shouldQuit());
+ _vm->removeMessage();
+ if (_gm->_key.keycode == Common::KEYCODE_RETURN && input[0] != 0) {
+ for (unsigned i = 0; i < input.size(); i++) {
+ if (input[i] < '0' || input[i] > '9') {
+ _vm->renderMessage(kStringElevator63);
+ return true;
+ }
+ }
+ int64 number = input.asUint64();
+ if (number > 60)
+ _vm->renderMessage(kStringElevator63);
+ else if (number != _gm->_state._elevatorE) {
+ if (isSectionVisible(6)) {
+ _vm->renderImage(6 + 128);
+ _objectState[4]._type &= ~OPENED;
+ _vm->playSound(kAudioElevator1);
+ }
+ _vm->renderMessage(kStringElevator64);
+ _gm->_state._elevatorE = number;
+ if (number)
+ _objectState[5]._type &= ~OPENED;
+ else
+ _objectState[5]._type |= OPENED;
+ }
+ }
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, ID_CARD, SLOT)) {
+ if (_gm->_state._elevatorNumber == 1 && _gm->_state._elevatorE == 32) {
+ _vm->renderImage(6);
+ _objectState[4]._type |= OPENED;
+ _vm->playSound(kAudioTaxiOpen);
+ } else
+ _vm->renderMessage(kStringElevator65);
+ } else
+ return false;
+ return true;
+}
+
+void Elevator2::jobDescription() {
+ static int dialBoss2[3] = {
+ kStringElevator8,
+ kStringElevator9,
+ kStringElevator10
+ };
+ byte dialsBoss2[4] = {1,1,1,1};
+
+ _gm->reply(kStringElevator29, 1, 1 + 128);
+ _gm->reply(kStringElevator30, 1, 1 + 128);
+ _gm->reply(kStringElevator31, 1, 1 + 128);
+ _gm->reply(kStringElevator32, 1, 1 + 128);
+ _vm->setCurrentImage(30);
+ _vm->renderImage(0);
+ _gm->waitOnInput(72);
+ _gm->reply(kStringElevator33, 0, 0);
+ _gm->reply(kStringElevator34, 0, 0);
+ _gm->reply(kStringElevator35, 0, 0);
+ _gm->reply(kStringElevator36, 0, 0);
+ _gm->reply(kStringElevator37, 0, 0);
+ _gm->reply(kStringElevator38, 0, 0);
+ _gm->reply(kStringElevator39, 0, 0);
+ _gm->reply(kStringElevator40, 0, 0);
+ _gm->reply(kStringElevator41, 0, 0);
+ _gm->reply(kStringElevator42, 0, 0);
+ _gm->reply(kStringElevator43, 0, 0);
+ _gm->reply(kStringElevator44, 0, 0);
+ _gm->reply(kStringElevator45, 0, 0);
+ _gm->reply(kStringElevator46, 0, 0);
+ _gm->reply(kStringElevator47, 0, 0);
+ _gm->reply(kStringElevator48, 0, 0);
+ _vm->setCurrentImage(26);
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->renderImage(0);
+ _gm->reply(kStringElevator49, 1, 1 + 128);
+ int e;
+ do {
+ addSentence(0, 2);
+ switch (e = _gm->dialog(4, dialsBoss2, dialBoss2, 2)) {
+ case 0:
+ _gm->reply(kStringElevator50, 1, 1 + 128);
+ jobDescription();
+ return;
+ case 1:
+ _gm->reply(kStringElevator51, 1, 1 + 128);
+ break;
+ case 2:
+ _gm->reply(kStringElevator52, 1, 1 + 128);
+ break;
+ }
+ if (e == 1 || e == 2)
+ _gm->reply(kStringElevator53, 1, 1 + 128);
+ } while (e != 3);
+ _gm->reply(kStringElevator54, 1, 1 + 128);
+ _vm->paletteFadeOut();
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_screen->setViewportBrightness(255);
+ _vm->renderMessage(kStringElevator55);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->_screen->setViewportBrightness(0);
+ _gm->_state._tipsy = false;
+ _gm->_state._toMuseum = true;
+ _vm->saveGame(kSleepAutosaveSlot, "autosave");
+ _gm->_inventory.clear();
+ _gm->takeObject(*_gm->_rooms[INTRO2]->getObject(3));
+ _gm->takeObject(*_gm->_rooms[INTRO2]->getObject(5));
+ _gm->takeObject(*_gm->_rooms[INTRO2]->getObject(6));
+ _gm->takeObject(*_gm->_rooms[INTRO2]->getObject(8));
+ _vm->setCurrentImage(29);
+ _gm->changeRoom(MUSEUM);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ _vm->renderMessage(kStringElevator56);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringElevator57);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringElevator58);
+ _gm->drawGUI();
+
+ // 21:72:72
+ _gm->_state._startTime = g_system->getMillis() - 130363200;
+}
+
+Apartment::Apartment(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 25;
+ _id = APARTMENT;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringChip, kStringChipDescription, CHIP, TAKE | COMBINABLE, 255, 255, 1);
+ _objectState[1] = Object(_id, kStringHatch, kStringHatchDescription, HATCH, OPENABLE | CLOSED | COMBINABLE, 0, 1, 1);
+ _objectState[2] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0);
+ _objectState[3] = Object(_id, kStringMusicSystem, kStringMusicSystemDescription, MUSIC_SYSTEM, COMBINABLE, 4, 4, 0);
+ _objectState[4] = Object(_id, kStringSpeakers, kStringSpeakersDescription, NULLOBJECT, NULLTYPE, 5, 5, 0);
+ _objectState[5] = Object(_id, kStringPencils, kStringPencilsDescription, NULLOBJECT, UNNECESSARY, 6, 6, 0);
+ _objectState[6] = Object(_id, kStringMetalBlocks, kStringMetalBlocksDescription, MAGNET, TAKE | COMBINABLE, 10, 10, 3 + 128);
+ _objectState[7] = Object(_id, kStringImage, kStringImageDescription, NULLOBJECT, UNNECESSARY, 7, 7, 0);
+ _objectState[8] = Object(_id, kStringCabinet, kStringCabinetDescription, CABINET, OPENABLE | CLOSED, 8, 8, 0);
+ _objectState[9] = Object(_id, kStringChair, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
+ _objectState[10] = Object(_id, kStringElevator, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, ELEVATOR2, 22);
+ _objectState[11] = Object(_id, kStringUnderBed, kStringUnderBedDescription, UNDER_BED, NULLTYPE, 11, 11, 0);
+ _objectState[12] = Object(_id, kStringKey, kStringKeyDescription, KEY, TAKE | COMBINABLE, 255, 255, 0);
+}
+
+void Apartment::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Apartment::animation() {
+}
+
+bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, UNDER_BED)) {
+ if (_objectState[12]._type & CARRIED)
+ _vm->renderMessage(kStringApartment1);
+ else if (_shown[kMaxSection - 1]) {
+ _vm->renderMessage(kStringApartment2);
+ _gm->takeObject(_objectState[12]);
+ _vm->playSound(kAudioSuccess2);
+ } else {
+ _vm->renderMessage(kStringApartment3);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->renderMessage(kStringApartment4);
+ }
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, HATCH)) {
+ if (_objectState[1]._type & OPENED)
+ _vm->renderMessage(kStringApartment5);
+ else {
+ _vm->renderImage(1);
+ _vm->playSound(kAudioTaxiOpen);
+ _objectState[1]._type |= OPENED;
+ _objectState[1]._click = 1;
+ if (!(_objectState[0]._type & CARRIED)) {
+ _vm->renderImage(2);
+ _objectState[0]._click = 2;
+ }
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == HATCH && obj1._type & OPENED) {
+ _vm->renderImage(1 + 128);
+ setSectionVisible(2, false);
+ _vm->playSound(kAudioElevator1);
+ obj1._type &= ~OPENED;
+ obj1._click = 0;
+ if (!(_objectState[0]._type & CARRIED))
+ _objectState[0]._click = 255;
+ } else if (verb == ACTION_TAKE && obj1._id == CHIP && !(obj1._type & CARRIED)) {
+ setSectionVisible(2, kShownFalse);
+ return false;
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, CABINET)) {
+ _vm->renderMessage(kStringApartment6);
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, MUSIC_SYSTEM)) {
+ _vm->renderMessage(kStringApartment7);
+ } else if (verb == ACTION_PRESS && obj1._id == MUSIC_SYSTEM) {
+ _vm->renderMessage(kStringApartment8);
+ } else
+ return false;
+ return true;
+}
+
+Ship::Ship(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 45;
+ _id = SHIP;
+ _shown[0] = kShownTrue;
+ _shown[8] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringSwitch, kStringDefaultDescription, SWITCH, PRESS | COMBINABLE, 0, 0, 0);
+ _objectState[1] = Object(_id, kStringHandle, kStringDefaultDescription, HANDLE, NULLTYPE, 255, 255, 0);
+ _objectState[2] = Object(_id, kStringHatch2, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0, SHIP, 19);
+ _objectState[3] = Object(_id, kStringSwitch, kStringDefaultDescription, DOOR_SWITCH, PRESS | COMBINABLE, 255, 255, 0);
+ _objectState[4] = Object(_id, kStringSpaceSuit, kStringSpaceSuitDescription, SUIT, TAKE, 255, 255, 1);
+ _objectState[5] = Object(_id, kStringCable, kStringCableDescription1, RCABLE, COMBINABLE, 255, 255, 0);
+ _objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + 128);
+
+ _outroText =
+ _vm->getGameString(kStringIntro1) + '\0' +
+ _vm->getGameString(kStringIntro2) + '\0' +
+ _vm->getGameString(kStringIntro3) + '\0' +
+ _vm->getGameString(kStringIntro4) + '\0' +
+ _vm->getGameString(kStringIntro5) + '\0' +
+ "^Matthias Neef#" + '\0' +
+ "^Sascha Otterbach#" + '\0' +
+ "^Thomas Mazzoni#" + '\0' +
+ "^Matthias Klein#" + '\0' +
+ "^Gerrit Rothmaier#" + '\0' +
+ "^Thomas Hassler#" + '\0' +
+ "^Rene Kach#" + '\0' +
+ '\233' + '\0';
+ Common::String waitString = "##################";
+ _outroText2 =
+ waitString + '\0' +
+ _vm->getGameString(kStringOutro1) + '\0' +
+ _vm->getGameString(kStringOutro2) + '\0' +
+ _vm->getGameString(kStringOutro3) + '\0' +
+ _vm->getGameString(kStringOutro4) + '\0' +
+ _vm->getGameString(kStringOutro5) + '\0' +
+ '\233' + '\0';
+}
+
+void Ship::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Ship::animation() {
+}
+
+bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_PRESS && obj1._id == SWITCH) {
+ if (_gm->_state._dark) {
+ _gm->_state._dark = false;
+ _vm->_screen->setViewportBrightness(255);
+ _objectState[1]._click = 1;
+ _objectState[2]._click = 2;
+ _objectState[3]._click = 3;
+ _objectState[5]._click = 4;
+ _objectState[6]._click = 5;
+ _objectState[2]._type = EXIT | OPENABLE | CLOSED;
+ _gm->drawMapExits();
+ }
+ } else if (verb == ACTION_PRESS && obj1._id == DOOR_SWITCH &&
+ !isSectionVisible(7)) {
+ _vm->renderImage(3);
+ _gm->wait(2);
+ _vm->renderImage(6);
+ _vm->playSound(kAudioShip1);
+ while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
+ _gm->wait(1);
+ _vm->renderImage(6 + 128);
+ _vm->renderImage(7);
+ _objectState[3]._description = kStringShip1;
+ _objectState[2]._description = kStringShip2;
+ } else if (verb == ACTION_PULL && obj1._id == HANDLE) {
+ _vm->renderImage(2);
+ _vm->playSound(kAudioTaxiOpen);
+ obj1._click = 255;
+ _objectState[4]._click = 9;
+ } else if (verb == ACTION_TAKE && obj1._id == SUIT && !(obj1._type & CARRIED)) {
+ setSectionVisible(2, kShownFalse);
+ _gm->takeObject(obj1);
+ } else if (verb == ACTION_USE && obj1._id == SUIT) {
+ if (!(obj1._type & CARRIED)) {
+ setSectionVisible(2, kShownFalse);
+ _gm->takeObject(obj1);
+ }
+ if ((_shown[kMaxSection - 1] = !_shown[kMaxSection - 1]))
+ _vm->renderMessage(kStringShip3);
+ else
+ _vm->renderMessage(kStringShip4);
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, RCABLE)) {
+ _objectState[6]._description = kStringDefaultDescription;
+ if (_objectState[6]._click == 5)
+ _vm->renderImage(8 + 128);
+ if (_objectState[6]._type & CARRIED)
+ _gm->_inventory.remove(_objectState[6]);
+ if (isSectionVisible(11) || isSectionVisible(10))
+ _vm->renderMessage(kStringShip5);
+ else if (isSectionVisible(9)) {
+ _vm->renderImage(9 + 128);
+ _vm->renderImage(11);
+ if (!_shown[kMaxSection - 1])
+ kill();
+ _objectState[6]._click = 8;
+ _gm->wait(2);
+ _vm->renderImage(4);
+ _vm->playSound(kAudioShip2);
+ _gm->wait(3);
+ _vm->renderImage(5);
+ _objectState[2]._type |= OPENED;
+ _objectState[2]._description = kStringDefaultDescription;
+ } else {
+ _vm->renderImage(10);
+ if (!_shown[kMaxSection - 1])
+ kill();
+ _objectState[6]._click = 7;
+ }
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, DOOR_SWITCH) && isSectionVisible(7)) {
+ _objectState[6]._description = kStringDefaultDescription;
+ if (_objectState[6]._click == 5)
+ _vm->renderImage(8 + 128);
+ if (_objectState[6]._type & CARRIED)
+ _gm->_inventory.remove(_objectState[6]);
+ if (isSectionVisible(11) || isSectionVisible(9))
+ _vm->renderMessage(kStringShip5);
+ else if (isSectionVisible(10)) {
+ _vm->renderImage(10 + 128);
+ _vm->renderImage(11);
+ if (!_shown[kMaxSection - 1])
+ kill();
+ _objectState[6]._click = 8;
+ _gm->wait(2);
+ _vm->renderImage(4);
+ _vm->playSound(kAudioShip2);
+ _gm->wait(3);
+ _vm->renderImage(5);
+ _objectState[2]._type |= OPENED;
+ _objectState[2]._description = kStringDefaultDescription;
+ } else {
+ _vm->renderImage(9);
+ _objectState[6]._click = 6;
+ }
+ } else if (verb == ACTION_TAKE && obj1._id == CABLE && obj1._type & CARRIED) {
+ if (isSectionVisible(8)) {
+ obj1._description = kStringDefaultDescription;
+ _gm->takeObject(obj1);
+ } else
+ _vm->renderMessage(kStringShip6);
+ } else if (verb == ACTION_WALK && obj1._type == (EXIT | OPENABLE | CLOSED | OPENED)) {
+ _vm->setCurrentImage(46);
+ _vm->renderImage(0);
+ _gm->wait(16);
+ _vm->renderMessage(kStringShip7, kMessageRight);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->reply(kStringShip8, 1, 1 + 128);
+ _vm->renderMessage(kStringShip9, kMessageRight);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->reply(kStringShip10, 1, 1 + 128);
+ _gm->reply(kStringShip11, 1, 1 + 128);
+ _gm->reply(kStringShip12, 1, 1 + 128);
+ _gm->reply(kStringShip13, 1, 1 + 128);
+ _vm->renderMessage(kStringShip14, kMessageRight);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->reply(kStringShip15, 1, 1 + 128);
+ _vm->renderMessage(kStringShip16, kMessageRight);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->reply(kStringAha, 1, 1 + 128);
+ _gm->reply(kStringShip17, 1, 1 + 128);
+ _vm->renderMessage(kStringShip18, kMessageRight);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->reply(kStringShip19, 1, 1 + 128);
+ _gm->wait(16);
+ CursorMan.showMouse(false);
+ _vm->renderImage(2);
+ for (int i = 3; i < 12; i++) {
+ _vm->renderImage(i);
+ if (i == 9)
+ _vm->playSound(kAudioShip3);
+ _gm->wait(2);
+ _vm->renderImage(i + 128);
+ }
+ _vm->renderImage(12);
+ _gm->wait(18);
+ // TODO some palette stuff
+ outro();
+ } else
+ return false;
+ return true;
+}
+
+void Ship::outro() {
+ _vm->_screen->paletteFadeOut(100);
+ _vm->renderImage(13);
+ // Because the screen is partialy faded out, the original values (63, 20, 20)
+ // should be multiplied by 2.55, but are multiplied by 3.5, because the color
+ // looks closer to the original
+ byte palette[768];
+ _vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
+ palette[282] = 220;
+ palette[283] = 70;
+ palette[284] = 70;
+ // Restore marquee colors
+ for (int i = 0; i < 3; i++) {
+ palette[kColorPurple * 3 + i] *= 2.5;
+ palette[kColorLightYellow * 3 + i] *= 2.5;
+ }
+ _vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
+ _vm->playSound(kMusicMadMonkeys);
+ _vm->renderBox(0, 190, 320, 10, kColorBlack);
+ Marquee marquee(_vm->_screen, Marquee::kMarqueeOutro, _outroText.c_str());
+ for(int i = 0; i < 2; i++) {
+ while (!_vm->shouldQuit()) {
+ _gm->updateEvents();
+
+ if (!marquee.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
+ break;
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
+ marquee.reset();
+ }
+ Marquee marquee2(_vm->_screen, Marquee::kMarqueeOutro, _outroText2.c_str());
+ while (!_vm->shouldQuit()) {
+ _gm->updateEvents();
+
+ if (!marquee2.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
+ break;
+ g_system->updateScreen();
+ g_system->delayMillis(_vm->_delay);
+ }
+ // TODO: End with some end of music
+ int volume;
+ do {
+ volume = _vm->_sound->getVolume() - 10;
+ _vm->_sound->setVolume(volume);
+ _gm->waitOnInput(1);
+ } while (volume > 10 && !_vm->shouldQuit());
+ Common::Event event;
+ event.type = Common::EVENT_RTL;
+ _vm->getEventManager()->pushEvent(event);
+}
+
+void Ship::kill() {
+ _vm->playSound(kAudioShipDeath);
+ while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
+ _gm->wait(1);
+ _gm->dead(kStringShip0);
+}
+
+Pyramid::Pyramid(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 8;
+ _id = PYRAMID;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128);
+ _objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0);
+ _objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 7);
+ _objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0);
+ _objectState[4] = Object(_id, kStringSun, kStringSunDescription, SUN, NULLTYPE, 28, 28, 0);
+ _objectState[5] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE1, COMBINABLE, 0, 0, 0);
+ _objectState[6] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE2, COMBINABLE, 1, 0, 0);
+ _objectState[7] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE3, COMBINABLE, 2, 0, 0);
+ _objectState[8] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE4, COMBINABLE, 3, 0, 0);
+ _objectState[9] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE5, COMBINABLE, 4, 0, 0);
+ _objectState[10] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE6, COMBINABLE, 5, 0, 0);
+ _objectState[11] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE7, COMBINABLE, 6, 0, 0);
+ _objectState[12] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE8, COMBINABLE, 7, 0, 0);
+ _objectState[13] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE9, COMBINABLE, 8, 0, 0);
+ _objectState[14] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE10, COMBINABLE, 9, 0, 0);
+ _objectState[15] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE11, COMBINABLE, 10, 0, 0);
+ _objectState[16] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE12, COMBINABLE, 11, 0, 0);
+ _objectState[17] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE13, COMBINABLE, 12, 0, 0);
+ _objectState[18] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE14, COMBINABLE, 13, 0, 0);
+ _objectState[19] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE15, COMBINABLE, 14, 0, 0);
+ _objectState[20] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE16, COMBINABLE, 15, 0, 0);
+ _objectState[21] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE17, COMBINABLE, 16, 0, 0);
+ _objectState[22] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE18, COMBINABLE, 17, 0, 0);
+ _objectState[23] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE19, COMBINABLE, 18, 0, 0);
+ _objectState[24] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE20, COMBINABLE, 19, 0, 0);
+ _objectState[25] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE21, COMBINABLE, 20, 0, 0);
+ _objectState[26] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE22, COMBINABLE, 21, 0, 0);
+ _objectState[27] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE23, COMBINABLE, 22, 0, 0);
+ _objectState[28] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE24, COMBINABLE, 23, 0, 0);
+ _objectState[29] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE25, COMBINABLE, 24, 0, 0);
+}
+
+void Pyramid::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Pyramid::animation() {
+}
+
+bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
+ Object *rope, *hole;
+ rope = hole = nullptr;
+
+ if (obj1._id == ROPE)
+ rope = &obj1;
+ if (obj2._id == ROPE)
+ rope = &obj2;
+ if (obj1._id >= HOLE1 && obj1._id <= HOLE25)
+ hole = &obj1;
+ if (obj2._id >= HOLE1 && obj2._id <= HOLE25)
+ hole = &obj2;
+
+ if (verb == ACTION_WALK && obj1._id == PYRA_ENTRANCE) {
+ _gm->_state._eventCallback = kPyramidEndFn;
+ _gm->_state._eventTime = g_system->getMillis() + 3600000; //hour
+ _gm->_state._pyraS = 4;
+ _gm->_state._pyraZ = 10;
+ _gm->_state._pyraDirection = 0;
+ _gm->passageConstruction();
+ return false;
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, SIGN)) {
+ if (rope->_type & CARRIED) {
+ _vm->renderImage(1);
+ _gm->_inventory.remove(*rope);
+ _objectState[0]._click = 29;
+ } else
+ _vm->renderMessage(kStringPyramid1);
+ } else if (verb == ACTION_USE && hole != nullptr && rope != nullptr) {
+ if (rope->_type & CARRIED)
+ _vm->renderMessage(kStringPyramid2);
+ else {
+ int number = hole->_id - HOLE1;
+ int start = number / 5 * 5 + 2;
+ for (int i = 1; i <= 26; i++)
+ _vm->renderImage(i + 128);
+ for (int i = start; i <= start + number % 5; i++)
+ _vm->renderImage(i);
+ _objectState[0]._click = 30;
+ if (number == 18) {
+ _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownTrue);
+ _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 5;
+ _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = EXIT;
+ } else {
+ _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+ _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+ _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+ }
+ }
+ } else if (verb == ACTION_PULL && rope != nullptr && !(rope->_type & CARRIED) &&
+ !isSectionVisible(1)) {
+ for (int i = 2; i <= 26; i++)
+ _vm->renderImage(i + 128);
+ _vm->renderImage(1);
+ _objectState[0]._click = 29;
+ _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+ _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+ _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+ } else if (verb == ACTION_TAKE && rope != nullptr && !(rope->_type & CARRIED)) {
+ for (int i = 2; i <= 26; i++)
+ _vm->renderImage(i + 128);
+ _gm->takeObject(*rope);
+ _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+ _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+ _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+ } else if (verb == ACTION_WALK && obj1._id == SUN) {
+ _vm->renderMessage(kStringPyramid3);
+ } else
+ return false;
+ return true;
+}
+
+PyrEntrance::PyrEntrance(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 9;
+ _id = PYR_ENTRANCE;
+ _shown[0] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[8] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringSign, kStringSign5Description, SIGN, NULLTYPE, 255, 255, 0);
+ _objectState[1] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[2] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[3] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void PyrEntrance::onEntrance() {
+ if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
+ _gm->setAnimationTimer(1);
+ _waitTime = g_system->getMillis() + 60000;
+ }
+}
+
+void PyrEntrance::animation() {
+ if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
+ if (g_system->getMillis() >= _waitTime) { // around 1 minute
+ _vm->renderMessage(kStringPyramid4);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _gm->_state._pyraZ++;
+ _gm->_state._pyraDirection = 0;
+ _gm->changeRoom(FLOORDOOR);
+ _vm->setCurrentImage(14);
+ _vm->renderRoom(*_gm->_rooms[FLOORDOOR]);
+ _gm->drawMapExits();
+ _gm->wait(3);
+ _vm->renderImage(5);
+ _gm->wait(3);
+ _vm->renderImage(6);
+ _gm->_rooms[FLOORDOOR]->setSectionVisible(5, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(7);
+ _gm->_rooms[FLOORDOOR]->setSectionVisible(6, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(8);
+ _gm->_rooms[FLOORDOOR]->setSectionVisible(7, kShownFalse);
+ _gm->wait(3);
+ _vm->renderImage(9);
+ _gm->_rooms[FLOORDOOR]->setSectionVisible(8, kShownFalse);
+ _vm->playSound(kAudioShip3);
+ _gm->screenShake();
+ _gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
+ } else {
+ _gm->setAnimationTimer(1);
+ }
+ } else
+ _gm->setAnimationTimer(kMaxTimerValue);
+}
+
+bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+ static RoomEntry roomTab[29] = {
+ {2, 8, 6, 0, FLOORDOOR},
+ {0, 8, 4, 2, FLOORDOOR_U},
+ {0, 4, 11, 2, PYRAMID},
+ {0, 0, 2, 1, UPSTAIRS1},
+ {1, 1, 2, 3, DOWNSTAIRS1},
+ {0, 5, 8, 3, BOTTOM_RIGHT_DOOR},
+ {0, 4, 8, 1, BOTTOM_LEFT_DOOR},
+ {1, 5, 8, 3, UPPER_DOOR},
+ {1, 4, 8, 1, UPPER_DOOR},
+ {0, 4, 8, 0, UPSTAIRS2},
+ {1, 4, 7, 2, DOWNSTAIRS2},
+ {1, 6, 6, 2, PUZZLE_FRONT},
+ {1, 6, 7, 0, PUZZLE_BEHIND},
+ {0, 3, 6, 0, FORMULA1_N},
+ {0, 3, 7, 0, FORMULA1_F},
+ {0, 4, 6, 0, FORMULA2_N},
+ {0, 4, 7, 0, FORMULA2_F},
+ {0, 8, 9, 2, TOMATO_N},
+ {0, 8, 8, 2, TOMATO_F},
+ {1, 4, 2, 0, MONSTER_F},
+ {1, 10, 8, 0, MONSTER_F},
+ {1, 4, 1, 0, MONSTER1_N},
+ {1, 10, 7, 0, MONSTER2_N},
+ {0, 2, 4, 2, DOWNSTAIRS3},
+ {1, 2, 5, 0, UPSTAIRS3},
+ {1, 2, 5, 3, LCORRIDOR1},
+ {1, 1, 5, 1, LCORRIDOR2},
+ {1, 1, 5, 3, HOLE_ROOM},
+ {0, 7, 4, 0, BST_DOOR}
+ };
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (_gm->_rooms[FLOORDOOR]->isSectionVisible(kMaxSection - 1))
+ roomTab[0]._e = 1;
+ else
+ roomTab[0]._e = 2;
+ for (int i = 0; i < 29; i++) {
+ if (_gm->_state._pyraE == roomTab[i]._e &&
+ _gm->_state._pyraS == roomTab[i]._s &&
+ _gm->_state._pyraZ == roomTab[i]._z &&
+ _gm->_state._pyraDirection == roomTab[i]._r) {
+ _gm->changeRoom(roomTab[i]._exitRoom);
+ _gm->_newRoom = true;
+ return true;
+ }
+ }
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Upstairs1::Upstairs1(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _id = UPSTAIRS1;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void Upstairs1::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Upstairs1::animation() {
+}
+
+bool Upstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraE)
+ _gm->_state._pyraE = 0;
+ else
+ _gm->_state._pyraE = 1;
+ }
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Downstairs1::Downstairs1(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _id = DOWNSTAIRS1;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[3] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void Downstairs1::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Downstairs1::animation() {
+}
+
+bool Downstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraE)
+ _gm->_state._pyraE = 0;
+ else
+ _gm->_state._pyraE = 1;
+ }
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+BottomRightDoor::BottomRightDoor(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _id = BOTTOM_RIGHT_DOOR;
+ _shown[0] = kShownTrue;
+ _shown[19] = kShownTrue;
+ _shown[23] = kShownTrue;
+ _shown[29] = kShownTrue;
+ _shown[30] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+ _objectState[3] = Object(_id, kStringButton, kStringDefaultDescription, BUTTON, PRESS, 19, 19, 0);
+}
+
+void BottomRightDoor::onEntrance() {
+ setRoomSeen(true);
+}
+
+void BottomRightDoor::animation() {
+}
+
+bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_PRESS && obj1._id == BUTTON) {
+ if (isSectionVisible(22)) {
+ _vm->renderImage(21);
+ setSectionVisible(22, kShownFalse);
+ _gm->wait(2);
+ _vm->renderImage(20);
+ setSectionVisible(21, kShownFalse);
+ _gm->wait(2);
+ _vm->renderImage(19);
+ setSectionVisible(20, kShownFalse);
+ _objectState[2]._type = EXIT | OPENABLE | CLOSED;
+ _objectState[2]._id = DOOR;
+ _objectState[2]._description = kStringMassive;
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = DOOR;
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringMassive;
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownTrue);
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownTrue);
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownFalse);
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownFalse);
+ _gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT;
+ _gm->_rooms[UPPER_DOOR]->getObject(2)->_id = CORRIDOR;
+ _gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringDefaultDescription;
+ } else {
+ _vm->renderImage(20);
+ setSectionVisible(19, kShownFalse);
+ _gm->wait(2);
+ _vm->renderImage(21);
+ _gm->wait(2);
+ _vm->renderImage(22);
+ _objectState[2]._type = EXIT;
+ _objectState[2]._id = CORRIDOR;
+ _objectState[2]._description = kStringDefaultDescription;
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownFalse);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownTrue);
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT;
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = CORRIDOR;
+ _gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringDefaultDescription;
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownFalse);
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownFalse);
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownTrue);
+ _gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownTrue);
+ _gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[UPPER_DOOR]->getObject(2)->_id = DOOR;
+ _gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringMassive;
+ }
+ _vm->playSound(kAudioShip3);
+ _gm->screenShake();
+ } else
+ return false;
+ return true;
+}
+
+BottomLeftDoor::BottomLeftDoor(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _id = BOTTOM_LEFT_DOOR;
+ _shown[0] = kShownTrue;
+ _shown[19] = kShownTrue;
+ _shown[29] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void BottomLeftDoor::onEntrance() {
+ setRoomSeen(true);
+}
+
+void BottomLeftDoor::animation() {
+}
+
+bool BottomLeftDoor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ if (verb == ACTION_WALK && obj1._id == G_LEFT)
+ _gm->changeRoom(UPSTAIRS2);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else
+ return false;
+ return true;
+}
+
+Upstairs2::Upstairs2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _id = UPSTAIRS2;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void Upstairs2::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Upstairs2::animation() {
+}
+
+bool Upstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraE)
+ _gm->_state._pyraE = 0;
+ else
+ _gm->_state._pyraE = 1;
+ }
+ if (obj1._id == G_RIGHT)
+ _gm->changeRoom(BOTTOM_LEFT_DOOR);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Downstairs2::Downstairs2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _id = DOWNSTAIRS2;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[3] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void Downstairs2::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Downstairs2::animation() {
+}
+
+bool Downstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraE)
+ _gm->_state._pyraE = 0;
+ else
+ _gm->_state._pyraE = 1;
+ }
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+ return true;
+}
+
+UpperDoor::UpperDoor(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _id = UPPER_DOOR;
+ _shown[0] = kShownTrue;
+ _shown[26] = kShownTrue;
+ _shown[27] = kShownTrue;
+ _shown[30] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void UpperDoor::onEntrance() {
+ setRoomSeen(true);
+}
+
+void UpperDoor::animation() {
+}
+
+bool UpperDoor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+PuzzleFront::PuzzleFront(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _id = PUZZLE_FRONT;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[7] = kShownTrue;
+ _shown[8] = kShownTrue;
+ _shown[9] = kShownTrue;
+ _shown[10] = kShownTrue;
+ _shown[11] = kShownTrue;
+ _shown[12] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[15] = kShownTrue;
+ _shown[30] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 255, 255, 0, PYR_ENTRANCE, 2);
+ _objectState[3] = Object(_id, kStringPiece, kStringDefaultDescription, PART0, PRESS, 3, 3, 0);
+ _objectState[4] = Object(_id, kStringPiece, kStringDefaultDescription, PART1, PRESS, 4, 4, 0);
+ _objectState[5] = Object(_id, kStringPiece, kStringDefaultDescription, PART2, PRESS, 5, 5, 0);
+ _objectState[6] = Object(_id, kStringPiece, kStringDefaultDescription, PART3, PRESS, 6, 6, 0);
+ _objectState[7] = Object(_id, kStringPiece, kStringDefaultDescription, PART4, PRESS, 7, 7, 0);
+ _objectState[8] = Object(_id, kStringPiece, kStringDefaultDescription, PART5, PRESS, 8, 8, 0);
+ _objectState[9] = Object(_id, kStringPiece, kStringDefaultDescription, PART6, PRESS, 9, 9, 0);
+ _objectState[10] = Object(_id, kStringPiece, kStringDefaultDescription, PART7, PRESS, 10, 10, 0);
+ _objectState[11] = Object(_id, kStringPiece, kStringDefaultDescription, PART8, PRESS, 11, 11, 0);
+ _objectState[12] = Object(_id, kStringPiece, kStringDefaultDescription, PART9, PRESS, 12, 12, 0);
+ _objectState[13] = Object(_id, kStringPiece, kStringDefaultDescription, PART10, PRESS, 13, 13, 0);
+ _objectState[14] = Object(_id, kStringPiece, kStringDefaultDescription, PART11, PRESS, 14, 14, 0);
+ _objectState[15] = Object(_id, kStringPiece, kStringDefaultDescription, PART12, PRESS, 15, 15, 0);
+ _objectState[16] = Object(_id, kStringPiece, kStringDefaultDescription, PART13, PRESS, 16, 16, 0);
+ _objectState[17] = Object(_id, kStringPiece, kStringDefaultDescription, PART14, PRESS, 17, 17, 0);
+ _objectState[18] = Object(_id, kStringPiece, kStringDefaultDescription, PART15, PRESS, 18, 18, 0);
+}
+
+void PuzzleFront::onEntrance() {
+ setRoomSeen(true);
+}
+
+void PuzzleFront::animation() {
+}
+
+bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
+ MSNImage *image = _vm->_screen->getCurrentImage();
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_PRESS && obj1._id >= PART0 && obj1._id <= PART15) {
+ int pos = obj1._id - PART0;
+ int newPos = 0;
+ if (pos > 3 && _gm->_puzzleField[pos - 4] == 255)
+ newPos = pos - 4;
+ else if (pos < 12 && _gm->_puzzleField[pos + 4] == 255)
+ newPos = pos + 4;
+ else if ((pos % 4) > 0 && _gm->_puzzleField[pos - 1] == 255)
+ newPos = pos - 1;
+ else if ((pos % 4) < 3 && _gm->_puzzleField[pos + 1] == 255)
+ newPos = pos + 1;
+ else {
+ _vm->renderMessage(kStringPyramid5);
+ return true;
+ }
+ int a = _gm->_puzzleField[pos] + 1;
+ _vm->renderImage(a + 128);
+ image->_section[a].x1 = 95 + (newPos % 4) * 33;
+ image->_section[a].x2 = image->_section[a].x1 + 31;
+ image->_section[a].y1 = 24 + (newPos / 4) * 25;
+ image->_section[a].y2 = image->_section[a].y1 + 23;
+ _vm->renderImage(a);
+ _vm->playSound(kAudioTaxiOpen);
+ _gm->_state._puzzleTab[a - 1] = newPos;
+ _gm->_puzzleField[pos] = 255;
+ _gm->_puzzleField[newPos] = a - 1;
+ _objectState[pos + 3]._click = 255;
+ _objectState[newPos + 3]._click = newPos + 3;
+ for (int i = 0; i < 15; i++)
+ if (_gm->_state._puzzleTab[i] != i)
+ return true;
+
+ _gm->wait(2);
+ _vm->renderImage(16);
+ for (int i = 1; i < 16; i++)
+ setSectionVisible(i, kShownFalse);
+ _gm->wait(2);
+ _vm->renderImage(17);
+ _gm->wait(2);
+ _vm->renderImage(18);
+ _objectState[2]._type = EXIT;
+ _objectState[2]._id = CORRIDOR;
+ _objectState[2]._description = kStringDefaultDescription;
+ _objectState[2]._click = 0;
+
+ _gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(31, kShownFalse);
+ _gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(26, kShownTrue);
+ _gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(27, kShownTrue);
+ _gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(29, kShownTrue);
+ _gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_type = EXIT;
+ _gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_id = CORRIDOR;
+ _gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_description = kStringDefaultDescription;
+ _vm->playSound(kAudioShip3);
+ _gm->screenShake();
+ } else
+ return false;
+ return true;
+}
+
+PuzzleBehind::PuzzleBehind(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 12;
+ _id = PUZZLE_BEHIND;
+ _shown[0] = kShownTrue;
+ _shown[29] = kShownTrue;
+ _shown[31] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void PuzzleBehind::onEntrance() {
+ setRoomSeen(true);
+}
+
+void PuzzleBehind::animation() {
+}
+
+bool PuzzleBehind::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Formula1F::Formula1F(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 14;
+ _id = FORMULA1_F;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 1, 1, 0, PYR_ENTRANCE, 2);
+}
+
+void Formula1F::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Formula1F::animation() {
+}
+
+bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR)
+ _gm->changeRoom(FORMULA1_N);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Formula1N::Formula1N(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 13;
+ _id = FORMULA1_N;
+ _shown[0] = kShownTrue;
+ _shown[5] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+}
+
+void Formula1N::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Formula1N::animation() {
+}
+
+bool Formula1N::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Formula2F::Formula2F(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 14;
+ _id = FORMULA2_F;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 2, 2, 0, PYR_ENTRANCE, 2);
+}
+
+void Formula2F::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Formula2F::animation() {
+}
+
+bool Formula2F::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR)
+ _gm->changeRoom(FORMULA2_N);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Formula2N::Formula2N(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 13;
+ _id = FORMULA2_N;
+ _shown[0] = kShownTrue;
+ _shown[6] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
+}
+
+void Formula2N::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Formula2N::animation() {
+}
+
+bool Formula2N::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+TomatoF::TomatoF(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 14;
+ _id = TOMATO_F;
+ _shown[0] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringTomato, kStringFunnyDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void TomatoF::onEntrance() {
+ setRoomSeen(true);
+}
+
+void TomatoF::animation() {
+}
+
+bool TomatoF::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR)
+ _gm->changeRoom(TOMATO_N);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+TomatoN::TomatoN(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 13;
+ _id = TOMATO_N;
+ _shown[0] = kShownTrue;
+ _shown[7] = kShownTrue;
+ _shown[8] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringKnife1, kStringKnife1Description, TKNIFE, TAKE | COMBINABLE, 5, 5, 7);
+ _objectState[3] = Object(_id, kStringTomato, kStringFunnyDescription, NULLOBJECT, UNNECESSARY, 4, 4, 0);
+}
+
+void TomatoN::onEntrance() {
+ setRoomSeen(true);
+}
+
+void TomatoN::animation() {
+}
+
+bool TomatoN::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_TAKE && obj1._id == TKNIFE) {
+ _gm->takeObject(obj1);
+ setSectionVisible(8, kShownFalse);
+ } else
+ return false;
+ return true;
+}
+
+MonsterF::MonsterF(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 14;
+ _id = MONSTER_F;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[14] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringMonster, kStringMonsterDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void MonsterF::onEntrance() {
+ setRoomSeen(true);
+}
+
+void MonsterF::animation() {
+}
+
+bool MonsterF::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraS == 4)
+ _gm->changeRoom(MONSTER1_N);
+ else
+ _gm->changeRoom(MONSTER2_N);
+ } else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Monster1N::Monster1N(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 13;
+ _id = MONSTER1_N;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringRope, kStringRopeDescription, ROPE, TAKE | COMBINABLE, 255, 255, 2);
+ _objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
+ _objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
+ _objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
+}
+
+void Monster1N::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Monster1N::animation() {
+}
+
+bool Monster1N::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
+ if (obj1._type & OPENED)
+ _vm->renderMessage(kStringGenericInteract8);
+ else {
+ obj1._type |= OPENED;
+ if (isSectionVisible(kMaxSection - 1))
+ _vm->renderImage(2);
+ else {
+ _objectState[2]._click = 1;
+ _vm->renderImage(4);
+ setSectionVisible(2, kShownFalse);
+ }
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
+ if (obj1._type & OPENED) {
+ _vm->renderImage(1);
+ setSectionVisible(2, kShownFalse);
+ obj1._type &= ~OPENED;
+ _vm->playSound(kAudioElevator1);
+ } else
+ _vm->renderMessage(kStringGenericInteract11);
+ } else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
+ _gm->takeObject(obj1);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ setSectionVisible(kMaxSection - 1, kShownTrue);
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
+ _vm->renderMessage(kStringPyramid6);
+ } else
+ return false;
+ return true;
+}
+
+Monster2N::Monster2N(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 13;
+ _id = MONSTER2_N;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringNote, kStringNoteDescription, NOTE, TAKE | COMBINABLE, 255, 255, 2);
+ _objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
+ _objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
+ _objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
+}
+
+void Monster2N::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Monster2N::animation() {
+}
+
+bool Monster2N::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
+ if (obj1._type & OPENED)
+ _vm->renderMessage(kStringGenericInteract8);
+ else {
+ obj1._type |= OPENED;
+ if (isSectionVisible(kMaxSection - 1))
+ _vm->renderImage(2);
+ else {
+ _objectState[2]._click = 1;
+ _vm->renderImage(3);
+ setSectionVisible(2, kShownFalse);
+ }
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
+ if (obj1._type & OPENED) {
+ _vm->renderImage(1);
+ setSectionVisible(2, kShownFalse);
+ obj1._type &= ~OPENED;
+ _vm->playSound(kAudioElevator1);
+ } else
+ _vm->renderMessage(kStringGenericInteract11);
+ } else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
+ _gm->takeObject(obj1);
+ setSectionVisible(3, kShownFalse);
+ setSectionVisible(4, kShownFalse);
+ setSectionVisible(kMaxSection - 1, kShownTrue);
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
+ _vm->renderMessage(kStringPyramid6);
+ } else
+ return false;
+ return true;
+}
+
+Upstairs3::Upstairs3(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _id = UPSTAIRS3;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void Upstairs3::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Upstairs3::animation() {
+}
+
+bool Upstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraE)
+ _gm->_state._pyraE = 0;
+ else
+ _gm->_state._pyraE = 1;
+ }
+ if (obj1._id == G_LEFT)
+ _gm->changeRoom(LCORRIDOR1);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+Downstairs3::Downstairs3(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 10;
+ _id = DOWNSTAIRS3;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void Downstairs3::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Downstairs3::animation() {
+}
+
+bool Downstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == CORRIDOR) {
+ if (_gm->_state._pyraE)
+ _gm->_state._pyraE = 0;
+ else
+ _gm->_state._pyraE = 1;
+ }
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+LCorridor1::LCorridor1(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 9;
+ _id = LCORRIDOR1;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[17] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
+}
+
+void LCorridor1::onEntrance() {
+ setRoomSeen(true);
+}
+
+void LCorridor1::animation() {
+}
+
+bool LCorridor1::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ if (obj1._id == G_RIGHT)
+ _gm->changeRoom(UPSTAIRS3);
+ else if (obj1._id == CORRIDOR)
+ _gm->changeRoom(HOLE_ROOM);
+ else
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+LCorridor2::LCorridor2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 9;
+ _id = LCORRIDOR2;
+ _shown[0] = kShownTrue;
+ _shown[17] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
+}
+
+void LCorridor2::onEntrance() {
+ setRoomSeen(true);
+}
+
+void LCorridor2::animation() {
+}
+
+bool LCorridor2::interact(Action verb, Object &obj1, Object &obj2) {
+ if (!_gm->move(verb, obj1))
+ return false;
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ return true;
+}
+
+HoleRoom::HoleRoom(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 9;
+ _id = HOLE_ROOM;
+ _shown[0] = kShownTrue;
+ _shown[8] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 255, 255, 0);
+ _objectState[3] = Object(_id, kStringOpening, kStringOpeningDescription1, HOLE, EXIT, 3, 3, 0, IN_HOLE, 12);
+ _objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription2, NULLOBJECT, NULLTYPE, 4, 4, 0);
+}
+
+void HoleRoom::onEntrance() {
+ setRoomSeen(true);
+}
+
+void HoleRoom::animation() {
+}
+
+bool HoleRoom::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_USE &&
+ (Object::combine(obj1, obj2, ROPE, G_RIGHT) ||
+ Object::combine(obj1, obj2, ROPE, G_LEFT))) {
+ _vm->renderMessage(kStringPyramid7);
+ } else if (verb == ACTION_USE &&
+ (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) ||
+ Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+ _vm->renderMessage(kStringPyramid8);
+ } else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+ _vm->renderMessage(kStringPyramid9);
+ } else if (verb == ACTION_WALK && obj1._id == HOLE && !isSectionVisible(16)) {
+ _vm->renderMessage(kStringPyramid10);
+ } else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(16)) {
+ _gm->changeRoom(IN_HOLE);
+ _gm->_newRoom = true;
+ } else
+ return false;
+ return true;
+}
+
+InHole::InHole(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 11;
+ _id = IN_HOLE;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, EXIT, 0, 0, 0, HOLE_ROOM, 2);
+ _objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + 128);
+ _objectState[2] = Object(_id, kStringSlot, kStringSlotDescription3, SLOT, COMBINABLE, 1, 1, 0);
+}
+
+void InHole::onEntrance() {
+ setRoomSeen(true);
+}
+
+void InHole::animation() {
+}
+
+bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, SLOT)) {
+ if (isSectionVisible(kMaxSection - 1))
+ _vm->renderMessage(kStringPyramid11);
+ else {
+ _vm->renderImage(1);
+ _objectState[1]._click = 2;
+ setSectionVisible(kMaxSection - 1, kShownTrue);
+ }
+ } else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+ _vm->renderMessage(kStringPyramid9);
+ } else if (verb == ACTION_USE && obj1._id == ROPE) {
+ _gm->changeRoom(HOLE_ROOM);
+ _gm->_newRoom = true;
+ } else
+ return false;
+ return true;
+}
+
+Floordoor::Floordoor(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 14;
+ _id = FLOORDOOR;
+ _shown[0] = kShownTrue;
+ _shown[14] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringKnife1, kStringDefaultDescription, TKNIFE, TAKE | COMBINABLE, 255, 255, 9);
+ _objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11+128);
+ _objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription3, HOLE, EXIT, 4, 4, 0, FLOORDOOR_U, 12);
+ _objectState[5] = Object(_id, kStringStones, kStringDefaultDescription, STONES, COMBINABLE, 5, 5, 0);
+}
+
+void Floordoor::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Floordoor::animation() {
+}
+
+bool Floordoor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_WALK && obj1._id == HOLE) {
+ if (isSectionVisible(11)) {
+ _gm->_state._pyraZ = 4;
+ _gm->_state._pyraDirection = 2;
+ _gm->_state._pyraE = 0;
+ return false;
+ } else
+ _vm->renderMessage(kStringPyramid12);
+ } else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(11)) {
+ _gm->_state._pyraZ = 4;
+ _gm->_state._pyraDirection = 2;
+ _gm->_state._pyraE = 0 ;
+ _gm->changeRoom(FLOORDOOR_U);
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, STONES)) {
+ _vm->renderImage(10);
+ if (obj1._id == TKNIFE)
+ _gm->_inventory.remove(obj1);
+ else
+ _gm->_inventory.remove(obj2);
+ _objectState[2]._click = 6;
+ } else if (verb == ACTION_USE &&
+ (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) ||
+ Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+ _vm->renderMessage(kStringPyramid8);
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, TKNIFE) &&
+ isSectionVisible(10)) {
+ _vm->renderImage(11);
+ setSectionVisible(10, kShownFalse);
+ if (obj1._id == ROPE)
+ _gm->_inventory.remove(obj1);
+ else
+ _gm->_inventory.remove(obj2);
+ _objectState[2]._click = 255;
+ _objectState[3]._click = 7;
+ _objectState[3]._type &= ~COMBINABLE;
+ } else if (verb == ACTION_USE &&
+ (Object::combine(obj1, obj2, ROPE, G_RIGHT) ||
+ Object::combine(obj1, obj2, ROPE, G_LEFT) ||
+ Object::combine(obj1, obj2, ROPE, STONES))) {
+ _vm->renderMessage(kStringPyramid7);
+ } else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+ _gm->takeObject(obj1);
+ obj1._type |= COMBINABLE;
+ _vm->renderImage(9);
+ _vm->renderImage(10);
+ _objectState[2]._click = 6;
+ } else if (verb == ACTION_TAKE && obj1._id == TKNIFE && !(obj1._type & CARRIED)) {
+ _gm->takeObject(obj1);
+ setSectionVisible(10, kShownFalse);
+ } else
+ return false;
+ return true;
+}
+
+FloordoorU::FloordoorU(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 14;
+ _id = FLOORDOOR_U;
+ _shown[0] = kShownTrue;
+ _shown[12] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 10, 10, 0, FLOORDOOR, 2);
+ _objectState[3] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE, EXIT, 8, 8, 0, FLOORDOOR, 2);
+ _objectState[4] = Object(_id, kStringPlate, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
+}
+
+void FloordoorU::onEntrance() {
+ setRoomSeen(true);
+}
+
+void FloordoorU::animation() {
+}
+
+bool FloordoorU::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_WALK && obj1._id == HOLE) {
+ _gm->_state._pyraZ = 6;
+ _gm->_state._pyraDirection = 0;
+ _gm->_state._pyraE = 1;
+ return false;
+ } else if (verb == ACTION_USE && obj1._id == ROPE) {
+ _gm->_state._pyraZ = 6;
+ _gm->_state._pyraDirection = 0;
+ _gm->_state._pyraE = 1;
+ _gm->changeRoom(FLOORDOOR);
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+ _vm->renderMessage(kStringPyramid9);
+ } else
+ return false;
+ return true;
+}
+
+BstDoor::BstDoor(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 15;
+ _id = BST_DOOR;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 18, 18, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 17, 17, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringLetter, kStringDefaultDescription, BST1, PRESS, 0, 0, 0);
+ _objectState[3] = Object(_id, kStringLetter, kStringDefaultDescription, BST2, PRESS, 1, 0, 0);
+ _objectState[4] = Object(_id, kStringLetter, kStringDefaultDescription, BST3, PRESS, 2, 0, 0);
+ _objectState[5] = Object(_id, kStringLetter, kStringDefaultDescription, BST4, PRESS, 3, 0, 0);
+ _objectState[6] = Object(_id, kStringLetter, kStringDefaultDescription, BST5, PRESS, 4, 0, 0);
+ _objectState[7] = Object(_id, kStringLetter, kStringDefaultDescription, BST6, PRESS, 5, 0, 0);
+ _objectState[8] = Object(_id, kStringLetter, kStringDefaultDescription, BST7, PRESS, 6, 0, 0);
+ _objectState[9] = Object(_id, kStringLetter, kStringDefaultDescription, BST8, PRESS, 7, 0, 0);
+ _objectState[10] = Object(_id, kStringLetter, kStringDefaultDescription, BST9, PRESS, 8, 0, 0);
+ _objectState[11] = Object(_id, kStringLetter, kStringDefaultDescription, BST10, PRESS, 9, 0, 0);
+ _objectState[12] = Object(_id, kStringLetter, kStringDefaultDescription, BST11, PRESS, 10, 0, 0);
+ _objectState[13] = Object(_id, kStringLetter, kStringDefaultDescription, BST12, PRESS, 11, 0, 0);
+ _objectState[14] = Object(_id, kStringLetter, kStringDefaultDescription, BST13, PRESS, 12, 0, 0);
+ _objectState[15] = Object(_id, kStringLetter, kStringDefaultDescription, BST14, PRESS, 13, 0, 0);
+ _objectState[16] = Object(_id, kStringLetter, kStringDefaultDescription, BST15, PRESS, 14, 0, 0);
+ _objectState[17] = Object(_id, kStringLetter, kStringDefaultDescription, BST16, PRESS, 15, 0, 0);
+ _objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL2, 2);
+
+ char germanPassword[16] = {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
+ char englishPassword[16] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
+ if (ConfMan.get("language") == "en")
+ for (int i = 0; i < 16; i++)
+ _password[i] = englishPassword[i];
+ else
+ for (int i = 0; i < 16; i++)
+ _password[i] = germanPassword[i];
+}
+
+void BstDoor::onEntrance() {
+ if (ConfMan.get("language") == "en")
+ _vm->_screen->renderMessage("You are almost there", kMessageNormal, 105, 130);
+}
+
+void BstDoor::animation() {
+}
+
+bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) {
+ int number = obj1._id - (BST1 - 1);
+ if (isSectionVisible(number))
+ _vm->renderImage(number + 128);
+ else
+ _vm->renderImage(number);
+ _vm->playSound(kAudioTaxiOpen);
+ for (number = 1; number <= 16; number++) {
+ if (isSectionVisible(number) != _password[number - 1])
+ return true;
+ }
+ _gm->wait(2);
+ _vm->renderImage(17);
+ for (number = 1; number <= 16; number++) {
+ setSectionVisible(number, kShownFalse);
+ _objectState[number + 1]._click = 255;
+ }
+ _gm->wait(2);
+ _vm->renderImage(18);
+ _gm->wait(2);
+ _vm->renderImage(19);
+ _objectState[18]._type = EXIT;
+ _objectState[18]._description = kStringDefaultDescription;
+ _vm->playSound(kAudioShip3);
+ _gm->screenShake();
+ } else
+ return false;
+ return true;
+}
+
+Hall2::Hall2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 16;
+ _id = HALL2;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringCoffin, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, COFFIN_ROOM, 2);
+ _objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, CORRIDOR, EXIT, 255, 255, 0, PYR_ENTRANCE, 22);
+}
+
+void Hall2::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Hall2::animation() {
+}
+
+bool Hall2::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_WALK && obj1._id == CORRIDOR) {
+ _gm->_state._pyraDirection = 2;
+ _gm->passageConstruction();
+ }
+ return false;
+}
+
+CoffinRoom::CoffinRoom(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 17;
+ _id = COFFIN_ROOM;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL2, 22);
+ _objectState[1] = Object(_id, kStringCoffin, kStringCreepy, COFFIN, NULLTYPE, 0, 0, 0);
+ _objectState[2] = Object(_id, kStringToothbrush, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 1, 1, 0);
+ _objectState[3] = Object(_id, kStringToothpaste, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 2, 2, 0);
+ _objectState[4] = Object(_id, kStringBall, kStringBallDescription, L_BALL, NULLTYPE, 3, 3, 0);
+ _objectState[5] = Object(_id, kStringBall, kStringBallDescription, R_BALL, NULLTYPE, 4, 4, 0);
+}
+
+void CoffinRoom::onEntrance() {
+ setRoomSeen(true);
+}
+
+void CoffinRoom::animation() {
+}
+
+bool CoffinRoom::interact(Action verb, Object &obj1, Object &obj2) {
+ char change;
+ if (verb == ACTION_OPEN && obj1._id == COFFIN && !isSectionVisible(1)) {
+ _vm->renderMessage(kStringPyramid13);
+ } else if (verb == ACTION_PRESS && (obj1._id == L_BALL || obj1._id == R_BALL)) {
+ if (obj1._id == L_BALL) {
+ if ((change = !isSectionVisible(2))) {
+ _vm->renderImage(2);
+ _vm->playSound(kAudioTaxiOpen);
+ } else
+ _vm->renderMessage(kStringPyramid14);
+ } else {
+ if ((change = !isSectionVisible(3))) {
+ _vm->renderImage(3);
+ _vm->playSound(kAudioTaxiOpen);
+ } else
+ _vm->renderMessage(kStringPyramid14);
+ } if (change) {
+ if (isSectionVisible(2) && isSectionVisible(3)) {
+ _vm->playSound(kAudioShip2);
+ _vm->renderImage(4);
+ _gm->wait(4);
+ _vm->renderImage(5);
+ _gm->wait(4);
+ _vm->renderImage(5);
+ _gm->wait(4);
+ _vm->renderImage(5);
+ _gm->wait(4);
+ _vm->renderImage(1);
+ setSectionVisible(4, kShownFalse);
+ setSectionVisible(5, kShownFalse);
+ setSectionVisible(6, kShownFalse);
+ setSectionVisible(7, kShownFalse);
+ }
+ else
+ _vm->renderMessage(kStringPyramid15);
+ }
+ } else if (verb == ACTION_LOOK && obj1._id == COFFIN && isSectionVisible(1)) {
+ _gm->changeRoom(MASK);
+ _gm->_newRoom = true;
+ } else
+ return false;
+ return true;
+}
+
+Mask::Mask(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 18;
+ _id = MASK;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, COFFIN_ROOM, 22);
+ _objectState[1] = Object(_id, kStringEye, kStringEyeDescription, EYE1, NULLTYPE, 0, 0, 0);
+ _objectState[2] = Object(_id, kStringEye, kStringEyeDescription, EYE2, NULLTYPE, 1, 1, 0);
+ _objectState[3] = Object(_id, kStringMouth, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+}
+
+void Mask::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Mask::animation() {
+}
+
+bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_OPEN && (obj1._id == EYE1 || obj1._id == EYE2)) {
+ if (obj1._type & OPENED)
+ _vm->renderMessage(kStringPyramid16);
+ else
+ _vm->renderImage(obj1._id - EYE1 + 1);
+ if (isSectionVisible(1) && isSectionVisible(2)) {
+ _gm->reply(kStringPyramid17, 3, 3 + 128);
+ _gm->reply(kStringPyramid18, 3, 3 + 128);
+ _gm->reply(kStringPyramid19, 3, 3 + 128);
+ _vm->playSound(kAudioAppearance1);
+ while(_vm->_sound->isPlaying())
+ _gm->wait(1);
+ _vm->paletteFadeOut();
+ _vm->loadGame(kSleepAutosaveSlot);
+ _gm->changeRoom(CABIN2);
+ _gm->setAnimationTimer(1);
+ _gm->_newRoom = true;
+ _gm->drawGUI();
+ _gm->_rooms[CABIN2]->setSectionVisible(2, kShownTrue);
+ _gm->_rooms[CABIN2]->setSectionVisible(kMaxSection - 1, kShownFalse);
+ _gm->_rooms[CABIN2]->setSectionVisible(kMaxSection - 2, kShownTrue);
+ _gm->_rooms[CABIN2]->setSectionVisible(1, kShownFalse);
+ _gm->_rooms[CABIN2]->getObject(2)->_click = 8;
+ _gm->_state._eventTime = kMaxTimerValue;
+ }
+ return true;
+ }
+ return false;
+}
+
+Museum::Museum(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 29;
+ _id = MUSEUM;
+ _shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDinosaur, kStringDinosaurDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+ _objectState[1] = Object(_id, kStringEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 1, 1, 0, NULLROOM, 0);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_ENTRANCE, 9);
+ _objectState[3] = Object(_id, kStringRoad, kStringDefaultDescription, MUS_STREET, EXIT, 3, 3, 0);
+}
+
+void Museum::onEntrance() {
+ _gm->setAnimationTimer(1);
+ if (_gm->_state._alarmCracked && !_gm->_state._alarmOn) {
+ _gm->_state._eventTime = kMaxTimerValue;
+ _gm->_state._alarmOn = false;
+ _gm->_state._haste = false;
+ _vm->renderMessage(kStringMuseum1);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _gm->_state._sirenOn = false;
+ _vm->stopSound();
+ _vm->paletteFadeOut();
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_screen->setViewportBrightness(255);
+ _vm->renderMessage(kStringMuseum2);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->_screen->setViewportBrightness(0);
+ _vm->setCurrentImage(26);
+ bool hasDinosaurHead = false;
+ if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+ hasDinosaurHead = true;
+ _vm->loadGame(kSleepAutosaveSlot);
+ _vm->renderImage(0);
+ _vm->paletteFadeIn();
+ if (hasDinosaurHead) {
+ _gm->reply(kStringMuseum3, 1, 1 + 128);
+ _gm->reply(kStringMuseum4, 1, 1 + 128);
+ _gm->takeMoney(30000);
+ _vm->playSound(kAudioAppearance1);
+ } else {
+ _gm->reply(kStringMuseum5, 1, 1 + 128);
+ _gm->say(kStringMuseum23);
+ _gm->reply(kStringMuseum24, 1, 1 + 128);
+ }
+ _vm->paletteFadeOut();
+ _gm->changeRoom(CITY2);
+ _gm->_newRoom = true;
+ _gm->drawGUI();
+ }
+}
+
+void Museum::animation() {
+}
+
+bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_WALK && obj1._id == MUS_STREET) {
+ if (!_gm->_state._alarmOn &&
+ !(_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)) {
+ _vm->renderMessage(kStringMuseum10);
+ } else {
+ _gm->_state._eventTime = kMaxTimerValue;
+ if (_gm->_state._alarmOn) {
+ _vm->renderMessage(kStringMuseum11);
+ if (_gm->_state._sirenOn) {
+ _vm->stopSound();
+ _gm->_state._sirenOn = false;
+ }
+ } else
+ _vm->renderMessage(kStringMuseum12);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->paletteFadeOut();
+ _vm->_system->fillScreen(kColorBlack);
+ _vm->_screen->setViewportBrightness(255);
+ _vm->_screen->setGuiBrightness(255);
+ _vm->_screen->paletteBrightness();
+ _vm->renderMessage(kStringMuseum13);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->_screen->setViewportBrightness(0);
+ _vm->_screen->setGuiBrightness(0);
+ _vm->_screen->paletteBrightness();
+ bool hasDinosaurHead = false;
+ if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+ hasDinosaurHead = true;
+ _vm->loadGame(kSleepAutosaveSlot);
+ if (_gm->_state._money >= 8)
+ _gm->takeMoney(-8);
+ if (hasDinosaurHead)
+ _gm->takeObject(*_gm->_rooms[INTRO2]->getObject(7));
+ _gm->changeRoom(CULTURE_PALACE);
+ _gm->_newRoom = true;
+ _gm->_state._alarmOn = false;
+ _gm->_state._haste = false;
+ _gm->drawGUI();
+ }
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, DOOR) &&
+ !(_objectState[2]._type & OPENED)) {
+ if (_gm->crackDoor(20)) {
+ _vm->renderImage(1);
+ _objectState[2]._type = EXIT | OPENABLE | OPENED;
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == DOOR && (obj1._type & OPENED)) {
+ _vm->renderImage(1 + 128);
+ _objectState[2]._type = EXIT | OPENABLE | CLOSED;
+ _vm->playSound(kAudioElevator1);
+ } else if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
+ _vm->renderMessage(kStringMuseum14);
+ } else if (verb == ACTION_WALK && obj1._id == DOOR) {
+ _gm->_state._haste = true;
+ return false;
+ } else
+ return false;
+ return true;
+}
+
+MusEntrance::MusEntrance(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 32;
+ _id = MUS_ENTRANCE;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED, 1, 1, 2, MUSEUM, 23);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS11, 2);
+}
+
+void MusEntrance::onEntrance() {
+ setRoomSeen(true);
+}
+
+void MusEntrance::animation() {
+}
+
+bool MusEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_OPEN && obj1._id == DOOR)
+ _gm->_rooms[MUS11]->getObject(2)->_type |= OPENED;
+ else if (verb == ACTION_CLOSE && obj1._id == DOOR)
+ _gm->_rooms[MUS11]->getObject(2)->_type &= ~OPENED;
+ else if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[0]._type & OPENED)) {
+ if (_gm->crackDoor(20)) {
+ _vm->renderImage(2);
+ _objectState[0]._type = EXIT | OPENABLE | OPENED;
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ return true;
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(2 + 128);
+ _objectState[0]._type = EXIT | OPENABLE | CLOSED;
+ _vm->playSound(kAudioElevator1);
+ return true;
+ }
+ return false;
+}
+
+Mus1::Mus1(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS1;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[15] = kShownTrue;
+ _shown[26] = kShownTrue;
+ _shown[27] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS2, 22);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 4, 4, 11, MUS8, 9);
+}
+
+void Mus1::onEntrance() {
+ _gm->securityEntrance();
+ setRoomSeen(true);
+}
+
+void Mus1::animation() {
+}
+
+bool Mus1::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
+}
+
+Mus2::Mus2(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS2;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[22] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS1, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS3, 22);
+}
+
+void Mus2::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus2::animation() {
+}
+
+bool Mus2::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
+}
+
+Mus3::Mus3(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS3;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[23] = kShownTrue;
+ _shown[28] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS2, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 5, 5, 12, MUS10, 19);
+}
+
+void Mus3::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus3::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus3::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
+}
+
+Mus4::Mus4(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS4;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[20] = kShownTrue;
+ _shown[21] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS5, 22);
+ _objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+
+}
+
+void Mus4::onEntrance() {
+ setRoomSeen(true);
+}
+
+void Mus4::animation() {
+}
+
+bool Mus4::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
+}
+
+Mus5::Mus5(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS5;
+ _shown[0] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[24] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 8, MUS6, 22);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 2, 2, 9, MUS9, 5);
+
+}
+
+void Mus5::onEntrance() {
+ _gm->securityEntrance();
+ setRoomSeen(true);
+}
+
+void Mus5::animation() {
+}
+
+bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[1]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(8);
+ _objectState[1]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS6]->setSectionVisible(7, kShownTrue);
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(8 + 128);
+ _objectState[1]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else
+ return false;
+ return true;
+}
+
+Mus6::Mus6(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS6;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[19] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 7, MUS5, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS7, 22);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 6, 6, 0);
+}
+
+void Mus6::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus6::animation() {
+}
+
+bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[0]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(7);
+ _objectState[0]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS5]->setSectionVisible(8, kShownTrue);
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(7 + 128);
+ _objectState[0]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR))
+ _vm->renderMessage(kStringMuseum14);
+ else
+ return false;
+ return true;
+}
+
+Mus7::Mus7(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 35;
+ _id = MUS7;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[16] = kShownTrue;
+ _shown[25] = kShownTrue;
+ _shown[28] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS6, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 3, 3, 10, MUS11, 15);
+}
+
+void Mus7::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus7::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
+}
+
+Mus8::Mus8(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 34;
+ _id = MUS8;
+ _shown[0] = kShownTrue;
+ _shown[12] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS1, 10);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 2, MUS9, 14);
+}
+
+void Mus8::onEntrance() {
+ _gm->securityEntrance();
+ setRoomSeen(true);
+}
+
+void Mus8::animation() {
+}
+
+bool Mus8::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[1]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(2);
+ _objectState[1]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS9]->setSectionVisible(1, kShownTrue);
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(2 + 128);
+ _objectState[1]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS9]->setSectionVisible(1, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else
+ return false;
+ return true;
+}
+
+Mus9::Mus9(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 34;
+ _id = MUS9;
+ _shown[0] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[10] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 1, MUS8, 10);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS5, 14);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, MUS_ROUND, 21);
+}
+
+void Mus9::onEntrance() {
+ _gm->securityEntrance();
+ setRoomSeen(true);
+}
+
+void Mus9::animation() {
+}
+
+bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[0]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(1);
+ _objectState[0]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS8]->setSectionVisible(2, kShownTrue);
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(1 + 128);
+ _objectState[0]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS8]->setSectionVisible(2, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, SMALL_DOOR) &&
+ !(_objectState[2]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(6);
+ setSectionVisible(5, kShownFalse);
+ _objectState[2]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(5);
+ setSectionVisible(6, kShownFalse);
+ _objectState[2]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+ _vm->playSound(kAudioElevator1);
+ } else
+ return false;
+ return true;
+}
+
+Mus10::Mus10(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 34;
+ _id = MUS10;
+ _shown[0] = kShownTrue;
+ _shown[11] = kShownTrue;
+ _shown[13] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS3, 10);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS11, 14);
+ _objectState[2] = Object(_id, kStringMainEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 4, 4, 0);
+}
+
+void Mus10::onEntrance() {
+ _gm->securityEntrance();
+ setRoomSeen(true);
+}
+
+void Mus10::animation() {
+}
+
+bool Mus10::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
+ _vm->renderMessage(kStringMuseum14);
+ return true;
+ }
+ return false;
+}
+
+Mus11::Mus11(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 34;
+ _id = MUS11;
+ _shown[0] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[9] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS10, 10);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS7, 14);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE, 2, 2, 0, MUS_ENTRANCE, 21);
+}
+
+void Mus11::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus11::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus11::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_OPEN && obj1._id == SMALL_DOOR && !(obj1._type & OPENED)) {
+ obj1._type |= OPENED;
+ _vm->renderImage(4);
+ setSectionVisible(3, kShownFalse);
+ _vm->playSound(kAudioTaxiOpen);
+ } else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR &&
+ (obj1._type & OPENED)) {
+ obj1._type &= ~OPENED;
+ _vm->renderImage(3);
+ setSectionVisible(4, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else
+ return false;
+ return true;
+}
+
+MusRound::MusRound(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 33;
+ _id = MUS_ROUND;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED | COMBINABLE, 0, 0, 1, MUS9, 2);
+ _objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, MUS13, 10);
+ _objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 2, 2, 0, MUS12, 14);
+ _objectState[3] = Object(_id, kStringDinosaur, kStringDinosaurDescription2, NULLOBJECT, NULLTYPE, 3, 3, 0);
+ _objectState[4] = Object(_id, kStringDinosaurHead, kStringDinosaurHeadDescription, HEAD, TAKE, 4, 4, 2);
+}
+
+void MusRound::onEntrance() {
+ setRoomSeen(true);
+}
+
+void MusRound::animation() {
+}
+
+bool MusRound::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[0]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(1);
+ _objectState[0]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | OPENED;
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(1 + 128);
+ _objectState[0]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+ _vm->playSound(kAudioElevator1);
+ } else if (verb == ACTION_TAKE && obj1._id == HEAD && !(obj1._type & CARRIED)) {
+ _gm->takeObject(obj1);
+ _vm->playSound(kAudioSuccess2);
+ } else
+ return false;
+ return true;
+}
+
+Mus12::Mus12(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _id = MUS12;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[17] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, MUS_ROUND, 10);
+}
+
+void Mus12::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus12::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus12::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus13::Mus13(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _id = MUS13;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[16] = kShownTrue;
+ _objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 7, 7, 0, MUS_ROUND, 14);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 0, 0, 7, MUS14, 10);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS15, 16);
+}
+
+void Mus13::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus13::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus13::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus14::Mus14(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _id = MUS14;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[8] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 8, MUS13, 14);
+}
+
+void Mus14::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus14::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus14::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus15::Mus15(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 36;
+ _id = MUS15;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[8] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS13, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS16, 22);
+}
+
+void Mus15::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus15::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus15::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus16::Mus16(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 36;
+ _id = MUS16;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[10] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS15, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS17, 22);
+}
+
+void Mus16::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus16::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus16::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus17::Mus17(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _id = MUS17;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[9] = kShownTrue;
+ _shown[17] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 2, 2, 9, MUS16, 6);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 8, MUS21, 14);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS18, 16);
+ _objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 4, 4, 11, MUS20, 8);
+}
+
+void Mus17::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus17::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus17::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus18::Mus18(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 36;
+ _id = MUS18;
+ _shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[11] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS17, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS19, 22);
+}
+
+void Mus18::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus18::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus18::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus19::Mus19(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _id = MUS19;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[11] = kShownTrue;
+ _shown[15] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 4, 4, 11, MUS18, 8);
+}
+
+void Mus19::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus19::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus19::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus20::Mus20(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 36;
+ _id = MUS20;
+ _shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[7] = kShownTrue;
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 4, MUS17, 22);
+}
+
+void Mus20::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus20::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus20::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus21::Mus21(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 37;
+ _id = MUS21;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[7] = kShownTrue;
+ _shown[18] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 7, MUS17, 10);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS22, 16);
+}
+
+void Mus21::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus21::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus21::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+Mus22::Mus22(SupernovaEngine *vm, GameManager2 *gm) {
+ _vm = vm;
+ _gm = gm;
+
+ _fileNumber = 36;
+ _id = MUS22;
+ _shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[9] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS21, 2);
+ _objectState[1] = Object(_id, kStringAlarmSystem, kStringDefaultDescription, ALARM_SYSTEM, COMBINABLE, 2, 2, 0);
+ _objectState[2] = Object(_id, kStringSuctionCup, kStringDefaultDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
+ _objectState[3] = Object(_id, kStringWall, kStringDefaultDescription, WALL, COMBINABLE, 4, 4, 0);
+}
+
+void Mus22::onEntrance() {
+ _gm->pressureAlarmEntrance();
+}
+
+void Mus22::animation() {
+ _gm->pressureAlarmCount();
+}
+
+bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, SUCTION_CUP, WALL)) {
+ if (isSectionVisible(6))
+ _vm->renderMessage(kStringMuseum17);
+ else {
+ _vm->renderImage(6);
+ _vm->renderMessage(kStringMuseum18);
+ _objectState[2]._click = 3;
+ if (obj1._id == SUCTION_CUP)
+ _gm->_inventory.remove(obj1);
+ else
+ _gm->_inventory.remove(obj2);
+ }
+ } else if (verb == ACTION_TAKE && obj1._id == SUCTION_CUP &&
+ !(obj1._type & CARRIED)) {
+ _vm->renderImage(2);
+ setSectionVisible(6, kShownFalse);
+ _vm->renderImage(5);
+ _gm->takeObject(obj1);
+ _vm->renderMessage(kStringMuseum19);
+ } else if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, ALARM_CRACKER, ALARM_SYSTEM)) {
+ if (_gm->_state._alarmCracked)
+ _vm->renderMessage(kStringMuseum20);
+ else {
+ _vm->renderMessage(kStringMuseum21);
+ _gm->crack(20);
+ if (!_gm->_state._alarmOn) {
+ _vm->renderMessage(kStringMuseum22);
+ _vm->playSound(kAudioSuccess2);
+ _gm->_state._alarmCracked = true;
+ }
+ }
+ } else
+ return false;
+ return true;
+}
+
+}