diff options
author | Jaromir Wysoglad | 2019-06-12 19:08:44 +0200 |
---|---|---|
committer | Thierry Crozat | 2019-07-28 15:09:14 +0100 |
commit | d93656c10a048d3de2ee209c59533dad1f2d7759 (patch) | |
tree | fe436e3d16785d86d4c9e41f2ee516070dd56945 /engines/supernova2 | |
parent | 46fe10db87933ce8325f33b64503f713b6f7f998 (diff) | |
download | scummvm-rg350-d93656c10a048d3de2ee209c59533dad1f2d7759.tar.gz scummvm-rg350-d93656c10a048d3de2ee209c59533dad1f2d7759.tar.bz2 scummvm-rg350-d93656c10a048d3de2ee209c59533dad1f2d7759.zip |
SUPERNOVA2: Add rooms Mus2 to Mus7
The rooms aren't tested yet, because the first room after
MusEntrance is Mus11, which isn't implemented yet.
Diffstat (limited to 'engines/supernova2')
-rw-r--r-- | engines/supernova2/ms2_def.h | 2 | ||||
-rw-r--r-- | engines/supernova2/rooms.cpp | 135 | ||||
-rw-r--r-- | engines/supernova2/state.cpp | 19 | ||||
-rw-r--r-- | engines/supernova2/state.h | 3 |
4 files changed, 149 insertions, 10 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index 7143b6f2c8..1ec7360d94 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -145,7 +145,7 @@ kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseu kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5, kString85, kString86, kString87, kString88, kString89, kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription, -kStringEntrance, kStringDoor, kStringRoad, kString98, kString99, +kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription, kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104, kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter, kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2, diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp index a414aa06b3..eb8d510d99 100644 --- a/engines/supernova2/rooms.cpp +++ b/engines/supernova2/rooms.cpp @@ -3973,12 +3973,23 @@ Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 35; _id = MUS2; _shown[0] = kShownTrue; + _shown[3] = kShownTrue; + _shown[4] = kShownTrue; + _shown[5] = kShownTrue; + _shown[6] = kShownTrue; + _shown[13] = kShownTrue; + _shown[14] = kShownTrue; + _shown[22] = kShownTrue; + + _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS1, 2); + _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS3, 22); } void Mus2::onEntrance() { + _gm->pressureAlarmEntrance(); setRoomSeen(true); } @@ -3986,36 +3997,62 @@ void Mus2::animation() { } bool Mus2::interact(Action verb, Object &obj1, Object &obj2) { - return true; + _gm->museumDoorInteract(verb, obj1, obj2); + return false; } Mus3::Mus3(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 35; _id = MUS3; _shown[0] = kShownTrue; + _shown[2] = kShownTrue; + _shown[3] = kShownTrue; + _shown[4] = kShownTrue; + _shown[5] = kShownTrue; + _shown[13] = kShownTrue; + _shown[23] = kShownTrue; + _shown[28] = kShownTrue; + + _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS2, 2); + _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 5, 5, 12, MUS10, 19); } void Mus3::onEntrance() { + _gm->pressureAlarmEntrance(); setRoomSeen(true); } void Mus3::animation() { + _gm->pressureAlarmCount(); } bool Mus3::interact(Action verb, Object &obj1, Object &obj2) { - return true; + _gm->museumDoorInteract(verb, obj1, obj2); + return false; } Mus4::Mus4(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 35; _id = MUS4; _shown[0] = kShownTrue; + _shown[1] = kShownTrue; + _shown[3] = kShownTrue; + _shown[4] = kShownTrue; + _shown[5] = kShownTrue; + _shown[6] = kShownTrue; + _shown[14] = kShownTrue; + _shown[20] = kShownTrue; + _shown[21] = kShownTrue; + + _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2); + _objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0); + } void Mus4::onEntrance() { @@ -4026,19 +4063,31 @@ void Mus4::animation() { } bool Mus4::interact(Action verb, Object &obj1, Object &obj2) { - return true; + _gm->museumDoorInteract(verb, obj1, obj2); + return false; } Mus5::Mus5(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 35; _id = MUS5; _shown[0] = kShownTrue; + _shown[4] = kShownTrue; + _shown[5] = kShownTrue; + _shown[6] = kShownTrue; + _shown[14] = kShownTrue; + _shown[24] = kShownTrue; + + _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2); + _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 8, MUS6, 22); + _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 2, 2, 9, MUS9, 5); + } void Mus5::onEntrance() { + _gm->securityEntrance(); setRoomSeen(true); } @@ -4046,6 +4095,26 @@ void Mus5::animation() { } bool Mus5::interact(Action verb, Object &obj1, Object &obj2) { + _gm->museumDoorInteract(verb, obj1, obj2); + if (verb == ACTION_USE && + Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && + !(_objectState[1]._type & OPENED)) { + if (_gm->crackDoor(50)) { + _vm->renderImage(8); + _objectState[1]._type = EXIT | OPENABLE | OPENED; + _gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | OPENED; + _gm->_rooms[MUS6]->setSectionVisible(7, kShownTrue); + _vm->playSound(kAudioTaxiOpen); + } + } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && + (obj1._type & OPENED)) { + _vm->renderImage(8 + 128); + _objectState[1]._type = EXIT | OPENABLE | CLOSED; + _gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED; + _gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse); + _vm->playSound(kAudioElevator1); + } else + return false; return true; } @@ -4053,12 +4122,23 @@ Mus6::Mus6(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 35; _id = MUS6; _shown[0] = kShownTrue; + _shown[3] = kShownTrue; + _shown[4] = kShownTrue; + _shown[5] = kShownTrue; + _shown[6] = kShownTrue; + _shown[13] = kShownTrue; + _shown[19] = kShownTrue; + + _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 7, MUS5, 2); + _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS7, 22); + _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 6, 6, 0); } void Mus6::onEntrance() { + _gm->pressureAlarmEntrance(); setRoomSeen(true); } @@ -4066,6 +4146,29 @@ void Mus6::animation() { } bool Mus6::interact(Action verb, Object &obj1, Object &obj2) { + _gm->museumDoorInteract(verb, obj1, obj2); + if (verb == ACTION_USE && + Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && + !(_objectState[0]._type & OPENED)) { + if (_gm->crackDoor(50)) { + _vm->renderImage(7); + _objectState[0]._type = EXIT | OPENABLE | OPENED; + _gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | OPENED; + _gm->_rooms[MUS5]->setSectionVisible(8, kShownTrue); + _vm->playSound(kAudioTaxiOpen); + } + } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && + (obj1._type & OPENED)) { + _vm->renderImage(7 + 128); + _objectState[0]._type = EXIT | OPENABLE | CLOSED; + _gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED; + _gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse); + _vm->playSound(kAudioElevator1); + } else if (verb == ACTION_USE && + Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) + _vm->renderMessage(kStringMuseum14); + else + return false; return true; } @@ -4073,19 +4176,33 @@ Mus7::Mus7(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 35; _id = MUS7; _shown[0] = kShownTrue; + _shown[2] = kShownTrue; + _shown[3] = kShownTrue; + _shown[5] = kShownTrue; + _shown[6] = kShownTrue; + _shown[14] = kShownTrue; + _shown[16] = kShownTrue; + _shown[25] = kShownTrue; + _shown[28] = kShownTrue; + + _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS6, 2); + _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 3, 3, 10, MUS11, 15); } void Mus7::onEntrance() { + _gm->pressureAlarmEntrance(); setRoomSeen(true); } void Mus7::animation() { + _gm->pressureAlarmCount(); } bool Mus7::interact(Action verb, Object &obj1, Object &obj2) { + _gm->museumDoorInteract(verb, obj1, obj2); return true; } diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index 36dc72c7d6..7e4d0b7171 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -52,6 +52,7 @@ bool GameManager::serialize(Common::WriteStream *out) { out->writeByte(_state._alarmOn); out->writeByte(_state._alarmCracked); out->writeByte(_state._haste); + out->writeByte(_state._pressureCounter); out->writeByte(_state._sirenOn); out->writeSint16LE(_state._pyraDirection); out->writeUint32LE(_state._eventTime); @@ -103,6 +104,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) { _state._alarmOn = in->readByte(); _state._alarmCracked = in->readByte(); _state._haste = in->readByte(); + _state._pressureCounter = in->readByte(); _state._sirenOn = in->readByte(); _state._pyraDirection = in->readSint16LE(); _state._eventTime = in->readUint32LE(); @@ -394,6 +396,7 @@ void GameManager::initState() { _state._alarmOn = false; _state._alarmCracked = false; _state._haste = false; + _state._pressureCounter = 0; _state._sirenOn = false; _state._pyraDirection = 0; _state._eventTime = kMaxTimerValue; @@ -2272,5 +2275,21 @@ void GameManager::securityEntrance() { } } +void GameManager::pressureAlarmEntrance() { + _state._pressureCounter = 0; + securityEntrance(); +} + +void GameManager::pressureAlarmCount() { + if (!(_state._alarmOn || + (_currentRoom == _rooms[MUS22] && _currentRoom->isSectionVisible(6)))) { + _state._pressureCounter++; + if ((_currentRoom >= _rooms[MUS12] && _state._pressureCounter > 8) || + _state._pressureCounter > 16) + alarm(); + } + setAnimationTimer(11); +} + } diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h index e6a3199819..640a5f6b08 100644 --- a/engines/supernova2/state.h +++ b/engines/supernova2/state.h @@ -65,6 +65,7 @@ struct GameState { bool _alarmCracked; bool _alarmOn; bool _haste; + byte _pressureCounter; bool _sirenOn; byte _taxiPossibility; }; @@ -254,6 +255,8 @@ public: bool crackDoor(int time); void museumDoorInteract(Action verb, Object &obj1, Object &obj2); void securityEntrance(); + void pressureAlarmCount(); + void pressureAlarmEntrance(); private: int _prevImgId; |