From fdb13b76d1c33ce77f37d35b617524eb0b4a2610 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Thu, 28 May 2020 16:46:21 -0400 Subject: [PATCH] Make K_BotTopSpeedRubberband a function --- src/k_bot.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/k_bot.h | 22 +++++++++++++++++++--- src/k_kart.c | 44 +------------------------------------------ src/p_user.c | 9 +++++++-- 4 files changed, 80 insertions(+), 48 deletions(-) diff --git a/src/k_bot.c b/src/k_bot.c index 7bf8a22e7..8fed8dc4f 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -394,6 +394,59 @@ fixed_t K_BotRubberband(player_t *player) return rubberband; } +/*-------------------------------------------------- + fixed_t K_BotTopSpeedRubberband(player_t *player) + + See header file for description. +--------------------------------------------------*/ +fixed_t K_BotTopSpeedRubberband(player_t *player) +{ + fixed_t rubberband = K_BotRubberband(player); + + if (rubberband < FRACUNIT) + { + // Never go below your regular top speed + rubberband = FRACUNIT; + } + + // Only allow you to go faster than your regular top speed if you're facing the right direction + if (rubberband > FRACUNIT && player->mo != NULL && player->nextwaypoint != NULL) + { + const INT16 mindiff = 30; + const INT16 maxdiff = 60; + INT16 anglediff = 0; + fixed_t amt = rubberband - FRACUNIT; + angle_t destangle = R_PointToAngle2( + player->mo->x, player->mo->y, + player->nextwaypoint->mobj->x, player->nextwaypoint->mobj->y + ); + angle_t angle = player->mo->angle - destangle; + + if (angle < ANGLE_180) + { + anglediff = AngleFixed(angle) >> FRACBITS; + } + else + { + anglediff = 360 - (AngleFixed(angle) >> FRACBITS); + } + + anglediff = abs(anglediff); + + if (anglediff >= maxdiff) + { + rubberband = FRACUNIT; + } + else if (anglediff > mindiff) + { + amt = (amt * (maxdiff - anglediff)) / mindiff; + rubberband = FRACUNIT + amt; + } + } + + return rubberband; +} + /*-------------------------------------------------- fixed_t K_DistanceOfLineFromPoint(fixed_t v1x, fixed_t v1y, fixed_t v2x, fixed_t v2y, fixed_t cx, fixed_t cy) diff --git a/src/k_bot.h b/src/k_bot.h index 48756e2c8..48472b5fd 100644 --- a/src/k_bot.h +++ b/src/k_bot.h @@ -66,19 +66,35 @@ boolean K_BotCanTakeCut(player_t *player); /*-------------------------------------------------- fixed_t K_BotRubberband(player_t *player); - Gives a multiplier for a bot's rubberbanding. Meant to be used for top speed, - acceleration, and handling. + Gives a multiplier for a bot's rubberbanding. + Meant to be used for acceleration and handling. Input Arguments:- player - Player to check. Return:- - A multiplier in fixed point scale, between 0.875 and 2.0. + A multiplier in fixed point scale. --------------------------------------------------*/ fixed_t K_BotRubberband(player_t *player); +/*-------------------------------------------------- + fixed_t K_BotTopSpeedRubberband(player_t *player); + + Gives a multiplier for a bot's rubberbanding. + Adjusted from K_BotRubberband to be used for top speed. + + Input Arguments:- + player - Player to check. + + Return:- + A multiplier in fixed point scale. +--------------------------------------------------*/ + +fixed_t K_BotTopSpeedRubberband(player_t *player); + + /*-------------------------------------------------- fixed_t K_DistanceOfLineFromPoint(fixed_t v1x, fixed_t v1y, fixed_t v2x, fixed_t v2y, fixed_t cx, fixed_t cy); diff --git a/src/k_kart.c b/src/k_kart.c index 94d5aba0f..e00013128 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2357,49 +2357,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) { if (K_PlayerUsesBotMovement(player)) { - fixed_t rubberband = K_BotRubberband(player); - - if (rubberband < FRACUNIT) - { - rubberband = FRACUNIT; - } - - // Only allow you to go fast if you're facing the right direction - if (rubberband > FRACUNIT && player->mo != NULL && player->nextwaypoint != NULL) - { - const INT16 mindiff = 30; - const INT16 maxdiff = 60; - INT16 anglediff = 0; - fixed_t amt = rubberband - FRACUNIT; - angle_t destangle = R_PointToAngle2( - player->mo->x, player->mo->y, - player->nextwaypoint->mobj->x, player->nextwaypoint->mobj->y - ); - angle_t angle = player->mo->angle - destangle; - - if (angle < ANGLE_180) - { - anglediff = AngleFixed(angle) >> FRACBITS; - } - else - { - anglediff = 360 - (AngleFixed(angle) >> FRACBITS); - } - - anglediff = abs(anglediff); - - if (anglediff >= maxdiff) - { - rubberband = FRACUNIT; - } - else if (anglediff > mindiff) - { - amt = (amt * (maxdiff - anglediff)) / mindiff; - rubberband = FRACUNIT + amt; - } - } - - finalspeed = FixedMul(finalspeed, rubberband); + finalspeed = FixedMul(finalspeed, K_BotTopSpeedRubberband(player)); } return FixedMul(finalspeed, player->kartstuff[k_boostpower]+player->kartstuff[k_speedboost]); diff --git a/src/p_user.c b/src/p_user.c index f91e8dc25..28273ca82 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4170,11 +4170,16 @@ static void P_3dMovement(player_t *player) if (K_PlayerUsesBotMovement(player)) { - fixed_t rubberband = K_BotRubberband(player); + fixed_t baserubberband = K_BotRubberband(player); + fixed_t rubberband = FixedMul(baserubberband, + FixedMul(baserubberband, + FixedMul(baserubberband, + baserubberband + ))); // This looks extremely goofy, but we need this really high, but at the same time, proportional. if (rubberband > FRACUNIT) { - div = FixedMul(div, 4*rubberband); + div = FixedMul(div, rubberband); } }