[Scummvm-git-logs] scummvm master -> e6ba0eff15ea6c0dec362f34405a6296e074f91e
athrxx
noreply at scummvm.org
Thu Jun 23 17:06:39 UTC 2022
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f1d7599cf4 KYRA: (LoK) - avoid starting the same song twice after loading savegame
a7fae9ff4e KYRA: (LoK/ZH) - minor text field adjustment
a99055617b KYRA: (LoK/Floppy) - fix minor animator glitch
e6ba0eff15 KYRA: (DOS/CD) - add workaround for text glitch
Commit: f1d7599cf4540312211f4450650bf61b462dd8b0
https://github.com/scummvm/scummvm/commit/f1d7599cf4540312211f4450650bf61b462dd8b0
Author: athrxx (athrxx at scummvm.org)
Date: 2022-06-23T19:05:53+02:00
Commit Message:
KYRA: (LoK) - avoid starting the same song twice after loading savegame
(The game restarts the last song which is stored in the savegame, but for many scenes the scene entry scripts will start the same song again right afterwards. This causes some audible "stuttering".
HOF and MR don't seem to require this fix. For these games the music restart is controlled via the last argument of enterNewScene(). If it is set to 1 then no song will be started. And that is what happens when calling from loadGameState()...
Changed paths:
engines/kyra/gui/saveload_lok.cpp
diff --git a/engines/kyra/gui/saveload_lok.cpp b/engines/kyra/gui/saveload_lok.cpp
index 37650d67042..307a40f21b2 100644
--- a/engines/kyra/gui/saveload_lok.cpp
+++ b/engines/kyra/gui/saveload_lok.cpp
@@ -129,11 +129,9 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) {
_sound->selectAudioResourceSet(kMusicIngame);
closeFinalWsa();
- if (header.version >= 3) {
- _lastMusicCommand = in->readSint16BE();
- if (_lastMusicCommand != -1)
- snd_playWanderScoreViaMap(_lastMusicCommand, 1);
- }
+ int lastMusicCommand = _lastMusicCommand = -1;
+ if (header.version >= 3)
+ lastMusicCommand = in->readSint16BE();
// Version 4 stored settings in the savegame. As of version 5, they are
// handled by the config manager.
@@ -215,6 +213,13 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) {
enterNewScene(_currentCharacter->sceneId, _currentCharacter->facing, 0, 0, 1);
+ // Check if _lastMusicCommand changed during enterNewScene(). If it didn't (no song was
+ // started from script) and we do have the last song id from our savegame, then we start that...
+ // This way we avoid the "stuttering" we used to have from restarting the saved song and
+ // then the same song again directly afterwards from script...
+ if (_lastMusicCommand == -1 && lastMusicCommand != -1)
+ snd_playWanderScoreViaMap(lastMusicCommand, 1);
+
_animator->animRefreshNPC(0);
_animator->restoreAllObjectBackgrounds();
_animator->preserveAnyChangedBackgrounds();
Commit: a7fae9ff4e9e3cb76f6f3093f9d905a874366b32
https://github.com/scummvm/scummvm/commit/a7fae9ff4e9e3cb76f6f3093f9d905a874366b32
Author: athrxx (athrxx at scummvm.org)
Date: 2022-06-23T19:05:58+02:00
Commit Message:
KYRA: (LoK/ZH) - minor text field adjustment
Shouldn't make a visible difference, but it is more correct this way. The actual bug I was trying to fix ("cut off" Herman's head appearing after restoring text background) is actually an animator code bug...
Changed paths:
engines/kyra/text/text.cpp
engines/kyra/text/text_lok.cpp
engines/kyra/text/text_mr.cpp
diff --git a/engines/kyra/text/text.cpp b/engines/kyra/text/text.cpp
index 18e9ac41e80..34b53315a80 100644
--- a/engines/kyra/text/text.cpp
+++ b/engines/kyra/text/text.cpp
@@ -34,7 +34,7 @@ TextDisplayer::TextDisplayer(KyraEngine_v1 *vm, Screen *screen) {
_talkMessageY = 0xC;
_talkMessageH = 0;
_talkMessagePrinted = false;
- _langExtraSpacing = (vm->gameFlags().lang == Common::KO_KOR) ? 1 : 0;
+ _langExtraSpacing = (vm->gameFlags().lang == Common::KO_KOR) ? 2 : 0;
_lineBreakChar = (_vm->gameFlags().platform == Common::kPlatformMacintosh) ? '\n' : '\r';
memset(_talkSubstrings, 0, sizeof(_talkSubstrings));
memset(_talkBuffer, 0, sizeof(_talkBuffer));
@@ -203,12 +203,12 @@ void TextDisplayer::printTalkTextMessage(const char *text, int x, int y, uint8 c
w = MIN<int>(w, 302);
}
- int top = y - lineCount * (_screen->getFontHeight() + _screen->_lineSpacing) - _langExtraSpacing;
+ int top = y - (lineCount * _screen->getFontHeight() + (lineCount - 1) * _screen->_lineSpacing) - _langExtraSpacing;
if (top < marginTop)
top = marginTop;
_talkMessageY = top;
- _talkMessageH = lineCount * (_screen->getFontHeight() + _screen->_lineSpacing) + _langExtraSpacing;
+ _talkMessageH = (lineCount * _screen->getFontHeight() + (lineCount - 1) * _screen->_lineSpacing) + _langExtraSpacing;
int x1 = 12;
int x2 = Screen::SCREEN_W - 12;
@@ -252,7 +252,7 @@ void TextDisplayer::printText(const Common::String &str, int x, int y, uint8 c0,
_screen->setTextColor(colorMap, 0, 3);
_screen->_charSpacing = -2;
int ls = _screen->_lineSpacing;
- _screen->_lineSpacing = _langExtraSpacing;
+ _screen->_lineSpacing = _langExtraSpacing >> 1;
_screen->printText(tmp, x, y, c0, c2);
_screen->_charSpacing = 0;
_screen->_lineSpacing = ls;
diff --git a/engines/kyra/text/text_lok.cpp b/engines/kyra/text/text_lok.cpp
index 9b23e2c45c9..6de1b37f063 100644
--- a/engines/kyra/text/text_lok.cpp
+++ b/engines/kyra/text/text_lok.cpp
@@ -282,10 +282,10 @@ void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int16 charN
int16 yPos = _characterList[charNum].y1;
yPos -= ((_scaleTable[yPos] * _characterList[charNum].height) >> 8);
yPos -= 8;
- yPos -= lineNum * (_screen->getFontHeight() + _screen->_lineSpacing);
+ yPos -= (lineNum * _screen->getFontHeight() + (lineNum - 1) * _screen->_lineSpacing);
_text->_talkMessageY = (_flags.lang == Common::ZH_TWN) ? CLIP<int>(yPos, 10, 80) : CLIP<int>(yPos, 11, 100);
- _text->_talkMessageH = lineNum * (_screen->getFontHeight() + _screen->_lineSpacing) + _text->_langExtraSpacing;
+ _text->_talkMessageH = lineNum * _screen->getFontHeight() + (lineNum - 1) * _screen->_lineSpacing + _text->_langExtraSpacing;
const bool printText = textEnabled();
@@ -293,7 +293,7 @@ void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int16 charN
_animator->restoreAllObjectBackgrounds();
_screen->copyRegion(8, _text->_talkMessageY, 8, 136, 304, _text->_talkMessageH, 2, 2);
-
+
_text->printCharacterText(processedString, charNum, _characterList[charNum].x1);
}
diff --git a/engines/kyra/text/text_mr.cpp b/engines/kyra/text/text_mr.cpp
index 36351828edb..059e7590ae9 100644
--- a/engines/kyra/text/text_mr.cpp
+++ b/engines/kyra/text/text_mr.cpp
@@ -271,7 +271,7 @@ void KyraEngine_MR::objectChatInit(const char *str, int object, int vocHigh, int
xPos = _talkObjectList[object].x;
}
- _text->_talkMessageH = lineNum * (_screen->getFontHeight() + _screen->_lineSpacing);
+ _text->_talkMessageH = lineNum * _screen->getFontHeight() + (lineNum - 1) * _screen->_lineSpacing;
yPos -= _text->_talkMessageH;
yPos = MAX(yPos, 0);
_text->_talkMessageY = yPos;
@@ -548,7 +548,7 @@ void KyraEngine_MR::albumChatInit(const char *str, int object, int vocHigh, int
xPos = _talkObjectList[object].x;
}
- _text->_talkMessageH = lineNum * (_screen->getFontHeight() + _screen->_lineSpacing);
+ _text->_talkMessageH = lineNum * _screen->getFontHeight() + (lineNum - 1) * _screen->_lineSpacing;
yPos -= _text->_talkMessageH;
yPos = MAX(yPos, 0);
_text->_talkMessageY = yPos;
Commit: a99055617b0f9f1740ad49e58e077feebe47f268
https://github.com/scummvm/scummvm/commit/a99055617b0f9f1740ad49e58e077feebe47f268
Author: athrxx (athrxx at scummvm.org)
Date: 2022-06-23T19:06:04+02:00
Commit Message:
KYRA: (LoK/Floppy) - fix minor animator glitch
(in the first cave, when trying to cross the broken bridge and falling into the river, a "cut off" Herman's head could appear on screen beside the death dialog)
The animator code is a bit different here between versions. Our code was apparently based only on DOS CD (Talkie).
Changed paths:
engines/kyra/engine/kyra_lok.cpp
engines/kyra/engine/kyra_lok.h
engines/kyra/graphics/animator_lok.cpp
engines/kyra/text/text_lok.cpp
diff --git a/engines/kyra/engine/kyra_lok.cpp b/engines/kyra/engine/kyra_lok.cpp
index 677d9b67869..6c4685d2f77 100644
--- a/engines/kyra/engine/kyra_lok.cpp
+++ b/engines/kyra/engine/kyra_lok.cpp
@@ -254,7 +254,7 @@ Common::Error KyraEngine_LoK::init() {
memset(_flagsTable, 0, sizeof(_flagsTable));
_talkingCharNum = -1;
- _charSayUnk3 = -1;
+ _talkHeadAnimCharNum = -1;
_disabledTalkAnimObject = _enabledTalkAnimObject = 0;
memset(_currSentenceColor, 0, 3);
_startSentencePalIndex = -1;
diff --git a/engines/kyra/engine/kyra_lok.h b/engines/kyra/engine/kyra_lok.h
index 54f9fd389ed..a34f9522089 100644
--- a/engines/kyra/engine/kyra_lok.h
+++ b/engines/kyra/engine/kyra_lok.h
@@ -468,7 +468,7 @@ protected:
int8 _talkingCharNum;
int8 _charSayUnk2;
- int8 _charSayUnk3;
+ int8 _talkHeadAnimCharNum;
int8 _currHeadShape;
int _currentHeadFrameTableIndex;
int8 _disabledTalkAnimObject;
diff --git a/engines/kyra/graphics/animator_lok.cpp b/engines/kyra/graphics/animator_lok.cpp
index 499d3178875..2087246c927 100644
--- a/engines/kyra/graphics/animator_lok.cpp
+++ b/engines/kyra/graphics/animator_lok.cpp
@@ -201,13 +201,13 @@ void Animator_LoK::preserveOrRestoreBackground(AnimObject *obj, bool restore) {
void Animator_LoK::prepDrawAllObjects() {
AnimObject *curObject = _objectQueue;
int drawPage = 2;
- int flagUnk1 = 0, flagUnk2 = 0, flagUnk3 = 0;
+ int invisibilityDrawFlag = 0, blurDrawFlag = 0, fadeDrawFlag = 0;
if (_noDrawShapesFlag)
return;
if (_vm->_brandonStatusBit & 0x20)
- flagUnk1 = 0x200;
+ invisibilityDrawFlag = Screen::kDRAWSHP_PREDATOR;
if (_vm->_brandonStatusBit & 0x40)
- flagUnk2 = 0x4000;
+ blurDrawFlag = Screen::kDRAWSHP_MORPH;
while (curObject) {
if (curObject->active) {
@@ -215,90 +215,85 @@ void Animator_LoK::prepDrawAllObjects() {
int ypos = curObject->y1;
int drawLayer = 0;
- if (!(curObject->flags & 0x800))
+ if (!(curObject->flags & Screen::kDRAWSHP_PRIORITY))
drawLayer = 7;
else if (curObject->disable)
drawLayer = 0;
else
drawLayer = _vm->_sprites->getDrawLayer(curObject->drawY);
- // talking head functionallity
- if (_vm->_talkingCharNum != -1 && (_vm->_currentCharacter->currentAnimFrame != 88 || curObject->index != 0)) {
- const int16 baseAnimFrameTable1[] = { 0x11, 0x35, 0x59, 0x00, 0x00, 0x00 };
- const int16 baseAnimFrameTable2[] = { 0x15, 0x39, 0x5D, 0x00, 0x00, 0x00 };
- const int8 xOffsetTable1[] = { 2, 4, 0, 5, 2, 0, 0, 0 };
- const int8 xOffsetTable2[] = { 6, 4, 8, 3, 6, 0, 0, 0 };
- const int8 yOffsetTable1[] = { 0, 8, 1, 1, 0, 0, 0, 0 };
- const int8 yOffsetTable2[] = { 0, 8, 1, 1, 0, 0, 0, 0 };
- if (curObject->index == 0 || curObject->index <= 4) {
+ // Talking head functionallity
+ // DOS Floppy, Amiga and Mac work differently than DOS Talkie. PC-98 and FM-Towns are similar to DOS Talkie, but also slightly different.
+ bool fmTownsOrPC98 = (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98);
+ if (_vm->_talkingCharNum != -1 && (fmTownsOrPC98 || (_vm->gameFlags().isTalkie ?
+ (_vm->_currentCharacter->currentAnimFrame != 88 || curObject->index != 0) : (_brandonScaleX == 0x100 || !_vm->_scaleMode)))) {
+ const int16 baseAnimFrameTable1[] = { 0x11, 0x35, 0x59, 0x00, 0x00 };
+ const int16 baseAnimFrameTable2[] = { 0x15, 0x39, 0x5D, 0x00, 0x00 };
+ const int8 xOffsetTable1[] = { 2, 4, 0, 5, 2, };
+ const int8 xOffsetTable2[] = { 6, 4, 8, 3, 6, };
+ const int8 yOffsetTable[] = { 0, 8, 1, 1, 0, };
+ if (curObject->index <= 4) {
int shapesIndex = 0;
- if (curObject->index == _vm->_charSayUnk3) {
+ if (curObject->index == _vm->_talkHeadAnimCharNum)
shapesIndex = _vm->_currHeadShape + baseAnimFrameTable1[curObject->index];
- } else {
+ else if (curObject->index != 2 || _vm->_characterList[2].sceneId == 77 || _vm->_characterList[2].sceneId == 86)
shapesIndex = baseAnimFrameTable2[curObject->index];
- int temp2 = 0;
- if (curObject->index == 2) {
- if (_vm->_characterList[2].sceneId == 77 || _vm->_characterList[2].sceneId == 86)
- temp2 = 1;
- else
- temp2 = 0;
- } else {
- temp2 = 1;
- }
-
- if (!temp2)
- shapesIndex = -1;
- }
+ else
+ shapesIndex = -1;
xpos = curObject->x1;
ypos = curObject->y1;
int tempX = 0, tempY = 0;
- if (curObject->flags & 0x1) {
- tempX = (xOffsetTable1[curObject->index] * _brandonScaleX) >> 8;
- tempY = yOffsetTable1[curObject->index];
+ if (curObject->flags & Screen::kDRAWSHP_XFLIP) {
+ tempX = xOffsetTable1[curObject->index];
+ tempY = yOffsetTable[curObject->index];
} else {
- tempX = (xOffsetTable2[curObject->index] * _brandonScaleX) >> 8;
- tempY = yOffsetTable2[curObject->index];
+ tempX = xOffsetTable2[curObject->index];
+ tempY = yOffsetTable[curObject->index];
}
- tempY = (tempY * _brandonScaleY) >> 8;
+
+ if (_vm->gameFlags().isTalkie || fmTownsOrPC98) {
+ tempX = (tempX * _brandonScaleX) >> 8;
+ tempY = (tempY * _brandonScaleY) >> 8;
+ if (_vm->_scaleMode && _brandonScaleX != 0x100)
+ ++tempX;
+ }
+
xpos += tempX;
ypos += tempY;
- if (_vm->_scaleMode && _brandonScaleX != 256)
- ++xpos;
-
if (curObject->index == 0 && shapesIndex != -1) {
if (!(_vm->_brandonStatusBit & 2)) {
- flagUnk3 = 0x100;
- if ((flagUnk1 & 0x200) || (flagUnk2 & 0x4000))
- flagUnk3 = 0;
+ fadeDrawFlag = Screen::kDRAWSHP_FADE;
+ if ((invisibilityDrawFlag & Screen::kDRAWSHP_PREDATOR) || (blurDrawFlag & Screen::kDRAWSHP_MORPH))
+ fadeDrawFlag = 0;
int tempFlags = 0;
- if (flagUnk3 & 0x100) {
- tempFlags = curObject->flags & 1;
- tempFlags |= 0x800 | flagUnk1 | 0x100;
+ if (fadeDrawFlag & Screen::kDRAWSHP_FADE) {
+ tempFlags = curObject->flags & Screen::kDRAWSHP_XFLIP;
+ tempFlags |= (Screen::kDRAWSHP_PRIORITY | invisibilityDrawFlag | Screen::kDRAWSHP_FADE);
}
- if (!(flagUnk3 & 0x100) && (flagUnk2 & 0x4000)) {
- tempFlags = curObject->flags & 1;
- tempFlags |= 0x900 | flagUnk1 | 0x4000;
- _screen->drawShape(drawPage, _vm->_shapes[shapesIndex], xpos, ypos, 2, tempFlags | 4, _vm->_brandonPoisonFlagsGFX, int(1), int(_vm->_brandonInvFlag), drawLayer, _brandonScaleX, _brandonScaleY);
+ if (!(fadeDrawFlag & Screen::kDRAWSHP_FADE) && (blurDrawFlag & Screen::kDRAWSHP_MORPH)) {
+ tempFlags = curObject->flags & Screen::kDRAWSHP_XFLIP;
+ tempFlags |= (Screen::kDRAWSHP_PRIORITY | Screen::kDRAWSHP_FADE | invisibilityDrawFlag | Screen::kDRAWSHP_MORPH);
+ _screen->drawShape(drawPage, _vm->_shapes[shapesIndex], xpos, ypos, 2, tempFlags | Screen::kDRAWSHP_SCALE, _vm->_brandonPoisonFlagsGFX, int(1), int(_vm->_brandonInvFlag), drawLayer, _brandonScaleX, _brandonScaleY);
} else {
- if (!(flagUnk2 & 0x4000)) {
- tempFlags = curObject->flags & 1;
- tempFlags |= 0x900 | flagUnk1;
+ if (!(blurDrawFlag & Screen::kDRAWSHP_MORPH)) {
+ tempFlags = curObject->flags & Screen::kDRAWSHP_XFLIP;
+ tempFlags |= (Screen::kDRAWSHP_PRIORITY | Screen::kDRAWSHP_FADE | invisibilityDrawFlag);
}
- _screen->drawShape(drawPage, _vm->_shapes[shapesIndex], xpos, ypos, 2, tempFlags | 4, _vm->_brandonPoisonFlagsGFX, int(1), drawLayer, _brandonScaleX, _brandonScaleY);
+ _screen->drawShape(drawPage, _vm->_shapes[shapesIndex], xpos, ypos, 2, tempFlags | Screen::kDRAWSHP_SCALE, _vm->_brandonPoisonFlagsGFX, int(1), drawLayer, _brandonScaleX, _brandonScaleY);
}
}
} else {
if (shapesIndex != -1) {
int tempFlags = 0;
- if (curObject->flags & 1)
- tempFlags = 1;
- _screen->drawShape(drawPage, _vm->_shapes[shapesIndex], xpos, ypos, 2, tempFlags | 0x800, drawLayer);
+ if (curObject->flags & Screen::kDRAWSHP_XFLIP)
+ tempFlags = Screen::kDRAWSHP_XFLIP;
+ _screen->drawShape(drawPage, _vm->_shapes[shapesIndex], xpos, ypos, 2, tempFlags | Screen::kDRAWSHP_PRIORITY, drawLayer);
}
}
}
@@ -307,34 +302,34 @@ void Animator_LoK::prepDrawAllObjects() {
xpos = curObject->x1;
ypos = curObject->y1;
- curObject->flags |= 0x800;
+ curObject->flags |= Screen::kDRAWSHP_PRIORITY;
if (curObject->index == 0) {
- flagUnk3 = 0x100;
+ fadeDrawFlag = Screen::kDRAWSHP_FADE;
- if (flagUnk1 & 0x200 || flagUnk2 & 0x4000)
- flagUnk3 = 0;
+ if (invisibilityDrawFlag & Screen::kDRAWSHP_PREDATOR || blurDrawFlag & Screen::kDRAWSHP_MORPH)
+ fadeDrawFlag = 0;
if (_vm->_brandonStatusBit & 2)
- curObject->flags &= 0xFFFFFFFE;
+ curObject->flags &= ~Screen::kDRAWSHP_XFLIP;
if (!_vm->_scaleMode) {
- if (flagUnk3 & 0x100)
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | flagUnk1 | 0x100, (uint8 *)_vm->_brandonPoisonFlagsGFX, int(1), drawLayer);
- else if (flagUnk2 & 0x4000)
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | flagUnk1 | 0x4000, int(_vm->_brandonInvFlag), drawLayer);
+ if (fadeDrawFlag & Screen::kDRAWSHP_FADE)
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | invisibilityDrawFlag | Screen::kDRAWSHP_FADE, (uint8 *)_vm->_brandonPoisonFlagsGFX, int(1), drawLayer);
+ else if (blurDrawFlag & Screen::kDRAWSHP_MORPH)
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | invisibilityDrawFlag | Screen::kDRAWSHP_MORPH, int(_vm->_brandonInvFlag), drawLayer);
else
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | flagUnk1, drawLayer);
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | invisibilityDrawFlag, drawLayer);
} else {
- if (flagUnk3 & 0x100)
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | flagUnk1 | 0x104, (uint8 *)_vm->_brandonPoisonFlagsGFX, int(1), drawLayer, _brandonScaleX, _brandonScaleY);
- else if (flagUnk2 & 0x4000)
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | flagUnk1 | 0x4004, int(_vm->_brandonInvFlag), drawLayer, _brandonScaleX, _brandonScaleY);
+ if (fadeDrawFlag & Screen::kDRAWSHP_FADE)
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | invisibilityDrawFlag | Screen::kDRAWSHP_FADE | Screen::kDRAWSHP_SCALE, (uint8 *)_vm->_brandonPoisonFlagsGFX, int(1), drawLayer, _brandonScaleX, _brandonScaleY);
+ else if (blurDrawFlag & Screen::kDRAWSHP_MORPH)
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | invisibilityDrawFlag | Screen::kDRAWSHP_MORPH | Screen::kDRAWSHP_SCALE, int(_vm->_brandonInvFlag), drawLayer, _brandonScaleX, _brandonScaleY);
else
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | flagUnk1 | 0x4, drawLayer, _brandonScaleX, _brandonScaleY);
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | invisibilityDrawFlag | Screen::kDRAWSHP_SCALE, drawLayer, _brandonScaleX, _brandonScaleY);
}
} else {
if (curObject->index >= 16 && curObject->index <= 27)
- _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | 4, drawLayer, (int)_vm->_scaleTable[curObject->drawY], (int)_vm->_scaleTable[curObject->drawY]);
+ _screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags | Screen::kDRAWSHP_SCALE, drawLayer, (int)_vm->_scaleTable[curObject->drawY], (int)_vm->_scaleTable[curObject->drawY]);
else
_screen->drawShape(drawPage, curObject->sceneAnimPtr, xpos, ypos, 2, curObject->flags, drawLayer);
}
diff --git a/engines/kyra/text/text_lok.cpp b/engines/kyra/text/text_lok.cpp
index 6de1b37f063..748f31dcaef 100644
--- a/engines/kyra/text/text_lok.cpp
+++ b/engines/kyra/text/text_lok.cpp
@@ -132,7 +132,7 @@ void KyraEngine_LoK::waitForChatToFinish(int vocFile, int chatDuration, const ch
}
void KyraEngine_LoK::endCharacterChat(int8 charNum, int16 convoInitialized) {
- _charSayUnk3 = -1;
+ _talkHeadAnimCharNum = -1;
if (charNum > 4 && charNum < 11) {
_animator->sprites()[_disabledTalkAnimObject].active = 1;
@@ -244,7 +244,7 @@ int KyraEngine_LoK::initCharacterChat(int8 charNum) {
_animator->flagAllObjectsForRefresh();
_animator->flagAllObjectsForBkgdChange();
_animator->preserveAnyChangedBackgrounds();
- _charSayUnk3 = charNum;
+ _talkHeadAnimCharNum = charNum;
return returnValue;
}
@@ -268,9 +268,11 @@ void KyraEngine_LoK::characterSays(int vocFile, const char *chatStr, int16 charN
backupChatPartnerAnimFrame(chatPartnerNum);
if (charNum < 5) {
- _characterList[charNum].currentAnimFrame = startAnimFrames[charNum];
- _charSayUnk3 = charNum;
- _talkingCharNum = charNum;
+ if (_flags.isTalkie || _flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98 || _animator->_brandonScaleX == 0x100 || !_scaleMode) {
+ _characterList[charNum].currentAnimFrame = startAnimFrames[charNum];
+ _talkHeadAnimCharNum = charNum;
+ _talkingCharNum = charNum;
+ }
_animator->animRefreshNPC(charNum);
}
Commit: e6ba0eff15ea6c0dec362f34405a6296e074f91e
https://github.com/scummvm/scummvm/commit/e6ba0eff15ea6c0dec362f34405a6296e074f91e
Author: athrxx (athrxx at scummvm.org)
Date: 2022-06-23T19:06:09+02:00
Commit Message:
KYRA: (DOS/CD) - add workaround for text glitch
(in the cave with the bridge, when falling into the river)
Changed paths:
engines/kyra/script/script_lok.cpp
diff --git a/engines/kyra/script/script_lok.cpp b/engines/kyra/script/script_lok.cpp
index 7708f7e4e89..c4caca21220 100644
--- a/engines/kyra/script/script_lok.cpp
+++ b/engines/kyra/script/script_lok.cpp
@@ -543,6 +543,8 @@ int KyraEngine_LoK::o1_popBrandonIntoScene(EMCState *script) {
return 0;
}
+bool workaround_removeTextfield = false;
+
int KyraEngine_LoK::o1_restoreAllObjectBackgrounds(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_restoreAllObjectBackgrounds(%p) (%d)", (const void *)script, stackPos(0));
int disable = stackPos(0);
@@ -551,6 +553,13 @@ int KyraEngine_LoK::o1_restoreAllObjectBackgrounds(EMCState *script) {
activeBackup = _animator->actors()->active;
_animator->actors()->active = 0;
}
+
+ // WORKAROUND: See o1_customPrintTalkString() for more info.
+ if (workaround_removeTextfield) {
+ _text->restoreTalkTextMessageBkgd(2, 0);
+ workaround_removeTextfield = false;
+ }
+
_animator->restoreAllObjectBackgrounds();
if (disable)
_animator->actors()->active = activeBackup;
@@ -592,8 +601,14 @@ int KyraEngine_LoK::o1_customPrintTalkString(EMCState *script) {
}
resetSkipFlag();
- if (textEnabled())
+ if (textEnabled()) {
+ // WORKAROUND: This string appears only in the talkie versions. The engine would need to remove it via
+ // o1_restoreCustomPrintBackground(), but it doesn't happen. Most of the text gets cleared when the
+ // animation background is restored, but not all of it. We just set a notification to have it cleared manually...
+ if (!strcmp(stackPosString(1), "AARGH!"))
+ workaround_removeTextfield = true;
_text->printTalkTextMessage(stackPosString(1), stackPos(2), stackPos(3), stackPos(4) & 0xFF, 0, 2);
+ }
} else {
debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_customPrintTalkString(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF);
resetSkipFlag();
More information about the Scummvm-git-logs
mailing list