diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 57bc4c1f0..30dfc6487 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5118,7 +5118,7 @@ static INT16 Consistancy(void) mo = (mobj_t *)th; - if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | 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 | MF_STICKY)) { ret -= mo->type; ret += mo->x; diff --git a/src/deh_tables.c b/src/deh_tables.c index 8e7721317..acf7eae4e 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -123,6 +123,7 @@ const char *const MOBJFLAG_LIST[] = { "SPRING", "MONITOR", "NOTHINK", + "FIRE", "NOCLIPHEIGHT", "ENEMY", "SCENERY", diff --git a/src/p_inter.c b/src/p_inter.c index 7957ca226..902168f96 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -239,6 +239,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_DamageMobj(toucher, special, special, 1, DMG_NORMAL); return; } + else if (special->flags & MF_FIRE) + { + P_DamageMobj(toucher, special, special, 1, DMG_NORMAL); + return; + } else { // We now identify by object type, not sprite! Tails 04-11-2001 diff --git a/src/p_map.c b/src/p_map.c index 78f885314..b04762828 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -612,6 +612,8 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (tm.thing->player && tm.thing->flags & MF_SHOOTABLE && thing->health > 0) { UINT32 damagetype = (tm.thing->info->mass & DMG_TYPEMASK); + if (!damagetype && thing->flags & MF_FIRE) // BURN! + damagetype = DMG_NORMAL; P_DamageMobj(tm.thing, thing, thing, 1, damagetype); } return BMIT_CONTINUE; @@ -626,6 +628,8 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (thing->player && thing->flags & MF_SHOOTABLE && tm.thing->health > 0) { UINT32 damagetype = (tm.thing->info->mass & DMG_TYPEMASK); + if (!damagetype && tm.thing->flags & MF_FIRE) // BURN! + damagetype = DMG_NORMAL; P_DamageMobj(thing, tm.thing, tm.thing, 1, damagetype); } return BMIT_CONTINUE; diff --git a/src/p_mobj.c b/src/p_mobj.c index 1597642af..f62ef15d1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6349,6 +6349,15 @@ static boolean P_MobjPushableThink(mobj_t *mobj) { P_MobjCheckWater(mobj); P_PushableThinker(mobj); + + // Extinguish fire objects in water. (Yes, it's extraordinarily rare to have a pushable flame object, but Brak uses such a case.) + if ((mobj->flags & MF_FIRE) && !(mobj->eflags & MFE_TOUCHLAVA) + && (mobj->eflags & (MFE_UNDERWATER | MFE_TOUCHWATER))) + { + P_KillMobj(mobj, NULL, NULL, 0); + return false; + } + return true; } @@ -8400,6 +8409,13 @@ static boolean P_MobjRegularThink(mobj_t *mobj) default: // check mobj against possible water content, before movement code P_MobjCheckWater(mobj); + // Extinguish fire objects in water + if ((mobj->flags & MF_FIRE) && !(mobj->eflags & MFE_TOUCHLAVA) + && (mobj->eflags & (MFE_UNDERWATER|MFE_TOUCHWATER))) + { + P_KillMobj(mobj, NULL, NULL, 0); + return false; + } break; } return true; diff --git a/src/p_mobj.h b/src/p_mobj.h index 54eba24d3..cd4eea08b 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -141,31 +141,32 @@ typedef enum MF_MONITOR = 1<<17, // Don't run the thinker for this object. MF_NOTHINK = 1<<18, + // Fire object. Doesn't harm if you have fire shield. + MF_FIRE = 1<<19, // Don't adjust z if below or above floorz/ceilingz - MF_NOCLIPHEIGHT = 1<<19, + MF_NOCLIPHEIGHT = 1<<20, // This mobj is an enemy! - MF_ENEMY = 1<<20, + MF_ENEMY = 1<<21, // Scenery (uses scenery thinker). - MF_SCENERY = 1<<21, + MF_SCENERY = 1<<22, // Painful (shit hurts). - MF_PAIN = 1<<22, + MF_PAIN = 1<<23, // This mobj will stick to any surface or solid object it touches. - MF_STICKY = 1<<23, + MF_STICKY = 1<<24, // Object uses terrain effects. (Overlays, footsteps, etc) - MF_APPLYTERRAIN = 1<<24, + MF_APPLYTERRAIN = 1<<25, // for chase camera, don't be blocked by things (partial clipping) - MF_NOCLIPTHING = 1<<25, + MF_NOCLIPTHING = 1<<26, // Missile bounces like a grenade. - MF_GRENADEBOUNCE = 1<<26, + MF_GRENADEBOUNCE = 1<<27, // Run the action thinker on spawn. - MF_RUNSPAWNFUNC = 1<<27, + MF_RUNSPAWNFUNC = 1<<28, // Don't remap in Encore mode. (Not a drawflag so that it's settable by mobjinfo.) - MF_DONTENCOREMAP = 1<<28, + MF_DONTENCOREMAP = 1<<29, // Hitbox extends just as far below as above. - MF_PICKUPFROMBELOW = 1<<29, + MF_PICKUPFROMBELOW = 1<<30, // Bounce off walls and things. - MF_BOUNCE = 1<<30, - //free = (INT32)(1U<<31), + MF_BOUNCE = 1<<31, // no more free slots, next up I suppose we can get rid of shit like MF_BOXICON? } mobjflag_t; diff --git a/src/r_bbox.c b/src/r_bbox.c index 0f578de68..e85ea78f7 100644 --- a/src/r_bbox.c +++ b/src/r_bbox.c @@ -242,7 +242,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_FIRE|MF_PAIN|MF_STICKY |MF_PICKUPFROMBELOW)) == 0U) { return false;