From abf837a93485b37f5b1b2bf5d315c285daa18668 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 21 Sep 2016 22:48:36 +0100 Subject: [PATCH] Add InfiltrateForDecoration trait. --- .../Traits/Render/WithDecoration.cs | 19 ++++---- .../Traits/Render/WithDecorationCarryable.cs | 4 +- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + .../Infiltration/InfiltrateForDecoration.cs | 43 +++++++++++++++++++ 4 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 OpenRA.Mods.RA/Traits/Infiltration/InfiltrateForDecoration.cs diff --git a/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs index 1175e4fcae..c391c46f5d 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs @@ -69,7 +69,17 @@ namespace OpenRA.Mods.Common.Traits.Render Anim.PlayRepeating(info.Sequence); } - public virtual bool ShouldRender(Actor self) { return true; } + protected virtual bool ShouldRender(Actor self) + { + if (self.World.RenderPlayer != null) + { + var stance = self.Owner.Stances[self.World.RenderPlayer]; + if (!Info.ValidStances.HasStance(stance)) + return false; + } + + return true; + } IEnumerable IRenderAboveShroud.RenderAboveShroud(Actor self, WorldRenderer wr) { @@ -86,13 +96,6 @@ namespace OpenRA.Mods.Common.Traits.Render if (IsTraitDisabled || self.IsDead || !self.IsInWorld || Anim == null) return Enumerable.Empty(); - if (self.World.RenderPlayer != null) - { - var stance = self.Owner.Stances[self.World.RenderPlayer]; - if (!Info.ValidStances.HasStance(stance)) - return Enumerable.Empty(); - } - if (!ShouldRender(self) || self.World.FogObscures(self)) return Enumerable.Empty(); diff --git a/OpenRA.Mods.D2k/Traits/Render/WithDecorationCarryable.cs b/OpenRA.Mods.D2k/Traits/Render/WithDecorationCarryable.cs index d359f53523..9bf9dfd984 100644 --- a/OpenRA.Mods.D2k/Traits/Render/WithDecorationCarryable.cs +++ b/OpenRA.Mods.D2k/Traits/Render/WithDecorationCarryable.cs @@ -31,9 +31,9 @@ namespace OpenRA.Mods.D2k.Traits.Render carryable = self.Trait(); } - public override bool ShouldRender(Actor self) + protected override bool ShouldRender(Actor self) { - return carryable.Reserved; + return carryable.Reserved && base.ShouldRender(self); } } } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 686c4ac219..36aa76c5b0 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -116,6 +116,7 @@ + diff --git a/OpenRA.Mods.RA/Traits/Infiltration/InfiltrateForDecoration.cs b/OpenRA.Mods.RA/Traits/Infiltration/InfiltrateForDecoration.cs new file mode 100644 index 0000000000..ab7c6e7b9d --- /dev/null +++ b/OpenRA.Mods.RA/Traits/Infiltration/InfiltrateForDecoration.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/* + * Copyright 2007-2016 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA.Traits +{ + [Desc("Reveals a decoration sprite to the indicated players when infiltrated.")] + class InfiltrateForDecorationInfo : WithDecorationInfo + { + public override object Create(ActorInitializer init) { return new InfiltrateForDecoration(init.Self, this); } + } + + class InfiltrateForDecoration : WithDecoration, INotifyInfiltrated + { + readonly HashSet infiltrators = new HashSet(); + + public InfiltrateForDecoration(Actor self, InfiltrateForDecorationInfo info) + : base(self, info) { } + + public void Infiltrated(Actor self, Actor infiltrator) + { + infiltrators.Add(infiltrator.Owner); + } + + protected override bool ShouldRender(Actor self) + { + return self.World.RenderPlayer == null || infiltrators.Any(i => + Info.ValidStances.HasStance(i.Stances[self.World.RenderPlayer])); + } + } +}