mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Bot grip experiment
This commit is contained in:
parent
5f95ad933f
commit
219f8d74a0
5 changed files with 20 additions and 4 deletions
|
|
@ -420,6 +420,8 @@ struct botvars_t
|
||||||
|
|
||||||
UINT8 roulettePriority; // What items to go for on the roulette
|
UINT8 roulettePriority; // What items to go for on the roulette
|
||||||
tic_t rouletteTimeout; // If it takes too long to decide, try lowering priority until we find something valid.
|
tic_t rouletteTimeout; // If it takes too long to decide, try lowering priority until we find something valid.
|
||||||
|
|
||||||
|
angle_t predictionError; // How bad is our momentum angle relative to where we're trying to go?
|
||||||
};
|
};
|
||||||
|
|
||||||
// player_t struct for round-specific condition tracking
|
// player_t struct for round-specific condition tracking
|
||||||
|
|
|
||||||
|
|
@ -1427,10 +1427,11 @@ static INT32 K_HandleBotTrack(const player_t *player, ticcmd_t *cmd, botpredicti
|
||||||
I_Assert(predict != nullptr);
|
I_Assert(predict != nullptr);
|
||||||
|
|
||||||
destangle = K_BotSmoothLanding(player, destangle);
|
destangle = K_BotSmoothLanding(player, destangle);
|
||||||
|
|
||||||
moveangle = player->mo->angle + K_GetUnderwaterTurnAdjust(player);
|
moveangle = player->mo->angle + K_GetUnderwaterTurnAdjust(player);
|
||||||
anglediff = AngleDeltaSigned(moveangle, destangle);
|
anglediff = AngleDeltaSigned(moveangle, destangle);
|
||||||
|
|
||||||
|
cmd->angle = std::min(destangle - moveangle, moveangle - destangle) >> TICCMD_REDUCE;
|
||||||
|
|
||||||
if (anglediff < 0)
|
if (anglediff < 0)
|
||||||
{
|
{
|
||||||
turnsign = 1;
|
turnsign = 1;
|
||||||
|
|
@ -1712,7 +1713,7 @@ static void K_BuildBotPodiumTiccmd(const player_t *player, ticcmd_t *cmd)
|
||||||
|
|
||||||
Build ticcmd for bots with a style of BOT_STYLE_NORMAL
|
Build ticcmd for bots with a style of BOT_STYLE_NORMAL
|
||||||
--------------------------------------------------*/
|
--------------------------------------------------*/
|
||||||
static void K_BuildBotTiccmdNormal(const player_t *player, ticcmd_t *cmd)
|
static void K_BuildBotTiccmdNormal(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
precise_t t = 0;
|
precise_t t = 0;
|
||||||
|
|
||||||
|
|
@ -1724,6 +1725,9 @@ static void K_BuildBotTiccmdNormal(const player_t *player, ticcmd_t *cmd)
|
||||||
UINT8 spindash = 0;
|
UINT8 spindash = 0;
|
||||||
INT32 turnamt = 0;
|
INT32 turnamt = 0;
|
||||||
|
|
||||||
|
cmd->angle = 0; // For bots, this is used to transmit prediction error to gamelogic.
|
||||||
|
// Will be overwritten by K_HandleBotTrack if we have a destination.
|
||||||
|
|
||||||
if (!(gametyperules & GTR_BOTS) // No bot behaviors
|
if (!(gametyperules & GTR_BOTS) // No bot behaviors
|
||||||
|| K_GetNumWaypoints() == 0 // No waypoints
|
|| K_GetNumWaypoints() == 0 // No waypoints
|
||||||
|| leveltime <= introtime // During intro camera
|
|| leveltime <= introtime // During intro camera
|
||||||
|
|
|
||||||
|
|
@ -6689,6 +6689,8 @@ static void K_DrawBotDebugger(void)
|
||||||
|
|
||||||
V_DrawSmallString(8, 66, 0, va("Complexity: %d", K_GetTrackComplexity()));
|
V_DrawSmallString(8, 66, 0, va("Complexity: %d", K_GetTrackComplexity()));
|
||||||
V_DrawSmallString(8, 70, 0, va("Bot modifier: %.2f", FixedToFloat(K_BotMapModifier())));
|
V_DrawSmallString(8, 70, 0, va("Bot modifier: %.2f", FixedToFloat(K_BotMapModifier())));
|
||||||
|
|
||||||
|
V_DrawSmallString(8, 76, 0, va("Prediction error: %d", bot->botvars.predictionError));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void K_DrawGPRankDebugger(void)
|
static void K_DrawGPRankDebugger(void)
|
||||||
|
|
|
||||||
|
|
@ -13022,14 +13022,19 @@ fixed_t K_PlayerBaseFriction(const player_t *player, fixed_t original)
|
||||||
|
|
||||||
// A bit extra friction to help them without drifting.
|
// A bit extra friction to help them without drifting.
|
||||||
// Remove this line once they can drift.
|
// Remove this line once they can drift.
|
||||||
frict -= extraFriction;
|
// frict -= extraFriction;
|
||||||
|
|
||||||
|
angle_t MAXERROR = 45*ANG1;
|
||||||
|
fixed_t errorfrict = Easing_Linear(min(FRACUNIT, FixedDiv(player->botvars.predictionError, MAXERROR)), 0, FRACUNIT>>2);
|
||||||
|
|
||||||
|
frict -= errorfrict;
|
||||||
|
|
||||||
// Bots gain more traction as they rubberband.
|
// Bots gain more traction as they rubberband.
|
||||||
const fixed_t traction_value = FixedMul(player->botvars.rubberband, max(FRACUNIT, K_BotMapModifier()));
|
const fixed_t traction_value = FixedMul(player->botvars.rubberband, max(FRACUNIT, K_BotMapModifier()));
|
||||||
if (traction_value > FRACUNIT)
|
if (traction_value > FRACUNIT)
|
||||||
{
|
{
|
||||||
const fixed_t traction_mul = traction_value - FRACUNIT;
|
const fixed_t traction_mul = traction_value - FRACUNIT;
|
||||||
frict -= FixedMul(extraFriction, traction_mul);
|
// frict -= FixedMul(extraFriction, traction_mul);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2321,6 +2321,9 @@ static void P_UpdatePlayerAngle(player_t *player)
|
||||||
{
|
{
|
||||||
// You're a bot. Go where you're supposed to go
|
// You're a bot. Go where you're supposed to go
|
||||||
player->steering = targetsteering;
|
player->steering = targetsteering;
|
||||||
|
// But the "angle" field of this ticcmd stores your prediction error,
|
||||||
|
// which we use to apply friction. Transfer it!
|
||||||
|
player->botvars.predictionError = player->cmd.angle << TICCMD_REDUCE;
|
||||||
}
|
}
|
||||||
else if ((!(player->cmd.flags & TICCMD_RECEIVED)) && (!!(player->oldcmd.flags && TICCMD_RECEIVED)))
|
else if ((!(player->cmd.flags & TICCMD_RECEIVED)) && (!!(player->oldcmd.flags && TICCMD_RECEIVED)))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue