diff options
author | Jaromir Wysoglad | 2019-06-12 18:08:48 +0200 |
---|---|---|
committer | Thierry Crozat | 2019-07-28 15:09:14 +0100 |
commit | 46fe10db87933ce8325f33b64503f713b6f7f998 (patch) | |
tree | 72b1457b743a88dc0626f7fc43eea039c2add271 /engines/supernova2 | |
parent | 006880ea7cfc906a8ca0f4bfb5f7fcf9955f6e39 (diff) | |
download | scummvm-rg350-46fe10db87933ce8325f33b64503f713b6f7f998.tar.gz scummvm-rg350-46fe10db87933ce8325f33b64503f713b6f7f998.tar.bz2 scummvm-rg350-46fe10db87933ce8325f33b64503f713b6f7f998.zip |
SUPERNOVA2: Add MuseumEntrance and Mus1 rooms.
Diffstat (limited to 'engines/supernova2')
-rw-r--r-- | engines/supernova2/ms2_def.h | 2 | ||||
-rw-r--r-- | engines/supernova2/rooms.cpp | 59 | ||||
-rw-r--r-- | engines/supernova2/rooms.h | 4 | ||||
-rw-r--r-- | engines/supernova2/state.cpp | 100 | ||||
-rw-r--r-- | engines/supernova2/state.h | 3 |
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; |