From 6a91335841b1ee1e45b94fe31a4c4af56ab99e47 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Thu, 30 Aug 2012 04:01:50 +0000 Subject: [PATCH] - Turned A_Explode's affectsource parameter into a flags parameter and added XF_NOTMISSILE and RTF_NOTMISSILE so that you can use A_Explode and A_RadiusThrust with non-missiles without them telling P_RadiusAttack() that the target is the source. SVN r3860 (trunk) --- src/fragglescript/t_func.cpp | 2 +- src/g_doom/a_archvile.cpp | 2 +- src/g_doom/a_fatso.cpp | 2 +- src/g_heretic/a_hereticartifacts.cpp | 2 +- src/g_heretic/a_hereticmisc.cpp | 2 +- src/g_hexen/a_flechette.cpp | 2 +- src/g_strife/a_strifestuff.cpp | 2 +- src/g_strife/a_strifeweapons.cpp | 2 +- src/g_strife/a_thingstoblowup.cpp | 2 +- src/p_enemy.cpp | 2 +- src/p_local.h | 9 +++++++- src/p_map.cpp | 24 +++++++++++++------- src/thingdef/thingdef_codeptr.cpp | 34 ++++++++++++++++------------ wadsrc/static/actors/actor.txt | 4 ++-- wadsrc/static/actors/constants.txt | 5 ++++ 15 files changed, 60 insertions(+), 36 deletions(-) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 058741401..946114520 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -3367,7 +3367,7 @@ void FParser::SF_RadiusAttack() if (spot && source) { - P_RadiusAttack(spot, source, damage, damage, NAME_None, true); + P_RadiusAttack(spot, source, damage, damage, NAME_None, RADF_HURTSOURCE); } } } diff --git a/src/g_doom/a_archvile.cpp b/src/g_doom/a_archvile.cpp index 53e0ea202..2bd65b7a0 100644 --- a/src/g_doom/a_archvile.cpp +++ b/src/g_doom/a_archvile.cpp @@ -136,7 +136,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_VileAttack) target->y - FixedMul (24*FRACUNIT, finesine[an]), target->z); - P_RadiusAttack (fire, self, blastdmg, blastrad, dmgtype, false); + P_RadiusAttack (fire, self, blastdmg, blastrad, dmgtype, 0); } target->velz = Scale(thrust, 1000, target->Mass); } diff --git a/src/g_doom/a_fatso.cpp b/src/g_doom/a_fatso.cpp index 2a824a072..066e60468 100644 --- a/src/g_doom/a_fatso.cpp +++ b/src/g_doom/a_fatso.cpp @@ -141,7 +141,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Mushroom) if (n == 0) n = self->Damage; // GetMissileDamage (0, 1); if (spawntype == NULL) spawntype = PClass::FindClass("FatShot"); - P_RadiusAttack (self, self->target, 128, 128, self->DamageType, !(flags & MSF_DontHurt)); + P_RadiusAttack (self, self->target, 128, 128, self->DamageType, (flags & MSF_DontHurt) ? 0 : RADF_HURTSOURCE); P_CheckSplash(self, 128<z += 32*FRACUNIT; self->RenderStyle = STYLE_Add; self->alpha = FRACUNIT; - P_RadiusAttack (self, self->target, 128, 128, self->DamageType, true); + P_RadiusAttack (self, self->target, 128, 128, self->DamageType, RADF_HURTSOURCE); P_CheckSplash(self, 128<z += 28*FRACUNIT; //self->velz = 3*FRACUNIT; } - P_RadiusAttack (self, self->target, 25, 25, NAME_Fire, true); + P_RadiusAttack (self, self->target, 25, 25, NAME_Fire, RADF_HURTSOURCE); for (i = 0; i < 4; i++) { tiny = Spawn("VolcanoTBlast", self->x, self->y, self->z, ALLOW_REPLACE); diff --git a/src/g_hexen/a_flechette.cpp b/src/g_hexen/a_flechette.cpp index 97f98f1df..5c28b8358 100644 --- a/src/g_hexen/a_flechette.cpp +++ b/src/g_hexen/a_flechette.cpp @@ -420,7 +420,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_PoisonBagDamage) { int bobIndex; - P_RadiusAttack (self, self->target, 4, 40, self->DamageType, true); + P_RadiusAttack (self, self->target, 4, 40, self->DamageType, RADF_HURTSOURCE); bobIndex = self->special2; self->z += finesine[bobIndex << BOBTOFINESHIFT] >> 1; self->special2 = (bobIndex + 1) & 63; diff --git a/src/g_strife/a_strifestuff.cpp b/src/g_strife/a_strifestuff.cpp index 41e21f755..d51b618b7 100644 --- a/src/g_strife/a_strifestuff.cpp +++ b/src/g_strife/a_strifestuff.cpp @@ -683,7 +683,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_DropFire) { AActor *drop = Spawn("FireDroplet", self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE); drop->velz = -FRACUNIT; - P_RadiusAttack (self, self, 64, 64, NAME_Fire, false); + P_RadiusAttack (self, self, 64, 64, NAME_Fire, 0); } DEFINE_ACTION_FUNCTION(AActor, A_CrispyPlayer) diff --git a/src/g_strife/a_strifeweapons.cpp b/src/g_strife/a_strifeweapons.cpp index 596e91e07..8fa71304b 100644 --- a/src/g_strife/a_strifeweapons.cpp +++ b/src/g_strife/a_strifeweapons.cpp @@ -567,7 +567,7 @@ int APhosphorousFire::DoSpecialDamage (AActor *target, int damage, FName damaget DEFINE_ACTION_FUNCTION(AActor, A_BurnArea) { - P_RadiusAttack (self, self->target, 128, 128, self->DamageType, true); + P_RadiusAttack (self, self->target, 128, 128, self->DamageType, RADF_HURTSOURCE); } DEFINE_ACTION_FUNCTION(AActor, A_Burnination) diff --git a/src/g_strife/a_thingstoblowup.cpp b/src/g_strife/a_thingstoblowup.cpp index 9727bccd1..7d2c1ceee 100644 --- a/src/g_strife/a_thingstoblowup.cpp +++ b/src/g_strife/a_thingstoblowup.cpp @@ -69,7 +69,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_ExtraLightOff) DEFINE_ACTION_FUNCTION(AActor, A_Explode512) { - P_RadiusAttack (self, self->target, 512, 512, NAME_None, true); + P_RadiusAttack (self, self->target, 512, 512, NAME_None, RADF_HURTSOURCE); if (self->target != NULL && self->target->player != NULL) { self->target->player->extralight = 5; diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 3494792e6..a0367123a 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -3161,7 +3161,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Die) DEFINE_ACTION_FUNCTION(AActor, A_Detonate) { int damage = self->GetMissileDamage (0, 1); - P_RadiusAttack (self, self->target, damage, damage, self->DamageType, true); + P_RadiusAttack (self, self->target, damage, damage, self->DamageType, RADF_HURTSOURCE); P_CheckSplash(self, damage<x, bombspot->y, bombdistance<flags3 & MF3_NORADIUSDMG && !(bombspot->flags4 & MF4_FORCERADIUSDMG)) continue; - if (!DamageSource && (thing == bombsource || thing == bombspot)) + if (!(flags & RADF_HURTSOURCE) && (thing == bombsource || thing == bombspot)) { // don't damage the source of the explosion continue; } @@ -4488,7 +4493,7 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b // them far too "active." BossBrains also use the old code // because some user levels require they have a height of 16, // which can make them near impossible to hit with the new code. - if (!bombdodamage || !((bombspot->flags5 | thing->flags5) & MF5_OLDRADIUSDMG)) + if ((flags & RADF_NODAMAGE) || !((bombspot->flags5 | thing->flags5) & MF5_OLDRADIUSDMG)) { // [RH] New code. The bounding box only covers the // height of the thing and not the height of the map. @@ -4547,14 +4552,17 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b double thrust; int damage = (int)points; - if (bombdodamage) P_DamageMobj (thing, bombspot, bombsource, damage, bombmod); - else if (thing->player == NULL && !noimpactdamage) thing->flags2 |= MF2_BLASTED; + if (!(flags & RADF_NODAMAGE)) + P_DamageMobj (thing, bombspot, bombsource, damage, bombmod); + else if (thing->player == NULL && !(flags & RADF_NOIMPACTDAMAGE)) + thing->flags2 |= MF2_BLASTED; if (!(thing->flags & MF_ICECORPSE)) { - if (bombdodamage && !(bombspot->flags3 & MF3_BLOODLESSIMPACT)) P_TraceBleed (damage, thing, bombspot); + if (!(flags & RADF_NODAMAGE) && !(bombspot->flags3 & MF3_BLOODLESSIMPACT)) + P_TraceBleed (damage, thing, bombspot); - if (!bombdodamage || !(bombspot->flags2 & MF2_NODMGTHRUST)) + if (!(flags & RADF_NODAMAGE) || !(bombspot->flags2 & MF2_NODMGTHRUST)) { if (bombsource == NULL || !(bombsource->flags2 & MF2_NODMGTHRUST)) { @@ -4575,7 +4583,7 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b angle_t ang = R_PointToAngle2 (bombspot->x, bombspot->y, thing->x, thing->y) >> ANGLETOFINESHIFT; thing->velx += fixed_t (finecosine[ang] * thrust); thing->vely += fixed_t (finesine[ang] * thrust); - if (bombdodamage) + if (!(flags & RADF_NODAMAGE)) thing->velz += (fixed_t)velz; // this really doesn't work well } } diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 372622ccf..8fe1b24ca 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -727,12 +727,18 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIfArmorType) // //========================================================================== +enum +{ + XF_HURTSOURCE = 1, + XF_NOTMISSILE = 4, +}; + DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Explode) { ACTION_PARAM_START(8); ACTION_PARAM_INT(damage, 0); ACTION_PARAM_INT(distance, 1); - ACTION_PARAM_BOOL(hurtSource, 2); + ACTION_PARAM_INT(flags, 2); ACTION_PARAM_BOOL(alert, 3); ACTION_PARAM_INT(fulldmgdistance, 4); ACTION_PARAM_INT(nails, 5); @@ -743,7 +749,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Explode) { damage = self->GetClass()->Meta.GetMetaInt (ACMETA_ExplosionDamage, 128); distance = self->GetClass()->Meta.GetMetaInt (ACMETA_ExplosionRadius, damage); - hurtSource = !self->GetClass()->Meta.GetMetaInt (ACMETA_DontHurtShooter); + flags = !self->GetClass()->Meta.GetMetaInt (ACMETA_DontHurtShooter); alert = false; } else @@ -766,7 +772,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Explode) } } - P_RadiusAttack (self, self->target, damage, distance, self->DamageType, hurtSource, true, fulldmgdistance); + P_RadiusAttack (self, self->target, damage, distance, self->DamageType, flags, fulldmgdistance); P_CheckSplash(self, distance<target != NULL && self->target->player != NULL) { @@ -775,43 +781,41 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Explode) } } -enum -{ - RTF_AFFECTSOURCE = 1, - RTF_NOIMPACTDAMAGE = 2, -}; - //========================================================================== // // A_RadiusThrust // //========================================================================== +enum +{ + RTF_AFFECTSOURCE = 1, + RTF_NOIMPACTDAMAGE = 2, + RTF_NOTMISSILE = 4, +}; + DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RadiusThrust) { ACTION_PARAM_START(3); ACTION_PARAM_INT(force, 0); ACTION_PARAM_INT(distance, 1); - ACTION_PARAM_INT(thrustFlags, 2); + ACTION_PARAM_INT(flags, 2); ACTION_PARAM_INT(fullthrustdistance, 3); - bool affectSource = !!(thrustFlags & RTF_AFFECTSOURCE); - bool noimpactdamage = !!(thrustFlags & RTF_NOIMPACTDAMAGE); - bool sourcenothrust = false; if (force <= 0) force = 128; if (distance <= 0) distance = force; // Temporarily negate MF2_NODMGTHRUST on the shooter, since it renders this function useless. - if (self->target != NULL && self->target->flags2 & MF2_NODMGTHRUST) + if (!(flags & RTF_NOTMISSILE) && self->target != NULL && self->target->flags2 & MF2_NODMGTHRUST) { sourcenothrust = true; self->target->flags2 &= ~MF2_NODMGTHRUST; } int sourceflags2 = self->target != NULL ? self->target->flags2 : 0; - P_RadiusAttack (self, self->target, force, distance, self->DamageType, affectSource, false, fullthrustdistance, noimpactdamage); + P_RadiusAttack (self, self->target, force, distance, self->DamageType, flags | RADF_NODAMAGE, fullthrustdistance); P_CheckSplash(self, distance << FRACBITS); if (sourcenothrust) diff --git a/wadsrc/static/actors/actor.txt b/wadsrc/static/actors/actor.txt index 6e40b6628..6bad67ceb 100644 --- a/wadsrc/static/actors/actor.txt +++ b/wadsrc/static/actors/actor.txt @@ -253,8 +253,8 @@ ACTOR Actor native //: Thinker action native A_CustomComboAttack(class missiletype, float spawnheight, int damage, sound meleesound = "", name damagetype = "none", bool bleed = true); action native A_Burst(class chunktype); action native A_Blast(int flags = 0, int strength = 255, int radius = 255, float speed = 20, class blasteffect = "BlastEffect", sound blastsound = "BlastRadius"); - action native A_RadiusThrust(int force = 128, int distance = -1, bool affectsource = true, int fullthrustdistance = 0); - action native A_Explode(int damage = -1, int distance = -1, bool hurtsource = true, bool alert = false, int fulldamagedistance = 0, int nails = 0, int naildamage = 10, class pufftype = "BulletPuff"); + action native A_RadiusThrust(int force = 128, int distance = -1, int flags = RTF_AFFECTSOURCE, int fullthrustdistance = 0); + action native A_Explode(int damage = -1, int distance = -1, int flags = XF_HURTSOURCE, bool alert = false, int fulldamagedistance = 0, int nails = 0, int naildamage = 10, class pufftype = "BulletPuff"); action native A_Stop(); action native A_Respawn(int flags = 1); action native A_BarrelDestroy(); diff --git a/wadsrc/static/actors/constants.txt b/wadsrc/static/actors/constants.txt index 3551cc9b1..761664308 100644 --- a/wadsrc/static/actors/constants.txt +++ b/wadsrc/static/actors/constants.txt @@ -124,9 +124,14 @@ const int MSF_Standard = 0; const int MSF_Classic = 1; const int MSF_DontHurt = 2; +// Flags for A_Explode +const int XF_HURTSOURCE = 1; +const int XF_NOTMISSILE = 4; + // Flags for A_RadiusThrust const int RTF_AFFECTSOURCE = 1; const int RTF_NOIMPACTDAMAGE = 2; +const int RTF_NOTMISSILE = 4; // Flags for A_Blast const int BF_USEAMMO = 1;