aboutsummaryrefslogtreecommitdiff
path: root/saga
diff options
context:
space:
mode:
Diffstat (limited to 'saga')
-rw-r--r--saga/actor.cpp8
-rw-r--r--saga/actor.h211
-rw-r--r--saga/isomap.cpp7
-rw-r--r--saga/saveload.cpp76
4 files changed, 175 insertions, 127 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 297919d67c..d879c70ed4 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -229,10 +229,6 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
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 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
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 @@ bool Actor::getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber
} 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;
diff --git a/saga/actor.h b/saga/actor.h
index 542687d4a5..243c426c88 100644
--- a/saga/actor.h
+++ b/saga/actor.h
@@ -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 ActorFrameSequence {
};
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 @@ struct Location {
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
-
- CommonObjectData() {
- screenDepth = screenScale = 0;
- flags = 0;
- frameNumber = 0;
- spriteListResourceId = 0;
+ int32 screenDepth; //
+ int32 screenScale; //
+
+ 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 @@ typedef SortedList<CommonObjectDataPointer> CommonObjectOrderList;
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);
diff --git a/saga/isomap.cpp b/saga/isomap.cpp
index 7b0a3b4ee4..8a3e90a8c5 100644
--- a/saga/isomap.cpp
+++ b/saga/isomap.cpp
@@ -1337,11 +1337,8 @@ void IsoMap::findTilePath(ActorData* actor, const Location &start, const Locatio
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 );
}
}
diff --git a/saga/saveload.cpp b/saga/saveload.cpp
index 71661128a2..a0daf0e93f 100644
--- a/saga/saveload.cpp
+++ b/saga/saveload.cpp
@@ -42,10 +42,9 @@ namespace Saga {
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 @@ void SagaEngine::save() {
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::save() {
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 @@ void SagaEngine::load() {
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++)