Rebalance bot rubberbanding, take 2

This commit is contained in:
Sal 2023-12-25 06:22:43 +00:00 committed by Sally Coolatta
parent de59fedc56
commit 075691fa85
2 changed files with 30 additions and 17 deletions

View file

@ -495,11 +495,11 @@ const botcontroller_t *K_GetBotController(const mobj_t *mobj)
fixed_t K_BotMapModifier(void) fixed_t K_BotMapModifier(void)
{ {
constexpr INT32 complexity_scale = 10000; constexpr INT32 complexity_scale = 10000;
constexpr INT32 modifier_max = FRACUNIT * 2; constexpr fixed_t modifier_max = FRACUNIT * 2;
const fixed_t complexity_value = std::clamp<fixed_t>( const fixed_t complexity_value = std::clamp<fixed_t>(
FixedDiv(K_GetTrackComplexity(), complexity_scale), FixedDiv(K_GetTrackComplexity(), complexity_scale),
-modifier_max, -FixedDiv(FRACUNIT, modifier_max),
modifier_max modifier_max
); );
@ -566,22 +566,34 @@ static UINT32 K_BotRubberbandDistance(const player_t *player)
--------------------------------------------------*/ --------------------------------------------------*/
fixed_t K_BotRubberband(const player_t *player) fixed_t K_BotRubberband(const player_t *player)
{ {
constexpr fixed_t rubberdeltabase = FRACUNIT / 4; // +/- x0.25 const fixed_t difficultyEase = ((player->botvars.difficulty - 1) * FRACUNIT) / (MAXBOTDIFFICULTY - 1);
// Lv. 1: x0.50 avg // Lv. 1: x0.65 avg
// Lv. 9: x1.50 avg // Lv. MAX: x1.1 avg
const fixed_t difficultyEase = ((player->botvars.difficulty - 1) * FRACUNIT) / (DIFFICULTBOT - 1); const fixed_t rubberBase = Easing_OutSine(
const fixed_t rubberavg = Easing_Linear(difficultyEase, FRACUNIT / 2, FRACUNIT * 3 / 2); difficultyEase,
FRACUNIT * 65 / 100,
FRACUNIT * 11 / 10
);
// Lv. 1: x0.35 min // +/- x0.25
// Lv. 9: x1.35 min const fixed_t rubberStretchiness = FixedMul(
const fixed_t rubberdeltamin = FixedMul(rubberdeltabase, K_BotMapModifier()); FixedDiv(
const fixed_t rubbermin = std::max<fixed_t>(rubberavg - rubberdeltamin, FRACUNIT/3); FRACUNIT / 4,
K_GetKartGameSpeedScalar(gamespeed)
),
K_BotMapModifier()
);
// Lv. 1: x0.65 max // Lv. 1: x0.4 min
// Lv. 9: x1.65 max // Lv. MAX: x0.85 min
const fixed_t rubberdeltamax = FixedMul(rubberdeltabase, K_BotMapModifier()); constexpr fixed_t rubberSlowMin = FRACUNIT / 2;
const fixed_t rubbermax = std::min<fixed_t>(rubberavg - rubberdeltamax, FRACUNIT*3); const fixed_t rubberSlow = std::max<fixed_t>( rubberBase - rubberStretchiness, rubberSlowMin );
// Lv. 1: x0.9 max
// Lv. MAX: x1.35 max
constexpr fixed_t rubberFastMax = FRACUNIT * 3 / 2;
const fixed_t rubberFast = std::min<fixed_t>( rubberBase + rubberStretchiness, rubberFastMax );
fixed_t rubberband = FRACUNIT >> 1; fixed_t rubberband = FRACUNIT >> 1;
player_t *firstplace = nullptr; player_t *firstplace = nullptr;
@ -628,7 +640,7 @@ fixed_t K_BotRubberband(const player_t *player)
if (firstplace != nullptr) if (firstplace != nullptr)
{ {
const fixed_t spacing = FixedDiv(2560 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed)) / FRACUNIT; const UINT32 spacing = FixedDiv(10240 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed)) / FRACUNIT;
const UINT32 wanteddist = firstplace->distancetofinish + K_BotRubberbandDistance(player); const UINT32 wanteddist = firstplace->distancetofinish + K_BotRubberbandDistance(player);
const INT32 distdiff = player->distancetofinish - wanteddist; const INT32 distdiff = player->distancetofinish - wanteddist;
@ -644,7 +656,7 @@ fixed_t K_BotRubberband(const player_t *player)
} }
} }
return Easing_Linear(rubberband, rubbermin, rubbermax); return Easing_Linear(rubberband, rubberSlow, rubberFast);
} }
/*-------------------------------------------------- /*--------------------------------------------------

View file

@ -604,6 +604,7 @@ void K_IncreaseBotDifficulty(player_t *bot)
disruptDelta = abs(statusQuo - bot->position); disruptDelta = abs(statusQuo - bot->position);
increase = (beatenDelta + winnerDelta + disruptDelta - 2) / 3; increase = (beatenDelta + winnerDelta + disruptDelta - 2) / 3;
increase++; // At least +1 level up.
if (increase <= 0) if (increase <= 0)
{ {
// No increase... // No increase...