aboutsummaryrefslogtreecommitdiff
path: root/scumm/string.cpp
diff options
context:
space:
mode:
authorPaweł Kołodziejski2003-01-30 08:10:16 +0000
committerPaweł Kołodziejski2003-01-30 08:10:16 +0000
commitb9fe3651021fb243f2984b8f5e61c5652961e808 (patch)
tree769fc184bf76cf1da362ce15876732aac79ca7b9 /scumm/string.cpp
parent2c755a1f3129ff14d44262ab7979dc7945303b6b (diff)
downloadscummvm-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.cpp183
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;
}
}
}