aboutsummaryrefslogtreecommitdiff
path: root/saga/actor.cpp
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.cpp
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.cpp')
-rw-r--r--saga/actor.cpp154
1 files changed, 101 insertions, 53 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 0bb8ccafda..97844e02de 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -36,6 +36,7 @@
#include "saga/actor.h"
#include "saga/actordata.h"
+#include "saga/objectdata.h"
#include "saga/stream.h"
#include "saga/interface.h"
#include "saga/events.h"
@@ -44,13 +45,15 @@
namespace Saga {
-static int actorCompare(const ActorDataPointer& actor1, const ActorDataPointer& actor2) {
- if (actor1->location.y == actor2->location.y) {
+static int commonObjectCompare(const CommonObjectDataPointer& obj1, const CommonObjectDataPointer& obj2) {
+ if (obj1->location.y == obj2->location.y) {
return 0;
- } else if (actor1->location.y < actor2->location.y) {
- return -1;
} else {
- return 1;
+ if (obj1->location.y < obj2->location.y) {
+ return -1;
+ } else {
+ return 1;
+ }
}
}
@@ -135,9 +138,14 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
byte *stringsPointer;
size_t stringsLength;
ActorData *actor;
+ ObjectData *obj;
debug(9, "Actor::Actor()");
_actors = NULL;
+ _actorsCount = 0;
+
+ _objs = NULL;
+ _objsCount = 0;
#ifdef ACTOR_DEBUG
_debugPoints = NULL;
@@ -185,12 +193,12 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
if (_vm->getGameType() == GType_ITE) {
_actorsCount = ITE_ACTORCOUNT;
- _actors = (ActorData **)malloc(_actorsCount * sizeof(ActorData *));
+ _actors = (ActorData **)malloc(_actorsCount * sizeof(*_actors));
for (i = 0; i < _actorsCount; i++) {
actor = _actors[i] = new ActorData();
- actor->actorId = actorIndexToId(i);
+ actor->id = actorIndexToId(i);
actor->index = i;
- debug(9, "init actorId=%d index=%d", actor->actorId, actor->index);
+ debug(9, "init actor id=%d index=%d", actor->id, actor->index);
actor->nameIndex = ITE_ActorTable[i].nameIndex;
actor->scriptEntrypointNumber = ITE_ActorTable[i].scriptEntrypointNumber;
actor->spriteListResourceId = ITE_ActorTable[i].spriteListResourceId;
@@ -212,9 +220,29 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
actor->disabled = !loadActorResources(actor);
if (actor->disabled) {
- warning("Disabling actorId=%d index=%d", actor->actorId, actor->index);
+ warning("Disabling actor Id=%d index=%d", actor->id, actor->index);
}
}
+ _objsCount = ITE_OBJECTCOUNT;
+ _objs = (ObjectData **)malloc(_objsCount * sizeof(*_objs));
+ for (i = 0; i < _objsCount; i++) {
+ obj = _objs[i] = new ObjectData();
+ obj->id = objIndexToId(i);
+ obj->index = i;
+ debug(9, "init obj id=%d index=%d", obj->id, obj->index);
+ obj->nameIndex = ITE_ObjectTable[i].nameIndex;
+ obj->scriptEntrypointNumber = ITE_ObjectTable[i].scriptEntrypointNumber;
+ obj->spriteListResourceId = ITE_ObjectTable[i].spriteListResourceId;
+ obj->sceneNumber = ITE_ObjectTable[i].sceneIndex;
+ obj->interactBits = ITE_ObjectTable[i].interactBits;
+ obj->flags = 0;
+ obj->frameNumber = 0;
+
+ obj->location.x = ITE_ObjectTable[i].x;
+ obj->location.y = ITE_ObjectTable[i].y;
+ obj->location.z = ITE_ObjectTable[i].z;
+ }
+
} else {
// TODO.
static ActorData dummyActor;
@@ -223,13 +251,13 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {
dummyActor.walkStepsPoints = NULL;
_protagonist = &dummyActor;
- _actorsCount = 0;
}
}
Actor::~Actor() {
int i;
ActorData *actor;
+ ObjectData *obj;
debug(9, "Actor::~Actor()");
@@ -248,6 +276,11 @@ Actor::~Actor() {
delete actor;
}
free(_actors);
+ for (i = 0; i < _objsCount; i++) {
+ obj = _objs[i];
+ delete obj;
+ }
+ free(_objs);
}
bool Actor::loadActorResources(ActorData *actor) {
@@ -354,7 +387,7 @@ void Actor::stepZoneAction(ActorData *actor, const HitZone *hitZone, bool exit,
}
}
if (hitZone->getFlags() & kHitZoneExit) {
- takeExit(actor->actorId, hitZone);
+ takeExit(actor->id, hitZone);
} else {
if (hitZone->getScriptNumber() > 0) {
event.type = ONESHOT_EVENT;
@@ -432,15 +465,21 @@ void Actor::actorFaceTowardsObject(uint16 actorId, uint16 objectId) {
}
}
-const char * Actor::getActorName(uint16 actorId) {
- ActorData *actor;
- actor = getActor(actorId);
- return _actorsStrings.getString(actor->nameIndex);
+
+ObjectData *Actor::getObj(uint16 objId) {
+ ObjectData *obj;
+
+ if (!validObjId(objId))
+ error("Actor::getObj Wrong objId 0x%X", objId);
+
+ obj = _objs[objIdToIndex(objId)];
+
+ return obj;
}
ActorData *Actor::getActor(uint16 actorId) {
ActorData *actor;
-
+
if (!validActorId(actorId))
error("Actor::getActor Wrong actorId 0x%X", actorId);
@@ -526,7 +565,7 @@ void Actor::updateActorsScene(int actorsEntrance) {
}
followerDirection = _protagonist->facingDirection + 3;
- calcActorScreenPosition(_protagonist);
+ calcScreenPosition(_protagonist);
for (i = 0; i < _actorsCount; i++) {
actor = _actors[i];
@@ -731,11 +770,11 @@ void Actor::handleActions(int msec, bool setup) {
}
if (actor->targetObject != ID_NOTHING) {
- actorFaceTowardsObject(actor->actorId, actor->targetObject);
+ actorFaceTowardsObject(actor->id, actor->targetObject);
}
if (actor->flags & kCycle) {
- frameRange = getActorFrameRange(actor->actorId, kFrameStand);
+ frameRange = getActorFrameRange(actor->id, kFrameStand);
if (frameRange->frameCount > 0) {
actor->actionCycle++;
actor->actionCycle = (actor->actionCycle) % frameRange->frameCount;
@@ -749,9 +788,9 @@ void Actor::handleActions(int msec, bool setup) {
if ((actor->actionCycle & 3) == 0) {
actor->cycleWrap(100);
- frameRange = getActorFrameRange(actor->actorId, kFrameWait);
+ frameRange = getActorFrameRange(actor->id, kFrameWait);
if ((frameRange->frameCount < 1 || actor->actionCycle > 33))
- frameRange = getActorFrameRange(actor->actorId, kFrameStand);
+ frameRange = getActorFrameRange(actor->id, kFrameStand);
if (frameRange->frameCount) {
actor->frameNumber = frameRange->frameIndex + (uint16)rand() % frameRange->frameCount;
@@ -773,7 +812,7 @@ void Actor::handleActions(int msec, bool setup) {
while ((delta.x == 0) && (delta.y == 0)) {
if (actor->walkStepIndex >= actor->walkStepsCount) {
- actorEndWalk(actor->actorId, true);
+ actorEndWalk(actor->id, true);
break;
}
@@ -829,7 +868,7 @@ void Actor::handleActions(int msec, bool setup) {
actor->actionCycle++;
}
- frameRange = getActorFrameRange(actor->actorId, actor->walkFrameSequence);
+ frameRange = getActorFrameRange(actor->id, actor->walkFrameSequence);
if (actor->actionCycle < 0) {
actor->actionCycle = frameRange->frameCount - 1;
@@ -850,7 +889,7 @@ void Actor::handleActions(int msec, bool setup) {
actor->location.x += directionLUT[actor->actionDirection][0] * 2;
actor->location.y += directionLUT[actor->actionDirection][1] * 2;
- frameRange = getActorFrameRange(actor->actorId, actor->walkFrameSequence);
+ frameRange = getActorFrameRange(actor->id, actor->walkFrameSequence);
actor->actionCycle++;
actor->cycleWrap(frameRange->frameCount);
actor->frameNumber = frameRange->frameIndex + actor->actionCycle;
@@ -861,16 +900,16 @@ void Actor::handleActions(int msec, bool setup) {
actor->actionCycle++;
actor->cycleWrap(64);
- frameRange = getActorFrameRange(actor->actorId, kFrameGesture);
+ frameRange = getActorFrameRange(actor->id, kFrameGesture);
if (actor->actionCycle >= frameRange->frameCount) {
if (actor->actionCycle & 1)
break;
- frameRange = getActorFrameRange(actor->actorId, kFrameSpeak);
+ frameRange = getActorFrameRange(actor->id, kFrameSpeak);
state = (uint16)rand() % (frameRange->frameCount + 1);
if (state == 0) {
- frameRange = getActorFrameRange(actor->actorId, kFrameStand);
+ frameRange = getActorFrameRange(actor->id, kFrameStand);
} else {
state--;
}
@@ -895,7 +934,7 @@ void Actor::handleActions(int msec, bool setup) {
actor->cycleTimeCount = actor->cycleDelay;
actor->actionCycle++;
- frameRange = getActorFrameRange(actor->actorId, actor->cycleFrameSequence);
+ frameRange = getActorFrameRange(actor->id, actor->cycleFrameSequence);
if (actor->currentAction == kActionPongFrames) {
if (actor->actionCycle >= frameRange->frameCount * 2 - 2) {
@@ -988,39 +1027,39 @@ int Actor::direct(int msec) {
return SUCCESS;
}
-void Actor::calcActorScreenPosition(ActorData *actor) {
+void Actor::calcScreenPosition(CommonObjectData *commonObjectData) {
int beginSlope, endSlope, middle;
if (_vm->_scene->getFlags() & kSceneFlagISO) {
//todo: it
} else {
- middle = _vm->getSceneHeight() - actor->location.y / ACTOR_LMULT;
+ middle = _vm->getSceneHeight() - commonObjectData->location.y / ACTOR_LMULT;
_vm->_scene->getSlopes(beginSlope, endSlope);
- actor->screenDepth = (14 * middle) / endSlope + 1;
+ commonObjectData->screenDepth = (14 * middle) / endSlope + 1;
if (middle <= beginSlope) {
- actor->screenScale = 256;
+ commonObjectData->screenScale = 256;
} else {
if (middle >= endSlope) {
- actor->screenScale = 1;
+ commonObjectData->screenScale = 1;
} else {
middle -= beginSlope;
endSlope -= beginSlope;
- actor->screenScale = 256 - (middle * 256) / endSlope;
+ commonObjectData->screenScale = 256 - (middle * 256) / endSlope;
}
}
- actor->location.toScreenPointXYZ(actor->screenPosition);
+ commonObjectData->location.toScreenPointXYZ(commonObjectData->screenPosition);
}
- /*if (actor->index == 2)
- debug(9, "act: %d. x: %d y: %d", actor->index, actor->screenPosition.x, actor->screenPosition.y);*/
}
+
void Actor::createDrawOrderList() {
int i;
ActorData *actor;
+ ObjectData *obj;
_drawOrderList.clear();
for (i = 0; i < _actorsCount; i++) {
@@ -1028,15 +1067,24 @@ void Actor::createDrawOrderList() {
if (actor->disabled) continue;
if (actor->sceneNumber != _vm->_scene->currentSceneNumber()) continue;
- _drawOrderList.pushBack(actor, actorCompare);
+ _drawOrderList.pushBack(actor, commonObjectCompare);
- calcActorScreenPosition(actor);
+ calcScreenPosition(actor);
+ }
+
+ for (i = 0; i < _objsCount; i++) {
+ obj = _objs[i];
+ if (obj->sceneNumber != _vm->_scene->currentSceneNumber()) continue;
+
+ _drawOrderList.pushBack(obj, commonObjectCompare);
+
+ calcScreenPosition(obj);
}
}
int Actor::drawActors() {
- ActorOrderList::iterator actorDrawOrderIterator;
- ActorData *actor;
+ CommonObjectOrderList::iterator drawOrderIterator;
+ CommonObjectDataPointer drawObject;
int frameNumber;
SpriteList *spriteList;
@@ -1046,30 +1094,30 @@ int Actor::drawActors() {
createDrawOrderList();
- for (actorDrawOrderIterator = _drawOrderList.begin(); actorDrawOrderIterator != _drawOrderList.end(); ++actorDrawOrderIterator) {
- actor = actorDrawOrderIterator.operator*();
+ for (drawOrderIterator = _drawOrderList.begin(); drawOrderIterator != _drawOrderList.end(); ++drawOrderIterator) {
+ drawObject = drawOrderIterator.operator*();
if (_vm->_scene->currentSceneNumber() == RID_ITE_OVERMAP_SCENE) {
- if (!(actor->flags & kProtagonist)){
+ if (!(drawObject->flags & kProtagonist)){
warning("not protagonist");
continue;
}
frameNumber = 8;
spriteList = &_vm->_sprite->_mainSprites;
} else {
- frameNumber = actor->frameNumber;
- spriteList = &actor->spriteList;
+ frameNumber = drawObject->frameNumber;
+ spriteList = &drawObject->spriteList;
}
if ((frameNumber < 0) || (spriteList->spriteCount <= frameNumber)) {
- warning("Actor::drawActors frameNumber invalid for actorId 0x%X", actor->actorId);
+ warning("Actor::drawActors frameNumber invalid for object id 0x%X", drawObject->id);
continue;
}
if (_vm->_scene->getFlags() & kSceneFlagISO) {
//todo: it
} else {
- _vm->_sprite->drawOccluded(back_buf, *spriteList, frameNumber, actor->screenPosition, actor->screenScale, actor->screenDepth);
+ _vm->_sprite->drawOccluded(back_buf, *spriteList, frameNumber, drawObject->screenPosition, drawObject->screenScale, drawObject->screenDepth);
}
}
@@ -1122,7 +1170,7 @@ bool Actor::followProtagonist(ActorData *actor) {
actor->flags &= ~(kFaster | kFastest);
protagonistLocation = _protagonist->location;
- calcActorScreenPosition(_protagonist);
+ calcScreenPosition(_protagonist);
if (_vm->_scene->getFlags() & kSceneFlagISO) {
//todo: it
@@ -1192,7 +1240,7 @@ bool Actor::followProtagonist(ActorData *actor) {
newLocation.x = clamp(-31*4, newLocation.x, (_vm->getDisplayWidth() + 31) * 4); //fixme
- return actorWalkTo(actor->actorId, newLocation);
+ return actorWalkTo(actor->id, newLocation);
}
}
return false;
@@ -1955,10 +2003,10 @@ void Actor::removePathPoints() {
_newPathNodeListIndex = -1;
- addNewPathNodeListPoint(_pathNodeList[0].point, _pathNodeList[0].link);
+ addNewPathNodeListPoint(_pathNodeList[0]);
for (i = 1, node = _pathNodeList + 1; i < _pathNodeListIndex; i++, node++) {
- addNewPathNodeListPoint(node->point, node->link);
+ addNewPathNodeListPoint(*node);
for (j = 5; j > 0; j--) {
start = node->link - j;
@@ -1996,7 +2044,7 @@ void Actor::removePathPoints() {
}
}
- addNewPathNodeListPoint(_pathNodeList[_pathNodeListIndex].point, _pathNodeList[_pathNodeListIndex].link);
+ addNewPathNodeListPoint(_pathNodeList[_pathNodeListIndex]);
for (i = 0, j = 0; i <= _newPathNodeListIndex; i++) {
if (_newPathNodeListIndex == i || (_newPathNodeList[i].point != _newPathNodeList[i+1].point)) {