- fixed: Hexen's poison cloud needs to call P_DamageMobj, even with a damage value of 0. Added a new flag to handle this case because normally this is not desirable.

This commit is contained in:
Christoph Oelckers 2017-02-19 23:20:09 +01:00
parent 165a980065
commit 26144340b8
4 changed files with 6 additions and 3 deletions

View file

@ -387,6 +387,7 @@ enum ActorFlag7
MF7_SPRITEANGLE = 0x02000000, // [MC] Utilize the SpriteAngle property and lock the rotation to the degrees specified. MF7_SPRITEANGLE = 0x02000000, // [MC] Utilize the SpriteAngle property and lock the rotation to the degrees specified.
MF7_SMASHABLE = 0x04000000, // dies if hitting the floor. MF7_SMASHABLE = 0x04000000, // dies if hitting the floor.
MF7_NOSHIELDREFLECT = 0x08000000, // will not be reflected by shields. MF7_NOSHIELDREFLECT = 0x08000000, // will not be reflected by shields.
MF7_FORCEZERORADIUSDMG = 0x10000000, // passes zero radius damage on to P_DamageMobj, this is necessary in some cases where DoSpecialDamage gets overrideen.
}; };
// --- mobj.renderflags --- // --- mobj.renderflags ---

View file

@ -5674,8 +5674,9 @@ int P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, int bom
} }
points *= thing->GetClass()->RDFactor; points *= thing->GetClass()->RDFactor;
double check = int(points) * bombdamage;
// points and bombdamage should be the same sign (the double cast of 'points' is needed to prevent overflows and incorrect values slipping through.) // points and bombdamage should be the same sign (the double cast of 'points' is needed to prevent overflows and incorrect values slipping through.)
if ((((double)int(points) * bombdamage) > 0) && P_CheckSight(thing, bombspot, SF_IGNOREVISIBILITY | SF_IGNOREWATERBOUNDARY)) if ((check > 0 || (check == 0 && bombspot->flags7 & MF7_FORCEZERORADIUSDMG)) && P_CheckSight(thing, bombspot, SF_IGNOREVISIBILITY | SF_IGNOREWATERBOUNDARY))
{ // OK to damage; target is in direct path { // OK to damage; target is in direct path
double vz; double vz;
double thrust; double thrust;
@ -5752,7 +5753,7 @@ int P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, int bom
double factor = splashfactor * thing->GetClass()->RDFactor; double factor = splashfactor * thing->GetClass()->RDFactor;
damage = int(damage * factor); damage = int(damage * factor);
if (damage > 0) if (damage > 0 || (bombspot->flags7 & MF7_FORCEZERORADIUSDMG))
{ {
//[MC] Don't count actors saved by buddha if already at 1 health. //[MC] Don't count actors saved by buddha if already at 1 health.
int prehealth = thing->health; int prehealth = thing->health;

View file

@ -316,6 +316,7 @@ static FFlagDef ActorFlagDefs[]=
DEFINE_FLAG(MF7, SPRITEANGLE, AActor, flags7), DEFINE_FLAG(MF7, SPRITEANGLE, AActor, flags7),
DEFINE_FLAG(MF7, SMASHABLE, AActor, flags7), DEFINE_FLAG(MF7, SMASHABLE, AActor, flags7),
DEFINE_FLAG(MF7, NOSHIELDREFLECT, AActor, flags7), DEFINE_FLAG(MF7, NOSHIELDREFLECT, AActor, flags7),
DEFINE_FLAG(MF7, FORCEZERORADIUSDMG, AActor, flags7),
// Effect flags // Effect flags
DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),

View file

@ -437,7 +437,7 @@ class PoisonCloud : Actor
Mass 0x7fffffff; Mass 0x7fffffff;
+NOBLOCKMAP +NOGRAVITY +DROPOFF +NOBLOCKMAP +NOGRAVITY +DROPOFF
+NODAMAGETHRUST +NODAMAGETHRUST
+DONTSPLASH +FOILINVUL +CANBLAST +BLOODLESSIMPACT +BLOCKEDBYSOLIDACTORS +DONTSPLASH +FOILINVUL +CANBLAST +BLOODLESSIMPACT +BLOCKEDBYSOLIDACTORS +FORCEZERORADIUSDMG
RenderStyle "Translucent"; RenderStyle "Translucent";
Alpha 0.6; Alpha 0.6;
DeathSound "PoisonShroomDeath"; DeathSound "PoisonShroomDeath";