From a09a6997b4af1c6f24e685eead6c961a380df132 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 22 Jul 2010 20:26:19 +1200 Subject: [PATCH] Radar takes into account visibility under fog --- OpenRA.Game/Traits/Building.cs | 9 ++++++--- OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs | 7 ++++++- OpenRA.Game/Traits/Modifiers/HiddenUnderFog.cs | 7 ++++++- OpenRA.Game/Traits/TraitsInterfaces.cs | 6 ++---- OpenRA.Game/Traits/Unit.cs | 9 ++++++--- OpenRA.Mods.RA/RadarColorFromTerrain.cs | 3 ++- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/OpenRA.Game/Traits/Building.cs b/OpenRA.Game/Traits/Building.cs index 6b261c49e6..407f68e6d7 100644 --- a/OpenRA.Game/Traits/Building.cs +++ b/OpenRA.Game/Traits/Building.cs @@ -164,14 +164,17 @@ namespace OpenRA.Traits public IEnumerable RadarSignatureCells(Actor self) { + foreach (var mod in self.World.Queries.WithTraitMultiple()) + if (!mod.Trait.VisibleOnRadar(self)) + return new int2[] {}; + return Footprint.Tiles(self); } public Color RadarSignatureColor(Actor self) { - var mod = self.traits.WithInterface().FirstOrDefault(); - if (mod != null) - return mod.RadarColorOverride(self); + foreach (var mod in self.World.Queries.WithTraitMultiple()) + return mod.Trait.RadarColorOverride(self); return self.Owner.Color; } diff --git a/OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs b/OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs index 6b546ad3ec..b32c85b3f2 100644 --- a/OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Game/Traits/Modifiers/FrozenUnderFog.cs @@ -18,7 +18,7 @@ namespace OpenRA.Traits public object Create(ActorInitializer init) { return new FrozenUnderFog(init.self); } } - class FrozenUnderFog : IRenderModifier + class FrozenUnderFog : IRenderModifier, IRadarVisibilityModifier { Shroud shroud; Renderable[] cache = { }; @@ -35,6 +35,11 @@ namespace OpenRA.Traits || 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.Game/Traits/Modifiers/HiddenUnderFog.cs index 4a663302cf..e44d35d724 100644 --- a/OpenRA.Game/Traits/Modifiers/HiddenUnderFog.cs +++ b/OpenRA.Game/Traits/Modifiers/HiddenUnderFog.cs @@ -17,7 +17,7 @@ namespace OpenRA.Traits public object Create(ActorInitializer init) { return new HiddenUnderFog(init.self); } } - class HiddenUnderFog : IRenderModifier + class HiddenUnderFog : IRenderModifier, IRadarVisibilityModifier { Shroud shroud; @@ -33,6 +33,11 @@ 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.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 59d953af26..e2769c2497 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -61,10 +61,8 @@ namespace OpenRA.Traits Color RadarSignatureColor(Actor self); } - public interface IRadarSignatureModifier - { - Color RadarColorOverride(Actor self); - } + public interface IRadarVisibilityModifier { bool VisibleOnRadar(Actor self); } + public interface IRadarColorModifier { Color RadarColorOverride(Actor self); } public interface IOccupySpace { diff --git a/OpenRA.Game/Traits/Unit.cs b/OpenRA.Game/Traits/Unit.cs index aacfd22896..444fd2c173 100755 --- a/OpenRA.Game/Traits/Unit.cs +++ b/OpenRA.Game/Traits/Unit.cs @@ -39,14 +39,17 @@ namespace OpenRA.Traits public IEnumerable RadarSignatureCells(Actor self) { + foreach (var mod in self.World.Queries.WithTraitMultiple()) + if (!mod.Trait.VisibleOnRadar(self)) + yield break; + yield return self.Location; } public Color RadarSignatureColor(Actor self) { - var mod = self.traits.WithInterface().FirstOrDefault(); - if (mod != null) - return mod.RadarColorOverride(self); + foreach (var mod in self.World.Queries.WithTraitMultiple()) + return mod.Trait.RadarColorOverride(self); return self.Owner.Color; } diff --git a/OpenRA.Mods.RA/RadarColorFromTerrain.cs b/OpenRA.Mods.RA/RadarColorFromTerrain.cs index 4cfd1b9610..d552affa51 100644 --- a/OpenRA.Mods.RA/RadarColorFromTerrain.cs +++ b/OpenRA.Mods.RA/RadarColorFromTerrain.cs @@ -21,7 +21,7 @@ namespace OpenRA.Traits public object Create( ActorInitializer init ) { return new RadarColorFromTerrain(init.self,Terrain); } } - public class RadarColorFromTerrain : IRadarSignatureModifier + public class RadarColorFromTerrain : IRadarColorModifier { Color c; public RadarColorFromTerrain(Actor self, string terrain) @@ -29,6 +29,7 @@ namespace OpenRA.Traits c = self.World.TileSet.Terrain[terrain].Color; } + public bool VisibleOnRadar(Actor self) { return true; } public Color RadarColorOverride(Actor self) { return c;