aboutsummaryrefslogtreecommitdiff
path: root/scumm/string.cpp
diff options
context:
space:
mode:
authorMax Horn2004-10-23 23:08:53 +0000
committerMax Horn2004-10-23 23:08:53 +0000
commitb60febe8a81120a21c2346bb8bc4255038b695e8 (patch)
tree57aa745c3b460152db976ecf1bf6d78ef6e03d14 /scumm/string.cpp
parente8811e71584ff4f4530b462e0b390281fadba88b (diff)
downloadscummvm-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.cpp52
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);