aboutsummaryrefslogtreecommitdiff
path: root/saga/actor.h
diff options
context:
space:
mode:
authorAndrew Kurushin2005-01-18 21:13:44 +0000
committerAndrew Kurushin2005-01-18 21:13:44 +0000
commit0ccf59faee053f4ea6c349d25bf39bb83e537686 (patch)
tree770d2871d776fb9672fdab5c82d43912485d9145 /saga/actor.h
parentb4b2e52df78fd309613d8df73f090b98e834969b (diff)
downloadscummvm-rg350-0ccf59faee053f4ea6c349d25bf39bb83e537686.tar.gz
scummvm-rg350-0ccf59faee053f4ea6c349d25bf39bb83e537686.tar.bz2
scummvm-rg350-0ccf59faee053f4ea6c349d25bf39bb83e537686.zip
partly implemented game objects
svn-id: r16595
Diffstat (limited to 'saga/actor.h')
-rw-r--r--saga/actor.h119
1 files changed, 84 insertions, 35 deletions
diff --git a/saga/actor.h b/saga/actor.h
index 4e18ca23ae..024f3c791c 100644
--- a/saga/actor.h
+++ b/saga/actor.h
@@ -35,6 +35,7 @@ namespace Saga {
class HitZone;
+
#define ACTOR_DEBUG
#define ACTOR_BARRIERS_MAX 16
@@ -120,11 +121,6 @@ struct PathDirectionData {
int16 y;
};
-struct PathNode {
- Point point;
- int link;
-};
-
struct ActorFrameRange {
int frameIndex;
int frameCount;
@@ -169,28 +165,51 @@ struct Location {
}
};
-struct ActorData {
- bool disabled; // Actor disabled in init section
- int index; // Actor index
- uint16 actorId; // Actor id
- int nameIndex; // Actor's index in actor name string list
- byte speechColor; // Actor dialogue color
- uint16 flags; // Actor initial flags
- int scriptEntrypointNumber; // Actor script entrypoint number
-
- int sceneNumber; // scene of actor
- Location location; // Actor's logical coordinates
-
- Point screenPosition; // Actor's screen coordinates
+class CommonObjectData {
+public:
+ int 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
+
+ Location location; // logical coordinates
+ Point screenPosition; // screen coordinates
int screenDepth; //
int screenScale; //
+ SpriteList spriteList; // sprite list data
+ int spriteListResourceId; // sprite list resource id
+
+ int frameNumber; // current frame number
+
+ CommonObjectData() {
+ screenDepth = screenScale = 0;
+ flags = 0;
+ frameNumber = 0;
+ }
+};
+
+typedef CommonObjectData *CommonObjectDataPointer;
+
+typedef SortedList<CommonObjectDataPointer> CommonObjectOrderList;
+
+class ObjectData: public CommonObjectData {
+public:
+ uint16 interactBits;
+};
+
+class ActorData: public CommonObjectData {
+public:
+ bool disabled; // Actor disabled in init section
+ byte speechColor; // Actor dialogue color
+
uint16 actorFlags; // dynamic flags
int currentAction; // ActorActions type
int facingDirection; // orientation
int actionDirection;
int actionCycle;
- int frameNumber; // current actor frame number
uint16 targetObject;
const HitZone *lastZone;
@@ -199,9 +218,6 @@ struct ActorData {
uint8 cycleTimeCount;
uint8 cycleFlags;
- SpriteList spriteList; // Actor's sprite list data
- int spriteListResourceId; // Actor's sprite list resource id
-
ActorFrameSequence *frames; // Actor's frames
int framesCount; // Actor's frames count
int frameListResourceId; // Actor's frame list resource id
@@ -242,8 +258,7 @@ struct ActorData {
}
};
-typedef ActorData *ActorDataPointer;
-typedef SortedList<ActorDataPointer> ActorOrderList;
+
struct SpeechData {
int speechColor[ACTOR_SPEECH_ACTORS_MAX];
@@ -270,15 +285,41 @@ class Actor {
public:
ActorData *_centerActor;
ActorData *_protagonist;
+ StringsTable _actorsStrings;
Actor(SagaEngine *vm);
~Actor();
void cmdActorWalkTo(int argc, const char **argv);
- bool validActorId(uint16 id) { return (id == ID_PROTAG) || ((id > OBJECT_TYPE_MASK) && (id < objectIndexToId(kGameObjectActor, _actorsCount))); }
+ bool validActorId(uint16 id) { return (id == ID_PROTAG) || ((id >= objectIndexToId(kGameObjectActor, 0)) && (id < objectIndexToId(kGameObjectActor, _actorsCount))); }
int actorIdToIndex(uint16 id) { return (id == ID_PROTAG ) ? 0 : objectIdToIndex(id); }
uint16 actorIndexToId(int index) { return (index == 0 ) ? ID_PROTAG : objectIndexToId(kGameObjectActor, index); }
+ ActorData *getActor(uint16 actorId);
+
+// clarification: Obj - means game object, such Hat, Spoon etc, Object - means Actor,Obj,HitZone,StepZone
+
+ bool validObjId(uint16 id) { return (id >= objectIndexToId(kGameObjectObject, 0)) && (id < objectIndexToId(kGameObjectObject, _objsCount)); }
+ int objIdToIndex(uint16 id) { return objectIdToIndex(id); }
+ uint16 objIndexToId(int index) { return objectIndexToId(kGameObjectObject, index); }
+ ObjectData *getObj(uint16 objId);
+
+ int getObjectScriptEntrypointNumber(uint16 id) {
+ int objectType;
+ objectType = objectTypeId(id);
+ if (!(objectType & (kGameObjectObject | kGameObjectActor))) {
+ error("Actor::getObjectScriptEntrypointNumber wrong id 0x%X", id);
+ }
+ return (objectType == kGameObjectObject) ? getObj(id)->scriptEntrypointNumber : getActor(id)->scriptEntrypointNumber;
+ }
+ int getObjectFlags(uint16 id) {
+ int objectType;
+ objectType = objectTypeId(id);
+ if (!(objectType & (kGameObjectObject | kGameObjectActor))) {
+ error("Actor::getObjectFlags wrong id 0x%X", id);
+ }
+ return (objectType == kGameObjectObject) ? getObj(id)->flags : getActor(id)->flags;
+ }
int direct(int msec);
int drawActors();
@@ -288,15 +329,14 @@ public:
uint16 testHit(const Point& mousePointer){ return ID_NOTHING;}; //TODO: do it
void takeExit(uint16 actorId, const HitZone *hitZone);
- const char * getActorName(uint16 actorId);
bool actorEndWalk(uint16 actorId, bool recurse);
- bool actorWalkTo(uint16 actorId, const Location &toLocation);
- ActorData *getActor(uint16 actorId);
+ bool actorWalkTo(uint16 actorId, const Location &toLocation);
ActorFrameRange *getActorFrameRange(uint16 actorId, int frameType);
- void realLocation(Location &location, uint16 objectId, uint16 walkFlags);
void actorFaceTowardsPoint(uint16 actorId, const Location &toLocation);
void actorFaceTowardsObject(uint16 actorId, uint16 objectId);
+ void realLocation(Location &location, uint16 objectId, uint16 walkFlags);
+
// speech
void actorSpeech(uint16 actorId, const char **strings, int stringsCount, uint16 sampleResourceId, int speechFlags);
void nonActorSpeech(const char **strings, int stringsCount, int speechFlags);
@@ -316,7 +356,8 @@ private:
void stepZoneAction(ActorData *actor, const HitZone *hitZone, bool exit, bool stopped);
void createDrawOrderList();
- void calcActorScreenPosition(ActorData *actor);
+ void calcScreenPosition(CommonObjectData *commonObjectData);
+
bool followProtagonist(ActorData *actor);
void findActorPath(ActorData *actor, const Point &fromPoint, const Point &toPoint);
void handleSpeech(int msec);
@@ -350,13 +391,22 @@ private:
int _lastTickMsec;
SagaEngine *_vm;
RSCFILE_CONTEXT *_actorContext;
- ActorOrderList _drawOrderList;
+ CommonObjectOrderList _drawOrderList;
+
int _actorsCount;
ActorData **_actors;
+
+ int _objsCount;
+ ObjectData **_objs;
+
SpeechData _activeSpeech;
- StringsTable _actorsStrings;
//path stuff
+ struct PathNode {
+ Point point;
+ int link;
+ };
+
Rect _barrierList[ACTOR_BARRIERS_MAX];
int _barrierCount;
int8 *_pathCell;
@@ -413,10 +463,9 @@ private:
}
}
- void addNewPathNodeListPoint(const Point &point, int link) {
+ void addNewPathNodeListPoint(const PathNode &pathNode) {
incrementNewPathNodeListIndex();
- _newPathNodeList[_newPathNodeListIndex].point = point;
- _newPathNodeList[_newPathNodeListIndex].link = link;
+ _newPathNodeList[_newPathNodeListIndex] = pathNode;
}
public: