aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMartin Kiewitz2015-06-14 21:14:17 +0200
committerMartin Kiewitz2015-06-14 21:14:17 +0200
commitf713094c6427e22c442b9b98be0f79d383d32b23 (patch)
tree09aa80edfc88a92221735f9bba471c208f430776 /engines
parent133b4defe9f37ac1b2198b843282ab0b0a0e7b6b (diff)
downloadscummvm-rg350-f713094c6427e22c442b9b98be0f79d383d32b23.tar.gz
scummvm-rg350-f713094c6427e22c442b9b98be0f79d383d32b23.tar.bz2
scummvm-rg350-f713094c6427e22c442b9b98be0f79d383d32b23.zip
SHERLOCK: SS: fix talkInterf to handle int. chars
so that line wrapping works properly for international versions
Diffstat (limited to 'engines')
-rw-r--r--engines/sherlock/scalpel/scalpel_talk.cpp6
-rw-r--r--engines/sherlock/talk.cpp10
-rw-r--r--engines/sherlock/talk.h6
3 files changed, 18 insertions, 4 deletions
diff --git a/engines/sherlock/scalpel/scalpel_talk.cpp b/engines/sherlock/scalpel/scalpel_talk.cpp
index c514ab1522..c86720f778 100644
--- a/engines/sherlock/scalpel/scalpel_talk.cpp
+++ b/engines/sherlock/scalpel/scalpel_talk.cpp
@@ -214,10 +214,10 @@ void ScalpelTalk::talkInterface(const byte *&str) {
width += screen.charWidth(str[idx]);
++idx;
++_charCount;
- } while (width < 298 && str[idx] && str[idx] != '{' && str[idx] < _opcodes[0]);
+ } while (width < 298 && str[idx] && str[idx] != '{' && (!isOpcode(str[idx])));
if (str[idx] || width >= 298) {
- if (str[idx] < _opcodes[0] && str[idx] != '{') {
+ if ((!isOpcode(str[idx])) && str[idx] != '{') {
--idx;
--_charCount;
}
@@ -261,7 +261,7 @@ void ScalpelTalk::talkInterface(const byte *&str) {
str += idx;
// If line wrap occurred, then move to after the separating space between the words
- if (str[0] < _opcodes[0] && str[0] != '{')
+ if ((!isOpcode(str[0])) && str[0] != '{')
++str;
_yp += 9;
diff --git a/engines/sherlock/talk.cpp b/engines/sherlock/talk.cpp
index a349d7193d..6b122b4f1e 100644
--- a/engines/sherlock/talk.cpp
+++ b/engines/sherlock/talk.cpp
@@ -1059,7 +1059,7 @@ void Talk::doScript(const Common::String &script) {
// Start of comment, so skip over it
while (*str++ != '}')
;
- } else if (c >= _opcodes[0] && c < (_opcodes[0] + 99) && _opcodeTable[c - _opcodes[0]]) {
+ } else if (isOpcode(c)) {
// Handle control code
switch ((this->*_opcodeTable[c - _opcodes[0]])(str)) {
case RET_EXIT:
@@ -1200,6 +1200,14 @@ int Talk::waitForMore(int delay) {
return key2;
}
+inline bool Talk::isOpcode(byte checkCharacter) {
+ if ((checkCharacter < _opcodes[0]) || (checkCharacter >= (_opcodes[0] + 99)))
+ return false; // outside of range
+ if (_opcodeTable[checkCharacter - _opcodes[0]])
+ return true;
+ return false;
+}
+
void Talk::popStack() {
if (!_scriptStack.empty()) {
ScriptStackEntry scriptEntry = _scriptStack.pop();
diff --git a/engines/sherlock/talk.h b/engines/sherlock/talk.h
index 6695e4ea08..563f780365 100644
--- a/engines/sherlock/talk.h
+++ b/engines/sherlock/talk.h
@@ -207,6 +207,7 @@ private:
* the amount of text that's been displayed
*/
int waitForMore(int delay);
+
protected:
SherlockEngine *_vm;
OpcodeMethod *_opcodeTable;
@@ -255,6 +256,11 @@ protected:
OpcodeReturn cmdWalkToCAnimation(const byte *&str);
protected:
/**
+ * Checks, if a character is an opcode
+ */
+ inline bool isOpcode(byte checkCharacter);
+
+ /**
* Display the talk interface window
*/
virtual void talkInterface(const byte *&str) = 0;