aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-06-12 18:08:48 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commit46fe10db87933ce8325f33b64503f713b6f7f998 (patch)
tree72b1457b743a88dc0626f7fc43eea039c2add271 /engines
parent006880ea7cfc906a8ca0f4bfb5f7fcf9955f6e39 (diff)
downloadscummvm-rg350-46fe10db87933ce8325f33b64503f713b6f7f998.tar.gz
scummvm-rg350-46fe10db87933ce8325f33b64503f713b6f7f998.tar.bz2
scummvm-rg350-46fe10db87933ce8325f33b64503f713b6f7f998.zip
SUPERNOVA2: Add MuseumEntrance and Mus1 rooms.
Diffstat (limited to 'engines')
-rw-r--r--engines/supernova2/ms2_def.h2
-rw-r--r--engines/supernova2/rooms.cpp59
-rw-r--r--engines/supernova2/rooms.h4
-rw-r--r--engines/supernova2/state.cpp100
-rw-r--r--engines/supernova2/state.h3
5 files changed, 149 insertions, 19 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 7ab8d9d260..7143b6f2c8 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -91,7 +91,7 @@ enum RoomId {
LCORRIDOR1,LCORRIDOR2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
BST_DOOR,HALL,COFFIN_ROOM,MASK,
- MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
+ MUSEUM,MUS_ENTRANCE,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
MUS9,MUS10,MUS11,MUS_RUND,
MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
NUMROOMS,NULLROOM
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index de92a9246a..a414aa06b3 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3789,7 +3789,7 @@ Museum::Museum(Supernova2Engine *vm, GameManager *gm) {
_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_EING, 9);
+ _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);
}
@@ -3833,8 +3833,6 @@ void Museum::onEntrance() {
}
void Museum::animation() {
- _gm->drawClock();
- _gm->setAnimationTimer(11);
}
bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
@@ -3894,36 +3892,72 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
return true;
}
-MusEing::MusEing(Supernova2Engine *vm, GameManager *gm) {
+MusEntrance::MusEntrance(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
- _id = MUS_EING;
+ _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 MusEing::onEntrance() {
+void MusEntrance::onEntrance() {
setRoomSeen(true);
}
-void MusEing::animation() {
+void MusEntrance::animation() {
}
-bool MusEing::interact(Action verb, Object &obj1, Object &obj2) {
- return true;
+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(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _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);
}
@@ -3931,7 +3965,8 @@ void Mus1::animation() {
}
bool Mus1::interact(Action verb, Object &obj1, Object &obj2) {
- return true;
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
}
Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 8194b02701..c71a4c6c2c 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -563,9 +563,9 @@ public:
private:
};
-class MusEing : public Room {
+class MusEntrance : public Room {
public:
- MusEing(Supernova2Engine *vm, GameManager *gm);
+ MusEntrance(Supernova2Engine *vm, GameManager *gm);
virtual void onEntrance();
virtual void animation();
virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 3cb268a448..36dc72c7d6 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -72,6 +72,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
}
// Rooms
+ out->writeByte(_lastRoom->getId());
out->writeByte(_currentRoom->getId());
for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->serialize(out);
@@ -124,10 +125,12 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
}
// Rooms
+ RoomId lastRoomId = static_cast<RoomId>(in->readByte());
RoomId curRoomId = static_cast<RoomId>(in->readByte());
for (int i = 0; i < NUMROOMS; ++i) {
_rooms[i]->deserialize(in, version);
}
+ _lastRoom = _rooms[lastRoomId];
changeRoom(curRoomId);
// Some additional variables
@@ -309,7 +312,7 @@ void GameManager::destroyRooms() {
delete _rooms[COFFIN_ROOM];
delete _rooms[MASK];
delete _rooms[MUSEUM];
- delete _rooms[MUS_EING];
+ delete _rooms[MUS_ENTRANCE];
delete _rooms[MUS1];
delete _rooms[MUS2];
delete _rooms[MUS3];
@@ -449,7 +452,7 @@ void GameManager::initRooms() {
_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);
_rooms[MASK] = new Mask(_vm, this);
_rooms[MUSEUM] = new Museum(_vm, this);
- _rooms[MUS_EING] = new MusEing(_vm, this);
+ _rooms[MUS_ENTRANCE] = new MusEntrance(_vm, this);
_rooms[MUS1] = new Mus1(_vm, this);
_rooms[MUS2] = new Mus2(_vm, this);
_rooms[MUS3] = new Mus3(_vm, this);
@@ -1448,8 +1451,10 @@ void GameManager::handleInput() {
} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
// This is closed
_vm->renderMessage(kStringGenericInteract3);
- } else
+ } else {
+ _lastRoom = _currentRoom;
changeRoom(_inputObject[0]->_exitRoom);
+ }
break;
@@ -2139,7 +2144,7 @@ void GameManager::drawClock() {
if (!_state._alarmOn && _currentRoom == _rooms[MUS4] &&
second >= 21 && second <= 40)
alarm();
- if (_currentRoom == _rooms[MUS_EING] && second >= 22 && second <= 29) {
+ if (_currentRoom == _rooms[MUS_ENTRANCE] && second >= 22 && second <= 29) {
if (!_steps && !_state._alarmCracked) {
_steps = true;
_vm->renderMessage(kStringMuseum6);
@@ -2180,5 +2185,92 @@ bool GameManager::crackDoor(int time) {
return !_state._alarmOn;
}
+void GameManager::museumDoorInteract(Action verb, Object &obj1, Object &obj2) {
+ static struct {
+ int _r1;
+ int _o1;
+ int _r2;
+ int _o2;
+ } doorTab[11] = {
+ {MUS1, 0, MUS2, 0},
+ {MUS2, 1, MUS3, 0},
+ {MUS3, 1, MUS10, 0},
+ {MUS10, 1, MUS11, 0},
+ {MUS11, 1, MUS7, 1},
+ {MUS7, 0, MUS6, 1},
+ {MUS6, 0, MUS5, 1},
+ {MUS5, 0, MUS4, 0},
+ {MUS5, 2, MUS9, 1},
+ {MUS9, 0, MUS8, 1},
+ {MUS8, 0, MUS1, 1}
+ };
+ Room *r;
+ if (verb == ACTION_OPEN && obj1._id == DOOR) {
+ for (int i = 0; i < 11; i++) {
+ if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
+ &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
+ r = _rooms[doorTab[i]._r2];
+ r->getObject(doorTab[i]._o2)->_type |= OPENED;
+ r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownTrue);
+ } else if ((_currentRoom == _rooms[doorTab[i]._r2]) &&
+ &obj1 == _currentRoom->getObject(doorTab[i]._o2)) {
+ r = _rooms[doorTab[i]._r1];
+ r->getObject(doorTab[i]._o1)->_type |= OPENED;
+ r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownTrue);
+ }
+ }
+ } else if (verb == ACTION_OPEN && obj1._id == DOOR) {
+ for (int i = 0; i < 11; i++) {
+ if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
+ &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
+ r = _rooms[doorTab[i]._r2];
+ r->getObject(doorTab[i]._o2)->_type &= ~OPENED;
+ r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownFalse);
+ } else if ((_currentRoom == _rooms[doorTab[i]._r2]) &&
+ &obj1 == _currentRoom->getObject(doorTab[i]._o2)) {
+ r = _rooms[doorTab[i]._r1];
+ r->getObject(doorTab[i]._o1)->_type &= ~OPENED;
+ r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownFalse);
+ }
+ }
+ }
+}
+
+void GameManager::securityEntrance() {
+ static struct {
+ RoomId _r;
+ int _a1;
+ int _a2;
+ } securityList[11] = {
+ {MUS1 ,11,31},
+ {MUS2 , 7,17},
+ {MUS3 , 7,17},
+ {MUS10, 1, 7},
+ {MUS11, 1, 7},
+ {MUS7 ,10,32},
+ {MUS6 , 8,18},
+ {MUS5 , 8,18},
+ {MUS9 , 2, 8},
+ {MUS8 , 2, 8},
+ {MUS1 , 0, 0}
+ };
+
+ int time = (g_system->getMillis() - _state._startTime) / 700;
+ int second = time % 100;
+
+ if (_rooms[_securityTab[second / 10]] == _currentRoom) {
+ int i;
+ for (i = 0; _currentRoom != _rooms[securityList[i]._r]; i++)
+ {}
+ if (_lastRoom == _rooms[securityList[i + 1]._r]) {
+ _vm->renderImage(securityList[i]._a1);
+ _vm->renderImage(securityList[i]._a2);
+ caught2();
+ }
+ else
+ caught();
+ }
+}
+
}
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 25b0cd91ec..e6a3199819 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -154,6 +154,7 @@ public:
int _mouseY;
int _mouseField;
Room *_currentRoom;
+ Room *_lastRoom;
bool _newRoom;
Room *_rooms[NUMROOMS];
Inventory _inventory;
@@ -251,6 +252,8 @@ public:
void alarm();
void crack(int time);
bool crackDoor(int time);
+ void museumDoorInteract(Action verb, Object &obj1, Object &obj2);
+ void securityEntrance();
private:
int _prevImgId;