aboutsummaryrefslogtreecommitdiff
path: root/saga
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
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')
-rw-r--r--saga/actor.cpp154
-rw-r--r--saga/actor.h119
-rw-r--r--saga/interface.cpp4
-rw-r--r--saga/objectdata.cpp2
-rw-r--r--saga/objectdata.h12
-rw-r--r--saga/saga.cpp32
-rw-r--r--saga/saga.h2
-rw-r--r--saga/script.cpp8
-rw-r--r--saga/script.h4
-rw-r--r--saga/sfuncs.cpp41
10 files changed, 239 insertions, 139 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)) {
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:
diff --git a/saga/interface.cpp b/saga/interface.cpp
index 1b6aabece7..429edf48ec 100644
--- a/saga/interface.cpp
+++ b/saga/interface.cpp
@@ -529,7 +529,7 @@ void Interface::removeFromInventory(int sprite) {
void Interface::drawInventory() {
if (_panelMode != kPanelMain)
return;
-
+/*
SURFACE *back_buf = _vm->_gfx->getBackBuffer();
// TODO: Inventory scrolling
@@ -560,7 +560,7 @@ void Interface::drawInventory() {
}
col = 0;
}
- }
+ }*/
}
int Interface::inventoryTest(const Point& imousePt, int *ibutton) {
diff --git a/saga/objectdata.cpp b/saga/objectdata.cpp
index 5ca1215617..8b71a07ee7 100644
--- a/saga/objectdata.cpp
+++ b/saga/objectdata.cpp
@@ -28,7 +28,7 @@
namespace Saga {
-OBJECTTABLE ObjectTable[OBJECTCOUNT] = {
+ObjectTableData ITE_ObjectTable[ITE_OBJECTCOUNT] = {
{ 8, 49, 1256, 760, 0, 9, 5, kObjNotFlat }, // Magic Hat
{ 9, 52, 1080, 1864, 0, 10, 4, kObjUseWith }, // Berries
{ 10, 259, 744, 524, 0, 11, 42, kObjUseWith }, // Card Key
diff --git a/saga/objectdata.h b/saga/objectdata.h
index 9a2f1c8457..9a66f97855 100644
--- a/saga/objectdata.h
+++ b/saga/objectdata.h
@@ -33,18 +33,20 @@ enum {
kObjNotFlat = 0x02
};
-struct OBJECTTABLE {
+struct ObjectTableData {
byte nameIndex;
int32 sceneIndex;
- int16 x, y, z;
- int32 spritelistRn;
+ int16 x;
+ int16 y;
+ int16 z;
+ int32 spriteListResourceId;
byte scriptEntrypointNumber;
uint16 interactBits;
};
-#define OBJECTCOUNT 39
+#define ITE_OBJECTCOUNT 39
-extern OBJECTTABLE ObjectTable[OBJECTCOUNT];
+extern ObjectTableData ITE_ObjectTable[ITE_OBJECTCOUNT];
#endif
diff --git a/saga/saga.cpp b/saga/saga.cpp
index c792ee0454..ef2d9dac0e 100644
--- a/saga/saga.cpp
+++ b/saga/saga.cpp
@@ -349,40 +349,26 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPoin
}
const char *SagaEngine::getObjectName(uint16 objectId) {
+ ActorData *actor;
+ ObjectData *obj;
const HitZone *hitZone;
switch (objectTypeId(objectId)) {
+ case kGameObjectObject:
+ obj = _actor->getObj(objectId);
+ _script->_mainStrings.getString(obj->nameIndex);
+ break;
case kGameObjectActor:
- return _actor->getActorName(objectId);
+ actor = _actor->getActor(objectId);
+ return _actor->_actorsStrings.getString(actor->nameIndex);
break;
case kGameObjectHitZone:
hitZone = _vm->_scene->_objectMap->getHitZone(objectIdToIndex(objectId));
return _vm->_scene->_sceneStrings.getString(hitZone->getNameIndex());
}
- //todo: object name & etc
+ warning("SagaEngine::getObjectName name not found for 0x%X", objectId);
return NULL;
}
-int SagaEngine::getObjectScriptEntrypointNumber(uint16 objectId) {
- ActorData *actor;
- switch (objectTypeId(objectId)) {
- case kGameObjectActor:
- actor = _vm->_actor->getActor(objectId);
- return actor->scriptEntrypointNumber;
- break;
- }
- //todo: object name & etc
- return 0;
-}
-
-int SagaEngine::getObjectFlags(uint16 objectId) {
- ActorData *actor;
- if (objectTypeId(objectId) == kGameObjectActor) {
- actor = _vm->_actor->getActor(objectId);
- return actor->flags;
- }
- return 0;
-}
-
const char *SagaEngine::getTextString(int textStringId) {
const char *string;
int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
diff --git a/saga/saga.h b/saga/saga.h
index 346ea2a4d0..e59d7a2de8 100644
--- a/saga/saga.h
+++ b/saga/saga.h
@@ -460,8 +460,6 @@ public:
void loadStrings(StringsTable &stringsTable, const byte *stringsPointer, size_t stringsLength);
const char *getObjectName(uint16 objectId);
- int getObjectScriptEntrypointNumber(uint16 objectId);
- int getObjectFlags(uint16 objectId);
public:
TEXTLIST *textCreateList();
void textDestroyList(TEXTLIST *textlist);
diff --git a/saga/script.cpp b/saga/script.cpp
index f9a13f2475..66ac013815 100644
--- a/saga/script.cpp
+++ b/saga/script.cpp
@@ -663,8 +663,8 @@ void Script::doVerb() {
objectType = objectTypeId(_pendingObject[0]);
if (_pendingVerb == kVerbGive) {
- scriptEntrypointNumber = _vm->getObjectScriptEntrypointNumber(_pendingObject[1]);
- if (_vm->getObjectFlags(_pendingObject[1]) & (kFollower|kProtagonist|kExtended)) {
+ scriptEntrypointNumber = _vm->_actor->getObjectScriptEntrypointNumber(_pendingObject[1]);
+ if (_vm->_actor->getObjectFlags(_pendingObject[1]) & (kFollower|kProtagonist|kExtended)) {
scriptModuleNumber = 0;
} else {
scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
@@ -686,9 +686,9 @@ void Script::doVerb() {
} else {
if (objectType & (kGameObjectActor | kGameObjectObject)) {
- scriptEntrypointNumber = _vm->getObjectScriptEntrypointNumber(_pendingObject[0]);
+ scriptEntrypointNumber = _vm->_actor->getObjectScriptEntrypointNumber(_pendingObject[0]);
- if ((objectType == kGameObjectActor) && !(_vm->getObjectFlags(_pendingObject[0]) & (kFollower|kProtagonist|kExtended))) {
+ if ((objectType == kGameObjectActor) && !(_vm->_actor->getObjectFlags(_pendingObject[0]) & (kFollower|kProtagonist|kExtended))) {
scriptModuleNumber = _vm->_scene->getScriptModuleNumber();
} else {
scriptModuleNumber = 0;
diff --git a/saga/script.h b/saga/script.h
index a6e4c088fb..0a9861e163 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -239,6 +239,8 @@ struct ScriptDataBuf {
class Script {
public:
+ StringsTable _mainStrings;
+
Script();
~Script();
@@ -296,7 +298,7 @@ protected:
ScriptData *_currentScript;
ScriptDataBuf _dataBuf[SCRIPT_DATABUF_NUM];
ScriptThreadList _threadList;
- StringsTable _mainStrings;
+
//verb
bool _firstObjectSet;
diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp
index ec89ab2a5e..31cc2254b6 100644
--- a/saga/sfuncs.cpp
+++ b/saga/sfuncs.cpp
@@ -153,9 +153,12 @@ int Script::sfWait(SCRIPTFUNC_PARAMS) {
// Script function #2 (0x02)
int Script::SF_takeObject(SCRIPTFUNC_PARAMS) {
- ScriptDataWord param = thread->pop();
+ thread->pop();
+ warning("Not implemented");
+/* ScriptDataWord param = thread->pop();
int index = param & 0x1FFF;
-
+
+
if (index >= ARRAYSIZE(ObjectTable)) {
return FAILURE;
}
@@ -163,7 +166,7 @@ int Script::SF_takeObject(SCRIPTFUNC_PARAMS) {
if (ObjectTable[index].sceneIndex != -1) {
ObjectTable[index].sceneIndex = -1;
_vm->_interface->addToInventory(index);
- }
+ }*/
return SUCCESS;
}
@@ -171,7 +174,11 @@ int Script::SF_takeObject(SCRIPTFUNC_PARAMS) {
// Script function #3 (0x03)
// Check if an object is carried.
int Script::SF_objectIsCarried(SCRIPTFUNC_PARAMS) {
- ScriptDataWord param = thread->pop();
+ /*ScriptDataWord param =*/ thread->pop();
+ warning("Not implemented");
+ thread->retVal = 0;
+/*
+
int index = param & 0x1FFF;
if (index >= ARRAYSIZE(ObjectTable)) {
@@ -179,7 +186,7 @@ int Script::SF_objectIsCarried(SCRIPTFUNC_PARAMS) {
return FAILURE;
}
- thread->retVal = (ObjectTable[index].sceneIndex == -1) ? 1 : 0;
+ thread->retVal = (ObjectTable[index].sceneIndex == -1) ? 1 : 0;*/
return SUCCESS;
}
@@ -435,9 +442,11 @@ int Script::SF_gotoScene(SCRIPTFUNC_PARAMS) {
// Script function #17 (0x11)
int Script::SF_setObjImage(SCRIPTFUNC_PARAMS) {
- int16 obj_param = getSWord(thread->pop());
+ error("Not implemented");
+/* int16 obj_param = getSWord(thread->pop());
int16 sprite_param = getSWord(thread->pop());
+
int index = obj_param & 0x1FFF;
if (index >= ARRAYSIZE(ObjectTable)) {
@@ -446,13 +455,15 @@ int Script::SF_setObjImage(SCRIPTFUNC_PARAMS) {
ObjectTable[index].spritelistRn = sprite_param + 9;
_vm->_interface->draw();
-
+*/
return SUCCESS;
}
// Script function #18 (0x12)
int Script::SF_setObjName(SCRIPTFUNC_PARAMS) {
- int obj_param = getSWord(thread->pop());
+ error("Not implemented");
+
+/* int obj_param = getSWord(thread->pop());
int name_param = getSWord(thread->pop());
int index = obj_param & 0x1FFF;
@@ -461,13 +472,15 @@ int Script::SF_setObjName(SCRIPTFUNC_PARAMS) {
return FAILURE;
}
- ObjectTable[index].nameIndex = name_param;
+ ObjectTable[index].nameIndex = name_param;*/
return SUCCESS;
}
// Script function #19 (0x13)
int Script::SF_getObjImage(SCRIPTFUNC_PARAMS) {
- int param = getSWord(thread->pop());
+ error("Not implemented");
+
+/* int param = getSWord(thread->pop());
int index = param & 0x1FFF;
if (index >= ARRAYSIZE(ObjectTable)) {
@@ -475,7 +488,7 @@ int Script::SF_getObjImage(SCRIPTFUNC_PARAMS) {
return FAILURE;
}
- thread->retVal = ObjectTable[index].spritelistRn;
+ thread->retVal = ObjectTable[index].spritelistRn;*/
return SUCCESS;
}
@@ -647,7 +660,9 @@ int Script::SF_sceneEq(SCRIPTFUNC_PARAMS) {
// Script function #32 (0x20)
int Script::SF_dropObject(SCRIPTFUNC_PARAMS) {
- ScriptDataWord obj_param = thread->pop();
+ error("Not implemented");
+
+/* ScriptDataWord obj_param = thread->pop();
ScriptDataWord sprite_param = thread->pop();
ScriptDataWord x_param = thread->pop();
ScriptDataWord y_param = thread->pop();
@@ -666,7 +681,7 @@ int Script::SF_dropObject(SCRIPTFUNC_PARAMS) {
ObjectTable[index].spritelistRn = 9 + sprite_param;
ObjectTable[index].x = x_param;
ObjectTable[index].y = y_param;
-
+*/
return SUCCESS;
}