diff --git a/src/d_netcmd.c b/src/d_netcmd.c index d48a4e0c9..a9d160191 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -627,9 +627,9 @@ consvar_t cv_schedule = CVAR_INIT ("schedule", "On", CV_NETVAR|CV_CALL, CV_OnOff consvar_t cv_automate = CVAR_INIT ("automate", "On", CV_NETVAR, CV_OnOff, NULL); -consvar_t cv_test1 = CVAR_INIT ("test1", "400", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); -consvar_t cv_test2 = CVAR_INIT ("test2", "0.1", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); -consvar_t cv_test3 = CVAR_INIT ("test3", "10", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); +consvar_t cv_test1 = CVAR_INIT ("test1", "200", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); +consvar_t cv_test2 = CVAR_INIT ("test2", "40", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); +consvar_t cv_test3 = CVAR_INIT ("test3", "18", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); char timedemo_name[256]; boolean timedemo_csv; diff --git a/src/d_player.h b/src/d_player.h index 0391121c5..b7cc5d967 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -472,7 +472,6 @@ struct botvars_t SINT8 driftturn; // Drifting turn direction tic_t drifttime; // Time spent drifting tic_t driftlockout; // do not allow drifting for this many tics - tic_t driftending; // number of tics to force turning towards waypoint }; struct sonicloopcamvars_t diff --git a/src/k_bot.cpp b/src/k_bot.cpp index 2ab8bbeb6..72bb4eb07 100644 --- a/src/k_bot.cpp +++ b/src/k_bot.cpp @@ -1108,22 +1108,29 @@ static void K_BotStartDrift(player_t* player) if (speedfactor < FRACUNIT/2) { - // don't bother if we can't even drift + // don't bother if we're going too slow K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT); return; } - if (speedfactor > 4*FRACUNIT/3) + if (speedfactor > (6-gamespeed)*FRACUNIT/3) { // likewise, don't bother if we're going too fast K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT/2); return; } + if (player->botvars.driftlockout) + { + // things are not working out in our favor + player->botvars.driftlockout--; + return; + } + // check for waypoints ahead of us with drift settings, based on our current speed path_t path = {0}; - INT32 maxdist = FixedInt(cv_test1.value); - maxdist = FixedMul(maxdist, speedfactor + cv_test2.value); + INT32 maxdist = FixedInt(cv_test1.value) + gamespeed*50; + maxdist = FixedMul(maxdist, speedfactor * (player->botvars.driftstate == DRIFTSTATE_ACTIVE ? 1 : 2)); if (maxdist >= 0 && K_PathfindThruCircuit(player->currentwaypoint, maxdist, &path, false, false)) { @@ -1144,16 +1151,6 @@ static void K_BotStartDrift(player_t* player) if (driftsetting == DRIFT_NONE) { // No waypoints, nothing we can do here. - // ...except decrement driftlockout! - // do this here to prevent chaining drifts after messing up - if (player->botvars.driftlockout) - player->botvars.driftlockout--; - return; - } - - if (player->botvars.driftlockout) - { - // things are not working out in our favor return; } @@ -1307,8 +1304,7 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * cmd->forwardmove = MAXPLMOVE; if (dirdist <= rad - && player->botvars.driftstate != DRIFTSTATE_STARTING // steer towards waypoints when starting drift - && player->botvars.driftending == 0) // ...and after releasing a drift + && player->botvars.driftstate != DRIFTSTATE_STARTING) // steer towards waypoints when starting drift { // Going the right way, don't turn at all. turnamt = 0; @@ -1322,19 +1318,15 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * { cmd->buttons |= BT_DRIFT; - fixed_t angofs = -45*FRACUNIT; + fixed_t angofs = K_GetKartSpeedFromStat(5 - (player->kartspeed - 5), false) * -player->botvars.driftturn; - // steer a bit harder when starting a drift - angofs -= std::max(0, TICRATE/4 - player->botvars.drifttime)*2; + // adjust for speed + angofs = FixedMul(angofs, speedfactor - (2-gamespeed)*FRACUNIT/4); - // steer harder when above 75% speed - //if (speedfactor > 3*FRACUNIT/4) - //angofs = FixedMul(angofs, FRACUNIT/4 + 3*speedfactor/4); - - fixed_t driftpower = angofs*player->botvars.driftturn - FixedDiv(anglediff2, ANG1); + fixed_t driftpower = angofs - FixedDiv(anglediff2, ANG1); // arbitrary divider on the final driftpower - driftpower /= 55; + driftpower /= FixedInt(cv_test2.value); // brakedrift if we're steering too hard if (abs(driftpower) >= FRACUNIT) @@ -1784,9 +1776,6 @@ void K_UpdateBotGameplayVars(player_t *player) player->botvars.turnconfirm += player->cmd.bot.turnconfirm; - if (player->botvars.driftending) - player->botvars.driftending--; - // Is a bot not making any progress? Kill it and respawn at next waypoint. K_IncrementBotRespawn(player, &player->botvars.respawnconfirm, BOTRESPAWNCONFIRM); @@ -1812,7 +1801,8 @@ void K_UpdateBotGameplayVars(player_t *player) // so no need to worry about doing that ourselves. K_BotStartDrift(player); - tic_t limit, dtime = ++player->botvars.drifttime; + INT32 limit = FixedInt(cv_test3.value) - gamespeed*5; + INT32 dtime = ++player->botvars.drifttime; // the faster we are going, the sooner we need to drift fixed_t speedfactor = FixedDiv(player->speed, K_GetKartSpeed(player, false, false)); @@ -1820,7 +1810,7 @@ void K_UpdateBotGameplayVars(player_t *player) switch (player->botvars.driftstate) { case DRIFTSTATE_STARTING: - limit = std::max(0, FixedInt(cv_test3.value) - FixedMul(TICRATE/5, speedfactor)); + limit = std::max(0, limit - FixedMul(TICRATE/5, speedfactor)); if (dtime > limit) { K_BotSetDriftState(player, DRIFTSTATE_ACTIVE, 0); @@ -1828,11 +1818,10 @@ void K_UpdateBotGameplayVars(player_t *player) break; case DRIFTSTATE_ENDING: - limit = std::max(0, FixedInt(cv_test3.value) - FixedMul(TICRATE/5, speedfactor)); + limit = std::max(0, limit - FixedMul(TICRATE/5, speedfactor)); if (dtime > limit) { K_BotSetDriftState(player, DRIFTSTATE_AUTO, 0); - player->botvars.driftending = TICRATE/2; } break; diff --git a/src/k_hud.c b/src/k_hud.c index a82020237..29c214624 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -4834,7 +4834,6 @@ static void K_DrawBotDebugger(void) V_DrawThinString(24, 108, vflags|(stplyr->botvars.driftlockout ? V_ORANGEMAP : 0), va("Drift lockout: %d", stplyr->botvars.driftlockout)); V_DrawThinString(24, 116, vflags, va("Drift turn: %d", stplyr->botvars.driftturn)); V_DrawThinString(24, 124, vflags, va("Drift timer: %d", stplyr->botvars.drifttime)); - V_DrawThinString(24, 132, vflags, va("Drift end time: %d", stplyr->botvars.driftending)); } void K_drawKartHUD(void) diff --git a/src/p_saveg.c b/src/p_saveg.c index 7dcb868d3..b608e3724 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -387,7 +387,6 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITESINT8(save->p, players[i].botvars.driftturn); WRITEUINT32(save->p, players[i].botvars.drifttime); WRITEUINT32(save->p, players[i].botvars.driftlockout); - WRITEUINT32(save->p, players[i].botvars.driftending); WRITEFIXED(save->p, players[i].outrun); WRITEUINT8(save->p, players[i].outruntime); @@ -720,7 +719,6 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].botvars.driftturn = READSINT8(save->p); players[i].botvars.drifttime = READUINT32(save->p); players[i].botvars.driftlockout = READUINT32(save->p); - players[i].botvars.driftending = READUINT32(save->p); players[i].outrun = READFIXED(save->p); players[i].outruntime = READUINT8(save->p);