[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.34,1.35 script_v8.cpp,2.61,2.62 scumm.h,1.116,1.117

Max Horn fingolfin at users.sourceforge.net
Fri Dec 27 06:37:04 CET 2002


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

Modified Files:
	object.cpp script_v8.cpp scumm.h 
Log Message:
fixed flobject loading in V8

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- object.cpp	26 Dec 2002 21:50:13 -0000	1.34
+++ object.cpp	27 Dec 2002 14:36:27 -0000	1.35
@@ -420,11 +420,11 @@
 		error("More than %d objects in room %d", _numLocalObjects, _roomResource);
 
 	od = &_objs[1];
-
 	if (_features & GF_AFTER_V8)
 		searchptr = rootptr = getResourceAddress(rtRoomScripts, _roomResource);
 	else
 		searchptr = rootptr = room;
+	assert(searchptr);
 
 	for (i = 0; i < _numObjectsInRoom; i++, od++) {
 		ptr = findResource(MKID('OBCD'), searchptr);
@@ -445,6 +445,9 @@
 		do {
 			char buf[32];
 			sprintf(buf, "roomobj-%d-", _roomResource);
+			if (_features & GF_AFTER_V8)
+				// TODO - maybe V8 is not the only that needs this?
+				ptr = findResource(MKID('VERB'), ptr, 0);
 			dumpResource(buf, od->obj_nr, ptr);
 		} while (0);
 #endif
@@ -537,19 +540,19 @@
 		searchptr = NULL;
 	}
 
-	od = &_objs[1];
-	for (i = 1; i <= _numObjectsInRoom; i++, od++) {
-		setupRoomObject(od, room);
+	for (i = 1; i <= _numObjectsInRoom; i++) {
+		setupRoomObject(&_objs[i], room);
 	}
 
 	CHECK_HEAP
 }
 
-void Scumm::setupRoomObject(ObjectData *od, byte *room)
+void Scumm::setupRoomObject(ObjectData *od, byte *room, byte *searchptr)
 {
 	CodeHeader *cdhd = NULL;
 	ImageHeader *imhd = NULL;
-	byte *searchptr = NULL;
+
+	assert(room);
 
 	if (_features & GF_SMALL_HEADER) {
 
@@ -579,11 +582,13 @@
 		return;
 	}
 
-	if (_features & GF_AFTER_V8)
-		searchptr = getResourceAddress(rtRoomScripts, _roomResource);
-	else
-		searchptr = room;
-
+	if (searchptr == NULL) {
+		if (_features & GF_AFTER_V8)
+			searchptr = getResourceAddress(rtRoomScripts, _roomResource);
+		else
+			searchptr = room;
+	}
+		
 	cdhd = (CodeHeader *)findResourceData(MKID('CDHD'), searchptr + od->OBCDoffset);
 	if (cdhd == NULL)
 		error("Room %d missing CDHD blocks(s)", _roomResource);
@@ -894,6 +899,7 @@
 	}
 	if (findWhat & foCodeHeader) {
 		searchptr = roomptr;
+		assert(searchptr);
 		for (i = 0;;) {
 			if (_features & GF_SMALL_HEADER)
 				obcdptr = findResourceSmall(MKID('OBCD'), searchptr);
@@ -926,6 +932,7 @@
 	roomptr = fo->roomptr;
 	if (findWhat & foImageHeader) {
 		searchptr = roomptr;
+		assert(searchptr);
 		for (i = 0;;) {
 			if (_features & GF_SMALL_HEADER)
 				obimptr = findResourceSmall(MKID('OBIM'), searchptr);
@@ -1286,10 +1293,10 @@
 	} else {
 		idx = getObjectIndex(eo->number);
 		assert(idx != -1);
-		ptr = getResourceAddress(1, _roomResource) + _objs[idx].OBIMoffset;
+		ptr = getResourceAddress(rtRoom, _roomResource) + _objs[idx].OBIMoffset;
 	}
 	if (!ptr)
-		error("BlastObject object %d image not found", eo->number);
+		error("BlastObject object %d (%d) image not found", eo->number, idx);
 
 	if (_features & GF_AFTER_V8) {
 		// The OBIM contains an IMAG, which in turn contains a WRAP, which contains
@@ -1594,39 +1601,44 @@
 	byte *flob, *roomptr;
 	uint32 obcd_size, obim_size, flob_size;
 
-	/* Don't load an already loaded object */
+	// Don't load an already loaded object
 	if (whereIsObject(object) != WIO_NOT_FOUND)
 		return;
 
-	/* Locate the object in the room resource */
+	// Locate the object in the room resource
 	findObjectInRoom(&foir, foImageHeader | foCodeHeader, object, room);
 
-	/* Add an entry for the new floating object in the local object table */
+	// Add an entry for the new floating object in the local object table
 	if (++_numObjectsInRoom > _numLocalObjects)
 		error("loadFlObject: Local Object Table overflow");
 	od = &_objs[_numObjectsInRoom];
 
-	/* Setup sizes */
+	// Setup sizes
 	obcd_size = READ_BE_UINT32_UNALIGNED(foir.obcd + 4);
 	od->OBCDoffset = 8;
 	od->OBIMoffset = obcd_size + 8;
 	obim_size = READ_BE_UINT32_UNALIGNED(foir.obim + 4);
 	flob_size = obcd_size + obim_size + 8;
 
-	/* Allocate slot & memory for floating object */
+	// Get room pointer
+	roomptr = getResourceAddress(rtRoom, room);
+	assert(roomptr);
+
+	// Allocate slot & memory for floating object
 	slot = findFlObjectSlot();
 	createResource(rtFlObject, slot, flob_size);
-
-	/* Copy object code + object image to floating object */
-	roomptr = getResourceAddress(rtRoom, room);
 	flob = getResourceAddress(rtFlObject, slot);
+	assert(flob);
+
+	// Copy object code + object image to floating object
 	((uint32 *)flob)[0] = MKID('FLOB');
 	((uint32 *)flob)[1] = TO_BE_32(flob_size);
+
 	memcpy(flob + 8, roomptr - foir.roomptr + foir.obcd, obcd_size);
 	memcpy(flob + 8 + obcd_size, roomptr - foir.roomptr + foir.obim, obim_size);
 
-	/* Setup local object flags */
-	setupRoomObject(od, flob);
+	// Setup local object flags
+	setupRoomObject(od, flob, flob);
 
 	od->fl_object_index = slot;
 }

Index: script_v8.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v8.cpp,v
retrieving revision 2.61
retrieving revision 2.62
diff -u -d -r2.61 -r2.62
--- script_v8.cpp	27 Dec 2002 00:58:21 -0000	2.61
+++ script_v8.cpp	27 Dec 2002 14:36:28 -0000	2.62
@@ -199,8 +199,8 @@
 		OPCODE(o6_stopObjectCode),
 		/* 7C */
 		OPCODE(o6_stopScript),
-		OPCODE(o6_jumpToScript),		// FIXME - is this right? "O_CHAIN_SCRIPT"
-		OPCODE(o6_dummy),				// FIXME - O_RETURN ? WTF is this, why don't they use the stack?
+		OPCODE(o6_jumpToScript),
+		OPCODE(o6_dummy),				// O_RETURN boils down to a NOP
 		OPCODE(o6_startObjectEx),
 		/* 80 */
 		OPCODE(o6_stopObjectScript),	// FIXME - is this right?
@@ -907,7 +907,12 @@
 		ensureResourceLoaded(rtCostume, resid);
 		break;
 	case 0x3E:		// SO_HEAP_LOAD_OBJECT Load object to heap
-		// TODO - is 'object' in COMI the same as FlObject in Sam&Max ?!?
+		{
+		// FIXME
+		int room = getObjectRoom(resid);
+		warning("o8_resourceRoutines: SO_HEAP_LOAD_OBJECT %d/%d", resid, room);
+		loadFlObject(resid, room);
+		}
 		break;
 	case 0x3F:		// SO_HEAP_LOAD_ROOM Load room to heap
 		ensureResourceLoaded(rtRoom, resid);
@@ -1300,6 +1305,7 @@
 	switch (args[0]) {
 	case 11:	// lockObject
 		warning("o6_kernelSetFunctions: lockObject(%d)", args[1]);
+		lock(rtFlObject, args[1]);	// FIXME - no idea if this is right?
 //		getObjectIndex(args[1]);
 //		if (ObjData.field28 != 0) {
 //			ObjData.field32 = 1;
@@ -1307,6 +1313,7 @@
 		break;
 	case 12:	// unlockObject
 		warning("o6_kernelSetFunctions: unlockObject(%d)", args[1]);
+		unlock(rtFlObject, args[1]);	// FIXME - no idea if this is right?
 //		getObjectIndex(args[1]);
 //		if (ObjData.field28 != 0) {
 //			ObjData.field32 = 0;

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -d -r1.116 -r1.117
--- scumm.h	27 Dec 2002 11:30:26 -0000	1.116
+++ scumm.h	27 Dec 2002 14:36:28 -0000	1.117
@@ -556,7 +556,7 @@
 	int findInventory(int owner, int index);
 	int getInventoryCount(int owner);
 
-	void setupRoomObject(ObjectData *od, byte *room);
+	void setupRoomObject(ObjectData *od, byte *room, byte *searchptr = NULL);
 	void removeObjectFromRoom(int obj);
 	void loadFlObject(uint object, uint room);
 	void nukeFlObjects(int min, int max);





More information about the Scummvm-git-logs mailing list