From 3033c6928b5682b5e0b303c7fa4bdcba98556a3c Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 12 Nov 2023 04:48:12 -0800 Subject: [PATCH 01/15] Remove MF_STICKY --- src/d_clisrv.c | 2 +- src/deh_tables.c | 2 +- src/p_mobj.c | 19 ------------------- src/p_mobj.h | 3 +-- src/r_bbox.c | 2 +- 5 files changed, 4 insertions(+), 24 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 2bfc47f24..d242d4e71 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5618,7 +5618,7 @@ static INT16 Consistancy(void) if (TypeIsNetSynced(mo->type) == false) continue; - if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN | MF_STICKY)) + if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN)) { ret -= mo->type; ret += mo->x; diff --git a/src/deh_tables.c b/src/deh_tables.c index 72141e85a..f7de4fa57 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5993,7 +5993,7 @@ const char *const MOBJFLAG_LIST[] = { "ENEMY", "SCENERY", "PAIN", - "STICKY", + "\x01", // free: 1<<23 (name un-matchable) "APPLYTERRAIN", "NOCLIPTHING", "GRENADEBOUNCE", diff --git a/src/p_mobj.c b/src/p_mobj.c index da1b58d8e..51ac3380e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1725,25 +1725,6 @@ void P_XYMovement(mobj_t *mo) P_ExplodeMissile(mo); return; } - else if (mo->flags & MF_STICKY) - { - S_StartSound(mo, mo->info->activesound); - mo->momx = mo->momy = mo->momz = 0; //Full stop! - mo->flags |= MF_NOGRAVITY; //Stay there! - mo->flags &= ~MF_STICKY; //Don't check again! - - // Check for hit against sky here - if (P_CheckSkyHit(mo)) - { - // Hack to prevent missiles exploding - // against the sky. - // Does not handle sky floors. - // Check frontsector as well. - - P_RemoveMobj(mo); - return; - } - } else { boolean walltransferred = false; diff --git a/src/p_mobj.h b/src/p_mobj.h index 382bfcd9e..d15269bb7 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -149,8 +149,7 @@ typedef enum MF_SCENERY = 1<<21, // Painful (shit hurts). MF_PAIN = 1<<22, - // This mobj will stick to any surface or solid object it touches. - MF_STICKY = 1<<23, + // free: 1<<23 // Object uses terrain effects. (Overlays, footsteps, etc) MF_APPLYTERRAIN = 1<<24, // for chase camera, don't be blocked by things (partial clipping) diff --git a/src/r_bbox.c b/src/r_bbox.c index 3654565a8..2e0b345c2 100644 --- a/src/r_bbox.c +++ b/src/r_bbox.c @@ -240,7 +240,7 @@ static boolean is_tangible (mobj_t *thing) // These objects probably do nothing! :D if ((thing->flags & (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE |MF_PUSHABLE|MF_BOSS|MF_MISSILE|MF_SPRING - |MF_MONITOR|MF_ENEMY|MF_PAIN|MF_STICKY + |MF_MONITOR|MF_ENEMY|MF_PAIN |MF_PICKUPFROMBELOW)) == 0U) { return false; From 39a7c3b3ad52ccd56747d2235a731373df28cbeb Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 18:57:58 -0800 Subject: [PATCH 02/15] Remove MF_MONITOR --- src/d_clisrv.c | 2 +- src/deh_tables.c | 2 +- src/g_demo.c | 2 +- src/info.c | 70 ++++++++++++++++++++++++------------------------ src/p_floor.c | 21 --------------- src/p_inter.c | 4 +-- src/p_map.c | 2 +- src/p_mobj.c | 47 -------------------------------- src/p_mobj.h | 3 +-- src/p_user.c | 3 --- src/r_bbox.c | 2 +- 11 files changed, 43 insertions(+), 115 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index d242d4e71..f030fa7b0 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5618,7 +5618,7 @@ static INT16 Consistancy(void) if (TypeIsNetSynced(mo->type) == false) continue; - if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN)) + if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_FIRE | MF_ENEMY | MF_PAIN)) { ret -= mo->type; ret += mo->x; diff --git a/src/deh_tables.c b/src/deh_tables.c index f7de4fa57..6c70886a9 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5987,7 +5987,7 @@ const char *const MOBJFLAG_LIST[] = { "SLOPE", "MISSILE", "SPRING", - "MONITOR", + "\x01", // free: 1<<17 (name un-matchable) "NOTHINK", "NOCLIPHEIGHT", "ENEMY", diff --git a/src/g_demo.c b/src/g_demo.c index 26c4e078b..3a6bd1430 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1330,7 +1330,7 @@ readghosttic: z = READFIXED(g->p); angle = READANGLE(g->p); if (!(mobjinfo[type].flags & MF_SHOOTABLE) - || !(mobjinfo[type].flags & (MF_ENEMY|MF_MONITOR)) + || !(mobjinfo[type].flags & MF_ENEMY) || health != 0 || i >= 4) // only spawn for the first 4 hits per frame, to prevent ghosts from splode-spamming too bad. continue; poof = P_SpawnMobj(x, y, z, MT_GHOST); diff --git a/src/info.c b/src/info.c index 23c3225ee..933180ec6 100644 --- a/src/info.c +++ b/src/info.c @@ -9548,7 +9548,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_RING_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9575,7 +9575,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_PITY_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9602,7 +9602,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_ATTRACT_ICON,// damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9629,7 +9629,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_FORCE_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9656,7 +9656,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_ARMAGEDDON_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9683,7 +9683,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_WHIRLWIND_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9710,7 +9710,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_ELEMENTAL_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9737,7 +9737,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_SNEAKERS_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9764,7 +9764,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_INVULN_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9791,7 +9791,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_1UP_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9818,7 +9818,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_EGGMAN_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9845,7 +9845,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_MIXUP_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9872,7 +9872,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_UNKNOWN, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9899,7 +9899,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_GRAVITY_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9926,7 +9926,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_RECYCLER_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9953,7 +9953,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_SCORE1K_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -9980,7 +9980,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_SCORE10K_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -10007,7 +10007,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_FLAMEAURA_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -10034,7 +10034,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_BUBBLEWRAP_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -10061,7 +10061,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_THUNDERCOIN_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -10088,7 +10088,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_PITY_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10115,7 +10115,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_ATTRACT_ICON,// damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10142,7 +10142,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_FORCE_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10169,7 +10169,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_ARMAGEDDON_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10196,7 +10196,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_WHIRLWIND_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10223,7 +10223,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_ELEMENTAL_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10250,7 +10250,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_SNEAKERS_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10277,7 +10277,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_INVULN_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10304,7 +10304,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_EGGMAN_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10331,7 +10331,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_GRAVITY_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10358,7 +10358,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_FLAMEAURA_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10385,7 +10385,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_BUBBLEWRAP_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10412,7 +10412,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_THUNDERCOIN_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR|MF_GRENADEBOUNCE, // flags + MF_SOLID|MF_SHOOTABLE|MF_GRENADEBOUNCE, // flags S_NULL // raisestate }, @@ -10439,7 +10439,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_RING_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, @@ -10466,7 +10466,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass MT_RING_ICON, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_MONITOR, // flags + MF_SOLID|MF_SHOOTABLE, // flags S_NULL // raisestate }, diff --git a/src/p_floor.c b/src/p_floor.c index 4b96192c8..1a7f2285a 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1017,7 +1017,6 @@ static mobj_t *SearchMarioNode(msecnode_t *node) } // Ignore popped monitors, too. if (node->m_thing->health == 0 // this only really applies for monitors - || (!(node->m_thing->flags & MF_MONITOR) && (mobjinfo[node->m_thing->type].flags & MF_MONITOR)) // gold monitor support || (node->m_thing->type == MT_RANDOMITEM)) continue; // Okay, we found something valid. @@ -2344,7 +2343,6 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher) fixed_t topheight = *rover->topheight; mariothink_t *block; mobj_t *thing; - fixed_t oldx = 0, oldy = 0, oldz = 0; I_Assert(puncher != NULL); I_Assert(puncher->player != NULL); @@ -2362,7 +2360,6 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher) S_StartSound(puncher, sfx_mario1); // "Thunk!" sound - puncher is "close enough". else // Found something! { - const boolean itsamonitor = (thing->flags & MF_MONITOR) == MF_MONITOR; // create and initialize new elevator thinker block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL); @@ -2383,13 +2380,6 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher) R_CreateInterpolator_SectorPlane(&block->thinker, roversec, false); R_CreateInterpolator_SectorPlane(&block->thinker, roversec, true); - if (itsamonitor) - { - oldx = thing->x; - oldy = thing->y; - oldz = thing->z; - } - P_UnsetThingPosition(thing); thing->x = thing->old_x = sector->soundorg.x; thing->y = thing->old_y = sector->soundorg.y; @@ -2410,16 +2400,5 @@ void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher) // "Powerup rise" sound S_StartSound(puncher, sfx_mario9); // Puncher is "close enough" } - - if (itsamonitor && thing) - { - P_UnsetThingPosition(thing); - thing->x = thing->old_x = oldx; - thing->y = thing->old_y = oldy; - thing->z = thing->old_z = oldz; - thing->momx = 1; - thing->momy = 1; - P_SetThingPosition(thing); - } } } diff --git a/src/p_inter.c b/src/p_inter.c index f510cf2fa..cce3bf9c1 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1537,7 +1537,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget target->momx = target->momy = target->momz = 0; // SRB2kart - if (target->type != MT_PLAYER && !(target->flags & MF_MONITOR) + if (target->type != MT_PLAYER && !(target->type == MT_ORBINAUT || target->type == MT_ORBINAUT_SHIELD || target->type == MT_JAWZ || target->type == MT_JAWZ_SHIELD || target->type == MT_BANANA || target->type == MT_BANANA_SHIELD @@ -1630,7 +1630,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget // if killed by a player if (source && source->player) { - if (target->flags & MF_MONITOR || target->type == MT_RANDOMITEM) + if (target->type == MT_RANDOMITEM) { P_SetTarget(&target->target, source); diff --git a/src/p_map.c b/src/p_map.c index 683dd3c5d..884bd5fd7 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -4220,7 +4220,7 @@ static BlockItReturn_t PIT_RadiusAttack(mobj_t *thing) if ((bombdamagetype & DMG_CANTHURTSELF) && bombsource && thing->type == bombsource->type) // ignore the type of guys who dropped the bomb (Jetty-Syn Bomber or Skim can bomb eachother, but not themselves.) return BMIT_CONTINUE; - if ((thing->flags & (MF_MONITOR|MF_SHOOTABLE)) != MF_SHOOTABLE) + if ((thing->flags & MF_SHOOTABLE) != MF_SHOOTABLE) return BMIT_CONTINUE; dx = abs(thing->x - bombspot->x); diff --git a/src/p_mobj.c b/src/p_mobj.c index 51ac3380e..0e2fb4912 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10058,48 +10058,6 @@ static void K_MineExplodeThink(mobj_t *mobj) } } -static void P_MonitorFuseThink(mobj_t *mobj) -{ - mobj_t *newmobj; - - // Special case for ALL monitors. - // If a box's speed is nonzero, it's allowed to respawn as a WRM/SRM. - if (mobj->info->speed != 0 && (mobj->flags2 & (MF2_AMBUSH|MF2_STRONGBOX))) - { - mobjtype_t spawnchance[64]; - INT32 numchoices = 0, i = 0; - - // This define should make it a lot easier to organize and change monitor weights -#define SETMONITORCHANCES(type, strongboxamt, weakboxamt) \ -for (i = ((mobj->flags2 & MF2_STRONGBOX) ? strongboxamt : weakboxamt); i; --i) spawnchance[numchoices++] = type - - // Type SRM WRM - SETMONITORCHANCES(MT_SNEAKERS_BOX, 0, 10); // Super Sneakers - SETMONITORCHANCES(MT_INVULN_BOX, 2, 0); // Invincibility - SETMONITORCHANCES(MT_WHIRLWIND_BOX, 3, 8); // Whirlwind Shield - SETMONITORCHANCES(MT_ELEMENTAL_BOX, 3, 8); // Elemental Shield - SETMONITORCHANCES(MT_ATTRACT_BOX, 2, 0); // Attraction Shield - SETMONITORCHANCES(MT_FORCE_BOX, 3, 3); // Force Shield - SETMONITORCHANCES(MT_ARMAGEDDON_BOX, 2, 0); // Armageddon Shield - SETMONITORCHANCES(MT_MIXUP_BOX, 0, 1); // Teleporters - SETMONITORCHANCES(MT_RECYCLER_BOX, 0, 1); // Recycler - SETMONITORCHANCES(MT_1UP_BOX, 1, 1); // 1-Up - // ======================================= - // Total 16 32 - -#undef SETMONITORCHANCES - - i = P_RandomKey(PR_UNDEFINED, numchoices); // Gotta love those random numbers! - newmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, spawnchance[i]); - } - else - newmobj = P_SpawnMobj(mobj->x, mobj->y, mobj->z, mobj->type); - - // Transfer flags2 (ambush, strongbox, objectflip) - newmobj->flags2 = mobj->flags2; - P_RemoveMobj(mobj); // make sure they disappear -} - static boolean P_CanFlickerFuse(mobj_t *mobj) { switch (mobj->type) @@ -10148,11 +10106,6 @@ static boolean P_FuseThink(mobj_t *mobj) if (LUA_HookMobj(mobj, MOBJ_HOOK(MobjFuse)) || P_MobjWasRemoved(mobj)) ; - else if (mobj->info->flags & MF_MONITOR) - { - P_MonitorFuseThink(mobj); - return false; - } else switch (mobj->type) { // gargoyle and snowman handled in P_PushableThinker, not here diff --git a/src/p_mobj.h b/src/p_mobj.h index d15269bb7..435bc9235 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -137,8 +137,7 @@ typedef enum MF_MISSILE = 1<<15, // Item is a spring. MF_SPRING = 1<<16, - // Item box - MF_MONITOR = 1<<17, + // free: 1<<17 // Don't run the thinker for this object. MF_NOTHINK = 1<<18, // Don't adjust z if below or above floorz/ceilingz diff --git a/src/p_user.c b/src/p_user.c index acf119d35..cab3659dd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2709,9 +2709,6 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius) if (!(mo->flags & MF_SHOOTABLE) && (mo->type != MT_SPB)) // Don't want to give SPB MF_SHOOTABLE, to ensure it's undamagable through other means continue; - if (mo->flags & MF_MONITOR) - continue; // Monitors cannot be 'nuked'. - if (abs(inflictor->x - mo->x) > radius || abs(inflictor->y - mo->y) > radius || abs(inflictor->z - mo->z) > radius) continue; // Workaround for possible integer overflow in the below -Red diff --git a/src/r_bbox.c b/src/r_bbox.c index 2e0b345c2..ed6c54988 100644 --- a/src/r_bbox.c +++ b/src/r_bbox.c @@ -240,7 +240,7 @@ static boolean is_tangible (mobj_t *thing) // These objects probably do nothing! :D if ((thing->flags & (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE |MF_PUSHABLE|MF_BOSS|MF_MISSILE|MF_SPRING - |MF_MONITOR|MF_ENEMY|MF_PAIN + |MF_ENEMY|MF_PAIN |MF_PICKUPFROMBELOW)) == 0U) { return false; From b4d7740dab08066102e27124d456a05281935b8c Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 00:46:08 -0800 Subject: [PATCH 03/15] MT_ITEMCLASH: additive and 2x scale --- src/info.c | 12 ++++++------ src/p_mobj.c | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/info.c b/src/info.c index 933180ec6..449798758 100644 --- a/src/info.c +++ b/src/info.c @@ -4815,12 +4815,12 @@ state_t states[NUMSTATES] = {SPR_FLEN, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_FLINGENERGY3}, // S_FLINGENERGY2, {SPR_FLEN, FF_FULLBRIGHT|2, 3, {NULL}, 0, 0, S_NULL}, // S_FLINGENERGY3, - {SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30, 2, {A_PlayActiveSound}, 0, 0, S_CLASH2}, // S_CLASH1 - {SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|1, 2, {NULL}, 0, 0, S_CLASH3}, // S_CLASH2 - {SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|2, 2, {NULL}, 0, 0, S_CLASH4}, // S_CLASH3 - {SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|3, 2, {NULL}, 0, 0, S_CLASH5}, // S_CLASH4 - {SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|4, 2, {NULL}, 0, 0, S_CLASH6}, // S_CLASH5 - {SPR_CLAS, FF_FULLBRIGHT|FF_TRANS30|5, 2, {NULL}, 0, 0, S_NULL}, // S_CLASH6 + {SPR_CLAS, FF_FULLBRIGHT|FF_ADD, 2, {A_PlayActiveSound}, 0, 0, S_CLASH2}, // S_CLASH1 + {SPR_CLAS, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_CLASH3}, // S_CLASH2 + {SPR_CLAS, FF_FULLBRIGHT|FF_ADD|2, 2, {NULL}, 0, 0, S_CLASH4}, // S_CLASH3 + {SPR_CLAS, FF_FULLBRIGHT|FF_ADD|3, 2, {NULL}, 0, 0, S_CLASH5}, // S_CLASH4 + {SPR_CLAS, FF_FULLBRIGHT|FF_ADD|4, 2, {NULL}, 0, 0, S_CLASH6}, // S_CLASH5 + {SPR_CLAS, FF_FULLBRIGHT|FF_ADD|5, 2, {NULL}, 0, 0, S_NULL}, // S_CLASH6 {SPR_PSHW, FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_FIREDITEM2}, // S_FIREDITEM1 {SPR_PSHW, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_FIREDITEM3}, // S_FIREDITEM2 diff --git a/src/p_mobj.c b/src/p_mobj.c index 0e2fb4912..e4ac1f209 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10760,6 +10760,8 @@ fixed_t P_GetMobjDefaultScale(mobj_t *mobj) { switch(mobj->type) { + case MT_ITEMCLASH: + return 2*FRACUNIT; case MT_SPECIALSTAGEARCH: return 5*FRACUNIT; case MT_SPECIALSTAGEBOMB: From e1e5c304bcee78984d8aa8c579cf3745780b5f3c Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 00:50:44 -0800 Subject: [PATCH 04/15] Flame jets: scale momentum to map scale --- src/p_mobj.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index e4ac1f209..5db1ca1ef 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5679,12 +5679,12 @@ static void P_FlameJetSceneryThink(mobj_t *mobj) flame->angle = mobj->angle; if (mobj->flags2 & MF2_AMBUSH) // Wave up and down instead of side-to-side - flame->momz = mobj->fuse << (FRACBITS - 2); + flame->momz = (mobj->fuse * mapobjectscale) / 4; else flame->angle += FixedAngle(mobj->fuse<movedir; + strength = 20*mapobjectscale; + strength -= ((20*mapobjectscale)/16)*mobj->movedir; P_InstaThrust(flame, flame->angle, strength); S_StartSound(flame, sfx_fire); @@ -5714,8 +5714,8 @@ static void P_VerticalFlameJetSceneryThink(mobj_t *mobj) flame = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_FLAMEJETFLAME); - strength = 20*FRACUNIT; - strength -= ((20*FRACUNIT)/16)*mobj->movedir; + strength = 20*mapobjectscale; + strength -= ((20*mapobjectscale)/16)*mobj->movedir; // If deaf'd, the object spawns on the ceiling. if (mobj->flags2 & MF2_AMBUSH) @@ -5729,7 +5729,7 @@ static void P_VerticalFlameJetSceneryThink(mobj_t *mobj) P_SetMobjState(flame, S_FLAMEJETFLAME7); } - P_InstaThrust(flame, mobj->angle, FixedDiv(mobj->fuse*FRACUNIT, 3*FRACUNIT)); + P_InstaThrust(flame, mobj->angle, (mobj->fuse * mapobjectscale) / 3); S_StartSound(flame, sfx_fire); } From 9783c6760df590759f51f357fe9f892587c7ca4b Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 00:53:06 -0800 Subject: [PATCH 05/15] Flame jets: bigger hitbox, do not squash and stretch, 3x scale --- src/info.c | 6 +++--- src/p_mobj.c | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/info.c b/src/info.c index 449798758..43efba091 100644 --- a/src/info.c +++ b/src/info.c @@ -14618,13 +14618,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 5*FRACUNIT, // speed - 8*FRACUNIT, // radius - 8*FRACUNIT, // height + 16*FRACUNIT, // radius + 32*FRACUNIT, // height 0, // display offset DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_MISSILE|MF_PAIN, // flags + MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOSQUISH, // flags S_NULL // raisestate }, diff --git a/src/p_mobj.c b/src/p_mobj.c index 5db1ca1ef..0bdba2deb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10760,6 +10760,8 @@ fixed_t P_GetMobjDefaultScale(mobj_t *mobj) { switch(mobj->type) { + case MT_FLAMEJETFLAME: + return 3*FRACUNIT; case MT_ITEMCLASH: return 2*FRACUNIT; case MT_SPECIALSTAGEARCH: From 21e870726d10437507a11cfe32c60402b9b5fedc Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 03:13:01 -0800 Subject: [PATCH 06/15] Flame jets: do not receive hitlag --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index 43efba091..c22f351cd 100644 --- a/src/info.c +++ b/src/info.c @@ -14624,7 +14624,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOSQUISH, // flags + MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOSQUISH|MF_NOHITLAGFORME, // flags S_NULL // raisestate }, From b81b932ba971a0e88904172caada2ea8449a4e9e Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 03:14:00 -0800 Subject: [PATCH 07/15] MF_MISSILE: do not run collision against other object, if MF_PAIN was evaluated --- src/p_map.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 884bd5fd7..3b50ee1fd 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -538,6 +538,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) static BlockItReturn_t PIT_CheckThing(mobj_t *thing) { fixed_t blockdist; + boolean damage = false; if (tm.thing == NULL || P_MobjWasRemoved(tm.thing) == true) return BMIT_STOP; // func just popped our tm.thing, cannot continue. @@ -694,10 +695,12 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (P_DamageMobj(tm.thing, thing, thing, 1, damagetype) && (damagetype = (thing->info->mass>>8))) S_StartSound(thing, damagetype); - } - if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing)) - return BMIT_CONTINUE; + if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing)) + return BMIT_CONTINUE; + + damage = true; + } } else if (tm.thing->flags & MF_PAIN && thing->player) { // Painful thing splats player in the face @@ -712,10 +715,12 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (P_DamageMobj(thing, tm.thing, tm.thing, 1, damagetype) && (damagetype = (tm.thing->info->mass>>8))) S_StartSound(tm.thing, damagetype); - } - if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing)) - return BMIT_CONTINUE; + if (P_MobjWasRemoved(tm.thing) || P_MobjWasRemoved(thing)) + return BMIT_CONTINUE; + + damage = true; + } } // check for skulls slamming into things @@ -1216,7 +1221,7 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) } // missiles can hit other things - if (tm.thing->flags & MF_MISSILE) + if ((tm.thing->flags & MF_MISSILE) && !damage) // if something was already damaged, don't run this { UINT8 damagetype = (tm.thing->info->mass ^ DMG_WOMBO); From 74d1f1bfb7d5dc3d9fd0bde9d02d23e89f8777ab Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 00:54:35 -0800 Subject: [PATCH 08/15] Add MF_DONTPUNT --- src/d_clisrv.c | 2 +- src/deh_tables.c | 2 +- src/p_mobj.h | 3 ++- src/r_bbox.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index f030fa7b0..dc6b93bc8 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5618,7 +5618,7 @@ static INT16 Consistancy(void) if (TypeIsNetSynced(mo->type) == false) continue; - if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_FIRE | MF_ENEMY | MF_PAIN)) + if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_FIRE | MF_ENEMY | MF_PAIN | MF_DONTPUNT)) { ret -= mo->type; ret += mo->x; diff --git a/src/deh_tables.c b/src/deh_tables.c index 6c70886a9..d521a63de 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5993,7 +5993,7 @@ const char *const MOBJFLAG_LIST[] = { "ENEMY", "SCENERY", "PAIN", - "\x01", // free: 1<<23 (name un-matchable) + "DONTPUNT", "APPLYTERRAIN", "NOCLIPTHING", "GRENADEBOUNCE", diff --git a/src/p_mobj.h b/src/p_mobj.h index 435bc9235..d469552cb 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -148,7 +148,8 @@ typedef enum MF_SCENERY = 1<<21, // Painful (shit hurts). MF_PAIN = 1<<22, - // free: 1<<23 + // Object cannot be punted by invincible players. (Default CAN be punted, if it deals damage or is solid.) + MF_DONTPUNT = 1<<23, // Object uses terrain effects. (Overlays, footsteps, etc) MF_APPLYTERRAIN = 1<<24, // for chase camera, don't be blocked by things (partial clipping) diff --git a/src/r_bbox.c b/src/r_bbox.c index ed6c54988..b828e989d 100644 --- a/src/r_bbox.c +++ b/src/r_bbox.c @@ -240,7 +240,7 @@ static boolean is_tangible (mobj_t *thing) // These objects probably do nothing! :D if ((thing->flags & (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE |MF_PUSHABLE|MF_BOSS|MF_MISSILE|MF_SPRING - |MF_ENEMY|MF_PAIN + |MF_ENEMY|MF_PAIN|MF_DONTPUNT |MF_PICKUPFROMBELOW)) == 0U) { return false; From b11f340dab163e2fd007bb70a431d663f1e715c2 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 19:20:29 -0800 Subject: [PATCH 09/15] Add MF_ELEMENTAL --- src/d_clisrv.c | 2 +- src/deh_tables.c | 2 +- src/p_mobj.h | 3 ++- src/r_bbox.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index dc6b93bc8..f1cacc833 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5618,7 +5618,7 @@ static INT16 Consistancy(void) if (TypeIsNetSynced(mo->type) == false) continue; - if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_FIRE | MF_ENEMY | MF_PAIN | MF_DONTPUNT)) + if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_ELEMENTAL | MF_FIRE | MF_ENEMY | MF_PAIN | MF_DONTPUNT)) { ret -= mo->type; ret += mo->x; diff --git a/src/deh_tables.c b/src/deh_tables.c index d521a63de..daaa3ec59 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5987,7 +5987,7 @@ const char *const MOBJFLAG_LIST[] = { "SLOPE", "MISSILE", "SPRING", - "\x01", // free: 1<<17 (name un-matchable) + "ELEMENTAL", "NOTHINK", "NOCLIPHEIGHT", "ENEMY", diff --git a/src/p_mobj.h b/src/p_mobj.h index d469552cb..61780c004 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -137,7 +137,8 @@ typedef enum MF_MISSILE = 1<<15, // Item is a spring. MF_SPRING = 1<<16, - // free: 1<<17 + // Object is elemental. If it is punted, it will evaporate. + MF_ELEMENTAL = 1<<17, // Don't run the thinker for this object. MF_NOTHINK = 1<<18, // Don't adjust z if below or above floorz/ceilingz diff --git a/src/r_bbox.c b/src/r_bbox.c index b828e989d..ce4f3d758 100644 --- a/src/r_bbox.c +++ b/src/r_bbox.c @@ -240,7 +240,7 @@ static boolean is_tangible (mobj_t *thing) // These objects probably do nothing! :D if ((thing->flags & (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE |MF_PUSHABLE|MF_BOSS|MF_MISSILE|MF_SPRING - |MF_ENEMY|MF_PAIN|MF_DONTPUNT + |MF_ELEMENTAL|MF_ENEMY|MF_PAIN|MF_DONTPUNT |MF_PICKUPFROMBELOW)) == 0U) { return false; From a8a1c14580ee735672de5235ce4a9e27b79d0703 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 00:56:19 -0800 Subject: [PATCH 10/15] mobj_t: add reappear and punt_ref members, add to savegame and Lua --- src/lua_mobjlib.c | 29 ++++++++++++++++++- src/p_mobj.c | 3 ++ src/p_mobj.h | 3 ++ src/p_saveg.c | 72 +++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 95 insertions(+), 12 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index ce4668038..51751f996 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -106,7 +106,9 @@ enum mobj_e { mobj_tid, mobj_special, mobj_args, - mobj_stringargs + mobj_stringargs, + mobj_reappear, + mobj_punt_ref, }; static const char *const mobj_opt[] = { @@ -194,6 +196,8 @@ static const char *const mobj_opt[] = { "special", "args", "stringargs", + "reappear", + "punt_ref", NULL}; #define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field]) @@ -493,6 +497,17 @@ static int mobj_get(lua_State *L) case mobj_stringargs: LUA_PushUserdata(L, mo->thing_stringargs, META_THINGSTRINGARGS); break; + case mobj_reappear: + lua_pushinteger(L, mo->reappear); + break; + case mobj_punt_ref: + if (mo->punt_ref && P_MobjWasRemoved(mo->punt_ref)) + { // don't put invalid mobj back into Lua. + P_SetTarget(&mo->punt_ref, NULL); + return 0; + } + LUA_PushUserdata(L, mo->punt_ref, META_MOBJ); + break; default: // extra custom variables in Lua memory lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); @@ -883,6 +898,18 @@ static int mobj_set(lua_State *L) return NOSET; case mobj_stringargs: return NOSET; + case mobj_reappear: + mo->reappear = luaL_checkinteger(L, 3); + break; + case mobj_punt_ref: + if (lua_isnil(L, 3)) + P_SetTarget(&mo->punt_ref, NULL); + else + { + mobj_t *punt_ref = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); + P_SetTarget(&mo->punt_ref, punt_ref); + } + break; default: lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); diff --git a/src/p_mobj.c b/src/p_mobj.c index 0bdba2deb..e781107f0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10250,6 +10250,8 @@ void P_MobjThinker(mobj_t *mobj) P_SetTarget(&mobj->hprev, NULL); if (mobj->itnext && P_MobjWasRemoved(mobj->itnext)) P_SetTarget(&mobj->itnext, NULL); + if (mobj->punt_ref && P_MobjWasRemoved(mobj->punt_ref)) + P_SetTarget(&mobj->punt_ref, NULL); if (mobj->flags & MF_NOTHINK) return; @@ -11803,6 +11805,7 @@ void P_RemoveMobj(mobj_t *mobj) } P_SetTarget(&mobj->itnext, NULL); + P_SetTarget(&mobj->punt_ref, NULL); P_RemoveThingTID(mobj); P_DeleteMobjStringArgs(mobj); diff --git a/src/p_mobj.h b/src/p_mobj.h index 61780c004..96f6aa5bb 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -437,6 +437,9 @@ struct mobj_t boolean frozen; + tic_t reappear; + mobj_t *punt_ref; + // WARNING: New fields must be added separately to savegame and Lua. }; diff --git a/src/p_saveg.c b/src/p_saveg.c index fad0ce24c..ef09120d7 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2668,9 +2668,16 @@ typedef enum MD2_FROZEN = 1<<28, MD2_TERRAIN = 1<<29, MD2_WATERSKIP = 1<<30, - MD2_LIGHTLEVEL = (INT32)(1U<<31), + MD2_MORE = (INT32)(1U<<31), } mobj_diff2_t; +typedef enum +{ + MD3_LIGHTLEVEL = 1, + MD3_REAPPEAR = 1<<1, + MD3_PUNT_REF = 1<<2, +} mobj_diff3_t; + typedef enum { tc_mobj, @@ -2781,12 +2788,14 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 const mobj_t *mobj = (const mobj_t *)th; UINT32 diff; UINT32 diff2; + UINT32 diff3; size_t j; if (TypeIsNetSynced(mobj->type) == false) return; diff2 = 0; + diff3 = 0; if (mobj->spawnpoint) { @@ -2968,8 +2977,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 || (slope->normal.z != FRACUNIT)) diff2 |= MD2_FLOORSPRITESLOPE; } - if (mobj->lightlevel) - diff2 |= MD2_LIGHTLEVEL; if (mobj->hitlag) diff2 |= MD2_HITLAG; if (mobj->waterskip) @@ -2987,6 +2994,16 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 if (mobj->terrain != NULL || mobj->terrainOverlay != NULL) diff2 |= MD2_TERRAIN; + if (mobj->lightlevel) + diff3 |= MD3_LIGHTLEVEL; + if (mobj->reappear) + diff3 |= MD3_REAPPEAR; + if (mobj->punt_ref) + diff3 |= MD3_PUNT_REF; + + if (diff3 != 0) + diff2 |= MD2_MORE; + if (diff2 != 0) diff |= MD_MORE; @@ -2998,6 +3015,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 WRITEUINT32(save->p, diff); if (diff & MD_MORE) WRITEUINT32(save->p, diff2); + if (diff2 & MD2_MORE) + WRITEUINT32(save->p, diff3); WRITEFIXED(save->p, mobj->z); // Force this so 3dfloor problems don't arise. WRITEFIXED(save->p, mobj->floorz); @@ -3235,10 +3254,6 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 WRITEFIXED(save->p, slope->normal.y); WRITEFIXED(save->p, slope->normal.z); } - if (diff2 & MD2_LIGHTLEVEL) - { - WRITEINT16(save->p, mobj->lightlevel); - } if (diff2 & MD2_HITLAG) { WRITEINT32(save->p, mobj->hitlag); @@ -3261,6 +3276,19 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 WRITEUINT32(save->p, SaveMobjnum(mobj->terrainOverlay)); } + if (diff3 & MD3_LIGHTLEVEL) + { + WRITEINT16(save->p, mobj->lightlevel); + } + if (diff3 & MD3_REAPPEAR) + { + WRITEUINT32(save->p, mobj->reappear); + } + if (diff3 & MD3_PUNT_REF) + { + WRITEUINT32(save->p, mobj->punt_ref->mobjnum); + } + WRITEUINT32(save->p, mobj->mobjnum); } @@ -4134,6 +4162,7 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) mobj_t *mobj; UINT32 diff; UINT32 diff2; + UINT32 diff3; INT32 i; fixed_t z, floorz, ceilingz; ffloor_t *floorrover = NULL, *ceilingrover = NULL; @@ -4145,6 +4174,11 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) else diff2 = 0; + if (diff2 & MD2_MORE) + diff3 = READUINT32(save->p); + else + diff3 = 0; + z = READFIXED(save->p); // Force this so 3dfloor problems don't arise. floorz = READFIXED(save->p); ceilingz = READFIXED(save->p); @@ -4470,10 +4504,6 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) P_UpdateSlopeLightOffset(slope); } - if (diff2 & MD2_LIGHTLEVEL) - { - mobj->lightlevel = READINT16(save->p); - } if (diff2 & MD2_HITLAG) { mobj->hitlag = READINT32(save->p); @@ -4500,6 +4530,19 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) mobj->terrain = NULL; } + if (diff3 & MD3_LIGHTLEVEL) + { + mobj->lightlevel = READINT16(save->p); + } + if (diff3 & MD3_REAPPEAR) + { + mobj->reappear = READUINT32(save->p); + } + if (diff3 & MD3_PUNT_REF) + { + mobj->punt_ref = (mobj_t *)(size_t)READUINT32(save->p); + } + // set sprev, snext, bprev, bnext, subsector P_SetThingPosition(mobj); @@ -5539,6 +5582,13 @@ static void P_RelinkPointers(void) if (!P_SetTarget(&mobj->terrainOverlay, P_FindNewPosition(temp))) CONS_Debug(DBG_GAMELOGIC, "terrainOverlay not found on %d\n", mobj->type); } + if (mobj->punt_ref) + { + temp = (UINT32)(size_t)mobj->punt_ref; + mobj->punt_ref = NULL; + if (!P_SetTarget(&mobj->punt_ref, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "punt_ref not found on %d\n", mobj->type); + } } for (i = 0; i < MAXPLAYERS; i++) From 61cad641bb8b11ab90efd2a5eb231455d8672bc3 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 01:04:55 -0800 Subject: [PATCH 11/15] Invincible player punts hazardous/solid things, unless MF_ELEMENTAL If player is in one of these states: - Invincibility - Grow (K_IsBigger) - Flame Shield dash - Over 200% speed And the other object: - Does not have MF_DONTPUNT Then, touching a solid object: - Punts the object, unless the object has MF_ELEMENTAL - Fizzles the object, if the object has MF_ELEMENTAL Or, when an object damages the player: - That object is punted, unless it has MF_ELEMENTAL - The object fizzles, if it has MF_ELEMENTAL Punting means: - A copy of the object is made - Both the player and copy receive 5 tics of hitlag - The copy is thrust away from the player at a minimum of 60 FU, or 2x either the player's or object's momentum, whichever is ultimately greater - The copy despawns after 2 seconds - The copy flickers constantly, while thrust away Fizzling means: - The object disappears completely - A puff of smoke is spawned in place of the object - No hitlag is applied to the player Both punting and fizzling: - Hide the original object (intangible and invisible) - The original object reppears after 30 seconds - For 2 seconds before reappearing, the object flickers back in, but is still intangible --- src/k_collide.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++++++ src/k_collide.h | 3 ++ src/k_kart.c | 30 +++++++++++++ src/k_kart.h | 3 ++ src/p_inter.c | 9 ++++ src/p_local.h | 2 + src/p_map.c | 12 ++++- src/p_mobj.c | 6 +++ src/p_mobj.h | 5 +++ src/p_user.c | 3 ++ src/r_things.cpp | 6 +++ src/s_sound.c | 3 ++ 12 files changed, 192 insertions(+), 2 deletions(-) diff --git a/src/k_collide.cpp b/src/k_collide.cpp index 0b78db526..76917d2b5 100644 --- a/src/k_collide.cpp +++ b/src/k_collide.cpp @@ -18,6 +18,7 @@ #include "k_podium.h" #include "k_powerup.h" #include "k_hitlag.h" +#include "m_random.h" angle_t K_GetCollideAngle(mobj_t *t1, mobj_t *t2) { @@ -1170,3 +1171,114 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return false; } + +void K_PuntHazard(mobj_t *t1, mobj_t *t2) +{ + // TODO: spawn a unique mobjtype other than MT_GHOST + mobj_t *img = P_SpawnGhostMobj(t1); + + K_MakeObjectReappear(t1); + + img->flags &= ~MF_NOGRAVITY; + img->renderflags = t1->renderflags & ~RF_DONTDRAW; + img->extravalue1 = 1; + img->extravalue2 = 2; + img->fuse = 2*TICRATE; + + struct Vector + { + fixed_t x_, y_, z_; + fixed_t h_ = FixedHypot(x_, y_); + fixed_t speed_ = std::max(60 * mapobjectscale, FixedHypot(h_, z_) * 2); + + explicit Vector(fixed_t x, fixed_t y, fixed_t z) : x_(x), y_(y), z_(z) {} + explicit Vector(const mobj_t* mo) : + Vector(std::max( + Vector(mo->x - mo->old_x, mo->y - mo->old_y, mo->z - mo->old_z), + Vector(mo->momx, mo->momy, mo->momz) + )) + { + } + explicit Vector(const Vector&) = default; + + bool operator<(const Vector& b) const { return speed_ < b.speed_; } + + void invert() + { + x_ = -x_; + y_ = -y_; + z_ = -z_; + } + + void thrust(mobj_t* mo) const + { + angle_t yaw = R_PointToAngle2(0, 0, h_, z_); + yaw = std::max(AbsAngle(yaw), static_cast(ANGLE_11hh)) + (yaw & ANGLE_180); + + P_InstaThrust(mo, R_PointToAngle2(0, 0, x_, y_), FixedMul(speed_, FCOS(yaw))); + mo->momz = FixedMul(speed_, FSIN(yaw)); + } + }; + + Vector h_vector(t1); + Vector p_vector(t2); + + h_vector.invert(); + + std::max(h_vector, p_vector).thrust(img); + + K_DoPowerClash(img, t2); // applies hitlag + P_SpawnMobj(t2->x/2 + t1->x/2, t2->y/2 + t1->y/2, t2->z/2 + t1->z/2, MT_ITEMCLASH); +} + +boolean K_PuntCollide(mobj_t *t1, mobj_t *t2) +{ + if (t1->flags & MF_DONTPUNT) + { + return false; + } + + if (!t2->player) + { + return false; + } + + if (!K_PlayerCanPunt(t2->player)) + { + return false; + } + + if (t1->flags & MF_ELEMENTAL) + { + K_MakeObjectReappear(t1); + + // copied from MT_ITEMCAPSULE + UINT8 i; + INT16 spacing = (t1->radius >> 1) / t1->scale; + // dust effects + for (i = 0; i < 10; i++) + { + mobj_t *puff = P_SpawnMobjFromMobj( + t1, + P_RandomRange(PR_ITEM_DEBRIS, -spacing, spacing) * FRACUNIT, + P_RandomRange(PR_ITEM_DEBRIS, -spacing, spacing) * FRACUNIT, + P_RandomRange(PR_ITEM_DEBRIS, 0, 4*spacing) * FRACUNIT, + MT_SPINDASHDUST + ); + + puff->momz = puff->scale * P_MobjFlip(puff); + + P_Thrust(puff, R_PointToAngle2(t2->x, t2->y, puff->x, puff->y), 3*puff->scale); + + puff->momx += t2->momx / 2; + puff->momy += t2->momy / 2; + puff->momz += t2->momz / 2; + } + } + else + { + K_PuntHazard(t1, t2); + } + + return true; +} diff --git a/src/k_collide.h b/src/k_collide.h index 84d9a324e..525e5b9c3 100644 --- a/src/k_collide.h +++ b/src/k_collide.h @@ -33,6 +33,9 @@ boolean K_SMKIceBlockCollide(mobj_t *t1, mobj_t *t2); boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2); +void K_PuntHazard(mobj_t *t1, mobj_t *t2); +boolean K_PuntCollide(mobj_t *t1, mobj_t *t2); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/k_kart.c b/src/k_kart.c index e5e07eae8..cc6137a2b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -12636,4 +12636,34 @@ boolean K_IsPlayingDisplayPlayer(player_t *player) return P_IsDisplayPlayer(player) && (!player->exiting); } +boolean K_PlayerCanPunt(player_t *player) +{ + if (player->invincibilitytimer > 0) + { + return true; + } + + if (player->flamedash > 0 && player->itemtype == KITEM_FLAMESHIELD) + { + return true; + } + + if (player->growshrinktimer > 0) + { + return true; + } + + if (player->tripwirePass >= TRIPWIRE_BLASTER && player->speed >= 2 * K_GetKartSpeed(player, false, false)) + { + return true; + } + + return false; +} + +void K_MakeObjectReappear(mobj_t *mo) +{ + (!P_MobjWasRemoved(mo->punt_ref) ? mo->punt_ref : mo)->reappear = leveltime + (30*TICRATE); +} + //} diff --git a/src/k_kart.h b/src/k_kart.h index 4ddd8b1c3..7b3d6d62c 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -245,6 +245,9 @@ void K_SetTireGrease(player_t *player, tic_t tics); boolean K_IsPlayingDisplayPlayer(player_t *player); +boolean K_PlayerCanPunt(player_t *player); +void K_MakeObjectReappear(mobj_t *mo); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_inter.c b/src/p_inter.c index cce3bf9c1..69d0c2a17 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -43,6 +43,7 @@ #include "k_hitlag.h" #include "acs/interface.h" #include "k_powerup.h" +#include "k_collide.h" // CTF player names #define CTFTEAMCODE(pl) pl->ctfteam ? (pl->ctfteam == 1 ? "\x85" : "\x84") : "" @@ -2929,6 +2930,14 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da invincible = false; } + // TODO: doing this from P_DamageMobj limits punting to objects that damage the player. + // And it may be kind of yucky. + // But this is easier than accounting for every condition in PIT_CheckThing! + if (inflictor && K_PuntCollide(inflictor, target)) + { + return false; + } + if (invincible && type != DMG_STUMBLE && type != DMG_WHUMBLE) { const INT32 oldHitlag = target->hitlag; diff --git a/src/p_local.h b/src/p_local.h index 045a59472..4cd26c9fd 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -595,6 +595,8 @@ mobj_t *P_FindMobjFromTID(mtag_t tid, mobj_t *i, mobj_t *activator); void P_DeleteMobjStringArgs(mobj_t *mobj); +tic_t P_MobjIsReappearing(const mobj_t *mobj); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_map.c b/src/p_map.c index 3b50ee1fd..9888c23c3 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -563,6 +563,10 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if ((thing->flags & MF_NOCLIPTHING) || !(thing->flags & (MF_SOLID|MF_SPECIAL|MF_PAIN|MF_SHOOTABLE|MF_SPRING))) return BMIT_CONTINUE; + // Thing is respawning + if (P_MobjIsReappearing(thing)) + return BMIT_CONTINUE; + blockdist = thing->radius + tm.thing->radius; if (abs(thing->x - tm.x) >= blockdist || abs(thing->y - tm.y) >= blockdist) @@ -1631,7 +1635,10 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (tm.thing->z + tm.thing->height < thing->z) return BMIT_CONTINUE; // underneath - K_KartSolidBounce(tm.thing, thing); + if (!K_PuntCollide(thing, tm.thing)) + { + K_KartSolidBounce(tm.thing, thing); + } return BMIT_CONTINUE; } } @@ -2346,7 +2353,8 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *re // Check things first, possibly picking things up. // MF_NOCLIPTHING: used by camera to not be blocked by things - if (!(thing->flags & MF_NOCLIPTHING)) + // Respawning things should also be intangible to other things + if (!(thing->flags & MF_NOCLIPTHING) && !P_MobjIsReappearing(thing)) { for (bx = xl; bx <= xh; bx++) { diff --git a/src/p_mobj.c b/src/p_mobj.c index e781107f0..fdb6e0f24 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -15381,3 +15381,9 @@ void P_DeleteMobjStringArgs(mobj_t *mobj) mobj->script_stringargs[i] = NULL; } } + +tic_t P_MobjIsReappearing(const mobj_t *mobj) +{ + tic_t t = (!P_MobjWasRemoved(mobj->punt_ref) ? mobj->punt_ref : mobj)->reappear; + return t - min(leveltime, t); +} diff --git a/src/p_mobj.h b/src/p_mobj.h index 96f6aa5bb..1fbb676bf 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -437,7 +437,12 @@ struct mobj_t boolean frozen; + // Object was punted and is temporarily invisible and + // intangible. This is the leveltime that it will + // reappear. tic_t reappear; + + // If punt_ref, set punt_ref->reappear, treat as if this->reappear mobj_t *punt_ref; // WARNING: New fields must be added separately to savegame and Lua. diff --git a/src/p_user.c b/src/p_user.c index cab3659dd..516bc168a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1166,6 +1166,9 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) K_ReduceVFX(ghost, mobj->player); + ghost->reappear = mobj->reappear; + P_SetTarget(&ghost->punt_ref, mobj->punt_ref); + return ghost; } diff --git a/src/r_things.cpp b/src/r_things.cpp index 0ecf02c12..deacfce92 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -3746,6 +3746,12 @@ boolean R_ThingVisible (mobj_t *thing) if (r_viewmobj && (thing == r_viewmobj || (r_viewmobj->player && r_viewmobj->player->followmobj == thing))) return false; + if (tic_t t = P_MobjIsReappearing(thing)) + { + // Flicker back in + return t <= 2*TICRATE && (leveltime & 1); + } + if ((viewssnum == 0 && (thing->renderflags & RF_DONTDRAWP1)) || (viewssnum == 1 && (thing->renderflags & RF_DONTDRAWP2)) || (viewssnum == 2 && (thing->renderflags & RF_DONTDRAWP3)) diff --git a/src/s_sound.c b/src/s_sound.c index f744b1598..33cf4c3be 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -948,6 +948,9 @@ boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 if (!listener) return false; + if (source->thinker.function.acp1 == (actionf_p1)P_MobjThinker && P_MobjIsReappearing(source)) + return false; + // Init listensource with default listener listensource.x = listener->x; listensource.y = listener->y; From a0c791706e1be2d6258eae66ca60efd1f4b5ee6a Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 01:14:22 -0800 Subject: [PATCH 12/15] MT_FLAMEJETFLAME: apply MF_ELEMENTAL --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index c22f351cd..5f4a711ff 100644 --- a/src/info.c +++ b/src/info.c @@ -14624,7 +14624,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = DMG_NORMAL, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOSQUISH|MF_NOHITLAGFORME, // flags + MF_NOGRAVITY|MF_MISSILE|MF_PAIN|MF_NOSQUISH|MF_NOHITLAGFORME|MF_ELEMENTAL, // flags S_NULL // raisestate }, From 9b86dbf8e049f74f8667a72b9294f563bb102ad6 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 01:15:05 -0800 Subject: [PATCH 13/15] MT_DAYTONAPINETREE_SIDE: set punt_ref to center object --- src/p_mobj.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index fdb6e0f24..3f4ec495a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11321,6 +11321,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->y + FINESINE((ang>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_DAYTONAPINETREE_SIDE); side->angle = ang; P_SetTarget(&side->target, mobj); + P_SetTarget(&side->punt_ref, mobj); side->threshold = i; } break; From 97ea2eadc542d5c92c8a49f45305e48755e23dce Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 13 Nov 2023 19:35:20 -0800 Subject: [PATCH 14/15] Apply MF_DONTPUNT to MT_PLAYER, MT_INSTAWHIP and all items - MT_PLAYER - MT_INSTAWHIP - MT_BANANA - MT_BANANA_SHIELD - MT_ORBINAUT - MT_ORBINAUT_SHIELD - MT_JAWZ - MT_JAWZ_SHIELD - MT_SSMINE - MT_SSMINE_SHIELD - MT_LANDMINE - MT_DROPTARGET - MT_DROPTARGET_SHIELD - MT_BALLHOG - MT_SPB - MT_GARDENTOP - MT_SINK - MT_SINK_SHIELD - MT_GACHABOM - MT_DUELBOMB --- src/info.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/info.c b/src/info.c index 5f4a711ff..d0781ae7a 100644 --- a/src/info.c +++ b/src/info.c @@ -5742,7 +5742,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 1000, // mass MT_THOK, // damage sfx_None, // activesound - MF_SOLID|MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SOLID|MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags (statenum_t)MT_THOK // raisestate }, @@ -23111,7 +23111,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24002,7 +24002,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_peel, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24029,7 +24029,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24083,7 +24083,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_s3k96, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24110,7 +24110,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24137,7 +24137,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_s3kc0s, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24164,7 +24164,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24218,7 +24218,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_s3k5c, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24245,7 +24245,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24353,7 +24353,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 0, // mass 0, // damage sfx_s3k5c, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24380,7 +24380,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_s3k96, // activesound - MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24407,7 +24407,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SPECIAL|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SPECIAL|MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24461,7 +24461,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24515,7 +24515,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_kc64, // activesound - MF_SOLID|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags + MF_SOLID|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -24758,7 +24758,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags + MF_NOCLIPTHING|MF_DONTENCOREMAP|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -25055,7 +25055,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_s3k5c, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -25082,7 +25082,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_NOGRAVITY|MF_SCENERY|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -25136,7 +25136,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_s3k96, // activesound - MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE, // flags + MF_SHOOTABLE|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_SLOPE|MF_DONTPUNT, // flags S_NULL // raisestate }, @@ -25190,7 +25190,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 0, // mass 0, // damage sfx_None, // activesound - MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags + MF_SPECIAL|MF_DONTENCOREMAP|MF_APPLYTERRAIN|MF_DONTPUNT, // flags S_NULL // raisestate }, From ed13705ff81a29fa6c350a73bfe2f2b4eab5c1b3 Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Tue, 14 Nov 2023 02:11:22 -0500 Subject: [PATCH 15/15] Don't punt super flicky Don't punt the Super Flicky --- src/info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/info.c b/src/info.c index d0781ae7a..f82551b92 100644 --- a/src/info.c +++ b/src/info.c @@ -30433,7 +30433,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 0, // mass 0, // damage sfx_None, // activesound - MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT, // flags + MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTPUNT, // flags S_NULL // raisestate },