From 1eca138b2179609c7f5039fcd9f5a98cbce02680 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 02:43:26 -0700 Subject: [PATCH 01/15] Revert "Rumble rumble" This reverts commit c82ac33c0c4fed8e597ac6854ada2e154fa8c11e. --- src/doomstat.h | 1 - src/p_tick.c | 9 +-------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/doomstat.h b/src/doomstat.h index 522108913..159f83172 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -301,7 +301,6 @@ extern struct quake { // camera offsets and duration fixed_t x,y,z; - angle_t roll; UINT16 time; // location, radius, and intensity... diff --git a/src/p_tick.c b/src/p_tick.c index ca02b1513..b79a1fa29 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -657,17 +657,10 @@ void P_Ticker(boolean run) quake.z = M_RandomRange(-ir,ir); if (cv_windowquake.value) I_CursedWindowMovement(FixedInt(quake.x), FixedInt(quake.y)); - ir >>= 2; - ir = M_RandomRange(-ir,ir); - if (ir < 0) - ir = ANGLE_MAX - FixedAngle(-ir); - else - ir = FixedAngle(ir); - quake.roll = ir; --quake.time; } else - quake.x = quake.y = quake.z = quake.roll = 0; + quake.x = quake.y = quake.z = 0; if (metalplayback) G_ReadMetalTic(metalplayback); From c74e02d9dc2cdb673e9a0bbc5be1b7cb7af734d4 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 02:42:39 -0700 Subject: [PATCH 02/15] Tweak camera tilting - Grow divisor with delta. Reduce divisor base from 32 to 17. This makes small changes in tilt snappier, while larger ones ease in. - Added tilting during quakes is subtler. --- src/p_user.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 09b8865fd..8553d9279 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4251,7 +4251,7 @@ Quaketilt (player_t *player) INT32 delta = (INT32)( player->mo->angle - moma ); fixed_t speed; - boolean sliptiding = + boolean sliptiding = K_Sliptiding(player); ( player->kartstuff[k_aizdriftstrat] != 0 && player->kartstuff[k_drift] == 0 @@ -4293,12 +4293,18 @@ Quaketilt (player_t *player) return moma; } +static inline int intsign(int n) { + return n < 0 ? -1 : n > 0 ? 1 : 0; +} + static void DoABarrelRoll (player_t *player) { angle_t slope; angle_t delta; + fixed_t smoothing; + if (player->exiting) { return; @@ -4325,7 +4331,9 @@ DoABarrelRoll (player_t *player) slope -= Quaketilt(player); - delta = (INT32)( slope - player->tilt )/ 32; + delta = slope - player->tilt; + smoothing = FixedDiv(abs((INT32)delta), ANG15); + delta = FixedDiv(delta, 17 * (FRACUNIT + smoothing)); if (delta) player->tilt += delta; @@ -4338,7 +4346,10 @@ DoABarrelRoll (player_t *player) if (cv_actionmovie.value) { - player->viewrollangle += quake.roll; + int xs = intsign(quake.x), + ys = intsign(quake.y), + zs = intsign(quake.z); + player->viewrollangle += (xs ^ ys ^ zs) * ANG1; } } else From 696e4050381de1223c21867549ab64af76f641e5 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 03:57:53 -0700 Subject: [PATCH 03/15] 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 From f313eece7ee706e953c61effcb65955f3acae9dd Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 15:04:24 -0700 Subject: [PATCH 04/15] Use pitch/roll for camera tilting --- src/p_user.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 39e0e0b67..9cd908cb0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4306,21 +4306,9 @@ DoABarrelRoll (player_t *player) return; } - if (player->mo->standingslope) - { - slope = player->mo->standingslope->zangle; - } - else - { - slope = 0; - } + slope = InvAngle(R_SpriteRotationAngle(player->mo)); - if (abs((INT32)slope) > ANGLE_11hh) - { - delta = ( player->mo->angle - player->mo->standingslope->xydirection ); - slope = -(FixedMul(FINESINE (delta>>ANGLETOFINESHIFT), slope)); - } - else + if (AbsAngle(slope) < ANGLE_11hh) { slope = 0; } From bdc4b50de20c6bf5f4243e4cc1798df7f8ef6210 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 15:28:13 -0700 Subject: [PATCH 05/15] Let viewrollangle be independent of camera tilting --- src/d_player.h | 2 ++ src/hardware/hw_main.c | 41 +++++++++++++++++------------------------ src/p_user.c | 21 --------------------- src/r_main.c | 26 +++++++++++++++++++++++++- src/r_main.h | 1 + 5 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 19a998f74..eec20695c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -499,6 +499,8 @@ typedef struct player_s fixed_t bob; angle_t viewrollangle; + // camera tilt + // TODO: expose to lua angle_t tilt; angle_t angleturn; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b797a19c4..7235511a3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -64,6 +64,7 @@ static void HWR_ProjectSprite(mobj_t *thing); #ifdef HWPRECIP static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing); #endif +static void HWR_RollTransform(FTransform *tr, angle_t roll); void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap); void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, @@ -5743,14 +5744,8 @@ static void HWR_DrawSkyBackground(player_t *player) dometransform.scalez = 1; dometransform.fovxangle = fpov; // Tails dometransform.fovyangle = fpov; // Tails - if (player->viewrollangle != 0) - { - fixed_t rol = AngleFixed(player->viewrollangle); - dometransform.rollangle = FIXED_TO_FLOAT(rol); - dometransform.roll = true; - dometransform.rollx = 1.0f; - dometransform.rollz = 0.0f; - } + HWR_RollTransform(&dometransform, + R_ViewRollAngle(player)); dometransform.splitscreen = r_splitscreen; HWR_GetTexture(texturetranslation[skytexture]); @@ -6042,14 +6037,7 @@ void HWR_RenderSkyboxView(player_t *player) atransform.fovxangle = fpov; // Tails atransform.fovyangle = fpov; // Tails - if (player->viewrollangle != 0) - { - fixed_t rol = AngleFixed(player->viewrollangle); - atransform.rollangle = FIXED_TO_FLOAT(rol); - atransform.roll = true; - atransform.rollx = 1.0f; - atransform.rollz = 0.0f; - } + HWR_RollTransform(&atransform, R_ViewRollAngle(player)); atransform.splitscreen = r_splitscreen; gl_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l))); @@ -6160,6 +6148,18 @@ void HWR_RenderSkyboxView(player_t *player) // ========================================================================== // // ========================================================================== + +static void HWR_RollTransform(FTransform *tr, angle_t roll) +{ + if (roll != 0) + { + tr->rollangle = roll / (float)ANG1; + tr->roll = true; + tr->rollx = 1.0f; + tr->rollz = 0.0f; + } +} + void HWR_RenderPlayerView(void) { player_t * player = &players[displayplayers[viewssnum]]; @@ -6249,14 +6249,7 @@ void HWR_RenderPlayerView(void) atransform.fovxangle = fpov; // Tails atransform.fovyangle = fpov; // Tails - if (player->viewrollangle != 0) - { - fixed_t rol = AngleFixed(player->viewrollangle); - atransform.rollangle = FIXED_TO_FLOAT(rol); - atransform.roll = true; - atransform.rollx = 1.0f; - atransform.rollz = 0.0f; - } + HWR_RollTransform(&atransform, R_ViewRollAngle(player)); atransform.splitscreen = r_splitscreen; gl_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l))); diff --git a/src/p_user.c b/src/p_user.c index 9cd908cb0..9e28099b4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4289,10 +4289,6 @@ Quaketilt (player_t *player) return moma; } -static inline int intsign(int n) { - return n < 0 ? -1 : n > 0 ? 1 : 0; -} - static void DoABarrelRoll (player_t *player) { @@ -4323,23 +4319,6 @@ DoABarrelRoll (player_t *player) player->tilt += delta; else player->tilt = slope; - - if (cv_tilting.value) - { - player->viewrollangle = player->tilt; - - if (cv_actionmovie.value) - { - int xs = intsign(quake.x), - ys = intsign(quake.y), - zs = intsign(quake.z); - player->viewrollangle += (xs ^ ys ^ zs) * ANG1; - } - } - else - { - player->viewrollangle = 0; - } } // diff --git a/src/r_main.c b/src/r_main.c index d895c4e10..d8b93144d 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -629,7 +629,7 @@ void R_CheckViewMorph(int s) float fisheyemap[MAXVIDWIDTH/2 + 1]; #endif - angle_t rollangle = players[displayplayers[s]].viewrollangle; + angle_t rollangle = R_ViewRollAngle(&players[displayplayers[s]]); #ifdef WOUGHMP_WOUGHMP fixed_t fisheye = cv_cam2_turnmultiplier.value; // temporary test value #endif @@ -936,6 +936,30 @@ void R_ApplyViewMorph(int s) width*vid.bpp, height, width*vid.bpp, vid.width); } +static inline int intsign(int n) { + return n < 0 ? -1 : n > 0 ? 1 : 0; +} + +angle_t R_ViewRollAngle(const player_t *player) +{ + angle_t roll = player->viewrollangle; + + if (cv_tilting.value) + { + roll += player->tilt; + + if (cv_actionmovie.value) + { + int xs = intsign(quake.x), + ys = intsign(quake.y), + zs = intsign(quake.z); + roll += (xs ^ ys ^ zs) * ANG1; + } + } + + return roll; +} + // // R_SetViewSize diff --git a/src/r_main.h b/src/r_main.h index d58773a73..49e028149 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -115,6 +115,7 @@ void R_Init(void); void R_CheckViewMorph(int split); void R_ApplyViewMorph(int split); +angle_t R_ViewRollAngle(const player_t *player); // just sets setsizeneeded true extern boolean setsizeneeded; From f1a2a0a20df949da6b344798e70819dd353637a4 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 15:33:55 -0700 Subject: [PATCH 06/15] Tilt 90 degrees off half pipe --- src/p_local.h | 1 + src/p_mobj.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/p_local.h b/src/p_local.h index a04f1f197..7c71c7ebf 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -523,6 +523,7 @@ void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move); void P_ExplodeMissile(mobj_t *mo); void P_CheckGravity(mobj_t *mo, boolean affect); void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope); +void P_SetPitchRoll(mobj_t *mo, angle_t pitch, angle_t yaw); fixed_t P_ScaleFromMap(fixed_t n, fixed_t scale); fixed_t P_GetMobjHead(const mobj_t *); fixed_t P_GetMobjFeet(const mobj_t *); diff --git a/src/p_mobj.c b/src/p_mobj.c index fff2a78f1..d912d61cf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1250,6 +1250,17 @@ void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope) } } +// +// P_SetPitchRoll +// +void P_SetPitchRoll(mobj_t *mo, angle_t pitch, angle_t yaw) +{ + pitch = InvAngle(pitch); + yaw >>= ANGLETOFINESHIFT; + mo->roll = FixedMul(pitch, FINESINE (yaw)); + mo->pitch = FixedMul(pitch, FINECOSINE (yaw)); +} + #define STOPSPEED (FRACUNIT) // @@ -1662,6 +1673,8 @@ void P_XYMovement(mobj_t *mo) { mo->momz = transfermomz; mo->standingslope = NULL; + P_SetPitchRoll(mo, ANGLE_90, + transferslope->xydirection); if (player) { player->powers[pw_justlaunched] = 2; From 0642e2206e51cc6f9534fc6450fdf25635cd0ce3 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 16:16:08 -0700 Subject: [PATCH 07/15] Rotate sprite correctly in reverse gravity --- src/hardware/hw_main.c | 3 ++- src/r_things.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 7235511a3..2c2f21406 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5206,7 +5206,8 @@ static void HWR_ProjectSprite(mobj_t *thing) if (spriterotangle != 0 && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) { - rollangle = R_GetRollAngle(spriterotangle); + rollangle = R_GetRollAngle(vflip + ? InvAngle(spriterotangle) : spriterotangle); rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); if (rotsprite != NULL) diff --git a/src/r_things.c b/src/r_things.c index 4713fd61b..bb848a679 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1581,7 +1581,8 @@ static void R_ProjectSprite(mobj_t *thing) if (spriterotangle && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) { - rollangle = R_GetRollAngle(spriterotangle); + rollangle = R_GetRollAngle(vflip + ? InvAngle(spriterotangle) : spriterotangle); rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); if (rotsprite != NULL) From 46ba47785dd1949718c0b98199cf8a71bc9c3678 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 17:52:03 -0700 Subject: [PATCH 08/15] Ease camera tilting quickly toward a steep angle, slowly toward a shallow angle --- src/p_user.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 9e28099b4..3a8b95e89 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4312,8 +4312,9 @@ DoABarrelRoll (player_t *player) slope -= Quaketilt(player); delta = slope - player->tilt; - smoothing = FixedDiv(abs((INT32)delta), ANG15); - delta = FixedDiv(delta, 17 * (FRACUNIT + smoothing)); + smoothing = FixedDiv(AbsAngle(slope), ANGLE_45); + delta = FixedDiv(delta, 33 * FixedDiv(FRACUNIT, + FRACUNIT + smoothing)); if (delta) player->tilt += delta; From 1fc942e47a5038cdc0b26ae380a22389617f19f2 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 18:17:04 -0700 Subject: [PATCH 09/15] Fix tilting on backward slopes --- src/p_mobj.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index d912d61cf..49165162d 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1674,7 +1674,9 @@ void P_XYMovement(mobj_t *mo) mo->momz = transfermomz; mo->standingslope = NULL; P_SetPitchRoll(mo, ANGLE_90, - transferslope->xydirection); + transferslope->xydirection + + (transferslope->zangle + & ANGLE_180)); if (player) { player->powers[pw_justlaunched] = 2; From 0818be1b8a5e553ad3ace06ecf9959b6b61d02d5 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 19:16:48 -0700 Subject: [PATCH 10/15] Tilt camera less quickly with more air time --- src/p_user.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 3a8b95e89..058e26bd4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4313,8 +4313,10 @@ DoABarrelRoll (player_t *player) delta = slope - player->tilt; smoothing = FixedDiv(AbsAngle(slope), ANGLE_45); - delta = FixedDiv(delta, 33 * FixedDiv(FRACUNIT, - FRACUNIT + smoothing)); + + delta = + FixedDiv(delta, (33 + min(4, player->airtime) * 22) + * FixedDiv(FRACUNIT, FRACUNIT + smoothing)); if (delta) player->tilt += delta; From 9dcce02e5e989f1e141486e0dc15af170bbb4923 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 20:43:31 -0700 Subject: [PATCH 11/15] Don't add tumble/sliptide rollangle to camera tilt --- src/p_user.c | 2 +- src/r_patch.h | 1 + src/r_patchrotation.c | 17 +++++++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 058e26bd4..b3a85e6fc 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4302,7 +4302,7 @@ DoABarrelRoll (player_t *player) return; } - slope = InvAngle(R_SpriteRotationAngle(player->mo)); + slope = InvAngle(R_GetPitchRollAngle(player->mo)); if (AbsAngle(slope) < ANGLE_11hh) { diff --git a/src/r_patch.h b/src/r_patch.h index c04a3b275..c6d222617 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -39,6 +39,7 @@ patch_t *Patch_GetRotatedSprite( boolean flip, boolean adjustfeet, void *info, INT32 rotationangle); INT32 R_GetRollAngle(angle_t rollangle); +angle_t R_GetPitchRollAngle(mobj_t *mobj); angle_t R_SpriteRotationAngle(mobj_t *mobj); #endif diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index f4165f3ff..9f8c9b415 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -20,18 +20,27 @@ fixed_t rollcosang[ROTANGLES]; fixed_t rollsinang[ROTANGLES]; +angle_t R_GetPitchRollAngle(mobj_t *mobj) +{ + angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y); + + fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT); + fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT); + + angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + + return rollOrPitch; +} + 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 sliptideLift = mobj->player ? K_Sliptiding(mobj->player) * ANGLE_11hh : 0; - angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + angle_t rollOrPitch = R_GetPitchRollAngle(mobj); angle_t rollAngle = (rollOrPitch + mobj->rollangle); if (sliptideLift) From 5660cac3ad5bd4ae4fa69e4656d79cb184153db3 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 20:45:47 -0700 Subject: [PATCH 12/15] Stronger tilt on sliptiding + turn to face the camera Oni's Sick Nasty --- src/d_player.h | 2 ++ src/k_kart.c | 36 ++++++++++++++++++++++++++++++++++++ src/p_user.c | 6 +++++- src/r_patchrotation.c | 2 +- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index eec20695c..b75a6f51f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -529,6 +529,8 @@ typedef struct player_s tic_t airtime; // Keep track of how long you've been in the air boolean driftInput; // Whenever or not try drifting. boolean airFailsafe; // Whenever or not try the air boost + INT32 aizDriftTilt; + INT32 aizDriftTurn; UINT8 trickpanel; // Trick panel state boolean trickdelay; // Prevent tricks until control stick is neutral diff --git a/src/k_kart.c b/src/k_kart.c index 237970120..38d2eb162 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1920,6 +1920,15 @@ void K_KartMoveAnimation(player_t *player) turndir = 1; } + // Use drift frames when sliptiding + if (player->aizDriftTurn) + { + drift = (player->kartstuff[k_aizdriftstrat]); + + if (drift) + turndir = 0; + } + if (lookback == true && drift == 0) { // Prioritize looking back frames over turning @@ -7351,8 +7360,35 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_aizdriftstrat] = ((player->kartstuff[k_drift] > 0) ? 1 : -1); } else if (player->kartstuff[k_aizdriftstrat] && !player->kartstuff[k_drift]) + { K_SpawnAIZDust(player); + if (abs(player->aizDriftTilt) < ANGLE_22h) + { + player->aizDriftTilt = + (abs(player->aizDriftTilt) + ANGLE_11hh / 4) * + player->kartstuff[k_aizdriftstrat]; + } + + if (abs(player->aizDriftTurn) < ANGLE_135) + { + player->aizDriftTurn = + (abs(player->aizDriftTurn) + ANGLE_11hh) * + player->kartstuff[k_aizdriftstrat]; + } + } + + if (!player->kartstuff[k_aizdriftstrat]) + { + player->aizDriftTilt -= player->aizDriftTilt / 4; + player->aizDriftTurn -= player->aizDriftTurn / 4; + + if (abs(player->aizDriftTilt) < ANGLE_11hh / 4) + player->aizDriftTilt = 0; + if (abs(player->aizDriftTurn) < ANGLE_11hh) + player->aizDriftTurn = 0; + } + if (player->kartstuff[k_drift] && ((buttons & BT_BRAKE) || !(buttons & BT_ACCELERATE)) diff --git a/src/p_user.c b/src/p_user.c index b3a85e6fc..e6b754201 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2223,7 +2223,11 @@ void P_MovePlayer(player_t *player) { player->drawangle = player->mo->angle; - if (player->kartstuff[k_drift] != 0) + if (player->aizDriftTurn) + { + player->drawangle += player->aizDriftTurn; + } + else if (player->kartstuff[k_drift] != 0) { INT32 a = (ANGLE_45 / 5) * player->kartstuff[k_drift]; player->drawangle += a; diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index 9f8c9b415..6149bab24 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -38,7 +38,7 @@ angle_t R_SpriteRotationAngle(mobj_t *mobj) angle_t angleDelta = (viewingAngle - mobj->angle); angle_t sliptideLift = mobj->player - ? K_Sliptiding(mobj->player) * ANGLE_11hh : 0; + ? mobj->player->aizDriftTilt : 0; angle_t rollOrPitch = R_GetPitchRollAngle(mobj); angle_t rollAngle = (rollOrPitch + mobj->rollangle); From a8c443f2aa74163855d241faf5da0597d42caa4b Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 20:54:30 -0700 Subject: [PATCH 13/15] Stop lifting the jart when sliptides end due to drift --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 38d2eb162..f1e59fe0b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7378,7 +7378,7 @@ static void K_KartDrift(player_t *player, boolean onground) } } - if (!player->kartstuff[k_aizdriftstrat]) + if (!K_Sliptiding(player)) { player->aizDriftTilt -= player->aizDriftTilt / 4; player->aizDriftTurn -= player->aizDriftTurn / 4; From 7e74a1d823c266d7ebe329780f5f36dfeb28a393 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 21:53:14 -0700 Subject: [PATCH 14/15] Cap camera tilt at 45 degrees; remove excess airborne easing --- src/p_user.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index e6b754201..938d0956f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4313,14 +4313,18 @@ DoABarrelRoll (player_t *player) slope = 0; } + if (AbsAngle(slope) > ANGLE_45) + { + slope = slope & ANGLE_180 ? InvAngle(ANGLE_45) : ANGLE_45; + } + slope -= Quaketilt(player); delta = slope - player->tilt; smoothing = FixedDiv(AbsAngle(slope), ANGLE_45); - delta = - FixedDiv(delta, (33 + min(4, player->airtime) * 22) - * FixedDiv(FRACUNIT, FRACUNIT + smoothing)); + delta = FixedDiv(delta, 33 * + FixedDiv(FRACUNIT, FRACUNIT + smoothing)); if (delta) player->tilt += delta; From d5e4fb6bfa43a2dcbd2611862a323e073c908a4e Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 6 Apr 2021 21:56:37 -0700 Subject: [PATCH 15/15] Turn sprite less while sliptiding --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index f1e59fe0b..ec7166c77 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7370,7 +7370,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_aizdriftstrat]; } - if (abs(player->aizDriftTurn) < ANGLE_135) + if (abs(player->aizDriftTurn) < ANGLE_112h) { player->aizDriftTurn = (abs(player->aizDriftTurn) + ANGLE_11hh) *