[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.121,1.122 actor.h,1.65,1.66 isomap.cpp,1.44,1.45 saveload.cpp,1.2,1.3

Andrew Kurushin h00ligan at users.sourceforge.net
Wed Apr 27 04:53:18 CEST 2005


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

Modified Files:
	actor.cpp actor.h isomap.cpp saveload.cpp 
Log Message:
some load-save preparetion

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -d -r1.121 -r1.122
--- actor.cpp	24 Apr 2005 15:17:37 -0000	1.121
+++ actor.cpp	27 Apr 2005 11:51:09 -0000	1.122
@@ -229,10 +229,6 @@
 			actor->currentAction = ITE_ActorTable[i].currentAction;
 			actor->facingDirection = ITE_ActorTable[i].facingDirection;
 			actor->actionDirection = ITE_ActorTable[i].actionDirection;
-			actor->frameNumber = 0;
-			actor->targetObject = ID_NOTHING;
-			actor->actorFlags = 0;
-			actor->lastZone = NULL;
 
 			actor->location.x = ITE_ActorTable[i].x;
 			actor->location.y = ITE_ActorTable[i].y;
@@ -255,12 +251,10 @@
 			obj->spriteListResourceId = ITE_ObjectTable[i].spriteListResourceId;
 			obj->sceneNumber = ITE_ObjectTable[i].sceneIndex;
 			obj->interactBits = ITE_ObjectTable[i].interactBits;
-			obj->flags = 0;
 
 			obj->location.x = ITE_ObjectTable[i].x;
 			obj->location.y = ITE_ObjectTable[i].y;
 			obj->location.z = ITE_ObjectTable[i].z;
-			obj->disabled = false;
 		}
 	
 	} else {
@@ -1248,7 +1242,7 @@
 	} else {
 		if (validActorId(commonObjectData->id)) {
 			spriteList = &((ActorData*)commonObjectData)->spriteList;	
-			frameNumber = commonObjectData->frameNumber;			
+			frameNumber = ((ActorData*)commonObjectData)->frameNumber;			
 		} else {
 			if (validObjId(commonObjectData->id)) {
 				spriteList = &_vm->_sprite->_mainSprites;

Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -d -r1.65 -r1.66
--- actor.h	22 Apr 2005 14:10:59 -0000	1.65
+++ actor.h	27 Apr 2005 11:51:10 -0000	1.66
@@ -26,6 +26,8 @@
 #ifndef SAGA_ACTOR_H__
 #define SAGA_ACTOR_H__
 
+#include "common/file.h"
+
 #include "saga/sprite.h"
 #include "saga/itedata.h"
 #include "saga/list.h"
@@ -131,28 +133,39 @@
 };
 
 struct Location {
-	int x;					// logical coordinates
-	int y;					// 
-	int z;					// 
+	int32 x;					// logical coordinates
+	int32 y;					// 
+	int32 z;					// 
 	Location() {
 		x = y = z = 0;
 	}
+	void saveState(File& out) {
+		out.writeSint32LE(x);
+		out.writeSint32LE(y);
+		out.writeSint32LE(z);
+	}
+	void loadState(File& in) {
+		x = in.readSint32LE();
+		y = in.readSint32LE();
+		z = in.readSint32LE();
+	}
+
 	int distance(const Location &location) const {
 		return MAX(ABS(x - location.x), ABS(y - location.y));
 	}
-	int &u() {
+	int32 &u() {
 		return x;
 	}
-	int &v() {
+	int32 &v() {
 		return y;
 	}
-	int u() const {
+	int32 u() const {
 		return x;
 	}
-	int v() const {
+	int32 v() const {
 		return y;
 	}
-	int uv() const {
+	int32 uv() const {
 		return u() + v();
 	}
 	void delta(const Location &location, Location &result) const {
@@ -190,30 +203,43 @@
 
 class CommonObjectData {
 public:
+//constant
 	bool disabled;				// disabled in init section 
-	int index;					// index in local array
+	int32 index;					// index in local array
 	uint16 id;					// object id
-	uint16 flags;				// initial flags
-	int nameIndex;				// index in name string list
-	int sceneNumber;			// scene
-	int scriptEntrypointNumber;	// script entrypoint number
-
+	int32 scriptEntrypointNumber;	// script entrypoint number
 	int32 spriteListResourceId;	// sprite list resource id
 
+//variables
+	uint16 flags;				// initial flags
+	int32 nameIndex;			// index in name string list
+	int32 sceneNumber;			// scene
+
 	Location location;			// logical coordinates
 	Point screenPosition;		// screen coordinates
-	int screenDepth;			//
-	int screenScale;			//
-
-	int frameNumber;			// current frame number
+	int32 screenDepth;			//
+	int32 screenScale;			//
 
-	CommonObjectData() {
-		screenDepth = screenScale = 0;
-		flags = 0;
-		frameNumber = 0;
-		spriteListResourceId = 0;
+	void saveState(File& out) {
+		out.writeUint16LE(flags);
+		out.writeSint32LE(nameIndex);
+		out.writeSint32LE(sceneNumber);
+		location.saveState(out);
+		out.writeSint16LE(screenPosition.x);
+		out.writeSint16LE(screenPosition.y);
+		out.writeSint32LE(screenDepth);
+		out.writeSint32LE(screenScale);
+	}
+	void loadState(File& in) {
+		flags = in.readUint16LE();
+		nameIndex = in.readSint32LE();
+		sceneNumber = in.readSint32LE();
+		location.loadState(in);
+		screenPosition.x = in.readSint16LE();
+		screenPosition.y = in.readSint16LE();
+		screenDepth = in.readSint32LE();
+		screenScale = in.readSint32LE();
 	}
-
 };
 
 typedef CommonObjectData *CommonObjectDataPointer;
@@ -222,65 +248,150 @@
 
 class ObjectData: public CommonObjectData {	
 public:
+	//constant
 	uint16 interactBits;
+	ObjectData() {
+		memset(this, 0, sizeof(*this)); 
+	}
 };
 
 class ActorData: public CommonObjectData {
 public:
+	//constant
+	SpriteList spriteList;		// sprite list data
+
+	ActorFrameSequence *frames;	// Actor's frames
+	int framesCount;			// Actor's frames count
+	int frameListResourceId;	// Actor's frame list resource id
 
 	byte speechColor;			// Actor dialogue color
 	
+	//variables
 	uint16 actorFlags;			// dynamic flags
-	int currentAction;			// ActorActions type
-	int facingDirection;		// orientation
-	int actionDirection;
-	int actionCycle;
+	int32 currentAction;			// ActorActions type
+	int32 facingDirection;		// orientation
+	int32 actionDirection;
+	int32 actionCycle;
 	uint16 targetObject;
 	const HitZone *lastZone;
 	
-	int cycleFrameSequence;
+	int32 cycleFrameSequence;
 	uint8 cycleDelay;
 	uint8 cycleTimeCount;
 	uint8 cycleFlags;
 
-	SpriteList spriteList;		// sprite list data
-
-	ActorFrameSequence *frames;	// Actor's frames
-	int framesCount;			// Actor's frames count
-	int frameListResourceId;	// Actor's frame list resource id
+	int32 frameNumber;			// current frame number
 	
-	int tileDirectionsAlloced;
+	int32 tileDirectionsAlloced;
 	byte *tileDirections;
 
-	int walkStepsAlloced;
+	int32 walkStepsAlloced;
 	Point *walkStepsPoints;
 
-	int walkStepsCount;
-	int walkStepIndex;
+	int32 walkStepsCount;
+	int32 walkStepIndex;
 
 	Location finalTarget;
 	Location partialTarget;
-	int walkFrameSequence;
-	
+	int32 walkFrameSequence;
+
+	void saveState(File& out) {
+		CommonObjectData::saveState(out);
+		out.writeUint16LE(actorFlags);
+		out.writeSint32LE(currentAction);
+		out.writeSint32LE(facingDirection);
+		out.writeSint32LE(actionDirection);
+		out.writeSint32LE(actionCycle);
+		out.writeUint16LE(targetObject);
+
+		//TODO: write lastZone 
+		out.writeSint32LE(cycleFrameSequence);
+		out.writeByte(cycleDelay);
+		out.writeByte(cycleTimeCount);
+		out.writeByte(cycleFlags);
+		out.writeSint32LE(frameNumber);
+
+		out.writeSint32LE(tileDirectionsAlloced);
+		for(int i = 0; i < tileDirectionsAlloced; i++) {
+			out.writeByte(tileDirections[i]);
+		}
+
+		out.writeSint32LE(walkStepsAlloced);
+		for(int i = 0; i < walkStepsAlloced; i++) {
+			out.writeSint16LE(walkStepsPoints[i].x);
+			out.writeSint16LE(walkStepsPoints[i].y);
+		}
+
+		out.writeSint32LE(walkStepsCount);
+		out.writeSint32LE(walkStepIndex);
+		finalTarget.saveState(out);
+		partialTarget.saveState(out);
+		out.writeSint32LE(walkFrameSequence);
+	}
+	void loadState(File& in) {
+		CommonObjectData::loadState(in);
+		actorFlags = in.readUint16LE();
+		currentAction = in.readSint32LE();
+		facingDirection = in.readSint32LE();
+		actionDirection = in.readSint32LE();
+		actionCycle = in.readSint32LE();
+		targetObject = in.readUint16LE();
+
+		//TODO: read lastZone 
+		lastZone = NULL;
+		cycleFrameSequence = in.readSint32LE();
+		cycleDelay = in.readByte();
+		cycleTimeCount = in.readByte();
+		cycleFlags = in.readByte();
+		frameNumber = in.readSint32LE();
+
+		
+		setTileDirectionsSize(in.readSint32LE(), true);
+		for(int i = 0; i < tileDirectionsAlloced; i++) {
+			tileDirections[i] = in.readByte();
+		}
+
+		setWalkStepsPointsSize(in.readSint32LE(), true);
+		for(int i = 0; i < walkStepsAlloced; i++) {
+			walkStepsPoints[i].x = in.readSint16LE();
+			walkStepsPoints[i].y = in.readSint16LE();
+		}
+
+		walkStepsCount = in.readSint32LE();
+		walkStepIndex = in.readSint32LE();
+		finalTarget.loadState(in);
+		partialTarget.loadState(in);
+		walkFrameSequence = in.readSint32LE();
+	}
+
+	void setTileDirectionsSize(int size, bool forceRealloc) {
+		if ((size <= tileDirectionsAlloced) && !forceRealloc) {
+			return;
+		}
+		tileDirectionsAlloced = size;
+		tileDirections = (byte*)realloc(tileDirections, tileDirectionsAlloced * sizeof(*tileDirections));
+	}
+
 	void cycleWrap(int cycleLimit) {
 		if (actionCycle >= cycleLimit)
 			actionCycle = 0;
 	}
 
-	void addWalkStepPoint(const Point &point) {
-		if (walkStepsCount + 1 > walkStepsAlloced) {
-			walkStepsAlloced += 100;
-			walkStepsPoints = (Point*)realloc(walkStepsPoints, walkStepsAlloced * sizeof(*walkStepsPoints));
+	void setWalkStepsPointsSize(int size, bool forceRealloc) {
+		if ((size <= walkStepsAlloced) && !forceRealloc) {
+			return;
 		}
+		walkStepsAlloced = size;
+		walkStepsPoints = (Point*)realloc(walkStepsPoints, walkStepsAlloced * sizeof(*walkStepsPoints));		
+	}
+
+	void addWalkStepPoint(const Point &point) {
+		setWalkStepsPointsSize(walkStepsCount + 1, false);
 		walkStepsPoints[walkStepsCount++] = point;
 	}
 
 	ActorData() {
-		memset(this, 0xFE, sizeof(*this)); 
-		walkStepsPoints = NULL;
-		tileDirectionsAlloced = walkStepsAlloced = walkStepsCount = walkStepIndex = 0;
-		tileDirections = NULL;
-		memset(&spriteList, 0, sizeof(spriteList));
+		memset(this, 0, sizeof(*this)); 
 	}
 	~ActorData() {
 		free(frames);

Index: isomap.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/isomap.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- isomap.cpp	22 Apr 2005 01:38:27 -0000	1.44
+++ isomap.cpp	27 Apr 2005 11:51:10 -0000	1.45
@@ -1337,11 +1337,8 @@
 		i = 64;
 	}*/
 	actor->walkStepsCount = i;
-	if (i) {	
-		if (actor->tileDirectionsAlloced < i) {
-			actor->tileDirectionsAlloced = i;
-			actor->tileDirections = (byte*)realloc(actor->tileDirections, actor->tileDirectionsAlloced * sizeof(*actor->tileDirections));
-		}
+	if (i) {
+		actor->setTileDirectionsSize(i, false);
 		memcpy(actor->tileDirections, res, i );
 	}
 }

Index: saveload.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saveload.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- saveload.cpp	22 Apr 2005 01:38:27 -0000	1.2
+++ saveload.cpp	27 Apr 2005 11:51:11 -0000	1.3
@@ -42,10 +42,9 @@
 void SagaEngine::save() {
 	File out;
 
-	out.open("ite.sav", File::kFileWriteMode);
+	out.open("iteSCUMMVM.sav", File::kFileWriteMode);
+	//TODO: version number
 
-	out.writeSint16LE(_actor->_actorsCount);
-	out.writeSint16LE(_actor->_objsCount);
 	out.writeSint16LE(_script->_commonBufferSize);
 	out.writeSint16LE(_actor->getProtagState());
 
@@ -61,37 +60,12 @@
 
 	for (i = 0; i < _actor->_actorsCount; i++) {
 		ActorData *a = _actor->_actors[i];
-
-		out.writeSint32LE(a->sceneNumber);
-		out.writeSint16LE(a->location.x);
-		out.writeSint16LE(a->location.y);
-		out.writeSint16LE(a->location.z);
-		out.writeSint16LE(a->finalTarget.x);
-		out.writeSint16LE(a->finalTarget.y);
-		out.writeSint16LE(a->finalTarget.z);
-		out.writeByte(a->currentAction);
-		out.writeByte(a->facingDirection);
-		out.writeSint16LE(a->targetObject);
-		out.writeByte(a->flags & (kProtagonist | kFollower));
-		out.writeByte(a->frameNumber);
-		out.writeSint16LE(0);
+		a->saveState(out);
 	}
 	
 	for (i = 0; i < _actor->_objsCount; i++) {
 		ObjectData *o = _actor->_objs[i];
-
-		out.writeSint32LE(o->sceneNumber);
-		out.writeSint32LE(o->id);
-		out.writeSint16LE(o->location.x);
-		out.writeSint16LE(o->location.y);
-		out.writeSint16LE(o->location.z);
-		out.writeSint16LE(o->nameIndex);
-		if (o->sceneNumber == ITE_SCENE_INV) {
-			out.writeSint16LE(_interface->inventoryItemPosition(_actor->objIndexToId(i)));
-		} else {
-			out.writeSint16LE(0);
-		}
-		out.writeByte(0);
+		o->saveState(out);
 	}
 	
 	for (i = 0; i < _script->_commonBufferSize; i++)
@@ -105,17 +79,15 @@
 
 void SagaEngine::load() {
 	File in;
-	int actorsCount, objsCount, commonBufferSize;
+	int  commonBufferSize;
 	int scenenum, inset;
 	int mapx, mapy;
 
-	in.open("ite.sav");
+	in.open("iteSCUMMVM.sav");
 
 	if (!in.isOpen())
 		return;
 
-	actorsCount = in.readSint16LE();
-	objsCount = in.readSint16LE();
 	commonBufferSize = in.readSint16LE();
 	_actor->setProtagState(in.readSint16LE());
 
@@ -131,42 +103,16 @@
 
 	uint16 i;
 
-	for (i = 0; i < actorsCount; i++) {
+	for (i = 0; i < _actor->_actorsCount; i++) {
 		ActorData *a = _actor->_actors[i];
-
-		a->sceneNumber = in.readSint32LE();
-		a->location.x = in.readSint16LE();
-		a->location.y = in.readSint16LE();
-		a->location.z = in.readSint16LE();
-		a->finalTarget.x = in.readSint16LE();
-		a->finalTarget.y = in.readSint16LE();
-		a->finalTarget.z = in.readSint16LE();
-		a->currentAction = in.readByte();
-		a->facingDirection = in.readByte();
-		a->targetObject = in.readSint16LE();
-		a->flags = (a->flags & ~(kProtagonist | kFollower) | in.readByte());
-		a->frameNumber = in.readByte();
-		in.readSint16LE();
+		a->loadState(in);
 	}
 	
-	_interface->clearInventory();
+	_interface->clearInventory(); //TODO: interface load-save-state
 
-	for (i = 0; i < objsCount; i++) {
+	for (i = 0; i < _actor->_objsCount; i++) {
 		ObjectData *o = _actor->_objs[i];
-		int pos;
-
-		o->sceneNumber = in.readSint32LE();
-		o->id = in.readSint32LE();
-		o->location.x = in.readSint16LE();
-		o->location.y = in.readSint16LE();
-		o->location.z = in.readSint16LE();
-		o->nameIndex = in.readSint16LE();
-		
-		pos = in.readSint16LE();
-		if (o->sceneNumber == ITE_SCENE_INV) {
-			_interface->addToInventory(_actor->objIndexToId(i), pos);
-		}
-		in.readByte();
+		o->loadState(in);
 	}
 	
 	for (i = 0; i < commonBufferSize; i++)





More information about the Scummvm-git-logs mailing list