diff --git a/src/p_mobj.c b/src/p_mobj.c index 876bcf03d..6ffc84c66 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -148,11 +148,17 @@ FUNCINLINE static ATTRINLINE void P_CycleStateAnimation(mobj_t *mobj) if (mobj->sprite != SPR_PLAY) { + const UINT8 start = mobj->state->frame & FF_FRAMEMASK; + + UINT8 frame = mobj->frame & FF_FRAMEMASK; + // compare the current sprite frame to the one we started from // if more than var1 away from it, swap back to the original // else just advance by one - if (((++mobj->frame) & FF_FRAMEMASK) - (mobj->state->frame & FF_FRAMEMASK) > (UINT32)mobj->state->var1) - mobj->frame = (mobj->state->frame & FF_FRAMEMASK) | (mobj->frame & ~FF_FRAMEMASK); + if ((mobj->frame & FF_REVERSEANIM ? (start - (--frame)) : ((++frame) - start)) > mobj->state->var1) + frame = start; + + mobj->frame = frame | (mobj->frame & ~FF_FRAMEMASK); return; } diff --git a/src/p_pspr.h b/src/p_pspr.h index ff2ead048..a805bbb40 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -96,6 +96,8 @@ #define FF_GLOBALANIM 0x20000000 /// \brief Frame flags - Animate: Start at a random place in the animation (mutually exclusive with above) #define FF_RANDOMANIM 0x40000000 +/// \brief Frame flags - Animate: Animate in reverse +#define FF_REVERSEANIM 0x80000000 /** \brief translucency tables