diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/supernova2/ms2_def.h | 16 | ||||
-rw-r--r-- | engines/supernova2/rooms.cpp | 111 | ||||
-rw-r--r-- | engines/supernova2/rooms.h | 9 | ||||
-rw-r--r-- | engines/supernova2/state.cpp | 18 |
4 files changed, 142 insertions, 12 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index 5dae14d1b1..9884086b27 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -100,7 +100,7 @@ enum RoomId { enum ObjectId { INVALIDOBJECT = -1, NULLOBJECT = 0, - TAXI=1,WALLET,TRANSMITTER,KNIFE,POLE,BES_CABIN,MONEY, + TAXI=1,WALLET,TRANSMITTER,KNIFE,ROD,BES_CABIN,MONEY, SLOT1,CHAIR,GANG,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON, PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7, PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15, @@ -113,7 +113,7 @@ enum ObjectId { BST9,BST10,BST11,BST12,BST13,BST14,BST15,BST16, COFFIN,SUN,MONSTER,EYE,EYE1,EYE2,L_BALL,R_BALL, PRIZE,REAR_STREET, - BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXIcON,PLANT,SNAKE, + BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE, CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES, SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD, DOODLE,DOODLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD, @@ -161,15 +161,15 @@ kString155, kString156, kString157, kString158, kString159, kString160, kString161, kString162, kString163, kString164, kString165, kString166, kString167, kString168, kString169, kString170, kString171, kString172, kString173, kString174, -kString175, kString176, kString177, kStringDefaultDescription, kString179, -kString180, kString181, kStringEmpty, kStringWalletOpen, kString184, +kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal, +kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kString184, kString185, kString186, kString187, kString188, kString189, kString190, kString191, kString192, kString193, kString194, kString195, kString196, kString197, kString198, kString199, kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth, kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater, -kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kString213, kString214, -kString215, kString216, kString217, kString218, kString219, +kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole, +kStringOnlyShop, kString216, kString217, kString218, kString219, kString220, kString221, kString222, kString223, kString224, kString225, kString226, kString227, kString228, kString229, kString230, kString231, kString232, kString233, kString234, @@ -184,8 +184,8 @@ kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard, kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle, kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice, -kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kString293, kString294, -kString295, kString296, kString297, kString298, kString299, +kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription, +kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing, kString300, kString301, kString302, kString303, kString304, kString305, kString306, kString307, kString308, kString309, kString310, kString311, kString312, kString313, kString314, diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp index 8c9a0f6a66..1969d8439f 100644 --- a/engines/supernova2/rooms.cpp +++ b/engines/supernova2/rooms.cpp @@ -129,7 +129,10 @@ RoomId Room::getId() const { } void Room::setSectionVisible(uint section, bool visible) { - _shown[section] = visible ? kShownTrue : kShownFalse; + if (section < kMaxSection) + _shown[section] = visible ? kShownTrue : kShownFalse; + else + _shown[section - 128] = visible ? kShownFalse : kShownTrue; } bool Room::isSectionVisible(uint index) const { @@ -578,4 +581,110 @@ bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) { return true; } +Street::Street(Supernova2Engine *vm, GameManager *gm) { + _vm = vm; + _gm = gm; + + _fileNumber = 5; + _id = STREET; + _shown[0] = kShownTrue; + + _objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, GAMES, 10); + _objectState[1] = Object(_id, kStringStaircase, kStringStaircaseDescription, NULLOBJECT, NULLTYPE, 2, 2, 0); + _objectState[2] = Object(_id, kStringBusinessStreet, kStringBusinessStreetDescription, REAR_STREET, EXIT, 3, 3, 0, KIOSK, 3); + _objectState[3] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 7, 7, 22); + _objectState[4] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 6, 6, 0); + _objectState[5] = Object(_id, kStringPost, kStringLooksMetal, NULLOBJECT, NULLTYPE, 4, 4, 0); + _objectState[6] = Object(_id, kStringRailing, kStringLooksMetal, NULLOBJECT, NULLTYPE, 5, 5, 0); +} + +void Street::onEntrance() { + setRoomSeen(true); +} + +void Street::animation() { + static int ltab[36] = { + 8, 9 + 128, 10, 11 + 128, 6, 12, 13 + 128, 9, 14, 15 + 128, 19, + 16, 17 + 128, 9 + 128, 18, 19 + 128, 6 + 128, 20, 21 + 128, + 8 + 128, 9, 10 + 128, 11, 6, 12 + 128, 13, 14 + 128, 15, 19, + 16 + 128, 17, 18 + 128, 19 + 128, 6 + 128, 20 + 128, 21 + }; + + static int i, banks, light; + + if (isSectionVisible(7)) + setSectionVisible(7, kShownFalse); + else + setSectionVisible(7, kShownTrue); + + if (++i == 4) { + i = 0; + switch (banks) { + case 0: + setSectionVisible(1, kShownTrue); + break; + case 1: + setSectionVisible(2, kShownTrue); + break; + case 2: + setSectionVisible(3, kShownTrue); + break; + case 3: + setSectionVisible(4, kShownTrue); + break; + case 4: + setSectionVisible(5, kShownTrue); + break; + case 5: + // fall through + case 7: + // fall through + case 9: + setSectionVisible(1, kShownFalse); + setSectionVisible(2, kShownFalse); + setSectionVisible(3, kShownFalse); + setSectionVisible(4, kShownFalse); + setSectionVisible(5, kShownFalse); + break; + case 6: + // fall through + case 8: + setSectionVisible(1, kShownTrue); + setSectionVisible(2, kShownTrue); + setSectionVisible(3, kShownTrue); + setSectionVisible(4, kShownTrue); + setSectionVisible(5, kShownTrue); + break; + } + banks++; + if (banks == 10) banks = 0; + } + setSectionVisible(ltab[light], kShownTrue); + light++; + if (light == 36) + light = 0; + _gm->setAnimationTimer(2); +} + +bool Street::interact(Action verb, Object &obj1, Object &obj2) { + if (verb == ACTION_USE && Object::combine(obj1, obj2, KNIFE, ROD)) { + if (getObject(3)->_type & CARRIED) + _vm->renderMessage(kStringAlreadyHavePole); + else { + _vm->renderMessage(kStringSawPole); + _gm->takeObject(*getObject(3)); + } + } + else if (verb == ACTION_WALK && obj1._id == REAR_STREET) { + Common::String text = _vm->getGameString(kStringOnlyShop); + _vm->renderMessage(text); + _gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10); + _vm->removeMessage(); + return false; + } + else + return false; + return true; +} + } diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h index 6e326d32d3..15bdea6cb2 100644 --- a/engines/supernova2/rooms.h +++ b/engines/supernova2/rooms.h @@ -111,5 +111,14 @@ public: private: }; +class Street : public Room { +public: + Street(Supernova2Engine *vm, GameManager *gm); + virtual void onEntrance(); + virtual void animation(); + virtual bool interact(Action verb, Object &obj1, Object &obj2); + +private: +}; } #endif // SUPERNOVA2_ROOMS_H diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index a0c1ef78b1..8455ade1d9 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -51,7 +51,7 @@ bool GameManager::serialize(Common::WriteStream *out) { // Rooms out->writeByte(_currentRoom->getId()); - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < 4; ++i) { _rooms[i]->serialize(out); } @@ -82,7 +82,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) { // Rooms RoomId curRoomId = static_cast<RoomId>(in->readByte()); - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < 4; ++i) { _rooms[i]->deserialize(in, version); } changeRoom(curRoomId); @@ -222,6 +222,7 @@ void GameManager::destroyRooms() { delete _rooms[INTRO]; delete _rooms[AIRPORT]; delete _rooms[TAXISTAND]; + delete _rooms[STREET]; } void GameManager::initState() { @@ -265,6 +266,7 @@ void GameManager::initRooms() { _rooms[INTRO] = new Intro(_vm, this); _rooms[AIRPORT] = new Airport(_vm, this); _rooms[TAXISTAND] = new TaxiStand(_vm, this); + _rooms[STREET] = new Street(_vm, this); } void GameManager::initGui() { @@ -992,7 +994,17 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { _currentRoom->getObject(0)->_type = EXIT; drawMapExits(); } - } + } else if (_currentRoom == _rooms[STREET] || + _currentRoom == _rooms[CULTURE_PALACE] || + _currentRoom == _rooms[CITY1] || + _currentRoom == _rooms[CITY2]) { + Common::String t = _vm->getGameString(kStringTaxiArrives); + _vm->renderMessage(t); + waitOnInput((t.size() + 20) * _vm->_textSpeed / 10); + _vm->removeMessage(); + taxi(); + } else + _vm->renderMessage(kStringNothingHappens); } else return false; return true; |