Improve semantics of selection cursor, plus free perf.

This commit is contained in:
Paul Chote
2010-09-12 19:25:05 +12:00
parent bd735059d0
commit 8286dba919
2 changed files with 17 additions and 13 deletions

View File

@@ -105,7 +105,7 @@ namespace OpenRA
return mods.Aggregate(sprites, (m, p) => p.ModifyRender(this, m)); return mods.Aggregate(sprites, (m, p) => p.ModifyRender(this, m));
} }
public Order Order( int2 xy, MouseInput mi ) public Order Order( int2 xy, MouseInput mi, Actor underCursor )
{ {
if (Owner != World.LocalPlayer) if (Owner != World.LocalPlayer)
return null; return null;
@@ -115,11 +115,6 @@ namespace OpenRA
if (Destroyed) if (Destroyed)
return null; return null;
var underCursor = World.FindUnitsAtMouse(mi.Location)
.Where(a => a.Info.Traits.Contains<TargetableInfo>())
.OrderByDescending(a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue)
.FirstOrDefault();
return TraitsImplementing<IIssueOrder>() return TraitsImplementing<IIssueOrder>()
.OrderByDescending( x => x.OrderPriority( this, xy, mi, underCursor ) ) .OrderByDescending( x => x.OrderPriority( this, xy, mi, underCursor ) )

View File

@@ -18,9 +18,9 @@ namespace OpenRA.Orders
class UnitOrderGenerator : IOrderGenerator class UnitOrderGenerator : IOrderGenerator
{ {
public IEnumerable<Order> Order( World world, int2 xy, MouseInput mi ) public IEnumerable<Order> Order( World world, int2 xy, MouseInput mi )
{ {
var orders = world.Selection.Actors var orders = world.Selection.Actors
.Select(a => a.Order(xy, mi)) .Select(a => a.Order(xy, mi, UnderCursor(world, mi)))
.Where(o => o != null) .Where(o => o != null)
.ToArray(); .ToArray();
@@ -55,17 +55,26 @@ namespace OpenRA.Orders
Game.Renderer.Flush(); Game.Renderer.Flush();
} }
public string GetCursor( World world, int2 xy, MouseInput mi ) public Actor UnderCursor(World world, MouseInput mi)
{ {
return world.FindUnitsAtMouse(mi.Location)
.Where(a => a.Info.Traits.Contains<TargetableInfo>())
.OrderByDescending(a => a.Info.Traits.Contains<SelectableInfo>() ? a.Info.Traits.Get<SelectableInfo>().Priority : int.MinValue)
.FirstOrDefault();
}
public string GetCursor( World world, int2 xy, MouseInput mi )
{
if (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())
if (UnderCursor(world, mi) != null)
return "select";
var c = Order(world, xy, mi) var c = Order(world, xy, mi)
.Select(o => o.Subject.TraitsImplementing<IOrderCursor>() .Select(o => o.Subject.TraitsImplementing<IOrderCursor>()
.Select(pc => pc.CursorForOrder(o.Subject, o)).FirstOrDefault(a => a != null)) .Select(pc => pc.CursorForOrder(o.Subject, o)).FirstOrDefault(a => a != null))
.FirstOrDefault(a => a != null); .FirstOrDefault(a => a != null);
return c ?? return c ?? "default";
(world.FindUnitsAtMouse(mi.Location)
.Any(a => a.Info.Traits.Contains<SelectableInfo>())
? "select" : "default");
} }
} }
} }