aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/supernova/module.mk1
-rw-r--r--engines/supernova/room.cpp188
-rw-r--r--engines/supernova/room.h79
-rw-r--r--engines/supernova/rooms.cpp150
-rw-r--r--engines/supernova/rooms.h38
-rw-r--r--engines/supernova/state.h1
6 files changed, 270 insertions, 187 deletions
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index a0750183b4..3eb2259b38 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
detection.o \
graphics.o \
resman.o \
+ room.o \
rooms.o \
screen.o \
sound.o \
diff --git a/engines/supernova/room.cpp b/engines/supernova/room.cpp
new file mode 100644
index 0000000000..24e1aa567c
--- /dev/null
+++ b/engines/supernova/room.cpp
@@ -0,0 +1,188 @@
+/* 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 "graphics/palette.h"
+#include "graphics/cursorman.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/state.h"
+
+namespace Supernova {
+
+Room::Room() {
+ _seen = false;
+ _fileNumber = 0;
+ _id = NULLROOM;
+ _vm = nullptr;
+ _gm = nullptr;
+
+ for (int i = 0; i < kMaxSection; ++i)
+ _shown[i] = kShownFalse;
+ for (int i = 0; i < kMaxDialog; ++i)
+ _sentenceRemoved[i] = 0;
+}
+
+Room::~Room() {
+}
+
+bool Room::serialize(Common::WriteStream *out) {
+ if (out->err())
+ return false;
+
+ out->writeSint32LE(_id);
+ for (int i = 0; i < kMaxSection; ++i)
+ out->writeByte(_shown[i]);
+ for (int i = 0; i < kMaxDialog ; ++i)
+ out->writeByte(_sentenceRemoved[i]);
+
+ int numObjects = 0;
+ while ((numObjects < kMaxObject) && (_objectState[numObjects]._id != INVALIDOBJECT))
+ ++numObjects;
+ out->writeSint32LE(numObjects);
+
+ for (int i = 0; i < numObjects; ++i) {
+ out->writeSint32LE(_objectState[i]._name);
+ out->writeSint32LE(_objectState[i]._description);
+ out->writeByte(_objectState[i]._roomId);
+ out->writeSint32LE(_objectState[i]._id);
+ out->writeSint32LE(_objectState[i]._type);
+ out->writeByte(_objectState[i]._click);
+ out->writeByte(_objectState[i]._click2);
+ out->writeByte(_objectState[i]._section);
+ out->writeSint32LE(_objectState[i]._exitRoom);
+ out->writeByte(_objectState[i]._direction);
+ }
+
+ out->writeByte(_seen);
+
+ return !out->err();
+}
+
+bool Room::deserialize(Common::ReadStream *in, int version) {
+ if (in->err())
+ return false;
+
+ in->readSint32LE();
+
+ for (int i = 0; i < kMaxSection; ++i)
+ _shown[i] = in->readByte();
+
+ // Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
+ // But on the other hand dialog was not implemented anyway, so we don't even try to
+ // recover it.
+ for (int i = 0; i < kMaxDialog ; ++i)
+ _sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
+
+ int numObjects = in->readSint32LE();
+ for (int i = 0; i < numObjects; ++i) {
+ _objectState[i]._name = static_cast<StringId>(in->readSint32LE());
+ _objectState[i]._description = static_cast<StringId>(in->readSint32LE());
+ _objectState[i]._roomId = in->readByte();
+ _objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
+ _objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
+ _objectState[i]._click = in->readByte();
+ _objectState[i]._click2 = in->readByte();
+ _objectState[i]._section = in->readByte();
+ _objectState[i]._exitRoom = static_cast<RoomId>(in->readSint32LE());
+ _objectState[i]._direction = in->readByte();
+ }
+
+ _seen = in->readByte();
+
+ return !in->err();
+}
+
+bool Room::hasSeen() {
+ return _seen;
+}
+void Room::setRoomSeen(bool seen) {
+ _seen = seen;
+}
+
+int Room::getFileNumber() const {
+ return _fileNumber;
+}
+RoomId Room::getId() const {
+ return _id;
+}
+
+void Room::setSectionVisible(uint section, bool visible) {
+ _shown[section] = visible ? kShownTrue : kShownFalse;
+}
+
+bool Room::isSectionVisible(uint index) const {
+ return _shown[index] == kShownTrue;
+}
+
+void Room::removeSentenceByMask(int mask, int number) {
+ if (number > 0) {
+ _sentenceRemoved[number - 1] |= mask;
+ }
+}
+
+void Room::removeSentence(int sentence, int number) {
+ if (number > 0)
+ _sentenceRemoved[number - 1] |= (1 << sentence);
+}
+
+void Room::addSentence(int sentence, int number) {
+ if (number > 0)
+ _sentenceRemoved[number - 1] &= ~(1 << sentence);
+}
+
+void Room::addAllSentences(int number) {
+ if (number > 0)
+ _sentenceRemoved[number - 1] = 0;
+}
+
+bool Room::sentenceRemoved(int sentence, int number) {
+ if (number <= 0)
+ return false;
+ return (_sentenceRemoved[number - 1] & (1 << sentence));
+}
+
+bool Room::allSentencesRemoved(int maxSentence, int number) {
+ if (number <= 0)
+ return false;
+ for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
+ if (!(_sentenceRemoved[number - 1] & flag))
+ return false;
+ return true;
+}
+
+Object *Room::getObject(uint index) {
+ return &_objectState[index];
+}
+
+void Room::animation() {
+}
+
+void Room::onEntrance() {
+}
+
+bool Room::interact(Action verb, Object &obj1, Object &obj2) {
+ return false;
+}
+
+}
diff --git a/engines/supernova/room.h b/engines/supernova/room.h
new file mode 100644
index 0000000000..38d80ab003
--- /dev/null
+++ b/engines/supernova/room.h
@@ -0,0 +1,79 @@
+/* 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 SUPERNOVA_ROOM_H
+#define SUPERNOVA_ROOM_H
+
+#include "common/str.h"
+
+#include "supernova/msn_def.h"
+
+namespace Common {
+class ReadStream;
+class WriteStream;
+}
+
+namespace Supernova {
+
+class GameManager1;
+class SupernovaEngine;
+
+class Room {
+public:
+ Room();
+
+ bool hasSeen();
+ void setRoomSeen(bool seen);
+ int getFileNumber() const;
+ RoomId getId() const;
+ void setSectionVisible(uint section, bool visible);
+ bool isSectionVisible(uint index) const;
+ void removeSentence(int sentence, int number);
+ void removeSentenceByMask(int mask, int number);
+ void addSentence(int sentence, int number);
+ void addAllSentences(int number);
+ bool sentenceRemoved(int sentence, int number);
+ bool allSentencesRemoved(int maxSentence, int number);
+ Object *getObject(uint index);
+
+ virtual ~Room();
+ virtual void animation();
+ virtual void onEntrance();
+ virtual bool interact(Action verb, Object &obj1, Object &obj2);
+ virtual bool serialize(Common::WriteStream *out);
+ virtual bool deserialize(Common::ReadStream *in, int version);
+
+protected:
+ int _fileNumber;
+ bool _shown[kMaxSection];
+ byte _sentenceRemoved[kMaxDialog];
+ Object _objectState[kMaxObject];
+ RoomId _id;
+ SupernovaEngine *_vm;
+ GameManager1 *_gm;
+
+private:
+ bool _seen;
+};
+
+}
+#endif // SUPERNOVA_ROOM_H
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index e6e7dd79b7..04d8e8df98 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -30,156 +30,6 @@
namespace Supernova {
-Room::Room() {
- _seen = false;
- _fileNumber = 0;
- _id = NULLROOM;
- _vm = nullptr;
- _gm = nullptr;
-
- for (int i = 0; i < kMaxSection; ++i)
- _shown[i] = kShownFalse;
- for (int i = 0; i < kMaxDialog; ++i)
- _sentenceRemoved[i] = 0;
-}
-
-Room::~Room() {
-}
-
-bool Room::serialize(Common::WriteStream *out) {
- if (out->err())
- return false;
-
- out->writeSint32LE(_id);
- for (int i = 0; i < kMaxSection; ++i)
- out->writeByte(_shown[i]);
- for (int i = 0; i < kMaxDialog ; ++i)
- out->writeByte(_sentenceRemoved[i]);
-
- int numObjects = 0;
- while ((numObjects < kMaxObject) && (_objectState[numObjects]._id != INVALIDOBJECT))
- ++numObjects;
- out->writeSint32LE(numObjects);
-
- for (int i = 0; i < numObjects; ++i) {
- out->writeSint32LE(_objectState[i]._name);
- out->writeSint32LE(_objectState[i]._description);
- out->writeByte(_objectState[i]._roomId);
- out->writeSint32LE(_objectState[i]._id);
- out->writeSint32LE(_objectState[i]._type);
- out->writeByte(_objectState[i]._click);
- out->writeByte(_objectState[i]._click2);
- out->writeByte(_objectState[i]._section);
- out->writeSint32LE(_objectState[i]._exitRoom);
- out->writeByte(_objectState[i]._direction);
- }
-
- out->writeByte(_seen);
-
- return !out->err();
-}
-
-bool Room::deserialize(Common::ReadStream *in, int version) {
- if (in->err())
- return false;
-
- in->readSint32LE();
-
- for (int i = 0; i < kMaxSection; ++i)
- _shown[i] = in->readByte();
-
- // Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
- // But on the other hand dialog was not implemented anyway, so we don't even try to
- // recover it.
- for (int i = 0; i < kMaxDialog ; ++i)
- _sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
-
- int numObjects = in->readSint32LE();
- for (int i = 0; i < numObjects; ++i) {
- _objectState[i]._name = static_cast<StringId>(in->readSint32LE());
- _objectState[i]._description = static_cast<StringId>(in->readSint32LE());
- _objectState[i]._roomId = in->readByte();
- _objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
- _objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
- _objectState[i]._click = in->readByte();
- _objectState[i]._click2 = in->readByte();
- _objectState[i]._section = in->readByte();
- _objectState[i]._exitRoom = static_cast<RoomId>(in->readSint32LE());
- _objectState[i]._direction = in->readByte();
- }
-
- _seen = in->readByte();
-
- return !in->err();
-}
-
-bool Room::hasSeen() {
- return _seen;
-}
-void Room::setRoomSeen(bool seen) {
- _seen = seen;
-}
-
-int Room::getFileNumber() const {
- return _fileNumber;
-}
-RoomId Room::getId() const {
- return _id;
-}
-
-void Room::setSectionVisible(uint section, bool visible) {
- _shown[section] = visible ? kShownTrue : kShownFalse;
-}
-
-bool Room::isSectionVisible(uint index) const {
- return _shown[index] == kShownTrue;
-}
-
-void Room::removeSentence(int sentence, int number) {
- if (number > 0)
- _sentenceRemoved[number - 1] |= (1 << sentence);
-}
-
-void Room::addSentence(int sentence, int number) {
- if (number > 0)
- _sentenceRemoved[number - 1] &= ~(1 << sentence);
-}
-
-void Room::addAllSentences(int number) {
- if (number > 0)
- _sentenceRemoved[number - 1] = 0;
-}
-
-bool Room::sentenceRemoved(int sentence, int number) {
- if (number <= 0)
- return false;
- return (_sentenceRemoved[number - 1] & (1 << sentence));
-}
-
-bool Room::allSentencesRemoved(int maxSentence, int number) {
- if (number <= 0)
- return false;
- for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
- if (!(_sentenceRemoved[number - 1] & flag))
- return false;
- return true;
-}
-
-Object *Room::getObject(uint index) {
- return &_objectState[index];
-}
-
-void Room::animation() {
-}
-
-void Room::onEntrance() {
-}
-
-bool Room::interact(Action verb, Object &obj1, Object &obj2) {
- return false;
-}
-
-
Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
_vm = vm;
_gm = gm;
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 95e207865e..c49e8356c9 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -26,6 +26,7 @@
#include "common/str.h"
#include "supernova/msn_def.h"
+#include "supernova/room.h"
namespace Common {
class ReadStream;
@@ -37,43 +38,6 @@ namespace Supernova {
class GameManager1;
class SupernovaEngine;
-class Room {
-public:
- Room();
-
- bool hasSeen();
- void setRoomSeen(bool seen);
- int getFileNumber() const;
- RoomId getId() const;
- void setSectionVisible(uint section, bool visible);
- bool isSectionVisible(uint index) const;
- void removeSentence(int sentence, int number);
- void addSentence(int sentence, int number);
- void addAllSentences(int number);
- bool sentenceRemoved(int sentence, int number);
- bool allSentencesRemoved(int maxSentence, int number);
- Object *getObject(uint index);
-
- virtual ~Room();
- virtual void animation();
- virtual void onEntrance();
- virtual bool interact(Action verb, Object &obj1, Object &obj2);
- virtual bool serialize(Common::WriteStream *out);
- virtual bool deserialize(Common::ReadStream *in, int version);
-
-protected:
- int _fileNumber;
- bool _shown[kMaxSection];
- byte _sentenceRemoved[kMaxDialog];
- Object _objectState[kMaxObject];
- RoomId _id;
- SupernovaEngine *_vm;
- GameManager1 *_gm;
-
-private:
- bool _seen;
-};
-
// Room 0
class Intro : public Room {
public:
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 51dab06f89..cb38c2ae1d 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -28,6 +28,7 @@
#include "common/rect.h"
#include "common/keyboard.h"
#include "supernova/rooms.h"
+#include "supernova/room.h"
#include "supernova/sound.h"
#include "supernova/game-manager.h"