diff --git a/src/d_player.h b/src/d_player.h index 16325844f..fce7c6db8 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -608,6 +608,10 @@ struct player_t INT32 drift_wannaturn; // Turn values the game uses to determine the direction you want to drift. + INT32 nulldrift; // When you drift without accelerating, this value ticks up/down depending on your drift's angle. + INT32 nulldrifttilt; // Sliptide-like kart tilting! (Can be toggled off) + tic_t nulldrifttime; + // (Delay-drift) - Delay in tics before the final drift angle is determined. // Potentially influenced by player lag. tic_t driftdelay; diff --git a/src/k_kart.c b/src/k_kart.c index 3857d1dd6..49c59e88c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9688,6 +9688,30 @@ static void K_KartDrift(player_t *player, boolean onground) } } + if (player->nulldrift) + { + if (abs(player->nulldrifttilt) < ANGLE_11hh) + { + player->nulldrifttilt = (abs(player->nulldrifttilt) + (ANGLE_11hh / 8)) * player->nulldrift; + } + + // Increment nulldrift timer. + player->nulldrifttime++; + + // Let's have some faith that the driftspark thinker will set this value again + player->nulldrift = 0; + } + else + { + player->nulldrifttime = 0; + player->nulldrifttilt -= player->nulldrifttilt / 4; + + if (abs(player->nulldrifttilt) < (ANGLE_11hh / 4)) + { + player->nulldrifttilt = 0; + } + } + if (!K_Sliptiding(player)) { player->aizdrifttilt -= player->aizdrifttilt / 4; @@ -11976,4 +12000,10 @@ boolean K_CheckWaterskipLockout(player_t *player) } } +// Check to render the tilt VFX for null-drifts. +boolean K_NullDriftTiltEnalbed() +{ + return ((cv_nulldriftefx.value) && (cv_nulldrifttilt.value)); +} + //} diff --git a/src/k_kart.h b/src/k_kart.h index 72e8d9998..c0a829122 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -427,6 +427,8 @@ typedef enum AIRDROP_FUSION, } airdroptype_t; +boolean K_NullDriftTiltEnalbed(); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_mobj.c b/src/p_mobj.c index 5ff73ad15..d84b09d9c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9052,10 +9052,14 @@ static boolean P_MobjRegularThink(mobj_t *mobj) P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; case MT_BRAKEDRIFT: + + // Letting go of accel functions about the same as brake-drifting + boolean nullDrift = (!(K_GetKartButtons(mobj->target->player) & BT_ACCELERATE)); + if ((!mobj->target || !mobj->target->health || !mobj->target->player || !P_IsObjectOnGround(mobj->target)) || !mobj->target->player->drift || !(mobj->target->player->pflags & PF_BRAKEDRIFT) || !((mobj->target->player->cmd.buttons & BT_BRAKE) - || !(K_GetKartButtons(mobj->target->player) & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting + || nullDrift)) { P_RemoveMobj(mobj); return false; @@ -9080,8 +9084,27 @@ static boolean P_MobjRegularThink(mobj_t *mobj) else mobj->color = SKINCOLOR_SILVER; - if (!S_SoundPlaying(mobj, sfx_cdfm17)) - S_StartSound(mobj, sfx_cdfm17); + if (nullDrift) + { + if (cv_nulldriftefx.value) + { + // Play a harsher sound when you null-drift. + if (mobj->target->player->nulldrifttime % 4 == 0) + S_StartSound(mobj, sfx_s3k67); + } + else if (!S_SoundPlaying(mobj, sfx_cdfm17)) + { + S_StartSound(mobj, sfx_cdfm17); + } + + // Set the player's nulldrift variables for any relevant VFX. + mobj->target->player->nulldrift = intsign(mobj->target->player->drift); + } + else + { + if (!S_SoundPlaying(mobj, sfx_cdfm17)) + S_StartSound(mobj, sfx_cdfm17); + } K_MatchGenericExtraFlags(mobj, mobj->target); if (leveltime & 1) diff --git a/src/p_saveg.c b/src/p_saveg.c index 9acfa53e0..828502779 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -638,6 +638,9 @@ static void P_NetSyncPlayers(savebuffer_t *save) SYNC(players[i].driftcharge); SYNC(players[i].driftboost); SYNC(players[i].airdriftspeed); + SYNC(players[i].nulldrift); + SYNC(players[i].nulldrifttilt); + SYNC(players[i].nulldrifttime); SYNC(players[i].recoverydashcharge); SYNC(players[i].recoverydash); diff --git a/src/r_main.cpp b/src/r_main.cpp index a4c4f31e6..e813d0e10 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -194,6 +194,8 @@ consvar_t cv_renderstats = CVAR_INIT ("renderstats", "Off", 0, CV_OnOff, NULL); consvar_t cv_sloperoll = CVAR_INIT ("spritesloperoll", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_sliptidetilt = CVAR_INIT ("sliptidetilt", "On", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_nulldriftefx = CVAR_INIT ("nulldriftefx", "On", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_nulldrifttilt = CVAR_INIT ("nulldrifttilt", "On", CV_SAVE, CV_OnOff, NULL); void SplitScreen_OnChange(void) { @@ -1804,6 +1806,8 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_actionmovie); CV_RegisterVar(&cv_sloperoll); CV_RegisterVar(&cv_sliptidetilt); + CV_RegisterVar(&cv_nulldriftefx); + CV_RegisterVar(&cv_nulldrifttilt); CV_RegisterVar(&cv_showhud); CV_RegisterVar(&cv_translucenthud); diff --git a/src/r_main.h b/src/r_main.h index 4c4fa8eb4..57889b115 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -159,6 +159,7 @@ extern consvar_t cv_secbright; extern consvar_t cv_sloperoll; extern consvar_t cv_sliptidetilt; +extern consvar_t cv_nulldriftefx, cv_nulldrifttilt; // debugging diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index 022613223..9d3c179e3 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -61,11 +61,18 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer) angle_t viewingAngle = R_PointToAnglePlayer(viewPlayer, player->mo->x, player->mo->y); angle_t angleDelta = (viewingAngle - player->mo->angle); - angle_t sliptideLift = player->aizdrifttilt; + INT32 nulltilt = (K_NullDriftTiltEnalbed()) ? player->nulldrifttilt : 0; + INT32 aiztilt = (cv_sliptidetilt.value) ? player->aizdrifttilt : 0; + + boolean nullBeforeSlip = (abs(aiztilt) < abs(nulltilt)); + INT32 liftsign = ((nullBeforeSlip) ? intsign(nulltilt) : intsign(aiztilt)); + + // Sliptide tilt: Nulldrifts take priority if and ONLY if they're the larger value compared to sliptides. + angle_t sliptideLift = max(abs(aiztilt), abs(nulltilt)) * liftsign; angle_t rollAngle = 0; - if (sliptideLift && cv_sliptidetilt.value) + if (sliptideLift) { /* (from side) tilt downward if turning toward camera, upward if away. */