diff options
-rw-r--r-- | engines/mortevielle/detection.cpp | 6 | ||||
-rw-r--r-- | engines/mortevielle/detection_tables.h | 27 | ||||
-rw-r--r-- | engines/mortevielle/menu.cpp | 110 | ||||
-rw-r--r-- | engines/mortevielle/mortevielle.h | 6 | ||||
-rw-r--r-- | engines/mortevielle/utils.cpp | 4 |
5 files changed, 92 insertions, 61 deletions
diff --git a/engines/mortevielle/detection.cpp b/engines/mortevielle/detection.cpp index 8e2eab52b8..ee9cb40c99 100644 --- a/engines/mortevielle/detection.cpp +++ b/engines/mortevielle/detection.cpp @@ -30,6 +30,7 @@ namespace Mortevielle { struct MortevielleGameDescription { ADGameDescription desc; Common::Language originalLanguage; + uint8 dataFeature; }; uint32 MortevielleEngine::getGameFlags() const { return _gameDescription->desc.flags; } @@ -38,6 +39,8 @@ Common::Language MortevielleEngine::getLanguage() const { return _gameDescriptio Common::Language MortevielleEngine::getOriginalLanguage() const { return _gameDescription->originalLanguage; } +bool MortevielleEngine::useOriginalData() const { return _gameDescription->dataFeature == kUseOriginalData; } + } static const PlainGameDescriptor MortevielleGame[] = { @@ -53,6 +56,9 @@ public: MortevielleGame) { _md5Bytes = 512; _singleid = "mortevielle"; + // Use kADFlagUseExtraAsHint to distinguish between original and improved versions + // (i.e. use or not of the game data file). + _flags = kADFlagUseExtraAsHint; } virtual const char *getName() const { return "Mortevielle"; diff --git a/engines/mortevielle/detection_tables.h b/engines/mortevielle/detection_tables.h index 9bb5fbea87..8d0cd5630c 100644 --- a/engines/mortevielle/detection_tables.h +++ b/engines/mortevielle/detection_tables.h @@ -37,7 +37,7 @@ static const MortevielleGameDescription MortevielleGameDescriptions[] = { Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() - }, Common::FR_FRA + }, Common::FR_FRA, kUseOriginalData }, // German { @@ -53,7 +53,24 @@ static const MortevielleGameDescription MortevielleGameDescriptions[] = { Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() - }, Common::DE_DEU + }, Common::DE_DEU, kUseOriginalData + }, + + // German, improved translation + { + { + "mortevielle", + "Improved Translation", + { + {"menual.mor", 0, "792aea282b07a1d74c4a4abeabc90c19", 144}, + {"dxx.mor", 0, "949e68e829ecd5ad29e36a00347a9e7e", 207744}, + AD_LISTEND + }, + Common::DE_DEU, + Common::kPlatformDOS, + ADGF_NO_FLAGS, + GUIO0() + }, Common::DE_DEU, kUseEngineDataFile }, // DOS English version doesn't exist. Technically, they are French or German versions, @@ -73,7 +90,7 @@ static const MortevielleGameDescription MortevielleGameDescriptions[] = { Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() - }, Common::FR_FRA + }, Common::FR_FRA, kUseEngineDataFile }, // English on top of German version @@ -90,10 +107,10 @@ static const MortevielleGameDescription MortevielleGameDescriptions[] = { Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO0() - }, Common::DE_DEU + }, Common::DE_DEU, kUseEngineDataFile }, - { AD_TABLE_END_MARKER , Common::EN_ANY} + { AD_TABLE_END_MARKER , Common::EN_ANY, kUseEngineDataFile} }; } // End of namespace Mortevielle diff --git a/engines/mortevielle/menu.cpp b/engines/mortevielle/menu.cpp index 5885d329b0..641a527c98 100644 --- a/engines/mortevielle/menu.cpp +++ b/engines/mortevielle/menu.cpp @@ -598,67 +598,69 @@ void Menu::initMenu() { Common::File f; bool menuLoaded = false; - // First try to read it from mort.dat - if (!f.open(MORT_DAT)) - warning("File %s not found. Using default menu from game data", MORT_DAT); - else { - // Figure out what language Id is needed - byte desiredLanguageId; - switch(_vm->getLanguage()) { - case Common::EN_ANY: - desiredLanguageId = MORTDAT_LANG_ENGLISH; - break; - case Common::FR_FRA: - desiredLanguageId = MORTDAT_LANG_FRENCH; - break; - case Common::DE_DEU: - desiredLanguageId = MORTDAT_LANG_GERMAN; - break; - default: - warning("Language not supported, switching to English"); - desiredLanguageId = MORTDAT_LANG_ENGLISH; - break; - } + // First try to read it from mort.dat if useOriginalData() is false + if (!_vm->useOriginalData()) { + if (!f.open(MORT_DAT)) + warning("File %s not found. Using default menu from game data", MORT_DAT); + else { + // Figure out what language Id is needed + byte desiredLanguageId; + switch(_vm->getLanguage()) { + case Common::EN_ANY: + desiredLanguageId = MORTDAT_LANG_ENGLISH; + break; + case Common::FR_FRA: + desiredLanguageId = MORTDAT_LANG_FRENCH; + break; + case Common::DE_DEU: + desiredLanguageId = MORTDAT_LANG_GERMAN; + break; + default: + warning("Language not supported, switching to English"); + desiredLanguageId = MORTDAT_LANG_ENGLISH; + break; + } - // Validate the data file header - char fileId[4]; - f.read(fileId, 4); - // Do not display warnings here. They would already have been displayed in MortevielleEngine::loadMortDat(). - if (strncmp(fileId, "MORT", 4) == 0 && f.readByte() >= MORT_DAT_REQUIRED_VERSION) { - f.readByte(); // Minor version - // Loop to load resources from the data file - while (f.pos() < f.size()) { - // Get the Id and size of the next resource - char dataType[4]; - int dataSize; - f.read(dataType, 4); - dataSize = f.readUint16LE(); - if (!strncmp(dataType, "MENU", 4)) { - // Read in the language - byte languageId = f.readByte(); - --dataSize; + // Validate the data file header + char fileId[4]; + f.read(fileId, 4); + // Do not display warnings here. They would already have been displayed in MortevielleEngine::loadMortDat(). + if (strncmp(fileId, "MORT", 4) == 0 && f.readByte() >= MORT_DAT_REQUIRED_VERSION) { + f.readByte(); // Minor version + // Loop to load resources from the data file + while (f.pos() < f.size()) { + // Get the Id and size of the next resource + char dataType[4]; + int dataSize; + f.read(dataType, 4); + dataSize = f.readUint16LE(); + if (!strncmp(dataType, "MENU", 4)) { + // Read in the language + byte languageId = f.readByte(); + --dataSize; - // If the language isn't correct, then skip the entire block - if (languageId != desiredLanguageId) { + // If the language isn't correct, then skip the entire block + if (languageId != desiredLanguageId) { + f.skip(dataSize); + continue; + } + if (dataSize == 6 * 24) { + f.read(_charArr, dataSize); + menuLoaded = true; + } else + warning("Wrong size %d for menu data. Expected %d or less", dataSize, 6 * 24); + break; + } else { + // Other sections f.skip(dataSize); - continue; } - if (dataSize == 6 * 24) { - f.read(_charArr, dataSize); - menuLoaded = true; - } else - warning("Wrong size %d for menu data. Expected %d or less", dataSize, 6 * 24); - break; - } else { - // Other sections - f.skip(dataSize); } } + // Close the file + f.close(); + if (!menuLoaded) + warning("Failed to load menu from mort.dat. Will use default menu from game data instead."); } - // Close the file - f.close(); - if (!menuLoaded) - warning("Failed to load menu from mort.dat. Will use default menu from game data instead."); } if (!menuLoaded) { diff --git a/engines/mortevielle/mortevielle.h b/engines/mortevielle/mortevielle.h index 4c9e57acd1..4c096c1f71 100644 --- a/engines/mortevielle/mortevielle.h +++ b/engines/mortevielle/mortevielle.h @@ -62,6 +62,11 @@ enum { MORTDAT_LANG_GERMAN = 2 }; +enum { + kUseOriginalData = 0, + kUseEngineDataFile = 1 +}; + // Static string list enum { S_YES_NO = 0, S_GO_TO = 1, S_SOMEONE_ENTERS = 2, S_COOL = 3, S_LOURDE = 4, @@ -444,6 +449,7 @@ public: uint32 getGameFlags() const; Common::Language getLanguage() const; Common::Language getOriginalLanguage() const; + bool useOriginalData() const; static Common::String generateSaveFilename(const Common::String &target, int slot); Common::String generateSaveFilename(int slot) { return generateSaveFilename(_targetName, slot); } diff --git a/engines/mortevielle/utils.cpp b/engines/mortevielle/utils.cpp index 92786b1a41..de184bf254 100644 --- a/engines/mortevielle/utils.cpp +++ b/engines/mortevielle/utils.cpp @@ -1993,8 +1993,8 @@ void MortevielleEngine::loadTexts() { Common::File ntpFile; _txxFileFl = false; - if (getLanguage() == Common::EN_ANY) { - warning("English version expected - Switching to DAT file"); + if (!useOriginalData()) { + warning("Using improved translation from DAT file"); return; } |