diff --git a/OpenRA.Mods.Common/Activities/Demolish.cs b/OpenRA.Mods.Common/Activities/Demolish.cs index c72b89290b..afa2c9d3f8 100644 --- a/OpenRA.Mods.Common/Activities/Demolish.cs +++ b/OpenRA.Mods.Common/Activities/Demolish.cs @@ -20,6 +20,7 @@ namespace OpenRA.Mods.Common.Activities { readonly Actor target; readonly IDemolishable[] demolishables; + readonly EnterBehaviour enterBehaviour; readonly int delay; readonly int flashes; readonly int flashesDelay; @@ -28,11 +29,13 @@ namespace OpenRA.Mods.Common.Activities readonly Cloak cloak; - public Demolish(Actor self, Actor target, int delay, int flashes, int flashesDelay, int flashInterval, int flashDuration) + public Demolish(Actor self, Actor target, EnterBehaviour enterBehaviour, int delay, + int flashes, int flashesDelay, int flashInterval, int flashDuration) : base(self, target) { this.target = target; demolishables = target.TraitsImplementing().ToArray(); + this.enterBehaviour = enterBehaviour; this.delay = delay; this.flashes = flashes; this.flashesDelay = flashesDelay; @@ -72,6 +75,11 @@ namespace OpenRA.Mods.Common.Activities if (Util.ApplyPercentageModifiers(100, modifiers) > 0) demolishables.Do(d => d.Demolish(target, self)); })); + + if (enterBehaviour == EnterBehaviour.Suicide) + self.Kill(self); + else if (enterBehaviour == EnterBehaviour.Dispose) + self.Dispose(); }); } } diff --git a/OpenRA.Mods.Common/Activities/Enter.cs b/OpenRA.Mods.Common/Activities/Enter.cs index 71e4ac94ad..c5fdd9d4fa 100644 --- a/OpenRA.Mods.Common/Activities/Enter.cs +++ b/OpenRA.Mods.Common/Activities/Enter.cs @@ -15,6 +15,8 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Activities { + public enum EnterBehaviour { Exit, Suicide, Dispose } + public abstract class Enter : Activity { public enum ReserveStatus { None, TooFar, Pending, Ready } diff --git a/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs index 93c7c176f7..162686aae4 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs @@ -34,8 +34,8 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Demolish the target actor.")] public void Demolish(Actor target) { - Self.QueueActivity(new Demolish(Self, target, info.C4Delay, info.Flashes, - info.FlashesDelay, info.FlashInterval, info.FlashDuration)); + Self.QueueActivity(new Demolish(Self, target, info.EnterBehaviour, info.C4Delay, + info.Flashes, info.FlashesDelay, info.FlashInterval, info.FlashDuration)); } } } diff --git a/OpenRA.Mods.Common/Traits/C4Demolition.cs b/OpenRA.Mods.Common/Traits/C4Demolition.cs index 031a59c454..bf7887fd91 100644 --- a/OpenRA.Mods.Common/Traits/C4Demolition.cs +++ b/OpenRA.Mods.Common/Traits/C4Demolition.cs @@ -35,6 +35,10 @@ namespace OpenRA.Mods.Common.Traits [Desc("Duration of each flash")] public readonly int FlashDuration = 3; + [Desc("Behaviour when entering the structure.", + "Possible values are Exit, Suicide, Dispose.")] + public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Exit; + [Desc("Voice string when planting explosive charges.")] [VoiceReference] public readonly string Voice = "Action"; @@ -83,8 +87,8 @@ namespace OpenRA.Mods.Common.Traits self.CancelActivity(); self.SetTargetLine(target, Color.Red); - self.QueueActivity(new Demolish(self, - target.Actor, info.C4Delay, info.Flashes, info.FlashesDelay, info.FlashInterval, info.FlashDuration)); + self.QueueActivity(new Demolish(self, target.Actor, info.EnterBehaviour, info.C4Delay, + info.Flashes, info.FlashesDelay, info.FlashInterval, info.FlashDuration)); } public string VoicePhraseForOrder(Actor self, Order order)