From b38f773e0f01604aba7a8c2750a5c3c2b2fd4a2b Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 15 Jan 2004 20:39:24 +0000 Subject: fixed COMI speech behaviour svn-id: r12415 --- scumm/sound.cpp | 21 ++++++++++++--------- scumm/string.cpp | 17 ++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 36d290fbd6..5f6c6c711f 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -405,21 +405,19 @@ void Sound::playSound(int soundID) { } void Sound::processSfxQueues() { - Actor *a; - int act; - bool b, finished; if (_talk_sound_mode != 0) { if (_talk_sound_mode & 1) startTalkSound(_talk_sound_a1, _talk_sound_b1, 1); - if (_talk_sound_mode & 2) { + if (_talk_sound_mode & 2) startTalkSound(_talk_sound_a2, _talk_sound_b2, 2, &_talkChannelHandle); - } _talk_sound_mode = 0; } - if ((_sfxMode & 2) && _vm->VAR(_vm->VAR_TALK_ACTOR)) { - act = _vm->VAR(_vm->VAR_TALK_ACTOR); + const int act = _vm->VAR(_vm->VAR_TALK_ACTOR); + if ((_sfxMode & 2) && act != 0) { + Actor *a; + bool b, finished; if (_vm->_imuseDigital) { finished = !isSoundRunning(kTalkSoundID); @@ -427,9 +425,9 @@ void Sound::processSfxQueues() { finished = !_talkChannelHandle.isActive(); } - if (act != 0 && (uint) act < 0x80 && !_vm->_string[0].no_talk_anim) { + if ((uint) act < 0x80 && !_vm->_string[0].no_talk_anim && (finished || !_endOfMouthSync)) { a = _vm->derefActor(act, "processSfxQueues"); - if (a->isInCurrentRoom() && (finished || !_endOfMouthSync)) { + if (a->isInCurrentRoom()) { b = finished || isMouthSyncOff(_curSoundPos); if (_mouthSyncMode != b) { _mouthSyncMode = b; @@ -464,6 +462,11 @@ void Sound::startTalkSound(uint32 offset, uint32 b, int mode, PlayingSoundHandle byte *sound; int id = -1; + if (_vm->_gameId == GID_CMI) { + _sfxMode |= mode; + return; + } + if ((_vm->_gameId == GID_DIG) && (_vm->_features & GF_DEMO)) { char filename[30]; char roomname[10]; diff --git a/scumm/string.cpp b/scumm/string.cpp index 7456f23bcb..12116a02bd 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -166,13 +166,6 @@ void ScummEngine::CHARSET_1() { if (_talkDelay) return; - if ((_gameId == GID_CMI || _gameId == GID_DIG) && (_imuseDigital) - && _sound->isSoundRunning(kTalkSoundID)) { - // Keep the 'speech' flag in _sound->_sfxMode set as long as the - // sound kTalkSoundID is playing. - _sound->_sfxMode |= 2; - } - if (_haveMsg == 1) { if ((_sound->_sfxMode & 2) == 0) stopTalk(); @@ -892,8 +885,14 @@ const byte *ScummEngine::translateTextAndPlaySpeech(const byte *ptr) { // Play speech if (!(_features & GF_DEMO) && (_gameId == GID_CMI)) // CMI demo does not have .IMX for voice strcat(pointer, ".IMX"); -// _imuseDigital->stopSound(kTalkSoundID); - _imuseDigital->startVoice(kTalkSoundID, pointer); + // FIXME: This is a hack to distinguish between 'real' actor speech and + // some odd (?) other strings... there is probably a better way to do this. + // I just don't know which (yet). + if (ptr[i+1] != 0 && ptr[i+1] != 255) { + _sound->stopTalkSound(); + _imuseDigital->startVoice(kTalkSoundID, pointer); + _sound->talkSound(0, 0, 2, -1); + } ptr = _transText; } -- cgit v1.2.3