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;  | 
