Rework minefield visualisation.

This commit is contained in:
tovl
2019-07-27 14:45:55 +02:00
committed by Paul Chote
parent b7a7b7aa7e
commit 58bb7fcbc0
4 changed files with 62 additions and 39 deletions

View File

@@ -37,27 +37,27 @@ namespace OpenRA.Mods.Cnc.Traits
public object Create(ActorInitializer init) { return new Minelayer(init.Self, this); }
}
public class Minelayer : IIssueOrder, IResolveOrder, IRenderAboveShroudWhenSelected, ISync, IIssueDeployOrder, IOrderVoice
public class Minelayer : IIssueOrder, IResolveOrder, ISync, IIssueDeployOrder, IOrderVoice
{
readonly MinelayerInfo info;
public readonly MinelayerInfo Info;
// TODO: [Sync] when sync can cope with arrays!
public CPos[] Minefield = null;
readonly Sprite tile;
public readonly Sprite Tile;
[Sync]
CPos minefieldStart;
public Minelayer(Actor self, MinelayerInfo info)
{
this.info = info;
Info = info;
var tileset = self.World.Map.Tileset.ToLowerInvariant();
if (self.World.Map.Rules.Sequences.HasSequence("overlay", "build-valid-{0}".F(tileset)))
tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
Tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
else
tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid").GetSprite(0);
Tile = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid").GetSprite(0);
}
IEnumerable<IOrderTargeter> IIssueOrder.Orders
@@ -109,19 +109,18 @@ namespace OpenRA.Mods.Cnc.Traits
{
var movement = self.Trait<IPositionable>();
Minefield = GetMinefieldCells(minefieldStart, cell, info.MinefieldDepth)
Minefield = GetMinefieldCells(minefieldStart, cell, Info.MinefieldDepth)
.Where(p => movement.CanEnterCell(p, null, false)).ToArray();
self.QueueActivity(order.Queued, new LayMines(self, Minefield));
if (Minefield.Length == 1 && Minefield[0] != self.Location)
self.ShowTargetLines();
self.ShowTargetLines();
}
}
string IOrderVoice.VoicePhraseForOrder(Actor self, Order order)
{
if (order.OrderString == "PlaceMine" || order.OrderString == "PlaceMinefield")
return info.Voice;
return Info.Voice;
return null;
}
@@ -145,23 +144,6 @@ namespace OpenRA.Mods.Cnc.Traits
yield return new CPos(i, j);
}
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
{
if (self.Owner != self.World.LocalPlayer || Minefield == null)
yield break;
// Single-cell mine fields use a target line instead
if (Minefield.Length == 1)
yield break;
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
foreach (var c in Minefield)
yield return new SpriteRenderable(tile, self.World.Map.CenterOfCell(c),
WVec.Zero, -511, pal, 1f, true);
}
bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }
class MinefieldOrderGenerator : OrderGenerator
{
readonly List<Actor> minelayers;