[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.251,1.252 resource.cpp,1.335,1.336 room.cpp,1.24,1.25 scumm.cpp,1.597,1.598 scumm.h,1.645,1.646

kirben kirben at users.sourceforge.net
Thu Oct 13 19:14:49 CEST 2005


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

Modified Files:
	object.cpp resource.cpp room.cpp scumm.cpp scumm.h 
Log Message:

HE games store and restore locked FlObjects between rooms.
Fixes input issue in thinker1.


Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.251
retrieving revision 1.252
diff -u -d -r1.251 -r1.252
--- object.cpp	13 Oct 2005 15:02:21 -0000	1.251
+++ object.cpp	14 Oct 2005 02:13:33 -0000	1.252
@@ -507,7 +507,8 @@
 			_objs[i].obj_nr = 0;
 		}
 	} else {
-		// FIXME: Locking/FlObjects stuff?
+		storeFlObject(-1);
+
 		for (i = 0; i < _numLocalObjects; i++) {
 			if (_objs[i].obj_nr < 1)	// Optimise codepath
 				continue;
@@ -521,12 +522,41 @@
 					res.nukeResource(rtFlObject, _objs[i].fl_object_index);
 					_objs[i].obj_nr = 0;
 					_objs[i].fl_object_index = 0;
+				} else if (_heversion >= 70) {
+					storeFlObject(i);
+					_objs[i].obj_nr = 0;
+					_objs[i].fl_object_index = 0;
 				}
 			}
 		}
 	}
 }
 
+void ScummEngine::storeFlObject(int slot) {
+	if (slot == -1) {
+		_numStoredFlObjects = 0;
+	} else {
+		memcpy(&_storedFlObjects[_numStoredFlObjects], &_objs[slot], sizeof(_objs[slot]));
+		_numStoredFlObjects++;
+		if (_numStoredFlObjects > 100)
+			error("Too many flobjects saved on room transition.");
+	}
+}
+
+void ScummEngine::restoreFlObjects() {
+	if (!_numStoredFlObjects)
+		return;
+
+	int i, slot;
+
+	for (i = 0; i < _numStoredFlObjects; i++) {
+		slot = findLocalObjectSlot();
+		memcpy(&_objs[slot], &_storedFlObjects[i], sizeof(_objs[slot]));
+	}
+
+	_numStoredFlObjects = 0;
+}
+
 void ScummEngine::loadRoomObjects() {
 	int i, j;
 	ObjectData *od;
@@ -1675,6 +1705,12 @@
 	if (whereIsObject(object) != WIO_NOT_FOUND)
 		return;
 
+	int i;
+	for (i = 0; i < _numStoredFlObjects; i++) {
+		if (_storedFlObjects[i].obj_nr == object)
+			return;
+	}
+
 	// Locate the object in the room resource
 	findObjectInRoom(&foir, foImageHeader | foCodeHeader, object, room);
 

Index: resource.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/resource.cpp,v
retrieving revision 1.335
retrieving revision 1.336
diff -u -d -r1.335 -r1.336
--- resource.cpp	17 Sep 2005 00:31:51 -0000	1.335
+++ resource.cpp	14 Oct 2005 02:13:33 -0000	1.336
@@ -1251,8 +1251,10 @@
 	_roomVars = (int32 *)calloc(_numRoomVariables, sizeof(int32));
 	_scummVars = (int32 *)calloc(_numVariables, sizeof(int32));
 	_bitVars = (byte *)calloc(_numBitVariables >> 3, 1);
-	if (_heversion >= 60)
+	if (_heversion >= 60) {
 		_arraySlot = (byte *)calloc(_numArray, 1);
+		_storedFlObjects = (ObjectData *)calloc(100, sizeof(ObjectData));
+	}
 
 	allocResTypeData(rtCostume, (_features & GF_NEW_COSTUMES) ? MKID('AKOS') : MKID('COST'),
 								_numCostumes, "costume", 1);

Index: room.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/room.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- room.cpp	24 Sep 2005 10:15:17 -0000	1.24
+++ room.cpp	14 Oct 2005 02:13:33 -0000	1.25
@@ -127,6 +127,7 @@
 	if (_currentRoom == 0) {
 		_ENCD_offs = _EXCD_offs = 0;
 		_numObjectsInRoom = 0;
+		restoreFlObjects();
 		return;
 	}
 
@@ -136,7 +137,7 @@
 	initBGBuffers(_roomHeight);
 
 	loadRoomObjects();
-
+	restoreFlObjects();
 
 	if (VAR_ROOM_WIDTH != 0xFF && VAR_ROOM_HEIGHT != 0xFF) {
 		VAR(VAR_ROOM_WIDTH) = _roomWidth;

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.597
retrieving revision 1.598
diff -u -d -r1.597 -r1.598
--- scumm.cpp	12 Oct 2005 22:52:47 -0000	1.597
+++ scumm.cpp	14 Oct 2005 02:13:33 -0000	1.598
@@ -946,6 +946,7 @@
 	_musicEngine = NULL;
 	_verbs = NULL;
 	_objs = NULL;
+	_storedFlObjects = NULL;
 	_debugFlags = 0;
 	_sound = NULL;
 	memset(&vm, 0, sizeof(vm));
@@ -970,6 +971,7 @@
 	_numRoomVariables = 0;
 	_numLocalObjects = 0;
 	_numGlobalObjects = 0;
+	_numStoredFlObjects = 0;
 	_numArray = 0;
 	_numVerbs = 0;
 	_numFlObject = 0;

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.645
retrieving revision 1.646
diff -u -d -r1.645 -r1.646
--- scumm.h	2 Oct 2005 01:26:53 -0000	1.645
+++ scumm.h	14 Oct 2005 02:13:33 -0000	1.646
@@ -376,6 +376,7 @@
 
 	VerbSlot *_verbs;
 	ObjectData *_objs;
+	ObjectData *_storedFlObjects;
 	ScummDebugger *_debugger;
 
 	// Core variables
@@ -512,6 +513,7 @@
 	int _numNewNames, _numGlobalScripts;
 	int _numRoomVariables;
 	int _numPalettes, _numSprites, _numTalkies, _numUnk;
+	int _numStoredFlObjects;
 	int _HEHeapSize;
 public:
 	int _numLocalScripts, _numImages, _numRooms, _numScripts, _numSounds;	// Used by HE games
@@ -732,6 +734,8 @@
 	virtual void loadRoomSubBlocks();
 	virtual void initRoomSubBlocks();
 	void clearRoomObjects();
+	void storeFlObject(int slot);
+	void restoreFlObjects();
 	virtual void loadRoomObjects();
 
 	virtual void readArrayFromIndexFile();





More information about the Scummvm-git-logs mailing list