diff options
-rw-r--r-- | engines/supernova2/ms2_def.h | 10 | ||||
-rw-r--r-- | engines/supernova2/rooms.cpp | 100 | ||||
-rw-r--r-- | engines/supernova2/state.cpp | 21 | ||||
-rw-r--r-- | engines/supernova2/state.h | 8 |
4 files changed, 133 insertions, 6 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index 70f83e8749..4afbd757ba 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -147,14 +147,14 @@ kString85, kString86, kString87, kString88, kString89, kString90, kString91, kString92, kString93, kString94, kStringEntrance, kStringDoor, kString97, kString98, kString99, kString100, kString101, kString102, kStringDinosaurHead, kString104, -kString105, kStringSuctionCup, kString107, kString108, kString109, -kString110, kString111, kString112, kString113, kString114, -kString115, kString116, kString117, kString118, kString119, +kString105, kStringSuctionCup, kString107, kStringOpening, kString109, +kString110, kString111, kString112, kStringPyramid1, kStringPyramid2, +kStringPyramid3, kString116, kString117, kString118, kString119, kString120, kString121, kString122, kString123, kString124, kString125, kString126, kString127, kString128, kString129, kString130, kString131, kString132, kString133, kString134, -kString135, kString136, kStringSign, kString138, kString139, -kString140, kString141, kString142, kString143, kString144, +kString135, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description, +kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kString144, kString145, kString146, kString147, kString148, kString149, kString150, kString151, kString152, kString153, kString154, kString155, kString156, kString157, kString158, kString159, diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp index b858619058..7bbd537397 100644 --- a/engines/supernova2/rooms.cpp +++ b/engines/supernova2/rooms.cpp @@ -2164,6 +2164,37 @@ Pyramid::Pyramid(Supernova2Engine *vm, GameManager *gm) { _fileNumber = 6; _id = PYRAMID; _shown[0] = kShownTrue; + + _objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128); + _objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0); + _objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 19); + _objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0); + _objectState[4] = Object(_id, kStringSun, kStringSunDescription, SUN, NULLTYPE, 28, 28, 0); + _objectState[5] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE1, COMBINABLE, 0, 0, 0); + _objectState[6] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE2, COMBINABLE, 1, 0, 0); + _objectState[7] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE3, COMBINABLE, 2, 0, 0); + _objectState[8] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE4, COMBINABLE, 3, 0, 0); + _objectState[9] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE5, COMBINABLE, 4, 0, 0); + _objectState[10] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE6, COMBINABLE, 5, 0, 0); + _objectState[11] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE7, COMBINABLE, 6, 0, 0); + _objectState[12] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE8, COMBINABLE, 7, 0, 0); + _objectState[13] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE9, COMBINABLE, 8, 0, 0); + _objectState[14] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE10, COMBINABLE, 9, 0, 0); + _objectState[15] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE11, COMBINABLE, 10, 0, 0); + _objectState[16] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE12, COMBINABLE, 11, 0, 0); + _objectState[17] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE13, COMBINABLE, 12, 0, 0); + _objectState[18] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE14, COMBINABLE, 13, 0, 0); + _objectState[19] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE15, COMBINABLE, 14, 0, 0); + _objectState[20] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE16, COMBINABLE, 15, 0, 0); + _objectState[21] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE17, COMBINABLE, 16, 0, 0); + _objectState[22] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE18, COMBINABLE, 17, 0, 0); + _objectState[23] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE19, COMBINABLE, 18, 0, 0); + _objectState[24] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE20, COMBINABLE, 19, 0, 0); + _objectState[25] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE21, COMBINABLE, 20, 0, 0); + _objectState[26] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE22, COMBINABLE, 21, 0, 0); + _objectState[27] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE23, COMBINABLE, 22, 0, 0); + _objectState[28] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE24, COMBINABLE, 23, 0, 0); + _objectState[29] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE25, COMBINABLE, 24, 0, 0); } void Pyramid::onEntrance() { @@ -2174,6 +2205,75 @@ void Pyramid::animation() { } bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) { + Object *rope, *hole; + rope = hole = nullptr; + + if (obj1._id == ROPE) + rope = &obj1; + if (obj2._id == ROPE) + rope = &obj2; + if (obj1._id >= HOLE1 && obj1._id <= HOLE25) + hole = &obj1; + if (obj2._id >= HOLE1 && obj2._id <= HOLE25) + hole = &obj2; + + if (verb == ACTION_WALK && obj1._id == PYRA_ENTRANCE) { + _gm->_state._eventCallback = kPyramidEndFn; + _gm->_state._eventTime = g_system->getMillis() + 3600000; //hour + _gm->_state._pyraS = 4; + _gm->_state._pyraZ = 10; + _gm->_state._pyraDirection = 0; + _gm->passageConstruction(); + return false; + } else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, SIGN)) { + if (rope->_type & CARRIED) { + _vm->renderImage(1); + _gm->_inventory.remove(*rope); + _objectState[0]._click = 29; + } + else + _vm->renderMessage(kStringPyramid1); + } else if (verb == ACTION_USE && hole != nullptr && rope != nullptr) { + if (rope->_type & CARRIED) + _vm->renderMessage(kStringPyramid2); + else { + int number = hole->_id - HOLE1; + int start = number / 5 * 5 + 2; + for (int i = 1; i <= 26; i++) + _vm->renderImage(i + 128); + for (int i = start; i <= start + number % 5; i++) + _vm->renderImage(i); + _objectState[0]._click = 30; + if (number == 18) { + _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownTrue); + _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 5; + _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = EXIT; + } else { + _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse); + _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255; + _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE; + } + } + } else if (verb == ACTION_PULL && rope != nullptr && !(rope->_type & CARRIED) && + !isSectionVisible(1)) { + for (int i = 2; i <= 26; i++) + _vm->renderImage(i + 128); + _vm->renderImage(1); + _objectState[0]._click = 29; + _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse); + _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255; + _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE; + } else if (verb == ACTION_TAKE && rope != nullptr && !(rope->_type & CARRIED)) { + for (int i = 2; i <= 26; i++) + _vm->renderImage(i + 128); + _gm->takeObject(*rope); + _gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse); + _gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255; + _gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE; + } else if (verb == ACTION_WALK && obj1._type == SUN) { + _vm->renderMessage(kStringPyramid3); + } else + return false; return true; } diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index cbd3fdcd9e..d5decdeb3a 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -46,6 +46,10 @@ bool GameManager::serialize(Common::WriteStream *out) { out->writeByte(_state._elevatorE); out->writeByte(_state._elevatorNumber); out->writeByte(_state._toMuseum); + out->writeByte(_state._pyraE); + out->writeByte(_state._pyraS); + out->writeByte(_state._pyraZ); + out->writeByte(_state._pyraDirection); out->writeUint32LE(_state._eventTime); out->writeSint32LE(_state._eventCallback); @@ -84,6 +88,10 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) { _state._elevatorE = in->readByte(); _state._elevatorNumber = in->readByte(); _state._toMuseum = in->readByte(); + _state._pyraE = in->readByte(); + _state._pyraS = in->readByte(); + _state._pyraZ = in->readByte(); + _state._pyraDirection = in->readByte(); _state._eventTime = in->readUint32LE(); _state._eventCallback = (EventFunction)in->readSint32LE(); _vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money)); @@ -356,6 +364,10 @@ void GameManager::initState() { _state._elevatorE = 0; _state._elevatorNumber = 0; _state._toMuseum = false; + _state._pyraE = 0; + _state._pyraS = 4; + _state._pyraZ = 10; + _state._pyraDirection = 0; _state._eventTime = kMaxTimerValue; _state._eventCallback = kNoFn; } @@ -493,6 +505,9 @@ void GameManager::updateEvents() { case kSoberFn: sober(); break; + case kPyramidEndFn: + pyramidEnd(); + break; } _vm->_allowLoadGame = true; _vm->_allowSaveGame = true; @@ -1722,5 +1737,11 @@ bool GameManager::talkRest(int mod1, int mod2, int rest) { return true; } +void GameManager::pyramidEnd() { +} + +void GameManager::passageConstruction() { +} + } diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h index 2834851367..4ea490784e 100644 --- a/engines/supernova2/state.h +++ b/engines/supernova2/state.h @@ -33,7 +33,7 @@ namespace Supernova2 { const int32 kMaxTimerValue = 0x7FFFFFFF; -enum EventFunction { kNoFn, kSoberFn}; +enum EventFunction { kNoFn, kSoberFn, kPyramidEndFn}; struct GameState { int16 _money; @@ -49,6 +49,10 @@ struct GameState { bool _toMuseum; EventFunction _eventCallback; uint32 _eventTime; + char _pyraE; + char _pyraS; + char _pyraZ; + char _pyraDirection; }; class Inventory { @@ -215,6 +219,8 @@ public: void drawGUI(); bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id); bool talkRest(int mod1, int mod2, int rest); + void pyramidEnd(); + void passageConstruction(); private: int _prevImgId; |