diff options
-rw-r--r-- | engines/supernova/module.mk | 1 | ||||
-rw-r--r-- | engines/supernova/room.cpp | 188 | ||||
-rw-r--r-- | engines/supernova/room.h | 79 | ||||
-rw-r--r-- | engines/supernova/rooms.cpp | 150 | ||||
-rw-r--r-- | engines/supernova/rooms.h | 38 | ||||
-rw-r--r-- | engines/supernova/state.h | 1 |
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" |