Reduce duplication in UnitOrderGenerator.

This commit is contained in:
Paul Chote
2015-11-26 18:25:39 +00:00
parent 262f547271
commit 7b31f18046

View File

@@ -17,30 +17,37 @@ namespace OpenRA.Orders
{ {
class UnitOrderGenerator : IOrderGenerator class UnitOrderGenerator : IOrderGenerator
{ {
public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi) static Target TargetForInput(World world, CPos xy, MouseInput mi)
{ {
var underCursor = world.ScreenMap.ActorsAt(mi) var actor = world.ScreenMap.ActorsAt(mi)
.Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo<ITargetableInfo>()) .Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo<ITargetableInfo>())
.WithHighestSelectionPriority(); .WithHighestSelectionPriority();
Target target; if (actor != null)
if (underCursor != null) return Target.FromActor(actor);
target = Target.FromActor(underCursor);
else
{
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi) var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
.Where(a => a.Info.HasTraitInfo<ITargetableInfo>() && a.Visible && a.HasRenderables) .Where(a => a.Info.HasTraitInfo<ITargetableInfo>() && a.Visible && a.HasRenderables)
.WithHighestSelectionPriority(); .WithHighestSelectionPriority();
target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(world, xy);
if (frozen != null)
return Target.FromFrozenActor(frozen);
return Target.FromCell(world, xy);
} }
public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi)
{
var target = TargetForInput(world, xy, mi);
var orders = world.Selection.Actors var orders = world.Selection.Actors
.Select(a => OrderForUnit(a, target, mi)) .Select(a => OrderForUnit(a, target, mi))
.Where(o => o != null) .Where(o => o != null)
.ToList(); .ToList();
var actorsInvolved = orders.Select(o => o.Actor).Distinct(); var actorsInvolved = orders.Select(o => o.Actor).Distinct();
if (actorsInvolved.Any()) if (!actorsInvolved.Any())
yield break;
yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, false) yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, false)
{ {
TargetString = actorsInvolved.Select(a => a.ActorID).JoinWith(",") TargetString = actorsInvolved.Select(a => a.ActorID).JoinWith(",")
@@ -57,26 +64,10 @@ namespace OpenRA.Orders
public string GetCursor(World world, CPos xy, MouseInput mi) public string GetCursor(World world, CPos xy, MouseInput mi)
{ {
var useSelect = false; var useSelect = false;
var underCursor = world.ScreenMap.ActorsAt(mi) var target = TargetForInput(world, xy, mi);
.Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo<ITargetableInfo>()) if (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo<SelectableInfo>() &&
.WithHighestSelectionPriority(); (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()))
if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()))
{
if (underCursor.Info.HasTraitInfo<SelectableInfo>())
useSelect = true; useSelect = true;
}
Target target;
if (underCursor != null)
target = Target.FromActor(underCursor);
else
{
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
.Where(a => a.Info.HasTraitInfo<ITargetableInfo>() && a.Visible && a.HasRenderables)
.WithHighestSelectionPriority();
target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(world, xy);
}
var ordersWithCursor = world.Selection.Actors var ordersWithCursor = world.Selection.Actors
.Select(a => OrderForUnit(a, target, mi)) .Select(a => OrderForUnit(a, target, mi))
@@ -94,7 +85,6 @@ namespace OpenRA.Orders
var underCursor = world.Selection.Actors.WithHighestSelectionPriority(); var underCursor = world.Selection.Actors.WithHighestSelectionPriority();
var o = OrderForUnit(underCursor, target, mi); var o = OrderForUnit(underCursor, target, mi);
if (o != null && o.Order.OverrideSelection) if (o != null && o.Order.OverrideSelection)
return false; return false;
@@ -103,6 +93,9 @@ namespace OpenRA.Orders
static UnitOrderResult OrderForUnit(Actor self, Target target, MouseInput mi) static UnitOrderResult OrderForUnit(Actor self, Target target, MouseInput mi)
{ {
if (mi.Button != Game.Settings.Game.MouseButtonPreference.Action)
return null;
if (self.Owner != self.World.LocalPlayer) if (self.Owner != self.World.LocalPlayer)
return null; return null;
@@ -112,15 +105,6 @@ namespace OpenRA.Orders
if (self.Disposed || !target.IsValidFor(self)) if (self.Disposed || !target.IsValidFor(self))
return null; return null;
if (mi.Button == Game.Settings.Game.MouseButtonPreference.Action)
{
foreach (var o in self.TraitsImplementing<IIssueOrder>()
.SelectMany(trait => trait.Orders
.Select(x => new { Trait = trait, Order = x }))
.OrderByDescending(x => x.Order.OrderPriority))
{
var actorsAt = self.World.ActorMap.GetActorsAt(self.World.Map.CellContaining(target.CenterPosition)).ToList();
var modifiers = TargetModifiers.None; var modifiers = TargetModifiers.None;
if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) if (mi.Modifiers.HasModifier(Modifiers.Ctrl))
modifiers |= TargetModifiers.ForceAttack; modifiers |= TargetModifiers.ForceAttack;
@@ -129,11 +113,18 @@ namespace OpenRA.Orders
if (mi.Modifiers.HasModifier(Modifiers.Alt)) if (mi.Modifiers.HasModifier(Modifiers.Alt))
modifiers |= TargetModifiers.ForceMove; modifiers |= TargetModifiers.ForceMove;
var actorsAt = self.World.ActorMap.GetActorsAt(self.World.Map.CellContaining(target.CenterPosition)).ToList();
foreach (var o in self.TraitsImplementing<IIssueOrder>()
.SelectMany(trait => trait.Orders
.Select(x => new { Trait = trait, Order = x }))
.OrderByDescending(x => x.Order.OrderPriority))
{
var localModifiers = modifiers;
string cursor = null; string cursor = null;
if (o.Order.CanTarget(self, target, actorsAt, ref modifiers, ref cursor)) if (o.Order.CanTarget(self, target, actorsAt, ref localModifiers, ref cursor))
return new UnitOrderResult(self, o.Order, o.Trait, cursor, target); return new UnitOrderResult(self, o.Order, o.Trait, cursor, target);
} }
}
return null; return null;
} }