- some "actors walk" work progression
svn-id: r16308
This commit is contained in:
parent
a8c8a7ab4c
commit
a66080b80a
5 changed files with 154 additions and 97 deletions
146
saga/actor.cpp
146
saga/actor.cpp
|
@ -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;
|
||||
|
||||
|
|
55
saga/actor.h
55
saga/actor.h
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue