[Scummvm-cvs-logs] SF.net SVN: scummvm: [22064] scummvm/trunk/engines/simon

kirben at users.sourceforge.net kirben at users.sourceforge.net
Thu Apr 20 20:10:04 CEST 2006


Revision: 22064
Author:   kirben
Date:     2006-04-20 20:09:21 -0700 (Thu, 20 Apr 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=22064&view=rev

Log Message:
-----------
Add animate sprites by Y function for FF

Modified Paths:
--------------
    scummvm/trunk/engines/simon/simon.cpp
    scummvm/trunk/engines/simon/simon.h
Modified: scummvm/trunk/engines/simon/simon.cpp
===================================================================
--- scummvm/trunk/engines/simon/simon.cpp	2006-04-21 00:26:18 UTC (rev 22063)
+++ scummvm/trunk/engines/simon/simon.cpp	2006-04-21 03:09:21 UTC (rev 22064)
@@ -2611,8 +2611,8 @@
 	}
 
 	if (getGameType() == GType_FF && getBitFlag(84)) {
-		// TODO
-		warning("Animation by Y value not supported");
+		animateSpritesByY();
+		return;
 	}
 
 	vsp = _vgaSprites;
@@ -2690,6 +2690,81 @@
 	_vcPtr = vc_ptr_org;
 }
 
+void SimonEngine::animateSpritesByY() {
+	VgaSprite *vsp;
+	VgaPointersEntry *vpe;
+	const byte *vc_ptr_org = _vcPtr;
+	uint16 params[5];							// parameters to vc10
+	int16 spriteTable[180][2];
+	
+	byte *src;
+	int height, slot, y;
+	uint i, numSprites = 0;
+
+	vsp = _vgaSprites;
+	while (vsp->id != 0) {
+		if (vsp->flags & kDFScaled) {
+			y = vsp->y;
+		} else {
+			y = vsp->priority;
+			vpe = &_vgaBufferPointers[vsp->zoneNum];
+			src = vpe->vgaFile2 + vsp->image * 8;
+			height = READ_LE_UINT16(src + 4) & 0x7FFF;
+			y += height;
+		}
+
+		spriteTable[numSprites][0] = y;
+		spriteTable[numSprites][1] = numSprites;
+		numSprites++;
+		vsp++;
+	}
+
+	while(1) {
+		y = spriteTable[0][0];
+		slot = spriteTable[0][1];
+
+		for (i = 0; i < numSprites; i++) {
+			if (y >= spriteTable[i][0]) {
+				y = spriteTable[i][0];
+				slot = spriteTable[i][1];
+			}
+		}
+
+		if (y == 9999)
+			break;
+
+		for (i = 0; i < numSprites; i++) {
+			if (slot == spriteTable[i][1]) {
+				spriteTable[i][0] = 9999;
+				break;
+			}
+		}
+
+		vsp = &_vgaSprites[slot];
+		vsp->windowNum &= 0x7FFF;
+
+		vpe = &_vgaBufferPointers[vsp->zoneNum];
+		_curVgaFile1 = vpe->vgaFile1;
+		_curVgaFile2 = vpe->vgaFile2;
+		_curSfxFile = vpe->sfxFile;
+		_windowNum = vsp->windowNum;
+		_vgaCurSpriteId = vsp->id;
+		_vgaCurSpritePriority = vsp->priority;
+
+		params[0] = readUint16Wrapper(&vsp->image);
+		params[1] = readUint16Wrapper(&vsp->palette);
+		params[2] = readUint16Wrapper(&vsp->x);
+		params[3] = readUint16Wrapper(&vsp->y);
+		*(byte *)(&params[4]) = (byte)vsp->flags;
+
+		_vcPtr = (const byte *)params;
+		vc10_draw();
+	}
+
+	_updateScreen++;
+	_vcPtr = vc_ptr_org;
+}
+
 void SimonEngine::scrollScreen() {
 	byte *dst = getFrontBuf();
 	const byte *src;

Modified: scummvm/trunk/engines/simon/simon.h
===================================================================
--- scummvm/trunk/engines/simon/simon.h	2006-04-21 00:26:18 UTC (rev 22063)
+++ scummvm/trunk/engines/simon/simon.h	2006-04-21 03:09:21 UTC (rev 22064)
@@ -1065,6 +1065,7 @@
 
 	void animateSprites();
 	void animateSpritesDebug();
+	void animateSpritesByY();
 
 	void dx_clear_surfaces(uint num_lines);
 	void dx_update_screen_and_palette();


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list