Merge pull request #11801 from WolfGaming/FixMinelayerGroup
Allow multiple minelayers in a single MinefieldOrderGenerator.
This commit is contained in:
@@ -62,7 +62,11 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
{
|
{
|
||||||
case "BeginMinefield":
|
case "BeginMinefield":
|
||||||
var start = self.World.Map.CellContaining(target.CenterPosition);
|
var start = self.World.Map.CellContaining(target.CenterPosition);
|
||||||
self.World.OrderGenerator = new MinefieldOrderGenerator(self, start);
|
if (self.World.OrderGenerator is MinefieldOrderGenerator)
|
||||||
|
((MinefieldOrderGenerator)self.World.OrderGenerator).AddMinelayer(self, start);
|
||||||
|
else
|
||||||
|
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":
|
case "PlaceMine":
|
||||||
return new Order("PlaceMine", self, false) { TargetLocation = self.Location };
|
return new Order("PlaceMine", self, false) { TargetLocation = self.Location };
|
||||||
@@ -130,19 +134,24 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
|
|
||||||
class MinefieldOrderGenerator : IOrderGenerator
|
class MinefieldOrderGenerator : IOrderGenerator
|
||||||
{
|
{
|
||||||
readonly Actor minelayer;
|
readonly List<Actor> minelayers;
|
||||||
readonly CPos minefieldStart;
|
|
||||||
readonly Sprite tileOk;
|
readonly Sprite tileOk;
|
||||||
readonly Sprite tileBlocked;
|
readonly Sprite tileBlocked;
|
||||||
|
readonly CPos minefieldStart;
|
||||||
|
|
||||||
public MinefieldOrderGenerator(Actor self, CPos xy)
|
public MinefieldOrderGenerator(Actor a, CPos xy)
|
||||||
{
|
{
|
||||||
minelayer = self;
|
minelayers = new List<Actor>() { a };
|
||||||
minefieldStart = xy;
|
minefieldStart = xy;
|
||||||
|
|
||||||
var tileset = self.World.Map.Tileset.ToLowerInvariant();
|
var tileset = a.World.Map.Tileset.ToLowerInvariant();
|
||||||
tileOk = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
|
tileOk = a.World.Map.Rules.Sequences.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0);
|
||||||
tileBlocked = self.World.Map.Rules.Sequences.GetSequence("overlay", "build-invalid").GetSprite(0);
|
tileBlocked = a.World.Map.Rules.Sequences.GetSequence("overlay", "build-invalid").GetSprite(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddMinelayer(Actor a, CPos xy)
|
||||||
|
{
|
||||||
|
minelayers.Add(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
public IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
@@ -160,14 +169,16 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
|
|
||||||
if (mi.Button == Game.Settings.Game.MouseButtonPreference.Action && underCursor == null)
|
if (mi.Button == Game.Settings.Game.MouseButtonPreference.Action && underCursor == null)
|
||||||
{
|
{
|
||||||
minelayer.World.CancelInputMode();
|
minelayers.First().World.CancelInputMode();
|
||||||
yield return new Order("PlaceMinefield", minelayer, false) { TargetLocation = cell };
|
foreach (var minelayer in minelayers)
|
||||||
|
yield return new Order("PlaceMinefield", minelayer, false) { TargetLocation = cell };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick(World world)
|
public void Tick(World world)
|
||||||
{
|
{
|
||||||
if (!minelayer.IsInWorld || minelayer.IsDead)
|
minelayers.RemoveAll(minelayer => !minelayer.IsInWorld || minelayer.IsDead);
|
||||||
|
if (!minelayers.Any())
|
||||||
world.CancelInputMode();
|
world.CancelInputMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,12 +186,13 @@ namespace OpenRA.Mods.RA.Traits
|
|||||||
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
|
||||||
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
if (!minelayer.IsInWorld)
|
if (!minelayers.Any())
|
||||||
yield break;
|
yield break;
|
||||||
|
|
||||||
var movement = minelayer.Trait<IPositionable>();
|
// We get the biggest depth so we cover all cells that mines could be placed on.
|
||||||
var minefield = GetMinefieldCells(minefieldStart, lastMousePos,
|
var minefield = GetMinefieldCells(minefieldStart, lastMousePos,
|
||||||
minelayer.Info.TraitInfo<MinelayerInfo>().MinefieldDepth);
|
minelayers.Max(m => m.Info.TraitInfo<MinelayerInfo>().MinefieldDepth));
|
||||||
|
var movement = minelayers.First().Trait<IPositionable>();
|
||||||
|
|
||||||
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
||||||
foreach (var c in minefield)
|
foreach (var c in minefield)
|
||||||
|
|||||||
Reference in New Issue
Block a user