Remove teleporting jank from springs, set angle when going directly against a horizontal/diagonal spring

This commit is contained in:
TehRealSalt 2019-09-12 00:31:51 -04:00
parent abfc1915c5
commit 55caae6d1a

View file

@ -113,12 +113,13 @@ boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z)
// MOVEMENT ITERATOR FUNCTIONS // MOVEMENT ITERATOR FUNCTIONS
// ========================================================================= // =========================================================================
//#define TELEPORTJANK
boolean P_DoSpring(mobj_t *spring, mobj_t *object) boolean P_DoSpring(mobj_t *spring, mobj_t *object)
{ {
//INT32 pflags; //INT32 pflags;
const fixed_t hscale = mapobjectscale + (mapobjectscale - object->scale); const fixed_t hscale = mapobjectscale + (mapobjectscale - object->scale);
const fixed_t vscale = mapobjectscale + (object->scale - mapobjectscale); const fixed_t vscale = mapobjectscale + (object->scale - mapobjectscale);
fixed_t offx, offy;
fixed_t vertispeed = spring->info->mass; fixed_t vertispeed = spring->info->mass;
fixed_t horizspeed = spring->info->damage; fixed_t horizspeed = spring->info->damage;
@ -142,11 +143,13 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
object->eflags |= MFE_SPRUNG; // apply this flag asap! object->eflags |= MFE_SPRUNG; // apply this flag asap!
spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify
#ifdef TELEPORTJANK
if (horizspeed && vertispeed) // Mimic SA if (horizspeed && vertispeed) // Mimic SA
{ {
object->momx = object->momy = 0; object->momx = object->momy = 0;
P_TryMove(object, spring->x, spring->y, true); P_TryMove(object, spring->x, spring->y, true);
} }
#endif
if (spring->eflags & MFE_VERTICALFLIP) if (spring->eflags & MFE_VERTICALFLIP)
vertispeed *= -1; vertispeed *= -1;
@ -155,8 +158,11 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
object->z = spring->z + spring->height + 1; object->z = spring->z + spring->height + 1;
else if (vertispeed < 0) else if (vertispeed < 0)
object->z = spring->z - object->height - 1; object->z = spring->z - object->height - 1;
#ifdef TELEPORTJANK
else else
{ {
fixed_t offx, offy;
// Horizontal springs teleport you in FRONT of them. // Horizontal springs teleport you in FRONT of them.
object->momx = object->momy = 0; object->momx = object->momy = 0;
@ -178,6 +184,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
// Set position! // Set position!
P_TryMove(object, spring->x + offx, spring->y + offy, true); P_TryMove(object, spring->x + offx, spring->y + offy, true);
} }
#endif
if (vertispeed) if (vertispeed)
object->momz = FixedMul(vertispeed,FixedSqrt(FixedMul(vscale, spring->scale))); object->momz = FixedMul(vertispeed,FixedSqrt(FixedMul(vscale, spring->scale)));
@ -208,20 +215,28 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
if (spring->flags & MF_ENEMY) // Spring shells if (spring->flags & MF_ENEMY) // Spring shells
P_SetTarget(&spring->target, object); P_SetTarget(&spring->target, object);
if (horizspeed && object->player->cmd.forwardmove == 0 && object->player->cmd.sidemove == 0) if (horizspeed)
{ {
object->angle = spring->angle; const angle_t turnabout = ANGLE_90+ANGLE_45;
angle_t dangle = object->angle - spring->angle;
if (dangle > ANGLE_180)
dangle = InvAngle(dangle);
if (!demo.playback || P_AnalogMove(object->player)) if (dangle > turnabout || (object->player->cmd.forwardmove == 0 && object->player->cmd.sidemove == 0))
{ {
if (object->player == &players[consoleplayer]) object->angle = spring->angle;
localangle[0] = spring->angle;
else if (object->player == &players[displayplayers[1]]) if (!demo.playback || P_AnalogMove(object->player))
localangle[1] = spring->angle; {
else if (object->player == &players[displayplayers[2]]) if (object->player == &players[consoleplayer])
localangle[2] = spring->angle; localangle[0] = spring->angle;
else if (object->player == &players[displayplayers[3]]) else if (object->player == &players[displayplayers[1]])
localangle[3] = spring->angle; localangle[1] = spring->angle;
else if (object->player == &players[displayplayers[2]])
localangle[2] = spring->angle;
else if (object->player == &players[displayplayers[3]])
localangle[3] = spring->angle;
}
} }
} }