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
{
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<Minelayer>();
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 );
}

View File

@@ -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<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)
{
if (!(order is BeginMinefieldOrderTargeter))
return null;
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<IPositionable>();
minefield = GetMinefieldCells(minefieldStart, order.TargetLocation,
Minefield = GetMinefieldCells(minefieldStart, order.TargetLocation,
self.Info.Traits.Get<MinelayerInfo>().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);
}