SHERLOCK: SS: fix talkInterf to handle int. chars

so that line wrapping works properly for international versions
This commit is contained in:
Martin Kiewitz 2015-06-14 21:14:17 +02:00
parent 133b4defe9
commit f713094c64
3 changed files with 18 additions and 4 deletions

View File

@ -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;

View File

@ -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();

View File

@ -207,6 +207,7 @@ private:
* the amount of text that's been displayed
*/
int waitForMore(int delay);
protected:
SherlockEngine *_vm;
OpcodeMethod *_opcodeTable;
@ -254,6 +255,11 @@ protected:
OpcodeReturn cmdToggleObject(const byte *&str);
OpcodeReturn cmdWalkToCAnimation(const byte *&str);
protected:
/**
* Checks, if a character is an opcode
*/
inline bool isOpcode(byte checkCharacter);
/**
* Display the talk interface window
*/