aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devtools/create_mortdat/create_mortdat.cpp14
-rw-r--r--devtools/create_mortdat/create_mortdat.h2
-rw-r--r--devtools/create_mortdat/menudata.h52
-rw-r--r--dists/engine-data/mort.datbin75999 -> 76151 bytes
-rw-r--r--engines/mortevielle/menu.cpp95
-rw-r--r--engines/mortevielle/menu.h2
6 files changed, 124 insertions, 41 deletions
diff --git a/devtools/create_mortdat/create_mortdat.cpp b/devtools/create_mortdat/create_mortdat.cpp
index 00b9b1ce4a..5a491eea2f 100644
--- a/devtools/create_mortdat/create_mortdat.cpp
+++ b/devtools/create_mortdat/create_mortdat.cpp
@@ -204,16 +204,19 @@ void writeGameStrings() {
/**
* Write out the data for the English menu
*/
-void writeMenuBlock() {
+void writeMenuData(const char *menuData, int languageId) {
// Write out a section header to the output file and the menu data
const char menuHeader[4] = { 'M', 'E', 'N', 'U' };
outputFile.write(menuHeader, 4); // Section Id
- outputFile.writeWord(strlen(menuDataEn) / 8); // Section size
+ int size = strlen(menuData) / 8 + 1; // Language code + Menu data size
+ outputFile.writeWord(size);
+
+ outputFile.writeByte(languageId);
// Write each 8-characters block as a byte (one bit per character)
// ' ' -> 0, anything else -> 1
byte value;
int valueCpt = 0;
- const char* str = menuDataEn;
+ const char* str = menuData;
while (*str != 0) {
if (*(str++) != ' ')
value |= (1 << (7 - valueCpt));
@@ -226,6 +229,11 @@ void writeMenuBlock() {
}
}
+void writeMenuBlock() {
+ writeMenuData(menuDataEn, 1);
+ writeMenuData(menuDataDe, 2);
+}
+
void writeVerbNums(const int *verbs, int languageId) {
// Write out a section header to the output file
const char menuHeader[4] = { 'V', 'E', 'R', 'B' };
diff --git a/devtools/create_mortdat/create_mortdat.h b/devtools/create_mortdat/create_mortdat.h
index 1ebbbe37e0..e5007ae653 100644
--- a/devtools/create_mortdat/create_mortdat.h
+++ b/devtools/create_mortdat/create_mortdat.h
@@ -24,7 +24,7 @@
*/
#define VERSION_MAJOR 1
-#define VERSION_MINOR 1
+#define VERSION_MINOR 2
enum AccessMode {
kFileReadMode = 1,
diff --git a/devtools/create_mortdat/menudata.h b/devtools/create_mortdat/menudata.h
index ccdd13d7f2..f3ca81cf1f 100644
--- a/devtools/create_mortdat/menudata.h
+++ b/devtools/create_mortdat/menudata.h
@@ -76,7 +76,57 @@ const char *menuDataEn =
"@@@ @@@ @@@ @@@ "
" ";
-const int verbsFr[26] = { 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, 0x308,
+const char *menuDataDe =
+ " @@@ "
+ " @ "
+ " @ @ @@ @@@ @@@ "
+ " @ @ @ @ @ "
+ " @ @ @ @ @ "
+ " @ @ @ @ @ "
+ "@@@ @@@ @@ @@ "
+ " "
+ " @@@@@ "
+ " @ @ "
+ " @ @ @@@ @ @@@ "
+ " @ @ @ @ @ @ "
+ " @ @ @@@@ @ @ "
+ " @ @ @ @@@@ "
+ "@@@@@ @@@ @ "
+ " @@@ "
+ " @ @@ @ "
+ " @@@ @ @ "
+ " @ @ @ @@ @@@@ "
+ " @ @ @ @ @ "
+ " @@@@@ @@@ @ "
+ " @ @ @ @ @ "
+ "@@@ @@@ @@@ @@ @@ "
+ " "
+ " @@@@@ @@@ @@@"
+ " @ @ @ @ @"
+ " @ @@@ @ @ "
+ " @@@@ @ @ @ @@@ "
+ " @ @@@@@ @ @ "
+ " @ @ @ @ @ "
+ "@@@@@@ @@@ @@@ @@@ "
+ " "
+ " @@@@@ @ "
+ " @ @ "
+ " @ @ @@ @@@@ "
+ " @ @ @ @ "
+ " @ @ @ @@@ "
+ " @ @ @ @ "
+ "@@@@@ @@@ @@@@@ "
+ " "
+ " @@@@@@@ @ "
+ " @ @ "
+ " @ @ @@ @@@@ "
+ " @@@@ @ @ @ "
+ " @ @ @ @ "
+ " @ @ @ @ "
+ "@@@ @@@ @@@ "
+ " ";
+
+const int verbsFr[26] = { 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, 0x308,
0x309, 0x30a, 0x30b, 0x30c, 0x30d, 0x30e, 0x30f, 0x310,
0x311, 0x312, 0x313, 0x314, 0x315, 0x401, 0x402, 0x403,
0x404, 0x405 };
diff --git a/dists/engine-data/mort.dat b/dists/engine-data/mort.dat
index 32074db139..9d0d1f530b 100644
--- a/dists/engine-data/mort.dat
+++ b/dists/engine-data/mort.dat
Binary files differ
diff --git a/engines/mortevielle/menu.cpp b/engines/mortevielle/menu.cpp
index 1077f66fc2..c75409311b 100644
--- a/engines/mortevielle/menu.cpp
+++ b/engines/mortevielle/menu.cpp
@@ -591,47 +591,72 @@ void Menu::setParent(MortevielleEngine *vm) {
void Menu::initMenu() {
Common::File f;
- bool enMenuLoaded = false;
- if (_vm->getLanguage() == Common::EN_ANY) {
- // Open the mort.dat file
- if (!f.open(MORT_DAT))
- warning("File %s not found. Using default menu from game data", MORT_DAT);
- else {
- // 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)) {
- // MENU section
- if (dataSize <= 7 * 24) {
- f.read(_charArr, dataSize);
- enMenuLoaded = true;
- } else
- warning("Wrong size %d for menu data. Expected %d or less", dataSize, 7*24);
- break;
- } else {
- // Other sections
+ 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;
+ }
+
+ // 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) {
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 (!enMenuLoaded)
- warning("Failed to load English menu. 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 (!enMenuLoaded) {
+ if (!menuLoaded) {
+ // Load menu from game data using the original language
if (_vm->getOriginalLanguage() == Common::FR_FRA) {
if (!f.open("menufr.mor"))
error("Missing file - menufr.mor");
@@ -639,7 +664,7 @@ void Menu::initMenu() {
if (!f.open("menual.mor"))
error("Missing file - menual.mor");
}
- f.read(_charArr, 7 * 24);
+ f.read(_charArr, 6 * 24);
f.close();
}
diff --git a/engines/mortevielle/menu.h b/engines/mortevielle/menu.h
index d1271bca2e..debf5b09b6 100644
--- a/engines/mortevielle/menu.h
+++ b/engines/mortevielle/menu.h
@@ -51,7 +51,7 @@ class Menu {
private:
MortevielleEngine *_vm;
- byte _charArr[7][24];
+ byte _charArr[6][24];
int _msg3;
int _msg4;