From d3244184c16714be7408ae2b3f275b46771a77ab Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 3 Oct 2010 07:06:49 +1300 Subject: [PATCH] implement order targeter for everything else --- OpenRA.Game/Traits/TraitsInterfaces.cs | 5 --- OpenRA.Mods.RA/Aircraft.cs | 5 ++- OpenRA.Mods.RA/ChronoshiftDeploy.cs | 31 ++++---------- OpenRA.Mods.RA/Helicopter.cs | 40 ++++++++---------- OpenRA.Mods.RA/Plane.cs | 58 ++++++++++++++++---------- OpenRA.Mods.RA/Render/RenderSpy.cs | 20 ++++----- 6 files changed, 74 insertions(+), 85 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 19e9efb8d9..ee84319a0f 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -33,11 +33,6 @@ namespace OpenRA.Traits public interface ITick { void Tick(Actor self); } public interface IRender { IEnumerable Render(Actor self); } - 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 IIssueOrder2 { IEnumerable Orders { get; } diff --git a/OpenRA.Mods.RA/Aircraft.cs b/OpenRA.Mods.RA/Aircraft.cs index 9247451d25..3b2a46d935 100755 --- a/OpenRA.Mods.RA/Aircraft.cs +++ b/OpenRA.Mods.RA/Aircraft.cs @@ -30,6 +30,7 @@ namespace OpenRA.Mods.RA public class Aircraft : IMove, IFacing, IOccupySpace { + protected readonly Actor self; [Sync] public int2 Location; [Sync] @@ -41,6 +42,7 @@ namespace OpenRA.Mods.RA public Aircraft( ActorInitializer init , AircraftInfo info) { + this.self = init.self; if (init.Contains()) this.Location = init.Get(); @@ -64,8 +66,9 @@ namespace OpenRA.Mods.RA self.CenterLocation = Util.CenterOfCell(cell); } - public bool AircraftCanEnter(Actor self, Actor a) + public bool AircraftCanEnter(Actor a) { + if( self.Owner != a.Owner ) return false; return Info.RearmBuildings.Contains( a.Info.Name ) || Info.RepairBuildings.Contains( a.Info.Name ); } diff --git a/OpenRA.Mods.RA/ChronoshiftDeploy.cs b/OpenRA.Mods.RA/ChronoshiftDeploy.cs index 4ae64865e0..665bb74ca8 100644 --- a/OpenRA.Mods.RA/ChronoshiftDeploy.cs +++ b/OpenRA.Mods.RA/ChronoshiftDeploy.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA public readonly int ChargeTime = 120; // Seconds } - class ChronoshiftDeploy : IIssueOrder, IResolveOrder, ITick, IPips, IOrderCursor, IOrderVoice + class ChronoshiftDeploy : IIssueOrder2, IResolveOrder, ITick, IPips, IOrderVoice { // Recharge logic [Sync] @@ -33,29 +33,22 @@ namespace OpenRA.Mods.RA chargeTick--; } - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + public IEnumerable Orders { - return 5; + get { yield return new DeployOrderTargeter( "ChronoshiftDeploy", 5, () => chargeTick <= 0 ); } } - - public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) + + public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) { - if (mi.Button == MouseButton.Right && xy == self.Location) - return new Order("ChronoshiftDeploy", self); + if( order.OrderID == "ChronoshiftDeploy" ) + if (chargeTick <= 0) + self.World.OrderGenerator = new SetChronoTankDestination( self ); return null; } public void ResolveOrder(Actor self, Order order) { - if (order.OrderString == "ChronoshiftDeploy") - { - if (chargeTick <= 0) - if (self.Owner == self.World.LocalPlayer) - self.World.OrderGenerator = new SetChronoTankDestination(self); - return; - } - var movement = self.TraitOrDefault(); if (order.OrderString == "ChronoshiftSelf" && movement.CanEnterCell(order.TargetLocation)) { @@ -76,14 +69,6 @@ namespace OpenRA.Mods.RA } } - public string CursorForOrder(Actor self, Order order) - { - if (order.OrderString != "ChronoshiftDeploy") - return null; - - return (chargeTick <= 0) ? "deploy" : "deploy-blocked"; - } - public string VoicePhraseForOrder(Actor self, Order order) { return (order.OrderString == "ChronoshiftDeploy" && chargeTick <= 0) ? "Move" : null; diff --git a/OpenRA.Mods.RA/Helicopter.cs b/OpenRA.Mods.RA/Helicopter.cs index 4a8da63cdd..539569c8e3 100644 --- a/OpenRA.Mods.RA/Helicopter.cs +++ b/OpenRA.Mods.RA/Helicopter.cs @@ -16,6 +16,7 @@ using OpenRA.Mods.RA.Activities; using OpenRA.Traits; using OpenRA.Traits.Activities; using System.Drawing; +using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA { @@ -29,7 +30,7 @@ namespace OpenRA.Mods.RA public override object Create( ActorInitializer init ) { return new Helicopter( init, this); } } - class Helicopter : Aircraft, ITick, IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice + class Helicopter : Aircraft, ITick, IIssueOrder2, IResolveOrder, IOrderVoice { public IDisposable reservation; HelicopterInfo Info; @@ -39,32 +40,25 @@ namespace OpenRA.Mods.RA Info = info; } - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + public IEnumerable Orders { - // 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; + get + { + yield return new EnterOrderTargeter( "Enter", 5, false, true, + target => AircraftCanEnter( target ), target => !Reservable.IsReserved( target ) ); - if (underCursor != null && AircraftCanEnter(self, underCursor) - && underCursor.Owner == self.Owner) - return new Order("Enter", self, underCursor); - - if (self.TraitOrDefault().CanEnterCell(xy)) - return new Order("Move", self, xy); - - return null; + yield return new AircraftMoveOrderTargeter(); + } } - - public string CursorForOrder(Actor self, Order order) + + public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) { - if (order.OrderString == "Move") return "move"; - if (order.OrderString == "Enter") - return Reservable.IsReserved(order.TargetActor) ? "enter-blocked" : "enter"; - + if( order.OrderID == "Enter" ) + return new Order( order.OrderID, self, target.Actor ); + + if( order.OrderID == "Move" ) + return new Order( order.OrderID, self, Util.CellContaining( target.CenterLocation ) ); + return null; } diff --git a/OpenRA.Mods.RA/Plane.cs b/OpenRA.Mods.RA/Plane.cs index e928f145aa..37991e3456 100644 --- a/OpenRA.Mods.RA/Plane.cs +++ b/OpenRA.Mods.RA/Plane.cs @@ -9,11 +9,13 @@ #endregion using System; +using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.Effects; using OpenRA.Mods.RA.Activities; using OpenRA.Traits; +using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA { @@ -22,7 +24,7 @@ namespace OpenRA.Mods.RA public override object Create( ActorInitializer init ) { return new Plane( init, this ); } } - public class Plane : Aircraft, IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice, ITick + public class Plane : Aircraft, IIssueOrder2, IResolveOrder, IOrderVoice, ITick { public IDisposable reservation; @@ -46,31 +48,28 @@ namespace OpenRA.Mods.RA } } - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + public IEnumerable Orders { - // Force move takes precidence - return mi.Modifiers.HasModifier(Modifiers.Alt) ? int.MaxValue : 0; + get + { + yield return new EnterOrderTargeter( "Enter", 5, false, true, + target => AircraftCanEnter( target ), target => !Reservable.IsReserved( target ) ); + + yield return new AircraftMoveOrderTargeter(); + } } - - public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) + + public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) { - if (mi.Button == MouseButton.Left) return null; - if (underCursor != null && AircraftCanEnter(self, underCursor) - && underCursor.Owner == self.Owner) - return new Order("Enter", self, underCursor); - - return new Order("Move", self, xy); - } - - public string CursorForOrder(Actor self, Order order) - { - if (order.OrderString == "Move") return "move"; - if (order.OrderString == "Enter") - return Reservable.IsReserved(order.TargetActor) ? "enter-blocked" : "enter"; - + if( order.OrderID == "Enter" ) + return new Order( order.OrderID, self, target.Actor ); + + if( order.OrderID == "Move" ) + return new Order( order.OrderID, self, Util.CellContaining( target.CenterLocation ) ); + return null; } - + public string VoicePhraseForOrder(Actor self, Order order) { return (order.OrderString == "Move" || order.OrderString == "Enter") ? "Move" : null; @@ -134,4 +133,21 @@ namespace OpenRA.Mods.RA } } } + + class AircraftMoveOrderTargeter : IOrderTargeter + { + public string OrderID { get { return "Move"; } } + public int OrderPriority { get { return 4; } } + + public bool CanTargetUnit( Actor self, Actor target, bool forceAttack, bool forceMove, ref string cursor ) + { + return false; + } + + public bool CanTargetLocation( Actor self, int2 location, List actorsAtLocation, bool forceAttack, bool forceMove, ref string cursor ) + { + cursor = "move"; + return true; + } + } } diff --git a/OpenRA.Mods.RA/Render/RenderSpy.cs b/OpenRA.Mods.RA/Render/RenderSpy.cs index d62ed3f837..987ee46293 100755 --- a/OpenRA.Mods.RA/Render/RenderSpy.cs +++ b/OpenRA.Mods.RA/Render/RenderSpy.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Traits; +using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA.Render { @@ -19,7 +20,7 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderSpy(init.self); } } - class RenderSpy : RenderInfantry, IRenderModifier, IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice + class RenderSpy : RenderInfantry, IRenderModifier, IIssueOrder2, IResolveOrder, IOrderVoice { Player disguisedAsPlayer; string disguisedAsSprite; @@ -55,25 +56,20 @@ namespace OpenRA.Mods.RA.Render } } } - - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + + public IEnumerable Orders { - return 5; + get { yield return new UnitTraitOrderTargeter( "Disguise", 5, "ability", true, true ); } } - public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) + public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) { - if (underCursor != null && underCursor.HasTrait()) - return new Order("Disguise", self, underCursor); + if( order.OrderID == "Disguise" ) + return new Order( order.OrderID, self, target.Actor ); return null; } - public string CursorForOrder(Actor self, Order order) - { - return order.OrderString == "Disguise" ? "ability" : null; - } - public string VoicePhraseForOrder(Actor self, Order order) { return order.OrderString == "Disguise" ? "Attack" : null;