diff options
-rw-r--r-- | scumm/actor.cpp | 7 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 20 | ||||
-rw-r--r-- | scumm/script_v6he.cpp | 13 | ||||
-rw-r--r-- | scumm/script_v8.cpp | 18 | ||||
-rw-r--r-- | scumm/scumm.h | 4 | ||||
-rw-r--r-- | scumm/string.cpp | 48 |
6 files changed, 51 insertions, 59 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp index 40e79714c2..b128251bb8 100644 --- a/scumm/actor.cpp +++ b/scumm/actor.cpp @@ -1148,6 +1148,13 @@ void ScummEngine::actorTalk(const byte *msg) { Actor *a; addMessageToStack(msg, _charsetBuffer, sizeof(_charsetBuffer)); + + while ((_gameId == GID_DIG || _gameId == GID_CMI) && (_charsetBuffer[0] == '/')) { + translateText(_charsetBuffer, _transText); + if (_transText[0] != '/') + playSpeech(_charsetBuffer); + memcpy(_charsetBuffer, _transText, MIN(sizeof(_charsetBuffer), sizeof(_transText))); + } // FIXME: Workaround for bugs #770039 and #770049 if (_gameId == GID_LOOM || _gameId == GID_LOOM256) { diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index 30983a573c..fdf7329b4d 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -2294,11 +2294,10 @@ void ScummEngine_v6::o6_printEgo() { void ScummEngine_v6::o6_talkActor() { _actorToPrintStrFor = pop(); - const byte *msg = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer) + 1; - setStringVars(0); - actorTalk(msg); + actorTalk(_scriptPointer); + + _scriptPointer += resStrLen(_scriptPointer) + 1; } void ScummEngine_v6::o6_talkEgo() { @@ -3089,7 +3088,6 @@ void ScummEngine_v6::o6_setBoxSet() { void ScummEngine_v6::decodeParseString(int m, int n) { byte b; - const byte *msg; b = fetchScriptByte(); @@ -3124,23 +3122,23 @@ void ScummEngine_v6::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 75: // SO_TEXTSTRING - msg = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer) + 1; + translateText(_scriptPointer, _transText); switch (m) { case 0: - actorTalk(msg); + actorTalk(_scriptPointer); break; case 1: - drawString(1, msg); + drawString(1, _transText); break; case 2: - unkMessage1(msg); + unkMessage1(_transText); break; case 3: - unkMessage2(msg); + unkMessage2(_transText); break; } + _scriptPointer += resStrLen(_scriptPointer) + 1; break; case 0xFE: diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index 377f8834ef..881685013a 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -1405,7 +1405,6 @@ void ScummEngine_v6he::o6_unknownFB() { void ScummEngine_v6he::decodeParseString(int m, int n) { byte b; int c; - const byte *msg; b = fetchScriptByte(); @@ -1440,23 +1439,23 @@ void ScummEngine_v6he::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 75: // SO_TEXTSTRING - msg = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer) + 1; + translateText(_scriptPointer, _transText); switch (m) { case 0: - actorTalk(msg); + actorTalk(_scriptPointer); break; case 1: - drawString(1, msg); + drawString(1, _transText); break; case 2: - unkMessage1(msg); + unkMessage1(_transText); break; case 3: - unkMessage2(msg); + unkMessage2(_transText); break; } + _scriptPointer += resStrLen(_scriptPointer) + 1; break; case 0xF9: diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 48df426e0e..4b0d0624b5 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -467,7 +467,6 @@ void ScummEngine_v8::writeVar(uint var, int value) { void ScummEngine_v8::decodeParseString(int m, int n) { byte b; - const byte *msg; b = fetchScriptByte(); @@ -514,29 +513,30 @@ void ScummEngine_v8::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 0xD1: // SO_PRINT_STRING - msg = translateTextAndPlaySpeech(_scriptPointer); - _scriptPointer += resStrLen(_scriptPointer) + 1; + translateText(_scriptPointer, _transText); switch (m) { case 0: - actorTalk(msg); + actorTalk(_scriptPointer); break; case 1: - drawString(1, msg); + drawString(1, _transText); break; case 2: - unkMessage1(msg); + unkMessage1(_transText); break; case 3: - unkMessage2(msg); + unkMessage2(_transText); break; case 5:{ byte buffer[256]; - addMessageToStack(msg, buffer, sizeof(buffer)); - enqueueText(buffer, _string[m].xpos, _string[m].ypos, _string[m].color, _string[m].charset, _string[m].center); + addMessageToStack(_transText, buffer, sizeof(buffer)); + translateText(buffer, _transText); + enqueueText(_transText, _string[m].xpos, _string[m].ypos, _string[m].color, _string[m].charset, _string[m].center); } break; } + _scriptPointer += resStrLen(_scriptPointer) + 1; break; case 0xD2: // SO_PRINT_WRAP Set print wordwrap diff --git a/scumm/scumm.h b/scumm/scumm.h index 41de10a95e..3bd42df918 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -1077,10 +1077,10 @@ protected: char *_languageBuffer; LangIndexNode *_languageIndex; int _languageIndexSize; - byte _transText[500]; + byte _transText[512]; void loadLanguageBundle(); - const byte *translateTextAndPlaySpeech(const byte *ptr); + void playSpeech(const byte *ptr); public: void translateText(const byte *text, byte *trans_buff); // Used by class ScummDialog diff --git a/scumm/string.cpp b/scumm/string.cpp index c1a061c742..419e3e0273 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -523,14 +523,7 @@ void ScummEngine::addMessageToStack(const byte *msg, byte *dstBuffer, int dstBuf addNameToStack(val); break; case 7: - if (_version <= 2) { - while ((chr = (byte) _scummVars[val++])) { - if (chr != '@') - *_msgPtrToAdd++ = chr; - } - } else { - addStringToStack(val); - } + addStringToStack(val); break; case 9: case 10: @@ -583,7 +576,6 @@ void ScummEngine::addVerbToStack(int var) { for (k = 1; k < _numVerbs; k++) { if (num == _verbs[k].verbid && !_verbs[k].type && !_verbs[k].saveid) { const byte *ptr = getResourceAddress(rtVerb, k); - ptr = translateTextAndPlaySpeech(ptr); addMessageToStack(ptr, 0, 0); break; } @@ -593,24 +585,28 @@ void ScummEngine::addVerbToStack(int var) { void ScummEngine::addNameToStack(int var) { int num; - const byte *ptr = 0; num = readVar(var); - if (num) - ptr = getObjOrActorName(num); - if (ptr) { - if ((_version == 8) && (ptr[0] == '/')) { - translateText(ptr, _transText); - addMessageToStack(_transText, 0, 0); - } else { + if (num) { + const byte *ptr = getObjOrActorName(num); + if (ptr) addMessageToStack(ptr, 0, 0); - } } } void ScummEngine::addStringToStack(int var) { const byte *ptr; + if (_version <= 2) { + byte chr; + while ((chr = (byte)_scummVars[var++])) { + if (chr != '@') + *_msgPtrToAdd++ = chr; + } + + return; + } + if (_version == 3 || _version >= 6) var = readVar(var); @@ -858,12 +854,11 @@ void ScummEngine::loadLanguageBundle() { qsort(_languageIndex, _languageIndexSize, sizeof(LangIndexNode), indexCompare); } -const byte *ScummEngine::translateTextAndPlaySpeech(const byte *ptr) { +void ScummEngine::playSpeech(const byte *ptr) { if ((_gameId == GID_DIG || _gameId == GID_CMI) && (ptr[0] == '/')) { char pointer[20]; int i, j; - translateText(ptr, _transText); for (i = 0, j = 0; (ptr[i] != '/' || j == 0) && j < 19; i++) { if (ptr[i] != '/') pointer[j++] = ptr[i]; @@ -873,18 +868,11 @@ 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"); - // 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 ((_gameId == GID_DIG) || (_gameId == GID_CMI && ptr[i+1] != 0 && ptr[i+1] != 255)) { - _sound->stopTalkSound(); - _imuseDigital->startVoice(kTalkSoundID, pointer); - _sound->talkSound(0, 0, 2, -1); - } - ptr = _transText; + _sound->stopTalkSound(); + _imuseDigital->startVoice(kTalkSoundID, pointer); + _sound->talkSound(0, 0, 2, -1); } - return ptr; } void ScummEngine::translateText(const byte *text, byte *trans_buff) { |