From 99b2cfa14715f6b470ac8531f6b396f88d24d413 Mon Sep 17 00:00:00 2001 From: Edward Richardson Date: Thu, 20 Nov 2014 18:57:40 +1300 Subject: [PATCH 1/2] Added APROP_DamageMultiply - Used with Set/GetActorProperty, adds a generic multiplier for damage a source deals. --- src/actor.h | 1 + src/p_acs.cpp | 6 ++++++ src/p_interaction.cpp | 10 ++++++++-- src/p_mobj.cpp | 13 +++++++++++-- src/version.h | 2 +- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/actor.h b/src/actor.h index 52a50b04e..f46ee7148 100644 --- a/src/actor.h +++ b/src/actor.h @@ -971,6 +971,7 @@ public: FNameNoInit DamageType; FNameNoInit DamageTypeReceived; fixed_t DamageFactor; + fixed_t DamageMultiply; FNameNoInit PainType; FNameNoInit DeathType; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 03de8b3df..cc2e0f847 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3673,6 +3673,7 @@ enum APROP_AttackZOffset = 40, APROP_StencilColor = 41, APROP_Friction = 42, + APROP_DamageMultiplier=43, }; // These are needed for ACS's APROP_RenderStyle @@ -3862,6 +3863,10 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) actor->DamageFactor = value; break; + case APROP_DamageMultiplier: + actor->DamageMultiply = value; + break; + case APROP_MasterTID: AActor *other; other = SingleActorFromTID (value, NULL); @@ -3933,6 +3938,7 @@ int DLevelScript::GetActorProperty (int tid, int property, const SDWORD *stack, case APROP_Speed: return actor->Speed; case APROP_Damage: return actor->Damage; // Should this call GetMissileDamage() instead? case APROP_DamageFactor:return actor->DamageFactor; + case APROP_DamageMultiplier: return actor->DamageMultiply; case APROP_Alpha: return actor->alpha; case APROP_RenderStyle: for (int style = STYLE_None; style < STYLE_Count; ++style) { // Check for a legacy render style that matches. diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 4ee86d82c..efed105f8 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -1065,10 +1065,16 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage, } } // Handle active damage modifiers (e.g. PowerDamage) - if (source != NULL && source->Inventory != NULL) + if (source != NULL) { int olddam = damage; - source->Inventory->ModifyDamage(olddam, mod, damage, false); + + damage = FixedMul(damage, source->DamageMultiply); + if (source->Inventory != NULL) + { + source->Inventory->ModifyDamage(olddam, mod, damage, false); + } + if (olddam != damage && damage <= 0) { // Still allow FORCEPAIN if (MustForcePain(target, inflictor)) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index c7bfcea21..39531c6ef 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -313,8 +313,16 @@ void AActor::Serialize (FArchive &arc) } arc << lastpush << lastbump << PainThreshold - << DamageFactor - << WeaveIndexXY << WeaveIndexZ + << DamageFactor; + if (SaveVersion >= 4516) + { + arc << DamageMultiply; + } + else + { + DamageMultiply = FRACUNIT; + } + arc << WeaveIndexXY << WeaveIndexZ << PoisonDamageReceived << PoisonDurationReceived << PoisonPeriodReceived << Poisoner << PoisonDamage << PoisonDuration << PoisonPeriod; if (SaveVersion >= 3235) @@ -3868,6 +3876,7 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t actor->touching_sectorlist = NULL; // NULL head of sector list // phares 3/13/98 if (G_SkillProperty(SKILLP_FastMonsters)) actor->Speed = actor->GetClass()->Meta.GetMetaFixed(AMETA_FastSpeed, actor->Speed); + actor->DamageMultiply = FRACUNIT; // set subsector and/or block links diff --git a/src/version.h b/src/version.h index f091f416a..15d01d315 100644 --- a/src/version.h +++ b/src/version.h @@ -76,7 +76,7 @@ const char *GetVersionString(); // Use 4500 as the base git save version, since it's higher than the // SVN revision ever got. -#define SAVEVER 4515 +#define SAVEVER 4516 #define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x) From e303833e5fb2db4c0c84fc8499ad2ec1ecf44f0d Mon Sep 17 00:00:00 2001 From: Edward Richardson Date: Thu, 20 Nov 2014 22:12:16 +1300 Subject: [PATCH 2/2] Inventory damage needs multiplying first --- src/p_interaction.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index efed105f8..fb947f309 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -1069,11 +1069,11 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage, { int olddam = damage; - damage = FixedMul(damage, source->DamageMultiply); if (source->Inventory != NULL) { source->Inventory->ModifyDamage(olddam, mod, damage, false); } + damage = FixedMul(damage, source->DamageMultiply); if (olddam != damage && damage <= 0) { // Still allow FORCEPAIN