[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.54,1.55 actor.h,1.26,1.27 interface.cpp,1.44,1.45 script.h,1.34,1.35 sfuncs.cpp,1.52,1.53

Andrew Kurushin h00ligan at users.sourceforge.net
Sat Dec 25 03:18:00 CET 2004


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

Modified Files:
	actor.cpp actor.h interface.cpp script.h sfuncs.cpp 
Log Message:
- some "actors walk" work progression

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- actor.cpp	24 Dec 2004 21:16:24 -0000	1.54
+++ actor.cpp	25 Dec 2004 11:17:02 -0000	1.55
@@ -218,7 +218,7 @@
 		if (actor->flags & (kProtagonist | kFollower)) {
 			actor->sceneNumber = _vm->_scene->currentSceneNumber();
 			if (actor->flags & kProtagonist) {
-//				actor->finalTarget = a->obj.loc;
+//todo:				actor->finalTarget = a->obj.loc;
 				_centerActor = _protagonist = actor;
 			}
 
@@ -436,7 +436,7 @@
 				actor->cycleTimeCount = actor->cycleDelay;
 				actor->actionCycle++;
 
-				frameRange = getActorFrameRange( actor->actorId, actor->cycleFrameNumber);
+				frameRange = getActorFrameRange( actor->actorId, actor->cycleFrameSequence);
 				
 				if (actor->currentAction == kActionPongFrames) {
 					if (actor->actionCycle >= frameRange->frameCount * 2 - 2) {
@@ -505,9 +505,37 @@
 	return SUCCESS;
 }
 
+void Actor::calcActorScreenPosition(ActorData * actor) {
+	int	beginSlope, endSlope, middle;
+	// tiled stuff
+	{
+	}
+	{
+		middle = ITE_STATUS_Y - actor->location.y / ACTOR_LMULT;
+
+		_vm->_scene->getSlopes(beginSlope, endSlope);
+
+		actor->screenDepth = (14 * middle) / endSlope + 1;
+
+		if (middle <= beginSlope) {
+			actor->screenScale = 256;
+		} else {
+			if (middle >= endSlope) {
+				actor->screenScale = 1;
+			} else {
+				middle -= beginSlope;
+				endSlope -= beginSlope;
+				actor->screenScale = 256 - (middle * 256) / endSlope;
+			}
+		}
+
+		actor->screenPosition.x = (actor->location.x / ACTOR_LMULT);
+		actor->screenPosition.y = (actor->location.y / ACTOR_LMULT) - actor->location.z;
+	}
+}
+
 void Actor::createDrawOrderList() {
 	int i;
-	int	beginSlope, endSlope, middle;
 	ActorData *actor;
 
 	_drawOrderList.clear();
@@ -518,31 +546,7 @@
 
 		_drawOrderList.pushBack(actor, actorCompare);
 
-		// tiled stuff
-		{
-		}
-		{
-			middle = ITE_STATUS_Y - actor->location.y / ACTOR_LMULT,
-
-				_vm->_scene->getSlopes(beginSlope, endSlope);
-
-			actor->screenDepth = (14 * middle) / endSlope + 1;
-
-			if (middle <= beginSlope) {
-				actor->screenScale = 256;
-			} else {
-				if (middle >= endSlope) {
-					actor->screenScale = 1;
-				} else {
-					middle -= beginSlope;
-					endSlope -= beginSlope;
-					actor->screenScale = 256 - (middle * 256) / endSlope;
-				}
-			}
-
-			actor->screenPosition.x = (actor->location.x / ACTOR_LMULT);
-			actor->screenPosition.y = (actor->location.y / ACTOR_LMULT) - actor->location.z;
-		}
+		calcActorScreenPosition(actor);
 	}
 }
 
@@ -635,26 +639,90 @@
 	actorPoint.y = (screenPoint.y * ACTOR_LMULT);
 }
 
-bool Actor::actorWalkTo(uint16 actorId, const ActorLocation &actorLocation) {
+bool Actor::followProtagonist(ActorData * actor) {
+	return false;
+}
+
+bool Actor::actorEndWalk(uint16 actorId, bool recurse) {
+	bool walkMore = false;
 	ActorData *actor;
 
 	actor = getActor(actorId);
+	actor->actorFlags &= ~kActorBackwards;
 
-/*	if (a == protag)
-	{
-		sceneDoors[ 2 ] = 0xff;				// closed
-		sceneDoors[ 3 ] = 0;				// open
+	if (actor->location.distance(actor->finalTarget) > 8) {
+		if ((actor->flags & kProtagonist) && recurse && !(actor->actorFlags & kActorNoCollide)) {
+			actor->actorFlags |= kActorNoCollide;
+			return actorWalkTo(actorId, actor->finalTarget);
+		}
 	}
-	else
-	{
-		sceneDoors[ 2 ] = 0;				// open
-		sceneDoors[ 3 ] = 0xff;				// closed
-	}*/
+
+	actor->currentAction = kActionWait;
+	if (actor->actorFlags & kActorFinalFace) {
+		actor->facingDirection = actor->actionDirection = (actor->actorFlags >> 6) & 0x07; //?
+	}
+
+	actor->actorFlags &= ~(kActorNoCollide | kActorCollided | kActorFinalFace | kActorFacingMask);
+	actor->flags &= ~(kFaster | kFastest);
+
+	if (actor == _protagonist) {
+		_vm->_script->wakeUpActorThread(kWaitTypeWalk, actor);
+		//todo: it
+
+	} else {
+		if (recurse && (actor->flags & kFollower))
+			walkMore = followProtagonist(actor);
+
+		_vm->_script->wakeUpActorThread(kWaitTypeWalk, actor);
+	}
+	return walkMore;
+}
+
+bool Actor::actorWalkTo(uint16 actorId, const ActorLocation &toLocation) {
+	ActorData *actor;
+
+	actor = getActor(actorId);
+
 
 	// tiled stuff
 	{
+		//todo: it
 	}
 	{
+		Point pointFrom, pointTo, pointBest;
+
+		pointFrom.x = actor->location.x / ACTOR_LMULT;
+		pointFrom.y = actor->location.y / ACTOR_LMULT;
+
+
+		pointTo.x = toLocation.x / ACTOR_LMULT;
+		pointTo.y = toLocation.y / ACTOR_LMULT;
+
+
+		if (_vm->_scene->isBGMaskPresent()) {
+			//todo: it
+		} else {
+			actor->walkPath[0] = pointTo.x / 2;
+			actor->walkPath[1] = pointTo.y;
+			actor->walkStepsCount = 2;
+			actor->walkStepIndex = 0;
+		}
+
+		actor->partialTarget = actor->location;
+		actor->finalTarget = toLocation;
+		if (actor->walkStepsCount == 0) {
+			actorEndWalk(actorId, false);
+			return false;
+		} else {
+			if (actor->flags & kProtagonist) {
+				_actors[1].actorFlags &= ~kActorNoFollow;
+				_actors[2].actorFlags &= ~kActorNoFollow;
+			}
+			
+			actor->currentAction = (actor->walkStepsCount == ACTOR_STEPS_COUNT) ? kActionWalkToLink : kActionWalkToPoint;
+			actor->walkFrameSequence = kFrameWalk;
+		}
+
 	}
 	return false;
 

Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- actor.h	24 Dec 2004 20:44:39 -0000	1.26
+++ actor.h	25 Dec 2004 11:17:03 -0000	1.27
@@ -35,7 +35,8 @@
 #define ACTOR_BASE_SPEED 0.25
 #define ACTOR_BASE_ZMOD 0.5
 
-#define ACTOR_DEFAULT_ORIENT 2
+#define ACTOR_STEPS_COUNT 32
+#define ACTOR_STEPS_MAX (ACTOR_STEPS_COUNT*2)
 
 #define ACTOR_ACTIONTIME 80
 
@@ -106,7 +107,7 @@
 	kActorFinishRight = ((1 << 5) | (kDirRight << 6)),
 	kActorFinishUp = ((1 << 5) | (kDirUp << 6)),
 	kActorFinishDown = ((1 << 5) | (kDirDown << 6)),
-	kActorFacing = (0xf << 5),
+	kActorFacingMask = (0xf << 5),
 	kActorRandom = (1 << 10)
 };
 
@@ -124,6 +125,9 @@
 	int x;					// Actor's logical coordinates
 	int y;					// 
 	int z;					// 
+	int distance(const ActorLocation &location) {
+		return max(abs(x - location.x), abs(y - location.y));
+	}
 };
 struct ActorData {
 	bool disabled;				// Actor disabled in init section
@@ -149,7 +153,7 @@
 	int frameNumber;			// current actor frame number
 	uint16 targetObject;		
 	
-	int cycleFrameNumber;
+	int cycleFrameSequence;
 	uint8 cycleDelay;
 	uint8 cycleTimeCount;
 	uint8 cycleFlags;
@@ -160,7 +164,13 @@
 	ActorFrameSequence *frames;	// Actor's frames
 	int framesCount;			// Actor's frames count
 	int frameListResourceId;	// Actor's frame list resource id
-
+	
+	int walkPath[ACTOR_STEPS_MAX];
+	int walkStepsCount;
+	int walkStepIndex;
+	ActorLocation finalTarget;
+	ActorLocation partialTarget;
+	int walkFrameSequence;
 	
 	void cycleWrap(int cycleLimit) {
 		if (actionCycle >= cycleLimit)
@@ -168,39 +178,7 @@
 	}
 
 	ActorData() {
-		disabled = false;
-		index = 0;
-		actorId = 0;
-
-		nameIndex = 0;
-		speechColor = 0;
-		
-		frames = NULL;
-		framesCount = 0;
-		frameListResourceId = 0;
-		
-		spriteList = NULL;
-		spriteListResourceId = 0;
-
-		flags = 0;
-		sceneNumber = 0;
-		location.x = 0;
-		location.y = 0;
-		location.z = 0;
-		screenDepth = 0;
-		
-		actorFlags = 0;
-		currentAction = 0;
-		facingDirection = 0;
-		actionDirection = 0;
-		actionCycle = 0;
-		targetObject = ID_NOTHING;
-
-		cycleFrameNumber = 0;
-		cycleDelay = 0;
-		cycleTimeCount = 0;
-		cycleFlags = 0;
-
+		memset(this, 0xFE, sizeof(*this)); 
 	}
 };
 
@@ -245,7 +223,8 @@
 	void StoA(Point &actorPoint, const Point &screenPoint);
 
 	
-	bool actorWalkTo(uint16 actorId, const ActorLocation &actorLocation);
+	bool actorEndWalk(uint16 actorId, bool recurse);
+	bool actorWalkTo(uint16 actorId, const ActorLocation &toLocation);
 	ActorData *getActor(uint16 actorId);
 	ActorFrameRange *getActorFrameRange(uint16 actorId, int frameType);
 
@@ -267,6 +246,8 @@
 	bool loadActorResources(ActorData * actor);
 	
 	void createDrawOrderList();
+	void calcActorScreenPosition(ActorData * actor);
+	bool followProtagonist(ActorData * actor);
 	void handleSpeech(int msec);
 	void handleActions(int msec, bool setup);
 	

Index: interface.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- interface.cpp	24 Dec 2004 21:16:24 -0000	1.44
+++ interface.cpp	25 Dec 2004 11:17:03 -0000	1.45
@@ -40,14 +40,14 @@
 namespace Saga {
 
 static VERB_DATA I_VerbData[] = {
-	{I_VERB_WALKTO, "verb_walkto", "Walk to", S_VERB_WALKTO},
-	{I_VERB_LOOKAT, "verb_lookat", "Look at", S_VERB_LOOKAT},
-	{I_VERB_PICKUP, "verb_pickup", "Pick up", S_VERB_PICKUP},
-	{I_VERB_TALKTO, "verb_talkto", "Talk to", S_VERB_TALKTO},
-	{I_VERB_OPEN, "verb_open", "Open", S_VERB_OPEN},
-	{I_VERB_CLOSE, "verb_close", "Close", S_VERB_CLOSE},
-	{I_VERB_USE, "verb_use", "Use", S_VERB_USE},
-	{I_VERB_GIVE, "verb_give", "Give", S_VERB_GIVE}
+	{I_VERB_WALKTO, "verb_walkto", "Walk to", kVerbWalkTo},
+	{I_VERB_LOOKAT, "verb_lookat", "Look at", kVerbLookAt},
+	{I_VERB_PICKUP, "verb_pickup", "Pick up", kVerbPickup},
+	{I_VERB_TALKTO, "verb_talkto", "Talk to", kVerbSpeakTo},
+	{I_VERB_OPEN, "verb_open", "Open", kVerbOpen},
+	{I_VERB_CLOSE, "verb_close", "Close", kVerbClose},
+	{I_VERB_USE, "verb_use", "Use", kVerbUse},
+	{I_VERB_GIVE, "verb_give", "Give", kVerbGive}
 };
 
 static INTERFACE_DESC ITE_interface = {

Index: script.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- script.h	24 Dec 2004 20:44:39 -0000	1.34
+++ script.h	25 Dec 2004 11:17:03 -0000	1.35
@@ -51,15 +51,23 @@
 
 typedef unsigned int ScriptDataWord;
 
-enum SCRIPT_VERBS {
-	S_VERB_WALKTO = 0,
-	S_VERB_LOOKAT = 2,
-	S_VERB_PICKUP = 1,
-	S_VERB_TALKTO,
-	S_VERB_OPEN = 5,
-	S_VERB_CLOSE = 6,
-	S_VERB_USE = 8,
-	S_VERB_GIVE
+enum VerbTypes {
+//todo: LUT for drawing
+	kVerbNone = 0,
+	kVerbPickup = 1,
+	kVerbLookAt = 2,
+	kVerbWalkTo = 3,
+	kVerbSpeakTo = 4,
+	kVerbOpen = 5,
+	kVerbClose = 6,
+	kVerbGive = 7,
+	kVerbUse = 8,
+	kVerbOptions = 9,
+	kVerbEnter = 10,
+	kVerbLeave = 11,
+	kVerbBegin = 12,
+	kVerbWalkOnly = 13,
+	kVerbLookOnly = 14
 };
 
 #define STHREAD_TIMESLICE 8

Index: sfuncs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sfuncs.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- sfuncs.cpp	24 Dec 2004 20:44:39 -0000	1.52
+++ sfuncs.cpp	25 Dec 2004 11:17:03 -0000	1.53
@@ -694,13 +694,13 @@
 int Script::sfCycleFrames(SCRIPTFUNC_PARAMS) {
 	uint16 actorId;
 	int flags;
-	int cycleFrameNumber;
+	int cycleFrameSequence;
 	int cycleDelay;
 	ActorData *actor;
 
 	actorId = getSWord(thread->pop());
 	flags = getUWord(thread->pop());
-	cycleFrameNumber = getUWord(thread->pop());
+	cycleFrameSequence = getUWord(thread->pop());
 	cycleDelay =  getUWord(thread->pop());
 
 	actor = _vm->_actor->getActor(actorId);
@@ -723,7 +723,7 @@
 		actor->actorFlags |= kActorBackwards;
 	}
 
-	actor->cycleFrameNumber	= cycleFrameNumber;
+	actor->cycleFrameSequence	= cycleFrameSequence;
 	actor->cycleTimeCount = 0;
 	actor->cycleDelay = cycleDelay;
 	actor->actionCycle = 0;





More information about the Scummvm-git-logs mailing list