[Scummvm-cvs-logs] CVS: scummvm/scumm sprite_he.cpp,1.24,1.25

Eugene Sandulenko sev at users.sourceforge.net
Tue Feb 22 19:19:39 CET 2005


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

Modified Files:
	sprite_he.cpp 
Log Message:
Implementation of spriteInfoSet_addImageToList. It needs review,
especially inner loop with pointer arithmetix. Cyx, remember that 
x * 0x31 that's it just somewhat complicated.


Index: sprite_he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sprite_he.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- sprite_he.cpp	23 Feb 2005 02:35:59 -0000	1.24
+++ sprite_he.cpp	23 Feb 2005 03:18:49 -0000	1.25
@@ -529,7 +529,66 @@
 }
 
 void ScummEngine_v90he::spriteInfoSet_addImageToList(int spriteId, int imageNum, int *spriteIdptr) {
-	// TODO
+	int listNum;
+	int *ptr;
+	int origResId;
+
+	// XXX needs review
+	checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
+
+	if (_spriteTable[spriteId].imglist_num) {
+		checkRange(_varMaxSprites, 1, _spriteTable[spriteId].imglist_num,
+				   "Image list %d out of range");
+		_imageListStack[_curSprImageListNum++] = _spriteTable[spriteId].imglist_num - 1;
+		_spriteTable[spriteId].imglist_num = 0;
+	}
+
+	origResId = _spriteTable[spriteId].res_id;
+
+	if (imageNum == 1)
+		_spriteTable[spriteId].res_id = *spriteIdptr;
+	else {
+		if (!_curSprImageListNum)
+			error("Out of image lists");
+
+		if (imageNum > 32)
+			error("Too many images in image list (%d)!", imageNum);
+
+		_curSprImageListNum--;
+		_spriteTable[spriteId].imglist_num = _imageListStack[_curSprImageListNum] + 1;
+
+		listNum = _spriteTable[spriteId].imglist_num;
+
+		checkRange(_varMaxSprites, 1, listNum, "Image list %d out of range");
+
+		_imageListTable[0x21 * listNum - 1] = imageNum;
+		
+		ptr = spriteIdptr;
+		for (int i = 0; i < listNum; i++) {
+			_imageListTable[0x21 * listNum - 0x21 + i] = *ptr++;
+		}
+		_spriteTable[spriteId].res_id = *spriteIdptr;
+	}
+
+	_spriteTable[spriteId].field_74 = 0;
+	_spriteTable[spriteId].res_state = 0;
+
+	if (_spriteTable[spriteId].res_id) {
+		_spriteTable[spriteId].res_wiz_states = getWizImageStates(_spriteTable[spriteId].res_id);
+		_spriteTable[spriteId].flags |= kSF16 | kSF22 | kSF23 | kSFBlitDirectly;
+
+		if (_spriteTable[spriteId].res_id == origResId &&
+			_spriteTable[spriteId].res_wiz_states == spriteId)
+			return;
+
+		_spriteTable[spriteId].flags |= kSF01 | kSFNeedRedraw;
+	} else {
+		_spriteTable[spriteId].flags &= ~(kSF31);
+		_spriteTable[spriteId].flags |= kSF01 | kSFBlitDirectly;
+		_spriteTable[spriteId].field_4C = 0;
+		_spriteTable[spriteId].field_48 = 0;
+		_spriteTable[spriteId].res_wiz_states = 0;
+	}
 }
 
 //





More information about the Scummvm-git-logs mailing list