From 696e4050381de1223c21867549ab64af76f641e5 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 03:57:53 -0700 Subject: [PATCH] Lift the wheels of your jart a little when sliptiding --- src/k_kart.c | 6 ++++++ src/k_kart.h | 1 + src/p_user.c | 4 ---- src/r_patchrotation.c | 19 +++++++++++++++++-- src/tables.h | 6 ++++++ 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index fb899360a..237970120 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7539,6 +7539,12 @@ boolean K_PlayerEBrake(player_t *player) && player->powers[pw_nocontrol] == 0; } +SINT8 K_Sliptiding(player_t *player) +{ + const INT32 *p = player->kartstuff; + return p[k_drift] ? 0 : p[k_aizdriftstrat]; +} + static void K_KartSpindashDust(mobj_t *parent) { fixed_t rad = FixedDiv(FixedHypot(parent->radius, parent->radius), parent->scale); diff --git a/src/k_kart.h b/src/k_kart.h index da40df761..8a862ba71 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -96,6 +96,7 @@ UINT16 K_GetKartButtons(player_t *player); SINT8 K_GetForwardMove(player_t *player); fixed_t K_3dKartMovement(player_t *player); boolean K_PlayerEBrake(player_t *player); +SINT8 K_Sliptiding(player_t *player); void K_AdjustPlayerFriction(player_t *player); void K_MoveKartPlayer(player_t *player, boolean onground); void K_CheckSpectateStatus(void); diff --git a/src/p_user.c b/src/p_user.c index 8553d9279..39e0e0b67 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4252,10 +4252,6 @@ Quaketilt (player_t *player) fixed_t speed; boolean sliptiding = K_Sliptiding(player); - ( - player->kartstuff[k_aizdriftstrat] != 0 && - player->kartstuff[k_drift] == 0 - ); if (delta == (INT32)ANGLE_180)/* FUCK YOU HAVE A HACK */ { diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index 769e4c92b..f4165f3ff 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -14,6 +14,7 @@ #include "z_zone.h" #include "w_wad.h" #include "r_main.h" // R_PointToAngle +#include "k_kart.h" // K_Sliptiding #ifdef ROTSPRITE fixed_t rollcosang[ROTANGLES]; @@ -22,13 +23,27 @@ fixed_t rollsinang[ROTANGLES]; angle_t R_SpriteRotationAngle(mobj_t *mobj) { angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y); + angle_t angleDelta = (viewingAngle - mobj->angle); fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT); fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT); - angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + angle_t sliptideLift = mobj->player + ? K_Sliptiding(mobj->player) * ANGLE_11hh : 0; - return (rollOrPitch + mobj->rollangle); + angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + angle_t rollAngle = (rollOrPitch + mobj->rollangle); + + if (sliptideLift) + { + /* (from side) tilt downward if turning + toward camera, upward if away. */ + rollAngle += + FixedMul(sliptideLift, FINESINE(AbsAngle(angleDelta) >> ANGLETOFINESHIFT)) + + FixedMul(sliptideLift, FINECOSINE(angleDelta >> ANGLETOFINESHIFT)); + } + + return rollAngle; } INT32 R_GetRollAngle(angle_t rollangle) diff --git a/src/tables.h b/src/tables.h index a34b95ad2..e9ce14484 100644 --- a/src/tables.h +++ b/src/tables.h @@ -93,6 +93,12 @@ FUNCMATH FUNCINLINE static ATTRINLINE angle_t InvAngle(angle_t a) { return (ANGLE_MAX-a)+1; } + +// 315 = 45 +FUNCMATH FUNCINLINE static ATTRINLINE angle_t AbsAngle(angle_t a) +{ + return a & ANGLE_180 ? InvAngle(a) : a; +} // angle_t to fixed_t f(ANGLE_45) = 45*FRACUNIT FUNCMATH fixed_t AngleFixed(angle_t af); // fixed_t to angle_t f(45*FRACUNIT) = ANGLE_45