aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-06-10 11:10:35 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commit9c1eba6bd6a785709ceb7d980ef239ba803e0f04 (patch)
tree6f897cb295afef98db232791396e8f849dbfeb07
parent48c84280cbe6e38a3023eede383cac5a6853e131 (diff)
downloadscummvm-rg350-9c1eba6bd6a785709ceb7d980ef239ba803e0f04.tar.gz
scummvm-rg350-9c1eba6bd6a785709ceb7d980ef239ba803e0f04.tar.bz2
scummvm-rg350-9c1eba6bd6a785709ceb7d980ef239ba803e0f04.zip
SUPERNOVA2: add InHole and Floordoor rooms
-rw-r--r--engines/supernova2/ms2_def.h8
-rw-r--r--engines/supernova2/rooms.cpp83
2 files changed, 86 insertions, 5 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 3d2f801b69..f74e2848ea 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -150,16 +150,16 @@ kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
-kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kString124,
-kString125, kString126, kString127, kString128, kString129,
+kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
+kStringPyramid12, kString126, kString127, kString128, kString129,
kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
-kStringOpeningDescription1, kStringOpeningDescription2, kString162, kStringSlot, kString164,
-kString165, kString166, kString167, kString168, kStringExit,
+kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
+kStringOpeningDescription3, kStringStones, kString167, kString168, kStringExit,
kString170, kStringToothbrush, kString172, kString173, kString174,
kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f604068c40..e095ab7acf 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3397,6 +3397,10 @@ InHole::InHole(Supernova2Engine *vm, GameManager *gm) {
_fileNumber = 6;
_id = IN_HOLE;
_shown[0] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, EXIT, 0, 0, 0, HOLE_ROOM, 2);
+ _objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + 128);
+ _objectState[2] = Object(_id, kStringSlot, kStringSlotDescription3, SLOT, COMBINABLE, 1, 1, 0);
}
void InHole::onEntrance() {
@@ -3407,6 +3411,21 @@ void InHole::animation() {
}
bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
+ if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, SLOT)) {
+ if (isSectionVisible(kMaxSection - 1))
+ _vm->renderMessage(kStringPyramid11);
+ else {
+ _vm->renderImage(1);
+ _objectState[1]._click = 2;
+ setSectionVisible(kMaxSection - 1, kShownTrue);
+ }
+ } else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+ _vm->renderMessage(kStringPyramid9);
+ } else if (verb == ACTION_USE && obj1._id == ROPE) {
+ _gm->changeRoom(HOLE_ROOM);
+ _gm->_newRoom = true;
+ } else
+ return false;
return true;
}
@@ -3414,10 +3433,17 @@ Floordoor::Floordoor(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 14;
_id = FLOORDOOR;
_shown[0] = kShownTrue;
_shown[14] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+ _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+ _objectState[2] = Object(_id, kStringKnife1, kStringDefaultDescription, TKNIFE, TAKE | COMBINABLE, 255, 255, 9);
+ _objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11+128);
+ _objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription3, HOLE, EXIT, 4, 4, 0, FLOORDOOR_U, 12);
+ _objectState[5] = Object(_id, kStringStones, kStringDefaultDescription, STONES, COMBINABLE, 5, 5, 0);
}
void Floordoor::onEntrance() {
@@ -3428,6 +3454,61 @@ void Floordoor::animation() {
}
bool Floordoor::interact(Action verb, Object &obj1, Object &obj2) {
+ if (_gm->move(verb, obj1)) {
+ _gm->passageConstruction();
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_WALK && obj1._id == HOLE) {
+ if (isSectionVisible(11)) {
+ _gm->_state._pyraZ = 4;
+ _gm->_state._pyraDirection = 2;
+ _gm->_state._pyraE = 0;
+ return false;
+ } else
+ _vm->renderMessage(kStringPyramid12);
+ } else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(11)) {
+ _gm->_state._pyraZ = 4;
+ _gm->_state._pyraDirection = 2;
+ _gm->_state._pyraE = 0 ;
+ _gm->changeRoom(FLOORDOOR_U);
+ _gm->_newRoom = true;
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, STONES)) {
+ _vm->renderImage(10);
+ if (obj1._id == TKNIFE)
+ _gm->_inventory.remove(obj1);
+ else
+ _gm->_inventory.remove(obj2);
+ _objectState[2]._click = 6;
+ } else if (verb == ACTION_USE &&
+ (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) ||
+ Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+ _vm->renderMessage(kStringPyramid8);
+ } else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, TKNIFE) &&
+ isSectionVisible(10)) {
+ _vm->renderImage(11);
+ setSectionVisible(10, kShownFalse);
+ if (obj1._id == ROPE)
+ _gm->_inventory.remove(obj1);
+ else
+ _gm->_inventory.remove(obj2);
+ _objectState[2]._click = 255;
+ _objectState[3]._click = 7;
+ _objectState[3]._type &= ~COMBINABLE;
+ } else if (verb == ACTION_USE &&
+ (Object::combine(obj1, obj2, ROPE, G_RIGHT) ||
+ Object::combine(obj1, obj2, ROPE, G_LEFT) ||
+ Object::combine(obj1, obj2, ROPE, STONES))) {
+ _vm->renderMessage(kStringPyramid7);
+ } else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+ _gm->takeObject(obj1);
+ obj1._type |= COMBINABLE;
+ _vm->renderImage(9);
+ _vm->renderImage(10);
+ _objectState[2]._click = 6;
+ } else if (verb == ACTION_TAKE && obj1._id == TKNIFE && !(obj1._type & CARRIED)) {
+ _gm->takeObject(obj1);
+ setSectionVisible(10, kShownFalse);
+ } else
+ return false;
return true;
}