diff --git a/src/p_map.c b/src/p_map.c index 5876e9005..a6fdd39cd 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -254,6 +254,36 @@ static boolean P_SpecialIsLinedefCrossType(line_t *ld) return linedefcrossspecial; } +static boolean P_ShouldSpringForceAngle(mobj_t *spring, ticcmd_t *cmd) +{ + switch (spring->type) + { + case MT_YELLOWDIAG: + case MT_REDDIAG: + case MT_BLUEDIAG: + case MT_GRAYDIAG: + if (spring->args[0] & TMSPR_FORCEANGLE) + return true; + break; + case MT_YELLOWHORIZ: + case MT_REDHORIZ: + case MT_BLUEHORIZ: + case MT_GRAYHORIZ: + if (spring->args[1] & TMSPR_FORCEANGLE) + return true; + break; + default: + break; + } + + // Not forced or a irregular spring? + // Always allow players that release accel to adjust angle. + if (cmd->forwardmove == 0 && cmd->sidemove == 0) + return true; + + return false; +} + void P_DoSpringEx ( mobj_t * object, @@ -388,7 +418,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) { if (spring->flags & MF_ENEMY) // Spring shells P_SetTarget(&spring->target, object); - if (horizspeed && object->player->cmd.forwardmove == 0 && object->player->cmd.sidemove == 0) + if (horizspeed && P_ShouldSpringForceAngle(spring, &object->player->cmd)) { object->angle = spring->angle; object->player->angleturn = spring->angle; diff --git a/src/p_mobj.c b/src/p_mobj.c index f7e7d4377..acc44cb2c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12651,6 +12651,7 @@ fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mt case MT_YELLOWHORIZ: case MT_REDHORIZ: case MT_BLUEHORIZ: + case MT_GRAYHORIZ: offset += mthing->args[0] ? 0 : 16*FRACUNIT; break; diff --git a/src/p_spec.h b/src/p_spec.h index 4e5af5c00..c873ffaea 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -120,6 +120,7 @@ typedef enum { TMSPR_NOGRAVITY = 1, TMSPR_ROTATEEXTRA = 1<<1, + TMSPR_FORCEANGLE = 1<<2, } textmapspringflags_t; typedef enum