mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Fix bots acting weird near the finish line
This commit is contained in:
parent
438e639d46
commit
754004e07c
1 changed files with 37 additions and 14 deletions
51
src/k_bot.c
51
src/k_bot.c
|
|
@ -657,6 +657,7 @@ static botprediction_t *K_CreateBotPrediction(player_t *player)
|
||||||
angle_t angletonext = ANGLE_MAX;
|
angle_t angletonext = ANGLE_MAX;
|
||||||
INT32 disttonext = INT32_MAX;
|
INT32 disttonext = INT32_MAX;
|
||||||
|
|
||||||
|
waypoint_t *finishLine = K_GetFinishLineWaypoint();
|
||||||
waypoint_t *wp = player->nextwaypoint;
|
waypoint_t *wp = player->nextwaypoint;
|
||||||
mobj_t *prevwpmobj = player->mo;
|
mobj_t *prevwpmobj = player->mo;
|
||||||
|
|
||||||
|
|
@ -673,7 +674,7 @@ static botprediction_t *K_CreateBotPrediction(player_t *player)
|
||||||
disttonext = P_AproxDistance(prevwpmobj->x - wp->mobj->x, prevwpmobj->y - wp->mobj->y) / FRACUNIT;
|
disttonext = P_AproxDistance(prevwpmobj->x - wp->mobj->x, prevwpmobj->y - wp->mobj->y) / FRACUNIT;
|
||||||
|
|
||||||
pathfindsuccess = K_PathfindToWaypoint(
|
pathfindsuccess = K_PathfindToWaypoint(
|
||||||
player->nextwaypoint, K_GetFinishLineWaypoint(),
|
player->nextwaypoint, finishLine,
|
||||||
&pathtofinish,
|
&pathtofinish,
|
||||||
useshortcuts, huntbackwards
|
useshortcuts, huntbackwards
|
||||||
);
|
);
|
||||||
|
|
@ -694,17 +695,16 @@ static botprediction_t *K_CreateBotPrediction(player_t *player)
|
||||||
prevwpmobj = ((waypoint_t *)pathtofinish.array[ i - 1 ].nodedata)->mobj;
|
prevwpmobj = ((waypoint_t *)pathtofinish.array[ i - 1 ].nodedata)->mobj;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P_TraceBotTraversal(player->mo, wp->mobj) == false)
|
|
||||||
{
|
|
||||||
// If we can't get a direct path to this waypoint, stop predicting.
|
|
||||||
distanceleft = 0;
|
|
||||||
radreduce = FRACUNIT >> 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
angletonext = R_PointToAngle2(prevwpmobj->x, prevwpmobj->y, wp->mobj->x, wp->mobj->y);
|
angletonext = R_PointToAngle2(prevwpmobj->x, prevwpmobj->y, wp->mobj->x, wp->mobj->y);
|
||||||
disttonext = P_AproxDistance(prevwpmobj->x - wp->mobj->x, prevwpmobj->y - wp->mobj->y) / FRACUNIT;
|
disttonext = P_AproxDistance(prevwpmobj->x - wp->mobj->x, prevwpmobj->y - wp->mobj->y) / FRACUNIT;
|
||||||
|
|
||||||
|
if (P_TraceBotTraversal(player->mo, wp->mobj) == false)
|
||||||
|
{
|
||||||
|
// If we can't get a direct path to this waypoint, predict less.
|
||||||
|
distanceleft -= disttonext;
|
||||||
|
radreduce = FRACUNIT >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (wp->mobj->radius < smallestradius)
|
if (wp->mobj->radius < smallestradius)
|
||||||
{
|
{
|
||||||
smallestradius = wp->mobj->radius;
|
smallestradius = wp->mobj->radius;
|
||||||
|
|
@ -717,12 +717,35 @@ static botprediction_t *K_CreateBotPrediction(player_t *player)
|
||||||
// We're done!!
|
// We're done!!
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (i == pathtofinish.numnodes)
|
if (i == pathtofinish.numnodes-1 && disttonext > 0)
|
||||||
{
|
{
|
||||||
// Reached the finish!!
|
// We were pathfinding to the finish, but we want to go past it.
|
||||||
distanceleft = 0;
|
// Set up a new pathfind.
|
||||||
|
|
||||||
|
waypoint_t *next = NULL;
|
||||||
|
|
||||||
|
if (finishLine->numnextwaypoints == 0)
|
||||||
|
{
|
||||||
|
distanceleft = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// default to first one
|
||||||
|
next = wp->nextwaypoints[0];
|
||||||
|
|
||||||
|
pathfindsuccess = K_PathfindToWaypoint(
|
||||||
|
next, finishLine,
|
||||||
|
&pathtofinish,
|
||||||
|
useshortcuts, huntbackwards
|
||||||
|
);
|
||||||
|
|
||||||
|
if (pathfindsuccess == false)
|
||||||
|
{
|
||||||
|
distanceleft = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Free(pathtofinish.array);
|
Z_Free(pathtofinish.array);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue