aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/actor.cpp7
-rw-r--r--scumm/script_v6.cpp20
-rw-r--r--scumm/script_v6he.cpp13
-rw-r--r--scumm/script_v8.cpp18
-rw-r--r--scumm/scumm.h4
-rw-r--r--scumm/string.cpp48
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) {