- some "actors walk" work progression

svn-id: r16308
This commit is contained in:
Andrew Kurushin 2004-12-25 11:17:03 +00:00
parent a8c8a7ab4c
commit a66080b80a
5 changed files with 154 additions and 97 deletions

View file

@ -218,7 +218,7 @@ void Actor::updateActorsScene() {
if (actor->flags & (kProtagonist | kFollower)) {
actor->sceneNumber = _vm->_scene->currentSceneNumber();
if (actor->flags & kProtagonist) {
// actor->finalTarget = a->obj.loc;
//todo: actor->finalTarget = a->obj.loc;
_centerActor = _protagonist = actor;
}
@ -436,7 +436,7 @@ void Actor::handleActions(int msec, bool setup) {
actor->cycleTimeCount = actor->cycleDelay;
actor->actionCycle++;
frameRange = getActorFrameRange( actor->actorId, actor->cycleFrameNumber);
frameRange = getActorFrameRange( actor->actorId, actor->cycleFrameSequence);
if (actor->currentAction == kActionPongFrames) {
if (actor->actionCycle >= frameRange->frameCount * 2 - 2) {
@ -505,9 +505,37 @@ int Actor::direct(int msec) {
return SUCCESS;
}
void Actor::calcActorScreenPosition(ActorData * actor) {
int beginSlope, endSlope, middle;
// tiled stuff
{
}
{
middle = ITE_STATUS_Y - actor->location.y / ACTOR_LMULT;
_vm->_scene->getSlopes(beginSlope, endSlope);
actor->screenDepth = (14 * middle) / endSlope + 1;
if (middle <= beginSlope) {
actor->screenScale = 256;
} else {
if (middle >= endSlope) {
actor->screenScale = 1;
} else {
middle -= beginSlope;
endSlope -= beginSlope;
actor->screenScale = 256 - (middle * 256) / endSlope;
}
}
actor->screenPosition.x = (actor->location.x / ACTOR_LMULT);
actor->screenPosition.y = (actor->location.y / ACTOR_LMULT) - actor->location.z;
}
}
void Actor::createDrawOrderList() {
int i;
int beginSlope, endSlope, middle;
ActorData *actor;
_drawOrderList.clear();
@ -518,31 +546,7 @@ void Actor::createDrawOrderList() {
_drawOrderList.pushBack(actor, actorCompare);
// tiled stuff
{
}
{
middle = ITE_STATUS_Y - actor->location.y / ACTOR_LMULT,
_vm->_scene->getSlopes(beginSlope, endSlope);
actor->screenDepth = (14 * middle) / endSlope + 1;
if (middle <= beginSlope) {
actor->screenScale = 256;
} else {
if (middle >= endSlope) {
actor->screenScale = 1;
} else {
middle -= beginSlope;
endSlope -= beginSlope;
actor->screenScale = 256 - (middle * 256) / endSlope;
}
}
actor->screenPosition.x = (actor->location.x / ACTOR_LMULT);
actor->screenPosition.y = (actor->location.y / ACTOR_LMULT) - actor->location.z;
}
calcActorScreenPosition(actor);
}
}
@ -635,26 +639,90 @@ void Actor::StoA(Point &actorPoint, const Point &screenPoint) {
actorPoint.y = (screenPoint.y * ACTOR_LMULT);
}
bool Actor::actorWalkTo(uint16 actorId, const ActorLocation &actorLocation) {
bool Actor::followProtagonist(ActorData * actor) {
return false;
}
bool Actor::actorEndWalk(uint16 actorId, bool recurse) {
bool walkMore = false;
ActorData *actor;
actor = getActor(actorId);
actor->actorFlags &= ~kActorBackwards;
if (actor->location.distance(actor->finalTarget) > 8) {
if ((actor->flags & kProtagonist) && recurse && !(actor->actorFlags & kActorNoCollide)) {
actor->actorFlags |= kActorNoCollide;
return actorWalkTo(actorId, actor->finalTarget);
}
}
actor->currentAction = kActionWait;
if (actor->actorFlags & kActorFinalFace) {
actor->facingDirection = actor->actionDirection = (actor->actorFlags >> 6) & 0x07; //?
}
actor->actorFlags &= ~(kActorNoCollide | kActorCollided | kActorFinalFace | kActorFacingMask);
actor->flags &= ~(kFaster | kFastest);
if (actor == _protagonist) {
_vm->_script->wakeUpActorThread(kWaitTypeWalk, actor);
//todo: it
} else {
if (recurse && (actor->flags & kFollower))
walkMore = followProtagonist(actor);
_vm->_script->wakeUpActorThread(kWaitTypeWalk, actor);
}
return walkMore;
}
bool Actor::actorWalkTo(uint16 actorId, const ActorLocation &toLocation) {
ActorData *actor;
actor = getActor(actorId);
/* if (a == protag)
{
sceneDoors[ 2 ] = 0xff; // closed
sceneDoors[ 3 ] = 0; // open
}
else
{
sceneDoors[ 2 ] = 0; // open
sceneDoors[ 3 ] = 0xff; // closed
}*/
// tiled stuff
{
//todo: it
}
{
Point pointFrom, pointTo, pointBest;
pointFrom.x = actor->location.x / ACTOR_LMULT;
pointFrom.y = actor->location.y / ACTOR_LMULT;
pointTo.x = toLocation.x / ACTOR_LMULT;
pointTo.y = toLocation.y / ACTOR_LMULT;
if (_vm->_scene->isBGMaskPresent()) {
//todo: it
} else {
actor->walkPath[0] = pointTo.x / 2;
actor->walkPath[1] = pointTo.y;
actor->walkStepsCount = 2;
actor->walkStepIndex = 0;
}
actor->partialTarget = actor->location;
actor->finalTarget = toLocation;
if (actor->walkStepsCount == 0) {
actorEndWalk(actorId, false);
return false;
} else {
if (actor->flags & kProtagonist) {
_actors[1].actorFlags &= ~kActorNoFollow;
_actors[2].actorFlags &= ~kActorNoFollow;
}
actor->currentAction = (actor->walkStepsCount == ACTOR_STEPS_COUNT) ? kActionWalkToLink : kActionWalkToPoint;
actor->walkFrameSequence = kFrameWalk;
}
}
return false;

View file

@ -35,7 +35,8 @@ namespace Saga {
#define ACTOR_BASE_SPEED 0.25
#define ACTOR_BASE_ZMOD 0.5
#define ACTOR_DEFAULT_ORIENT 2
#define ACTOR_STEPS_COUNT 32
#define ACTOR_STEPS_MAX (ACTOR_STEPS_COUNT*2)
#define ACTOR_ACTIONTIME 80
@ -106,7 +107,7 @@ enum ActorFlagsEx {
kActorFinishRight = ((1 << 5) | (kDirRight << 6)),
kActorFinishUp = ((1 << 5) | (kDirUp << 6)),
kActorFinishDown = ((1 << 5) | (kDirDown << 6)),
kActorFacing = (0xf << 5),
kActorFacingMask = (0xf << 5),
kActorRandom = (1 << 10)
};
@ -124,6 +125,9 @@ struct ActorLocation {
int x; // Actor's logical coordinates
int y; //
int z; //
int distance(const ActorLocation &location) {
return max(abs(x - location.x), abs(y - location.y));
}
};
struct ActorData {
bool disabled; // Actor disabled in init section
@ -149,7 +153,7 @@ struct ActorData {
int frameNumber; // current actor frame number
uint16 targetObject;
int cycleFrameNumber;
int cycleFrameSequence;
uint8 cycleDelay;
uint8 cycleTimeCount;
uint8 cycleFlags;
@ -161,6 +165,12 @@ struct ActorData {
int framesCount; // Actor's frames count
int frameListResourceId; // Actor's frame list resource id
int walkPath[ACTOR_STEPS_MAX];
int walkStepsCount;
int walkStepIndex;
ActorLocation finalTarget;
ActorLocation partialTarget;
int walkFrameSequence;
void cycleWrap(int cycleLimit) {
if (actionCycle >= cycleLimit)
@ -168,39 +178,7 @@ struct ActorData {
}
ActorData() {
disabled = false;
index = 0;
actorId = 0;
nameIndex = 0;
speechColor = 0;
frames = NULL;
framesCount = 0;
frameListResourceId = 0;
spriteList = NULL;
spriteListResourceId = 0;
flags = 0;
sceneNumber = 0;
location.x = 0;
location.y = 0;
location.z = 0;
screenDepth = 0;
actorFlags = 0;
currentAction = 0;
facingDirection = 0;
actionDirection = 0;
actionCycle = 0;
targetObject = ID_NOTHING;
cycleFrameNumber = 0;
cycleDelay = 0;
cycleTimeCount = 0;
cycleFlags = 0;
memset(this, 0xFE, sizeof(*this));
}
};
@ -245,7 +223,8 @@ public:
void StoA(Point &actorPoint, const Point &screenPoint);
bool actorWalkTo(uint16 actorId, const ActorLocation &actorLocation);
bool actorEndWalk(uint16 actorId, bool recurse);
bool actorWalkTo(uint16 actorId, const ActorLocation &toLocation);
ActorData *getActor(uint16 actorId);
ActorFrameRange *getActorFrameRange(uint16 actorId, int frameType);
@ -267,6 +246,8 @@ private:
bool loadActorResources(ActorData * actor);
void createDrawOrderList();
void calcActorScreenPosition(ActorData * actor);
bool followProtagonist(ActorData * actor);
void handleSpeech(int msec);
void handleActions(int msec, bool setup);

View file

@ -40,14 +40,14 @@
namespace Saga {
static VERB_DATA I_VerbData[] = {
{I_VERB_WALKTO, "verb_walkto", "Walk to", S_VERB_WALKTO},
{I_VERB_LOOKAT, "verb_lookat", "Look at", S_VERB_LOOKAT},
{I_VERB_PICKUP, "verb_pickup", "Pick up", S_VERB_PICKUP},
{I_VERB_TALKTO, "verb_talkto", "Talk to", S_VERB_TALKTO},
{I_VERB_OPEN, "verb_open", "Open", S_VERB_OPEN},
{I_VERB_CLOSE, "verb_close", "Close", S_VERB_CLOSE},
{I_VERB_USE, "verb_use", "Use", S_VERB_USE},
{I_VERB_GIVE, "verb_give", "Give", S_VERB_GIVE}
{I_VERB_WALKTO, "verb_walkto", "Walk to", kVerbWalkTo},
{I_VERB_LOOKAT, "verb_lookat", "Look at", kVerbLookAt},
{I_VERB_PICKUP, "verb_pickup", "Pick up", kVerbPickup},
{I_VERB_TALKTO, "verb_talkto", "Talk to", kVerbSpeakTo},
{I_VERB_OPEN, "verb_open", "Open", kVerbOpen},
{I_VERB_CLOSE, "verb_close", "Close", kVerbClose},
{I_VERB_USE, "verb_use", "Use", kVerbUse},
{I_VERB_GIVE, "verb_give", "Give", kVerbGive}
};
static INTERFACE_DESC ITE_interface = {

View file

@ -51,15 +51,23 @@ namespace Saga {
typedef unsigned int ScriptDataWord;
enum SCRIPT_VERBS {
S_VERB_WALKTO = 0,
S_VERB_LOOKAT = 2,
S_VERB_PICKUP = 1,
S_VERB_TALKTO,
S_VERB_OPEN = 5,
S_VERB_CLOSE = 6,
S_VERB_USE = 8,
S_VERB_GIVE
enum VerbTypes {
//todo: LUT for drawing
kVerbNone = 0,
kVerbPickup = 1,
kVerbLookAt = 2,
kVerbWalkTo = 3,
kVerbSpeakTo = 4,
kVerbOpen = 5,
kVerbClose = 6,
kVerbGive = 7,
kVerbUse = 8,
kVerbOptions = 9,
kVerbEnter = 10,
kVerbLeave = 11,
kVerbBegin = 12,
kVerbWalkOnly = 13,
kVerbLookOnly = 14
};
#define STHREAD_TIMESLICE 8

View file

@ -694,13 +694,13 @@ int Script::SF_actorWalk(SCRIPTFUNC_PARAMS) {
int Script::sfCycleFrames(SCRIPTFUNC_PARAMS) {
uint16 actorId;
int flags;
int cycleFrameNumber;
int cycleFrameSequence;
int cycleDelay;
ActorData *actor;
actorId = getSWord(thread->pop());
flags = getUWord(thread->pop());
cycleFrameNumber = getUWord(thread->pop());
cycleFrameSequence = getUWord(thread->pop());
cycleDelay = getUWord(thread->pop());
actor = _vm->_actor->getActor(actorId);
@ -723,7 +723,7 @@ int Script::sfCycleFrames(SCRIPTFUNC_PARAMS) {
actor->actorFlags |= kActorBackwards;
}
actor->cycleFrameNumber = cycleFrameNumber;
actor->cycleFrameSequence = cycleFrameSequence;
actor->cycleTimeCount = 0;
actor->cycleDelay = cycleDelay;
actor->actionCycle = 0;