diff --git a/src/d_main.cpp b/src/d_main.cpp index 82c2a5284..004f33f64 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -87,7 +87,7 @@ #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 #define ASSET_HASH_MAIN_PK3 0x90bc93435f9aa4c4 -#define ASSET_HASH_MAPPATCH_PK3 0xc789aadf69a0bcf9 +#define ASSET_HASH_MAPPATCH_PK3 0x6a8f4d3080d40af3 #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 #endif diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 95ca7a60d..08fc58835 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", "-45", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); -consvar_t cv_test2 = CVAR_INIT ("test2", "55", CV_NETVAR|CV_FLOAT, CV_Signed, NULL); -consvar_t cv_test3 = CVAR_INIT ("test3", "250", CV_NETVAR|CV_FLOAT, CV_Signed, 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); char timedemo_name[256]; boolean timedemo_csv; diff --git a/src/d_player.h b/src/d_player.h index f009ca891..0391121c5 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -473,7 +473,6 @@ struct botvars_t 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 - UINT32 driftdist; // distance to finish when drift state changes }; struct sonicloopcamvars_t diff --git a/src/k_bot.cpp b/src/k_bot.cpp index 13fb31995..e04b2f6c7 100644 --- a/src/k_bot.cpp +++ b/src/k_bot.cpp @@ -1079,7 +1079,6 @@ void K_BotSetDriftState(player_t *player, botdrift_t newstate, tic_t lockout) { player->botvars.driftstate = newstate; player->botvars.drifttime = 0; - player->botvars.driftdist = player->distancetofinish; } if (lockout) @@ -1103,25 +1102,18 @@ static void K_BotStartDrift(player_t* player) { // Handle DRIFTING towards waypoints! boolean shouldDrift; - fixed_t botDriftSpeed, distToNext; - INT32 driftsetting; + fixed_t botDriftSpeed; + driftSetting_e driftsetting = DRIFT_NONE; + fixed_t speedfactor = FixedDiv(player->speed, K_GetKartSpeed(player, false, false)); - waypoint_t *wp = player->nextwaypoint; // player->currentwaypoint - - if (!wp || !wp->driftsettings) - { - // No waypoints, nothing we can do here. - return; - } - - if (player->speed < 10 * player->mo->scale) + if (speedfactor < FRACUNIT/2) { // don't bother if we can't even drift K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT); return; } - if (player->speed > K_GetKartSpeed(player, true, true) + 10*player->mo->scale) + if (speedfactor > 4*FRACUNIT/3) { // likewise, don't bother if we're going too fast K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT/2); @@ -1134,8 +1126,34 @@ static void K_BotStartDrift(player_t* player) 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); + + if (maxdist >= 0 && K_PathfindThruCircuit(player->currentwaypoint, maxdist, &path, false, false)) + { + for (size_t i = 0; i < path.numnodes; i++) + { + waypoint_t *wp = static_cast(path.array[i].nodedata); + if (wp->driftsettings) + driftsetting = static_cast(wp->driftsettings); + + // don't break on DRIFT_END waypoints, + // we could miss a drift waypoint right in front of it! + if (driftsetting != DRIFT_NONE && driftsetting != DRIFT_END) + break; + } + Z_Free(path.array); + } + + if (driftsetting == DRIFT_NONE) + { + // No waypoints, nothing we can do here. + return; + } + shouldDrift = false; - driftsetting = wp->driftsettings; botDriftSpeed = FixedMul(K_GetKartSpeed(player, false, false), FixedPercentage(BOTDRIFTPERCENT)); @@ -1154,21 +1172,7 @@ static void K_BotStartDrift(player_t* player) if ((driftpotential <= player->botvars.driftskill) && (botDriftSpeed <= player->speed)) { - // Get our distance from the waypoint. - distToNext = R_PointToDist2( - 0, - player->mo->z, - R_PointToDist2(player->mo->x, - player->mo->y, - wp->mobj->x, - wp->mobj->y), - wp->mobj->z); - - // If we're within distance, start drifting! - if (distToNext < wp->mobj->radius*2) - { - shouldDrift = true; - } + shouldDrift = true; } if (shouldDrift) @@ -1222,6 +1226,7 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * SINT8 turnsign = 0; angle_t moveangle; INT32 anglediff, anglediff2; + fixed_t speedfactor = FixedDiv(player->speed, K_GetKartSpeed(player, false, false)); I_Assert(predict != nullptr); @@ -1231,7 +1236,6 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * // line up for an incoming drift if (player->botvars.driftstate == DRIFTSTATE_STARTING) { - fixed_t speedfactor = FixedDiv(player->speed, K_GetKartSpeed(player, true, true)); anglediff += FixedMul(ANG10-ANG2, speedfactor) * player->botvars.driftturn; } @@ -1253,9 +1257,6 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * // Wrong way! cmd->forwardmove = -MAXPLMOVE; cmd->buttons |= BT_BRAKE; - - // Why would we need to drift? - K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT); } else { @@ -1317,13 +1318,23 @@ static INT32 K_HandleBotTrack(player_t *player, ticcmd_t *cmd, botprediction_t * { cmd->buttons |= BT_DRIFT; - fixed_t driftpower = ((cv_test1.value - std::max(0, TICRATE/4 - player->botvars.drifttime)*2)*player->botvars.driftturn - FixedDiv(anglediff2, 11930464))/FixedInt(cv_test2.value); + fixed_t angofs = -45*FRACUNIT; + + // steer a bit harder when starting a drift + angofs -= std::max(0, TICRATE/4 - player->botvars.drifttime)*2; + + // 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); + + // arbitrary divider on the final driftpower + driftpower /= 55; // brakedrift if we're steering too hard - if (abs(driftpower) >= 21*FRACUNIT/20) - { + if (abs(driftpower) >= FRACUNIT) cmd->buttons |= BT_BRAKE; - } driftpower = FixedMul(driftpower, FRACUNIT/3 + (player->kartweight * FRACUNIT/15)); @@ -1781,6 +1792,11 @@ void K_UpdateBotGameplayVars(player_t *player) player->botvars.respawnconfirm = 0; } + else if (player->cmd.forwardmove < 0) + { + // stop drifting if we're reversing + K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT); + } else { // Figure out if we need to drift. @@ -1788,40 +1804,24 @@ void K_UpdateBotGameplayVars(player_t *player) // so no need to worry about doing that ourselves. K_BotStartDrift(player); - player->botvars.drifttime++; - - // drift start is based on finishline distance since the drift waypoint was encountered - // once dist goes up and hits the threshold, start a drift - INT32 dist = player->botvars.driftdist - player->distancetofinish; - - // adjust for weight stat - //dist += (player->kartweight - 5) * 30; + tic_t limit, dtime = ++player->botvars.drifttime; // the faster we are going, the sooner we need to drift - fixed_t speedfactor = FixedDiv(player->speed, K_GetKartSpeed(player, true, true)); + fixed_t speedfactor = FixedDiv(player->speed, K_GetKartSpeed(player, false, false)); switch (player->botvars.driftstate) { case DRIFTSTATE_STARTING: - // if we take too long to start drifting, just give up - if (player->botvars.drifttime > 2*TICRATE/3) - { - K_BotSetDriftState(player, DRIFTSTATE_AUTO, BOTDRIFTLOCKOUT); - break; - } - - dist = FixedMul(dist, 3*speedfactor/2 - FRACUNIT/2); - - if (dist > FixedInt(cv_test3.value)) + limit = std::max(0, FixedInt(cv_test3.value) - FixedMul(TICRATE/5, speedfactor)); + if (dtime > limit) { K_BotSetDriftState(player, DRIFTSTATE_ACTIVE, 0); } break; case DRIFTSTATE_ENDING: - dist = FixedMul(dist, FRACUNIT/2 + speedfactor/2); - - if (dist > FixedInt(cv_test3.value)) + limit = std::max(0, FixedInt(cv_test3.value) - FixedMul(TICRATE/5, speedfactor)); + if (dtime > limit) { K_BotSetDriftState(player, DRIFTSTATE_AUTO, 0); player->botvars.driftending = TICRATE/2; diff --git a/src/k_hud.c b/src/k_hud.c index a483f9033..a82020237 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -4835,7 +4835,6 @@ static void K_DrawBotDebugger(void) 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)); - V_DrawThinString(24, 140, vflags, va("Drift dist: %d", stplyr->botvars.driftdist - stplyr->distancetofinish)); } void K_drawKartHUD(void) diff --git a/src/p_saveg.c b/src/p_saveg.c index 334cb17b6..5a739562b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -388,8 +388,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT32(save->p, players[i].botvars.drifttime); WRITEUINT32(save->p, players[i].botvars.driftlockout); WRITEUINT32(save->p, players[i].botvars.driftending); - WRITEUINT32(save->p, players[i].botvars.driftdist); - + WRITEFIXED(save->p, players[i].outrun); WRITEUINT8(save->p, players[i].outruntime); @@ -722,7 +721,6 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].botvars.drifttime = READUINT32(save->p); players[i].botvars.driftlockout = READUINT32(save->p); players[i].botvars.driftending = READUINT32(save->p); - players[i].botvars.driftdist = READUINT32(save->p); players[i].outrun = READFIXED(save->p); players[i].outruntime = READUINT8(save->p);