diff --git a/src/k_bot.cpp b/src/k_bot.cpp index c96b4a708..e7feb6792 100644 --- a/src/k_bot.cpp +++ b/src/k_bot.cpp @@ -1067,6 +1067,8 @@ static void K_WaypointGetDirectionVector(waypoint_t *wp1, waypoint_t *wp2, vecto FV3_Normalize(a_o); } +#define MINBOTDRIFT (KART_FULLTURN * 2) / 3 // 0.66 + /*-------------------------------------------------- static INT32 K_BotStartDrift(player_t* player) @@ -1282,6 +1284,11 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * turnamt = 0; } + fixed_t minspeed = (10 * player->mo->scale); + + // 0.5 on Easy, 1.0 on Normal, 1.5 on Hard. + INT32 mindriftamt = FixedMul(MINBOTDRIFT * (cv_kartspeed.value + 1), 2 * FRACUNIT); + // Start or continue a drift. if (player->botvars.drifttime) { @@ -1291,6 +1298,18 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * { turnamt = KART_FULLTURN * -player->botvars.driftturn; } + else if ((player->botvars.powersliding) && (player->speed >= minspeed)) + { + // Force a mostly inward drift during powerslides. + if (player->botvars.driftturn < 0) + { + turnamt = std::min(KART_FULLTURN, std::max(mindriftamt, turnamt)); + } + else + { + turnamt = std::min(-MINBOTDRIFT, std::max(-mindriftamt, turnamt)); + } + } cmd->buttons |= BT_DRIFT; } @@ -1313,6 +1332,8 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * return turnamt; } +#undef MINBOTDRIFT + /*-------------------------------------------------- static INT32 K_HandleBotReverse(const player_t *player, ticcmd_t *cmd, botprediction_t *predict)