[Scummvm-cvs-logs] CVS: scummvm/scumm intern.h,2.336,2.337 sprite_he.cpp,1.4,1.5 sprite_he.h,1.3,1.4

Gregory Montoir cyx at users.sourceforge.net
Sun Feb 20 14:17:22 CET 2005


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

Modified Files:
	intern.h sprite_he.cpp sprite_he.h 
Log Message:
some WIP HE sprites stuff

Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.336
retrieving revision 2.337
diff -u -d -r2.336 -r2.337
--- intern.h	20 Feb 2005 13:07:56 -0000	2.336
+++ intern.h	20 Feb 2005 22:16:31 -0000	2.337
@@ -879,6 +879,10 @@
 	int spriteInfoGet_flags_6(int spriteNum);
 	int spriteInfoGet_flags_7(int spriteNum);	
 	int spriteInfoGet_flags_8(int spriteNum);
+	void spritesAllocTables(int numSprites, int numGroups, int numImgSprites);
+	void spritesResetTables(bool refreshScreen);
+	void spriteGroupCheck(int sprGrpId);
+	void spriteMarkIfInGroup(int sprGrpId, uint32 flags);
 
 	/* HE version 90 script opcodes */
 	void o90_dup();

Index: sprite_he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sprite_he.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- sprite_he.cpp	20 Feb 2005 18:40:32 -0000	1.4
+++ sprite_he.cpp	20 Feb 2005 22:16:31 -0000	1.5
@@ -31,10 +31,8 @@
 namespace Scumm {
 
 void ScummEngine_v90he::allocateArrays() {
-	_spriteGroups = (SpriteGroup *)calloc(_numSprites, sizeof(SpriteGroup));
-	_spriteTable = (SpriteInfo *)calloc(_numSprites, sizeof(SpriteInfo));
-	
 	ScummEngine::allocateArrays();
+	spritesAllocTables(_numSprites, 64, 64);
 }
 
 int ScummEngine_v90he::spriteInfoGet_flags_1(int spriteNum) {
@@ -85,4 +83,80 @@
 	return ((_spriteTable[spriteNum].flags & kSF31) != 0) ? 1 : 0;
 }
 
+void ScummEngine_v90he::spritesAllocTables(int numSprites, int numGroups, int numImgLists) {
+	_varNumSpriteGroups = numGroups;
+	_numSpritesToProcess = 0;
+	_varNumSprites = numSprites;
+	_varNumImgLists = numImgLists;
+	_spriteGroups = (SpriteGroup *)malloc((_varNumSpriteGroups + 1) * sizeof(SpriteGroup));
+	_spriteTable = (SpriteInfo *)malloc((_varNumSprites + 1) * sizeof(SpriteInfo));
+	_activeSpritesTable = (SpriteInfo **)malloc((_varNumSprites + 1) * sizeof(SpriteInfo *));
+	_imageListTable = (uint32 *)malloc((_varNumImgLists + 1) * sizeof(uint32)); // XXX
+	_imageListStack = (uint16 *)malloc((_varNumImgLists + 1) * sizeof(uint16));
+}
+
+void ScummEngine_v90he::spritesResetTables(bool refreshScreen) {
+	int i;
+	for (i = 0; i < _varNumImgLists; ++i) {
+		_imageListStack[i] = i;
+	}
+	memset(_spriteTable, 0, (_varNumSprites + 1) * sizeof(SpriteInfo));
+	memset(_spriteGroups, 0, (_varNumSpriteGroups + 1) * sizeof(SpriteGroup));
+	for (int curGrp = 1; curGrp < _varNumSpriteGroups; ++curGrp) {
+		SpriteGroup *spg = &_spriteGroups[curGrp];
+		checkRange(_varNumSpriteGroups, 1, curGrp, "Invalid sprite group %d");
+		if (spg->field_10 != 0) {
+			spg->field_10 = 0;
+			spriteGroupCheck(curGrp);
+			for (i = 0; i < _numSpritesToProcess; ++i) {
+				SpriteInfo *spi = _activeSpritesTable[i];
+				if (spi->group_num == curGrp) {
+					spi->flags |= kSF1 | kSF2;
+				}
+			}
+		}
+		if (spg->tx != 0 || spg->ty != 0) {
+			spg->tx = spg->ty = 0;
+			spriteGroupCheck(curGrp);
+			for (i = 0; i < _numSpritesToProcess; ++i) {
+				SpriteInfo *spi = _activeSpritesTable[i];
+				if (spi->group_num == curGrp) {
+					spi->flags |= kSF1 | kSF2;
+				}
+			}
+		}
+		spg->flags &= ~kSGF1;
+		spriteMarkIfInGroup(curGrp, kSF1 | kSF2);
+		if (spg->field_20 != 0) {
+			spriteGroupCheck(curGrp);
+			for (i = 0; i < _numSpritesToProcess; ++i) {
+				SpriteInfo *spi = _activeSpritesTable[i];
+				if (spi->group_num == curGrp) {
+					spi->flags |= kSF1 | kSF2;
+				}
+			}
+		}
+		spriteGroupCheck(curGrp);
+		spg->scaling = 0;
+		spg->scale_x = 0x3F800000;
+		spg->field_30 = 0;
+		spg->field_34 = 0;
+		spg->scale_y = 0x3F800000;
+		spg->field_38 = 0;
+		spg->field_3C = 0;
+	}
+	if (refreshScreen) {
+		gdi.copyVirtScreenBuffers(Common::Rect(_screenWidth, _screenHeight));
+	}
+	_numSpritesToProcess = 0;
+}
+
+void ScummEngine_v90he::spriteGroupCheck(int sprGrpId) {
+	// XXX
+}
+
+void ScummEngine_v90he::spriteMarkIfInGroup(int sprGrpId, uint32 flags) {
+	// XXX
+}
+
 } // End of namespace Scumm

Index: sprite_he.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sprite_he.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- sprite_he.h	20 Feb 2005 15:05:18 -0000	1.3
+++ sprite_he.h	20 Feb 2005 22:16:31 -0000	1.4
@@ -60,6 +60,11 @@
 	kSF32      = (1 << 31)
 };
 
+enum SpriteGroupFlags {
+	kSGF1  = 1 << 0,
+	kSFG2  = 1 << 1
+};
+
 struct SpriteInfo {
 	int field_0;
 	int flags;
@@ -116,8 +121,17 @@
 	int field_3C;
 };
 
+	int _varNumSpriteGroups;
+	int _numSpritesToProcess;
+	int _varNumSprites;
+	int _varNumImgLists;
 	SpriteInfo *_spriteTable;
 	SpriteGroup *_spriteGroups;
+	SpriteInfo **_activeSpritesTable;
+	uint32 *_imageListTable; // XXX wrong type
+	uint16 *_imageListStack;
+	int _curSprImageListNum;
+
 
 } // End of namespace Scumm
 





More information about the Scummvm-git-logs mailing list