diff options
author | Max Horn | 2010-12-02 00:27:26 +0000 |
---|---|---|
committer | Max Horn | 2010-12-02 00:27:26 +0000 |
commit | e85d196f33a1974bf1fe6088e6eb41c3c20c221f (patch) | |
tree | ac62095941e716e70bb723ea9e76bd5a68981fdd /engines/scumm | |
parent | b36b7ee3493dbf086ffb6aba4a3cb5b5daa4d7d7 (diff) | |
download | scummvm-rg350-e85d196f33a1974bf1fe6088e6eb41c3c20c221f.tar.gz scummvm-rg350-e85d196f33a1974bf1fe6088e6eb41c3c20c221f.tar.bz2 scummvm-rg350-e85d196f33a1974bf1fe6088e6eb41c3c20c221f.zip |
SCUMM: Fix bug in V12 games causing chars to be lost when wrapping talk text
svn-id: r54729
Diffstat (limited to 'engines/scumm')
-rw-r--r-- | engines/scumm/scumm.h | 1 | ||||
-rw-r--r-- | engines/scumm/string.cpp | 54 |
2 files changed, 31 insertions, 24 deletions
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 0a513b6068..1f083db4a0 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -1246,6 +1246,7 @@ protected: virtual bool handleNextCharsetCode(Actor *a, int *c); virtual void CHARSET_1(); + bool newLine(); void drawString(int a, const byte *msg); void debugMessage(const byte *msg); void showMessageDialog(const byte *msg); diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index aa099b1b57..10e2aacc26 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -426,6 +426,33 @@ bool ScummEngine_v72he::handleNextCharsetCode(Actor *a, int *code) { } #endif +bool ScummEngine::newLine() { + _nextLeft = _string[0].xpos; + if (_charset->_center) { + _nextLeft -= _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) / 2; + if (_nextLeft < 0) + _nextLeft = _game.version >= 6 ? _string[0].xpos : 0; + } + + if (_game.version == 0) { + return false; + } else if (!(_game.platform == Common::kPlatformFMTowns) && _string[0].height) { + _nextTop += _string[0].height; + } else { + bool useCJK = _useCJKMode; + // SCUMM5 FM-Towns doesn't use the height of the ROM font here. + if (_game.platform == Common::kPlatformFMTowns && _game.version == 5) + _useCJKMode = false; + _nextTop += _charset->getFontHeight(); + _useCJKMode = useCJK; + } + if (_game.version > 3) { + // FIXME: is this really needed? + _charset->_disableOffsX = true; + } + return true; +} + void ScummEngine::CHARSET_1() { Actor *a; #ifdef ENABLE_SCUMM_7_8 @@ -579,36 +606,14 @@ void ScummEngine::CHARSET_1() { } if (c == 13) { - newLine:; - _nextLeft = _string[0].xpos; #ifdef ENABLE_SCUMM_7_8 if (_game.version >= 7 && subtitleLine != subtitleBuffer) { ((ScummEngine_v7 *)this)->addSubtitleToQueue(subtitleBuffer, subtitlePos, _charsetColor, _charset->getCurID()); subtitleLine = subtitleBuffer; } #endif - if (_charset->_center) { - _nextLeft -= _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) / 2; - if (_nextLeft < 0) - _nextLeft = _game.version >= 6 ? _string[0].xpos : 0; - } - - if (_game.version == 0) { + if (!newLine()) break; - } else if (!(_game.platform == Common::kPlatformFMTowns) && _string[0].height) { - _nextTop += _string[0].height; - } else { - bool useCJK = _useCJKMode; - // SCUMM5 FM-Towns doesn't use the height of the ROM font here. - if (_game.platform == Common::kPlatformFMTowns && _game.version == 5) - _useCJKMode = false; - _nextTop += _charset->getFontHeight(); - _useCJKMode = useCJK; - } - if (_game.version > 3) { - // FIXME: is this really needed? - _charset->_disableOffsX = true; - } continue; } @@ -618,7 +623,8 @@ void ScummEngine::CHARSET_1() { } // Handle line breaks for V1-V2 if (_game.version <= 2 && _nextLeft >= _screenWidth) { - goto newLine; + if (!newLine()) + break; // FIXME: Is this necessary? Only would be relevant for v0 games } _charset->_left = _nextLeft; |