From cf6a6991cbd9f1710bef5ac70739a1efa4745ab2 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 4 Nov 2018 16:28:25 -0500 Subject: [PATCH 1/4] Trigger line exec by whether mobj is facing its tracer * MFE_TRACERANGLE * Thing 758 MT_ANGLEMAN * mobj thinker behavior * Line Exec 457/458 Enable/Disable --- src/dehacked.c | 1 + src/info.c | 27 +++++++++++++++++++++++++++ src/info.h | 1 + src/p_mobj.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/p_mobj.h | 3 +++ src/p_spec.c | 35 +++++++++++++++++++++++++++++++++++ 6 files changed, 107 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index 6c39fc197..9ccefa9ce 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6937,6 +6937,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_PULL", "MT_GHOST", "MT_OVERLAY", + "MT_ANGLEMAN", "MT_POLYANCHOR", "MT_POLYSPAWN", "MT_POLYSPAWNCRUSH", diff --git a/src/info.c b/src/info.c index 3140bd7de..72abcede1 100644 --- a/src/info.c +++ b/src/info.c @@ -17814,6 +17814,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_ANGLEMAN + 758, // doomednum + S_INVISIBLE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 8, // radius + 8, // height + 0, // display offset + 10, // mass + 0, // damage + sfx_None, // activesound + MF_NOTHINK|MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + { // MT_POLYANCHOR 760, // doomednum S_INVISIBLE, // spawnstate diff --git a/src/info.h b/src/info.h index b757deec0..c9de82541 100644 --- a/src/info.h +++ b/src/info.h @@ -4305,6 +4305,7 @@ typedef enum mobj_type MT_PULL, MT_GHOST, MT_OVERLAY, + MT_ANGLEMAN, MT_POLYANCHOR, MT_POLYSPAWN, MT_POLYSPAWNCRUSH, diff --git a/src/p_mobj.c b/src/p_mobj.c index 717bb92b6..45a26cbc5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7435,6 +7435,46 @@ void P_MobjThinker(mobj_t *mobj) if ((mobj->flags & MF_ENEMY) && (mobj->state->nextstate == mobj->info->spawnstate && mobj->tics == 1)) mobj->flags2 &= ~MF2_FRET; + // Angle-to-tracer to trigger a linedef exec + // See Linedef Exec 457 (Track mobj angle to point) + if ((mobj->eflags & MFE_TRACERANGLE) && mobj->tracer && mobj->extravalue2) + { + // mobj->lastlook - Don't disable behavior after first failure + // mobj->extravalue1 - Angle tolerance + // mobj->extravalue2 - Exec tag upon failure + // mobj->cvval - Allowable failure delay + // mobj->cvmem - Failure timer + + angle_t ang = mobj->angle - R_PointToAngle2(mobj->x, mobj->y, mobj->tracer->x, mobj->tracer->y); + + // \todo account for distance between mobj and tracer + // Because closer mobjs can be facing beyond the angle tolerance + // yet tracer is still in the camera view + + // failure state: mobj is not facing tracer + // Reasaonable defaults: ANGLE_67h, ANGLE_292h + if (ang >= mobj->extravalue1 && ang <= ANGLE_MAX - mobj->extravalue1) + { + if (mobj->cvmem) + mobj->cvmem--; + else + { + P_LinedefExecute(mobj->extravalue2, mobj, NULL); + + if (mobj->lastlook) + mobj->cvmem = mobj->cusval; // reset timer for next failure + else + { + // disable after first failure + mobj->eflags &= ~MFE_TRACERANGLE; + mobj->lastlook = mobj->extravalue1 = mobj->extravalue2 = mobj->cvmem = mobj->cusval = 0; + } + } + } + else + mobj->cvmem = mobj->cusval; // reset failure timer + } + switch (mobj->type) { case MT_WALLSPIKEBASE: diff --git a/src/p_mobj.h b/src/p_mobj.h index 5c0408e1b..b80080674 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -239,6 +239,9 @@ typedef enum MFE_SPRUNG = 1<<8, // Platform movement MFE_APPLYPMOMZ = 1<<9, + // Compute and trigger on mobj angle relative to tracer + // See Linedef Exec 457 (Track mobj angle to point) + MFE_TRACERANGLE = 1<<10, // free: to and including 1<<15 } mobjeflag_t; diff --git a/src/p_spec.c b/src/p_spec.c index 9f9e80ecc..6bf20283e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3757,6 +3757,41 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_ResetColormapFader(§ors[secnum]); break; + case 457: // Track mobj angle to point + if (mo) + { + INT32 failureangle = min(max(abs(sides[line->sidenum[0]].textureoffset>>FRACBITS), 0), 360) * ANG1; + INT32 failuredelay = abs(sides[line->sidenum[0]].rowoffset>>FRACBITS); + INT32 failureexectag = line->sidenum[1] != 0xffff ? + (INT32)(sides[line->sidenum[1]].textureoffset>>FRACBITS) : 0; + boolean persist = (line->flags & ML_EFFECT2); + mobj_t *anchormo; + + if ((secnum = P_FindSectorFromLineTag(line, -1)) < 0) + return; + + anchormo = P_GetObjectTypeInSectorNum(MT_ANGLEMAN, secnum); + if (!anchormo) + return; + + mo->eflags |= MFE_TRACERANGLE; + P_SetTarget(&mo->tracer, anchormo); + mo->lastlook = persist; // don't disable behavior after first failure + mo->extravalue1 = failureangle; // angle to exceed for failure state + mo->extravalue2 = failureexectag; // exec tag for failure state (angle is not within range) + mo->cusval = mo->cvmem = failuredelay; // cusval = tics to allow failure before line trigger; cvmem = decrement timer + } + break; + + case 458: // Stop tracking mobj angle to point + if (mo) + { + mo->eflags &= ~MFE_TRACERANGLE; + P_SetTarget(&mo->tracer, NULL); + mo->lastlook = mo->cvmem = mo->cusval = mo->extravalue1 = mo->extravalue2 = 0; + } + break; + #ifdef POLYOBJECTS case 480: // Polyobj_DoorSlide case 481: // Polyobj_DoorSwing From 4fc335a26b16b7290dc274181264436ff4799d67 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 4 Nov 2018 16:48:18 -0500 Subject: [PATCH 2/4] Line 458: Only do disable operation if MFE_TRACERANGLE is set --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 6bf20283e..965e0cbe0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3784,7 +3784,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) break; case 458: // Stop tracking mobj angle to point - if (mo) + if (mo && (mo->eflags & MFE_TRACERANGLE)) { mo->eflags &= ~MFE_TRACERANGLE; P_SetTarget(&mo->tracer, NULL); From eaf89cf7b919422d0b033c54a53297026fcfd9bc Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 4 Nov 2018 17:34:00 -0500 Subject: [PATCH 3/4] TRACERANGLE: Run exec *after* resetting mobj values --- src/p_mobj.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 45a26cbc5..c9cacb444 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7459,7 +7459,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->cvmem--; else { - P_LinedefExecute(mobj->extravalue2, mobj, NULL); + INT32 exectag = mobj->extravalue2; // remember this before we erase the values if (mobj->lastlook) mobj->cvmem = mobj->cusval; // reset timer for next failure @@ -7469,6 +7469,8 @@ void P_MobjThinker(mobj_t *mobj) mobj->eflags &= ~MFE_TRACERANGLE; mobj->lastlook = mobj->extravalue1 = mobj->extravalue2 = mobj->cvmem = mobj->cusval = 0; } + + P_LinedefExecute(exectag, mobj, NULL); } } else From dbb4924348bb5eb977282ffd7aa98b49e616d21e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Tue, 13 Nov 2018 10:37:34 -0500 Subject: [PATCH 4/4] Compile errors --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index c9cacb444..faf0b27de 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7453,7 +7453,7 @@ void P_MobjThinker(mobj_t *mobj) // failure state: mobj is not facing tracer // Reasaonable defaults: ANGLE_67h, ANGLE_292h - if (ang >= mobj->extravalue1 && ang <= ANGLE_MAX - mobj->extravalue1) + if (ang >= (UINT32)mobj->extravalue1 && ang <= ANGLE_MAX - (UINT32)mobj->extravalue1) { if (mobj->cvmem) mobj->cvmem--;