diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 07d0fef2ca..5e76697ac1 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -205,7 +205,7 @@ namespace OpenRA.Traits } public interface IRenderModifier { IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r); } - public interface IDamageModifier { int GetDamageModifier(Actor attacker, DamageWarhead warhead); } + public interface IDamageModifier { int GetDamageModifier(Actor attacker, IWarhead warhead); } public interface ISpeedModifier { int GetSpeedModifier(); } public interface IFirepowerModifier { int GetFirepowerModifier(); } public interface IReloadModifier { int GetReloadModifier(); } diff --git a/OpenRA.Mods.Cnc/Traits/AttackPopupTurreted.cs b/OpenRA.Mods.Cnc/Traits/AttackPopupTurreted.cs index 805874de89..15db5c91ef 100644 --- a/OpenRA.Mods.Cnc/Traits/AttackPopupTurreted.cs +++ b/OpenRA.Mods.Cnc/Traits/AttackPopupTurreted.cs @@ -9,7 +9,6 @@ #endregion using System.Linq; -using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -101,7 +100,7 @@ namespace OpenRA.Mods.Cnc.Traits } } - public int GetDamageModifier(Actor attacker, DamageWarhead warhead) + public int GetDamageModifier(Actor attacker, IWarhead warhead) { return state == PopupState.Closed ? info.ClosedDamageMultiplier : 100; } diff --git a/OpenRA.Mods.Common/Traits/Infantry/TakeCover.cs b/OpenRA.Mods.Common/Traits/Infantry/TakeCover.cs index 46e95ac595..b84b1ce5a4 100644 --- a/OpenRA.Mods.Common/Traits/Infantry/TakeCover.cs +++ b/OpenRA.Mods.Common/Traits/Infantry/TakeCover.cs @@ -10,7 +10,7 @@ using System.Collections.Generic; using System.Linq; -using OpenRA.GameRules; +using OpenRA.Mods.Common.Warheads; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -64,7 +64,8 @@ namespace OpenRA.Mods.Common.Traits public void Damaged(Actor self, AttackInfo e) { - if (e.Damage <= 0 || e.Warhead == null || !e.Warhead.DamageTypes.Any(x => info.DamageTriggers.Contains(x))) + var warhead = e.Warhead as DamageWarhead; + if (e.Damage <= 0 || warhead == null || !warhead.DamageTypes.Any(x => info.DamageTriggers.Contains(x))) return; if (!IsProne) @@ -81,12 +82,16 @@ namespace OpenRA.Mods.Common.Traits localOffset = WVec.Zero; } - public int GetDamageModifier(Actor attacker, DamageWarhead warhead) + public int GetDamageModifier(Actor attacker, IWarhead warhead) { if (!IsProne) return 100; - var modifierPercentages = info.DamageModifiers.Where(x => warhead.DamageTypes.Contains(x.Key)).Select(x => x.Value); + var damageWh = warhead as DamageWarhead; + if (damageWh == null) + return 100; + + var modifierPercentages = info.DamageModifiers.Where(x => damageWh.DamageTypes.Contains(x.Key)).Select(x => x.Value); return Util.ApplyPercentageModifiers(100, modifierPercentages); } diff --git a/OpenRA.Mods.Common/Traits/Infantry/TerrainModifiesDamage.cs b/OpenRA.Mods.Common/Traits/Infantry/TerrainModifiesDamage.cs index a564f484de..cd4eeb4ca8 100644 --- a/OpenRA.Mods.Common/Traits/Infantry/TerrainModifiesDamage.cs +++ b/OpenRA.Mods.Common/Traits/Infantry/TerrainModifiesDamage.cs @@ -8,10 +8,9 @@ */ #endregion -using System; using System.Collections.Generic; using System.Linq; -using OpenRA.GameRules; +using OpenRA.Mods.Common.Warheads; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -42,6 +41,8 @@ namespace OpenRA.Mods.Common.Traits public class TerrainModifiesDamage : IDamageModifier { + const int FullDamage = 100; + public readonly TerrainModifiesDamageInfo Info; readonly Actor self; @@ -52,11 +53,11 @@ namespace OpenRA.Mods.Common.Traits this.self = self; } - public int GetDamageModifier(Actor attacker, DamageWarhead warhead) + public int GetDamageModifier(Actor attacker, IWarhead warhead) { - var percent = 100; - if (attacker.Owner.IsAlliedWith(self.Owner) && (warhead != null && warhead.Damage < 0) && !Info.ModifyHealing) - return percent; + var damageWh = warhead as DamageWarhead; + if (attacker.Owner.IsAlliedWith(self.Owner) && (damageWh != null && damageWh.Damage < 0) && !Info.ModifyHealing) + return FullDamage; var world = self.World; var map = world.Map; @@ -67,7 +68,7 @@ namespace OpenRA.Mods.Common.Traits var terrainType = tileSet[tileSet.GetTerrainIndex(tiles[pos])].Type; if (!Info.TerrainModifier.ContainsKey(terrainType)) - return percent; + return FullDamage; return Info.TerrainModifier[terrainType]; } diff --git a/OpenRA.Mods.Common/Traits/Invulnerable.cs b/OpenRA.Mods.Common/Traits/Invulnerable.cs index 8962b96fe7..996acb2dcc 100644 --- a/OpenRA.Mods.Common/Traits/Invulnerable.cs +++ b/OpenRA.Mods.Common/Traits/Invulnerable.cs @@ -8,7 +8,6 @@ */ #endregion -using OpenRA.GameRules; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -18,6 +17,6 @@ namespace OpenRA.Mods.Common.Traits class Invulnerable : IDamageModifier { - public int GetDamageModifier(Actor attacker, DamageWarhead warhead) { return 0; } + public int GetDamageModifier(Actor attacker, IWarhead warhead) { return 0; } } } diff --git a/OpenRA.Mods.Common/Traits/Upgrades/GainsStatUpgrades.cs b/OpenRA.Mods.Common/Traits/Upgrades/GainsStatUpgrades.cs index 9aec86e9bb..313e9a175c 100644 --- a/OpenRA.Mods.Common/Traits/Upgrades/GainsStatUpgrades.cs +++ b/OpenRA.Mods.Common/Traits/Upgrades/GainsStatUpgrades.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.Common.Traits inaccuracyLevel = newLevel.Clamp(0, info.InaccuracyModifier.Length); } - public int GetDamageModifier(Actor attacker, DamageWarhead warhead) + public int GetDamageModifier(Actor attacker, IWarhead warhead) { return damageLevel > 0 ? info.DamageModifier[damageLevel - 1] : 100; } diff --git a/OpenRA.Mods.RA/Traits/InvulnerabilityUpgrade.cs b/OpenRA.Mods.RA/Traits/InvulnerabilityUpgrade.cs index d024cf196d..26b457fc61 100644 --- a/OpenRA.Mods.RA/Traits/InvulnerabilityUpgrade.cs +++ b/OpenRA.Mods.RA/Traits/InvulnerabilityUpgrade.cs @@ -8,7 +8,6 @@ */ #endregion -using OpenRA.GameRules; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -24,7 +23,7 @@ namespace OpenRA.Mods.RA public InvulnerabilityUpgrade(InvulnerabilityUpgradeInfo info) : base(info) { } - public int GetDamageModifier(Actor attacker, DamageWarhead warhead) + public int GetDamageModifier(Actor attacker, IWarhead warhead) { return IsTraitDisabled ? 100 : 0; }