diff --git a/OpenRA.Mods.RA/Activities/LayMines.cs b/OpenRA.Mods.RA/Activities/LayMines.cs index 674f4fd04e..b65fbc2e36 100644 --- a/OpenRA.Mods.RA/Activities/LayMines.cs +++ b/OpenRA.Mods.RA/Activities/LayMines.cs @@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Activities class LayMines : Activity { - public override Activity Tick( Actor self ) + public override Activity Tick(Actor self) { if (IsCanceled) return NextActivity; @@ -40,21 +40,21 @@ namespace OpenRA.Mods.RA.Activities movement.MoveTo(rearmTarget.CenterPosition.ToCPos(), rearmTarget), new Rearm(self), new Repair(rearmTarget), - this ); + this); } var ml = self.Trait(); - if (ml.minefield.Contains(self.Location) && + if (ml.Minefield.Contains(self.Location) && ShouldLayMine(self, self.Location)) { LayMine(self); - return Util.SequenceActivities( new Wait(20), this ); // a little wait after placing each mine, for show + return Util.SequenceActivities(new Wait(20), this); // a little wait after placing each mine, for show } - if (ml.minefield.Length > 0) + if (ml.Minefield.Length > 0) for (var n = 0; n < 20; n++) // dont get stuck forever here { - var p = ml.minefield.Random(self.World.SharedRandom); + var p = ml.Minefield.Random(self.World.SharedRandom); if (ShouldLayMine(self, p)) return Util.SequenceActivities( movement.MoveTo(p, 0), this ); } diff --git a/OpenRA.Mods.RA/Minelayer.cs b/OpenRA.Mods.RA/Minelayer.cs index 307f9edf2f..86bbf6f5d0 100644 --- a/OpenRA.Mods.RA/Minelayer.cs +++ b/OpenRA.Mods.RA/Minelayer.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Orders; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -30,7 +31,7 @@ namespace OpenRA.Mods.RA class Minelayer : IIssueOrder, IResolveOrder, IPostRenderSelection, ISync { /* [Sync] when sync can cope with arrays! */ - public CPos[] minefield = null; + public CPos[] Minefield = null; [Sync] CPos minefieldStart; Actor self; Sprite tile; @@ -45,17 +46,26 @@ namespace OpenRA.Mods.RA public IEnumerable Orders { - get { yield return new BeginMinefieldOrderTargeter(); } + get + { + yield return new BeginMinefieldOrderTargeter(); + yield return new DeployOrderTargeter("PlaceMine", 5); + } } public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { - if (!(order is BeginMinefieldOrderTargeter)) - return null; - - var start = target.CenterPosition.ToCPos(); - self.World.OrderGenerator = new MinefieldOrderGenerator(self, start); - return new Order("BeginMinefield", self, false) { TargetLocation = start }; + switch (order.OrderID) + { + case "BeginMinefield": + var start = target.CenterPosition.ToCPos(); + self.World.OrderGenerator = new MinefieldOrderGenerator(self, start); + return new Order("BeginMinefield", self, false) { TargetLocation = start }; + case "PlaceMine": + return new Order("PlaceMine", self, false) { TargetLocation = self.Location }; + default: + return null; + } } public void ResolveOrder(Actor self, Order order) @@ -63,11 +73,19 @@ namespace OpenRA.Mods.RA if (order.OrderString == "BeginMinefield") minefieldStart = order.TargetLocation; + if (order.OrderString == "PlaceMine") + { + minefieldStart = order.TargetLocation; + Minefield = new CPos[] { order.TargetLocation }; + self.CancelActivity(); + self.QueueActivity(new LayMines()); + } + if (order.OrderString == "PlaceMinefield") { var movement = self.Trait(); - minefield = GetMinefieldCells(minefieldStart, order.TargetLocation, + Minefield = GetMinefieldCells(minefieldStart, order.TargetLocation, self.Info.Traits.Get().MinefieldDepth) .Where(p => movement.CanEnterCell(p)).ToArray(); @@ -98,11 +116,11 @@ namespace OpenRA.Mods.RA public void RenderAfterWorld(WorldRenderer wr) { - if (self.Owner != self.World.LocalPlayer || minefield == null) + if (self.Owner != self.World.LocalPlayer || Minefield == null) return; var pal = wr.Palette("terrain"); - foreach (var c in minefield) + foreach (var c in Minefield) new SpriteRenderable(tile, c.CenterPosition, WVec.Zero, -511, pal, 1f, true).Render(wr); }