aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-06-12 19:08:44 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commitd93656c10a048d3de2ee209c59533dad1f2d7759 (patch)
treefe436e3d16785d86d4c9e41f2ee516070dd56945
parent46fe10db87933ce8325f33b64503f713b6f7f998 (diff)
downloadscummvm-rg350-d93656c10a048d3de2ee209c59533dad1f2d7759.tar.gz
scummvm-rg350-d93656c10a048d3de2ee209c59533dad1f2d7759.tar.bz2
scummvm-rg350-d93656c10a048d3de2ee209c59533dad1f2d7759.zip
SUPERNOVA2: Add rooms Mus2 to Mus7
The rooms aren't tested yet, because the first room after MusEntrance is Mus11, which isn't implemented yet.
-rw-r--r--engines/supernova2/ms2_def.h2
-rw-r--r--engines/supernova2/rooms.cpp135
-rw-r--r--engines/supernova2/state.cpp19
-rw-r--r--engines/supernova2/state.h3
4 files changed, 149 insertions, 10 deletions
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 7143b6f2c8..1ec7360d94 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -145,7 +145,7 @@ kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseu
kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
kString85, kString86, kString87, kString88, kString89,
kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription,
-kStringEntrance, kStringDoor, kStringRoad, kString98, kString99,
+kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a414aa06b3..eb8d510d99 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3973,12 +3973,23 @@ Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 35;
_id = MUS2;
_shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[22] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS1, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS3, 22);
}
void Mus2::onEntrance() {
+ _gm->pressureAlarmEntrance();
setRoomSeen(true);
}
@@ -3986,36 +3997,62 @@ void Mus2::animation() {
}
bool Mus2::interact(Action verb, Object &obj1, Object &obj2) {
- return true;
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
}
Mus3::Mus3(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 35;
_id = MUS3;
_shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[23] = kShownTrue;
+ _shown[28] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS2, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 5, 5, 12, MUS10, 19);
}
void Mus3::onEntrance() {
+ _gm->pressureAlarmEntrance();
setRoomSeen(true);
}
void Mus3::animation() {
+ _gm->pressureAlarmCount();
}
bool Mus3::interact(Action verb, Object &obj1, Object &obj2) {
- return true;
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
}
Mus4::Mus4(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 35;
_id = MUS4;
_shown[0] = kShownTrue;
+ _shown[1] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[20] = kShownTrue;
+ _shown[21] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+ _objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+
}
void Mus4::onEntrance() {
@@ -4026,19 +4063,31 @@ void Mus4::animation() {
}
bool Mus4::interact(Action verb, Object &obj1, Object &obj2) {
- return true;
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ return false;
}
Mus5::Mus5(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 35;
_id = MUS5;
_shown[0] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[24] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 8, MUS6, 22);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 2, 2, 9, MUS9, 5);
+
}
void Mus5::onEntrance() {
+ _gm->securityEntrance();
setRoomSeen(true);
}
@@ -4046,6 +4095,26 @@ void Mus5::animation() {
}
bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[1]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(8);
+ _objectState[1]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS6]->setSectionVisible(7, kShownTrue);
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(8 + 128);
+ _objectState[1]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else
+ return false;
return true;
}
@@ -4053,12 +4122,23 @@ Mus6::Mus6(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 35;
_id = MUS6;
_shown[0] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[4] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[13] = kShownTrue;
+ _shown[19] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 7, MUS5, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS7, 22);
+ _objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 6, 6, 0);
}
void Mus6::onEntrance() {
+ _gm->pressureAlarmEntrance();
setRoomSeen(true);
}
@@ -4066,6 +4146,29 @@ void Mus6::animation() {
}
bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
+ if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+ !(_objectState[0]._type & OPENED)) {
+ if (_gm->crackDoor(50)) {
+ _vm->renderImage(7);
+ _objectState[0]._type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+ _gm->_rooms[MUS5]->setSectionVisible(8, kShownTrue);
+ _vm->playSound(kAudioTaxiOpen);
+ }
+ } else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+ (obj1._type & OPENED)) {
+ _vm->renderImage(7 + 128);
+ _objectState[0]._type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+ _gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse);
+ _vm->playSound(kAudioElevator1);
+ } else if (verb == ACTION_USE &&
+ Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR))
+ _vm->renderMessage(kStringMuseum14);
+ else
+ return false;
return true;
}
@@ -4073,19 +4176,33 @@ Mus7::Mus7(Supernova2Engine *vm, GameManager *gm) {
_vm = vm;
_gm = gm;
- _fileNumber = 6;
+ _fileNumber = 35;
_id = MUS7;
_shown[0] = kShownTrue;
+ _shown[2] = kShownTrue;
+ _shown[3] = kShownTrue;
+ _shown[5] = kShownTrue;
+ _shown[6] = kShownTrue;
+ _shown[14] = kShownTrue;
+ _shown[16] = kShownTrue;
+ _shown[25] = kShownTrue;
+ _shown[28] = kShownTrue;
+
+ _objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS6, 2);
+ _objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 3, 3, 10, MUS11, 15);
}
void Mus7::onEntrance() {
+ _gm->pressureAlarmEntrance();
setRoomSeen(true);
}
void Mus7::animation() {
+ _gm->pressureAlarmCount();
}
bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
+ _gm->museumDoorInteract(verb, obj1, obj2);
return true;
}
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 36dc72c7d6..7e4d0b7171 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -52,6 +52,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
out->writeByte(_state._alarmOn);
out->writeByte(_state._alarmCracked);
out->writeByte(_state._haste);
+ out->writeByte(_state._pressureCounter);
out->writeByte(_state._sirenOn);
out->writeSint16LE(_state._pyraDirection);
out->writeUint32LE(_state._eventTime);
@@ -103,6 +104,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
_state._alarmOn = in->readByte();
_state._alarmCracked = in->readByte();
_state._haste = in->readByte();
+ _state._pressureCounter = in->readByte();
_state._sirenOn = in->readByte();
_state._pyraDirection = in->readSint16LE();
_state._eventTime = in->readUint32LE();
@@ -394,6 +396,7 @@ void GameManager::initState() {
_state._alarmOn = false;
_state._alarmCracked = false;
_state._haste = false;
+ _state._pressureCounter = 0;
_state._sirenOn = false;
_state._pyraDirection = 0;
_state._eventTime = kMaxTimerValue;
@@ -2272,5 +2275,21 @@ void GameManager::securityEntrance() {
}
}
+void GameManager::pressureAlarmEntrance() {
+ _state._pressureCounter = 0;
+ securityEntrance();
+}
+
+void GameManager::pressureAlarmCount() {
+ if (!(_state._alarmOn ||
+ (_currentRoom == _rooms[MUS22] && _currentRoom->isSectionVisible(6)))) {
+ _state._pressureCounter++;
+ if ((_currentRoom >= _rooms[MUS12] && _state._pressureCounter > 8) ||
+ _state._pressureCounter > 16)
+ alarm();
+ }
+ setAnimationTimer(11);
+}
+
}
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index e6a3199819..640a5f6b08 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -65,6 +65,7 @@ struct GameState {
bool _alarmCracked;
bool _alarmOn;
bool _haste;
+ byte _pressureCounter;
bool _sirenOn;
byte _taxiPossibility;
};
@@ -254,6 +255,8 @@ public:
bool crackDoor(int time);
void museumDoorInteract(Action verb, Object &obj1, Object &obj2);
void securityEntrance();
+ void pressureAlarmCount();
+ void pressureAlarmEntrance();
private:
int _prevImgId;