Patch #1048283 (Improved CJK / FM-TOWNS support & some documention)

svn-id: r15671
This commit is contained in:
Max Horn
2004-10-23 23:08:53 +00:00
parent e8811e7158
commit b60febe8a8
5 changed files with 227 additions and 96 deletions
+45 -7
View File
@@ -103,6 +103,8 @@ void ScummEngine::CHARSET_1() {
int code = (_heversion >= 80) ? 127 : 64;
char value[32];
bool cmi_pos_hack = false;
if (!_haveMsg)
return;
@@ -283,6 +285,11 @@ void ScummEngine::CHARSET_1() {
warning("CHARSET_1: invalid code %d", c);
}
} else if (c == 0xFE || c == 0xFF) {
//WORKAROUND
//to avoid korean code 0xfe treated as charset message code.
if(c == 0xFE && checkKSCode(*(buffer + 1), c) && _useCJKMode) {
goto loc_avoid_ks_fe;
}
c = *buffer++;
switch (c) {
case 1:
@@ -343,13 +350,19 @@ void ScummEngine::CHARSET_1() {
warning("CHARSET_1: invalid code %d", c);
}
} else {
loc_avoid_ks_fe:
_charset->_left = _charset->_nextLeft;
_charset->_top = _charset->_nextTop;
if (c & 0x80 && _useCJKMode)
if (_language == 6 && ((c > 0x84 && c < 0x88) || (c > 0x9f && c < 0xe0) || (c > 0xea && c <= 0xff)))
if (_language == Common::JA_JPN && !checkSJISCode(c)) {
c = 0x20; //not in S-JIS
else
c += *buffer++ * 256;
} else {
c += *buffer++ * 256; //LE
if(_gameId == GID_CMI) { //HACK: This fixes korean text position in COMI (off by 6 pixel)
cmi_pos_hack = true;
_charset->_top += 6;
}
}
if (_version <= 3) {
_charset->printChar(c);
} else {
@@ -363,6 +376,10 @@ void ScummEngine::CHARSET_1() {
} else
_charset->printChar(c);
}
if(cmi_pos_hack) {
cmi_pos_hack = false;
_charset->_top -= 6;
}
_charset->_nextLeft = _charset->_left;
_charset->_nextTop = _charset->_top;
@@ -389,6 +406,8 @@ void ScummEngine::drawString(int a, const byte *msg) {
uint color;
int code = (_heversion >= 80) ? 127 : 64;
bool cmi_pos_hack = false;
addMessageToStack(msg, buf, sizeof(buf));
_charset->_top = _string[a].ypos + _screenTop;
@@ -491,10 +510,24 @@ void ScummEngine::drawString(int a, const byte *msg) {
_charset->_blitAlso = true;
}
}
if (c >= 0x80 && _useCJKMode)
c += buf[i++] * 256;
if (c & 0x80 && _useCJKMode) {
if (_language == Common::JA_JPN && !checkSJISCode(c)) {
c = 0x20; //not in S-JIS
} else {
c += buf[i++] * 256;
if(_gameId == GID_CMI) {
cmi_pos_hack = true;
_charset->_top += 6;
}
}
}
_charset->printChar(c);
_charset->_blitAlso = false;
if(cmi_pos_hack) {
cmi_pos_hack = false;
_charset->_top -= 6;
}
}
}
@@ -729,8 +762,13 @@ void ScummEngine::drawBlastTexts() {
do {
c = *buf++;
if (c != 0 && c != 0xFF) {
if (c >= 0x80 && _useCJKMode)
c += *buf++ * 256;
if (c & 0x80 && _useCJKMode) {
if (_language == Common::JA_JPN && !checkSJISCode(c)) {
c = 0x20; //not in S-JIS
} else {
c += *buf++ * 256;
}
}
_charset->printChar(c);
}
} while (c);