diff options
| -rw-r--r-- | engines/supernova2/ms2_def.h | 2 | ||||
| -rw-r--r-- | engines/supernova2/rooms.cpp | 59 | ||||
| -rw-r--r-- | engines/supernova2/rooms.h | 4 | ||||
| -rw-r--r-- | engines/supernova2/state.cpp | 100 | ||||
| -rw-r--r-- | engines/supernova2/state.h | 3 | 
5 files changed, 149 insertions, 19 deletions
| diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h index 7ab8d9d260..7143b6f2c8 100644 --- a/engines/supernova2/ms2_def.h +++ b/engines/supernova2/ms2_def.h @@ -91,7 +91,7 @@ enum RoomId {  	LCORRIDOR1,LCORRIDOR2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,  	BST_DOOR,HALL,COFFIN_ROOM,MASK, -	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8, +	MUSEUM,MUS_ENTRANCE,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,  	MUS9,MUS10,MUS11,MUS_RUND,  	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,  	NUMROOMS,NULLROOM diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp index de92a9246a..a414aa06b3 100644 --- a/engines/supernova2/rooms.cpp +++ b/engines/supernova2/rooms.cpp @@ -3789,7 +3789,7 @@ Museum::Museum(Supernova2Engine *vm, GameManager *gm) {  	_objectState[0] = Object(_id, kStringDinosaur, kStringDinosaurDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);  	_objectState[1] = Object(_id, kStringEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 1, 1, 0, NULLROOM, 0); -	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_EING, 9); +	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_ENTRANCE, 9);  	_objectState[3] = Object(_id, kStringRoad, kStringDefaultDescription, MUS_STREET, EXIT, 3, 3, 0);  } @@ -3833,8 +3833,6 @@ void Museum::onEntrance() {  }  void Museum::animation() { -	_gm->drawClock(); -	_gm->setAnimationTimer(11);  }  bool Museum::interact(Action verb, Object &obj1, Object &obj2) { @@ -3894,36 +3892,72 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {  	return true;  } -MusEing::MusEing(Supernova2Engine *vm, GameManager *gm) { +MusEntrance::MusEntrance(Supernova2Engine *vm, GameManager *gm) {  	_vm = vm;  	_gm = gm; -	_fileNumber = 6; -	_id = MUS_EING; +	_fileNumber = 32; +	_id = MUS_ENTRANCE;  	_shown[0] = kShownTrue; +	_shown[2] = kShownTrue; + +	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED, 1, 1, 2, MUSEUM, 23); +	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS11, 2);  } -void MusEing::onEntrance() { +void MusEntrance::onEntrance() {  	setRoomSeen(true);  } -void MusEing::animation() { +void MusEntrance::animation() {  } -bool MusEing::interact(Action verb, Object &obj1, Object &obj2) { -	return true; +bool MusEntrance::interact(Action verb, Object &obj1, Object &obj2) { +	if (verb == ACTION_OPEN && obj1._id == DOOR) +		_gm->_rooms[MUS11]->getObject(2)->_type |= OPENED; +	else if (verb == ACTION_CLOSE && obj1._id == DOOR) +		_gm->_rooms[MUS11]->getObject(2)->_type &= ~OPENED; +	else if (verb == ACTION_USE &&  +				Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && +				!(_objectState[0]._type & OPENED)) { +		if (_gm->crackDoor(20)) { +			_vm->renderImage(2); +			_objectState[0]._type = EXIT | OPENABLE | OPENED; +			_vm->playSound(kAudioTaxiOpen); +		} +		return true; +	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && +			(obj1._type & OPENED)) { +		_vm->renderImage(2 + 128); +		_objectState[0]._type = EXIT | OPENABLE | CLOSED; +		_vm->playSound(kAudioElevator1); +		return true; +	} +	return false;  }  Mus1::Mus1(Supernova2Engine *vm, GameManager *gm) {  	_vm = vm;  	_gm = gm; -	_fileNumber = 6; +	_fileNumber = 35;  	_id = MUS1;  	_shown[0] = kShownTrue; +	_shown[1] = kShownTrue; +	_shown[3] = kShownTrue; +	_shown[4] = kShownTrue; +	_shown[6] = kShownTrue; +	_shown[13] = kShownTrue; +	_shown[15] = kShownTrue; +	_shown[26] = kShownTrue; +	_shown[27] = kShownTrue; + +	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS2, 22); +	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 4, 4, 11, MUS8, 9);  }  void Mus1::onEntrance() { +	_gm->securityEntrance();  	setRoomSeen(true);  } @@ -3931,7 +3965,8 @@ void Mus1::animation() {  }  bool Mus1::interact(Action verb, Object &obj1, Object &obj2) { -	return true; +	_gm->museumDoorInteract(verb, obj1, obj2); +	return false;  }  Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) { diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h index 8194b02701..c71a4c6c2c 100644 --- a/engines/supernova2/rooms.h +++ b/engines/supernova2/rooms.h @@ -563,9 +563,9 @@ public:  private:  }; -class MusEing : public Room { +class MusEntrance : public Room {  public: -	MusEing(Supernova2Engine *vm, GameManager *gm); +	MusEntrance(Supernova2Engine *vm, GameManager *gm);  	virtual void onEntrance();  	virtual void animation();  	virtual bool interact(Action verb, Object &obj1, Object &obj2); diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index 3cb268a448..36dc72c7d6 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -72,6 +72,7 @@ bool GameManager::serialize(Common::WriteStream *out) {  	}  	// Rooms +	out->writeByte(_lastRoom->getId());  	out->writeByte(_currentRoom->getId());  	for (int i = 0; i < NUMROOMS; ++i) {  		_rooms[i]->serialize(out); @@ -124,10 +125,12 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {  	}  	// Rooms +	RoomId lastRoomId = static_cast<RoomId>(in->readByte());  	RoomId curRoomId = static_cast<RoomId>(in->readByte());  	for (int i = 0; i < NUMROOMS; ++i) {  		_rooms[i]->deserialize(in, version);  	} +	_lastRoom = _rooms[lastRoomId];  	changeRoom(curRoomId);  	// Some additional variables @@ -309,7 +312,7 @@ void GameManager::destroyRooms() {  	delete _rooms[COFFIN_ROOM];  	delete _rooms[MASK];  	delete _rooms[MUSEUM]; -	delete _rooms[MUS_EING]; +	delete _rooms[MUS_ENTRANCE];  	delete _rooms[MUS1];  	delete _rooms[MUS2];  	delete _rooms[MUS3]; @@ -449,7 +452,7 @@ void GameManager::initRooms() {  	_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);  	_rooms[MASK] = new Mask(_vm, this);  	_rooms[MUSEUM] = new Museum(_vm, this); -	_rooms[MUS_EING] = new MusEing(_vm, this); +	_rooms[MUS_ENTRANCE] = new MusEntrance(_vm, this);  	_rooms[MUS1] = new Mus1(_vm, this);  	_rooms[MUS2] = new Mus2(_vm, this);  	_rooms[MUS3] = new Mus3(_vm, this); @@ -1448,8 +1451,10 @@ void GameManager::handleInput() {  			} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {  				// This is closed  				_vm->renderMessage(kStringGenericInteract3); -			} else +			} else { +				_lastRoom = _currentRoom;  				changeRoom(_inputObject[0]->_exitRoom); +			}  			break; @@ -2139,7 +2144,7 @@ void GameManager::drawClock() {  	if (!_state._alarmOn && _currentRoom == _rooms[MUS4] &&   			second >= 21 && second <= 40)  		alarm(); -	if (_currentRoom == _rooms[MUS_EING] && second >= 22 && second <= 29) { +	if (_currentRoom == _rooms[MUS_ENTRANCE] && second >= 22 && second <= 29) {  		if (!_steps && !_state._alarmCracked) {  			_steps = true;  			_vm->renderMessage(kStringMuseum6); @@ -2180,5 +2185,92 @@ bool GameManager::crackDoor(int time) {  	return !_state._alarmOn;  } +void GameManager::museumDoorInteract(Action verb, Object &obj1, Object &obj2) { +	static struct { +		int _r1; +		int _o1; +		int _r2; +		int _o2; +	} doorTab[11] = { +		{MUS1, 0, MUS2, 0}, +		{MUS2, 1, MUS3, 0}, +		{MUS3, 1, MUS10, 0}, +		{MUS10, 1, MUS11, 0}, +		{MUS11, 1, MUS7, 1}, +		{MUS7, 0, MUS6, 1}, +		{MUS6, 0, MUS5, 1}, +		{MUS5, 0, MUS4, 0}, +		{MUS5, 2, MUS9, 1}, +		{MUS9, 0, MUS8, 1}, +		{MUS8, 0, MUS1, 1} +	}; +	Room *r; +	if (verb == ACTION_OPEN && obj1._id == DOOR) { +		for (int i = 0; i < 11; i++) { +			if ((_currentRoom == _rooms[doorTab[i]._r1]) && +				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) { +				r = _rooms[doorTab[i]._r2]; +				r->getObject(doorTab[i]._o2)->_type |= OPENED; +				r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownTrue); +			} else if ((_currentRoom == _rooms[doorTab[i]._r2]) && +				 &obj1 == _currentRoom->getObject(doorTab[i]._o2)) { +				r = _rooms[doorTab[i]._r1]; +				r->getObject(doorTab[i]._o1)->_type |= OPENED; +				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownTrue); +			} +		} +	} else if (verb == ACTION_OPEN && obj1._id == DOOR) { +		for (int i = 0; i < 11; i++) { +			if ((_currentRoom == _rooms[doorTab[i]._r1]) && +				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) { +				r = _rooms[doorTab[i]._r2]; +				r->getObject(doorTab[i]._o2)->_type &= ~OPENED; +				r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownFalse); +			} else if ((_currentRoom == _rooms[doorTab[i]._r2]) && +				 &obj1 == _currentRoom->getObject(doorTab[i]._o2)) { +				r = _rooms[doorTab[i]._r1]; +				r->getObject(doorTab[i]._o1)->_type &= ~OPENED; +				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownFalse); +			} +		} +	} +} + +void GameManager::securityEntrance() { +	static struct { +		RoomId _r; +		int _a1; +		int _a2; +	} securityList[11] = { +		{MUS1 ,11,31}, +		{MUS2 , 7,17}, +		{MUS3 , 7,17}, +		{MUS10, 1, 7}, +		{MUS11, 1, 7}, +		{MUS7 ,10,32}, +		{MUS6 , 8,18}, +		{MUS5 , 8,18}, +		{MUS9 , 2, 8}, +		{MUS8 , 2, 8}, +		{MUS1 , 0, 0} +	}; + +	int time = (g_system->getMillis() - _state._startTime) / 700; +	int second = time % 100; + +	if (_rooms[_securityTab[second / 10]] == _currentRoom) { +		int i; +		for (i = 0; _currentRoom != _rooms[securityList[i]._r]; i++) +		{} +		if (_lastRoom == _rooms[securityList[i + 1]._r]) { +			_vm->renderImage(securityList[i]._a1); +			_vm->renderImage(securityList[i]._a2); +			caught2(); +		} +		else +			caught(); +	} +} +  } diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h index 25b0cd91ec..e6a3199819 100644 --- a/engines/supernova2/state.h +++ b/engines/supernova2/state.h @@ -154,6 +154,7 @@ public:  	int _mouseY;  	int _mouseField;  	Room *_currentRoom; +	Room *_lastRoom;  	bool _newRoom;  	Room *_rooms[NUMROOMS];  	Inventory _inventory; @@ -251,6 +252,8 @@ public:  	void alarm();  	void crack(int time);  	bool crackDoor(int time); +	void museumDoorInteract(Action verb, Object &obj1, Object &obj2); +	void securityEntrance();  private:  	int _prevImgId; | 
