mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 20:41:46 +00:00
Simplify angle/speed radius logic
This commit is contained in:
parent
fae9939a25
commit
ee5e96b65e
1 changed files with 27 additions and 44 deletions
71
src/k_bot.c
71
src/k_bot.c
|
|
@ -961,29 +961,27 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t *
|
||||||
// Handle steering towards waypoints!
|
// Handle steering towards waypoints!
|
||||||
INT32 turnamt = 0;
|
INT32 turnamt = 0;
|
||||||
SINT8 turnsign = 0;
|
SINT8 turnsign = 0;
|
||||||
angle_t moveangle, angle;
|
angle_t moveangle;
|
||||||
INT16 anglediff;
|
INT32 anglediff;
|
||||||
|
|
||||||
I_Assert(predict != NULL);
|
I_Assert(predict != NULL);
|
||||||
|
|
||||||
moveangle = player->mo->angle;
|
moveangle = player->mo->angle;
|
||||||
angle = (moveangle - destangle);
|
anglediff = AngleDeltaSigned(moveangle, destangle);
|
||||||
|
|
||||||
if (angle < ANGLE_180)
|
if (anglediff < 0)
|
||||||
{
|
{
|
||||||
turnsign = -1; // Turn right
|
turnsign = 1;
|
||||||
anglediff = AngleFixed(angle)>>FRACBITS;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
turnsign = 1; // Turn left
|
turnsign = -1;
|
||||||
anglediff = 360-(AngleFixed(angle)>>FRACBITS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
anglediff = abs(anglediff);
|
anglediff = abs(anglediff);
|
||||||
turnamt = KART_FULLTURN * turnsign;
|
turnamt = KART_FULLTURN * turnsign;
|
||||||
|
|
||||||
if (anglediff > 90)
|
if (anglediff > ANGLE_90)
|
||||||
{
|
{
|
||||||
// Wrong way!
|
// Wrong way!
|
||||||
cmd->forwardmove = -MAXPLMOVE;
|
cmd->forwardmove = -MAXPLMOVE;
|
||||||
|
|
@ -992,7 +990,7 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t *
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const fixed_t playerwidth = (player->mo->radius * 2);
|
const fixed_t playerwidth = (player->mo->radius * 2);
|
||||||
fixed_t realrad = predict->radius - (playerwidth * 4); // Remove a "safe" distance away from the edges of the road
|
fixed_t realrad = predict->radius*3/4; // Remove a "safe" distance away from the edges of the road
|
||||||
fixed_t rad = realrad;
|
fixed_t rad = realrad;
|
||||||
fixed_t dirdist = K_DistanceOfLineFromPoint(
|
fixed_t dirdist = K_DistanceOfLineFromPoint(
|
||||||
player->mo->x, player->mo->y,
|
player->mo->x, player->mo->y,
|
||||||
|
|
@ -1000,19 +998,26 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t *
|
||||||
predict->x, predict->y
|
predict->x, predict->y
|
||||||
);
|
);
|
||||||
|
|
||||||
if (realrad < player->mo->radius)
|
if (realrad < playerwidth)
|
||||||
{
|
{
|
||||||
realrad = player->mo->radius;
|
realrad = playerwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anglediff > 0)
|
// Become more precise based on how hard you need to turn
|
||||||
{
|
// This makes predictions into turns a little nicer
|
||||||
// Become more precise based on how hard you need to turn
|
// Facing 90 degrees away from the predicted point gives you 0 radius
|
||||||
// This makes predictions into turns a little nicer
|
rad = FixedMul(rad,
|
||||||
// Facing 90 degrees away from the predicted point gives you a 1/3 radius
|
FixedDiv(max(0, ANGLE_90 - anglediff), ANGLE_90)
|
||||||
rad = FixedMul(rad, ((135 - anglediff) * FRACUNIT) / 135);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
|
// Become more precise the slower you're moving
|
||||||
|
// Also helps with turns
|
||||||
|
// Full speed uses full radius
|
||||||
|
rad = FixedMul(rad,
|
||||||
|
FixedDiv(K_BotSpeedScaled(player, player->speed), K_GetKartSpeed(player, false, false))
|
||||||
|
);
|
||||||
|
|
||||||
|
// Cap the radius to reasonable bounds
|
||||||
if (rad > realrad)
|
if (rad > realrad)
|
||||||
{
|
{
|
||||||
rad = realrad;
|
rad = realrad;
|
||||||
|
|
@ -1022,36 +1027,14 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t *
|
||||||
rad = playerwidth;
|
rad = playerwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd->buttons |= BT_ACCELERATE;
|
|
||||||
|
|
||||||
// Full speed ahead!
|
// Full speed ahead!
|
||||||
|
cmd->buttons |= BT_ACCELERATE;
|
||||||
cmd->forwardmove = MAXPLMOVE;
|
cmd->forwardmove = MAXPLMOVE;
|
||||||
|
|
||||||
if (dirdist <= rad)
|
if (dirdist <= rad)
|
||||||
{
|
{
|
||||||
fixed_t speedmul = FixedDiv(K_BotSpeedScaled(player, player->speed), K_GetKartSpeed(player, false, false));
|
// Going the right way, don't turn at all.
|
||||||
fixed_t speedrad = rad/4;
|
turnamt = 0;
|
||||||
|
|
||||||
if (speedmul > FRACUNIT)
|
|
||||||
{
|
|
||||||
speedmul = FRACUNIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increase radius with speed
|
|
||||||
// At low speed, the CPU will try to be more accurate
|
|
||||||
// At high speed, they're more likely to lawnmower
|
|
||||||
speedrad += FixedMul(speedmul, rad - speedrad);
|
|
||||||
|
|
||||||
if (speedrad < playerwidth)
|
|
||||||
{
|
|
||||||
speedrad = playerwidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirdist <= speedrad)
|
|
||||||
{
|
|
||||||
// Don't turn at all
|
|
||||||
turnamt = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue