SCUMM: (DIG/CJK) - fix blast text rendering and positioning

- fix getStringWidth()
- fix string translation
- skip special newline character when drawing text
This commit is contained in:
athrxx 2020-09-23 22:25:11 +02:00
parent 09a9f4b158
commit afef3d71cb
3 changed files with 18 additions and 5 deletions

View file

@ -331,8 +331,11 @@ int CharsetRenderer::getStringWidth(int arg, const byte *text) {
int code = (_vm->_game.heversion >= 80) ? 127 : 64;
while ((chr = text[pos++]) != 0) {
if (chr == '\n' || chr == '\r' || chr == _vm->_newLineCharacter)
if (_vm->_game.version == 7 && chr == _vm->_newLineCharacter)
continue;
else if (chr == '\n' || chr == '\r' || chr == _vm->_newLineCharacter)
break;
if (_vm->_game.heversion >= 72) {
if (chr == code) {
chr = text[pos++];
@ -488,7 +491,7 @@ void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth) {
if (_vm->_language == Common::KO_KOR || _vm->_language == Common::ZH_TWN) {
curw++;
}
} else {
} else if (chr != _vm->_newLineCharacter) {
curw += getCharWidth(chr);
}
} else {

View file

@ -41,6 +41,16 @@ static inline bool checkSJISCode(byte c) {
return false;
}
static inline bool is2ByteCharacter(Common::Language lang, byte c) {
if (lang == Common::JA_JPN)
return (c >= 0x80 && c <= 0x9F) || (c >= 0xE0 && c <= 0xFD);
else if (lang == Common::KO_KOR)
return (c >= 0xB0 && c <= 0xD0);
else if (lang == Common::ZH_TWN || lang == Common::ZH_CNA)
return (c >= 0x80);
return false;
}
class CharsetRenderer {
public:

View file

@ -180,7 +180,7 @@ void ScummEngine_v6::drawBlastTexts() {
// Some localizations may override colors
// See credits in Chinese COMI
if (_game.id == GID_CMI && _language == Common::ZH_TWN &&
if (_game.id == GID_CMI && _language == Common::ZH_TWN &&
c == '^' && (buf == _blastTextQueue[i].text + 1)) {
if (*buf == 'c') {
int color = buf[3] - '0' + 10 *(buf[2] - '0');
@ -191,7 +191,7 @@ void ScummEngine_v6::drawBlastTexts() {
}
}
if (c != 0 && c != 0xFF && c != '\n') {
if (c != 0 && c != 0xFF && c != '\n' && c != _newLineCharacter) {
if (c & 0x80 && _useCJKMode) {
if (_language == Common::JA_JPN && !checkSJISCode(c)) {
c = 0x20; //not in S-JIS
@ -1302,7 +1302,7 @@ int ScummEngine::convertMessageToString(const byte *msg, byte *dst, int dstSize)
num += (_game.version == 8) ? 4 : 2;
}
} else {
if ((chr != '@') || (_game.id == GID_CMI && _language == Common::ZH_TWN) ||
if ((chr != '@') || (_game.version >= 7 && is2ByteCharacter(_language, lastChr)) ||
(_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine && _language == Common::JA_JPN) ||
(_game.platform == Common::kPlatformFMTowns && _language == Common::JA_JPN && checkSJISCode(lastChr))) {
*dst++ = chr;