From 164f72a6cbae1bb627ab26882b503bed046ef438 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 20 Jun 2023 12:41:42 +0100 Subject: [PATCH] "Bored" follower audience toggle (for Chaclon) - If follower audience member has a certain flag, the bob/jump height is forced to zero - UDMF: args[2] & 2 - Binary: The "Extra" flag - If a follower audience member (or MT_EMBLEM with GE_FOLLOWER) has a bob/jump height of 0, use the idlestate instead of the movement state --- src/objects/audience.c | 35 +++++++++++++++++++++-------------- src/p_mobj.c | 7 ++++++- src/p_setup.c | 6 +++++- src/p_spec.h | 6 ++++++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/objects/audience.c b/src/objects/audience.c index ca9098b2b..6cb2d8dfe 100644 --- a/src/objects/audience.c +++ b/src/objects/audience.c @@ -101,25 +101,32 @@ Obj_AudienceInit mobj->destscale = FixedMul(3*mobj->destscale, followers[followerpick].scale); P_SetScale(mobj, mobj->destscale); - audience_mainstate(mobj) = followers[followerpick].followstate; + if (mobj->flags2 & MF2_BOSSNOTRAP) + { + audience_bobamp(mobj) = 0; + } + else + { + // The following is derived from the default bobamp + if (mobj->type != MT_EMBLEM && !(mobj->flags & MF_NOGRAVITY) && followers[followerpick].bobamp < 4*FRACUNIT) + { + audience_bobamp(mobj) = 4*mobj->scale; + } + else + { + audience_bobamp(mobj) = FixedMul(mobj->scale, followers[followerpick].bobamp); + } + } + + audience_mainstate(mobj) = + audience_bobamp(mobj) != 0 + ? followers[followerpick].followstate + : followers[followerpick].idlestate; P_SetMobjState(mobj, audience_mainstate(mobj)); if (P_MobjWasRemoved(mobj)) return; - // The following is derived from the default bobamp - if (mobj->type != MT_EMBLEM && !(mobj->flags & MF_NOGRAVITY) && followers[followerpick].bobamp < 4*FRACUNIT) - { - audience_bobamp(mobj) = 4*mobj->scale; - } - else - { - audience_bobamp(mobj) = FixedMul(mobj->scale, followers[followerpick].bobamp); - } - - audience_bobspeed(mobj) = followers[followerpick].bobspeed; - audience_focusplayer(mobj) = MAXPLAYERS; - if (P_RandomChance(PR_RANDOMAUDIENCE, FRACUNIT/2)) { audience_animoffset(mobj) = 5; diff --git a/src/p_mobj.c b/src/p_mobj.c index a4aa1d128..054efcbb1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13192,11 +13192,16 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj) } case MT_RANDOMAUDIENCE: { - if (mthing->args[2] != 0) + if (mthing->args[2] & TMAUDIM_FLOAT) { mobj->flags |= MF_NOGRAVITY; } + if (mthing->args[2] & TMAUDIM_BORED) + { + mobj->flags2 |= MF2_BOSSNOTRAP; + } + if (mthing->args[3] != 0) { mobj->flags2 |= MF2_AMBUSH; diff --git a/src/p_setup.c b/src/p_setup.c index 4cf537526..c9ca10345 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -6959,7 +6959,11 @@ static void P_ConvertBinaryThingTypes(void) mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; case 1488: // Follower Audience (unfortunately numbered) - mapthings[i].args[2] = !!(mapthings[i].options & MTF_OBJECTSPECIAL); + if (mapthings[i].options & MTF_OBJECTSPECIAL) + mapthings[i].args[2] |= TMAUDIM_FLOAT; + if (mapthings[i].options & MTF_EXTRA) + mapthings[i].args[2] |= TMAUDIM_BORED; + mapthings[i].args[3] = !!(mapthings[i].options & MTF_AMBUSH); break; case 1500: //Glaregoyle diff --git a/src/p_spec.h b/src/p_spec.h index 9714d3fc8..af0b8e7fe 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -135,6 +135,12 @@ typedef enum TMWPF_FINISHLINE = 1<<3, } textmapwaypointflags_t; +typedef enum +{ + TMAUDIM_FLOAT = 1, + TMAUDIM_BORED = 1<<1, +} textmapaudiencemovementflags_t; + typedef enum { TMBCF_BACKANDFORTH = 1,