diff --git a/OpenRA.Game/Graphics/Minimap.cs b/OpenRA.Game/Graphics/Minimap.cs index 59dda3321a..cadffef4c6 100644 --- a/OpenRA.Game/Graphics/Minimap.cs +++ b/OpenRA.Game/Graphics/Minimap.cs @@ -119,9 +119,12 @@ namespace OpenRA.Graphics unsafe { int* c = (int*)bitmapData.Scan0; - + foreach (var t in world.Queries.WithTraitMultiple()) { + if (!t.Actor.IsVisible()) + continue; + var color = t.Trait.RadarSignatureColor(t.Actor); foreach (var cell in t.Trait.RadarSignatureCells(t.Actor)) if (world.Map.IsInMap(cell)) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 7c1ab66ffb..1d1254fd5c 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -82,10 +82,8 @@ - - @@ -179,7 +177,6 @@ - @@ -266,4 +263,7 @@ --> + + + \ No newline at end of file diff --git a/OpenRA.Game/Traits/Building.cs b/OpenRA.Game/Traits/Building.cs index 7b164a5603..e2e514192e 100644 --- a/OpenRA.Game/Traits/Building.cs +++ b/OpenRA.Game/Traits/Building.cs @@ -162,11 +162,7 @@ namespace OpenRA.Traits } public IEnumerable RadarSignatureCells(Actor self) - { - foreach (var mod in self.traits.WithInterface()) - if (!mod.VisibleOnRadar(self)) - return new int2[] {}; - + { return Footprint.Tiles(self); } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 442aab89a3..9fe3948843 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -57,7 +57,7 @@ namespace OpenRA.Traits Color RadarSignatureColor(Actor self); } - public interface IRadarVisibilityModifier { bool VisibleOnRadar(Actor self); } + public interface IVisibilityModifier { bool IsVisible(Actor self); } public interface IRadarColorModifier { Color RadarColorOverride(Actor self); } public interface IRevealShroud {} public interface IOccupySpace diff --git a/OpenRA.Game/Traits/Unit.cs b/OpenRA.Game/Traits/Unit.cs index 9358cf5153..28ec63260b 100755 --- a/OpenRA.Game/Traits/Unit.cs +++ b/OpenRA.Game/Traits/Unit.cs @@ -48,11 +48,7 @@ namespace OpenRA.Traits } public IEnumerable RadarSignatureCells(Actor self) - { - foreach (var mod in self.traits.WithInterface()) - if (!mod.VisibleOnRadar(self)) - yield break; - + { yield return self.Location; } diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 964b7c35e9..e947ce8ea7 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -121,12 +121,7 @@ namespace OpenRA if (!Shroud.GetVisOrigins(a).Any(o => a.World.Map.IsInMap(o) && shroud.exploredCells[o.X, o.Y])) // covered by shroud return false; - var huf = a.traits.GetOrDefault(); // hidden under fog - if (huf != null && !huf.IsVisible(a)) - return false; - - var cloak = a.traits.GetOrDefault(); - if (cloak != null && cloak.Cloaked && a.Owner != a.World.LocalPlayer) + if (a.traits.WithInterface().Any(t => !t.IsVisible(a))) return false; return true; diff --git a/OpenRA.Game/Traits/Cloak.cs b/OpenRA.Mods.RA/Cloak.cs similarity index 90% rename from OpenRA.Game/Traits/Cloak.cs rename to OpenRA.Mods.RA/Cloak.cs index 7ec5aa7e40..1343862fa6 100644 --- a/OpenRA.Game/Traits/Cloak.cs +++ b/OpenRA.Mods.RA/Cloak.cs @@ -12,8 +12,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Drawing; +using OpenRA.Traits; -namespace OpenRA.Traits +namespace OpenRA.Mods.RA { class CloakInfo : ITraitInfo { @@ -25,7 +26,7 @@ namespace OpenRA.Traits public object Create(ActorInitializer init) { return new Cloak(init.self); } } - public class Cloak : IRenderModifier, INotifyAttack, ITick, INotifyDamage, IRadarVisibilityModifier, IRadarColorModifier + public class Cloak : IRenderModifier, INotifyAttack, ITick, INotifyDamage, IVisibilityModifier, IRadarColorModifier { [Sync] int remainingTime; @@ -80,7 +81,7 @@ namespace OpenRA.Traits public bool Cloaked { get { return remainingTime == 0; } } - public bool VisibleOnRadar(Actor self) + public bool IsVisible(Actor self) { return !Cloaked || self.Owner == self.World.LocalPlayer; } diff --git a/OpenRA.Mods.RA/InvisibleToOthers.cs b/OpenRA.Mods.RA/InvisibleToOthers.cs index dd15cc93ab..b2895bdbd5 100644 --- a/OpenRA.Mods.RA/InvisibleToOthers.cs +++ b/OpenRA.Mods.RA/InvisibleToOthers.cs @@ -9,14 +9,25 @@ #endregion using System.Collections.Generic; +using System.Drawing; using OpenRA.Traits; namespace OpenRA.Mods.RA { class InvisibleToOthersInfo : TraitInfo { } - class InvisibleToOthers : IRenderModifier + class InvisibleToOthers : IRenderModifier, IVisibilityModifier, IRadarColorModifier { + public bool IsVisible(Actor self) + { + return self.Owner == self.World.LocalPlayer; + } + + public Color RadarColorOverride(Actor self) + { + return Color.FromArgb(128, self.Owner.Color); + } + public IEnumerable ModifyRender(Actor self, IEnumerable r) { return self.World.LocalPlayer == self.Owner diff --git a/OpenRA.Mods.RA/Mine.cs b/OpenRA.Mods.RA/Mine.cs index 10f80f03d5..30f19b7e3f 100644 --- a/OpenRA.Mods.RA/Mine.cs +++ b/OpenRA.Mods.RA/Mine.cs @@ -11,7 +11,6 @@ using System.Collections.Generic; using OpenRA.Traits; using OpenRA.Traits.Activities; -using System.Drawing; namespace OpenRA.Mods.RA { @@ -25,7 +24,7 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new Mine(init, this); } } - class Mine : ICrushable, IOccupySpace, IRadarVisibilityModifier, IRadarColorModifier + class Mine : ICrushable, IOccupySpace { readonly Actor self; readonly MineInfo info; @@ -56,16 +55,6 @@ namespace OpenRA.Mods.RA public int2 TopLeft { get { return location; } } public IEnumerable OccupiedCells() { yield return TopLeft; } - - public bool VisibleOnRadar(Actor self) - { - return self.Owner == self.World.LocalPlayer; - } - - public Color RadarColorOverride(Actor self) - { - return Color.FromArgb(128, self.Owner.Color); - } } /* tag trait for stuff that shouldnt trigger mines */ diff --git a/OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs similarity index 81% rename from OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs rename to OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs index b32c85b3f2..f734af4f9d 100644 --- a/OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/FrozenUnderFog.cs @@ -10,15 +10,16 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Traits; -namespace OpenRA.Traits +namespace OpenRA.Mods.RA { class FrozenUnderFogInfo : ITraitInfo { public object Create(ActorInitializer init) { return new FrozenUnderFog(init.self); } } - class FrozenUnderFog : IRenderModifier, IRadarVisibilityModifier + class FrozenUnderFog : IRenderModifier, IVisibilityModifier { Shroud shroud; Renderable[] cache = { }; @@ -28,18 +29,13 @@ namespace OpenRA.Traits shroud = self.World.WorldActor.traits.Get(); } - bool IsVisible(Actor self) + public bool IsVisible(Actor self) { return self.World.LocalPlayer == null || self.Owner == self.World.LocalPlayer || self.World.LocalPlayer.Shroud.Disabled || Shroud.GetVisOrigins(self).Any(o => self.World.Map.IsInMap(o) && shroud.visibleCells[o.X, o.Y] != 0); } - - public bool VisibleOnRadar(Actor self) - { - return IsVisible(self); - } public IEnumerable ModifyRender(Actor self, IEnumerable r) { diff --git a/OpenRA.Game/Traits/Modifiers/HiddenUnderFog.cs b/OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs similarity index 82% rename from OpenRA.Game/Traits/Modifiers/HiddenUnderFog.cs rename to OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs index e44d35d724..358cc2697c 100644 --- a/OpenRA.Game/Traits/Modifiers/HiddenUnderFog.cs +++ b/OpenRA.Mods.RA/Modifiers/HiddenUnderFog.cs @@ -9,15 +9,16 @@ #endregion using System.Collections.Generic; +using OpenRA.Traits; -namespace OpenRA.Traits +namespace OpenRA.Mods.RA { class HiddenUnderFogInfo : ITraitInfo { public object Create(ActorInitializer init) { return new HiddenUnderFog(init.self); } } - class HiddenUnderFog : IRenderModifier, IRadarVisibilityModifier + class HiddenUnderFog : IRenderModifier, IVisibilityModifier { Shroud shroud; @@ -33,11 +34,6 @@ namespace OpenRA.Traits || self.World.LocalPlayer.Shroud.Disabled || shroud.visibleCells[self.Location.X, self.Location.Y] > 0; } - - public bool VisibleOnRadar(Actor self) - { - return IsVisible(self); - } static Renderable[] Nothing = { }; public IEnumerable ModifyRender(Actor self, IEnumerable r) diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 31ad73afc4..c539de55cb 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -222,6 +222,9 @@ + + +