[Scummvm-cvs-logs] CVS: scummvm/queen structs.h,1.9,1.10 logic.h,1.29,1.30 logic.cpp,1.39,1.40

Gregory Montoir cyx at users.sourceforge.net
Wed Oct 15 01:47:03 CEST 2003


Update of /cvsroot/scummvm/scummvm/queen
In directory sc8-pr-cvs1:/tmp/cvs-serv10892

Modified Files:
	structs.h logic.h logic.cpp 
Log Message:
DISP_ROOM/REDISP_OBJ() implementation (still missing GRAPHIC_ANIM stuff)

Index: structs.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/structs.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- structs.h	14 Oct 2003 19:06:25 -0000	1.9
+++ structs.h	15 Oct 2003 08:46:18 -0000	1.10
@@ -120,7 +120,7 @@
 
 
 struct ObjectData {
-	//! entry in OBJECT_NAME
+	//! entry in OBJECT_NAME (<0: object is hidden)
 	int16 name;
 	//! coordinates of object
 	uint16 x, y;

Index: logic.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/logic.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- logic.h	14 Oct 2003 19:06:44 -0000	1.29
+++ logic.h	15 Oct 2003 08:46:18 -0000	1.30
@@ -109,6 +109,7 @@
 	void roomErase();
 	void roomSetupFurniture(); // SETUP_FURNITURE()
 	void roomSetupObjects(); // DISP_OBJECTS
+	uint16 roomRefreshObject(uint16 obj); // REDISP_OBJECT
 	void roomSetup(const char* room, int comPanel, bool inCutaway);
 	void roomDisplay(const char* room, RoomDisplayMode mode, uint16 joeScale, int comPanel, bool inCutaway); // DISP_ROOM
 

Index: logic.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/logic.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- logic.cpp	14 Oct 2003 19:06:44 -0000	1.39
+++ logic.cpp	15 Oct 2003 08:46:18 -0000	1.40
@@ -864,10 +864,10 @@
 
 	// static/animated Bobs
 	for (i = firstRoomObj; i <= lastRoomObj; ++i) {
-		int16 obj = _objectData[i].image;
+		ObjectData *pod = &_objectData[i];
 		// setup blanks bobs for turned off objects (in case 
 		// you turn them on again)
-		if (obj == -1) {
+		if (pod->image == -1) {
 			// static OFF Bob
 			curBob = 20 + _numFurnitureStatic + numObjectStatic;
 			++numObjectStatic;
@@ -875,16 +875,66 @@
 			++_numFrames;
 			++curImage;
 		}
-		else if(obj == -2) {
+		else if(pod->image == -2) {
 			// animated OFF Bob
 			curBob = 5 + _numFurnitureAnimated + numObjectAnimated;
 			++numObjectAnimated;
 		}
-		else if(obj > 0 && obj < 5000) {
-			// FIXME: need GRAPHIC_ANIM stuff
-			warning("Logic::roomSetupObjects() - Object number %d not handled", obj);
-		}
+		else if(pod->image > 0 && pod->image < 5000) {
+			GraphicData *pgd = &_graphicData[pod->image];
+			int16 lastFrame = pgd->lastFrame;
+			bool rebound = false;
+			if (lastFrame < 0) {
+				lastFrame = -lastFrame;
+				rebound = true;
+			}
+			if (pgd->firstFrame < 0) {
+				// FIXME: need GRAPHIC_ANIM stuff
+				// see queen.c l.1251-1296
+				warning("Logic::roomSetupObjects() - Object number %d not handled", pod->image);
+			}
+			else if (lastFrame != 0) {
+				// animated objects
+				uint16 j;
+				uint16 firstFrame = curImage + 1;
+				for (j = pgd->firstFrame; j <= lastFrame; ++j) {
+					++curImage;
+					_graphics->bankUnpack(j, curImage, 15);
+					++_numFrames;
+				}
+				curBob = 5 + _numFurnitureAnimated + numObjectAnimated;
+				if (pod->name > 0) {
+					BobSlot *pbs = _graphics->bob(curBob);
+					pbs->active = true;
+					pbs->x = pgd->x;
+					pbs->y = pgd->y;
+					pbs->frameNum = firstFrame;
+					if (pgd->speed > 0) {
+						_graphics->bobAnimNormal(curBob, firstFrame, curImage, pgd->speed / 4, rebound, false);
+					}
+				}
+				++numObjectAnimated;
+			}
+			else {
+				// static objects
+				curBob = 20 + _numFurnitureStatic + numObjectStatic;
+				++curImage;
+				_graphics->bobClear(curBob);
+
+				// FIXME: if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199;
 
+				_graphics->bankUnpack(pgd->firstFrame, curImage, 15);
+				++_numFrames;
+				if (pod->name > 0) {
+					BobSlot *pbs = _graphics->bob(curBob);
+					pbs->active = true;
+					pbs->x = pgd->x;
+					pbs->y = pgd->y;
+					pbs->frameNum = curImage;
+				}
+				++numObjectStatic;
+			}
+		}
 	}
 
 	// persons Bobs
@@ -917,6 +967,105 @@
 }
 
 
+uint16 Logic::roomRefreshObject(uint16 obj) {
+	warning("Logic::roomSetupObjects() not fully implemented");
+	uint16 curImage = _numFrames;
+
+	ObjectData *pod = &_objectData[obj];
+	if (pod->image == 0) {
+		return curImage;
+	}
+
+	// check the object is in the current room
+	if (pod->room != _currentRoom) {
+		warning("Logic::roomRefreshObject() - Trying to display an object that is not in room");
+		return curImage;
+	}
+
+	// find bob for the object
+	uint16 curBob = findBob(obj);
+	BobSlot *pbs = _graphics->bob(curBob);
+
+	if (pod->image == -3 || pod->image == -4) {
+		// a person object
+		if (pod->name < 0) {
+			_graphics->bobClear(curBob);
+		}
+		else {
+			// find person number
+			uint16 pNum = 1;
+			uint16 i = _roomData[_currentRoom] + 1;
+			while (i < obj) {
+				if (_objectData[i].image == -3 || _objectData[i].image == -4) {
+					++pNum;
+				}
+				++i;
+			}
+			curImage = _personFrames[pNum] - 1;
+			if (_personFrames[pNum] == 0) {
+				curImage = _numFrames;
+				_personFrames[pNum] = curImage;
+			}
+			curImage = personSetup(obj - _roomData[_currentRoom], curImage);
+		}
+		return curImage;
+	}
+
+	if (pod->name < 0 || pod->image < 0) {
+		// object is hidden or disabled
+		_graphics->bobClear(curBob);
+		return curImage;
+	}
+
+	// find frame used for object
+	curImage = findFrame(obj);
+
+	if (pod->image > 5000) {
+		GraphicData *pgd = &_graphicData[pod->image - 5000];
+		bool rebound = false;
+		int16 lastFrame = pgd->lastFrame;
+		if (lastFrame < 0) {
+			lastFrame = -lastFrame;
+			rebound = true;
+		}
+		if (pgd->firstFrame) {
+			// FIXME: need GRAPHIC_ANIM stuff
+			// see queen.c l.944-981
+			warning("Logic::roomRefreshObject() - Object number %d not handled", obj);
+		}
+		else if (lastFrame != 0) {
+			// turn on an animated bob
+			_graphics->bankUnpack(pgd->firstFrame, 2, 15);
+			pbs->animating = false;
+			uint16 firstFrame = curImage;
+			--curImage;
+			uint16 j;
+			for (j = pgd->firstFrame; j <= lastFrame; ++j) {
+				++curImage;
+				_graphics->bankUnpack(j, curImage, 15);
+			}
+			pbs->active = true;
+			pbs->x = pgd->x;
+			pbs->y = pgd->y;
+			pbs->frameNum = firstFrame;
+			if (pgd->speed > 0) {
+				_graphics->bobAnimNormal(curBob, firstFrame, curImage, pgd->speed / 4, rebound, false);
+			}
+		}
+		else {
+			// frame 2 is used as a buffer frame to prevent BOB flickering
+			_graphics->bankUnpack(pgd->firstFrame, 2, 15);
+			_graphics->bankUnpack(pgd->firstFrame, curImage, 15);
+			pbs->active = true;
+			pbs->x = pgd->x;
+			pbs->y = pgd->y;
+			pbs->frameNum = curImage;
+		}
+	}
+	return curImage;
+}
+
+
 void Logic::roomSetup(const char* room, int comPanel, bool inCutaway) {
 
 	// loads background image
@@ -1202,6 +1351,11 @@
 
 
 StateDirection Logic::findStateDirection(uint16 state) {
+
+	// FIXME: may be we should return a DIR_* constant instead
+	// of a STATE_DIR_*. Some (all ?) calls to FIND_STATE(, "DIR")
+	// are often followed by a DIR_* constant.
+
 	// see queen.c l.4016-4023
 	StateDirection sd = STATE_DIR_BACK;
 	switch ((state >> 2) & 3) {
@@ -1369,7 +1523,6 @@
 	_graphics->bankUnpack(frame, pbs->frameNum, 7);
 	return frame;
 }
-
 
 
 } // End of namespace Queen





More information about the Scummvm-git-logs mailing list