[Scummvm-cvs-logs] CVS: scummvm/saga isomap.cpp,1.32,1.33 isomap.h,1.14,1.15

Andrew Kurushin h00ligan at users.sourceforge.net
Tue Feb 22 12:22:24 CET 2005


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

Modified Files:
	isomap.cpp isomap.h 
Log Message:
3 stage iso drawing implemented:
  1)iso scene
  2)figure
  3)tiles above figure

Index: isomap.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/isomap.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- isomap.cpp	18 Feb 2005 00:00:00 -0000	1.32
+++ isomap.cpp	22 Feb 2005 20:18:52 -0000	1.33
@@ -33,6 +33,24 @@
 
 namespace Saga {
 
+enum MaskRules {
+	kMaskRuleNever = 0,
+	kMaskRuleAlways,
+	kMaskRuleUMIN,
+	kMaskRuleUMID,
+	kMaskRuleUMAX,
+	kMaskRuleVMIN,
+	kMaskRuleVMID,
+	kMaskRuleVMAX,
+	kMaskRuleYMIN,
+	kMaskRuleYMID,
+	kMaskRuleYMAX,
+	kMaskRuleUVMAX,
+	kMaskRuleUVMIN,
+	kMaskRuleUorV,
+	kMaskRuleUandV
+};
+
 IsoMap::IsoMap(SagaEngine *vm) : _vm(vm) {
 	_tileData = NULL;
 	_tilesCount = 0;
@@ -42,6 +60,8 @@
 	_metaTilesCount = 0;
 	_multiTable = NULL;
 	_multiCount = 0;
+	_multiTableData = NULL;
+	_multiDataCount = 0;
 	_viewScroll.x = (128 - 8) * 16;
 	_viewScroll.x = (128 - 8) * 16 - 64;
 	_viewDiff = 1;
@@ -188,6 +208,16 @@
 		multiTileEntryData->currentState = readS.readByte();
 		readS.readByte();//skip
 	}
+	for (i = 0; i < _multiCount; i++) {
+		_multiTable[i].offset -= readS.pos();
+	}
+
+	_multiDataCount = (readS.size() - readS.pos()) / 2;
+
+	_multiTableData = (int16 *)malloc(_multiDataCount * sizeof(*_multiTableData));
+	for (i = 0; i < _multiDataCount; i++) {
+		_multiTableData[i] = readS.readSint16();
+	}
 }
 
 void IsoMap::freeMem() {
@@ -199,6 +229,8 @@
 	_metaTilesCount = 0;
 	free(_multiTable);
 	_multiCount = 0;
+	free(_multiTableData);
+	_multiDataCount = 0;
 }
 
 void IsoMap::adjustScroll(bool jump) {
@@ -258,6 +290,48 @@
 	}
 }
 
+int16 IsoMap::findMulti(int16 tileIndex, int16 absU, int16 absV, int16 absH) {
+	MultiTileEntryData *multiTileEntryData;
+	int16 ru;
+	int16 rv;
+	int16 mu;
+	int16 mv;
+	int16 state;
+	uint16 i, offset;
+
+	ru = (tileIndex >> 13) & 0x03;
+	rv = (tileIndex >> 11) & 0x03;
+	mu = absU - ru;
+	mv = absV - rv;
+	
+	tileIndex = 0;
+	for (i = 0; i < _multiCount; i++) {
+		multiTileEntryData = &_multiTable[i];
+
+		if ((multiTileEntryData->u == mu) && 
+			(multiTileEntryData->v == mv) && 
+			(multiTileEntryData->h == absH)) {
+			state = multiTileEntryData->currentState;
+			
+			offset = (ru + state * multiTileEntryData->uSize) * multiTileEntryData->vSize + rv;
+			offset += multiTileEntryData->offset;
+			if (offset >= _multiDataCount * sizeof(*_multiTableData)) {
+				error("wrong multiTileEntryData->offset");
+			}
+			tileIndex = _multiTableData[offset];
+			if (tileIndex >= 256) {
+				warning("something terrible happened");
+				return 1;
+			}
+
+			return tileIndex;
+		}
+	}
+	
+	warning("something terrible happened");
+	return 1;
+}
+
 int IsoMap::draw(SURFACE *ds) {
 	
 	Rect isoRect(_vm->getDisplayWidth(), _vm->getDisplayInfo().sceneHeight);
@@ -282,10 +356,10 @@
 	spritePointer.x = screenPosition.x + xAlign;
 	spritePointer.y = screenPosition.y + yAlign;
 
-	_tileClip.left = screenPosition.x;
-	_tileClip.top = screenPosition.y;
-	_tileClip.right = screenPosition.x + width;
-	_tileClip.bottom = screenPosition.y + height;
+	_tileClip.left = spritePointer.x;
+	_tileClip.top = spritePointer.y;
+	_tileClip.right = spritePointer.x + width;
+	_tileClip.bottom = spritePointer.y + height;
 
 	if (_tileClip.left < 0) {
 		_tileClip.left = 0;
@@ -526,7 +600,7 @@
 				tileIndex = tilePlatform->tiles[u][v];
 				if (tileIndex != 0) {
 					if (tileIndex & SAGA_MULTI_TILE) {
-						warning("SAGA_MULTI_TILE"); //TODO: do it !
+						tileIndex = findMulti(tileIndex, absU + u, absU + v, absH);
 					}
 
 					drawSpriteTile(ds, tileIndex, location, s);
@@ -578,7 +652,7 @@
 				tileIndex = tilePlatform->tiles[u][v];
 				if (tileIndex > 1) {
 					if (tileIndex & SAGA_MULTI_TILE) {
-						warning("SAGA_MULTI_TILE"); //TODO: do it !
+						tileIndex = findMulti(tileIndex, absU + u, absU + v, absH);
 					}
 
 					drawTile(ds, tileIndex, s);
@@ -681,6 +755,10 @@
 
 }
 
+#define THRESH0		0
+#define THRESH8		8
+#define THRESH16		16
+
 void IsoMap::drawSpriteTile(SURFACE *ds, uint16 tileIndex, const Location &location, const Point &point) {
 	const byte *tilePointer;
 	const byte *readPointer;
@@ -692,7 +770,6 @@
 	int bgRunCount;
 	int fgRunCount;
 
-
 	if (tileIndex >= _tilesCount) {
 		error("IsoMap::drawTile wrong tileIndex");
 	}
@@ -722,6 +799,95 @@
 		return;
 	}
 
+	if (location.z <= -16) {
+		if (location.z <= -48) {
+			if (location.u() < -THRESH8 || location.v() < -THRESH8) {
+				return;
+			}
+		} else {
+			if (location.u() < THRESH0 || location.v() < THRESH0) {
+				return;
+			}
+		}
+	} else {
+		if (location.z >= 16) {
+			return;
+		} else {
+			switch (_tilesTable[tileIndex].GetMaskRule()) {
+			case kMaskRuleNever:
+				return;
+			case kMaskRuleAlways:
+				break;
+			case kMaskRuleUMIN:
+				if (location.u() < THRESH0) {
+					return; 
+				}
+				break;
+			case kMaskRuleUMID:	
+				if (location.u() < THRESH8) {
+					return;
+				}
+				break;
+			case kMaskRuleUMAX:
+				if (location.u() < THRESH16) {
+					return; 
+				}
+				break;
+			case kMaskRuleVMIN:
+				if (location.v() < THRESH0) {
+					return;
+				}
+				break;
+			case kMaskRuleVMID:
+				if (location.v() < THRESH8) {
+					return; 
+				}
+				break;
+			case kMaskRuleVMAX:
+				if (location.v() < THRESH16) {
+					return; 
+				}
+				break;
+			case kMaskRuleYMIN:
+				if (location.u() + location.v() < THRESH0 * 2) {
+					return;
+				}
+				break;
+			case kMaskRuleYMID:
+				if (location.u() + location.v() < THRESH8 * 2) {
+					return;
+				}
+				break;
+			case kMaskRuleYMAX:
+				if (location.u() + location.v() < THRESH16 * 2) {
+					return;
+				}
+				break;
+			case kMaskRuleUVMAX:
+				if (location.u() < THRESH16 && location.v() < THRESH16) {
+					return;
+				}
+				break;
+			case kMaskRuleUVMIN:
+				if (location.u() < THRESH0 || location.v() < THRESH0) {
+					return;
+				}
+				break;
+			case kMaskRuleUorV:
+				if (location.u() < THRESH8 && location.v() < THRESH8) {
+					return;
+				}
+				break;
+			case kMaskRuleUandV:
+				if (location.u() < THRESH8 || location.v() < THRESH8) {
+					return;
+				}
+				break;
+			}
+		}
+	}
+
+///
 	readPointer = tilePointer;
 	lowBound = MIN((int)(drawPoint.y + height), (int)_tileClip.bottom);
 	for (row = drawPoint.y; row < lowBound; row++) {

Index: isomap.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/isomap.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- isomap.h	18 Feb 2005 00:00:00 -0000	1.14
+++ isomap.h	22 Feb 2005 20:18:55 -0000	1.15
@@ -67,6 +67,9 @@
 	size_t offset;
 	uint16 terrainMask;
 	byte FGBGAttr;
+	int8 GetMaskRule() {
+		return attributes & 0x0F;
+	}
 };
 
 struct TilePlatformData {
@@ -146,6 +149,8 @@
 		}
 		return value;
 	}	
+	int16 findMulti(int16 tileIndex, int16 absU, int16 absV, int16 absH );
+
 
 	byte *_tileData;
 	size_t _tileDataLength;	
@@ -159,6 +164,8 @@
 	
 	uint16 _multiCount;
 	MultiTileEntryData *_multiTable;
+	uint16 _multiDataCount;
+	int16 *_multiTableData;
 
 	TileMapData _tileMap;
 	





More information about the Scummvm-git-logs mailing list