diff --git a/OpenRA.Mods.Common/Activities/Demolish.cs b/OpenRA.Mods.Common/Activities/Demolish.cs index 0204039bd2..8c5818819e 100644 --- a/OpenRA.Mods.Common/Activities/Demolish.cs +++ b/OpenRA.Mods.Common/Activities/Demolish.cs @@ -23,6 +23,7 @@ namespace OpenRA.Mods.Common.Activities readonly int flashes; readonly int flashesDelay; readonly int flashInterval; + readonly BitSet damageTypes; readonly INotifyDemolition[] notifiers; readonly EnterBehaviour enterBehaviour; @@ -30,7 +31,7 @@ namespace OpenRA.Mods.Common.Activities IDemolishable[] enterDemolishables; public Demolish(Actor self, Target target, EnterBehaviour enterBehaviour, int delay, - int flashes, int flashesDelay, int flashInterval) + int flashes, int flashesDelay, int flashInterval, BitSet damageTypes) : base(self, target, Color.Crimson) { notifiers = self.TraitsImplementing().ToArray(); @@ -38,6 +39,7 @@ namespace OpenRA.Mods.Common.Activities this.flashes = flashes; this.flashesDelay = flashesDelay; this.flashInterval = flashInterval; + this.damageTypes = damageTypes; this.enterBehaviour = enterBehaviour; } @@ -75,7 +77,7 @@ namespace OpenRA.Mods.Common.Activities ind.Demolishing(self); foreach (var d in enterDemolishables) - d.Demolish(enterActor, self, delay); + d.Demolish(enterActor, self, delay, damageTypes); if (enterBehaviour == EnterBehaviour.Dispose) self.Dispose(); diff --git a/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs index a473058466..b9b282cc69 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Scripting public void Demolish(Actor target) { Self.QueueActivity(new Demolish(Self, Target.FromActor(target), info.EnterBehaviour, info.DetonationDelay, - info.Flashes, info.FlashesDelay, info.FlashInterval)); + info.Flashes, info.FlashesDelay, info.FlashInterval, info.DamageTypes)); } } } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs index a59a8f78aa..275efb3816 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs @@ -368,7 +368,7 @@ namespace OpenRA.Mods.Common.Traits return damage; } - public void Demolish(Actor saboteur, int direction) + public void Demolish(Actor saboteur, int direction, BitSet damageTypes) { var initialDamage = health.DamageState; self.World.AddFrameEndTask(w => @@ -376,7 +376,7 @@ namespace OpenRA.Mods.Common.Traits // Use .FromPos since this actor is killed. Cannot use Target.FromActor info.DemolishWeaponInfo.Impact(Target.FromPos(self.CenterPosition), saboteur); - self.Kill(saboteur); + self.Kill(saboteur, damageTypes); }); // Destroy adjacent spans between (including) huts @@ -386,7 +386,7 @@ namespace OpenRA.Mods.Common.Traits 0 : info.RepairPropagationDelay; self.World.AddFrameEndTask(w => w.Add(new DelayedAction(delay, () => - neighbours[direction].Demolish(saboteur, direction)))); + neighbours[direction].Demolish(saboteur, direction, damageTypes)))); } } } diff --git a/OpenRA.Mods.Common/Traits/Buildings/BridgeHut.cs b/OpenRA.Mods.Common/Traits/Buildings/BridgeHut.cs index 4099ed4489..38aeba4aed 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BridgeHut.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BridgeHut.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Effects; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -60,6 +61,7 @@ namespace OpenRA.Mods.Common.Traits int demolishStep; int demolishDelay; Actor demolishSaboteur; + BitSet demolishDamageTypes; public BridgeHut(World world, BridgeHutInfo info) { @@ -170,7 +172,7 @@ namespace OpenRA.Mods.Common.Traits return true; } - void IDemolishable.Demolish(Actor self, Actor saboteur, int delay) + void IDemolishable.Demolish(Actor self, Actor saboteur, int delay, BitSet damageTypes) { // TODO: Handle using ITick self.World.Add(new DelayedAction(delay, () => @@ -188,11 +190,12 @@ namespace OpenRA.Mods.Common.Traits { demolishStep = 0; demolishSaboteur = saboteur; + demolishDamageTypes = damageTypes; DemolishStep(); } else foreach (var s in segments.Values) - s.Demolish(saboteur); + s.Demolish(saboteur, damageTypes); } })); } @@ -214,7 +217,7 @@ namespace OpenRA.Mods.Common.Traits if (demolishStep < segmentLocations.Count) foreach (var c in segmentLocations[demolishStep]) - segments[c].Demolish(demolishSaboteur); + segments[c].Demolish(demolishSaboteur, demolishDamageTypes); demolishDelay = Info.DemolishPropagationDelay; diff --git a/OpenRA.Mods.Common/Traits/Buildings/BridgePlaceholder.cs b/OpenRA.Mods.Common/Traits/Buildings/BridgePlaceholder.cs index 78c7f12ca5..8dbacf78f1 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BridgePlaceholder.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BridgePlaceholder.cs @@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Traits }); } - void IBridgeSegment.Demolish(Actor saboteur) + void IBridgeSegment.Demolish(Actor saboteur, BitSet damageTypes) { // Do nothing } diff --git a/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs b/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs index cf751b2302..66268d3b39 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/GroundLevelBridge.cs @@ -104,7 +104,7 @@ namespace OpenRA.Mods.Common.Traits health.InflictDamage(self, repairer, new Damage(-health.MaxHP), true); } - void IBridgeSegment.Demolish(Actor saboteur) + void IBridgeSegment.Demolish(Actor saboteur, BitSet damageTypes) { self.World.AddFrameEndTask(w => { @@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Traits // Use .FromPos since this actor is dead. Cannot use Target.FromActor Info.DemolishWeaponInfo.Impact(Target.FromPos(self.CenterPosition), saboteur); - self.Kill(saboteur); + self.Kill(saboteur, damageTypes); }); } diff --git a/OpenRA.Mods.Common/Traits/Buildings/LegacyBridgeHut.cs b/OpenRA.Mods.Common/Traits/Buildings/LegacyBridgeHut.cs index a96ea987c6..c2eecb3b74 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/LegacyBridgeHut.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/LegacyBridgeHut.cs @@ -11,6 +11,7 @@ using System.Linq; using OpenRA.Effects; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -53,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits return BridgeDamageState != DamageState.Dead; } - void IDemolishable.Demolish(Actor self, Actor saboteur, int delay) + void IDemolishable.Demolish(Actor self, Actor saboteur, int delay, BitSet damageTypes) { // TODO: Handle using ITick self.World.Add(new DelayedAction(delay, () => @@ -66,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits .Select(t => t.GetDamageModifier(self, null)); if (Util.ApplyPercentageModifiers(100, modifiers) > 0) - Bridge.Do((b, d) => b.Demolish(saboteur, d)); + Bridge.Do((b, d) => b.Demolish(saboteur, d, damageTypes)); })); } } diff --git a/OpenRA.Mods.Common/Traits/Demolishable.cs b/OpenRA.Mods.Common/Traits/Demolishable.cs index 39c15f0575..2d1685ba87 100644 --- a/OpenRA.Mods.Common/Traits/Demolishable.cs +++ b/OpenRA.Mods.Common/Traits/Demolishable.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -34,12 +35,14 @@ namespace OpenRA.Mods.Common.Traits public readonly Actor Saboteur; public readonly int Token; public int Delay; + public readonly BitSet DamageTypes; - public DemolishAction(Actor saboteur, int delay, int token) + public DemolishAction(Actor saboteur, int delay, int token, BitSet damageTypes) { Saboteur = saboteur; Delay = delay; Token = token; + DamageTypes = damageTypes; } } @@ -54,13 +57,13 @@ namespace OpenRA.Mods.Common.Traits return !IsTraitDisabled; } - void IDemolishable.Demolish(Actor self, Actor saboteur, int delay) + void IDemolishable.Demolish(Actor self, Actor saboteur, int delay, BitSet damageTypes) { if (IsTraitDisabled) return; var token = self.GrantCondition(Info.Condition); - actions.Add(new DemolishAction(saboteur, delay, token)); + actions.Add(new DemolishAction(saboteur, delay, token, damageTypes)); } void ITick.Tick(Actor self) @@ -77,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits .Select(t => t.GetDamageModifier(self, null)); if (Util.ApplyPercentageModifiers(100, modifiers) > 0) - self.Kill(a.Saboteur); + self.Kill(a.Saboteur, a.DamageTypes); else if (a.Token != Actor.InvalidConditionToken) { self.RevokeCondition(a.Token); diff --git a/OpenRA.Mods.Common/Traits/Demolition.cs b/OpenRA.Mods.Common/Traits/Demolition.cs index 0cf66c08ca..35a9c10f86 100644 --- a/OpenRA.Mods.Common/Traits/Demolition.cs +++ b/OpenRA.Mods.Common/Traits/Demolition.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Orders; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -36,6 +37,9 @@ namespace OpenRA.Mods.Common.Traits "Possible values are Exit, Suicide, Dispose.")] public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Exit; + [Desc("Types of damage that this trait causes. Leave empty for no damage types.")] + public readonly BitSet DamageTypes = default(BitSet); + [VoiceReference] [Desc("Voice string when planting explosive charges.")] public readonly string Voice = "Action"; @@ -84,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits } self.QueueActivity(order.Queued, new Demolish(self, order.Target, info.EnterBehaviour, info.DetonationDelay, - info.Flashes, info.FlashesDelay, info.FlashInterval)); + info.Flashes, info.FlashesDelay, info.FlashInterval, info.DamageTypes)); self.ShowTargetLines(); } diff --git a/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs b/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs index d9fdaed0f6..bf306afde9 100644 --- a/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs @@ -9,6 +9,7 @@ */ #endregion +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -16,7 +17,7 @@ namespace OpenRA.Mods.Common.Traits interface IBridgeSegment { void Repair(Actor repairer); - void Demolish(Actor saboteur); + void Demolish(Actor saboteur, BitSet damageTypes); string Type { get; } DamageState DamageState { get; } diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 51d09ca06d..e75fb18675 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits public interface IDemolishable { bool IsValidTarget(Actor self, Actor saboteur); - void Demolish(Actor self, Actor saboteur, int delay); + void Demolish(Actor self, Actor saboteur, int delay, BitSet damageTypes); } // Type tag for crush class bits