diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 7b40c1c6fb..be236ea26a 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -550,6 +550,7 @@ + diff --git a/OpenRA.Mods.RA/WithRangeCircle.cs b/OpenRA.Mods.RA/WithRangeCircle.cs new file mode 100644 index 0000000000..c6f885f26a --- /dev/null +++ b/OpenRA.Mods.RA/WithRangeCircle.cs @@ -0,0 +1,76 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 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. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + [Desc("Renders an arbitrary circle when selected or placing a structure")] + class WithRangeCircleInfo : ITraitInfo, IPlaceBuildingDecoration + { + [Desc("Type of range circle. used to decide which circles to draw on other structures during building placement.")] + public readonly string Type = null; + + [Desc("Color of the circle")] + public readonly Color Color = Color.FromArgb(128, Color.White); + + [Desc("Range of the circle")] + public readonly WRange Range = WRange.Zero; + + public IEnumerable Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) + { + yield return new RangeCircleRenderable( + centerPosition, + Range, + 0, + Color, + Color.FromArgb(96, Color.Black) + ); + + foreach (var a in w.ActorsWithTrait()) + if (a.Actor.Owner == a.Actor.World.LocalPlayer && a.Trait.Info.Type == Type) + foreach (var r in a.Trait.RenderAfterWorld(wr)) + yield return r; + } + + public object Create(ActorInitializer init) { return new WithRangeCircle(init.self, this); } + } + + class WithRangeCircle : IPostRenderSelection + { + public readonly WithRangeCircleInfo Info; + readonly Actor self; + + public WithRangeCircle(Actor self, WithRangeCircleInfo info) + { + this.self = self; + Info = info; + } + + public IEnumerable RenderAfterWorld(WorldRenderer wr) + { + if (self.Owner != self.World.LocalPlayer) + yield break; + + yield return new RangeCircleRenderable( + self.CenterPosition, + Info.Range, + 0, + Info.Color, + Color.FromArgb(96, Color.Black) + ); + } + } +} +