Rewrite T_PolyObjWaypoint to move more smoothly
This commit is contained in:
parent
0508f99419
commit
e422d1fa1d
159
src/p_polyobj.c
159
src/p_polyobj.c
|
@ -1600,11 +1600,8 @@ static void T_MovePolyObj(polyobj_t *po, fixed_t distx, fixed_t disty, fixed_t d
|
||||||
void T_PolyObjWaypoint(polywaypoint_t *th)
|
void T_PolyObjWaypoint(polywaypoint_t *th)
|
||||||
{
|
{
|
||||||
mobj_t *target = NULL;
|
mobj_t *target = NULL;
|
||||||
mobj_t *waypoint = NULL;
|
|
||||||
fixed_t pox, poy, poz;
|
|
||||||
fixed_t distx, disty, distz, dist;
|
|
||||||
fixed_t momx, momy, momz;
|
|
||||||
polyobj_t *po = Polyobj_GetForNum(th->polyObjNum);
|
polyobj_t *po = Polyobj_GetForNum(th->polyObjNum);
|
||||||
|
fixed_t speed = th->speed;
|
||||||
|
|
||||||
if (!po)
|
if (!po)
|
||||||
#ifdef RANGECHECK
|
#ifdef RANGECHECK
|
||||||
|
@ -1629,97 +1626,95 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pox = po->centerPt.x;
|
// Move along the waypoint sequence until speed for the current tic is exhausted
|
||||||
poy = po->centerPt.y;
|
while (speed > 0)
|
||||||
poz = (po->lines[0]->backsector->floorheight + po->lines[0]->backsector->ceilingheight)/2;
|
|
||||||
|
|
||||||
// Calculate the distance between the polyobject and the waypoint
|
|
||||||
distx = target->x - pox;
|
|
||||||
disty = target->y - poy;
|
|
||||||
distz = target->z - poz;
|
|
||||||
dist = P_AproxDistance(P_AproxDistance(distx, disty), distz);
|
|
||||||
|
|
||||||
if (dist < 1)
|
|
||||||
dist = 1;
|
|
||||||
|
|
||||||
momx = FixedMul(FixedDiv(target->x - pox, dist), th->speed);
|
|
||||||
momy = FixedMul(FixedDiv(target->y - poy, dist), th->speed);
|
|
||||||
momz = FixedMul(FixedDiv(target->z - poz, dist), th->speed);
|
|
||||||
|
|
||||||
// Will the polyobject be FURTHER away if the momx/momy/momz is added to
|
|
||||||
// its current coordinates, or closer? (shift down to fracunits to avoid approximation errors)
|
|
||||||
if (dist>>FRACBITS <= P_AproxDistance(P_AproxDistance(target->x - pox - momx, target->y - poy - momy), target->z - poz - momz)>>FRACBITS)
|
|
||||||
{
|
{
|
||||||
// If further away, set XYZ of polyobject to waypoint location
|
mobj_t *waypoint = NULL;
|
||||||
T_MovePolyObj(po, distx, disty, distz);
|
fixed_t pox, poy, poz;
|
||||||
|
fixed_t distx, disty, distz, dist;
|
||||||
|
|
||||||
if (!th->stophere)
|
// Current position of polyobject
|
||||||
|
pox = po->centerPt.x;
|
||||||
|
poy = po->centerPt.y;
|
||||||
|
poz = (po->lines[0]->backsector->floorheight + po->lines[0]->backsector->ceilingheight)/2;
|
||||||
|
|
||||||
|
// Calculate the distance between the polyobject and the waypoint
|
||||||
|
distx = target->x - pox;
|
||||||
|
disty = target->y - poy;
|
||||||
|
distz = target->z - poz;
|
||||||
|
dist = P_AproxDistance(P_AproxDistance(distx, disty), distz);
|
||||||
|
|
||||||
|
if (dist < 1)
|
||||||
|
dist = 1;
|
||||||
|
|
||||||
|
// Will the polyobject overshoot its target?
|
||||||
|
if (speed <= dist)
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_POLYOBJ, "Looking for next waypoint...\n");
|
// No. Move towards waypoint
|
||||||
waypoint = (th->direction == -1) ? P_GetPreviousWaypoint(target, false) : P_GetNextWaypoint(target, false);
|
fixed_t momx, momy, momz;
|
||||||
|
|
||||||
if (!waypoint && th->returnbehavior == PWR_WRAP) // If specified, wrap waypoints
|
momx = FixedMul(FixedDiv(target->x - pox, dist), speed);
|
||||||
{
|
momy = FixedMul(FixedDiv(target->y - poy, dist), speed);
|
||||||
if (!th->continuous)
|
momz = FixedMul(FixedDiv(target->z - poz, dist), speed);
|
||||||
{
|
T_MovePolyObj(po, momx, momy, momz);
|
||||||
th->returnbehavior = PWR_STOP;
|
return;
|
||||||
th->stophere = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
waypoint = (th->direction == -1) ? P_GetLastWaypoint(th->sequence) : P_GetFirstWaypoint(th->sequence);
|
|
||||||
}
|
|
||||||
else if (!waypoint && th->returnbehavior == PWR_COMEBACK) // Come back to the start
|
|
||||||
{
|
|
||||||
th->direction = -th->direction;
|
|
||||||
|
|
||||||
if (!th->continuous)
|
|
||||||
th->returnbehavior = PWR_STOP;
|
|
||||||
|
|
||||||
waypoint = (th->direction == -1) ? P_GetPreviousWaypoint(target, false) : P_GetNextWaypoint(target, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (waypoint)
|
|
||||||
{
|
|
||||||
CONS_Debug(DBG_POLYOBJ, "Found waypoint (sequence %d, number %d).\n", waypoint->threshold, waypoint->health);
|
|
||||||
|
|
||||||
target = waypoint;
|
|
||||||
th->pointnum = target->health;
|
|
||||||
// Set the mobj as your target! -- Monster Iestyn 27/12/19
|
|
||||||
P_SetTarget(&th->target, target);
|
|
||||||
|
|
||||||
// calculate MOMX/MOMY/MOMZ for next waypoint
|
|
||||||
// change slope
|
|
||||||
dist = P_AproxDistance(P_AproxDistance(target->x - pox, target->y - poy), target->z - poz);
|
|
||||||
|
|
||||||
if (dist < 1)
|
|
||||||
dist = 1;
|
|
||||||
|
|
||||||
momx = FixedMul(FixedDiv(target->x - pox, dist), th->speed);
|
|
||||||
momy = FixedMul(FixedDiv(target->y - poy, dist), th->speed);
|
|
||||||
momz = FixedMul(FixedDiv(target->z - poz, dist), th->speed);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
momx = momy = momz = 0;
|
// Yes. Teleport to waypoint and look for the next one
|
||||||
|
T_MovePolyObj(po, distx, disty, distz);
|
||||||
|
|
||||||
if (!th->stophere)
|
if (!th->stophere)
|
||||||
CONS_Debug(DBG_POLYOBJ, "Next waypoint not found!\n");
|
{
|
||||||
|
CONS_Debug(DBG_POLYOBJ, "Looking for next waypoint...\n");
|
||||||
|
waypoint = (th->direction == -1) ? P_GetPreviousWaypoint(target, false) : P_GetNextWaypoint(target, false);
|
||||||
|
|
||||||
if (po->thinker == &th->thinker)
|
if (!waypoint && th->returnbehavior == PWR_WRAP) // If specified, wrap waypoints
|
||||||
po->thinker = NULL;
|
{
|
||||||
|
if (!th->continuous)
|
||||||
|
{
|
||||||
|
th->returnbehavior = PWR_STOP;
|
||||||
|
th->stophere = true;
|
||||||
|
}
|
||||||
|
|
||||||
P_RemoveThinker(&th->thinker);
|
waypoint = (th->direction == -1) ? P_GetLastWaypoint(th->sequence) : P_GetFirstWaypoint(th->sequence);
|
||||||
return;
|
}
|
||||||
|
else if (!waypoint && th->returnbehavior == PWR_COMEBACK) // Come back to the start
|
||||||
|
{
|
||||||
|
th->direction = -th->direction;
|
||||||
|
|
||||||
|
if (!th->continuous)
|
||||||
|
th->returnbehavior = PWR_STOP;
|
||||||
|
|
||||||
|
waypoint = (th->direction == -1) ? P_GetPreviousWaypoint(target, false) : P_GetNextWaypoint(target, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (waypoint)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_POLYOBJ, "Found waypoint (sequence %d, number %d).\n", waypoint->threshold, waypoint->health);
|
||||||
|
|
||||||
|
target = waypoint;
|
||||||
|
th->pointnum = target->health;
|
||||||
|
// Set the mobj as your target! -- Monster Iestyn 27/12/19
|
||||||
|
P_SetTarget(&th->target, target);
|
||||||
|
|
||||||
|
// Calculate remaining speed
|
||||||
|
speed -= dist;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!th->stophere)
|
||||||
|
CONS_Debug(DBG_POLYOBJ, "Next waypoint not found!\n");
|
||||||
|
|
||||||
|
if (po->thinker == &th->thinker)
|
||||||
|
po->thinker = NULL;
|
||||||
|
|
||||||
|
P_RemoveThinker(&th->thinker);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// momx/momy/momz already equals the right speed
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move the polyobject
|
|
||||||
T_MovePolyObj(po, momx, momy, momz);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void T_PolyDoorSlide(polyslidedoor_t *th)
|
void T_PolyDoorSlide(polyslidedoor_t *th)
|
||||||
|
|
Loading…
Reference in a new issue