Separate most of P_DoSpring into P_DoSpringEx

This commit is contained in:
James R 2022-12-17 20:30:05 -08:00
parent 48d5af71fb
commit 4281adc60d
2 changed files with 92 additions and 72 deletions

View file

@ -170,7 +170,7 @@ boolean P_IsObjectInGoop(mobj_t *mo);
boolean P_IsObjectOnGround(mobj_t *mo); boolean P_IsObjectOnGround(mobj_t *mo);
boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec); boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec);
boolean P_IsObjectOnRealGround(mobj_t *mo, sector_t *sec); // SRB2Kart boolean P_IsObjectOnRealGround(mobj_t *mo, sector_t *sec); // SRB2Kart
#define P_IsObjectFlipped(o) ((o)->eflags & MFE_VERTICALFLIP) #define P_IsObjectFlipped(o) (((o)->eflags & MFE_VERTICALFLIP) == MFE_VERTICALFLIP)
boolean P_InQuicksand(mobj_t *mo); boolean P_InQuicksand(mobj_t *mo);
boolean P_PlayerHitFloor(player_t *player, boolean fromAir, angle_t oldPitch, angle_t oldRoll); boolean P_PlayerHitFloor(player_t *player, boolean fromAir, angle_t oldPitch, angle_t oldRoll);
@ -473,6 +473,7 @@ fixed_t P_FloorzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height);
fixed_t P_CeilingzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height); fixed_t P_CeilingzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height);
BlockItReturn_t PIT_PushableMoved(mobj_t *thing); BlockItReturn_t PIT_PushableMoved(mobj_t *thing);
void P_DoSpringEx(mobj_t *object, fixed_t scaleVal, fixed_t vertispeed, fixed_t horizspeed, angle_t finalAngle, UINT16 starcolor);
boolean P_DoSpring(mobj_t *spring, mobj_t *object); boolean P_DoSpring(mobj_t *spring, mobj_t *object);
fixed_t P_GetFOFTopZAt (ffloor_t *rover, fixed_t x, fixed_t y); fixed_t P_GetFOFTopZAt (ffloor_t *rover, fixed_t x, fixed_t y);

View file

@ -268,6 +268,90 @@ static boolean P_SpecialIsLinedefCrossType(line_t *ld)
return linedefcrossspecial; return linedefcrossspecial;
} }
void
P_DoSpringEx
( mobj_t * object,
fixed_t scaleVal,
fixed_t vertispeed,
fixed_t horizspeed,
angle_t finalAngle,
UINT16 starcolor)
{
object->standingslope = NULL; // Okay, now we know it's not going to be relevant - no launching off at silly angles for you.
object->terrain = NULL;
object->eflags |= MFE_SPRUNG; // apply this flag asap!
if ((vertispeed < 0) ^ P_IsObjectFlipped(object))
vertispeed *= 2;
if (vertispeed)
{
object->momz = FixedMul(vertispeed, scaleVal);
}
if (horizspeed)
{
fixed_t finalSpeed = FixedMul(horizspeed, scaleVal);
fixed_t objectSpeed;
if (object->player)
objectSpeed = object->player->speed;
else
objectSpeed = R_PointToDist2(0, 0, object->momx, object->momy);
if (!vertispeed)
{
// Scale to gamespeed
finalSpeed = FixedMul(finalSpeed, K_GetKartGameSpeedScalar(gamespeed));
// Reflect your momentum angle against the surface of horizontal springs.
// This makes it a bit more interesting & unique than just being a speed boost in a pre-defined direction
if (object->momx || object->momy)
{
finalAngle = K_ReflectAngle(
R_PointToAngle2(0, 0, object->momx, object->momy), finalAngle,
objectSpeed, finalSpeed
);
}
}
// Horizontal speed is used as a minimum thrust, not a direct replacement
finalSpeed = max(objectSpeed, finalSpeed);
P_InstaThrust(object, finalAngle, finalSpeed);
}
if (object->player)
{
K_TumbleInterrupt(object->player);
P_ResetPlayer(object->player);
object->player->springstars = max(abs(vertispeed), horizspeed) / FRACUNIT / 2;
object->player->springcolor = starcolor;
// Less friction when hitting springs
if (!object->player->tiregrease)
{
UINT8 i;
for (i = 0; i < 2; i++)
{
mobj_t *grease;
grease = P_SpawnMobj(object->x, object->y, object->z, MT_TIREGREASE);
P_SetTarget(&grease->target, object);
grease->angle = K_MomentumAngle(object);
grease->extravalue1 = i;
K_ReduceVFX(grease, object->player);
}
}
if (object->player->tiregrease < greasetics)
{
object->player->tiregrease = greasetics;
}
}
}
// //
// P_DoSpring // P_DoSpring
// //
@ -282,8 +366,8 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
fixed_t vertispeed = spring->info->mass; fixed_t vertispeed = spring->info->mass;
fixed_t horizspeed = spring->info->damage; fixed_t horizspeed = spring->info->damage;
UINT16 starcolor = (spring->info->painchance % numskincolors); UINT16 starcolor = (spring->info->painchance % numskincolors);
fixed_t savemomx = 0; fixed_t savemomx = object->momx;
fixed_t savemomy = 0; fixed_t savemomy = object->momy;
statenum_t raisestate = spring->info->raisestate; statenum_t raisestate = spring->info->raisestate;
// Object was already sprung this tic // Object was already sprung this tic
@ -312,18 +396,11 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
return false; return false;
} }
object->standingslope = NULL; // Okay, now we know it's not going to be relevant - no launching off at silly angles for you.
object->terrain = NULL;
object->eflags |= MFE_SPRUNG; // apply this flag asap!
spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify
if (spring->eflags & MFE_VERTICALFLIP) if (spring->eflags & MFE_VERTICALFLIP)
vertispeed *= -1; vertispeed *= -1;
if ((spring->eflags ^ object->eflags) & MFE_VERTICALFLIP)
vertispeed *= 2;
// Vertical springs teleport you on TOP of them. // Vertical springs teleport you on TOP of them.
if (vertispeed > 0) if (vertispeed > 0)
{ {
@ -355,43 +432,11 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
P_TryMove(object, spring->x + offx, spring->y + offy, true, NULL); P_TryMove(object, spring->x + offx, spring->y + offy, true, NULL);
} }
if (vertispeed) object->momx = savemomx;
{ object->momy = savemomy;
object->momz = FixedMul(vertispeed, scaleVal);
}
if (horizspeed) P_DoSpringEx(object, scaleVal, vertispeed, horizspeed,
{ spring->angle, starcolor);
angle_t finalAngle = spring->angle;
fixed_t finalSpeed = FixedMul(horizspeed, scaleVal);
fixed_t objectSpeed;
if (object->player)
objectSpeed = object->player->speed;
else
objectSpeed = R_PointToDist2(0, 0, savemomx, savemomy);
if (!vertispeed)
{
// Scale to gamespeed
finalSpeed = FixedMul(finalSpeed, K_GetKartGameSpeedScalar(gamespeed));
// Reflect your momentum angle against the surface of horizontal springs.
// This makes it a bit more interesting & unique than just being a speed boost in a pre-defined direction
if (savemomx || savemomy)
{
finalAngle = K_ReflectAngle(
R_PointToAngle2(0, 0, savemomx, savemomy), finalAngle,
objectSpeed, finalSpeed
);
}
}
// Horizontal speed is used as a minimum thrust, not a direct replacement
finalSpeed = max(objectSpeed, finalSpeed);
P_InstaThrust(object, finalAngle, finalSpeed);
}
// Re-solidify // Re-solidify
spring->flags |= (spring->info->flags & (MF_SPRING|MF_SPECIAL)); spring->flags |= (spring->info->flags & (MF_SPRING|MF_SPECIAL));
@ -403,32 +448,6 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
P_SetTarget(&spring->target, object); P_SetTarget(&spring->target, object);
} }
K_TumbleInterrupt(object->player);
P_ResetPlayer(object->player);
object->player->springstars = max(abs(vertispeed), horizspeed) / FRACUNIT / 2;
object->player->springcolor = starcolor;
// Less friction when hitting springs
if (!object->player->tiregrease)
{
UINT8 i;
for (i = 0; i < 2; i++)
{
mobj_t *grease;
grease = P_SpawnMobj(object->x, object->y, object->z, MT_TIREGREASE);
P_SetTarget(&grease->target, object);
grease->angle = K_MomentumAngle(object);
grease->extravalue1 = i;
K_ReduceVFX(grease, object->player);
}
}
if (object->player->tiregrease < greasetics)
{
object->player->tiregrease = greasetics;
}
if (spring->type == MT_POGOSPRING) if (spring->type == MT_POGOSPRING)
{ {
if (spring->reactiontime == 0) if (spring->reactiontime == 0)