Merge pull request #5697 from Mailaender/classic-minelay

Added a classic minelay order
This commit is contained in:
obrakmann
2014-06-23 19:01:37 +02:00
2 changed files with 35 additions and 17 deletions

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Activities
class LayMines : Activity class LayMines : Activity
{ {
public override Activity Tick( Actor self ) public override Activity Tick(Actor self)
{ {
if (IsCanceled) return NextActivity; if (IsCanceled) return NextActivity;
@@ -40,21 +40,21 @@ namespace OpenRA.Mods.RA.Activities
movement.MoveTo(rearmTarget.CenterPosition.ToCPos(), rearmTarget), movement.MoveTo(rearmTarget.CenterPosition.ToCPos(), rearmTarget),
new Rearm(self), new Rearm(self),
new Repair(rearmTarget), new Repair(rearmTarget),
this ); this);
} }
var ml = self.Trait<Minelayer>(); var ml = self.Trait<Minelayer>();
if (ml.minefield.Contains(self.Location) && if (ml.Minefield.Contains(self.Location) &&
ShouldLayMine(self, self.Location)) ShouldLayMine(self, self.Location))
{ {
LayMine(self); 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 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)) if (ShouldLayMine(self, p))
return Util.SequenceActivities( movement.MoveTo(p, 0), this ); return Util.SequenceActivities( movement.MoveTo(p, 0), this );
} }

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Orders;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
@@ -30,7 +31,7 @@ namespace OpenRA.Mods.RA
class Minelayer : IIssueOrder, IResolveOrder, IPostRenderSelection, ISync class Minelayer : IIssueOrder, IResolveOrder, IPostRenderSelection, ISync
{ {
/* [Sync] when sync can cope with arrays! */ /* [Sync] when sync can cope with arrays! */
public CPos[] minefield = null; public CPos[] Minefield = null;
[Sync] CPos minefieldStart; [Sync] CPos minefieldStart;
Actor self; Actor self;
Sprite tile; Sprite tile;
@@ -45,17 +46,26 @@ namespace OpenRA.Mods.RA
public IEnumerable<IOrderTargeter> Orders public IEnumerable<IOrderTargeter> 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) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (!(order is BeginMinefieldOrderTargeter)) switch (order.OrderID)
return null; {
case "BeginMinefield":
var start = target.CenterPosition.ToCPos(); var start = target.CenterPosition.ToCPos();
self.World.OrderGenerator = new MinefieldOrderGenerator(self, start); self.World.OrderGenerator = new MinefieldOrderGenerator(self, start);
return new Order("BeginMinefield", self, false) { TargetLocation = 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) public void ResolveOrder(Actor self, Order order)
@@ -63,11 +73,19 @@ namespace OpenRA.Mods.RA
if (order.OrderString == "BeginMinefield") if (order.OrderString == "BeginMinefield")
minefieldStart = order.TargetLocation; 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") if (order.OrderString == "PlaceMinefield")
{ {
var movement = self.Trait<IPositionable>(); var movement = self.Trait<IPositionable>();
minefield = GetMinefieldCells(minefieldStart, order.TargetLocation, Minefield = GetMinefieldCells(minefieldStart, order.TargetLocation,
self.Info.Traits.Get<MinelayerInfo>().MinefieldDepth) self.Info.Traits.Get<MinelayerInfo>().MinefieldDepth)
.Where(p => movement.CanEnterCell(p)).ToArray(); .Where(p => movement.CanEnterCell(p)).ToArray();
@@ -98,11 +116,11 @@ namespace OpenRA.Mods.RA
public void RenderAfterWorld(WorldRenderer wr) public void RenderAfterWorld(WorldRenderer wr)
{ {
if (self.Owner != self.World.LocalPlayer || minefield == null) if (self.Owner != self.World.LocalPlayer || Minefield == null)
return; return;
var pal = wr.Palette("terrain"); var pal = wr.Palette("terrain");
foreach (var c in minefield) foreach (var c in Minefield)
new SpriteRenderable(tile, c.CenterPosition, new SpriteRenderable(tile, c.CenterPosition,
WVec.Zero, -511, pal, 1f, true).Render(wr); WVec.Zero, -511, pal, 1f, true).Render(wr);
} }