diff --git a/OpenRA.Mods.Common/Traits/Armor.cs b/OpenRA.Mods.Common/Traits/Armor.cs index 04064cd913..e637ff52a1 100644 --- a/OpenRA.Mods.Common/Traits/Armor.cs +++ b/OpenRA.Mods.Common/Traits/Armor.cs @@ -13,10 +13,16 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Used to define weapon efficiency modifiers with different percentages per Type.")] - public class ArmorInfo : TraitInfo + public class ArmorInfo : UpgradableTraitInfo { public readonly string Type = null; + + public override object Create(ActorInitializer init) { return new Armor(init.Self, this); } } - public class Armor { } + public class Armor : UpgradableTrait + { + public Armor(Actor self, ArmorInfo info) + : base(info) { } + } } \ No newline at end of file diff --git a/OpenRA.Mods.Common/Warheads/DamageWarhead.cs b/OpenRA.Mods.Common/Warheads/DamageWarhead.cs index 460d019f52..a6eb4ea6e8 100644 --- a/OpenRA.Mods.Common/Warheads/DamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/DamageWarhead.cs @@ -9,6 +9,7 @@ #endregion using System.Collections.Generic; +using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -23,7 +24,7 @@ namespace OpenRA.Mods.Common.Warheads public readonly string[] DamageTypes = new string[0]; [FieldLoader.LoadUsing("LoadVersus")] - [Desc("Damage percentage versus each armortype. 0% = can't target.")] + [Desc("Damage percentage versus each armortype.")] public readonly Dictionary Versus; public static object LoadVersus(MiniYaml yaml) @@ -34,17 +35,13 @@ namespace OpenRA.Mods.Common.Warheads : new Dictionary(); } - public int DamageVersus(ActorInfo victim) + public int DamageVersus(Actor victim) { - var armor = victim.Traits.GetOrDefault(); - if (armor != null && armor.Type != null) - { - int versus; - if (Versus.TryGetValue(armor.Type, out versus)) - return versus; - } + var armor = victim.TraitsImplementing() + .Where(a => !a.IsTraitDisabled && a.Info.Type != null && Versus.ContainsKey(a.Info.Type)) + .Select(a => Versus[a.Info.Type]); - return 100; + return Util.ApplyPercentageModifiers(100, armor); } public override void DoImpact(Target target, Actor firedBy, IEnumerable damageModifiers) @@ -60,7 +57,7 @@ namespace OpenRA.Mods.Common.Warheads public virtual void DoImpact(Actor victim, Actor firedBy, IEnumerable damageModifiers) { - var damage = Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(DamageVersus(victim.Info))); + var damage = Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(DamageVersus(victim))); victim.InflictDamage(firedBy, damage, this); } } diff --git a/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs b/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs index c1d5c5ab1f..62d252d849 100644 --- a/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs @@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Warheads return; // Damage is measured as a percentage of the target health - var damage = Util.ApplyPercentageModifiers(healthInfo.HP, damageModifiers.Append(Damage, DamageVersus(victim.Info))); + var damage = Util.ApplyPercentageModifiers(healthInfo.HP, damageModifiers.Append(Damage, DamageVersus(victim))); victim.InflictDamage(firedBy, damage, this); } }