Expose a parameter for reveal behaviour.
VisibilityType.CenterPosition reveals the actor only if its CenterPosition is inside a cell that is visible. VisibilityType.Footprint reveals the actor if any of its footprint cells are visible (this includes Mobile actors moving between two cells).
This commit is contained in:
@@ -28,10 +28,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
protected override bool IsVisibleInner(Actor self, Player byPlayer)
|
protected override bool IsVisibleInner(Actor self, Player byPlayer)
|
||||||
{
|
{
|
||||||
if (!VisibilityFootprint(self).Any(byPlayer.Shroud.IsVisible))
|
if (Info.Type == VisibilityType.Footprint)
|
||||||
return false;
|
return self.OccupiesSpace.OccupiedCells()
|
||||||
|
.Any(o => byPlayer.Shroud.IsVisible(o.First));
|
||||||
|
|
||||||
return base.IsVisibleInner(self, byPlayer);
|
return byPlayer.Shroud.IsVisible(self.CenterPosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,32 +15,37 @@ using OpenRA.Traits;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Traits
|
namespace OpenRA.Mods.Common.Traits
|
||||||
{
|
{
|
||||||
|
public enum VisibilityType { Footprint, CenterPosition }
|
||||||
|
|
||||||
[Desc("The actor stays invisible under the shroud.")]
|
[Desc("The actor stays invisible under the shroud.")]
|
||||||
public class HiddenUnderShroudInfo : ITraitInfo, IDefaultVisibilityInfo
|
public class HiddenUnderShroudInfo : ITraitInfo, IDefaultVisibilityInfo
|
||||||
{
|
{
|
||||||
[Desc("Players with these stances can always see the actor.")]
|
[Desc("Players with these stances can always see the actor.")]
|
||||||
public readonly Stance AlwaysVisibleStances = Stance.Ally;
|
public readonly Stance AlwaysVisibleStances = Stance.Ally;
|
||||||
|
|
||||||
|
[Desc("Possible values are CenterPosition (reveal when the center is visible) and ",
|
||||||
|
"Footprint (reveal when any footprint cell is visible).")]
|
||||||
|
public readonly VisibilityType Type = VisibilityType.Footprint;
|
||||||
|
|
||||||
public virtual object Create(ActorInitializer init) { return new HiddenUnderShroud(this); }
|
public virtual object Create(ActorInitializer init) { return new HiddenUnderShroud(this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class HiddenUnderShroud : IDefaultVisibility, IRenderModifier
|
public class HiddenUnderShroud : IDefaultVisibility, IRenderModifier
|
||||||
{
|
{
|
||||||
readonly HiddenUnderShroudInfo info;
|
protected readonly HiddenUnderShroudInfo Info;
|
||||||
|
|
||||||
public HiddenUnderShroud(HiddenUnderShroudInfo info)
|
public HiddenUnderShroud(HiddenUnderShroudInfo info)
|
||||||
{
|
{
|
||||||
this.info = info;
|
Info = info;
|
||||||
}
|
|
||||||
|
|
||||||
protected IEnumerable<CPos> VisibilityFootprint(Actor self)
|
|
||||||
{
|
|
||||||
return Shroud.GetVisOrigins(self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual bool IsVisibleInner(Actor self, Player byPlayer)
|
protected virtual bool IsVisibleInner(Actor self, Player byPlayer)
|
||||||
{
|
{
|
||||||
return VisibilityFootprint(self).Any(byPlayer.Shroud.IsExplored);
|
if (Info.Type == VisibilityType.Footprint)
|
||||||
|
return self.OccupiesSpace.OccupiedCells()
|
||||||
|
.Any(o => byPlayer.Shroud.IsExplored(o.First));
|
||||||
|
|
||||||
|
return byPlayer.Shroud.IsExplored(self.CenterPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsVisible(Actor self, Player byPlayer)
|
public bool IsVisible(Actor self, Player byPlayer)
|
||||||
@@ -49,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
var stance = self.Owner.Stances[byPlayer];
|
var stance = self.Owner.Stances[byPlayer];
|
||||||
return info.AlwaysVisibleStances.HasFlag(stance) || IsVisibleInner(self, byPlayer);
|
return Info.AlwaysVisibleStances.HasFlag(stance) || IsVisibleInner(self, byPlayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
|
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
|
||||||
|
|||||||
Reference in New Issue
Block a user