[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.205,1.206 actor.h,1.101,1.102

Andrew Kurushin h00ligan at users.sourceforge.net
Wed Jan 11 10:51:00 CET 2006


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

Modified Files:
	actor.cpp actor.h 
Log Message:
IHNM actor frame WIP

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.205
retrieving revision 1.206
diff -u -d -r1.205 -r1.206
--- actor.cpp	1 Dec 2005 18:22:29 -0000	1.205
+++ actor.cpp	11 Jan 2006 18:50:17 -0000	1.206
@@ -46,6 +46,24 @@
 
 namespace Saga {
 
+enum ActorFrameIds {
+//ITE
+	kFrameITEStand = 0,
+	kFrameITEWalk = 1,
+	kFrameITESpeak = 2,
+	kFrameITEGive = 3,
+	kFrameITEGesture = 4,
+	kFrameITEWait = 5,
+	kFrameITEPickUp = 6,
+	kFrameITELook = 7,
+//IHNM
+	kFrameIHNMStand = 0,
+	kFrameIHNMSpeak = 1, //Checked
+	kFrameIHNMWait = 2,
+	kFrameIHNMGesture = 3,
+	kFrameIHNMWalk = 4 //Checked
+};
+
 static int commonObjectCompare(const CommonObjectDataPointer& obj1, const CommonObjectDataPointer& obj2) {
 	int p1 = obj1->_location.y - obj1->_location.z;
 	int p2 = obj2->_location.y - obj2->_location.z;
@@ -323,12 +341,19 @@
 		MemoryReadStreamEndian readS(resourcePointer, resourceLength, _actorContext->isBigEndian);
 
 		for (int i = 0; i < framesCount; i++) {
+			debug(9, "frameType %d", i);
 			for (int orient = 0; orient < ACTOR_DIRECTIONS_COUNT; orient++) {
 				// Load all four orientations
 				framesPointer[i].directions[orient].frameIndex = readS.readUint16();
-				framesPointer[i].directions[orient].frameCount = readS.readSint16();
+				if (_vm->getGameType() == GType_ITE) {
+					framesPointer[i].directions[orient].frameCount = readS.readSint16();
+				} else {
+					framesPointer[i].directions[orient].frameCount = readS.readByte();
+					readS.readByte();
+				}
 				if (framesPointer[i].directions[orient].frameCount < 0)
 					warning("frameCount < 0 (%d)", framesPointer[i].directions[orient].frameCount);
+				debug(9, "frameIndex %d frameCount %d", framesPointer[i].directions[orient].frameIndex, framesPointer[i].directions[orient].frameCount);
 			}
 		}
 
@@ -341,8 +366,8 @@
 	} else {
 		warning("Frame List ID = 0 for actor index %d", actor->_index);
 
-		if (_vm->getGameType() == GType_ITE)
-			return true;
+		//if (_vm->getGameType() == GType_ITE)
+		return true;
 	}
 
 	if (actor->_spriteListResourceId) {
@@ -382,11 +407,13 @@
 
 	_vm->_sprite->loadList(resourceId, actor->_spriteList);
 
-	if (actor->_flags & kExtended) {
-		while ((lastFrame >= actor->_spriteList.spriteCount)) {
-			resourceId++;
-			debug(9, "Appending to actor sprite list %d", resourceId);
-			_vm->_sprite->loadList(resourceId, actor->_spriteList);
+	if (_vm->getGameType() == GType_ITE) {
+		if (actor->_flags & kExtended) {
+			while ((lastFrame >= actor->_spriteList.spriteCount)) {
+				resourceId++;
+				debug(9, "Appending to actor sprite list %d", resourceId);
+				_vm->_sprite->loadList(resourceId, actor->_spriteList);
+			}
 		}
 	}
 }
@@ -488,10 +515,10 @@
 
 	for (i = 0; i < _actorsCount; i++) {
 		actor = _actors[i];
-		if (actor->_flags & kProtagonist) {
+		//if (actor->_flags & kProtagonist) {
 			loadActorResources(actor);
-			break;
-		}
+			//break;
+		//}
 	}
 
 	_centerActor = _protagonist = _actors[protagonistIdx];
@@ -899,28 +926,47 @@
 	}
 }
 
-int Actor::getFrameType(int frameType) {
-	if (_vm->getGameType() == GType_ITE)
-		return frameType;
-
-	switch (frameType) {
-	case kFrameStand:
-		return kFrameIHNMStand;
-	case kFrameWalk:
-		return kFrameIHNMWalk;
-	case kFrameSpeak:
-		return kFrameIHNMSpeak;
-	case kFrameGesture:
-		return kFrameIHNMGesture;
-	case kFrameWait:
-		return kFrameIHNMWait;
-	default:
-		warning("Actor::getFrameType() unknown frame type %d", frameType);
-		return kFrameIHNMStand;
+int Actor::getFrameType(ActorFrameTypes frameType) {
+	
+	if (_vm->getGameType() == GType_ITE) {
+		switch (frameType) {
+		case kFrameStand:
+			return kFrameITEStand;
+		case kFrameWalk:
+			return kFrameITEWalk;
+		case kFrameSpeak:
+			return kFrameITESpeak;
+		case kFrameGive:
+			return kFrameITEGive;
+		case kFrameGesture:
+			return kFrameITEGesture;
+		case kFrameWait:
+			return kFrameITEWait;
+		case kFramePickUp:
+			return kFrameITEPickUp;
+		case kFrameLook:
+			return kFrameITELook;
+		}
 	}
+	else {
+		switch (frameType) {
+		case kFrameStand:
+			return kFrameIHNMStand;
+		case kFrameWalk:
+			return kFrameIHNMWalk;
+		case kFrameSpeak:
+			return kFrameIHNMSpeak;
+		case kFrameGesture:
+			return kFrameIHNMGesture;
+		case kFrameWait:
+			return kFrameIHNMWait;
+		}
+	}
+	error("Actor::getFrameType() unknown frame type %d", frameType);
 }
 
 ActorFrameRange *Actor::getActorFrameRange(uint16 actorId, int frameType) {
+	ActorFrameRange * fr = NULL;
 	ActorData *actor;
 	int fourDirection;
 	static ActorFrameRange def = {0, 0};
@@ -929,16 +975,97 @@
 	if (actor->_disabled)
 		error("Actor::getActorFrameRange Wrong actorId 0x%X", actorId);
 
-	if (frameType >= actor->_framesCount) {
-		warning("Actor::getActorFrameRange Wrong frameType 0x%X (%d) actorId 0x%X", frameType, actor->_framesCount, actorId);
-		return &def;
-	}
-
 	if ((actor->_facingDirection < kDirUp) || (actor->_facingDirection > kDirUpLeft))
 		error("Actor::getActorFrameRange Wrong direction 0x%X actorId 0x%X", actor->_facingDirection, actorId);
 
-	fourDirection = actorDirectectionsLUT[actor->_facingDirection];
-	return &actor->_frames[frameType].directions[fourDirection];
+	//if (_vm->getGameType() == GType_ITE) {
+		if (frameType >= actor->_framesCount) {
+			warning("Actor::getActorFrameRange Wrong frameType 0x%X (%d) actorId 0x%X", frameType, actor->_framesCount, actorId);
+			return &def;
+		}
+
+
+		fourDirection = actorDirectectionsLUT[actor->_facingDirection];
+		return &actor->_frames[frameType].directions[fourDirection];
+/*
+	} else {
+		if (0 == actor->_framesCount) {
+			return &def;
+		}
+		
+		//TEST
+		if (actor->_id == 0x2000) {
+			if (actor->_framesCount <= _currentFrameIndex) {				
+				_currentFrameIndex = 0;
+			}
+			fr = actor->_frames[_currentFrameIndex].directions;			
+			return fr;
+		}
+		//TEST
+		if (frameType >= actor->_framesCount) {
+			frameType = actor->_framesCount - 1;
+		}
+		if (frameType < 0) {
+			frameType = 0;
+		}
+
+		if (frameType == kFrameIHNMWalk  ) {
+			switch (actor->_facingDirection) {
+			case kDirUpRight:
+				if (frameType > 0)
+					fr = &actor->_frames[frameType - 1].directions[ACTOR_DIRECTION_RIGHT];
+				else
+					fr = &def;
+				if (!fr->frameCount) 
+					fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_RIGHT];
+				break;
+			case kDirDownRight:
+				if (frameType > 0)
+					fr = &actor->_frames[frameType - 1].directions[ACTOR_DIRECTION_FORWARD];
+				else
+					fr = &def;
+				if (!fr->frameCount) 
+					fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_RIGHT];
+				break;
+			case kDirUpLeft:
+				if (frameType > 0)
+					fr = &actor->_frames[frameType - 1].directions[ACTOR_DIRECTION_LEFT];
+				else
+					fr = &def;
+				if (!fr->frameCount) 
+					fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_LEFT];
+				break;
+			case kDirDownLeft:
+				if (frameType > 0)
+					fr = &actor->_frames[frameType - 1].directions[ACTOR_DIRECTION_BACK];
+				else
+					fr = &def;
+				if (!fr->frameCount) 
+					fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_LEFT];
+				break;
+			case kDirRight:
+				fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_RIGHT];
+				break;
+			case kDirLeft:
+				fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_LEFT];
+				break;
+			case kDirUp:
+				fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_BACK];
+				break;
+			case kDirDown:
+				fr = &actor->_frames[frameType].directions[ACTOR_DIRECTION_FORWARD];
+				break;			
+			}
+			return fr;
+		}
+		else {
+			if (frameType >= actor->_framesCount) {
+				error("Actor::getActorFrameRange Wrong frameType 0x%X (%d) actorId 0x%X", frameType, actor->_framesCount, actorId);
+			}
+			fourDirection = actorDirectectionsLUT[actor->_facingDirection];
+			return &actor->_frames[frameType].directions[fourDirection];
+		}
+	}*/
 }
 
 void Actor::handleSpeech(int msec) {

Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -d -r1.101 -r1.102
--- actor.h	1 Dec 2005 18:22:29 -0000	1.101
+++ actor.h	11 Jan 2006 18:50:17 -0000	1.102
@@ -98,23 +98,14 @@
 };
 
 enum ActorFrameTypes {
-	kFrameStand = 0,
-	kFrameWalk = 1,
-	kFrameSpeak = 2,
-	kFrameGive = 3,
-	kFrameGesture = 4,
-	kFrameWait = 5,
-	kFramePickUp = 6,
-	kFrameLook = 7,
-//...some special
-
-	// TODO: Verify that these are correct for IHNM
-	kFrameIHNMStand = 0,
-	kFrameIHNMSpeak = 1,
-	kFrameIHNMWait = 2,
-	kFrameIHNMGesture = 3,
-	kFrameIHNMWalkDiag = 4,
-	kFrameIHNMWalk = 5
+	kFrameStand,
+	kFrameWalk,
+	kFrameSpeak,
+	kFrameGive,
+	kFrameGesture,
+	kFrameWait,
+	kFramePickUp,
+	kFrameLook
 };
 
 enum ActorFlagsEx {
@@ -572,7 +563,7 @@
 	void takeExit(uint16 actorId, const HitZone *hitZone);
 	bool actorEndWalk(uint16 actorId, bool recurse);
 	bool actorWalkTo(uint16 actorId, const Location &toLocation);
-	int getFrameType(int frameType);
+	int getFrameType(ActorFrameTypes frameType);
 	ActorFrameRange *getActorFrameRange(uint16 actorId, int frameType);
 	void actorFaceTowardsPoint(uint16 actorId, const Location &toLocation);
 	void actorFaceTowardsObject(uint16 actorId, uint16 objectId);
@@ -605,6 +596,11 @@
 	void freeObjList();
 	void loadObjList(int objectCount, int objectsResourceID);
 
+	/*
+	uint16 _currentFrameIndex;
+	void frameTest() {
+		_currentFrameIndex++; 
+	}*/
 protected:
 	friend class Script;
 	bool loadActorResources(ActorData *actor);





More information about the Scummvm-git-logs mailing list