aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-05-31 15:20:52 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commit1985c5bf578faa4d8b3e67ad03a5af35d58e1e86 (patch)
tree2dd3756ef496c04f38c6df50c7714ff121e8e07e /engines
parentc331b69bbd8b8ec8c99b04f9ed04ab11b1829a53 (diff)
downloadscummvm-rg350-1985c5bf578faa4d8b3e67ad03a5af35d58e1e86.tar.gz
scummvm-rg350-1985c5bf578faa4d8b3e67ad03a5af35d58e1e86.tar.bz2
scummvm-rg350-1985c5bf578faa4d8b3e67ad03a5af35d58e1e86.zip
SUPERNOVA2: Add downtown street
Diffstat (limited to 'engines')
-rw-r--r--engines/supernova2/ms2_def.h16
-rw-r--r--engines/supernova2/rooms.cpp111
-rw-r--r--engines/supernova2/rooms.h9
-rw-r--r--engines/supernova2/state.cpp18
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;