[Scummvm-cvs-logs] scummvm master -> efbf1ff5f999786675fdf28b53970af0eacfa759

criezy criezy at scummvm.org
Mon Aug 19 22:12:55 CEST 2013


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
efbf1ff5f9 MORTEVIELLE: Store German menu data in data file and clean menu code


Commit: efbf1ff5f999786675fdf28b53970af0eacfa759
    https://github.com/scummvm/scummvm/commit/efbf1ff5f999786675fdf28b53970af0eacfa759
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2013-08-19T13:11:23-07:00

Commit Message:
MORTEVIELLE: Store German menu data in data file and clean menu code

This opens the door to a better translation of the menu to German. Also
the code will now always try to read the menu data from the mort.data file
and only if this fails it will use the game data. And remove some dead code
that was to support the corrupted menu.mor file.

Changed paths:
    devtools/create_mortdat/create_mortdat.cpp
    devtools/create_mortdat/create_mortdat.h
    devtools/create_mortdat/menudata.h
    dists/engine-data/mort.dat
    engines/mortevielle/menu.cpp
    engines/mortevielle/menu.h



diff --git a/devtools/create_mortdat/create_mortdat.cpp b/devtools/create_mortdat/create_mortdat.cpp
index 00b9b1c..5a491ee 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 1ebbbe3..e5007ae 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 ccdd13d..f3ca81c 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 32074db..9d0d1f5 100644
Binary files a/dists/engine-data/mort.dat and b/dists/engine-data/mort.dat differ
diff --git a/engines/mortevielle/menu.cpp b/engines/mortevielle/menu.cpp
index 1077f66..c754093 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 d1271bc..debf5b0 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;
 






More information about the Scummvm-git-logs mailing list