diff --git a/OpenRA.Mods.RA/EngineerCapture.cs b/OpenRA.Mods.RA/EngineerCapture.cs index 81174fa3a0..7bb9325762 100644 --- a/OpenRA.Mods.RA/EngineerCapture.cs +++ b/OpenRA.Mods.RA/EngineerCapture.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA get { yield return new EnterBuildingOrderTargeter( "CaptureBuilding", 5, true, false, - target => target.Info.Traits.Get().Capturable ); + _ => true, target => target.Info.Traits.Get().Capturable ); } } diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index e283da641d..1a52d24419 100644 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -98,7 +98,7 @@ namespace OpenRA.Mods.RA { get { - yield return new EnterBuildingOrderTargeter( "Deliver", 5, false, true, _ => !IsEmpty ); + yield return new EnterBuildingOrderTargeter( "Deliver", 5, false, true, _ => true, _ => !IsEmpty ); yield return new HarvestOrderTargeter(); } } diff --git a/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs b/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs index dc8deec02d..38b6205372 100755 --- a/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs +++ b/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs @@ -8,18 +8,21 @@ namespace OpenRA.Mods.RA.Orders { class EnterBuildingOrderTargeter : UnitTraitOrderTargeter { + readonly Func canTarget; readonly Func useEnterCursor; - public EnterBuildingOrderTargeter( string order, int priority, bool targetEnemy, bool targetAlly, Func useEnterCursor ) + public EnterBuildingOrderTargeter( string order, int priority, bool targetEnemy, bool targetAlly, + Func canTarget, Func useEnterCursor ) : base( order, priority, "enter", targetEnemy, targetAlly ) { + this.canTarget = canTarget; this.useEnterCursor = useEnterCursor; } public override bool CanTargetUnit( Actor self, Actor target, bool forceAttack, bool forceMove, ref string cursor ) { if( !base.CanTargetUnit( self, target, forceAttack, forceMove, ref cursor ) ) return false; - + if( !canTarget( target ) ) return false; cursor = useEnterCursor( target ) ? "enter" : "enter-blocked"; return true; } diff --git a/OpenRA.Mods.RA/Repairable.cs b/OpenRA.Mods.RA/Repairable.cs index c37cbb6a75..3d544a1f74 100644 --- a/OpenRA.Mods.RA/Repairable.cs +++ b/OpenRA.Mods.RA/Repairable.cs @@ -14,6 +14,8 @@ using OpenRA.Effects; using OpenRA.Traits; using OpenRA.Traits.Activities; using System.Drawing; +using System.Collections.Generic; +using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA { @@ -23,53 +25,51 @@ namespace OpenRA.Mods.RA public virtual object Create(ActorInitializer init) { return new Repairable(init.self); } } - class Repairable : IIssueOrder, IResolveOrder, IOrderCursor, IOrderVoice + class Repairable : IIssueOrder2, IResolveOrder, IOrderVoice { - Health Health; + readonly Actor self; + readonly Health Health; + public Repairable(Actor self) { + this.self = self; Health = self.Trait(); } - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + public IEnumerable Orders { - return 5; + get { yield return new EnterBuildingOrderTargeter( "Repair", 5, false, true, target => CanRepairAt( target ), _ => CanRepair() ); } } - - public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) - { - if (mi.Button != MouseButton.Right) return null; - if (underCursor == null) return null; - if (self.Info.Traits.Get().RepairBuildings.Contains(underCursor.Info.Name) - && underCursor.Owner == self.Owner) - return new Order("Repair", self, underCursor); + public Order IssueOrder( Actor self, IOrderTargeter order, Target target ) + { + if( order.OrderID == "Repair" ) + return new Order( order.OrderID, self, target.Actor ); return null; } - - bool CanRepair(Actor self) + + bool CanRepairAt( Actor target ) + { + return self.Info.Traits.Get().RepairBuildings.Contains( target.Info.Name ); + } + + bool CanRepair() { var li = self.TraitOrDefault(); return (Health.DamageState > DamageState.Undamaged || (li != null && !li.FullAmmo()) ); } - public string CursorForOrder(Actor self, Order order) - { - if (order.OrderString != "Repair") return null; - return CanRepair(self) ? "enter" : "enter-blocked"; - } - public string VoicePhraseForOrder(Actor self, Order order) { - return (order.OrderString == "Repair" && CanRepair(self)) ? "Move" : null; + return (order.OrderString == "Repair" && CanRepair()) ? "Move" : null; } public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "Repair") { - if (!CanRepair(self)) + if( !CanRepairAt( order.TargetActor ) || !CanRepair() ) return; var rp = order.TargetActor.TraitOrDefault(); diff --git a/OpenRA.Mods.RA/RepairableNear.cs b/OpenRA.Mods.RA/RepairableNear.cs index bda386be34..e28959d0e8 100644 --- a/OpenRA.Mods.RA/RepairableNear.cs +++ b/OpenRA.Mods.RA/RepairableNear.cs @@ -13,43 +13,55 @@ using OpenRA.Mods.RA.Activities; using OpenRA.Traits; using OpenRA.Traits.Activities; using System.Drawing; +using System.Collections.Generic; +using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA { - class RepairableNearInfo : TraitInfo, ITraitPrerequisite + class RepairableNearInfo : ITraitInfo, ITraitPrerequisite { [ActorReference] public readonly string[] Buildings = { "spen", "syrd" }; + + public object Create( ActorInitializer init ) { return new RepairableNear( init.self ); } } - class RepairableNear : IIssueOrder, IResolveOrder, IOrderCursor + class RepairableNear : IIssueOrder2, IResolveOrder { - public int OrderPriority(Actor self, int2 xy, MouseInput mi, Actor underCursor) + readonly Actor self; + + public RepairableNear( Actor self ) { this.self = self; } + + public IEnumerable Orders { - return 5; + get + { + yield return new EnterBuildingOrderTargeter( "RepairNear", 5, false, true, + target => CanRepairAt( target ), _ => ShouldRepair() ); + } } - - 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) return null; - if (underCursor == null) return null; - - if (underCursor.Owner == self.Owner && - self.Info.Traits.Get().Buildings.Contains( underCursor.Info.Name ) && - self.GetDamageState() > DamageState.Undamaged) - return new Order("Enter", self, underCursor); + if( order.OrderID == "RepairNear" ) + return new Order( order.OrderID, self, target.Actor ); return null; } - public string CursorForOrder(Actor self, Order order) + bool CanRepairAt( Actor target ) { - return (order.OrderString == "Enter") ? "enter" : null; + return self.Info.Traits.Get().Buildings.Contains( target.Info.Name ); } - + + bool ShouldRepair() + { + return self.GetDamageState() > DamageState.Undamaged; + } + public void ResolveOrder(Actor self, Order order) { - if (order.OrderString == "Enter") + if (order.OrderString == "RepairNear" && CanRepairAt(order.TargetActor) && ShouldRepair()) { self.CancelActivity(); self.QueueActivity(new Move(order.TargetActor, 1));