From 83e05ea13f61fdd5d582115c8c2bbd246f70983c Mon Sep 17 00:00:00 2001 From: Jaromir Wysoglad Date: Tue, 18 Jun 2019 10:31:49 +0200 Subject: SUPERNOVA2: Add english translated image This adds translated image of cyphered text inside Cabin room I don't think I can get any closer to the original looks with .pbm format. --- devtools/create_supernova2/create_supernova2.cpp | 16 +++++------ devtools/create_supernova2/img1-en-original.jpg | Bin 0 -> 269133 bytes devtools/create_supernova2/img1-en.pbm | Bin 0 -> 38457 bytes devtools/create_supernova2/img1-en.xcf | Bin 0 -> 22946 bytes engines/supernova2/graphics.cpp | 33 +++++++++++++++-------- engines/supernova2/screen.cpp | 4 ++- engines/supernova2/state.cpp | 2 -- 7 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 devtools/create_supernova2/img1-en-original.jpg create mode 100644 devtools/create_supernova2/img1-en.pbm create mode 100644 devtools/create_supernova2/img1-en.xcf diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp index 5c9e22f298..cca2a73207 100644 --- a/devtools/create_supernova2/create_supernova2.cpp +++ b/devtools/create_supernova2/create_supernova2.cpp @@ -87,9 +87,9 @@ void writeImage(File& outputFile, const char *name, const char* language) { else { // We have finished reading the header. // Check the size is as expected. - if (w != 640 || h != 480) { + if ((w != 640 || h != 480) && (w != 320 || h != 200)) { imgFile.close(); - printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h); + printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480 or 320x200, read: %dx%d). This image will be skipped.\n", fileName, w, h); return; } // And break out of the loop. @@ -121,13 +121,13 @@ void writeImage(File& outputFile, const char *name, const char* language) { outputFile.writeByte(0); } - // Write block size (640*480 / 8) - outputFile.writeLong(38400); + // Write block size + outputFile.writeLong(w * h / 8); - // Write all the bytes. We should have 38400 bytes (640 * 480 / 8) + // Write all the bytes. We should have w * h / 8 bytes // However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black) // but pbm uses 0 for white and 1 for black. - for (i = 0 ; i < 38400 ; ++i) { + for (i = 0 ; i < w * h / 8 ; ++i) { byte b = imgFile.readByte(); outputFile.writeByte(~b); } @@ -222,7 +222,7 @@ int main(int argc, char *argv[]) { // 3 bytes: 'MS2' // 1 byte: version // -- data blocks - // 4 bytes: header 'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively), + // 4 bytes: header 'IMG1' cyphered text image // 'TEXT' for strings // 4 bytes: language code ('en\0', 'de\0'- see common/language.cpp) // 4 bytes: block size n (uint32) @@ -240,7 +240,7 @@ int main(int argc, char *argv[]) { // Other languages const char **l = &lang[0]; while(*l) { - // writeImage(outputFile, "img1", *l); + writeImage(outputFile, "img1", *l); // writeImage(outputFile, "img2", *l); writeStrings(outputFile, *l); ++l; diff --git a/devtools/create_supernova2/img1-en-original.jpg b/devtools/create_supernova2/img1-en-original.jpg new file mode 100644 index 0000000000..6eb4fa73c7 Binary files /dev/null and b/devtools/create_supernova2/img1-en-original.jpg differ diff --git a/devtools/create_supernova2/img1-en.pbm b/devtools/create_supernova2/img1-en.pbm new file mode 100644 index 0000000000..bc09a53ed7 Binary files /dev/null and b/devtools/create_supernova2/img1-en.pbm differ diff --git a/devtools/create_supernova2/img1-en.xcf b/devtools/create_supernova2/img1-en.xcf new file mode 100644 index 0000000000..e621ada3e2 Binary files /dev/null and b/devtools/create_supernova2/img1-en.xcf differ diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp index 592a8e9081..b629041cc9 100644 --- a/engines/supernova2/graphics.cpp +++ b/engines/supernova2/graphics.cpp @@ -81,12 +81,9 @@ bool MS2Image::init(int filenumber) { } bool MS2Image::loadFromEngineDataFile() { - //TODO - /*Common::String name; - if (_filenumber == 1) + Common::String name; + if (_filenumber == 28) name = "IMG1"; - else if (_filenumber == 2) - name = "IMG2"; else return false; @@ -96,16 +93,16 @@ bool MS2Image::loadFromEngineDataFile() { // 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). Common::File f; - if (!f.open(SUPERNOVA_DAT)) + if (!f.open(SUPERNOVA2_DAT)) return false; char id[5], lang[5]; id[4] = lang[4] = '\0'; f.read(id, 3); - if (strncmp(id, "MSN", 3) != 0) + if (strncmp(id, "MS2", 3) != 0) return false; int version = f.readByte(); - if (version != SUPERNOVA_DAT_VERSION) + if (version != SUPERNOVA2_DAT_VERSION) return false; while (!f.eos()) { @@ -118,7 +115,7 @@ bool MS2Image::loadFromEngineDataFile() { return f.read(_encodedImage, size) == size; } else f.skip(size); - }*/ + } return false; } @@ -222,8 +219,9 @@ bool MS2Image::loadStream(Common::SeekableReadStream &stream) { bool MS2Image::loadSections() { bool isPoster = _filenumber == 38; - int imageWidth = isPoster ? 640 : 320; - int imageHeight = isPoster ? 480 : 200; + bool isCypheredText = _filenumber == 28 && ConfMan.get("language") == "en"; + int imageWidth = isPoster || isCypheredText ? 640 : 320; + int imageHeight = isPoster || isCypheredText ? 480 : 200; _pitch = imageWidth; for (int section = 0; section < _numSections; ++section) { @@ -242,6 +240,19 @@ bool MS2Image::loadSections() { *surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack; *surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack; } + } else if (isCypheredText) { + surface->create(imageWidth, imageHeight, g_system->getScreenFormat()); + byte *surfacePixels = static_cast(surface->getPixels()); + for (int i = 0; i < imageWidth * imageHeight / 8; ++i) { + *surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite44 : kColorBlack; + *surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite44 : kColorBlack; + } } else { uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow; diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp index 82e38af091..60c2179638 100644 --- a/engines/supernova2/screen.cpp +++ b/engines/supernova2/screen.cpp @@ -22,6 +22,7 @@ #include "common/str.h" #include "common/system.h" +#include "common/config-manager.h" #include "engines/util.h" #include "graphics/cursorman.h" #include "graphics/palette.h" @@ -354,7 +355,8 @@ void Screen::renderImageSection(const MS2Image *image, int section, bool invert) image->_section[section].y1, image->_section[section].x2 + 1, image->_section[section].y2 + 1); - if (image->_filenumber == 38) { + if (image->_filenumber == 38 || + (image->_filenumber == 28 && ConfMan.get("language") == "en")) { sectionRect.setWidth(640); sectionRect.setHeight(480); if (_screenWidth != 640) { diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp index ab4c4b8ec8..1652170e9e 100644 --- a/engines/supernova2/state.cpp +++ b/engines/supernova2/state.cpp @@ -132,8 +132,6 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) { for (int i = 0; i < NUMROOMS; ++i) { _rooms[i]->deserialize(in, version); } - delete _rooms[SHIP]; - _rooms[SHIP] = new Ship(_vm, this); _lastRoom = _rooms[lastRoomId]; changeRoom(curRoomId); -- cgit v1.2.3