diff options
| -rw-r--r-- | devtools/create_mortdat/create_mortdat.cpp | 14 | ||||
| -rw-r--r-- | devtools/create_mortdat/create_mortdat.h | 2 | ||||
| -rw-r--r-- | devtools/create_mortdat/menudata.h | 52 | ||||
| -rw-r--r-- | dists/engine-data/mort.dat | bin | 75999 -> 76151 bytes | |||
| -rw-r--r-- | engines/mortevielle/menu.cpp | 95 | ||||
| -rw-r--r-- | engines/mortevielle/menu.h | 2 |
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 Binary files differindex 32074db139..9d0d1f530b 100644 --- a/dists/engine-data/mort.dat +++ b/dists/engine-data/mort.dat 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; |
