Enable VisibilityType for shroud revealing.

VisibilityType.Footprint reveals from each footprint cell.

VisibilityType.CenterPosition reveals from the
actor’s CenterPosition only (as the original
games did).
This commit is contained in:
Paul Chote
2015-06-14 14:12:22 +01:00
parent 7053e59acb
commit 8206c3c453
2 changed files with 11 additions and 18 deletions

View File

@@ -183,21 +183,6 @@ namespace OpenRA.Traits
}
}
// TODO: Actor vis will be split into separate cases for
// "cells that I reveal from" and "cells that reveal me"
public static IEnumerable<CPos> GetVisOrigins(Actor a)
{
var ios = a.OccupiesSpace;
if (ios != null)
{
var cells = ios.OccupiedCells();
if (cells.Any())
return cells.Select(c => c.First);
}
return new[] { a.World.Map.CellContaining(a.CenterPosition) };
}
public void Explore(World world, IEnumerable<CPos> cells)
{
var changed = new HashSet<CPos>();

View File

@@ -18,6 +18,10 @@ namespace OpenRA.Mods.Common.Traits
{
public readonly WRange Range = WRange.Zero;
[Desc("Possible values are CenterPosition (measure range from the center) and ",
"Footprint (measure range from the footprint)")]
public readonly VisibilityType Type = VisibilityType.Footprint;
public virtual object Create(ActorInitializer init) { return new RevealsShroud(init.Self, this); }
}
@@ -51,9 +55,13 @@ namespace OpenRA.Mods.Common.Traits
if (range == WRange.Zero)
return NoCells;
return Shroud.GetVisOrigins(self)
.SelectMany(c => Shroud.CellsInRange(map, c, range))
.Distinct().ToArray();
if (info.Type == VisibilityType.Footprint)
return self.OccupiesSpace.OccupiedCells()
.SelectMany(kv => Shroud.CellsInRange(map, kv.First, range))
.Distinct().ToArray();
return Shroud.CellsInRange(map, self.CenterPosition, range)
.ToArray();
}
public void Tick(Actor self)