Re-organize flags for FLICKY_CENTER

* Flickies can be in-place with just one flag (MF_GRENADEBOUNCE)
* Flickies can now hop whether orbiting, aimless, or in-place
* Removed ability to customize movedir for orbit; will always be random
* Removed ability to customize gravity sink for aimless flying flickies
* Misc: Use P_SetTarget to set actor->tracer for flicky center
This commit is contained in:
mazmazz 2018-09-06 09:18:56 -04:00
parent fe2d1e9020
commit 2cfd941778
2 changed files with 24 additions and 43 deletions

View File

@ -10812,17 +10812,14 @@ void P_InternalFlickySetColor(mobj_t *actor, UINT8 extrainfo)
// Bit 21 = Flag MF_SLIDEME (see below) // Bit 21 = Flag MF_SLIDEME (see below)
// Bit 22 = Flag MF_GRENADEBOUNCE (see below) // Bit 22 = Flag MF_GRENADEBOUNCE (see below)
// Bit 23 = Flag MF_NOCLIPTHING (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. // 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. // 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): is flagged, Flickies move aimlessly. Else, orbit 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): Flickies stand in-place without gravity (unless they hop, then gravity is applied.)
// 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.
// 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.
// //
void A_FlickyCenter(mobj_t *actor) void A_FlickyCenter(mobj_t *actor)
{ {
@ -10838,6 +10835,10 @@ void A_FlickyCenter(mobj_t *actor)
if (!actor->tracer) 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) if (actor->spawnpoint)
{ {
actor->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE|MF_NOCLIPTHING); actor->flags &= ~(MF_SLIDEME|MF_GRENADEBOUNCE|MF_NOCLIPTHING);
@ -10860,7 +10861,7 @@ void A_FlickyCenter(mobj_t *actor)
| ((flickyflags & 2) ? MF_GRENADEBOUNCE : 0) | ((flickyflags & 2) ? MF_GRENADEBOUNCE : 0)
| ((flickyflags & 4) ? MF_NOCLIPTHING : 0) | ((flickyflags & 4) ? MF_NOCLIPTHING : 0)
); );
actor->extravalue1 = locvar2; // don't abs() yet, for movedir actor->extravalue1 = abs(locvar2);
actor->extravalue2 = flickycolor; actor->extravalue2 = flickycolor;
actor->friction = actor->x; actor->friction = actor->x;
actor->movefactor = actor->y; actor->movefactor = actor->y;
@ -10868,45 +10869,28 @@ void A_FlickyCenter(mobj_t *actor)
locvar1 = flickytype; 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); actor->tracer->fuse = 0; // less than 2*TICRATE means move aimlessly.
P_SetTarget(&actor->tracer->target, actor); actor->tracer->angle = P_RandomKey(180)*ANG2;
actor->tracer->fuse = 0; // < 2*TICRATE means move aimlessly.
if (!(actor->flags & MF_NOCLIPTHING))
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; actor->tracer->fuse = FRACUNIT;
// Impose default home radius if flicky orbits around player
if ((actor->flags & MF_GRENADEBOUNCE) && !(actor->flags & MF_SLIDEME)) if (!actor->extravalue1)
{ actor->extravalue1 = 512 * FRACUNIT;
if (!actor->spawnpoint)
actor->tracer->movedir = (flickyflags & 8) ? 1 : -1;
else
actor->tracer->movedir = actor->extravalue1 >= 0 ? 1 : -1;
}
} }
if (locvar1 == MT_FLICKY_08) if (locvar1 == MT_FLICKY_08)
P_InternalFlickySetColor(actor->tracer, actor->extravalue2); P_InternalFlickySetColor(actor->tracer, actor->extravalue2);
actor->extravalue2 = 0; 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 originx = actor->friction;
fixed_t originy = actor->movefactor; 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 if (actor->target
&& P_IsFlickyCenter(actor->target->type) && P_IsFlickyCenter(actor->target->type)
&& !((actor->target->flags & MF_GRENADEBOUNCE) && (actor->target->flags & MF_SLIDEME))
&& (actor->target->flags & MF_SLIDEME)))
vertangle = 0; vertangle = 0;
else else
vertangle = (R_PointToAngle2(0, actor->z, targetdist, chasez) >> ANGLETOFINESHIFT) & FINEMASK; vertangle = (R_PointToAngle2(0, actor->z, targetdist, chasez) >> ANGLETOFINESHIFT) & FINEMASK;
@ -11204,9 +11187,9 @@ void A_FlickyCheck(mobj_t *actor)
#endif #endif
if (actor->target if (actor->target
&& P_IsFlickyCenter(actor->target->type) && 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->momz = 0;
actor->flags |= MF_NOGRAVITY; actor->flags |= MF_NOGRAVITY;
@ -11241,9 +11224,9 @@ void A_FlickyHeightCheck(mobj_t *actor)
#endif #endif
if (actor->target if (actor->target
&& P_IsFlickyCenter(actor->target->type) && 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->momz = 0;
actor->flags |= MF_NOGRAVITY; actor->flags |= MF_NOGRAVITY;

View File

@ -7137,9 +7137,7 @@ void P_MobjThinker(mobj_t *mobj)
case MT_FLICKY_16_CENTER: case MT_FLICKY_16_CENTER:
case MT_SECRETFLICKY_01_CENTER: case MT_SECRETFLICKY_01_CENTER:
case MT_SECRETFLICKY_02_CENTER: case MT_SECRETFLICKY_02_CENTER:
if (mobj->tracer if (mobj->tracer && (mobj->flags & MF_NOCLIPTHING))
&& (mobj->flags & MF_NOCLIPTHING)
&& !(mobj->flags & MF_GRENADEBOUNCE))
{ {
if (!(mobj->tracer->flags2 & MF2_OBJECTFLIP) && mobj->tracer->z <= mobj->tracer->floorz) if (!(mobj->tracer->flags2 & MF2_OBJECTFLIP) && mobj->tracer->z <= mobj->tracer->floorz)
mobj->tracer->momz = 7*FRACUNIT; mobj->tracer->momz = 7*FRACUNIT;