aboutsummaryrefslogtreecommitdiff
path: root/engines/supernova
diff options
context:
space:
mode:
authorJaromir Wysoglad2019-07-02 19:05:20 +0200
committerThierry Crozat2019-07-28 15:09:14 +0100
commit0e31a6163d6df9a8b7b26b9f50a3a49fe5c7d499 (patch)
tree626c134b338848fef1b20ffbe6ff2abb7f8163c9 /engines/supernova
parent37c53c420f9a3ccf2bc21de8caea9e0b65edacec (diff)
downloadscummvm-rg350-0e31a6163d6df9a8b7b26b9f50a3a49fe5c7d499.tar.gz
scummvm-rg350-0e31a6163d6df9a8b7b26b9f50a3a49fe5c7d499.tar.bz2
scummvm-rg350-0e31a6163d6df9a8b7b26b9f50a3a49fe5c7d499.zip
SUPERNOVA: Merge create_supernova tools
Diffstat (limited to 'engines/supernova')
-rw-r--r--engines/supernova/graphics.cpp92
-rw-r--r--engines/supernova/screen.cpp12
-rw-r--r--engines/supernova/screen.h4
-rw-r--r--engines/supernova/supernova.cpp130
-rw-r--r--engines/supernova/supernova.h5
5 files changed, 135 insertions, 108 deletions
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 7bd1cc6063..fb248e3e81 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -96,36 +96,24 @@ bool MSNImage::loadPbmFromEngineDataFile() {
Common::File f;
char id[5], lang[5];
id[4] = lang[4] = '\0';
- if (_MSPart == 1) {
- if (_filenumber == 1)
- name = "IMG1";
- else if (_filenumber == 2)
- name = "IMG2";
- else
-
- return false;
- if (!f.open(SUPERNOVA_DAT))
- return false;
-
- f.read(id, 3);
- if (strncmp(id, "MSN", 3) != 0)
- return false;
- int version = f.readByte();
- if (version != SUPERNOVA_DAT_VERSION)
- return false;
- } else if (_MSPart == 2) {
- return false;
-
- if (!f.open(SUPERNOVA2_DAT))
- return false;
+ if (_MSPart == 2)
+ return false;
+ if (_filenumber == 1)
+ name = "IMG1";
+ else if (_filenumber == 2)
+ name = "IMG2";
+ else
- f.read(id, 3);
- if (strncmp(id, "MS2", 3) != 0)
- return false;
- int version = f.readByte();
- if (version != SUPERNOVA2_DAT_VERSION)
- return false;
- }
+ return false;
+ if (!f.open(SUPERNOVA_DAT))
+ return false;
+
+ f.read(id, 3);
+ if (strncmp(id, "MSN", 3) != 0)
+ return false;
+ int version = f.readByte();
+ if (version != SUPERNOVA_DAT_VERSION)
+ return false;
Common::String cur_lang = ConfMan.get("language");
@@ -133,8 +121,23 @@ bool MSNImage::loadPbmFromEngineDataFile() {
// or the format is not as expected. We will get those warning when reading the
// strings anyway (actually the engine will even refuse to start).
-
+ int part;
+ uint32 gameBlockSize;
while (!f.eos()) {
+ part = f.readByte();
+ gameBlockSize = f.readUint32LE();
+ if (f.eos()){
+ return false;
+ }
+ if (part == _MSPart) {
+ break;
+ } else
+ f.skip(gameBlockSize);
+ }
+
+ uint32 readSize = 0;
+
+ while (readSize < gameBlockSize) {
f.read(id, 4);
f.read(lang, 4);
uint32 size = f.readUint32LE();
@@ -142,8 +145,10 @@ bool MSNImage::loadPbmFromEngineDataFile() {
break;
if (name == id && cur_lang == lang) {
return f.read(_encodedImage, size) == size;
- } else
+ } else {
f.skip(size);
+ readSize += size;
+ }
}
return false;
@@ -164,20 +169,35 @@ bool MSNImage::loadFromEngineDataFile() {
else
return false;
- if (!f.open(SUPERNOVA2_DAT))
+ if (!f.open(SUPERNOVA_DAT))
return false;
f.read(id, 3);
- if (strncmp(id, "MS2", 3) != 0)
+ if (strncmp(id, "MSN", 3) != 0)
return false;
int version = f.readByte();
- if (version != SUPERNOVA2_DAT_VERSION)
+ if (version != SUPERNOVA_DAT_VERSION)
return false;
}
Common::String cur_lang = ConfMan.get("language");
+ int part;
+ uint32 gameBlockSize;
while (!f.eos()) {
+ part = f.readByte();
+ gameBlockSize = f.readUint32LE();
+ if (f.eos()){
+ return false;
+ }
+ if (part == _MSPart) {
+ break;
+ } else
+ f.skip(gameBlockSize);
+ }
+
+ uint32 readSize = 0;
+ while (readSize < gameBlockSize) {
f.read(id, 4);
f.read(lang, 4);
uint32 size = f.readUint32LE();
@@ -185,8 +205,10 @@ bool MSNImage::loadFromEngineDataFile() {
break;
if (name == id && cur_lang == lang) {
return loadStream(*f.readStream(size));
- } else
+ } else {
f.skip(size);
+ readSize += size;
+ }
}
return false;
diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 7dc04b0c82..8aacbe83b0 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -107,6 +107,7 @@ Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
, _textBegin(text)
, _delay(0)
, _loop(false)
+ , _oldColor(nullptr)
, _screen(screen) {
if (_screen->_vm->_MSPart == 1) {
_color = kColorLightBlue;
@@ -117,6 +118,10 @@ Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
_y = 1;
}
} else if (_screen->_vm->_MSPart == 2) {
+ byte purple[3] = {0x9b, 0x00, 0xfb};
+ _oldColor = new byte[3];
+ _screen->_vm->_system->getPaletteManager()->grabPalette(_oldColor, kColorPurple, 1);
+ _screen->_vm->_system->getPaletteManager()->setPalette(purple, kColorPurple, 1);
_color = kColorPurple;
if (id == kMarqueeIntro) {
_y = 191;
@@ -133,6 +138,13 @@ Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
_screen->_textColor = _color;
}
+Marquee::~Marquee() {
+ if (_screen->_vm->_MSPart == 2) {
+ _screen->_vm->_system->getPaletteManager()->setPalette(_oldColor, kColorPurple, 1);
+ delete _oldColor;
+ }
+}
+
void Marquee::clearText() {
_screen->renderBox(_x, _y - 1, _textWidth + 1, 9, kColorBlack);
}
diff --git a/engines/supernova/screen.h b/engines/supernova/screen.h
index 0779973fe9..5a94dc05d7 100644
--- a/engines/supernova/screen.h
+++ b/engines/supernova/screen.h
@@ -64,7 +64,7 @@ enum Color {
kColorLightGreen = 13,
kColorLightYellow = 14,
kColorLightRed = 15,
- kColorPurple = 35,
+ kColorPurple = 16,
kColorCursorTransparent = kColorWhite25
};
@@ -102,6 +102,7 @@ public:
};
Marquee(Screen *screen, MarqueeId id, const char *text);
+ ~Marquee();
bool renderCharacter();
void reset();
@@ -115,6 +116,7 @@ private:
bool _loop;
int _delay;
int _color;
+ byte *_oldColor;
int _x;
int _y;
int _textWidth;
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index d186995f6b..16569cf83a 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -197,47 +197,42 @@ Common::Error SupernovaEngine::loadGameStrings() {
Common::File f;
char id[5], lang[5];
id[4] = lang[4] = '\0';
- if (_MSPart == 1) {
- if (!f.open(SUPERNOVA_DAT)) {
- GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
- return Common::kReadingFailed;
- }
- f.read(id, 3);
- if (strncmp(id, "MSN", 3) != 0) {
- GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
- return Common::kReadingFailed;
- }
+ if (!f.open(SUPERNOVA_DAT)) {
+ GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
+ return Common::kReadingFailed;
+ }
+ f.read(id, 3);
+ if (strncmp(id, "MSN", 3) != 0) {
+ GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
+ return Common::kReadingFailed;
+ }
- int version = f.readByte();
- if (version != SUPERNOVA_DAT_VERSION) {
- GUIErrorMessageFormat(
- _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
- SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
- return Common::kReadingFailed;
- }
+ int version = f.readByte();
+ if (version != SUPERNOVA_DAT_VERSION) {
+ GUIErrorMessageFormat(
+ _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+ SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
+ return Common::kReadingFailed;
}
- else if (_MSPart == 2) {
- if (!f.open(SUPERNOVA2_DAT)) {
- GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA2_DAT);
- return Common::kReadingFailed;
- }
- f.read(id, 3);
- if (strncmp(id, "MS2", 3) != 0) {
- GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA2_DAT);
- return Common::kReadingFailed;
- }
- int version = f.readByte();
- if (version != SUPERNOVA2_DAT_VERSION) {
- GUIErrorMessageFormat(
- _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
- SUPERNOVA2_DAT, SUPERNOVA2_DAT_VERSION, version);
+ int part;
+ uint32 gameBlockSize;
+ while (!f.eos()) {
+ part = f.readByte();
+ gameBlockSize = f.readUint32LE();
+ if (f.eos()){
+ GUIErrorMessageFormat(_("Unable to find block for part %d"), _MSPart);
return Common::kReadingFailed;
}
+ if (part == _MSPart) {
+ break;
+ } else
+ f.skip(gameBlockSize);
}
+ uint32 readSize = 0;
- while (!f.eos()) {
+ while (readSize < gameBlockSize) {
f.read(id, 4);
f.read(lang, 4);
uint32 size = f.readUint32LE();
@@ -253,8 +248,10 @@ Common::Error SupernovaEngine::loadGameStrings() {
size -= s.size() + 1;
}
return Common::kNoError;
- } else
+ } else {
f.skip(size);
+ readSize += size;
+ }
}
Common::Language l = Common::parseLanguage(cur_lang);
@@ -517,47 +514,42 @@ Common::SeekableReadStream *SupernovaEngine::getBlockFromDatFile(Common::String
Common::File f;
char id[5], lang[5];
id[4] = lang[4] = '\0';
- if (_MSPart == 1) {
- if (!f.open(SUPERNOVA_DAT)) {
- GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
- return nullptr;
- }
- f.read(id, 3);
- if (strncmp(id, "MSN", 3) != 0) {
- GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
- return nullptr;
- }
+ if (!f.open(SUPERNOVA_DAT)) {
+ GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
+ return nullptr;
+ }
+ f.read(id, 3);
+ if (strncmp(id, "MSN", 3) != 0) {
+ GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
+ return nullptr;
+ }
- int version = f.readByte();
- if (version != SUPERNOVA_DAT_VERSION) {
- GUIErrorMessageFormat(
- _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
- SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
- return nullptr;
- }
+ int version = f.readByte();
+ if (version != SUPERNOVA_DAT_VERSION) {
+ GUIErrorMessageFormat(
+ _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+ SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
+ return nullptr;
}
- else if (_MSPart == 2) {
- if (!f.open(SUPERNOVA2_DAT)) {
- GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA2_DAT);
- return nullptr;
- }
- f.read(id, 3);
- if (strncmp(id, "MS2", 3) != 0) {
- GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA2_DAT);
- return nullptr;
- }
- int version = f.readByte();
- if (version != SUPERNOVA2_DAT_VERSION) {
- GUIErrorMessageFormat(
- _("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
- SUPERNOVA2_DAT, SUPERNOVA2_DAT_VERSION, version);
+ int part;
+ uint32 gameBlockSize;
+ while (!f.eos()) {
+ part = f.readByte();
+ gameBlockSize = f.readUint32LE();
+ if (f.eos()){
+ GUIErrorMessageFormat(_("Unable to find block for part %d"), _MSPart);
return nullptr;
}
+ if (part == _MSPart) {
+ break;
+ } else
+ f.skip(gameBlockSize);
}
+ uint32 readSize = 0;
- while (!f.eos()) {
+ while (readSize < gameBlockSize) {
f.read(id, 4);
f.read(lang, 4);
uint32 size = f.readUint32LE();
@@ -565,8 +557,10 @@ Common::SeekableReadStream *SupernovaEngine::getBlockFromDatFile(Common::String
break;
if (name == id && cur_lang == lang) {
return f.readStream(size);
- } else
+ } else {
f.skip(size);
+ readSize += size;
+ }
}
return nullptr;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 8a6fe0f9c1..8139d5f00e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -49,10 +49,7 @@ namespace Supernova {
#define SAVEGAME_VERSION 10
#define SUPERNOVA_DAT "supernova.dat"
-#define SUPERNOVA_DAT_VERSION 2
-
-#define SUPERNOVA2_DAT "supernova2.dat"
-#define SUPERNOVA2_DAT_VERSION 2
+#define SUPERNOVA_DAT_VERSION 3
class GuiElement;
class ResourceManager;