From 4ca777597f72bcbb27000aaf629ad05e0534cfad Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 15 Apr 2013 22:31:09 +1200 Subject: [PATCH] Replace UnitTraitOrderTargeter with TargetTypeOrderTargeter. This also makes naval buildings untargetable for c4 and demo trucks, as they don't make much sense. --- OpenRA.Mods.RA/C4Demolition.cs | 5 +-- OpenRA.Mods.RA/Captures.cs | 32 ++++++++++++------- OpenRA.Mods.RA/DemoTruck.cs | 2 +- OpenRA.Mods.RA/EngineerRepair.cs | 2 +- OpenRA.Mods.RA/Infiltrates.cs | 12 ++++--- .../Orders/EnterBuildingOrderTargeter.cs | 19 +++++++---- OpenRA.Mods.RA/Orders/UnitOrderTargeter.cs | 17 +++++++--- OpenRA.Mods.RA/Spy.cs | 2 +- OpenRA.Mods.RA/SupplyTruck.cs | 13 +++++--- mods/cnc-classic/rules/defaults.yaml | 2 +- mods/cnc/rules/defaults.yaml | 6 ++-- mods/d2k/rules/defaults.yaml | 3 +- mods/d2k/rules/structures.yaml | 2 +- mods/ra-classic/rules/defaults.yaml | 6 ++-- mods/ra/rules/civilian.yaml | 6 ++-- mods/ra/rules/defaults.yaml | 8 ++--- 16 files changed, 81 insertions(+), 56 deletions(-) diff --git a/OpenRA.Mods.RA/C4Demolition.cs b/OpenRA.Mods.RA/C4Demolition.cs index cd46a527eb..f200ef8bad 100644 --- a/OpenRA.Mods.RA/C4Demolition.cs +++ b/OpenRA.Mods.RA/C4Demolition.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.RA public IEnumerable Orders { - get { yield return new UnitTraitOrderTargeter("C4", 6, "c4", true, false); } + get { yield return new TargetTypeOrderTargeter("C4", "C4", 6, "c4", true, false); } } public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) @@ -62,7 +62,4 @@ namespace OpenRA.Mods.RA return (order.OrderString == "C4") ? "Attack" : null; } } - - class C4DemolishableInfo : TraitInfo { } - class C4Demolishable { } } diff --git a/OpenRA.Mods.RA/Captures.cs b/OpenRA.Mods.RA/Captures.cs index 8f3700b4ef..08b1383e48 100644 --- a/OpenRA.Mods.RA/Captures.cs +++ b/OpenRA.Mods.RA/Captures.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.RA public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) { - if( order.OrderID == "CaptureActor" ) + if (order.OrderID == "CaptureActor") return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; return null; @@ -64,7 +64,8 @@ namespace OpenRA.Mods.RA { if (order.OrderString == "CaptureActor") { - if (!CanCapture(order.TargetActor)) return; + if (!CanCapture(order.TargetActor)) + return; self.SetTargetLine(Target.FromOrder(order), Color.Red); @@ -76,17 +77,17 @@ namespace OpenRA.Mods.RA bool CanCapture(Actor target) { var c = target.TraitOrDefault(); - return c != null && ( !c.CaptureInProgress || c.Captor.Owner.Stances[self.Owner] != Stance.Ally ); + return c != null && (!c.CaptureInProgress || c.Captor.Owner.Stances[self.Owner] != Stance.Ally); } } - class CaptureOrderTargeter : UnitTraitOrderTargeter + class CaptureOrderTargeter : UnitOrderTargeter { readonly string[] captureTypes; readonly Func useEnterCursor; public CaptureOrderTargeter(string[] captureTypes, Func useEnterCursor) - : base( "CaptureActor", 6, "enter", true, true) + : base("CaptureActor", 6, "enter", true, true) { this.captureTypes = captureTypes; this.useEnterCursor = useEnterCursor; @@ -94,19 +95,26 @@ namespace OpenRA.Mods.RA public override bool CanTargetActor(Actor self, Actor target, bool forceAttack, bool forceQueued, ref string cursor) { - if( !base.CanTargetActor( self, target, forceAttack, forceQueued, ref cursor ) ) return false; + if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) + return false; - var ci = target.Info.Traits.Get(); - var playerRelationship = self.Owner.Stances[ target.Owner ]; + var ci = target.Info.Traits.GetOrDefault(); + if (ci == null) + return false; - if( playerRelationship == Stance.Ally && !ci.AllowAllies ) return false; - if( playerRelationship == Stance.Enemy && !ci.AllowEnemies ) return false; - if( playerRelationship == Stance.Neutral && !ci.AllowNeutral ) return false; + var playerRelationship = self.Owner.Stances[target.Owner]; + if (playerRelationship == Stance.Ally && !ci.AllowAllies) + return false; + + if (playerRelationship == Stance.Enemy && !ci.AllowEnemies) + return false; + + if (playerRelationship == Stance.Neutral && !ci.AllowNeutral) + return false; IsQueued = forceQueued; var Info = self.Info.Traits.Get(); - if (captureTypes.Contains(ci.Type)) { cursor = (Info.WastedAfterwards) ? (useEnterCursor(target) ? "enter" : "enter-blocked") : "attack"; diff --git a/OpenRA.Mods.RA/DemoTruck.cs b/OpenRA.Mods.RA/DemoTruck.cs index 9f20a4d330..895a38283c 100644 --- a/OpenRA.Mods.RA/DemoTruck.cs +++ b/OpenRA.Mods.RA/DemoTruck.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA { get { - yield return new UnitTraitOrderTargeter("DemoAttack", 5, "attack", true, false) { ForceAttack = false }; + yield return new TargetTypeOrderTargeter("DemoTruck", "DemoAttack", 5, "attack", true, false) { ForceAttack = false }; yield return new DeployOrderTargeter("DemoDeploy", 5); } } diff --git a/OpenRA.Mods.RA/EngineerRepair.cs b/OpenRA.Mods.RA/EngineerRepair.cs index 1653a52605..d8cfe5a793 100644 --- a/OpenRA.Mods.RA/EngineerRepair.cs +++ b/OpenRA.Mods.RA/EngineerRepair.cs @@ -52,7 +52,7 @@ namespace OpenRA.Mods.RA } } - class EngineerRepairOrderTargeter : UnitTraitOrderTargeter + class EngineerRepairOrderTargeter : UnitOrderTargeter { public EngineerRepairOrderTargeter() : base("EngineerRepair", 6, "goldwrench", false, true) { } diff --git a/OpenRA.Mods.RA/Infiltrates.cs b/OpenRA.Mods.RA/Infiltrates.cs index 94aa3398a3..1f684c834b 100644 --- a/OpenRA.Mods.RA/Infiltrates.cs +++ b/OpenRA.Mods.RA/Infiltrates.cs @@ -88,13 +88,14 @@ namespace OpenRA.Mods.RA return false; } - class InfiltratorOrderTargeter : UnitTraitOrderTargeter + class InfiltratorOrderTargeter : UnitOrderTargeter { readonly Func useEnterCursor; - public InfiltratorOrderTargeter(Func useEnterCursor) : base("Infiltrate", 7, "enter", true, false) + public InfiltratorOrderTargeter(Func useEnterCursor) + : base("Infiltrate", 7, "enter", true, false) { - ForceAttack=false; + ForceAttack = false; this.useEnterCursor = useEnterCursor; } @@ -102,7 +103,10 @@ namespace OpenRA.Mods.RA { if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) return false; - + + if (!target.HasTrait()) + return false; + if (!useEnterCursor(target)) cursor = "enter-blocked"; diff --git a/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs b/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs index 076ae61f19..8f314e5381 100755 --- a/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs +++ b/OpenRA.Mods.RA/Orders/EnterBuildingOrderTargeter.cs @@ -12,14 +12,14 @@ using System; namespace OpenRA.Mods.RA.Orders { - public class EnterOrderTargeter : UnitTraitOrderTargeter + public class EnterOrderTargeter : UnitOrderTargeter { readonly Func canTarget; readonly Func useEnterCursor; - public EnterOrderTargeter( string order, int priority, bool targetEnemy, bool targetAlly, - Func canTarget, Func useEnterCursor ) - : base( order, priority, "enter", targetEnemy, targetAlly ) + public EnterOrderTargeter(string order, int priority, bool targetEnemy, bool targetAlly, + Func canTarget, Func useEnterCursor) + : base (order, priority, "enter", targetEnemy, targetAlly) { this.canTarget = canTarget; this.useEnterCursor = useEnterCursor; @@ -27,8 +27,15 @@ namespace OpenRA.Mods.RA.Orders public override bool CanTargetActor(Actor self, Actor target, bool forceAttack, bool forceQueued, ref string cursor) { - if( !base.CanTargetActor( self, target, forceAttack, forceQueued, ref cursor ) ) return false; - if( !canTarget( target ) ) return false; + if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) + return false; + + if (!target.HasTrait()) + return false; + + if (!canTarget(target)) + return false; + cursor = useEnterCursor(target) ? "enter" : "enter-blocked"; IsQueued = forceQueued; return true; diff --git a/OpenRA.Mods.RA/Orders/UnitOrderTargeter.cs b/OpenRA.Mods.RA/Orders/UnitOrderTargeter.cs index 5acf4d9b91..f0e4d101d4 100755 --- a/OpenRA.Mods.RA/Orders/UnitOrderTargeter.cs +++ b/OpenRA.Mods.RA/Orders/UnitOrderTargeter.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenRA.Traits; namespace OpenRA.Mods.RA.Orders @@ -57,17 +58,23 @@ namespace OpenRA.Mods.RA.Orders public virtual bool IsQueued { get; protected set; } } - public class UnitTraitOrderTargeter : UnitOrderTargeter + public class TargetTypeOrderTargeter : UnitOrderTargeter { - public UnitTraitOrderTargeter( string order, int priority, string cursor, bool targetEnemyUnits, bool targetAllyUnits ) - : base( order, priority, cursor, targetEnemyUnits, targetAllyUnits ) + string targetType; + + public TargetTypeOrderTargeter(string targetType, string order, int priority, string cursor, bool targetEnemyUnits, bool targetAllyUnits) + : base(order, priority, cursor, targetEnemyUnits, targetAllyUnits) { + this.targetType = targetType; } public override bool CanTargetActor(Actor self, Actor target, bool forceAttack, bool forceQueued, ref string cursor) { - if( !base.CanTargetActor( self, target, forceAttack, forceQueued, ref cursor ) ) return false; - if( !target.HasTrait() ) return false; + if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) + return false; + + if (!target.TraitsImplementing().Any(t => t.TargetTypes.Contains(targetType))) + return false; IsQueued = forceQueued; diff --git a/OpenRA.Mods.RA/Spy.cs b/OpenRA.Mods.RA/Spy.cs index 29d05d483d..083769cbac 100644 --- a/OpenRA.Mods.RA/Spy.cs +++ b/OpenRA.Mods.RA/Spy.cs @@ -84,7 +84,7 @@ namespace OpenRA.Mods.RA { get { - yield return new UnitTraitOrderTargeter("Disguise", 7, "ability", true, true) { ForceAttack=false }; + yield return new TargetTypeOrderTargeter("Disguise", "Disguise", 7, "ability", true, true) { ForceAttack=false }; } } diff --git a/OpenRA.Mods.RA/SupplyTruck.cs b/OpenRA.Mods.RA/SupplyTruck.cs index 438740573c..2253bc3141 100644 --- a/OpenRA.Mods.RA/SupplyTruck.cs +++ b/OpenRA.Mods.RA/SupplyTruck.cs @@ -63,7 +63,7 @@ namespace OpenRA.Mods.RA } } - class SupplyTruckOrderTargeter : UnitTraitOrderTargeter + class SupplyTruckOrderTargeter : UnitOrderTargeter { public SupplyTruckOrderTargeter() : base("DeliverSupplies", 5, "enter", false, true) @@ -72,9 +72,14 @@ namespace OpenRA.Mods.RA public override bool CanTargetActor(Actor self, Actor target, bool forceAttack, bool forceQueued, ref string cursor) { - if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) return false; - if (target.AppearsHostileTo(self)) return false; - if (!target.HasTrait()) return false; + if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) + return false; + + if (target.AppearsHostileTo(self)) + return false; + + if (!target.HasTrait()) + return false; IsQueued = forceQueued; return true; diff --git a/mods/cnc-classic/rules/defaults.yaml b/mods/cnc-classic/rules/defaults.yaml index c3437f55f7..972a72f4ee 100644 --- a/mods/cnc-classic/rules/defaults.yaml +++ b/mods/cnc-classic/rules/defaults.yaml @@ -208,7 +208,7 @@ Selectable: Priority: 3 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4 Armor: Type: Wood RepairableBuilding: diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 7615dfcc2c..04c024e67b 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -225,7 +225,7 @@ Selectable: Priority: 3 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4 Armor: Type: Wood RepairableBuilding: @@ -267,7 +267,6 @@ Sellable: Capturable: CapturableBar: - C4Demolishable: DebugMuzzlePositions: ^CivBuilding: @@ -339,7 +338,7 @@ Adjacent: 7 TerrainTypes: Clear,Road TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4 Wall: CrushClasses: wall CrushSound: sandbag2.aud @@ -356,7 +355,6 @@ RelativeToTopLeft: yes AutoTargetIgnore: Sellable: - C4Demolishable: ^Tree: Tooltip: diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 0c88cd9aea..833cf7c74d 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -215,7 +215,7 @@ Selectable: Priority: 2 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4 Building: Dimensions: 1,1 Footprint: x @@ -263,6 +263,5 @@ Types:Building Sellable: GivesBounty: - C4Demolishable: DebugMuzzlePositions: Bib: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index fce4faf0c0..b565293d9b 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -433,7 +433,7 @@ WALL: #Selectable: # Priority: 1 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4 RenderBuildingWall: HasMakeAnimation: false #GivesExperience: diff --git a/mods/ra-classic/rules/defaults.yaml b/mods/ra-classic/rules/defaults.yaml index 35bfbca04e..ecf1617fcd 100644 --- a/mods/ra-classic/rules/defaults.yaml +++ b/mods/ra-classic/rules/defaults.yaml @@ -83,7 +83,7 @@ Selectable: Voice: GenericVoice TargetableUnit: - TargetTypes: Ground + TargetTypes: Ground, Disguise RenderInfantry: AutoTarget: AttackMove: @@ -164,7 +164,7 @@ Selectable: Priority: 3 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4, DemoTruck Building: Dimensions: 1,1 Footprint: x @@ -210,7 +210,7 @@ Selectable: Priority: 1 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4, DemoTruck RenderBuildingWall: HasMakeAnimation: false Palette: terrain diff --git a/mods/ra/rules/civilian.yaml b/mods/ra/rules/civilian.yaml index eadc86ec7e..34f3d626a3 100644 --- a/mods/ra/rules/civilian.yaml +++ b/mods/ra/rules/civilian.yaml @@ -246,7 +246,8 @@ BARL: AutoTargetIgnore: Armor: Type: Light - -C4Demolishable: + TargetableBuilding: + TargetTypes: Ground, DemoTruck BRL3: Inherits: ^TechBuilding @@ -261,7 +262,8 @@ BRL3: AutoTargetIgnore: Armor: Type: Light - -C4Demolishable: + TargetableBuilding: + TargetTypes: Ground, DemoTruck MISS: Inherits: ^TechBuilding diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index b06075f5c2..954c4a685e 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -96,7 +96,7 @@ Selectable: Voice: GenericVoice TargetableUnit: - TargetTypes: Ground + TargetTypes: Ground, Disguise RenderInfantry: AutoTarget: DebugRetiliateAgainstAggressor: @@ -196,7 +196,7 @@ Selectable: Priority: 3 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4, DemoTruck Building: Dimensions: 1,1 Footprint: x @@ -227,7 +227,6 @@ AcceptsSupplies: GivesBounty: UpdatesPlayerStatistics: - C4Demolishable: DebugMuzzlePositions: ^Wall: @@ -249,7 +248,7 @@ Selectable: Priority: 1 TargetableBuilding: - TargetTypes: Ground + TargetTypes: Ground, C4, DemoTruck RenderBuildingWall: HasMakeAnimation: false Palette: terrain @@ -262,7 +261,6 @@ Types:Wall Sellable: UpdatesPlayerStatistics: - C4Demolishable: ^TechBuilding: Inherits: ^Building