From 264e445f0c1a0476af8f1806deb098c04ed8113b Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 8 Mar 2023 19:42:21 -0800 Subject: [PATCH] Add MF2_ALREADYHIT; don't deal damage for multiple wombos within the same tic These wombos still create hitlag. --- src/deh_tables.c | 2 +- src/p_inter.c | 7 +++++++ src/p_mobj.c | 2 ++ src/p_mobj.h | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 9cae9323e..57ef8d885 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5730,7 +5730,7 @@ const char *const MOBJFLAG2_LIST[] = { "JUSTATTACKED", // can be pushed by other moving mobjs "FIRING", // turret fire "SUPERFIRE", // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. - "\x01", // free: 1<<20 (name un-matchable) + "ALREADYHIT", // This object was already damaged THIS tic, resets even during hitlag "STRONGBOX", // Flag used for "strong" random monitors. "OBJECTFLIP", // Flag for objects that always have flipped gravity. "SKULLFLY", // Special handling: skull in flight. diff --git a/src/p_inter.c b/src/p_inter.c index 7e5cc68ae..7d558c882 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2272,6 +2272,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_DoInstashield(player); return false; } + else if (target->flags2 & MF2_ALREADYHIT) // do not deal extra damage in the same tic + { + K_SetHitLagForObjects(target, inflictor, laglength, true); + return false; + } } } @@ -2452,6 +2457,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_SetHitLagForObjects(target, inflictor, laglength, true); + target->flags2 |= MF2_ALREADYHIT; + if (target->health <= 0) { P_KillMobj(target, inflictor, source, damagetype); diff --git a/src/p_mobj.c b/src/p_mobj.c index c5d70ead5..906d95cc5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9844,6 +9844,8 @@ void P_MobjThinker(mobj_t *mobj) if ((mobj->flags & MF_BOSS) && mobj->spawnpoint && (bossdisabled & (1<spawnpoint->args[0]))) return; + mobj->flags2 &= ~(MF2_ALREADYHIT); + // Don't run any thinker code while in hitlag if ((mobj->player ? mobj->hitlag - mobj->player->nullHitlag : mobj->hitlag) > 0) { diff --git a/src/p_mobj.h b/src/p_mobj.h index d5dc67a3e..429f48812 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -191,7 +191,7 @@ typedef enum MF2_JUSTATTACKED = 1<<16, // can be pushed by other moving mobjs MF2_FIRING = 1<<17, // turret fire MF2_SUPERFIRE = 1<<18, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. - // free: 1<<19 + MF2_ALREADYHIT = 1<<19, // This object was already damaged THIS tic, resets even during hitlag MF2_STRONGBOX = 1<<20, // Flag used for "strong" random monitors. MF2_OBJECTFLIP = 1<<21, // Flag for objects that always have flipped gravity. MF2_SKULLFLY = 1<<22, // Special handling: skull in flight.