diff --git a/OpenRA.FileFormats/WRange.cs b/OpenRA.FileFormats/WRange.cs index 216f8bd77e..003e2d308a 100644 --- a/OpenRA.FileFormats/WRange.cs +++ b/OpenRA.FileFormats/WRange.cs @@ -27,6 +27,9 @@ namespace OpenRA public static WRange operator +(WRange a, WRange b) { return new WRange(a.Range + b.Range); } public static WRange operator -(WRange a, WRange b) { return new WRange(a.Range - b.Range); } public static WRange operator -(WRange a) { return new WRange(-a.Range); } + public static WRange operator /(WRange a, int b) { return new WRange(a.Range / b); } + public static WRange operator *(WRange a, int b) { return new WRange(a.Range * b); } + public static WRange operator *(int a, WRange b) { return new WRange(a * b.Range); } public static bool operator ==(WRange me, WRange other) { return (me.Range == other.Range); } public static bool operator !=(WRange me, WRange other) { return !(me == other); } diff --git a/OpenRA.Game/CPos.cs b/OpenRA.Game/CPos.cs index 82b17d3d8b..b1743ea037 100644 --- a/OpenRA.Game/CPos.cs +++ b/OpenRA.Game/CPos.cs @@ -41,7 +41,9 @@ namespace OpenRA public int2 ToInt2() { return new int2(X, Y); } public PPos ToPPos() { return new PPos(Game.CellSize * X, Game.CellSize * Y); } - public WPos CenterPosition { get { return new WPos(1024*X + 512, 1024*Y + 512, 0); } } + public WPos CenterPosition { get { return new WPos(1024 * X + 512, 1024 * Y + 512, 0); } } + public WPos TopLeft { get { return new WPos(1024 * X, 1024 * Y, 0); } } + public WPos BottomRight { get { return new WPos(1024 * X + 1023, 1024 * Y + 1023, 0); } } public CPos Clamp(Rectangle r) { diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 64c47d5af5..0472512ec4 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -27,6 +27,16 @@ namespace OpenRA return FindUnits(world, loc, loc).Where(a => !world.FogObscures(a)); } + public static IEnumerable FindUnits(this World world, CPos tl, CPos br) + { + return world.FindUnits(tl.TopLeft, br.BottomRight); + } + + public static IEnumerable FindUnits(this World world, WPos tl, WPos br) + { + return world.FindUnits(PPos.FromWPos(tl), PPos.FromWPos(br)); + } + public static IEnumerable FindUnits(this World world, PPos a, PPos b) { var u = PPos.Min(a, b); @@ -34,6 +44,17 @@ namespace OpenRA return world.WorldActor.Trait().ActorsInBox(u,v); } + public static Actor ClosestTo(this IEnumerable actors, Actor a) + { + var pos = a.CenterPosition; + return actors.OrderBy(b => (b.CenterPosition - pos).LengthSquared).FirstOrDefault(); + } + + public static Actor ClosestTo(this IEnumerable actors, WPos pos) + { + return actors.OrderBy(a => (a.CenterPosition - pos).LengthSquared).FirstOrDefault(); + } + public static Actor ClosestTo(this IEnumerable actors, PPos px) { return actors.OrderBy( a => (a.CenterLocation - px).LengthSquared ).FirstOrDefault();