diff options
| author | Paweł Kołodziejski | 2003-01-30 08:10:16 +0000 | 
|---|---|---|
| committer | Paweł Kołodziejski | 2003-01-30 08:10:16 +0000 | 
| commit | b9fe3651021fb243f2984b8f5e61c5652961e808 (patch) | |
| tree | 769fc184bf76cf1da362ce15876732aac79ca7b9 /scumm/string.cpp | |
| parent | 2c755a1f3129ff14d44262ab7979dc7945303b6b (diff) | |
| download | scummvm-rg350-b9fe3651021fb243f2984b8f5e61c5652961e808.tar.gz scummvm-rg350-b9fe3651021fb243f2984b8f5e61c5652961e808.tar.bz2 scummvm-rg350-b9fe3651021fb243f2984b8f5e61c5652961e808.zip  | |
added language translation support for comi and some cleanup
svn-id: r6574
Diffstat (limited to 'scumm/string.cpp')
| -rw-r--r-- | scumm/string.cpp | 183 | 
1 files changed, 110 insertions, 73 deletions
diff --git a/scumm/string.cpp b/scumm/string.cpp index 9c18d0dc29..8b81296d18 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -815,11 +815,19 @@ void Scumm::initCharset(int charsetno)  void Scumm::loadLanguageBundle() {  	File file; -	file.open("language.bnd", _gameDataPath); +	if (_gameId == GID_DIG) { +		file.open("language.bnd", _gameDataPath); +	} else if (_gameId == GID_CMI) { +		file.open("language.tab", _gameDataPath); +	} else { +		return; +	} +  	if(file.isOpen() == false) {  		_existLanguageFile = false;  		return;  	} +  	_languageBuffer = (char*)malloc(file.size());  	file.read(_languageBuffer, file.size());  	file.close(); @@ -828,91 +836,120 @@ void Scumm::loadLanguageBundle() {  void Scumm::translateText(byte *text, byte *trans_buff) {  	if ((_existLanguageFile == true) && (text[0] == '/') && (text[1] != ' ')) { -		char name[20], tmp[20], tmp2[20], num_s[20]; +		char name[20], tmp[200], tmp2[20], num_s[20], number[4];  		int32 num, l, j, k, r, pos;  		char enc; -		// copy name from text /..../ -		for (l = 0; (l < 20) && (*(text + l + 1) != '.'); l++) { -			name[l] = *(text + l + 1); -		} -		name[l] = 0; -		l++; - -		// get number from text /..../ -		char number[4]; -		number[0] = *(text + l + 1); -		number[1] = *(text + l + 2); -		number[2] = *(text + l + 3); -		number[3] = 0; -		num = atol(number); -		sprintf(num_s, "%d", num); - -		char * buf = _languageBuffer; +		char *buf = _languageBuffer;  		pos = 0; -		// determine is file encoded -		if (*buf == 'e') { -			enc = 0x13; -			pos += 3; -		} else { -			enc = 0; -		} -		// skip translation if flag 'h' exist -		if (*(buf + pos) == 'h') { -			pos += 3; -			byte *pointer = (byte *)strchr((char*)text + 1, '/'); -			if (pointer != NULL) -				memcpy(trans_buff, pointer + 1, resStrLen(pointer + 1) + 1); -			else -				trans_buff[0] = '\0'; -			return; -		} - -		for(;;) { -			// search char @ -			if (*(buf + pos++) == '@') { -				// copy name after @ to endline +		if (_gameId == GID_CMI) { +			// copy name from text /..../ +			for (l = 0; (l < 20) && (text[l + 1] != '/'); l++) { +				name[l] = text[l + 1]; +			} +			name[l] = 0; +			for (;;) { +				if(buf[pos] == 0) { +					trans_buff[0] = '\0'; +					return; +				}  				l = 0;  				do { -					tmp[l++] = *(buf + pos++); -				} while((*(buf + pos) != 0x0d) && (*(buf + pos + 1) != 0x0a) && (l < 19)); +					tmp[l++] = buf[pos++]; +				} while((buf[pos] != 0) && (buf[pos] != 0x0d) && (buf[pos + 1] != 0x0a) && (l < 199));  				tmp[l] = 0;  				pos += 2; -				// compare 'name' with above name -				if (strcmp(tmp, name) == 0) { -					// get number lines of 'name' after '#' +				l = 0; +				do { +					tmp2[l] = tmp[l]; +					l++; +				} while((tmp[l] != 0) && (tmp[l] != 9) && (l < 19)); +				tmp2[l] = 0; +				if (stricmp(tmp2, name) == 0) { +					strcpy((char*)trans_buff, &tmp[l + 1]); +					return; +				} +			} +		} else if (_gameId == GID_DIG) { +			// copy name from text /..../ +			for (l = 0; (l < 20) && (text[l + 1] != '.'); l++) { +				name[l] = text[l + 1]; +			} +			name[l] = 0; +			l++; +			// get number from text /..../ +			number[0] = text[l + 1]; +			number[1] = text[l + 2]; +			number[2] = text[l + 3]; +			number[3] = 0; +			num = atol(number); +			sprintf(num_s, "%d", num); + +			// determine is file encoded +			if (buf[pos] == 'e') { +				enc = 0x13; +				pos += 3; +			} else { +				enc = 0; +			} + +			// skip translation if flag 'h' exist +			if (buf[pos] == 'h') { +				pos += 3; +				byte *pointer = (byte *)strchr((char*)text + 1, '/'); +				if (pointer != NULL) +					memcpy(trans_buff, pointer + 1, resStrLen(pointer + 1) + 1); +				else +					trans_buff[0] = '\0'; +				return; +			} + +			for(;;) { +				// search char @ +				if (buf[pos++] == '@') { +					// copy name after @ to endline  					l = 0; -					if (*(buf + pos++) == '#') { -						do { -							tmp[l++] = *(buf + pos++); -						} while((*(buf + pos) != 0x0d) && (*(buf + pos + 1) != 0x0a) && (l < 19)); -						tmp[l] = 0; -						pos += 2; -						l = atol(tmp); -						// get number of line -						for(r = 0; r < l; r++) { -							j = 0; +					do { +						tmp[l++] = buf[pos++]; +					} while((buf[pos] != 0x0d) && (buf[pos + 1] != 0x0a) && (l < 19)); +					tmp[l] = 0; +					pos += 2; +					// compare 'name' with above name +					if (strcmp(tmp, name) == 0) { +						// get number lines of 'name' after '#' +						l = 0; +						if (buf[pos++] == '#') {  							do { -								tmp2[j++] = *(buf + pos++); -							} while(*(buf + pos) != '/'); -							tmp2[j] = 0; -							// compare if is right line -							if (strcmp(tmp2, num_s) == 0) { -								k = 0; -								pos++; -								// copy translated text to tran_buffer +								tmp[l++] = buf[pos++]; +							} while((buf[pos] != 0x0d) && (buf[pos + 1] != 0x0a) && (l < 19)); +							tmp[l] = 0; +							pos += 2; +							l = atol(tmp); +							// get number of line +							for(r = 0; r < l; r++) { +								j = 0;  								do { -									*(trans_buff + k++) = (*(buf + pos++)) ^ enc; -								} while((*(buf + pos) != 0x0d) && (*(buf + pos + 1) != 0x0a)); -								*(trans_buff + k) = 0; -								return; +									tmp2[j++] = buf[pos++]; +								} while(buf[pos] != '/'); +								tmp2[j] = 0; +								// compare if is right line +								if (strcmp(tmp2, num_s) == 0) { +									k = 0; +									pos++; +									// copy translated text to tran_buffer +									do { +										trans_buff[k++] = (buf[pos++]) ^ enc; +									} while((buf[pos] != 0x0d) && (buf[pos + 1] != 0x0a)); +									trans_buff[k] = 0; +									return; +								} +								// goto next line +								do {  +									pos++; +								}	while((buf[pos] != 0x0d) && (buf[pos + 1] != 0x0a)); +								pos += 2;  							} -							// goto next line -							do {  -								pos++; -							}	while((*(buf + pos) != 0x0d) && (*(buf + pos + 1) != 0x0a)); -							pos += 2;  						}  					}  				}  | 
