Rumble the jart when stepping on staircases

- Sprite tilts back and forth 5.625 degrees, two tics each
  side, for 17 tics (half a second).
- Turning is ignored--as if in the air--every other tic
  during those 17 tics.
This commit is contained in:
James R 2021-04-10 03:17:02 -07:00
parent a77ed63c5f
commit 2b173f1ec0
7 changed files with 66 additions and 13 deletions

View file

@ -708,6 +708,8 @@ typedef struct player_s
UINT8 kickstartaccel; UINT8 kickstartaccel;
UINT8 stairjank;
#ifdef HWRENDER #ifdef HWRENDER
fixed_t fovadd; // adjust FOV for hw rendering fixed_t fovadd; // adjust FOV for hw rendering
#endif #endif

View file

@ -1761,11 +1761,6 @@ static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the m
sparks->renderflags |= RF_DONTDRAW; sparks->renderflags |= RF_DONTDRAW;
} }
static fixed_t K_RandomFlip(fixed_t f)
{
return ( ( leveltime & 1 ) ? f : -f );
}
void K_SpawnDriftBoostClip(player_t *player) void K_SpawnDriftBoostClip(player_t *player)
{ {
mobj_t *clip; mobj_t *clip;
@ -1790,7 +1785,7 @@ void K_SpawnDriftBoostClip(player_t *player)
clip->momz += player->mo->momz; clip->momz += player->mo->momz;
P_InstaThrust(clip, player->mo->angle + P_InstaThrust(clip, player->mo->angle +
K_RandomFlip(P_RandomRange(FRACUNIT/2, FRACUNIT)), P_RandomFlip(P_RandomRange(FRACUNIT/2, FRACUNIT)),
FixedMul(scale, player->speed)); FixedMul(scale, player->speed));
} }

View file

@ -2419,6 +2419,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
fixed_t radius = thing->radius; fixed_t radius = thing->radius;
fixed_t thingtop; fixed_t thingtop;
fixed_t startingonground = P_IsObjectOnGround(thing); fixed_t startingonground = P_IsObjectOnGround(thing);
fixed_t stairjank = 0;
fixed_t stairstep = 0;
floatok = false; floatok = false;
// reset this to 0 at the start of each trymove call as it's only used here // reset this to 0 at the start of each trymove call as it's only used here
@ -2490,6 +2492,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
if (maxstep > 0) if (maxstep > 0)
{ {
const fixed_t minstep = maxstep / 8;
thingtop = thing->z + thing->height; thingtop = thing->z + thing->height;
// Step up // Step up
@ -2497,6 +2501,9 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
{ {
if (tmfloorstep <= maxstep) if (tmfloorstep <= maxstep)
{ {
stairjank = thing->floordrop;
stairstep = minstep;
thing->z = thing->floorz = tmfloorz; thing->z = thing->floorz = tmfloorz;
thing->floorrover = tmfloorrover; thing->floorrover = tmfloorrover;
thing->eflags |= MFE_JUSTSTEPPEDDOWN; thing->eflags |= MFE_JUSTSTEPPEDDOWN;
@ -2510,6 +2517,9 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
{ {
if (tmceilingstep <= maxstep) if (tmceilingstep <= maxstep)
{ {
stairjank = thing->ceilingdrop;
stairstep = minstep;
thing->z = ( thing->ceilingz = tmceilingz ) - thing->height; thing->z = ( thing->ceilingz = tmceilingz ) - thing->height;
thing->ceilingrover = tmceilingrover; thing->ceilingrover = tmceilingrover;
thing->eflags |= MFE_JUSTSTEPPEDDOWN; thing->eflags |= MFE_JUSTSTEPPEDDOWN;
@ -2526,6 +2536,9 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
if (thingtop == thing->ceilingz && tmceilingz > thingtop && tmceilingz - thingtop <= maxstep) if (thingtop == thing->ceilingz && tmceilingz > thingtop && tmceilingz - thingtop <= maxstep)
{ {
stairjank = thing->ceilingdrop;
stairstep = minstep;
thing->z = (thing->ceilingz = tmceilingz) - thing->height; thing->z = (thing->ceilingz = tmceilingz) - thing->height;
thing->ceilingrover = tmceilingrover; thing->ceilingrover = tmceilingrover;
thing->eflags |= MFE_JUSTSTEPPEDDOWN; thing->eflags |= MFE_JUSTSTEPPEDDOWN;
@ -2533,6 +2546,9 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
} }
else if (thing->z == thing->floorz && tmfloorz < thing->z && thing->z - tmfloorz <= maxstep) else if (thing->z == thing->floorz && tmfloorz < thing->z && thing->z - tmfloorz <= maxstep)
{ {
stairjank = thing->floordrop;
stairstep = minstep;
thing->z = thing->floorz = tmfloorz; thing->z = thing->floorz = tmfloorz;
thing->floorrover = tmfloorrover; thing->floorrover = tmfloorrover;
thing->eflags |= MFE_JUSTSTEPPEDDOWN; thing->eflags |= MFE_JUSTSTEPPEDDOWN;
@ -2619,6 +2635,11 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
else // don't set standingslope if you're not going to clip against it else // don't set standingslope if you're not going to clip against it
thing->standingslope = NULL; thing->standingslope = NULL;
if (stairjank > stairstep && thing->player)
{
thing->player->stairjank = 17;
}
thing->x = x; thing->x = x;
thing->y = y; thing->y = y;

View file

@ -36,6 +36,11 @@
tic_t leveltime; tic_t leveltime;
INT32 P_AltFlip(INT32 n, tic_t tics)
{
return leveltime % (2 * tics) < tics ? n : -(n);
}
// //
// THINKERS // THINKERS
// All thinkers should be allocated by Z_Calloc // All thinkers should be allocated by Z_Calloc

View file

@ -30,4 +30,8 @@ void P_DoTeamscrambling(void);
void P_RemoveThinkerDelayed(thinker_t *thinker); //killed void P_RemoveThinkerDelayed(thinker_t *thinker); //killed
mobj_t *P_SetTarget(mobj_t **mo, mobj_t *target); // killough 11/98 mobj_t *P_SetTarget(mobj_t **mo, mobj_t *target); // killough 11/98
// Negate the value for tics
INT32 P_AltFlip(INT32 value, tic_t tics);
#define P_RandomFlip(value) P_AltFlip(value, 1)
#endif #endif

View file

@ -1869,6 +1869,9 @@ static void P_3dMovement(player_t *player)
movepushangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift]; movepushangle = player->mo->angle-(ANGLE_45/5)*player->kartstuff[k_drift];
else if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeoutslow]) // if spun out, use the boost angle else if (player->kartstuff[k_spinouttimer] || player->kartstuff[k_wipeoutslow]) // if spun out, use the boost angle
movepushangle = (angle_t)player->kartstuff[k_boostangle]; movepushangle = (angle_t)player->kartstuff[k_boostangle];
else if (player->stairjank && leveltime & 1)
movepushangle = R_PointToAngle2(0, 0,
player->mo->momx, player->mo->momy);
else else
movepushangle = player->mo->angle; movepushangle = player->mo->angle;
@ -4749,6 +4752,11 @@ void P_PlayerThink(player_t *player)
player->typing_duration = 0; player->typing_duration = 0;
} }
if (player->stairjank > 0)
{
player->stairjank--;
}
player->pflags &= ~PF_SLIDING; player->pflags &= ~PF_SLIDING;
K_KartPlayerThink(player, cmd); // SRB2kart K_KartPlayerThink(player, cmd); // SRB2kart

View file

@ -15,6 +15,7 @@
#include "w_wad.h" #include "w_wad.h"
#include "r_main.h" // R_PointToAngle #include "r_main.h" // R_PointToAngle
#include "k_kart.h" // K_Sliptiding #include "k_kart.h" // K_Sliptiding
#include "p_tick.h"
#ifdef ROTSPRITE #ifdef ROTSPRITE
fixed_t rollcosang[ROTANGLES]; fixed_t rollcosang[ROTANGLES];
@ -32,16 +33,14 @@ angle_t R_GetPitchRollAngle(mobj_t *mobj)
return rollOrPitch; return rollOrPitch;
} }
angle_t R_SpriteRotationAngle(mobj_t *mobj) static angle_t R_PlayerSpriteRotation(player_t *player)
{ {
angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y); angle_t viewingAngle = R_PointToAngle(player->mo->x, player->mo->y);
angle_t angleDelta = (viewingAngle - mobj->angle); angle_t angleDelta = (viewingAngle - player->mo->angle);
angle_t sliptideLift = mobj->player angle_t sliptideLift = player->aizDriftTilt;
? mobj->player->aizDriftTilt : 0;
angle_t rollOrPitch = R_GetPitchRollAngle(mobj); angle_t rollAngle = 0;
angle_t rollAngle = (rollOrPitch + mobj->rollangle);
if (sliptideLift) if (sliptideLift)
{ {
@ -52,6 +51,25 @@ angle_t R_SpriteRotationAngle(mobj_t *mobj)
FixedMul(sliptideLift, FINECOSINE(angleDelta >> ANGLETOFINESHIFT)); FixedMul(sliptideLift, FINECOSINE(angleDelta >> ANGLETOFINESHIFT));
} }
if (player->stairjank)
{
rollAngle += P_AltFlip(ANGLE_11hh / 2 /
(17 / player->stairjank), 2);
}
return rollAngle;
}
angle_t R_SpriteRotationAngle(mobj_t *mobj)
{
angle_t rollOrPitch = R_GetPitchRollAngle(mobj);
angle_t rollAngle = (rollOrPitch + mobj->rollangle);
if (mobj->player)
{
rollAngle += R_PlayerSpriteRotation(mobj->player);
}
return rollAngle; return rollAngle;
} }