aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-06-05 16:21:10 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commitb4c59bee451f6715c368d9607786eb5ddb40b6f0 (patch)
tree7019b35931a39d342b3dd52906b7774d5745211d
parentd2e67fca8fb61848af51e06fdbf4013b50f2df05 (diff)
downloadscummvm-rg350-b4c59bee451f6715c368d9607786eb5ddb40b6f0.tar.gz
scummvm-rg350-b4c59bee451f6715c368d9607786eb5ddb40b6f0.tar.bz2
scummvm-rg350-b4c59bee451f6715c368d9607786eb5ddb40b6f0.zip
SUPERNOVA2: Add partialy finished Elevator room.
-rw-r--r--engines/supernova2/-221
-rw-r--r--engines/supernova2/ms2_def.h34
-rw-r--r--engines/supernova2/resman.cpp3
-rw-r--r--engines/supernova2/rooms.cpp210
-rw-r--r--engines/supernova2/rooms.h1
-rw-r--r--engines/supernova2/sound.h1
-rw-r--r--engines/supernova2/state.cpp6
-rw-r--r--engines/supernova2/state.h2
8 files changed, 459 insertions, 19 deletions
diff --git a/engines/supernova2/- b/engines/supernova2/-
new file mode 100644
index 0000000000..beda2e284d
--- /dev/null
+++ b/engines/supernova2/-
@@ -0,0 +1,221 @@
+/* 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.
+ *
+ */
+
+#ifndef SUPERNOVA2_STATE_H
+#define SUPERNOVA2_STATE_H
+
+#include "common/events.h"
+#include "common/rect.h"
+#include "common/keyboard.h"
+#include "supernova2/rooms.h"
+#include "supernova2/sound.h"
+
+namespace Supernova2 {
+
+const int32 kMaxTimerValue = 0x7FFFFFFF;
+
+enum EventFunction { kNoFn, kSoberFn};
+
+struct GameState {
+ int16 _money;
+ bool _addressKnown;
+ Room *_previousRoom;
+ bool _poleMagnet;
+ char _admission;
+ bool _tipsy;
+ bool _dark;
+ char _elevatorE;
+ char _elevatorNumber;
+ bool _toMuseum;
+ EventFunction _eventCallback;
+ uint32 _eventTime;
+};
+
+class Inventory {
+public:
+ Inventory(Object *nullObject, int &inventoryScroll)
+ : _numObjects(0)
+ , _nullObject(nullObject)
+ , _inventoryScroll(inventoryScroll) {
+ for (int i = 0; i < kMaxCarry; ++i)
+ _inventory[i] = nullptr;
+ }
+
+ void add(Object &obj);
+ void remove(Object &obj);
+ void clear();
+ Object *get(int index) const;
+ Object *get(ObjectId id) const;
+ int getSize() const { return _numObjects; }
+
+private:
+ Object *_inventory[kMaxCarry];
+ Object *_nullObject;
+ int &_inventoryScroll;
+ int _numObjects;
+};
+
+class GuiElement : public Common::Rect {
+public:
+ GuiElement();
+
+ void setSize(int x1, int y1, int x2, int y2);
+ void setText(const char *text);
+ void setTextPosition(int x, int y);
+ void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
+ void setHighlight(bool isHighlighted);
+
+ const char *getText() const {
+ return _text;
+ }
+ int getBackgroundColor() const {
+ return _bgColor;
+ }
+ int getTextColor() const {
+ return _textColor;
+ }
+ const Common::Point &getTextPos() const {
+ return _textPosition;
+ }
+ bool isHighlighted() const {
+ return _isHighlighted;
+ }
+
+private:
+ Common::Point _textPosition;
+ char _text[128];
+ int _bgColor;
+ int _textColor;
+ int _bgColorNormal;
+ int _bgColorHighlighted;
+ int _textColorNormal;
+ int _textColorHighlighted;
+ bool _isHighlighted;
+};
+
+class GameManager {
+public:
+ GameManager(Supernova2Engine *vm);
+ ~GameManager();
+
+ void updateEvents();
+ void processInput(Common::KeyState &state);
+ void processInput();
+ void executeRoom();
+ bool serialize(Common::WriteStream *out);
+ bool deserialize(Common::ReadStream *in, int version);
+
+ static StringId guiCommands[];
+ static StringId guiStatusCommands[];
+ Supernova2Engine *_vm;
+ Common::KeyState _key;
+ Common::EventType _mouseClickType;
+ bool _mouseClicked;
+ bool _keyPressed;
+ int _mouseX;
+ int _mouseY;
+ int _mouseField;
+ Room *_currentRoom;
+ bool _newRoom;
+ Room *_rooms[NUMROOMS];
+ Inventory _inventory;
+ GameState _state;
+ bool _processInput;
+ bool _guiEnabled;
+ bool _animationEnabled;
+ Action _inputVerb;
+ Object _nullObject;
+ Object *_currentInputObject;
+ Object *_inputObject[2];
+ int32 _oldTime;
+ uint _timePaused;
+ bool _timerPaused;
+ int _restTime;
+ int32 _messageDuration;
+ int32 _animationTimer;
+ int _inventoryScroll;
+ int _exitList[25];
+ GuiElement _guiCommandButton[10];
+ GuiElement _guiInventory[8];
+ GuiElement _guiInventoryArrow[2];
+ // Dialog
+ int _currentSentence;
+ int _sentenceNumber[6];
+ StringId _texts[6];
+ byte _rows[6];
+ byte _rowsStart[6];
+ byte _dials[6];
+ int _taxi_possibility;
+
+ void takeObject(Object &obj);
+ void setObjectNull(Object *&obj);
+ bool isNullObject(Object *obj);
+
+ void initState();
+ void initRooms();
+ void destroyRooms();
+ void initGui();
+ bool genericInteract(Action verb, Object &obj1, Object &obj2);
+ uint16 getKeyInput(bool blockForPrintChar = false);
+ void getInput();
+ void wait(int ticks);
+ void waitOnInput(int ticks);
+ bool waitOnInput(int ticks, Common::KeyCode &keycode);
+ void showMenu();
+ void edit(Common::String &input, int x, int y, uint length);
+ int invertSection(int section);
+ void drawMapExits();
+ void drawStatus();
+ void drawCommandBox();
+ void drawInventory();
+ void changeRoom(RoomId id);
+ void resetInputState();
+ void handleInput();
+ void handleTime();
+ void pauseTimer(bool pause);
+ void setAnimationTimer(int ticks);
+ int dialog(int num, byte rowLength[6], StringId text[6], int number);
+ void sentence(int number, bool brightness);
+ void say(StringId textId);
+ void say(const char *text);
+ void reply(StringId textId, int aus1, int aus2);
+ void reply(const char *text, int aus1, int aus2);
+ void mousePosDialog(int x, int y);
+ void takeMoney(int amount);
+ void taxi();
+ void leaveTaxi();
+ void taxiUnknownDestination();
+ void taxiPayment(int price, int destination);
+ void playerTakeOut();
+ void sober();
+ void playCD();
+ void drawGUI();
+ bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
+ bool talkRest(int mod1, int mod2, int rest);
+
+private:
+ int _prevImgId;
+};
+
+}
+
+#endif // SUPERNOVA2_STATE_H
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index f99c008d9e..f3cc21f8a4 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -116,12 +116,12 @@ enum ObjectId {
BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE,
CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
- SCRIBBLE1,SCRIBBLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
+ SCRIBBLE1,SCRIBBLE2,BELL,KEYPAD,DOOR_L,DOOR_R,ID_CARD,
MAGNET,UNDER_BED,KEY,VALVE,WARDROBE,DISCMAN,
SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
- MUSCARD,SKOPF
+ MUSCARD,SKOPF, DISPLAY
};
enum StringId {
@@ -216,19 +216,19 @@ kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11
kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22,
kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27,
-kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kString454,
-kString455, kString456, kString457, kString458, kString459,
-kString460, kString461, kString462, kString463, kString464,
-kString465, kString466, kString467, kString468, kString469,
-kString470, kString471, kString472, kString473, kString474,
-kString475, kString476, kString477, kString478, kString479,
-kString480, kString481, kString482, kString483, kString484,
-kString485, kString486, kString487, kString488, kString489,
-kString490, kString491, kString492, kString493, kString494,
-kString495, kString496, kString497, kString498, kString499,
-kString500, kString501, kString502, kString503, kString504,
-kString505, kString506, kString507, kString508, kString509,
-kString510, kString511, kString512, kString513, kString514,
+kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kStringElevator1,
+kStringElevator2, kStringElevator3, kStringElevator4, kStringElevator5, kStringElevator6,
+kStringElevator7, kStringElevator8, kStringElevator9, kStringElevator10, kStringElevator11,
+kStringElevator12, kStringElevator13, kStringElevator14, kStringElevator15, kStringElevator16,
+kStringElevator17, kStringElevator18, kStringElevator19, kStringElevator20, kStringElevator21,
+kStringElevator22, kStringElevator23, kStringElevator24, kStringElevator25, kStringElevator26,
+kStringElevator27, kStringElevator28, kStringElevator29, kStringElevator30, kStringElevator31,
+kStringElevator32, kStringElevator33, kStringElevator34, kStringElevator35, kStringElevator36,
+kStringElevator37, kStringElevator38, kStringElevator39, kStringElevator40, kStringElevator41,
+kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStringElevator46,
+kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
+kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
+kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
kString515, kString516, kString517, kString518, kString519,
kString520, kString521, kString522, kString523, kString524,
kString525, kString526, kString527, kString528, kString529,
@@ -237,8 +237,8 @@ kString535, kString536, kString537, kString538, kString539,
kString540, kString541, kString542, kString543, kString544,
kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
-kStringSign3Description, kStringSign4Description, kString557, kString558, kString559,
-kString560, kString561, kString562, kString563, kString564,
+kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
+kStringKeypadDescription, kString561, kString562, kString563, kString564,
kString565, kString566, kString567, kString568, kString569,
kString570, kString571, kString572, kString573, kString574,
kString575, kString576, kString577, kString578, kString579,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 29a272d8a4..7ab833f96e 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -55,7 +55,8 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
{55, 0, 7010},
{53, 5010, 30020},
{55, 18230, -1},
- {55, 17020, 18230}
+ {55, 17020, 18230},
+ {53, 0, 30020}
};
static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9ce7a54cea..f9b8056843 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1596,12 +1596,23 @@ Elevator::Elevator(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 24;
_id = ELEVATOR;
_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, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 4, 4, 0, APARTMENT, 3);
}
void Elevator::onEntrance() {
+ if (_gm->_state._elevatorE)
+ _objectState[5]._type &= ~OPENED;
+ else
+ _objectState[5]._type |= OPENED;
setRoomSeen(true);
}
@@ -1609,9 +1620,206 @@ void Elevator::animation() {
}
bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
+ static StringId dialLuke1[4] = {
+ kStringElevator2,
+ kStringElevator3,
+ kStringElevator4,
+ kStringElevator5
+ };
+ static byte dialsLuke1[3] = {2,1,1};
+ static StringId dialBoss1[2] = {
+ kStringElevator6,
+ kStringElevator7
+ };
+ char input[3];
+
+ 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->paletteFadeIn();
+ _vm->renderMessage(kStringElevator14);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->paletteFadeOut();
+ _vm->paletteFadeOut();
+ _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
+ return false;
return true;
}
+void Elevator::jobDescription() {
+ static StringId dialBoss2[5] = {
+ kStringElevator8,
+ kStringElevator9,
+ kStringElevator10
+ };
+ byte dialsBoss2[4] = {1,1,2,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->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->paletteFadeIn();
+ _vm->renderMessage(kStringElevator55);
+ _gm->waitOnInput(_gm->_messageDuration);
+ _vm->removeMessage();
+ _vm->paletteFadeOut();
+ _vm->saveGame(kSleepAutosaveSlot, "autosave");
+ _gm->_inventory.clear();
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(3));
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(5));
+ _gm->takeObject(*_gm->_rooms[INTRO]->getObject(6));
+ _gm->takeObject(*_gm->_rooms[INTRO]->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();
+ _gm->_state._startTime = g_system->getMillis() - 2390000;
+ _gm->_state._tipsy = false;
+ _gm->_state._toMuseum = true;
+}
+
Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 3e0f75c457..4145f8028a 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -200,6 +200,7 @@ public:
virtual bool interact(Action verb, Object &obj1, Object &obj2);
private:
+ void jobDescription();
};
class Apartment : public Room {
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 7798c7a38d..e2e693f45d 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -42,6 +42,7 @@ enum AudioId {
kAudioAppearance1,
kAudioAppearance2,
kAudioAppearance3,
+ kAudioElevatorBell,
kAudioNumSamples
};
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 8f3a3cfa79..2cc05180d2 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -37,6 +37,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
// GameState
out->writeSint16LE(_state._money);
+ out->writeSint32LE(_state._startTime);
out->writeByte(_state._addressKnown);
out->writeByte(_state._poleMagnet);
out->writeByte(_state._admission);
@@ -44,6 +45,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeByte(_state._dark);
out->writeByte(_state._elevatorE);
out->writeByte(_state._elevatorNumber);
+ out->writeByte(_state._toMuseum);
out->writeUint32LE(_state._eventTime);
out->writeSint32LE(_state._eventCallback);
@@ -73,6 +75,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
// GameState
_state._money = in->readSint16LE();
+ _state._startTime = in->readSint32LE();
_state._addressKnown = in->readByte();
_state._poleMagnet = in->readByte();
_state._admission = in->readByte();
@@ -80,6 +83,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._dark = in->readByte();
_state._elevatorE = in->readByte();
_state._elevatorNumber = in->readByte();
+ _state._toMuseum = in->readByte();
_state._eventTime = in->readUint32LE();
_state._eventCallback = (EventFunction)in->readSint32LE();
_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -342,6 +346,7 @@ void GameManager::initState() {
_prevImgId = 0;
_state._money = 20;
+ _state._startTime = 0;
_state._addressKnown = false;
_state._previousRoom = _currentRoom;
_state._poleMagnet = false;
@@ -350,6 +355,7 @@ void GameManager::initState() {
_state._dark = false;
_state._elevatorE = 0;
_state._elevatorNumber = 0;
+ _state._toMuseum = false;
_state._eventTime = kMaxTimerValue;
_state._eventCallback = kNoFn;
}
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 927bca3174..53deb9f13b 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -37,6 +37,7 @@ enum EventFunction { kNoFn, kSoberFn};
struct GameState {
int16 _money;
+ int32 _startTime;
bool _addressKnown;
Room *_previousRoom;
bool _poleMagnet;
@@ -45,6 +46,7 @@ struct GameState {
bool _dark;
char _elevatorE;
char _elevatorNumber;
+ bool _toMuseum;
EventFunction _eventCallback;
uint32 _eventTime;
};