diff options
author | Max Horn | 2004-10-23 23:08:53 +0000 |
---|---|---|
committer | Max Horn | 2004-10-23 23:08:53 +0000 |
commit | b60febe8a81120a21c2346bb8bc4255038b695e8 (patch) | |
tree | 57aa745c3b460152db976ecf1bf6d78ef6e03d14 /scumm/string.cpp | |
parent | e8811e71584ff4f4530b462e0b390281fadba88b (diff) | |
download | scummvm-rg350-b60febe8a81120a21c2346bb8bc4255038b695e8.tar.gz scummvm-rg350-b60febe8a81120a21c2346bb8bc4255038b695e8.tar.bz2 scummvm-rg350-b60febe8a81120a21c2346bb8bc4255038b695e8.zip |
Patch #1048283 (Improved CJK / FM-TOWNS support & some documention)
svn-id: r15671
Diffstat (limited to 'scumm/string.cpp')
-rw-r--r-- | scumm/string.cpp | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/scumm/string.cpp b/scumm/string.cpp index 36f033fcdf..362864acff 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -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); |