Merge pull request #5697 from Mailaender/classic-minelay
Added a classic minelay order
This commit is contained in:
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user