[Scummvm-cvs-logs] CVS: scummvm/scumm actor.cpp,1.241,1.242 script_v6.cpp,1.322,1.323 script_v6he.cpp,2.39,2.40 script_v8.cpp,2.239,2.240 scumm.h,1.385,1.386 string.cpp,1.204,1.205

Max Horn fingolfin at users.sourceforge.net
Fri Mar 19 15:30:06 CET 2004


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32219

Modified Files:
	actor.cpp script_v6.cpp script_v6he.cpp script_v8.cpp scumm.h 
	string.cpp 
Log Message:
Revamped COMI/DIG speech decoding (this my cause regressions, watch out). Goal was to streamline code logic, and get rid of a FIXME

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/actor.cpp,v
retrieving revision 1.241
retrieving revision 1.242
diff -u -d -r1.241 -r1.242
--- actor.cpp	16 Mar 2004 23:51:41 -0000	1.241
+++ actor.cpp	19 Mar 2004 23:19:57 -0000	1.242
@@ -1148,6 +1148,13 @@
 	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) {

Index: script_v6.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v6.cpp,v
retrieving revision 1.322
retrieving revision 1.323
diff -u -d -r1.322 -r1.323
--- script_v6.cpp	17 Mar 2004 01:50:15 -0000	1.322
+++ script_v6.cpp	19 Mar 2004 23:19:57 -0000	1.323
@@ -2294,11 +2294,10 @@
 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::decodeParseString(int m, int n) {
 	byte b;
-	const byte *msg;
 
 	b = fetchScriptByte();
 
@@ -3124,23 +3122,23 @@
 		_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:

Index: script_v6he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v6he.cpp,v
retrieving revision 2.39
retrieving revision 2.40
diff -u -d -r2.39 -r2.40
--- script_v6he.cpp	15 Mar 2004 03:09:48 -0000	2.39
+++ script_v6he.cpp	19 Mar 2004 23:19:57 -0000	2.40
@@ -1405,7 +1405,6 @@
 void ScummEngine_v6he::decodeParseString(int m, int n) {
 	byte b;
 	int c;
-	const byte *msg;
 
 	b = fetchScriptByte();
 
@@ -1440,23 +1439,23 @@
 		_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:

Index: script_v8.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
retrieving revision 2.239
retrieving revision 2.240
diff -u -d -r2.239 -r2.240
--- script_v8.cpp	15 Mar 2004 21:48:54 -0000	2.239
+++ script_v8.cpp	19 Mar 2004 23:19:57 -0000	2.240
@@ -467,7 +467,6 @@
 
 void ScummEngine_v8::decodeParseString(int m, int n) {
 	byte b;
-	const byte *msg;
 
 	b = fetchScriptByte();
 
@@ -514,29 +513,30 @@
 		_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

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.385
retrieving revision 1.386
diff -u -d -r1.385 -r1.386
--- scumm.h	19 Mar 2004 19:40:34 -0000	1.385
+++ scumm.h	19 Mar 2004 23:19:57 -0000	1.386
@@ -1077,10 +1077,10 @@
 	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
 

Index: string.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/string.cpp,v
retrieving revision 1.204
retrieving revision 1.205
diff -u -d -r1.204 -r1.205
--- string.cpp	19 Mar 2004 19:40:34 -0000	1.204
+++ string.cpp	19 Mar 2004 23:19:57 -0000	1.205
@@ -523,14 +523,7 @@
 					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 @@
 		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::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 @@
 	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 @@
 		// 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) {





More information about the Scummvm-git-logs mailing list