diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 99618fa4a..2b778c993 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -533,7 +533,8 @@ consvar_t cv_kartusepwrlv = CVAR_INIT ("kartusepwrlv", "Yes", CV_NETVAR, CV_YesN consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR, CV_YesNo, KartPurpleDrift_OnChange); -consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "Yes", CV_NETVAR, CV_YesNo, NULL); +static CV_PossibleValue_t bumpspark_cons_t[] = {{0, "Off"}, {1, "Remove Charge Only"}, {2, "On"}, {0, NULL}}; +consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "Remove Charge Only", CV_NETVAR, bumpspark_cons_t, NULL); consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "Yes", CV_NETVAR, CV_YesNo, NULL); diff --git a/src/k_kart.c b/src/k_kart.c index dc559951b..f320af8ec 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6643,6 +6643,12 @@ void K_AwardScaledPlayerRings(player_t *player, SINT8 mode) K_AwardPlayerRings(player, awardamount, (mode == ASR_SUPERRING) ? true : false); } +// Returns the bumpspark value as an enum. +INT32 K_GetBumpSpark(void) +{ + return max(BUMPSPARK_NONE, min(BUMPSPARK_ALL, (bumpsparktype_t)cv_kartbumpspark.value)); +} + /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c \param player player object passed from P_PlayerThink diff --git a/src/k_kart.h b/src/k_kart.h index 3e9320fd2..d4701fac9 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -346,6 +346,15 @@ void K_AwardScaledPlayerRings(player_t *player, SINT8 mode); void K_QuiteSaltyHop(player_t *player); +typedef enum +{ + BUMPSPARK_NONE = 0, + BUMPSPARK_NOCHARGE, + BUMPSPARK_ALL +} bumpsparktype_t; + +INT32 K_GetBumpSpark(void); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_map.c b/src/p_map.c index 22f893c0f..b09e7269d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3479,9 +3479,22 @@ static void P_BouncePlayerMove(mobj_t *mo, TryMoveResult_t *result) mmomx = mo->player->rmomx; mmomy = mo->player->rmomy; - if ((!cv_kartbumpspark.value && modeattacking == ATTACKING_NONE) || (modeattacking != ATTACKING_NONE && G_CompatLevel(0x0009))) + UINT32 bumpspark = + max((modeattacking != ATTACKING_NONE) ? BUMPSPARK_NOCHARGE : BUMPSPARK_NONE, + K_GetBumpSpark()); + + if ((bumpspark < BUMPSPARK_ALL) || + (modeattacking != ATTACKING_NONE && G_CompatLevel(0x0009))) { - mo->player->drift = 0; + if (!bumpspark) + { + // Bumps removing spark would be less frustrating if you didn't get your drift + // removed too. Losing sparks is a fair punishment, drifting RIGHT for + // daring to scrape a wall for a wide LEFT turn is horrendous and leads to + // awful gluewalling. + // TL;DR: I hate wrongdrifts and hopefully this is an okay middle ground. + mo->player->drift = 0; + } mo->player->driftcharge = 0; }