Begin imposing sanity on order ordering

This commit is contained in:
Paul Chote
2010-09-12 18:10:34 +12:00
parent 1bc2136771
commit 2b6328f0ee
21 changed files with 108 additions and 14 deletions

View File

@@ -121,7 +121,8 @@ namespace OpenRA
.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 ) )
.Select( x => x.IssueOrder( this, xy, mi, underCursor ) )
.FirstOrDefault( x => x != null );
}

View File

@@ -113,22 +113,21 @@ namespace OpenRA.Traits
self.CenterLocation = Util.CenterOfCell(fromCell);
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
// Force move takes precidence
return mi.Modifiers.HasModifier(Modifiers.Alt) ? int.MaxValue : 0;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (Info.OnRails) return null;
if (mi.Button == MouseButton.Left) return null;
// force-fire should *always* take precedence over move.
if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) return null;
if (underCursor != null && underCursor.Owner != null)
{
// force-move
if (!mi.Modifiers.HasModifier(Modifiers.Alt)) return null;
if (!CanEnterCell(underCursor.Location, null, true)) return null;
}
if (MovementSpeedForCell(self, toCell) == 0) return null; /* allow disabling move orders from modifiers */
if (!CanEnterCell(xy))
return null;
if (xy == toCell) return null;
return new Order("Move", self, xy, mi.Modifiers.HasModifier(Modifiers.Shift));

View File

@@ -24,6 +24,11 @@ namespace OpenRA.Traits
{
yield return (isPrimary) ? TagType.Primary : TagType.None;
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 0;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{

View File

@@ -42,6 +42,11 @@ namespace OpenRA.Traits
anim.Image, Util.CenterOfCell(rallyPoint));
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 0;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Left || underCursor != null) return null;

View File

@@ -33,7 +33,11 @@ namespace OpenRA.Traits
public interface ITick { void Tick(Actor self); }
public interface IRender { IEnumerable<Renderable> Render(Actor self); }
public interface IIssueOrder { Order IssueOrder( Actor self, int2 xy, MouseInput mi, Actor underCursor ); }
public interface IIssueOrder
{
Order IssueOrder( Actor self, int2 xy, MouseInput mi, Actor underCursor );
int OrderPriority( Actor self, int2 xy, MouseInput mi, Actor underCursor );
}
public interface IResolveOrder { void ResolveOrder(Actor self, Order order); }
public interface IOrderCursor { string CursorForOrder(Actor self, Order order); }
public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); }

View File

@@ -174,6 +174,11 @@ namespace OpenRA.Mods.RA
return info.FireDelay;
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return mi.Modifiers.HasModifier(Modifiers.Ctrl) ? int.MaxValue : 1;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Left) return null;

View File

@@ -23,6 +23,11 @@ namespace OpenRA.Mods.RA
class C4Demolition : IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice
{
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;

View File

@@ -26,6 +26,11 @@ namespace OpenRA.Mods.RA
List<Actor> cargo = new List<Actor>();
public IEnumerable<Actor> Passengers { get { return cargo; } }
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Right && underCursor == self)

View File

@@ -33,6 +33,11 @@ namespace OpenRA.Mods.RA
chargeTick--;
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Right && xy == self.Location)

View File

@@ -19,6 +19,11 @@ namespace OpenRA.Mods.RA
class EngineerCaptureInfo : TraitInfo<EngineerCapture> {}
class EngineerCapture : IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice
{
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;

View File

@@ -20,6 +20,11 @@ namespace OpenRA.Mods.RA
class EngineerRepair : IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice
{
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;

View File

@@ -91,6 +91,11 @@ namespace OpenRA.Mods.RA
proc.Trait<IAcceptOre>().GiveOre(contents.Sum(kv => kv.Key.ValuePerUnit * kv.Value));
contents.Clear();
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)

View File

@@ -39,10 +39,15 @@ namespace OpenRA.Mods.RA
Info = info;
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
// Force move takes precidence
return mi.Modifiers.HasModifier(Modifiers.Alt) ? int.MaxValue : 0;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Left) return null;
if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) return null;
if (underCursor == null)
if (self.TraitOrDefault<IMove>().CanEnterCell(xy))

View File

@@ -32,6 +32,11 @@ namespace OpenRA.Mods.RA
public int2[] minefield = null;
[Sync] int2 minefieldStart;
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Right && underCursor == null && mi.Modifiers.HasModifier(Modifiers.Ctrl))

View File

@@ -25,6 +25,11 @@ namespace OpenRA.Mods.RA
class Passenger : IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice
{
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right)

View File

@@ -46,6 +46,12 @@ namespace OpenRA.Mods.RA
}
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
// Force move takes precidence
return mi.Modifiers.HasModifier(Modifiers.Alt) ? int.MaxValue : 0;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Left) return null;

View File

@@ -45,6 +45,11 @@ namespace OpenRA.Mods.RA.Render
if (order.OrderString == "Disguise")
disguisedAs = order.TargetActor == self ? null : order.TargetActor;
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{

View File

@@ -31,11 +31,15 @@ namespace OpenRA.Mods.RA
Health = self.Trait<Health>();
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;
if (underCursor == null) return null;
if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) return null; // force-fire, so don't do this.
if (self.Info.Traits.Get<RepairableInfo>().RepairBuildings.Contains(underCursor.Info.Name)
&& underCursor.Owner == self.Owner)

View File

@@ -24,6 +24,11 @@ namespace OpenRA.Mods.RA
class RepairableNear : IIssueOrder, IResolveOrder, IOrderCursor
{
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;

View File

@@ -19,6 +19,11 @@ namespace OpenRA.Mods.RA
class Spy : IIssueOrder, IResolveOrder, IOrderCursor
{
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button != MouseButton.Right) return null;

View File

@@ -38,6 +38,11 @@ namespace OpenRA.Mods.RA
bi = Rules.Info[info.IntoActor].Traits.GetOrDefault<BuildingInfo>();
}
public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
return 5;
}
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{
if (mi.Button == MouseButton.Right && self == underCursor)