[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.20,1.21 scummvm.cpp,2.4,2.5

Max Horn fingolfin at users.sourceforge.net
Mon Dec 23 20:03:06 CET 2002


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv11582

Modified Files:
	object.cpp scummvm.cpp 
Log Message:
changed lots of stuff to read data in the V8 format; more changes still needed, and one open problem: V8 IMHD has no obj_id, we need to work around that somehow, not yet sure what the correct way is (two find out, we either need to get into a state where this actually matters, so that we can do trial & error, or we need a disassmbly)

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- object.cpp	21 Dec 2002 01:11:41 -0000	1.20
+++ object.cpp	24 Dec 2002 04:02:21 -0000	1.21
@@ -196,7 +196,10 @@
 			}
 			assert(ptr);
 			imhd = (ImageHeader *)findResourceData(MKID('IMHD'), ptr);
-			if (_features & GF_AFTER_V7) {
+			if (_features & GF_AFTER_V8) {
+				x = od->x_pos + (int32)READ_LE_UINT32(&imhd->v8.hotspot[state].x);
+				y = od->y_pos + (int32)READ_LE_UINT32(&imhd->v8.hotspot[state].y);
+			} else if (_features & GF_AFTER_V7) {
 				x = od->x_pos + (int16)READ_LE_UINT16(&imhd->v7.hotspot[state].x);
 				y = od->y_pos + (int16)READ_LE_UINT16(&imhd->v7.hotspot[state].y);
 			} else {
@@ -402,7 +405,9 @@
 	CHECK_HEAP room = getResourceAddress(rtRoom, _roomResource);
 	roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), room);
 
-	if (_features & GF_AFTER_V7)
+	if (_features & GF_AFTER_V8)
+		_numObjectsInRoom = READ_LE_UINT32(&(roomhdr->v8.numObjects));
+	else if (_features & GF_AFTER_V7)
 		_numObjectsInRoom = READ_LE_UINT16(&(roomhdr->v7.numObjects));
 	else
 		_numObjectsInRoom = READ_LE_UINT16(&(roomhdr->old.numObjects));
@@ -447,7 +452,11 @@
 			error("Room %d missing image blocks(s)", _roomResource);
 
 		imhd = (ImageHeader *)findResourceData(MKID('IMHD'), ptr);
-		if (_features & GF_AFTER_V7)
+		if (_features & GF_AFTER_V8)
+			// FIXME - in v8, IMHD seems to contain no obj_id, but rather a name string
+			obim_id = 0;
+//			obim_id = READ_LE_UINT32(&imhd->v8.obj_id);
+		else if (_features & GF_AFTER_V7)
 			obim_id = READ_LE_UINT16(&imhd->v7.obj_id);
 		else
 			obim_id = READ_LE_UINT16(&imhd->old.obj_id);
@@ -564,42 +573,23 @@
 	}
 
 	cdhd = (CodeHeader *)findResourceData(MKID('CDHD'), room + od->offs_obcd_to_room);
-	if (_features & GF_AFTER_V7)
+
+	if (_features & GF_AFTER_V8) {
+		od->obj_nr = READ_LE_UINT16(&(cdhd->v7.obj_id));
+
+		od->parent = cdhd->v7.parent;
+		od->parentstate = cdhd->v7.parentstate;
+
+		imhd = (ImageHeader *)findResourceData(MKID('IMHD'), room + od->offs_obim_to_room);
+		od->x_pos = READ_LE_UINT32(&imhd->v8.x_pos);
+		od->y_pos = READ_LE_UINT32(&imhd->v8.y_pos);
+		od->width = READ_LE_UINT32(&imhd->v8.width);
+		od->height = READ_LE_UINT32(&imhd->v8.height);
+		od->actordir = READ_LE_UINT32(&imhd->v8.actordir);
+
+	} else if (_features & GF_AFTER_V7) {
 		od->obj_nr = READ_LE_UINT16(&(cdhd->v7.obj_id));
-	else if (_features & GF_AFTER_V6)
-		od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id));
-	else
-		od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id));
 
-	if (!(_features & GF_AFTER_V7)) {
-		if (_features & GF_AFTER_V6) {
-			od->width = READ_LE_UINT16(&cdhd->v6.w);
-			od->height = READ_LE_UINT16(&cdhd->v6.h);
-			od->x_pos = ((int16)READ_LE_UINT16(&cdhd->v6.x));
-			od->y_pos = ((int16)READ_LE_UINT16(&cdhd->v6.y));
-			if (cdhd->v6.flags == 0x80) {
-				od->parentstate = 1;
-			} else {
-				od->parentstate = (cdhd->v6.flags & 0xF);
-			}
-			od->parent = cdhd->v6.parent;
-			od->actordir = cdhd->v6.actordir;
-		} else {
-			od->width = cdhd->v5.w << 3;
-			od->height = cdhd->v5.h << 3;
-			od->x_pos = cdhd->v5.x << 3;
-			od->y_pos = cdhd->v5.y << 3;
-			if (cdhd->v5.flags == 0x80) {
-				od->parentstate = 1;
-			} else {
-				od->parentstate = (cdhd->v5.flags & 0xF);
-			}
-			od->parent = cdhd->v5.parent;
-			od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x);
-			od->walk_y = READ_LE_UINT16(&cdhd->v5.walk_y);
-			od->actordir = cdhd->v5.actordir;
-		}
-	} else {
 		od->parent = cdhd->v7.parent;
 		od->parentstate = cdhd->v7.parentstate;
 
@@ -610,7 +600,38 @@
 		od->height = READ_LE_UINT16(&imhd->v7.height);
 		od->actordir = READ_LE_UINT16(&imhd->v7.actordir);
 
+	} else if (_features & GF_AFTER_V6) {
+		od->obj_nr = READ_LE_UINT16(&(cdhd->v6.obj_id));
+
+		od->width = READ_LE_UINT16(&cdhd->v6.w);
+		od->height = READ_LE_UINT16(&cdhd->v6.h);
+		od->x_pos = ((int16)READ_LE_UINT16(&cdhd->v6.x));
+		od->y_pos = ((int16)READ_LE_UINT16(&cdhd->v6.y));
+		if (cdhd->v6.flags == 0x80) {
+			od->parentstate = 1;
+		} else {
+			od->parentstate = (cdhd->v6.flags & 0xF);
+		}
+		od->parent = cdhd->v6.parent;
+		od->actordir = cdhd->v6.actordir;
+	} else {
+		od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id));
+
+		od->width = cdhd->v5.w << 3;
+		od->height = cdhd->v5.h << 3;
+		od->x_pos = cdhd->v5.x << 3;
+		od->y_pos = cdhd->v5.y << 3;
+		if (cdhd->v5.flags == 0x80) {
+			od->parentstate = 1;
+		} else {
+			od->parentstate = (cdhd->v5.flags & 0xF);
+		}
+		od->parent = cdhd->v5.parent;
+		od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x);
+		od->walk_y = READ_LE_UINT16(&cdhd->v5.walk_y);
+		od->actordir = cdhd->v5.actordir;
 	}
+
 	od->fl_object_index = 0;
 }
 
@@ -810,7 +831,8 @@
 		memcpy(getResourceAddress(rtInventory, slot), obcdptr, size);
 	}
 
-CHECK_HEAP}
+	CHECK_HEAP
+}
 
 void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint room)
 {
@@ -837,7 +859,9 @@
 
 	roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
 
-	if (_features & GF_AFTER_V7)
+	if (_features & GF_AFTER_V8)
+		numobj = READ_LE_UINT32(&(roomhdr->v8.numObjects));
+	else if (_features & GF_AFTER_V7)
 		numobj = READ_LE_UINT16(&(roomhdr->v7.numObjects));
 	else
 		numobj = READ_LE_UINT16(&(roomhdr->old.numObjects));
@@ -864,7 +888,11 @@
 				}
 			} else {
 				cdhd = (CodeHeader *)findResourceData(MKID('CDHD'), obcdptr);
-				if (_features & GF_AFTER_V7)
+				if (_features & GF_AFTER_V8)
+					// FIXME - in v8, IMHD seems to contain no obj_id, but rather a name string
+					id2 = 0;
+//					id2 = READ_LE_UINT32(&(cdhd->v8.obj_id));
+				else if (_features & GF_AFTER_V7)
 					id2 = READ_LE_UINT16(&(cdhd->v7.obj_id));
 				else if (_features & GF_AFTER_V6)
 					id2 = READ_LE_UINT16(&(cdhd->v6.obj_id));
@@ -900,7 +928,11 @@
 					break;
 				}
 			} else {
-				if (_features & GF_AFTER_V7)
+				if (_features & GF_AFTER_V8)
+					// FIXME - in v8, IMHD seems to contain no obj_id, but rather a name string
+					id3 = 0;
+//					id3 = READ_LE_UINT32(&imhd->v8.obj_id);
+				else if (_features & GF_AFTER_V7)
 					id3 = READ_LE_UINT16(&imhd->v7.obj_id);
 				else
 					id3 = READ_LE_UINT16(&imhd->old.obj_id);
@@ -1111,20 +1143,21 @@
 
 	findObjectInRoom(&foir, foCodeHeader | foImageHeader | foCheckAlreadyLoaded, img, room);
 
-	if (_features & GF_AFTER_V7)
+	if (_features & GF_AFTER_V8) {
+		setCursorHotspot2(READ_LE_UINT32(&foir.imhd->v8.hotspot[0].x),
+		                  READ_LE_UINT32(&foir.imhd->v8.hotspot[0].y));
+		w = READ_LE_UINT32(&foir.imhd->v8.width) >> 3;
+		h = READ_LE_UINT32(&foir.imhd->v8.height) >> 3;
+	} else if (_features & GF_AFTER_V7) {
 		setCursorHotspot2(READ_LE_UINT16(&foir.imhd->v7.hotspot[0].x),
-											READ_LE_UINT16(&foir.imhd->v7.hotspot[0].y));
-	else
+		                  READ_LE_UINT16(&foir.imhd->v7.hotspot[0].y));
+		w = READ_LE_UINT16(&foir.imhd->v7.width) >> 3;
+		h = READ_LE_UINT16(&foir.imhd->v7.height) >> 3;
+	} else {
 		setCursorHotspot2(READ_LE_UINT16(&foir.imhd->old.hotspot[0].x),
-											READ_LE_UINT16(&foir.imhd->old.hotspot[0].y));
-
-
-	if (!(_features & GF_AFTER_V7)) {
+		                  READ_LE_UINT16(&foir.imhd->old.hotspot[0].y));
 		w = READ_LE_UINT16(&foir.cdhd->v6.w) >> 3;
 		h = READ_LE_UINT16(&foir.cdhd->v6.h) >> 3;
-	} else {
-		w = READ_LE_UINT16(&foir.imhd->v7.width) >> 3;
-		h = READ_LE_UINT16(&foir.imhd->v7.height) >> 3;
 	}
 
 	dataptr = findResource(IMxx_tags[imgindex], foir.obim);

Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.4
retrieving revision 2.5
diff -u -d -r2.4 -r2.5
--- scummvm.cpp	23 Dec 2002 23:30:14 -0000	2.4
+++ scummvm.cpp	24 Dec 2002 04:02:21 -0000	2.5
@@ -727,7 +727,10 @@
 
 	rmhd = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
 
-	if (_features & GF_AFTER_V7) {
+	if (_features & GF_AFTER_V8) {
+		_scrWidth = READ_LE_UINT32(&(rmhd->v8.width));
+		_scrHeight = READ_LE_UINT32(&(rmhd->v8.height));
+	} else if (_features & GF_AFTER_V7) {
 		_scrWidth = READ_LE_UINT16(&(rmhd->v7.width));
 		_scrHeight = READ_LE_UINT16(&(rmhd->v7.height));
 	} else {
@@ -747,7 +750,7 @@
 	if (ptr) {
 		_EXCD_offs = ptr - roomptr;
 #ifdef DUMP_SCRIPTS
-	dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
+		dumpResource("exit-", _roomResource, ptr - _resourceHeaderSize);
 #endif
 	}
 
@@ -755,7 +758,7 @@
 	if (ptr) {
 		_ENCD_offs = ptr - roomptr;
 #ifdef DUMP_SCRIPTS
-	dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
+		dumpResource("entry-", _roomResource, ptr - _resourceHeaderSize);
 #endif
 	}
 
@@ -804,14 +807,27 @@
 	ptr = findResourceData(MKID('SCAL'), roomptr);
 	if (ptr) {
 		offs = ptr - roomptr;
-		for (i = 1; i < _maxScaleTable; i++, offs += 8) {
-			int a = READ_LE_UINT16(roomptr + offs);
-			int b = READ_LE_UINT16(roomptr + offs + 2);
-			int c = READ_LE_UINT16(roomptr + offs + 4);
-			int d = READ_LE_UINT16(roomptr + offs + 6);
-			if (a || b || c || d) {
-				setScaleItem(i, b, a, d, c);
-				roomptr = getResourceAddress(rtRoom, _roomResource);
+		if (_features & GF_AFTER_V7) {
+			for (i = 1; i < _maxScaleTable; i++, offs += 16) {
+				int a = READ_LE_UINT32(roomptr + offs);
+				int b = READ_LE_UINT32(roomptr + offs + 4);
+				int c = READ_LE_UINT32(roomptr + offs + 8);
+				int d = READ_LE_UINT32(roomptr + offs + 12);
+				if (a || b || c || d) {
+					setScaleItem(i, b, a, d, c);
+					roomptr = getResourceAddress(rtRoom, _roomResource);
+				}
+			}
+		} else {
+			for (i = 1; i < _maxScaleTable; i++, offs += 8) {
+				int a = READ_LE_UINT16(roomptr + offs);
+				int b = READ_LE_UINT16(roomptr + offs + 2);
+				int c = READ_LE_UINT16(roomptr + offs + 4);
+				int d = READ_LE_UINT16(roomptr + offs + 6);
+				if (a || b || c || d) {
+					setScaleItem(i, b, a, d, c);
+					roomptr = getResourceAddress(rtRoom, _roomResource);
+				}
 			}
 		}
 	}
@@ -839,7 +855,11 @@
 
 			ptr += _resourceHeaderSize;	/* skip tag & size */
 
-			if (_features & GF_AFTER_V7) {
+			if (_features & GF_AFTER_V8) {
+				id = READ_LE_UINT32(ptr);
+				checkRange(NUM_LOCALSCRIPT + _numGlobalScripts, _numGlobalScripts, id, "Invalid local script %d");
+				_localScriptList[id - _numGlobalScripts] = ptr + 4 - roomptr;
+			} else if (_features & GF_AFTER_V7) {
 				id = READ_LE_UINT16(ptr);
 				checkRange(NUM_LOCALSCRIPT + _numGlobalScripts, _numGlobalScripts, id, "Invalid local script %d");
 				_localScriptList[id - _numGlobalScripts] = ptr + 2 - roomptr;





More information about the Scummvm-git-logs mailing list