[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.439,2.440 gfx.h,1.116,1.117 intern.h,2.469,2.470 object.cpp,1.235,1.236 room.cpp,1.10,1.11 scumm.cpp,1.472,1.473 scumm.h,1.609,1.610 string.cpp,1.282,1.283

Max Horn fingolfin at users.sourceforge.net
Thu Apr 28 15:37:11 CEST 2005


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

Modified Files:
	gfx.cpp gfx.h intern.h object.cpp room.cpp scumm.cpp scumm.h 
	string.cpp 
Log Message:
Moved blast text/object code to ScummEngine_v6

Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.439
retrieving revision 2.440
diff -u -d -r2.439 -r2.440
--- gfx.cpp	28 Apr 2005 00:22:05 -0000	2.439
+++ gfx.cpp	28 Apr 2005 22:34:54 -0000	2.440
@@ -444,6 +444,29 @@
 	}
 }
 
+void ScummEngine_v6::drawDirtyScreenParts() {
+	// For the Full Throttle credits to work properly, the blast
+	// texts have to be drawn before the blast objects. Unless
+	// someone can think of a better way to achieve this effect.
+
+	if (_version >= 7 && VAR(VAR_BLAST_ABOVE_TEXT) == 1) {
+		drawBlastTexts();
+		drawBlastObjects();
+	} else {
+		drawBlastObjects();
+		drawBlastTexts();
+	}
+	if (_version == 8)
+		processUpperActors();
+
+	// Call the original method.
+	ScummEngine::drawDirtyScreenParts();
+
+	// Remove all blasted objects/text again.
+	removeBlastTexts();
+	removeBlastObjects();
+}
+
 /**
  * Blit the dirty data from the given VirtScreen to the display. If the camera moved,
  * a full blit is done, otherwise only the visible dirty areas are updated.

Index: gfx.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.h,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -d -r1.116 -r1.117
--- gfx.h	2 Apr 2005 14:24:40 -0000	1.116
+++ gfx.h	28 Apr 2005 22:34:54 -0000	1.117
@@ -173,15 +173,6 @@
 	byte end;
 };
 
-/** BlastObjects to draw */
-struct BlastObject {
-	uint16 number;
-	Common::Rect rect;
-	uint16 scaleX, scaleY;
-	uint16 image;
-	uint16 mode;
-};
-
 /** Bomp graphics data, used as parameter to ScummEngine::drawBomp. */
 struct BompDrawData {
 	Graphics::Surface dst;

Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.469
retrieving revision 2.470
diff -u -d -r2.469 -r2.470
--- intern.h	28 Apr 2005 22:17:22 -0000	2.469
+++ intern.h	28 Apr 2005 22:34:54 -0000	2.470
@@ -414,6 +414,31 @@
 
 	int _smushFrameRate;
 
+	/** BlastObjects to draw */
+	struct BlastObject {
+		uint16 number;
+		Common::Rect rect;
+		uint16 scaleX, scaleY;
+		uint16 image;
+		uint16 mode;
+	};
+
+	int _blastObjectQueuePos; 
+	BlastObject _blastObjectQueue[128];
+
+	struct BlastText {
+		int16 xpos, ypos;
+		Common::Rect rect;
+		byte color;
+		byte charset;
+		bool center;
+		byte text[256];
+	};
+
+	int _blastTextQueuePos;
+	BlastText _blastTextQueue[50];
+
+
 public:
 	ScummEngine_v6(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]);
 
@@ -432,6 +457,7 @@
 	virtual void readMAXS(int blockSize);
 
 	virtual void palManipulateInit(int resID, int start, int end, int time);
+	virtual void drawDirtyScreenParts();
 
 	int getStackList(int *args, uint maxnum);
 	int popRoomAndObj(int *room);
@@ -452,6 +478,20 @@
 	void useBompCursor(const byte *im, int w, int h);
 	void grabCursor(int x, int y, int w, int h);
 
+	void enqueueText(const byte *text, int x, int y, byte color, byte charset, bool center);
+	void drawBlastTexts();
+	void removeBlastTexts();
+
+	void enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth,
+	                   int objectHeight, int scaleX, int scaleY, int image, int mode);
+	void drawBlastObjects();
+	void drawBlastObject(BlastObject *eo);
+	void removeBlastObjects();
+	void removeBlastObject(BlastObject *eo);
+
+	virtual void clearDrawQueues();
+
+
 	/* Version 6 script opcodes */
 	void o6_setBlastObjectWindow();
 	void o6_pushByte();
@@ -730,6 +770,8 @@
 
 	virtual void setCursorFromImg(uint img, uint room, uint imgindex);
 
+	virtual void clearDrawQueues();
+
 	/* HE version 70 script opcodes */
 	void o70_startSound();
 	void o70_pickupObject();
@@ -929,6 +971,8 @@
 
 	virtual void initScummVars();
 
+	virtual void clearDrawQueues();
+
 	void loadImgSpot(int resId, int state, int16 &x, int16 &y);
 	void loadWizCursor(int resId);
 	void unknownE0(int x1, int y1, int x, int unk1, int unk2, int type, int id);

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.235
retrieving revision 1.236
diff -u -d -r1.235 -r1.236
--- object.cpp	27 Apr 2005 14:30:20 -0000	1.235
+++ object.cpp	28 Apr 2005 22:34:55 -0000	1.236
@@ -855,6 +855,30 @@
 	_drawObjectQueNr = 0;
 }
 
+void ScummEngine::clearDrawQueues() {
+	clearDrawObjectQueue();
+}
+
+void ScummEngine_v6::clearDrawQueues() {
+	ScummEngine::clearDrawQueues();
+
+	_blastObjectQueuePos = 0;
+}
+
+void ScummEngine_v70he::clearDrawQueues() {
+	ScummEngine_v6::clearDrawQueues();
+
+	if (_heversion >= 71)
+		_wiz.polygonClear();
+}
+
+void ScummEngine_v80he::clearDrawQueues() {
+	ScummEngine_v70he::clearDrawQueues();
+
+	_wiz.imageNumClear();
+}
+
+
 void ScummEngine::clearOwnerOf(int obj) {
 	int i, j;
 	uint16 *a;
@@ -1444,7 +1468,7 @@
 		}
 }
 
-void ScummEngine::enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth,
+void ScummEngine_v6::enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth,
 								int objectHeight, int scaleX, int scaleY, int image, int mode) {
 	BlastObject *eo;
 
@@ -1478,7 +1502,7 @@
 	eo->mode = mode;
 }
 
-void ScummEngine::drawBlastObjects() {
+void ScummEngine_v6::drawBlastObjects() {
 	BlastObject *eo;
 	int i;
 
@@ -1488,7 +1512,7 @@
 	}
 }
 
-void ScummEngine::drawBlastObject(BlastObject *eo) {
+void ScummEngine_v6::drawBlastObject(BlastObject *eo) {
 	VirtScreen *vs;
 	const byte *bomp, *ptr;
 	int objnum;
@@ -1552,7 +1576,7 @@
 	markRectAsDirty(vs->number, bdd.x, bdd.x + bdd.srcwidth, bdd.y, bdd.y + bdd.srcheight);
 }
 
-void ScummEngine::removeBlastObjects() {
+void ScummEngine_v6::removeBlastObjects() {
 	BlastObject *eo;
 	int i;
 
@@ -1560,11 +1584,10 @@
 	for (i = 0; i < _blastObjectQueuePos; i++, eo++) {
 		removeBlastObject(eo);
 	}
-
-	clearEnqueue();
+	_blastObjectQueuePos = 0;
 }
 
-void ScummEngine::removeBlastObject(BlastObject *eo) {
+void ScummEngine_v6::removeBlastObject(BlastObject *eo) {
 	VirtScreen *vs = &virtscr[0];
 
 	Common::Rect r;

Index: room.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/room.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- room.cpp	26 Apr 2005 14:24:29 -0000	1.10
+++ room.cpp	28 Apr 2005 22:34:56 -0000	1.11
@@ -74,15 +74,11 @@
 	runExitScript();
 
 	killScriptsAndResources();
-	clearEnqueue();
 	if (_version >= 4 && _heversion <= 61)
 		stopCycle(0);
 	_sound->processSoundQues();
-
-	if (_heversion >= 71)
-		((ScummEngine_v70he *)this)->_wiz.polygonClear();
-	if (_heversion >= 80)
-		((ScummEngine_v72he *)this)->_wiz.imageNumClear();
+	
+	clearDrawQueues();
 
 	// For HE80+ games
 	for (i = 0; i < _numRoomVariables; i++)
@@ -108,8 +104,6 @@
 			setDirtyColors(0, 255);
 	}
 
-	clearDrawObjectQueue();
-
 	VAR(VAR_ROOM) = room;
 	_fullRedraw = true;
 

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.472
retrieving revision 1.473
diff -u -d -r1.472 -r1.473
--- scumm.cpp	28 Apr 2005 22:17:22 -0000	1.472
+++ scumm.cpp	28 Apr 2005 22:34:56 -0000	1.473
@@ -863,10 +863,6 @@
 	_screenStartStrip = 0;
 	_screenEndStrip = 0;
 	_screenTop = 0;
-	_blastObjectQueuePos = 0;
-	memset(_blastObjectQueue, 0, sizeof(_blastObjectQueue));
-	_blastTextQueuePos = 0;
-	memset(_blastTextQueue, 0, sizeof(_blastTextQueue));
 	_drawObjectQueNr = 0;
 	memset(_drawObjectQue, 0, sizeof(_drawObjectQue));
 	_palManipStart = 0;
@@ -1236,6 +1232,13 @@
 
 ScummEngine_v6::ScummEngine_v6(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) 
  : ScummEngine(detector, syst, gs, md5sum) {
+	_blastObjectQueuePos = 0;
+	memset(_blastObjectQueue, 0, sizeof(_blastObjectQueue));
+	_blastTextQueuePos = 0;
+	memset(_blastTextQueue, 0, sizeof(_blastTextQueue));
+
+	_smushFrameRate = 0;
+
 	VAR_VIDEONAME = 0xFF;
 	VAR_RANDOM_NR = 0xFF;
 	VAR_STRING2DRAW = 0xFF;
@@ -1246,8 +1249,6 @@
 	VAR_TIMEDATE_HOUR = 0xFF;
 	VAR_TIMEDATE_MINUTE = 0xFF;
 	VAR_TIMEDATE_SECOND = 0xFF;
-
-	_smushFrameRate = 0;
 }
 
 ScummEngine_v70he::ScummEngine_v70he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16])
@@ -2137,32 +2138,11 @@
 			clearClickedStatus();
 		}
 
+		// Handle mouse over effects (for verbs).
 		handleMouseOver(oldEgo != VAR(VAR_EGO));
 
-		//
-		// TODO: The whole blast object/text code is V6-8 specific. So it
-		// would be nice to move it to ScummEngine_v6. One way to make that
-		// possible would be to replace their invocation with two new virtual
-		// methods preDrawScreenHook() and postDrawScreenHook().
-		//
-
-		// For the Full Throttle credits to work properly, the blast
-		// texts have to be drawn before the blast objects. Unless
-		// someone can think of a better way to achieve this effect.
-
-		if (_version >= 7 && VAR(VAR_BLAST_ABOVE_TEXT) == 1) {
-			drawBlastTexts();
-			drawBlastObjects();
-		} else {
-			drawBlastObjects();
-			drawBlastTexts();
-		}
-
-		if (_version == 8)
-			processUpperActors();
+		// Render everything to the screen.
 		drawDirtyScreenParts();
-		removeBlastTexts();
-		removeBlastObjects();
 
 		if (_version <= 5)
 			playActorSounds();

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.609
retrieving revision 1.610
diff -u -d -r1.609 -r1.610
--- scumm.h	28 Apr 2005 22:17:23 -0000	1.609
+++ scumm.h	28 Apr 2005 22:34:56 -0000	1.610
@@ -165,15 +165,6 @@
 struct VerbSlot;
 struct ObjectData;
 
-struct BlastText {
-	int16 xpos, ypos;
-	Common::Rect rect;
-	byte color;
-	byte charset;
-	bool center;
-	byte text[256];
-};
-
 struct V2MouseoverBox {
 	Common::Rect rect;
 	byte color;
@@ -780,6 +771,8 @@
 	void clearDrawObjectQueue();
 	void processDrawQue();
 
+	virtual void clearDrawQueues();
+
 	uint32 getOBCDOffs(int object) const;
 	byte *getOBCDFromObject(int obj);
 	const byte *getOBIMFromObject(const ObjectData &od);
@@ -990,7 +983,7 @@
 	// Screen rendering
 	byte *_compositeBuf;
 	byte *_herculesBuf;
-	void drawDirtyScreenParts();
+	virtual void drawDirtyScreenParts();
 	void updateDirtyScreen(VirtScreenNumber slot);
 	void drawStripToScreen(VirtScreen *vs, int x, int w, int t, int b);
 	void ditherCGA(byte *dst, int dstPitch, int x, int y, int width, int height) const;
@@ -1022,24 +1015,6 @@
 	uint _shakeFrame;
 	void setShake(int mode);
 
-	int _blastObjectQueuePos; 
-	BlastObject _blastObjectQueue[128];
-
-	int _blastTextQueuePos;
-	BlastText _blastTextQueue[50];
-
-	void enqueueText(const byte *text, int x, int y, byte color, byte charset, bool center);
-	void drawBlastTexts();
-	void removeBlastTexts();
-
-	void enqueueObject(int objectNumber, int objectX, int objectY, int objectWidth,
-	                   int objectHeight, int scaleX, int scaleY, int image, int mode);
-	void clearEnqueue() { _blastObjectQueuePos = 0; }
-	void drawBlastObjects();
-	void drawBlastObject(BlastObject *eo);
-	void removeBlastObjects();
-	void removeBlastObject(BlastObject *eo);
-
 	int _drawObjectQueNr;
 	byte _drawObjectQue[200];
 	

Index: string.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/string.cpp,v
retrieving revision 1.282
retrieving revision 1.283
diff -u -d -r1.282 -r1.283
--- string.cpp	28 Apr 2005 22:17:23 -0000	1.282
+++ string.cpp	28 Apr 2005 22:34:56 -0000	1.283
@@ -755,7 +755,7 @@
 		_charsetColorMap[i] = _charsetData[charsetno][i];
 }
 
-void ScummEngine::enqueueText(const byte *text, int x, int y, byte color, byte charset, bool center) {
+void ScummEngine_v6::enqueueText(const byte *text, int x, int y, byte color, byte charset, bool center) {
 	BlastText &bt = _blastTextQueue[_blastTextQueuePos++];
 	assert(_blastTextQueuePos <= ARRAYSIZE(_blastTextQueue));
 
@@ -767,7 +767,7 @@
 	bt.center = center;
 }
 
-void ScummEngine::drawBlastTexts() {
+void ScummEngine_v6::drawBlastTexts() {
 	byte *buf;
 	int c;
 	int i;
@@ -811,7 +811,7 @@
 	_charset->_ignoreCharsetMask = false;
 }
 
-void ScummEngine::removeBlastTexts() {
+void ScummEngine_v6::removeBlastTexts() {
 	int i;
 
 	for (i = 0; i < _blastTextQueuePos; i++) {





More information about the Scummvm-git-logs mailing list