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/state.cpp | |
| 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/state.cpp')
| -rw-r--r-- | engines/supernova2/state.cpp | 100 |
1 files changed, 96 insertions, 4 deletions
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(); + } +} + } |
