From fe48f0b6991bca7f40f8d072649099160d905aef Mon Sep 17 00:00:00 2001 From: Jaromir Wysoglad Date: Mon, 10 Jun 2019 11:45:48 +0200 Subject: SUPERNOVA2: Add BstDoor room --- engines/supernova2/ms2_def.h | 2 +- engines/supernova2/rooms.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index 280770bdd8..a16b50ef68 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -147,7 +147,7 @@ kString85, kString86, kString87, kString88, kString89, kString90, kString91, kString92, kString93, kString94, kStringEntrance, kStringDoor, kString97, kString98, kString99, kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104, -kString105, kStringSuctionCup, kString107, kStringOpening, kString109, +kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter, kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2, kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6, kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11, diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp index c991474ee5..0d1a93dec7 100644 --- a/engines/supernova2/rooms.cpp +++ b/engines/supernova2/rooms.cpp @@ -3563,9 +3563,29 @@ BstDoor::BstDoor(Supernova2Engine *vm, GameManager *gm) { _vm = vm; _gm = gm; - _fileNumber = 6; + _fileNumber = 15; _id = BST_DOOR; _shown[0] = kShownTrue; + + _objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 18, 18, 0, PYR_ENTRANCE, 14); + _objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 17, 17, 0, PYR_ENTRANCE, 10); + _objectState[2] = Object(_id, kStringLetter, kStringDefaultDescription, BST1, PRESS, 0, 0, 0); + _objectState[3] = Object(_id, kStringLetter, kStringDefaultDescription, BST2, PRESS, 1, 0, 0); + _objectState[4] = Object(_id, kStringLetter, kStringDefaultDescription, BST3, PRESS, 2, 0, 0); + _objectState[5] = Object(_id, kStringLetter, kStringDefaultDescription, BST4, PRESS, 3, 0, 0); + _objectState[6] = Object(_id, kStringLetter, kStringDefaultDescription, BST5, PRESS, 4, 0, 0); + _objectState[7] = Object(_id, kStringLetter, kStringDefaultDescription, BST6, PRESS, 5, 0, 0); + _objectState[8] = Object(_id, kStringLetter, kStringDefaultDescription, BST7, PRESS, 6, 0, 0); + _objectState[9] = Object(_id, kStringLetter, kStringDefaultDescription, BST8, PRESS, 7, 0, 0); + _objectState[10] = Object(_id, kStringLetter, kStringDefaultDescription, BST9, PRESS, 8, 0, 0); + _objectState[11] = Object(_id, kStringLetter, kStringDefaultDescription, BST10, PRESS, 9, 0, 0); + _objectState[12] = Object(_id, kStringLetter, kStringDefaultDescription, BST11, PRESS, 10, 0, 0); + _objectState[13] = Object(_id, kStringLetter, kStringDefaultDescription, BST12, PRESS, 11, 0, 0); + _objectState[14] = Object(_id, kStringLetter, kStringDefaultDescription, BST13, PRESS, 12, 0, 0); + _objectState[15] = Object(_id, kStringLetter, kStringDefaultDescription, BST14, PRESS, 13, 0, 0); + _objectState[16] = Object(_id, kStringLetter, kStringDefaultDescription, BST15, PRESS, 14, 0, 0); + _objectState[17] = Object(_id, kStringLetter, kStringDefaultDescription, BST16, PRESS, 15, 0, 0); + _objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL, 2); } void BstDoor::onEntrance() { @@ -3576,6 +3596,37 @@ void BstDoor::animation() { } bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) { + static char password[16] = {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0}; + if (_gm->move(verb, obj1)) { + _gm->passageConstruction(); + _gm->_newRoom = true; + } else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) { + int number = obj1._id - (BST1 - 1); + if (isSectionVisible(number)) + _vm->renderImage(number + 128); + else + _vm->renderImage(number); + _vm->playSound(kAudioTaxiOpen); + for (number = 1; number <= 16; number++) { + if (isSectionVisible(number) != password[number - 1]) + return true; + } + _gm->wait(2); + _vm->renderImage(17); + for (number = 1; number <= 16; number++) { + setSectionVisible(number, kShownFalse); + _objectState[number + 1]._click = 255; + } + _gm->wait(2); + _vm->renderImage(18); + _gm->wait(2); + _vm->renderImage(19); + _objectState[18]._type = EXIT; + _objectState[18]._description = kStringDefaultDescription; + _vm->playSound(kAudioShip3); + _gm->screenShake(); + } else + return false; return true; } -- cgit v1.2.3