[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.57,1.58 script_v6.cpp,1.40,1.41 script_v8.cpp,2.117,2.118 scumm.h,1.134,1.135 scummvm.cpp,2.39,2.40 string.cpp,1.78,1.79

Max Horn fingolfin at users.sourceforge.net
Wed Jan 15 16:41:03 CET 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv10064/scumm

Modified Files:
	object.cpp script_v6.cpp script_v8.cpp scumm.h scummvm.cpp 
	string.cpp 
Log Message:
first blastText version. this is work in progress (note that e.g. text is not clipped, and the extra information is not removed)

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- object.cpp	14 Jan 2003 10:05:40 -0000	1.57
+++ object.cpp	16 Jan 2003 00:40:19 -0000	1.58
@@ -1271,12 +1271,12 @@
 	BlastObject *eo;
 	ObjectData *od;
 
-	if (_enqueuePos == sizeof(_enqueuedObjects) / sizeof(_enqueuedObjects[0])) {
+	if (_blastObjectQueuePos == sizeof(_blastObjectQueue) / sizeof(_blastObjectQueue[0])) {
 		warning("enqueueObject: overflow");
 		return;
 	}
 
-	eo = &_enqueuedObjects[_enqueuePos++];
+	eo = &_blastObjectQueue[_blastObjectQueuePos++];
 	eo->number = objectNumber;
 	eo->posX = objectX + (camera._cur.x & 7);
 	eo->posY = objectY + (camera._cur.y - (_realHeight / 2));
@@ -1305,8 +1305,8 @@
 	BlastObject *eo;
 	int i;
 
-	eo = _enqueuedObjects;
-	for (i = 0; i < _enqueuePos; i++, eo++) {
+	eo = _blastObjectQueue;
+	for (i = 0; i < _blastObjectQueuePos; i++, eo++) {
 		drawBlastObject(eo);
 	}
 }
@@ -1568,8 +1568,8 @@
 	BlastObject *eo;
 	int i;
 
-	eo = _enqueuedObjects;
-	for (i = 0; i < _enqueuePos; i++, eo++) {
+	eo = _blastObjectQueue;
+	for (i = 0; i < _blastObjectQueuePos; i++, eo++) {
 		removeBlastObject(eo);
 	}
 

Index: script_v6.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v6.cpp,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- script_v6.cpp	14 Jan 2003 10:33:18 -0000	1.40
+++ script_v6.cpp	16 Jan 2003 00:40:19 -0000	1.41
@@ -2294,8 +2294,8 @@
 
 void Scumm_v6::o6_printEgo()
 {
-	push(_vars[VAR_EGO]);
-	decodeParseString(0, 1);
+	_actorToPrintStrFor = _vars[VAR_EGO];
+	decodeParseString(0, 0);
 }
 
 void Scumm_v6::o6_talkActor()

Index: script_v8.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
retrieving revision 2.117
retrieving revision 2.118
diff -u -d -r2.117 -r2.118
--- script_v8.cpp	15 Jan 2003 16:23:04 -0000	2.117
+++ script_v8.cpp	16 Jan 2003 00:40:19 -0000	2.118
@@ -199,7 +199,7 @@
 		OPCODE(o6_dummy),				// O_RETURN boils down to a NOP
 		OPCODE(o6_startObjectEx),
 		/* 80 */
-		OPCODE(o6_stopObjectScript),	// FIXME - is this right?
+		OPCODE(o6_stopObjectScript),
 		OPCODE(o6_cutscene),
 		OPCODE(o6_endCutscene),
 		OPCODE(o6_freezeUnfreeze),
@@ -236,7 +236,7 @@
 		/* 9C */
 		OPCODE(o8_cursorCommand),
 		OPCODE(o6_loadRoom),
-		OPCODE(o6_loadRoomWithEgo),	// FIXME - this is a pure guess
+		OPCODE(o6_loadRoomWithEgo),
 		OPCODE(o6_walkActorToObj),
 		/* A0 */
 		OPCODE(o6_walkActorTo),
@@ -249,7 +249,7 @@
 		OPCODE(o6_pickupObject),
 		OPCODE(o6_setBoxFlags),
 		/* A8 */
-		OPCODE(o6_createBoxMatrix), // fixme?
+		OPCODE(o6_createBoxMatrix),
 		OPCODE(o6_invalid),
 		OPCODE(o8_resourceRoutines),
 		OPCODE(o8_roomOps),
@@ -289,7 +289,7 @@
 		OPCODE(o6_invalid),
 		OPCODE(o6_invalid),
 		/* C8 */
-		OPCODE(o6_startScriptQuick),	// FIXME - this function returns something in V8 !
+		OPCODE(o6_startScriptQuick),
 		OPCODE(o6_startObjectQuick),
 		OPCODE(o6_pickOneOf),
 		OPCODE(o6_pickOneOfDefault),
@@ -299,7 +299,7 @@
 		OPCODE(o6_getRandomNumber),
 		OPCODE(o6_getRandomNumberRange),
 		/* D0 */
-		OPCODE(o6_ifClassOfIs),	// FIXME - this is a guess
+		OPCODE(o6_ifClassOfIs),
 		OPCODE(o6_getState),
 		OPCODE(o6_getOwner),
 		OPCODE(o6_isScriptRunning),
@@ -331,7 +331,7 @@
 		/* E8 */
 		OPCODE(o6_getActorElevation),
 		OPCODE(o6_getActorWidth),
-		OPCODE(o6_getObjectNewDir),		// FIXME: is this right?
+		OPCODE(o6_getObjectNewDir),
 		OPCODE(o6_getObjectX),
 		/* EC */
 		OPCODE(o6_getObjectY),
@@ -460,6 +460,7 @@
 void Scumm_v8::decodeParseString(int m, int n)
 {
 	byte b;
+	bool containsSpeech;
 
 	b = fetchScriptByte();
 
@@ -468,7 +469,7 @@
 		setStringVars(m);
 		if (n)
 			_actorToPrintStrFor = pop();
-		return;
+		break;
 	case 0xC9:
 		_string[m].t_xpos = _string[m].xpos;
 		_string[m].t_ypos = _string[m].ypos;
@@ -478,7 +479,7 @@
 		_string[m].t_right = _string[m].right;
 		_string[m].t_color = _string[m].color;
 		_string[m].t_charset = _string[m].charset;
-		return;
+		break;
 	case 0xCA:
 		_string[m].ypos = pop();
 		_string[m].xpos = pop();
@@ -491,11 +492,8 @@
 		_string[m].center = true;
 		_string[m].overhead = false;
 		break;
-	case 0xCD: {		// SO_PRINT_CHARSET Set print character set
-		// FIXME - TODO
-		int charset = pop();
-		_string[m].charset = charset;
-	}
+	case 0xCD:		// SO_PRINT_CHARSET Set print character set
+		_string[m].charset = pop();
 		break;
 	case 0xCE:
 		_string[m].center = false;
@@ -511,8 +509,10 @@
 		break;
 	case 0xD1:
 		_messagePtr = _scriptPointer;
+		
+		containsSpeech = (_messagePtr[0] == '/');
 
-		if (_messagePtr[0] == '/') {
+		if (containsSpeech) {
 			char pointer[20];
 			int i, j;
 
@@ -530,40 +530,32 @@
 
 //			_sound->_talkChannel = _sound->playBundleSound(pointer);
 			_messagePtr = _transText;
-
-			switch (m) {
-			case 0:
-				actorTalk();
-				break;
-			case 1:
-				drawString(1);
-				break;
-			case 2:
-				unkMessage1();
-				break;
-			case 3:
-				unkMessage2();
-				break;
-			}
-			return;
-		} else {
-			switch (m) {
-			case 0:
-				actorTalk();
-				break;
-			case 1:
-				drawString(1);
-				break;
-			case 2:
-				unkMessage1();
-				break;
-			case 3:
-				unkMessage2();
-				break;
+		}
+		
+		switch (m) {
+		case 0:
+			actorTalk();
+			break;
+		case 1:
+			drawString(1);
+			break;
+		case 2:
+			unkMessage1();
+			break;
+		case 3:
+			unkMessage2();
+			break;
+		case 5:{
+			byte buffer[256];
+			_msgPtrToAdd = buffer;
+			_messagePtr = addMessageToStack(_messagePtr);
+			enqueueText(buffer, _string[m].xpos, _string[m].ypos, _string[m].color, _string[m].charset, _string[m].center);
 			}
-			_scriptPointer = _messagePtr;
-			return;
+			break;
 		}
+
+		if (!containsSpeech)
+			_scriptPointer = _messagePtr;
 		break;
 //	case 0xD2:		// SO_PRINT_WRAP Set print wordwrap
 //		error("decodeParseString: SO_PRINT_MUMBLE");
@@ -573,6 +565,56 @@
 	}
 }
 
+void Scumm::enqueueText(byte *text, int x, int y, byte color, byte charset, bool center)
+{
+	BlastText &bt = _blastTextQueue[_blastTextQueuePos++];
+	assert(_blastTextQueuePos <= 8);
+	
+	strcpy((char *)bt.text, (const char *)text);
+	bt.xpos = x;
+	bt.ypos = y;
+	bt.color = color;
+	bt.charset = charset;
+	bt.center = center;
+}
+
+void Scumm::drawBlastTexts()
+{
+	// FIXME
+
+	byte *buf;
+	byte c;
+	int i;
+
+	_charset->_ignoreCharsetMask = true;
+	for (i = 0; i < _blastTextQueuePos; i++) {
+
+		buf = _blastTextQueue[i].text;
+
+		_charset->_top = _blastTextQueue[i].ypos;
+		_charset->_startLeft = _charset->_left = _blastTextQueue[i].xpos;
+		_charset->_right = _realWidth - 1;
+		_charset->_center = _blastTextQueue[i].center;
+		_charset->_color = _blastTextQueue[i].color;
+		_charset->_disableOffsX = _charset->_firstChar = true;
+		_charset->setCurID(_blastTextQueue[i].charset);
+		_charset->_nextLeft = _blastTextQueue[i].xpos;
+		_charset->_nextTop = _blastTextQueue[i].ypos;
+
+		do {
+			c = *buf++;
+			if (c != 0 && c != 0xFF) {
+				_charset->_left = _charset->_nextLeft;
+				_charset->_top = _charset->_nextTop;
+				_charset->printChar(c);
+				_charset->_nextLeft = _charset->_left;
+				_charset->_nextTop = _charset->_top;
+			}
+		} while (c);
+	}
+	_charset->_ignoreCharsetMask = false;
+}
+
 void Scumm_v8::o8_mod()
 {
 	int a = pop();
@@ -732,7 +774,7 @@
 void Scumm_v8::o8_blastText()
 {
 	// FIXME
-	decodeParseString(1, 0);
+	decodeParseString(5, 0);
 }
 
 void Scumm_v8::o8_cursorCommand()
@@ -1261,7 +1303,6 @@
 	case 0xA6:		// SO_VERB_CHARSET Choose charset for verb
 		// FIXME - TODO
 		vs->charset_nr = pop();
-		//printf("Set to charset %d\n", vs->charset_nr);
 		break;
 	case 0xA7:		// SO_VERB_LINE_SPACING Choose linespacing for verb
 		// FIXME - TODO
@@ -1478,8 +1519,8 @@
 		int y = args[2] + (camera._cur.y - (_realHeight /2));;
 		BlastObject *eo;
 
-		for (int i = _enqueuePos; i >= 0; i--) {
-			eo = &_enqueuedObjects[i];
+		for (int i = _blastObjectQueuePos; i >= 0; i--) {
+			eo = &_blastObjectQueue[i];
 
 			if (eo->posX <= x && eo->width + eo->posX > x &&
 			    eo->posY <= y && eo->height + eo->posY > y) {

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -d -r1.134 -r1.135
--- scumm.h	15 Jan 2003 16:23:04 -0000	1.134
+++ scumm.h	16 Jan 2003 00:40:19 -0000	1.135
@@ -113,7 +113,15 @@
 	uint8 where;
 	uint8 slot;
 };
- 
+
+struct BlastText {
+	int16 xpos, ypos;
+	byte color;
+	byte charset;
+	bool center;
+	byte text[256];
+};
+
 enum ResTypes {
 	rtFirst = 1,
 	rtRoom = 1,
@@ -792,12 +800,20 @@
 	uint _shakeFrame;
 	int _screenStartStrip, _screenEndStrip;
 	int _screenLeft, _screenTop;
-	int _enqueuePos; 
-	BlastObject _enqueuedObjects[128];
+
+	int _blastObjectQueuePos; 
+	BlastObject _blastObjectQueue[128];
+
+	int _blastTextQueuePos;
+	BlastText _blastTextQueue[8];	// FIXME - how many blast texts can there be at once?
+
+	void enqueueText(byte *text, int x, int y, byte color, byte charset, bool center);
+	void drawBlastTexts();
+	void removeBlastTexts() { _blastTextQueuePos = 0; }
 
 	void enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth,
 	                   int objectHeight, int scaleX, int scaleY, int image, int mode);
-	void clearEnqueue() { _enqueuePos = 0; }
+	void clearEnqueue() { _blastObjectQueuePos = 0; }
 	void drawBlastObjects();
 	void drawBlastObject(BlastObject *eo);
 	void removeBlastObjects();

Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.39
retrieving revision 2.40
diff -u -d -r2.39 -r2.40
--- scummvm.cpp	13 Jan 2003 18:59:50 -0000	2.39
+++ scummvm.cpp	16 Jan 2003 00:40:19 -0000	2.40
@@ -558,8 +558,10 @@
 		}
 
 		drawBlastObjects();
+		drawBlastTexts();
 		drawDirtyScreenParts();
 		removeBlastObjects();
+		removeBlastTexts();
 
 		if (!(_features & GF_AFTER_V6))
 			playActorSounds();

Index: string.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/string.cpp,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- string.cpp	31 Dec 2002 14:59:06 -0000	1.78
+++ string.cpp	16 Jan 2003 00:40:19 -0000	1.79
@@ -374,19 +374,15 @@
 
 	do {
 		c = *buf++;
-		if (c == 0) {
-			_haveMsg = 1;
-			break;
-		}
-		if (c != 0xFF) {
+		if (c != 0 && c != 0xFF) {
 			_charset->_left = _charset->_nextLeft;
 			_charset->_top = _charset->_nextTop;
 			_charset->printChar(c);
 			_charset->_nextLeft = _charset->_left;
 			_charset->_nextTop = _charset->_top;
-			continue;
 		}
-	} while (1);
+	} while (c);
+	_haveMsg = 1;
 
 	gdi._mask_left = _charset->_strLeft;
 	gdi._mask_right = _charset->_strRight;
@@ -423,19 +419,15 @@
 
 	do {
 		c = *buf++;
-		if (c == 0) {
-			_haveMsg = 1;
-			break;
-		}
-		if (c != 0xFF) {
+		if (c != 0 && c != 0xFF) {
 			_charset->_left = _charset->_nextLeft;
 			_charset->_top = _charset->_nextTop;
 			_charset->printChar(c);
 			_charset->_nextLeft = _charset->_left;
 			_charset->_nextTop = _charset->_top;
-			continue;
 		}
-	} while (1);
+	} while (c);
+	_haveMsg = 1;
 
 	gdi._mask_left = _charset->_strLeft;
 	gdi._mask_right = _charset->_strRight;





More information about the Scummvm-git-logs mailing list