aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorThierry Crozat2013-08-21 11:22:51 +0100
committerThierry Crozat2013-08-21 11:22:51 +0100
commit800ee561c9103793083061588508415bab47e281 (patch)
treeae3765e72dec84d77d5f53caa97ad1c6ae38be06 /engines
parent3ef4222f33bc6e888ff7e4d25f7f8a3b3a7bd5bf (diff)
downloadscummvm-rg350-800ee561c9103793083061588508415bab47e281.tar.gz
scummvm-rg350-800ee561c9103793083061588508415bab47e281.tar.bz2
scummvm-rg350-800ee561c9103793083061588508415bab47e281.zip
MORTEVIELLE: Add detection entry for improved German translation
I also reworked a bit how detection work so that both the original and the improved German translations can be played.
Diffstat (limited to 'engines')
-rw-r--r--engines/mortevielle/detection.cpp6
-rw-r--r--engines/mortevielle/detection_tables.h27
-rw-r--r--engines/mortevielle/menu.cpp110
-rw-r--r--engines/mortevielle/mortevielle.h6
-rw-r--r--engines/mortevielle/utils.cpp4
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;
}