[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.70,1.71

Max Horn fingolfin at users.sourceforge.net
Sat Apr 12 05:59:03 CEST 2003


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

Modified Files:
	object.cpp 
Log Message:
added GF_OLD_BUNDLE to findObjectInRoom

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -d -r1.70 -r1.71
--- object.cpp	12 Apr 2003 02:09:00 -0000	1.70
+++ object.cpp	12 Apr 2003 12:58:20 -0000	1.71
@@ -922,15 +922,21 @@
 }
 
 void Scumm::findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint id, uint room) {
+
 	CodeHeader *cdhd;
 	int i, numobj;
 	byte *roomptr, *obcdptr, *obimptr, *searchptr;
-	RoomHeader *roomhdr;
 	ImageHeader *imhd;
 	int id2;
 	int id3;
 
 	if (findWhat & foCheckAlreadyLoaded && getObjectIndex(id) != -1) {
+		if (_features & GF_OLD_BUNDLE) {
+			// I am not sure if this is even needed for old games...
+			// but using RES_SIZE defintily won't work with OLD_BUNDLE, since it
+			// assumes the size is 32 bit but in old games it's 16 bit
+			error("findObjectInRoom foCheckAlreadyLoaded NYI for GF_OLD_BUNDLE (id = %d, room = %d)", id, room);
+		}
 		fo->obcd = obcdptr = getOBCDFromObject(id);
 		assert((byte *)obcdptr > (byte *)256);
 		fo->obim = obimptr = obcdptr + RES_SIZE(obcdptr);
@@ -943,20 +949,46 @@
 	if (!roomptr)
 		error("findObjectInRoom: failed getting roomptr to %d", room);
 
-	roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
-
-	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));
-
+	if (_features & GF_OLD_BUNDLE) {
+		numobj = roomptr[20];
+	} else {
+		RoomHeader *roomhdr = (RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
+	
+		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));
+	}
+	
 	if (numobj == 0)
 		error("findObjectInRoom: No object found in room %d", room);
 	if (numobj > _numLocalObjects)
 		error("findObjectInRoom: More (%d) than %d objects in room %d", numobj, _numLocalObjects, room);
 
+	if (_features & GF_OLD_BUNDLE) {
+		searchptr = roomptr + 29;
+		for (i = 0; i < numobj; i++) {
+			obimptr = roomptr + READ_LE_UINT16(searchptr);
+			obcdptr = roomptr + READ_LE_UINT16(searchptr + 2 * _numObjectsInRoom);
+			id2 = READ_LE_UINT16(obcdptr + 4);
+
+			if (id2 == (uint16)id) {
+				if (findWhat & foCodeHeader) {
+					fo->obcd = obcdptr;
+					fo->cdhd = (CodeHeader *)(obcdptr + 10);	// TODO - FIXME
+				}
+				if (findWhat & foImageHeader) {
+					fo->obim = obimptr;
+					fo->imhd = 0;	// TODO - FIXME: is this used at all?
+				}
+				break;
+			}
+		}
+		return;
+	}
+
 	if (findWhat & foCodeHeader) {
 		if (_features & GF_AFTER_V8)
 			searchptr = getResourceAddress(rtRoomScripts, room);
@@ -982,8 +1014,8 @@
 				id2 = READ_LE_UINT16(&(cdhd->v5.obj_id));
 
 			if (id2 == (uint16)id) {
-				fo->cdhd = cdhd;
 				fo->obcd = obcdptr;
+				fo->cdhd = cdhd;
 				break;
 			}
 			if (++i == numobj)





More information about the Scummvm-git-logs mailing list