Prison Egg polish: Spawn three Followers on hit

- Selected from the mapheader's Audience list
    - Since most Prison Break maps don't have Audience lists set, you'll be seeing a lot of Flicky/Motobuddy/Chao for now
- Yes, these will disappear in deathpits like in Sky Chase
- Intentionally did not do this for the CD Special Stage UFO
This commit is contained in:
toaster 2023-11-04 13:32:08 +00:00
parent ec4ea384c3
commit 9e49f761b0
4 changed files with 80 additions and 11 deletions

View file

@ -136,7 +136,7 @@ void Obj_UpdateRingShooterFace(mobj_t *part);
/* Follower Audience */
void Obj_AudienceInit(mobj_t * mobj, mapthing_t *mthing, INT32 followerpick);
void Obj_AudienceThink(mobj_t * mobj, boolean focusonplayer);
void Obj_AudienceThink(mobj_t * mobj, boolean focusonplayer, boolean checkdeathpit);
/* Random Item Boxes */
void Obj_RandomItemVisuals(mobj_t *mobj);

View file

@ -202,8 +202,11 @@ Obj_AudienceInit
void
Obj_AudienceThink
( mobj_t * mobj,
boolean focusonplayer)
boolean focusonplayer,
boolean checkdeathpit)
{
boolean landed = false;
if (audience_mainstate(mobj) == S_NULL)
{
// Uninitialised, don't do anything funny.
@ -328,15 +331,23 @@ Obj_AudienceThink
}
else if (mobj->flags2 & MF2_OBJECTFLIP)
{
if (mobj->z + mobj->height >= mobj->ceilingz)
{
mobj->momz = -audience_bobamp(mobj);
P_SetMobjState(mobj, audience_mainstate(mobj));
}
landed = (mobj->z + mobj->height >= mobj->ceilingz);
}
else if (mobj->z <= mobj->floorz)
else
{
mobj->momz = audience_bobamp(mobj);
landed = (mobj->z <= mobj->floorz);
}
if (landed == true)
{
if (checkdeathpit && P_CheckDeathPitCollide(mobj))
{
P_RemoveMobj(mobj);
return;
}
mobj->momx = mobj->momy = 0;
mobj->momz = P_MobjFlip(mobj)*audience_bobamp(mobj);
P_SetMobjState(mobj, audience_mainstate(mobj));
}
}

View file

@ -2103,6 +2103,62 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
cur = cur->hnext;
}
// Spawn three Followers (if possible)
if (mapheaderinfo[gamemap-1]->numFollowers)
{
dir = FixedAngle(P_RandomKey(PR_RANDOMAUDIENCE, 360)*FRACUNIT);
const fixed_t launchmomentum = 11 * mapobjectscale;
const fixed_t jaggedness = 4;
angle_t launchangle;
UINT8 i;
for (i = 0; i < 3; i++, dir += ANGLE_120)
{
cur = P_SpawnMobj(
target->x, target->y,
target->z + target->height/2,
MT_RANDOMAUDIENCE
);
// We check if you have some horrible Lua
if (P_MobjWasRemoved(cur))
break;
Obj_AudienceInit(cur, NULL, -1);
// We check again if the list is invalid
if (P_MobjWasRemoved(cur))
break;
// For Followers, this makes them
// MF2_AMBUSH - try to always look at the nearest player
// MF2_DONTRESPAWN - Check for death pits
cur->flags2 |= (MF2_AMBUSH|MF2_DONTRESPAWN);
cur->hitlag = target->hitlag;
P_SetScale(cur, cur->destscale/TICRATE);
cur->scalespeed = cur->destscale/TICRATE;
cur->z -= cur->height/2;
// flags are NOT from the target - just in case it's just been placed on the ceiling as a gimmick
cur->flags2 |= (source->flags2 & MF2_OBJECTFLIP);
cur->eflags |= (source->eflags & MFE_VERTICALFLIP);
launchangle = FixedAngle(P_RandomRange(PR_RANDOMAUDIENCE, 60/jaggedness, 80/jaggedness) * jaggedness*FRACUNIT);
cur->momz = P_MobjFlip(target) // THIS one uses target!
* P_ReturnThrustY(cur, launchangle, launchmomentum);
cur->angle = dir;
P_InstaThrust(
cur, cur->angle,
P_ReturnThrustX(cur, launchangle, launchmomentum)
);
}
}
S_StartSound(target, sfx_mbs60);
P_AddBrokenPrison(target, inflictor, source);

View file

@ -7270,7 +7270,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (mobj->flags2 & MF2_STRONGBOX)
{
Obj_AudienceThink(mobj, true);
Obj_AudienceThink(mobj, true, false);
if (P_MobjWasRemoved(mobj))
return false;
}
@ -10808,7 +10808,9 @@ void P_SceneryThinker(mobj_t *mobj)
if (mobj->type == MT_RANDOMAUDIENCE)
{
Obj_AudienceThink(mobj, !!(mobj->flags2 & MF2_AMBUSH));
Obj_AudienceThink(mobj, !!(mobj->flags2 & MF2_AMBUSH), !!(mobj->flags2 & MF2_DONTRESPAWN));
if (P_MobjWasRemoved(mobj))
return;
}
}