Use facing angle while still

Also comment some of my additions a little better
This commit is contained in:
TehRealSalt 2019-10-24 08:21:45 -04:00
parent a9a7f9c1ec
commit fc03012749
2 changed files with 23 additions and 40 deletions

View file

@ -5500,7 +5500,7 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player, boolean closest)
{ {
waypoint_t *waypoint = NULL; waypoint_t *waypoint = NULL;
if (closest) if (closest == true)
waypoint = K_GetClosestWaypointToMobj(player->mo); waypoint = K_GetClosestWaypointToMobj(player->mo);
else else
waypoint = K_GetBestWaypointTouchingMobj(player->mo); waypoint = K_GetBestWaypointTouchingMobj(player->mo);
@ -5514,10 +5514,18 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player, boolean closest)
if (waypoint != NULL) if (waypoint != NULL)
{ {
boolean finishlinehack = false; boolean finishlinehack = false;
angle_t playerangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); //player->mo->angle angle_t playerangle = player->mo->angle;
angle_t angletowaypoint = angle_t angletowaypoint =
R_PointToAngle2(player->mo->x, player->mo->y, waypoint->mobj->x, waypoint->mobj->y); R_PointToAngle2(player->mo->x, player->mo->y, waypoint->mobj->x, waypoint->mobj->y);
angle_t angledelta = playerangle - angletowaypoint; angle_t angledelta = ANGLE_MAX;
if (player->mo->momx != 0 || player->mo->momy != 0)
{
// Default to facing angle if you're not moving, but use momentum angle otherwise.
playerangle = R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy);
}
angledelta = playerangle - angletowaypoint;
if (angledelta > ANGLE_180) if (angledelta > ANGLE_180)
{ {
@ -5533,6 +5541,7 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player, boolean closest)
} }
} }
// The wrong way flag will use its previous value if we're facing sideways
if ((angledelta > ANGLE_45) && (finishlinehack == false)) if ((angledelta > ANGLE_45) && (finishlinehack == false))
{ {
angle_t nextbestdelta = angledelta; angle_t nextbestdelta = angledelta;
@ -5557,6 +5566,7 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player, boolean closest)
bestwaypoint = waypoint->nextwaypoints[i]; bestwaypoint = waypoint->nextwaypoints[i];
nextbestdelta = angledelta; nextbestdelta = angledelta;
// Remove wrong way flag if we're using nextwaypoints
player->kartstuff[k_wrongway] = 0; player->kartstuff[k_wrongway] = 0;
} }
} }
@ -5581,6 +5591,7 @@ static waypoint_t *K_GetPlayerNextWaypoint(player_t *player, boolean closest)
bestwaypoint = waypoint->prevwaypoints[i]; bestwaypoint = waypoint->prevwaypoints[i];
nextbestdelta = angledelta; nextbestdelta = angledelta;
// Set wrong way flag if we're using prevwaypoints
player->kartstuff[k_wrongway] = 1; player->kartstuff[k_wrongway] = 1;
} }
} }
@ -5681,6 +5692,7 @@ static void K_UpdateDistanceFromFinishLine(player_t *const player)
if ((nextwaypoint == NULL) && (player->nextwaypoint == NULL)) if ((nextwaypoint == NULL) && (player->nextwaypoint == NULL))
{ {
// Special case: if player nextwaypoint is still NULL, we want to fix that as soon as possible, so use the closest waypoint instead. // Special case: if player nextwaypoint is still NULL, we want to fix that as soon as possible, so use the closest waypoint instead.
// This will most likely only happen on map load or player spawn.
nextwaypoint = K_GetPlayerNextWaypoint(player, true); nextwaypoint = K_GetPlayerNextWaypoint(player, true);
} }
@ -5695,6 +5707,7 @@ static void K_UpdateDistanceFromFinishLine(player_t *const player)
player->starpostz = nextwaypoint->mobj->z >> FRACBITS; player->starpostz = nextwaypoint->mobj->z >> FRACBITS;
// player gravflip determines which way to respawn // player gravflip determines which way to respawn
// (should waypoints have a flip option?)
player->kartstuff[k_starpostflip] = player->mo->flags2 & MF2_OBJECTFLIP; player->kartstuff[k_starpostflip] = player->mo->flags2 & MF2_OBJECTFLIP;
// starpostangle is to the first valid nextwaypoint for simplicity // starpostangle is to the first valid nextwaypoint for simplicity
@ -5717,7 +5730,8 @@ static void K_UpdateDistanceFromFinishLine(player_t *const player)
if (nextwaypoint != NULL) if (nextwaypoint != NULL)
{ {
// At this point, we don't want to update the waypoint until we touch another. // If nextwaypoint is NULL, it means we don't want to update the waypoint until we touch another one.
// player->nextwaypoint will keep its previous value in this case.
player->nextwaypoint = nextwaypoint; player->nextwaypoint = nextwaypoint;
} }

View file

@ -265,43 +265,12 @@ waypoint_t *K_GetBestWaypointTouchingMobj(mobj_t *const mobj)
(mobj->y >> FRACBITS) - (checkwaypoint->mobj->y >> FRACBITS)); (mobj->y >> FRACBITS) - (checkwaypoint->mobj->y >> FRACBITS));
checkdist = P_AproxDistance(checkdist, (mobj->z >> FRACBITS) - (checkwaypoint->mobj->z >> FRACBITS)); checkdist = P_AproxDistance(checkdist, (mobj->z >> FRACBITS) - (checkwaypoint->mobj->z >> FRACBITS));
// The mobj has to be touching this waypoint to update to it. // The mobj has to be touching this waypoint to use it.
if (checkdist <= checkwaypoint->mobj->radius) if ((checkdist <= checkwaypoint->mobj->radius)
&& (checkdist < bestdist))
{ {
#if 0 bestwaypoint = checkwaypoint;
// This kind of algorithm may or may not be more reliable than what's below. bestdist = checkdist;
// But it's a little heavier, computation-wise.
// We'll see if simple closer checks work fine in netgame testing, or if it needs this.
boolean success = false;
path_t pathtofinish = {};
success = K_PathfindToWaypoint(checkwaypoint, finishline, &pathtofinish, false, false);
// If you're touching more than 1 waypoint, then we use the closest one to the finish line.
if (success == true)
{
// Add euclidean distance to the next waypoint to the distancetofinish
UINT32 distancetofinish;
UINT32 adddist;
adddist = ((UINT32)checkdist) >> FRACBITS;
distancetofinish = pathtofinish.totaldist + adddist;
Z_Free(pathtofinish.array);
if (distancetofinish < bestdist)
{
bestwaypoint = checkwaypoint;
bestdist = checkdist;
}
}
#else
// Simple closest check
if (checkdist < bestdist)
{
bestwaypoint = checkwaypoint;
bestdist = checkdist;
}
#endif
} }
} }
} }