aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-07-01 16:13:58 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commit61975aa2e2cb8f432b58d7c1c4af6110fbf9d81d (patch)
treef05830950de3dc3d876eeba7632d6beab45028ac /engines
parentc1317bb9c7b8c3d3164919de31f064d54de78994 (diff)
downloadscummvm-rg350-61975aa2e2cb8f432b58d7c1c4af6110fbf9d81d.tar.gz
scummvm-rg350-61975aa2e2cb8f432b58d7c1c4af6110fbf9d81d.tar.bz2
scummvm-rg350-61975aa2e2cb8f432b58d7c1c4af6110fbf9d81d.zip
SUPERNOVA: Add improved mode
Diffstat (limited to 'engines')
-rw-r--r--engines/supernova/detection.cpp40
-rw-r--r--engines/supernova/supernova.cpp11
-rw-r--r--engines/supernova/supernova.h1
-rw-r--r--engines/supernova/supernova1/rooms.cpp21
-rw-r--r--engines/supernova/supernova2/rooms.cpp6
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);