aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBLooperZ2018-10-01 15:38:49 +0300
committerEugene Sandulenko2020-01-01 00:31:21 +0100
commit68c6038e9c6e12d9b38b192364b330b5c50f244b (patch)
tree06d7e24f4e3a0f2dda97efb5cad2b3bf12d5c535
parent72471ec431c76f6aee63ef67cf4fd475f942ac47 (diff)
downloadscummvm-rg350-68c6038e9c6e12d9b38b192364b330b5c50f244b.tar.gz
scummvm-rg350-68c6038e9c6e12d9b38b192364b330b5c50f244b.tar.bz2
scummvm-rg350-68c6038e9c6e12d9b38b192364b330b5c50f244b.zip
SCUMM: add RTL support for scumm v4 to v6
-rw-r--r--engines/scumm/string.cpp173
1 files changed, 172 insertions, 1 deletions
diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp
index 112f4127cc..09684a0d84 100644
--- a/engines/scumm/string.cpp
+++ b/engines/scumm/string.cpp
@@ -437,6 +437,8 @@ bool ScummEngine::newLine() {
_nextLeft -= _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) / 2;
if (_nextLeft < 0)
_nextLeft = _game.version >= 6 ? _string[0].xpos : 0;
+ } else if (_game.version >= 4 && true /*IS_HEBREW*/) {
+ _nextLeft = _screenWidth - _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) - _nextLeft;
}
if (_game.version == 0) {
@@ -600,11 +602,80 @@ void ScummEngine::CHARSET_1() {
_nextLeft -= _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) / 2;
if (_nextLeft < 0)
_nextLeft = _game.version >= 6 ? _string[0].xpos : 0;
+ } else if (_game.version >= 4 && true /*IS_HEBREW*/) {
+ _nextLeft = _screenWidth - _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) - _nextLeft;
}
_charset->_disableOffsX = _charset->_firstChar = !_keepText;
int c = 0;
+
+ if (_game.version >= 4 && true /*IS_HEBREW*/) {
+ int ll = 0;
+ char* ltext = (char*)_charsetBuffer + _charsetBufPos;
+ while (ltext[ll] == -1) {
+ ll += 4;
+ }
+
+ int i = 0;
+ int start = 0;
+ char* text = ltext + ll;
+
+
+ // for (int u = 0; u < strlen(text); u++) {
+ // char bufff[20];
+ // sprintf(bufff, "%d-%c\n", text[u], text[u]);
+ // debug(bufff);
+ // }
+
+
+
+ char* current = text;
+ while(1) {
+ if (*current == 13 || *current == 0 || *current == -1 || *current == -2) {
+
+ // ignore the line break for interface texts
+ if (*(current + 1) == 8) {
+ *(current + 1) = *current;
+ *current = 8;
+ i += 2;
+ current += 2;
+ continue;
+ }
+
+ char buf[384] = {0};
+ for (int j = 0; j < i; j++) {
+ buf[j] = text[start + i - j - 1];
+ }
+ memcpy(text + start, buf, i);
+ start += i + 1;
+ i = -1;
+
+ if (*current == -1 || *current == -2) {
+ current++;
+ if (*current == 3) {
+ break;
+ }
+ if (*current == 0x0A) {
+ start += 2;
+ i +=2;
+ current += 2;
+ }
+ start++;
+ i++;
+ current++;
+ continue;
+ }
+ }
+ if (*current) {
+ i++;
+ current++;
+ continue;
+ }
+ break;
+ }
+ }
+
while (handleNextCharsetCode(a, &c)) {
if (c == 0) {
// End of text reached, set _haveMsg accordingly
@@ -874,6 +945,64 @@ void ScummEngine::drawString(int a, const byte *msg) {
convertMessageToString(msg, buf, sizeof(buf));
+ if (_game.version >= 4 && true /*TODO: IS_HEBREW*/) {
+ int ll = 0;
+ char* ltext = (char*)buf;
+ while (ltext[ll] == -1) {
+ ll += 4;
+ }
+ // for (int u = 0; u < strlen(ltext + ll); u++) {
+ // char buf[384] = {0};
+ // sprintf(buf, "%d - %c\n", (ltext + ll)[u], (ltext + ll)[u]);
+ // debugN(buf);
+ // }
+ // char buf[384] = {0};
+ // sprintf(buf, "LL: %d", ll);
+ // warning(buf);
+ byte fin[270] = {0};
+
+ memcpy(fin, ltext, ll);
+ int i = 0;
+ int start = 0;
+ char* text = (char*)ltext + ll;
+ strncpy((char*)fin + ll, text, strlen(text));
+ char* current = text;
+ while(1) {
+ if (*current == 13 || *current == 0 || *current == -1 || *current == -2) {
+ char buff[384] = {0};
+ for (int j = 0; j < i; j++) {
+ buff[j] = text[start + i - j - 1];
+ }
+ memcpy(fin + ll + start, buff, i);
+ start += i + 1;
+ i = -1;
+ if (*current == -1 || *current == -2) {
+ current++;
+ if (*current == 3) {
+ break;
+ }
+ if (*current == 0x0A) {
+ start += 2;
+ i +=2;
+ current += 2;
+ }
+ start++;
+ i++;
+ current++;
+ continue;
+ }
+ }
+ if (*current) {
+ i++;
+ current++;
+ continue;
+ }
+ break;
+ }
+ memcpy(buf, fin, start + i + ll);
+ }
+
+
_charset->_top = _string[a].ypos + _screenTop;
_charset->_startLeft = _charset->_left = _string[a].xpos;
_charset->_right = _string[a].right;
@@ -933,6 +1062,27 @@ void ScummEngine::drawString(int a, const byte *msg) {
if (_charset->_center) {
_charset->_left -= _charset->getStringWidth(a, buf) / 2;
+ } else if (_game.version >= 4 && true /*IS_HEBREW*/) {
+ if (_charset->getStringWidth(a, buf) > _screenWidth) {
+ int ll = 0;
+ byte* ltext = buf;
+ while (ltext[ll] == 0xFF) {
+ ll += 4;
+ }
+ byte lenbuf[270] = {0};
+ memcpy(lenbuf, ltext, ll);
+ int i = ll;
+ while (ltext[i]) {
+ if ((ltext[i] == 0xFF || (_game.version <= 6 && ltext[i] == 0xFE)) && ltext[i+1] == 8) {
+ break;
+ }
+ i++;
+ }
+ memcpy(lenbuf, ltext, i);
+ _charset->_left = _screenWidth - _charset->_startLeft - _charset->getStringWidth(a, lenbuf);
+ } else {
+ _charset->_left = _screenWidth - _charset->_startLeft - _charset->getStringWidth(a, buf);
+ }
}
if (!buf[0]) {
@@ -975,6 +1125,27 @@ void ScummEngine::drawString(int a, const byte *msg) {
case 8:
if (_charset->_center) {
_charset->_left = _charset->_startLeft - _charset->getStringWidth(a, buf + i);
+ } else if (_game.version >= 4 && true /*IS_HEBREW*/) {
+ if (_charset->getStringWidth(a, buf + i) > _screenWidth) {
+ int ll = 0;
+ byte* ltext = buf + i;
+ while (ltext[ll] == 0xFF) {
+ ll += 4;
+ }
+ byte lenbuf[270] = {0};
+ memcpy(lenbuf, ltext, ll);
+ int u = ll;
+ while (ltext[u]) {
+ if ((ltext[u] == 0xFF || (_game.version <= 6 && ltext[u] == 0xFE)) && ltext[u + 1] == 8) {
+ break;
+ }
+ u++;
+ }
+ memcpy(lenbuf, ltext, u);
+ _charset->_left = _screenWidth - _charset->_startLeft - _charset->getStringWidth(a, lenbuf);
+ } else {
+ _charset->_left = _screenWidth - _charset->_startLeft - _charset->getStringWidth(a, buf + i);
+ }
} else {
_charset->_left = _charset->_startLeft;
}
@@ -1057,7 +1228,7 @@ int ScummEngine::convertMessageToString(const byte *msg, byte *dst, int dstSize)
} else {
src = msg;
}
-
+
num = 0;
while (1) {