diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/supernova/rooms.cpp | 18 | ||||
-rw-r--r-- | engines/supernova/rooms.h | 59 | ||||
-rw-r--r-- | engines/supernova/state.cpp | 52 | ||||
-rw-r--r-- | engines/supernova/state.h | 3 | ||||
-rw-r--r-- | engines/supernova/supernova.cpp | 4 |
5 files changed, 95 insertions, 41 deletions
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp index 2e2dd5a377..cfccd11b58 100644 --- a/engines/supernova/rooms.cpp +++ b/engines/supernova/rooms.cpp @@ -27,12 +27,11 @@ namespace Supernova { -void StartingItems::onEntrance() { - for (int i = 0; i < 3; ++i) - _gm->_inventory.add(*getObject(i)); +void Intro::onEntrance() { +} + +bool Intro::interact(Action verb, Object &obj1, Object &obj2) { - setRoomSeen(true); - _gm->changeRoom(CABIN_R3); } bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) { @@ -566,6 +565,13 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) { return true; } +void ShipCabinR3::onEntrance() { + for (int i = 0; i < 3; ++i) + _gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i)); + + setRoomSeen(true); +} + bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) { Room *r; @@ -2367,7 +2373,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) { } } else if ((verb == ACTION_LOOK) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) { - _gm->_state._nameSeen |= 1 << (obj1._id - DOOR1); + _nameSeen |= 1 << (obj1._id - DOOR1); return false; } else if ((verb == ACTION_WALK) && ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) { diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h index 650fac9367..ae92f84c9d 100644 --- a/engines/supernova/rooms.h +++ b/engines/supernova/rooms.h @@ -50,6 +50,9 @@ public: int getFileNumber() const { return _fileNumber; } + RoomID getId() const { + return _id; + } void setSectionVisible(uint section, bool visible) { _shown[section] = visible; @@ -72,6 +75,7 @@ protected: int _fileNumber; bool _shown[kMaxSection]; Object _objectState[kMaxObject]; + RoomID _id; SupernovaEngine *_vm; GameManager *_gm; @@ -80,14 +84,14 @@ private: }; // Room 0 -class StartingItems : public Room { +class Intro : public Room { public: - StartingItems(SupernovaEngine *vm, GameManager *gm) { + Intro(SupernovaEngine *vm, GameManager *gm) { _vm = vm; _gm = gm; _fileNumber = -1; - + _id = INTRO; _shown[0] = false; _objectState[0] = @@ -105,6 +109,7 @@ public: } virtual void onEntrance(); + virtual bool interact(Action verb, Object &obj1, Object &obj2); }; // Spaceship @@ -115,6 +120,7 @@ public: _gm = gm; _fileNumber = 17; + _id = CORRIDOR; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -143,6 +149,7 @@ public: _gm = gm; _fileNumber = 15; + _id = HALL; _shown[0] = true; _objectState[0] = Object("Luke", "Sie f\204hrt ins Cockpit.", NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10); @@ -163,6 +170,7 @@ public: _gm = gm; _fileNumber = 33; + _id = SLEEP; _shown[0] = true; _objectState[0] = Object("Luke", "Dies ist eine der Tiefschlafkammern.", CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0); @@ -191,6 +199,7 @@ public: _gm = gm; _fileNumber = 9; + _id = COCKPIT; _shown[0] = true; _objectState[0] = Object("Instrumente", "Hmm, sieht ziemlich kompliziert aus.", INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0); @@ -214,6 +223,7 @@ public: _gm = gm; _fileNumber = 21; + _id = CABIN_L1; _shown[0] = true; _shown[1] = true; _shown[2] = true; @@ -243,6 +253,7 @@ public: _gm = gm; _fileNumber = 21; + _id = CABIN_L2; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -298,6 +309,7 @@ public: _gm = gm; _fileNumber = 21; + _id = CABIN_L3; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -341,6 +353,7 @@ public: _gm = gm; _fileNumber = 22; + _id = CABIN_R1; _shown[0] = true; _shown[1] = true; _shown[2] = true; @@ -364,6 +377,7 @@ public: _gm = gm; _fileNumber = 22; + _id = CABIN_R2; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -390,6 +404,7 @@ public: _gm = gm; _fileNumber = 22; + _id = CABIN_R3; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -434,6 +449,7 @@ public: } virtual bool interact(Action verb, Object &obj1, Object &obj2); + virtual void onEntrance(); }; class ShipCabinBathroom : public Room { @@ -443,6 +459,7 @@ public: _gm = gm; _fileNumber = 23; + _id = BATHROOM; _shown[0] = true; _objectState[0] = Object("Klo","Ein Klo mit Saugmechanismus.",TOILET,NULLTYPE,0,0,0); @@ -458,6 +475,7 @@ public: _gm = gm; _fileNumber = 34; + _id = AIRLOCK; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -486,6 +504,7 @@ public: _gm = gm; _fileNumber = 24; + _id = HOLD; _shown[0] = true; _objectState[0] = Object("",Object::defaultDescription,HOLD_WIRE,COMBINABLE,255,255,0); @@ -518,6 +537,7 @@ public: _gm = gm; _fileNumber = 25; + _id = LANDINGMODULE; _shown[0] = true; _objectState[0] = Object("Steckdose",Object::defaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0); @@ -538,6 +558,7 @@ public: _gm = gm; _fileNumber = 18; + _id = GENERATOR; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -570,6 +591,7 @@ public: _gm = gm; _fileNumber = 4; + _id = OUTSIDE; _shown[0] = true; _objectState[0] = Object("Luke",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3); @@ -603,6 +625,7 @@ public: _gm = gm; _fileNumber = 12; + _id = CAVE; _shown[0] = false; _objectState[0] = Object("Ausgang","Hier bist du gerade hergekommen.",NULLOBJECT,EXIT,255,255,0,ROCKS,22); @@ -616,6 +639,7 @@ public: _gm = gm; _fileNumber = 37; + _id = MEETUP; _shown[0] = true; _objectState[0] = Object("H\224hle",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22); @@ -641,6 +665,7 @@ public: _gm = gm; _fileNumber = 10; + _id = ENTRANCE; _shown[0] = true; _objectState[0] = Object("Portier","Du siehst doch selbst, wie er aussieht.",PORTER,TALK,0,0,0); @@ -696,6 +721,7 @@ public: _gm = gm; _fileNumber = 28; + _id = REST; _shown[0] = true; _objectState[0] = Object("Treppe",Object::defaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17); @@ -718,6 +744,7 @@ public: _gm = gm; _fileNumber = 29; + _id = ROGER; _shown[0] = true; _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19); @@ -754,6 +781,7 @@ public: _gm = gm; _fileNumber = 19; + _id = GLIDER; _shown[0] = true; _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15); @@ -782,6 +810,7 @@ public: _gm = gm; _fileNumber = 38; + _id = MEETUP2; _shown[0] = true; _objectState[0] = Object("Roger W.",Object::defaultDescription,ROGER_W,TALK,255,255,0); @@ -819,6 +848,7 @@ public: _gm = gm; _fileNumber = 39; + _id = MEETUP3; _shown[0] = true; _objectState[0] = Object("Ufo","Der Eingang scheint offen zu sein.",UFO,EXIT,0,0,0,NULLROOM,3); @@ -848,6 +878,7 @@ public: _gm = gm; _fileNumber = 43; + _id = CELL; _shown[0] = true; _shown[1] = true; _shown[2] = false; @@ -904,6 +935,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR1; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -944,6 +976,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR2; _shown[0] = true; _shown[1] = false; _shown[2] = true; @@ -984,7 +1017,7 @@ public: _gm = gm; _fileNumber = 16; - + _id = CORRIDOR3; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -1022,6 +1055,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR4; _shown[0] = true; _shown[1] = true; _shown[2] = true; @@ -1069,6 +1103,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR5; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -1123,6 +1158,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR6; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -1165,6 +1201,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR7; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -1205,6 +1242,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR8; _shown[0] = true; _shown[1] = true; _shown[2] = false; @@ -1249,6 +1287,7 @@ public: _gm = gm; _fileNumber = 16; + _id = CORRIDOR9; _shown[0] = true; _shown[1] = true; _shown[2] = false; @@ -1293,6 +1332,7 @@ public: _gm = gm; _fileNumber = 6; + _id = BCORRIDOR; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -1315,6 +1355,7 @@ public: private: Common::String _dontEnter; + byte _nameSeen; }; class AxacussIntersection : public Room { public: @@ -1323,6 +1364,7 @@ public: _gm = gm; _fileNumber = 40; + _id = GUARD; _shown[0] = true; _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR4,21); @@ -1343,6 +1385,7 @@ public: _gm = gm; _fileNumber = 42; + _id = GUARD3; _shown[0] = true; _objectState[0] = Object("Ausgang",Object::defaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22); @@ -1364,6 +1407,7 @@ public: _gm = gm; _fileNumber = 7; + _id = OFFICE_L1; _shown[0] = true; _shown[1] = false; _shown[2] = true; @@ -1398,6 +1442,7 @@ public: _gm = gm; _fileNumber = 7; + _id = OFFICE_L2; _shown[0] = true; _shown[1] = true; _shown[2] = false; @@ -1432,6 +1477,7 @@ public: _gm = gm; _fileNumber = 8; + _id = OFFICE_R1; _shown[0] = true; _shown[1] = true; _shown[2] = false; @@ -1454,6 +1500,7 @@ public: _gm = gm; _fileNumber = 8; + _id = OFFICE_R2; _shown[0] = true; _shown[1] = false; _shown[2] = true; @@ -1474,6 +1521,7 @@ public: _gm = gm; _fileNumber = 7; + _id = OFFICE_L; _shown[0] = true; _shown[1] = false; _shown[2] = false; @@ -1509,6 +1557,7 @@ public: _gm = gm; _fileNumber = 3; + _id = ELEVATOR; _shown[0] = true; _objectState[0] = Object("Knopf",Object::defaultDescription,BUTTON1,PRESS,0,0,0); @@ -1526,6 +1575,7 @@ public: _gm = gm; _fileNumber = 5; + _id = STATION; _shown[0] = true; _objectState[0] = Object("Schild",Object::defaultDescription,STATION_SIGN,NULLTYPE,0,0,0); _objectState[1] = Object("T\201r",Object::defaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7); @@ -1540,6 +1590,7 @@ public: _gm = gm; _fileNumber = 32; + _id = SIGN; _shown[0] = true; _shown[1] = true; diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp index 84f040d98a..5b5af20e12 100644 --- a/engines/supernova/state.cpp +++ b/engines/supernova/state.cpp @@ -236,7 +236,6 @@ void GameManager::initState() { _state._money = 0; _state._coins = 0; _state._shoes = 0; - _state._nameSeen = 0; _state._destination = 255; _state._benOverlay = 0; _state._language = 0; @@ -246,14 +245,11 @@ void GameManager::initState() { _state._terminalStripWire = false; _state._cableConnected = false; _state._powerOff = false; - _state._cockpitSeen = false; - _state._airlockSeen = false; - _state._holdSeen = false; _state._dream = false; } void GameManager::initRooms() { - _rooms[INTRO] = new StartingItems(_vm, this); + _rooms[INTRO] = new Intro(_vm, this); _rooms[CORRIDOR] = new ShipCorridor(_vm, this); _rooms[HALL] = new ShipHall(_vm, this); _rooms[SLEEP] = new ShipSleepCabin(_vm, this); @@ -534,7 +530,7 @@ void GameManager::telomat(int number) { } void GameManager::startSearch() { - if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR])) + if ((_currentRoom->getId() >= CORRIDOR1) && (_currentRoom->getId() <= BCORRIDOR)) busted(0); _state._corridorSearch = true; @@ -553,8 +549,8 @@ void GameManager::busted(int i) { if (i > 0) drawImage(i); if (i == 0) { - if ((_currentRoom >= _rooms[OFFICE_L1]) && (_currentRoom <= _rooms[OFFICE_R2])) { - if (_currentRoom < _rooms[OFFICE_R1]) + if ((_currentRoom->getId() >= OFFICE_L1) && (_currentRoom->getId() <= OFFICE_R2)) { + if (_currentRoom->getId() < OFFICE_R1) i = 10; else i = 5; @@ -569,13 +565,13 @@ void GameManager::busted(int i) { _vm->playSound(kAudioVoiceHalt); drawImage(i); wait2(5); - if (_currentRoom == _rooms[OFFICE_L2]) + if (_currentRoom->getId() == OFFICE_L2) i = 13; drawImage(i + 1); wait2(3); drawImage(i + 2); shot(0, 0); - } else if (_currentRoom == _rooms[BCORRIDOR]) { + } else if (_currentRoom->getId() == BCORRIDOR) { drawImage(21); } else { if (_currentRoom->isSectionVisible(4)) @@ -594,9 +590,9 @@ void GameManager::busted(int i) { } void GameManager::guardReturned() { - if (_currentRoom == _rooms[GUARD]) + if (_currentRoom->getId() == GUARD) busted(-1); - else if ((_currentRoom == _rooms[CORRIDOR9]) && (_currentRoom->isSectionVisible(27))) + else if ((_currentRoom->getId() == CORRIDOR9) && (_currentRoom->isSectionVisible(27))) busted(0); _rooms[GUARD]->setSectionVisible(1, false); @@ -611,7 +607,7 @@ void GameManager::guardReturned() { } void GameManager::taxi() { - if (_currentRoom == _rooms[SIGN]) { + if (_currentRoom->getId() == SIGN) { changeRoom(STATION); } @@ -658,12 +654,16 @@ void GameManager::great(uint number) { } bool GameManager::airless() { - return ( - ((_currentRoom > _rooms[AIRLOCK]) && (_currentRoom < _rooms[CABIN_R1])) || - ((_currentRoom > _rooms[BATHROOM])&& (_currentRoom < _rooms[ENTRANCE])) || - ((_currentRoom == _rooms[AIRLOCK]) && (_currentRoom->getObject(1)->hasProperty(OPENED))) || - (_currentRoom >= _rooms[MEETUP2]) - ); + return (_currentRoom->getId() == HOLD || + _currentRoom->getId() == LANDINGMODULE || + _currentRoom->getId() == GENERATOR || + _currentRoom->getId() == OUTSIDE || + _currentRoom->getId() == ROCKS || + _currentRoom->getId() == CAVE || + _currentRoom->getId() == MEETUP || + _currentRoom->getId() == MEETUP2 || + _currentRoom->getId() == MEETUP3 || + (_currentRoom->getId() == AIRLOCK && _rooms[AIRLOCK]->getObject(1)->hasProperty(OPENED))); } void GameManager::shipStart() { @@ -813,12 +813,12 @@ void GameManager::mouseWait(int delay) { } void GameManager::roomBrightness() { - if ((_currentRoom != _rooms[OUTSIDE]) && (_currentRoom < _rooms[ROCKS]) ) { + if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) ) { if (_state._powerOff) _vm->_brightness = 153; - } else if ((_currentRoom == _rooms[CAVE])) { + } else if ((_currentRoom->getId() == CAVE)) { _vm->_brightness = 0; - } else if ((_currentRoom == _rooms[GUARD3])) { + } else if ((_currentRoom->getId() == GUARD3)) { if (_state._powerOff) _vm->_brightness = 0; } @@ -1083,7 +1083,7 @@ void GameManager::death(const char *message) { initState(); initGui(); _inventory.clear(); - changeRoom(INTRO); + changeRoom(CABIN_R3); g_system->fillScreen(kColorBlack); _vm->paletteFadeIn(); @@ -1293,7 +1293,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { } } else if ((verb == ACTION_USE) && (obj1._id == SUIT)) { takeObject(obj1); - if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) { + if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) { if (obj1.hasProperty(WORN)) { _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus."); _rooms[AIRLOCK]->getObject(4)->disableProperty(WORN); @@ -1319,7 +1319,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { } } else if ((verb == ACTION_USE) && (obj1._id == HELMET)) { takeObject(obj1); - if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) { + if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) { if (obj1.hasProperty(WORN)) { _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus."); _rooms[AIRLOCK]->getObject(4)->disableProperty(WORN); @@ -1347,7 +1347,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { } } else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) { takeObject(obj1); - if ((_currentRoom >= _rooms[ENTRANCE]) && (_currentRoom <= _rooms[ROGER])) { + if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) { if (obj1.hasProperty(WORN)) { _vm->renderMessage("Die Luft hier ist atembar,|du ziehst den Anzug aus."); _rooms[AIRLOCK]->getObject(4)->disableProperty(WORN); diff --git a/engines/supernova/state.h b/engines/supernova/state.h index affd9b69f5..079e12641f 100644 --- a/engines/supernova/state.h +++ b/engines/supernova/state.h @@ -53,9 +53,6 @@ struct GameState { bool _terminalStripWire; bool _cableConnected; bool _powerOff; - bool _cockpitSeen; - bool _airlockSeen; - bool _holdSeen; bool _dream; }; diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp index 941bfc8c40..ed40af99e3 100644 --- a/engines/supernova/supernova.cpp +++ b/engines/supernova/supernova.cpp @@ -185,11 +185,11 @@ void SupernovaEngine::updateEvents() { case Common::EVENT_LBUTTONUP: // fallthrough case Common::EVENT_RBUTTONUP: - // fallthrough if (_mixer->isSoundHandleActive(_soundHandle) && - (_gm->_currentRoom != _gm->_rooms[INTRO])) + (_gm->_currentRoom->getId() == INTRO)) return; _gm->_mouseClicked = true; + // fallthrough case Common::EVENT_MOUSEMOVE: _gm->_mouseClickType = _event.type; _gm->_mouseX = _event.mouse.x; |