Trying to handle various different speeds...

This commit is contained in:
GenericHeroGuy 2025-05-27 17:05:09 +02:00
parent 553ce473b1
commit 7fbf5830a7
5 changed files with 24 additions and 39 deletions

View file

@ -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;

View file

@ -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

View file

@ -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<int>(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;

View file

@ -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)

View file

@ -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);