diff --git a/src/p_enemy.c b/src/p_enemy.c index 273672987..72f68b2e5 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -10812,17 +10812,14 @@ void P_InternalFlickySetColor(mobj_t *actor, UINT8 extrainfo) // Bit 21 = Flag MF_SLIDEME (see below) // Bit 22 = Flag MF_GRENADEBOUNCE (see below) // Bit 23 = Flag MF_NOCLIPTHING (see below) -// Bit 24 = Flicky movedir, 0 or 1 // // If actor is placed from a spawnpoint (map Thing), the Thing's properties take precedence. // // var2 = maximum default distance away from spawn the flickies are allowed to travel. If angle != 0, then that's the radius. // -// If MTF_EXTRA (MF_SLIDEME) is flagged, Flickies move independently of a target. Else, move around the target. -// If MTF_EXTRA (MF_SLIDEME) and MTF_OBJECTSPECIAL (MF_GRENADEBOUNCE) are both flagged, Flying flickies sink from gravity. By default, they stay at constant Z height. -// If MTF_OBJECTSPECIAL (MF_GRENADEBOUNCE) and NOT MTF_EXTRA (MF_SLIDEME) are flagged, Angle sign determines direction of circular movement. -// If MTF_AMBUSH (MF_NOCLIPTHING) is flagged, Flickies hop in-place. -// If MTF_AMBUSH (MF_NOCLIPTHING) and MTF_OBJECTSPECIAL (MF_GRENADEBOUNCE) is flagged, Flickies stand in-place without gravity. +// If MTF_EXTRA (MF_SLIDEME): is flagged, Flickies move aimlessly. Else, orbit around the target. +// If MTF_OBJECTSPECIAL (MF_GRENADEBOUNCE): Flickies stand in-place without gravity (unless they hop, then gravity is applied.) +// If MTF_AMBUSH (MF_NOCLIPTHING): is flagged, Flickies hop. // void A_FlickyCenter(mobj_t *actor) { @@ -10838,6 +10835,10 @@ void A_FlickyCenter(mobj_t *actor) if (!actor->tracer) { + mobj_t *flicky = P_InternalFlickySpawn(actor, locvar1, 1, false); + P_SetTarget(&flicky->target, actor); + P_SetTarget(&actor->tracer, flicky); + if (actor->spawnpoint) { actor->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE|MF_NOCLIPTHING); @@ -10860,7 +10861,7 @@ void A_FlickyCenter(mobj_t *actor) | ((flickyflags & 2) ? MF_GRENADEBOUNCE : 0) | ((flickyflags & 4) ? MF_NOCLIPTHING : 0) ); - actor->extravalue1 = locvar2; // don't abs() yet, for movedir + actor->extravalue1 = abs(locvar2); actor->extravalue2 = flickycolor; actor->friction = actor->x; actor->movefactor = actor->y; @@ -10868,45 +10869,28 @@ void A_FlickyCenter(mobj_t *actor) locvar1 = flickytype; } - if (actor->flags & MF_SLIDEME) + if (actor->flags & MF_GRENADEBOUNCE) // in-place + actor->tracer->fuse = 0; + else if (actor->flags & MF_SLIDEME) // aimless { - actor->tracer = P_InternalFlickySpawn(actor, locvar1, 1, false); - P_SetTarget(&actor->tracer->target, actor); - actor->tracer->fuse = 0; // < 2*TICRATE means move aimlessly. - - if (!(actor->flags & MF_NOCLIPTHING)) - actor->tracer->angle = P_RandomKey(180)*ANG2; + actor->tracer->fuse = 0; // less than 2*TICRATE means move aimlessly. + actor->tracer->angle = P_RandomKey(180)*ANG2; } - else + else //orbit { - actor->tracer = P_InternalFlickySpawn(actor, locvar1, 1, false); - P_SetTarget(&actor->tracer->target, actor); actor->tracer->fuse = FRACUNIT; - - if ((actor->flags & MF_GRENADEBOUNCE) && !(actor->flags & MF_SLIDEME)) - { - if (!actor->spawnpoint) - actor->tracer->movedir = (flickyflags & 8) ? 1 : -1; - else - actor->tracer->movedir = actor->extravalue1 >= 0 ? 1 : -1; - } + // Impose default home radius if flicky orbits around player + if (!actor->extravalue1) + actor->extravalue1 = 512 * FRACUNIT; } if (locvar1 == MT_FLICKY_08) P_InternalFlickySetColor(actor->tracer, actor->extravalue2); actor->extravalue2 = 0; - - // Now abs() extravalue1 (home radius) - if (!actor->spawnpoint) - actor->extravalue1 = abs(actor->extravalue1); - - // Impose default home radius if flicky orbits around player - if (!(actor->flags & MF_SLIDEME) && !actor->extravalue1) - actor->extravalue1 = 512 * FRACUNIT; } - if (!(actor->flags & MF_SLIDEME) && !(actor->flags & MF_NOCLIPTHING)) + if (!(actor->flags & MF_SLIDEME) && !(actor->flags & MF_GRENADEBOUNCE)) { fixed_t originx = actor->friction; fixed_t originy = actor->movefactor; @@ -11041,8 +11025,7 @@ void P_InternalFlickyFly(mobj_t *actor, fixed_t flyspeed, fixed_t targetdist, fi if (actor->target && P_IsFlickyCenter(actor->target->type) - && !((actor->target->flags & MF_GRENADEBOUNCE) - && (actor->target->flags & MF_SLIDEME))) + && (actor->target->flags & MF_SLIDEME)) vertangle = 0; else vertangle = (R_PointToAngle2(0, actor->z, targetdist, chasez) >> ANGLETOFINESHIFT) & FINEMASK; @@ -11204,9 +11187,9 @@ void A_FlickyCheck(mobj_t *actor) #endif if (actor->target && P_IsFlickyCenter(actor->target->type) - && (actor->target->flags & MF_NOCLIPTHING)) + && (actor->target->flags & MF_GRENADEBOUNCE)) { - if (actor->target->flags & MF_GRENADEBOUNCE) + if (!(actor->target->flags & MF_NOCLIPTHING)) // no hopping { actor->momz = 0; actor->flags |= MF_NOGRAVITY; @@ -11241,9 +11224,9 @@ void A_FlickyHeightCheck(mobj_t *actor) #endif if (actor->target && P_IsFlickyCenter(actor->target->type) - && (actor->target->flags & MF_NOCLIPTHING)) + && (actor->target->flags & MF_GRENADEBOUNCE)) { - if (actor->target->flags & MF_GRENADEBOUNCE) + if (!(actor->target->flags & MF_NOCLIPTHING)) // no hopping { actor->momz = 0; actor->flags |= MF_NOGRAVITY; diff --git a/src/p_mobj.c b/src/p_mobj.c index 894304491..d55fdf9c3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7137,9 +7137,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_FLICKY_16_CENTER: case MT_SECRETFLICKY_01_CENTER: case MT_SECRETFLICKY_02_CENTER: - if (mobj->tracer - && (mobj->flags & MF_NOCLIPTHING) - && !(mobj->flags & MF_GRENADEBOUNCE)) + if (mobj->tracer && (mobj->flags & MF_NOCLIPTHING)) { if (!(mobj->tracer->flags2 & MF2_OBJECTFLIP) && mobj->tracer->z <= mobj->tracer->floorz) mobj->tracer->momz = 7*FRACUNIT;