diff options
| -rw-r--r-- | engines/supernova/detection.cpp | 40 | ||||
| -rw-r--r-- | engines/supernova/supernova.cpp | 11 | ||||
| -rw-r--r-- | engines/supernova/supernova.h | 1 | ||||
| -rw-r--r-- | engines/supernova/supernova1/rooms.cpp | 21 | ||||
| -rw-r--r-- | engines/supernova/supernova2/rooms.cpp | 6 | 
5 files changed, 73 insertions, 6 deletions
diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp index f6fe201e82..417d06fcf8 100644 --- a/engines/supernova/detection.cpp +++ b/engines/supernova/detection.cpp @@ -29,9 +29,13 @@  #include "supernova/supernova.h" +#define GAMEOPTION_IMPROVED GUIO_GAMEOPTIONS1 +  static const PlainGameDescriptor supernovaGames[] = {  	{"msn1", "Mission Supernova 1"},  	{"msn2", "Mission Supernova 2"}, +	{"msn1-i", "Mission Supernova 1 improved"}, +	{"msn2-i", "Mission Supernova 2 improved"},  	{nullptr, nullptr}  }; @@ -56,6 +60,24 @@ static const ADGameDescription gameDescriptions[] = {  		ADGF_UNSTABLE,  		GUIO1(GUIO_NONE)  	}, +	{ +		"msn1-i", +		nullptr, +		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163), +		Common::DE_DEU, +		Common::kPlatformDOS, +		ADGF_UNSTABLE, +		GUIO1(GAMEOPTION_IMPROVED) +	}, +	{ +		"msn1-i", +		nullptr, +		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163), +		Common::EN_ANY, +		Common::kPlatformDOS, +		ADGF_UNSTABLE, +		GUIO1(GAMEOPTION_IMPROVED) +	},  	// Mission Supernova 2  	{  		"msn2", @@ -75,6 +97,24 @@ static const ADGameDescription gameDescriptions[] = {  		ADGF_UNSTABLE,  		GUIO1(GUIO_NONE)  	}, +	{ +		"msn2-i", +		nullptr, +		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805), +		Common::DE_DEU, +		Common::kPlatformDOS, +		ADGF_UNSTABLE, +		GUIO1(GAMEOPTION_IMPROVED) +	}, +	{ +		"msn2-i", +		nullptr, +		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805), +		Common::EN_ANY, +		Common::kPlatformDOS, +		ADGF_UNSTABLE, +		GUIO1(GAMEOPTION_IMPROVED) +	},  	AD_TABLE_END_MARKER  };  } diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp index 0324e88716..c225c7cd58 100644 --- a/engines/supernova/supernova.cpp +++ b/engines/supernova/supernova.cpp @@ -87,7 +87,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)  	, _sleepAutoSave(nullptr)  	, _sleepAuoSaveVersion(-1)  	, _delay(33) -	, _textSpeed(kTextSpeed[2]) { +	, _textSpeed(kTextSpeed[2]) +	, _improved(false) {  	if (ConfMan.hasKey("textspeed"))  		_textSpeed = ConfMan.getInt("textspeed"); @@ -95,7 +96,13 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)  		_MSPart = 1;  	else if (ConfMan.get("gameid") == "msn2")  		_MSPart = 2; -	else +	else if (ConfMan.get("gameid") == "msn1-i") { +		_MSPart = 1; +		_improved = true; +	} else if (ConfMan.get("gameid") == "msn2-i") { +		_MSPart = 2; +		_improved = true; +	} else  		_MSPart = 0;  	DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");  } diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h index b357f6e1a3..55a021dfd3 100644 --- a/engines/supernova/supernova.h +++ b/engines/supernova/supernova.h @@ -90,6 +90,7 @@ public:  	uint _delay;  	int  _textSpeed;  	char _MSPart; +	bool _improved;  	Common::Error loadGameStrings();  	void init(); diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp index 77d0eac244..6d2fdd5316 100644 --- a/engines/supernova/supernova1/rooms.cpp +++ b/engines/supernova/supernova1/rooms.cpp @@ -1339,10 +1339,26 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {  }  void ShipAirlock::onEntrance() { -	if (!hasSeen()) +	if (!isSectionVisible(kMaxSection - 1)) {  		_vm->renderMessage(kStringShipAirlock4); +		setSectionVisible(kMaxSection -1, kShownTrue); +	} +	if (_vm->_improved && isSectionVisible(kMaxSection - 2)) { +		if (_objectState[0].hasProperty(OPENED)) { +			_objectState[4].setProperty(WORN); +			_objectState[5].setProperty(WORN); +			_objectState[6].setProperty(WORN); +			interact(ACTION_PRESS, _objectState[2], _gm->_nullObject); +			interact(ACTION_PRESS, _objectState[3], _gm->_nullObject); +		} else { +			_objectState[4].disableProperty(WORN); +			_objectState[5].disableProperty(WORN); +			_objectState[6].disableProperty(WORN); +			interact(ACTION_PRESS, _objectState[3], _gm->_nullObject); +			interact(ACTION_PRESS, _objectState[2], _gm->_nullObject); +		} +	} -	setRoomSeen(true);  }  ShipHold::ShipHold(SupernovaEngine *vm, GameManager1 *gm) { @@ -1419,6 +1435,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {  void ShipHold::onEntrance() {  	if (!hasSeen())  		_vm->renderMessage(kStringShipHold2); +	_gm->_rooms[AIRLOCK]->setSectionVisible(kMaxSection - 2, kShownTrue);  	setRoomSeen(true);  	_gm->_rooms[COCKPIT]->setRoomSeen(true);  } diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp index 43adab12c2..edfc3897e7 100644 --- a/engines/supernova/supernova2/rooms.cpp +++ b/engines/supernova/supernova2/rooms.cpp @@ -2728,7 +2728,8 @@ bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {  	if (_gm->move(verb, obj1)) {  		_gm->passageConstruction();  		_gm->_newRoom = true; -	} else if (verb == ACTION_PRESS && obj1._id >= PART0 && obj1._id <= PART15) { +	} else if ((verb == ACTION_PRESS || (verb == ACTION_WALK && _vm->_improved)) +			&& obj1._id >= PART0 && obj1._id <= PART15) {  		int pos = obj1._id - PART0;  		int newPos = 0;  		if (pos > 3  && _gm->_puzzleField[pos - 4] == 255) @@ -3573,7 +3574,8 @@ bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {  	if (_gm->move(verb, obj1)) {  		_gm->passageConstruction();  		_gm->_newRoom = true; -	} else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) { +	} else if ((verb == ACTION_PRESS || (verb == ACTION_WALK && _vm->_improved)) +			&& obj1._id >= BST1 && obj1._id <= BST16) {  		int number = obj1._id - (BST1 - 1);  		if (isSectionVisible(number))  			_vm->renderImage(number + 128);  | 
