[Scummvm-cvs-logs] CVS: scummvm/scumm costume.cpp,1.153,1.154 costume.h,1.32,1.33 scumm.cpp,1.361,1.362 scumm.h,1.539,1.540

Eugene Sandulenko sev at users.sourceforge.net
Mon Mar 14 13:14:53 CET 2005


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

Modified Files:
	costume.cpp costume.h scumm.cpp scumm.h 
Log Message:
First attempt to draw NES sprites. There are these problems:
  o Position is not correct
  o Colors are wrong
  o No animation
  o They're not wiped out correctly, maybe because of first problem


Index: costume.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/costume.cpp,v
retrieving revision 1.153
retrieving revision 1.154
diff -u -d -r1.153 -r1.154
--- costume.cpp	13 Mar 2005 23:18:52 -0000	1.153
+++ costume.cpp	14 Mar 2005 21:13:34 -0000	1.154
@@ -583,15 +583,8 @@
 void LoadedCostume::loadNEScostume(void) {
 	const byte *src;
 	int frameset, framenum;
-	int offset, numSprites, spritesOffset, maxSprites, numAnims;
-	byte *table, *ptr, *patTable, *spritesDefs, *spritesOffsetTab, *numSpritesTab;
-	bool flip;
-	int palette, tile;
-	byte patData[16 * 256];
-	int len;
-	int i, j;
-	byte x, y;
-	int8 x1, y1;
+	int offset;
+	byte *table;
 
 	_format = 0x01;
 	_mirror = 0;
@@ -603,7 +596,6 @@
 	src = _baseptr + 4;
 	// Cost(a)
 	offset = src[(frameset * 4 + framenum) * 2];
-	numAnims = src[(frameset * 4 + framenum) * 2 + 1];
 
 	// Lookup & desc
 	table = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][0]);
@@ -614,133 +606,6 @@
 	} else {
 		_numAnim = (READ_LE_UINT16(table + v1MMNESLookup[_id] * 2 + 4) - offset) / 2;
 	}
-
-	// lens
-	numSpritesTab = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][1]);
-
-	// offs
-	spritesOffsetTab = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][2]);
-
-	// data
-	spritesDefs = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][3]);
-
-	// gfx
-	patTable = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][4]);
-
-	for (int frameNum = 0; frameNum < _numAnim; frameNum++) {
-		offset = READ_LE_UINT16(table + v1MMNESLookup[_id] * 2 + 2 + frameNum * 2);
-		numSprites = numSpritesTab[offset + 2] + 1;
-		spritesOffset = READ_LE_UINT16(spritesOffsetTab + offset * 2 + 2);
-
-
-		//printf("spritesOffset: %x", spritesOffset);
-		ptr = spritesDefs + spritesOffset + 2;
-
-		byte mask;
-		// decode costumegfx and get data
-		maxSprites = patTable[3];
-		len = READ_LE_UINT16(patTable);
-
-		j = 0;
-		i = 3;
-		while (i < len) {
-			if (patTable[i] > 0x80) {
-				for (int cnt = (patTable[i++] & ~0x80); cnt > 0; cnt--)
-					patData[j++] = patTable[i++];
-			} else {
-				for (int cnt = patTable[i++]; cnt > 0; cnt--)
-					patData[j++] = patTable[i];
-				i++;
-			}
-		}
-		/*
-		printf("extracted len: %d", j);
-
-		for (j = 0; j < 5; j++) {
-			for (i = 0; i < 16; i++)
-				printf("%02x ", patData[j * 16 + i]);
-			printf("\n");
-		}
-		*/
-
-		byte pic[256][256];
-		for (i = 0; i < 256; i++)
-			for(j = 0; j < 256; j++)
-				pic[i][j] = ' ';
-
-		for (int spr = 0; spr < numSprites; spr++) {
-			flip = ((*ptr & 0x80) != 0);
-			
-			y1 = *ptr++;
-			y1 |= (int8)0x80;
-			y1 += (int8)0x80;
-			y = y1;
-
-			tile = *ptr++;
-
-			x1 = *ptr >> 2;
-
-			if (*ptr & 0x80)
-				x1 |= (int8)0xc0;
-			x1 += (int8)0x80;
-			x = x1;
-
-			palette = *ptr++ & 0x3;
-
-			mask = flip ? 0x01 : 0x80;
-
-#define SHIFT 0
-
-			for (i = 0; i < 8; i++) {
-				byte c = patData[tile * 16 + i];
-				for (j = 0; j < 8; j++) {
-					pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? '.' : ' ';
-					if (flip)
-						c >>= 1;
-					else
-						c <<= 1;
-				}
-			}
-			for (i = 0; i < 8; i++) {
-				byte c = patData[tile * 16 + i + 8];
-				for (j = 0; j < 8; j++) {
-					if (pic[SHIFT + j + x][SHIFT + i + y] == '.')
-						pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? '#' : '.';
-					else
-						pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? '*' : ' ';
-					if (flip)
-						c >>= 1;
-					else
-						c <<= 1;
-				}
-			}
-			//printf("flip: %d (%d), tile: %x, x: %d, y: %d, pal: %d", flip, (tile % 1) ? flip : !flip, tile, x, y, palette);
-		}
-	
-		int left = 256, top = 256, right = 0, bottom = 0;
-		
-		for (i = 0; i < 256; i++)
-			for(j = 0; j < 256; j++)
-				if (pic[j][i] != ' ') {
-					if (left > j)
-						left = j;
-					if (right < j)
-						right = j;
-					if (top > i)
-						top = i;
-					if (bottom < i)
-						bottom = i;
-			}
-
-		/*	
-		for (i = top; i <= bottom; i++) {
-			for(j = left; j <= right; j++)
-				printf("%c", pic[j][i]);
-			printf("\n");
-		}
-		*/
-	}
-		
 }
 
 void LoadedCostume::loadCostume(int id) {
@@ -806,6 +671,126 @@
 	_animCmds = _baseptr + READ_LE_UINT16(ptr);
 }
 
+void CostumeRenderer::drawNESCostume(const Actor *a, int limb) {
+	const byte *src;
+	int offset, numSprites, spritesOffset, numAnims;
+	byte *table, *ptr, *spritesDefs, *spritesOffsetTab, *numSpritesTab;
+	bool flip;
+	int palette, tile;
+	int i, j;
+	byte x, y;
+	int8 x1, y1;
+	const CostumeData &cost = a->_cost;
+	int frame = cost.frame[limb];
+
+	src = _loaded._dataOffsets;
+
+	// Cost(a)
+	offset = src[frame * 2];
+	numAnims = src[frame * 2 + 1];
+
+	// Lookup & desc
+	table = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][0]);
+	offset = READ_LE_UINT16(table + v1MMNESLookup[_loaded._id] * 2 + 2);
+
+	// lens
+	numSpritesTab = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][1]);
+
+	// offs
+	spritesOffsetTab = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][2]);
+
+	// data
+	spritesDefs = _vm->getResourceAddress(rtCostume, v1MMNEScostTables[_vm->_v1MMNESCostumeSet][3]);
+
+	int frameNum = 0;
+
+	offset = READ_LE_UINT16(table + v1MMNESLookup[_loaded._id] * 2 + 2 + frameNum * 2);
+	numSprites = numSpritesTab[offset + 2] + 1;
+	spritesOffset = READ_LE_UINT16(spritesOffsetTab + offset * 2 + 2);
+
+	ptr = spritesDefs + spritesOffset + 2;
+
+	byte mask;
+
+	byte pic[256][256];
+	for (i = 0; i < 256; i++)
+		for(j = 0; j < 256; j++)
+			pic[i][j] = 0;
+
+	for (int spr = 0; spr < numSprites; spr++) {
+		flip = ((*ptr & 0x80) != 0);
+			
+		y1 = *ptr++;
+		y1 |= (int8)0x80;
+		y1 += (int8)0x80;
+		y = y1;
+
+		tile = *ptr++;
+
+		x1 = *ptr >> 2;
+
+		if (*ptr & 0x80)
+			x1 |= (int8)0xc0;
+		x1 += (int8)0x80;
+		x = x1;
+
+		palette = *ptr++ & 0x3;
+		
+		mask = flip ? 0x01 : 0x80;
+
+#define SHIFT 0
+
+		for (i = 0; i < 8; i++) {
+			byte c = _vm->_v1MMNESCostumeGfx[_vm->_v1MMNESCostumeSet][tile * 16 + i];
+			for (j = 0; j < 8; j++) {
+				pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? 1 : 0;
+				if (flip)
+					c >>= 1;
+				else
+					c <<= 1;
+			}
+		}
+		for (i = 0; i < 8; i++) {
+			byte c = _vm->_v1MMNESCostumeGfx[_vm->_v1MMNESCostumeSet][tile * 16 + i + 8];
+			for (j = 0; j < 8; j++) {
+				if (pic[SHIFT + j + x][SHIFT + i + y] == 1)
+					pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? 3 : 1;
+				else
+					pic[SHIFT + j + x][SHIFT + i + y] = (c & mask) ? 2 : 0;
+				if (flip)
+					c >>= 1;
+				else
+					c <<= 1;
+			}
+		}
+	}
+	
+	int left = 256, top = 256, right = 0, bottom = 0;
+		
+	for (i = 0; i < 256; i++)
+		for(j = 0; j < 256; j++)
+			if (pic[j][i] != 0) {
+				if (left > j)
+					left = j;
+				if (right < j)
+					right = j;
+				if (top > i)
+					top = i;
+				if (bottom < i)
+					bottom = i;
+			}
+
+	byte *dest = (byte *)_out.pixels + (_actorY + top - 128) * _out.pitch + 
+		_actorX + left - 128;
+
+	for (i = top; i <= bottom; i++) {
+		for(j = left; j <= right; j++)
+			if (pic[j][i])
+				dest[j - left] = pic[j][i];
+		dest += _out.pitch;
+	}
+}
+
 byte CostumeRenderer::drawLimb(const Actor *a, int limb) {
 	int i;
 	int code;
@@ -816,6 +801,11 @@
 	if (cost.curpos[limb] == 0xFFFF || cost.stopped & (1 << limb))
 		return 0;
 
+	if (_vm->_features & GF_NES) {
+		drawNESCostume(a, limb);
+		return 0;
+	}
+
 	// Determine the position the limb is at
 	i = cost.curpos[limb] & 0x7FFF;
 	
@@ -860,6 +850,35 @@
 
 }
 
+void ScummEngine::cost_decodeNESCostumeGfx() {
+	for (int n = 0; n < 2; n++) {
+		byte *patTable = getResourceAddress(rtCostume, v1MMNEScostTables[n][4]);
+		int j = 0;
+		int i = 3;
+		int maxSprites = 256; //patTable[3];
+		int len = READ_LE_UINT16(patTable);
+
+		if (maxSprites == 0)
+			maxSprites = 256;
+
+		_v1MMNESCostumeGfx[n] = (byte *)calloc(maxSprites * 16, 1);
+
+		while (i < len) {
+			if (patTable[i] > 0x80) {
+				for (int cnt = (patTable[i++] & ~0x80); cnt > 0; cnt--)
+					_v1MMNESCostumeGfx[n][j++] = patTable[i++];
+			} else {
+				for (int cnt = patTable[i++]; cnt > 0; cnt--)
+					_v1MMNESCostumeGfx[n][j++] = patTable[i];
+				i++;
+			}
+		}
+
+		// We will not need it anymore
+		nukeResource(rtCostume, v1MMNEScostTables[n][4]);
+	}
+}
+
 int ScummEngine::cost_frameToAnim(Actor *a, int frame) {
 	return newDirToOldDir(a->getFacing()) + frame * 4;
 }
@@ -881,7 +900,7 @@
 	}
 
 	if (_features & GF_NES) {
-		a->_cost.curpos[0] = 0xFFFF;
+		a->_cost.curpos[0] = 1;
 		a->_cost.start[0] = 0;
 		a->_cost.frame[0] = frame;
 		return;
@@ -997,6 +1016,10 @@
 	int i, end;
 	byte code, nc;
 
+	if (_vm->_features & GF_NES) {
+		return 0;
+	}
+
 	if (a->_cost.curpos[slot] == 0xFFFF)
 		return 0;
 

Index: costume.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/costume.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- costume.h	13 Mar 2005 23:18:54 -0000	1.32
+++ costume.h	14 Mar 2005 21:13:35 -0000	1.33
@@ -71,6 +71,7 @@
 
 protected:
 	byte drawLimb(const Actor *a, int limb);
+	void drawNESCostume(const Actor *a, int limb);
 
 	void proc3(Codec1 &v1);
 	void proc3_ami(Codec1 &v1);

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.361
retrieving revision 1.362
diff -u -d -r1.361 -r1.362
--- scumm.cpp	13 Mar 2005 23:18:58 -0000	1.361
+++ scumm.cpp	14 Mar 2005 21:13:35 -0000	1.362
@@ -1492,6 +1492,9 @@
 
 	clearDrawObjectQueue();
 
+	if (_features & GF_NES)
+		cost_decodeNESCostumeGfx();
+
 	for (i = 0; i < 6; i++) {
 		if (_version == 3) { // FIXME - what is this?
 			_string[i]._default.xpos = 0;

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.539
retrieving revision 1.540
diff -u -d -r1.539 -r1.540
--- scumm.h	13 Mar 2005 23:18:59 -0000	1.539
+++ scumm.h	14 Mar 2005 21:13:35 -0000	1.540
@@ -472,6 +472,7 @@
 	BaseCostumeRenderer* _costumeRenderer;
 
 	int _v1MMNESCostumeSet;
+	byte *_v1MMNESCostumeGfx[2];
 	
 	char *_audioNames;
 	int32 _numAudioNames;
@@ -838,6 +839,7 @@
 	// Costume class
 	void cost_decodeData(Actor *a, int frame, uint usemask);
 	int cost_frameToAnim(Actor *a, int frame);
+	void cost_decodeNESCostumeGfx();
 
 	// Akos Class
 	struct {





More information about the Scummvm-git-logs mailing list