Replace UnitTraitOrderTargeter with TargetTypeOrderTargeter.

This also makes naval buildings untargetable for c4 and demo trucks, as they don't make much sense.
This commit is contained in:
Paul Chote
2013-04-15 22:31:09 +12:00
parent e545865599
commit 4ca777597f
16 changed files with 81 additions and 56 deletions

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.RA
public IEnumerable<IOrderTargeter> Orders public IEnumerable<IOrderTargeter> Orders
{ {
get { yield return new UnitTraitOrderTargeter<C4Demolishable>("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 ) 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; return (order.OrderString == "C4") ? "Attack" : null;
} }
} }
class C4DemolishableInfo : TraitInfo<C4Demolishable> { }
class C4Demolishable { }
} }

View File

@@ -48,7 +48,7 @@ namespace OpenRA.Mods.RA
public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) 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 new Order(order.OrderID, self, queued) { TargetActor = target.Actor };
return null; return null;
@@ -64,7 +64,8 @@ namespace OpenRA.Mods.RA
{ {
if (order.OrderString == "CaptureActor") if (order.OrderString == "CaptureActor")
{ {
if (!CanCapture(order.TargetActor)) return; if (!CanCapture(order.TargetActor))
return;
self.SetTargetLine(Target.FromOrder(order), Color.Red); self.SetTargetLine(Target.FromOrder(order), Color.Red);
@@ -76,17 +77,17 @@ namespace OpenRA.Mods.RA
bool CanCapture(Actor target) bool CanCapture(Actor target)
{ {
var c = target.TraitOrDefault<Capturable>(); var c = target.TraitOrDefault<Capturable>();
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<Capturable> class CaptureOrderTargeter : UnitOrderTargeter
{ {
readonly string[] captureTypes; readonly string[] captureTypes;
readonly Func<Actor, bool> useEnterCursor; readonly Func<Actor, bool> useEnterCursor;
public CaptureOrderTargeter(string[] captureTypes, Func<Actor, bool> useEnterCursor) public CaptureOrderTargeter(string[] captureTypes, Func<Actor, bool> useEnterCursor)
: base( "CaptureActor", 6, "enter", true, true) : base("CaptureActor", 6, "enter", true, true)
{ {
this.captureTypes = captureTypes; this.captureTypes = captureTypes;
this.useEnterCursor = useEnterCursor; 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) 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<CapturableInfo>(); var ci = target.Info.Traits.GetOrDefault<CapturableInfo>();
var playerRelationship = self.Owner.Stances[ target.Owner ]; if (ci == null)
return false;
if( playerRelationship == Stance.Ally && !ci.AllowAllies ) return false; var playerRelationship = self.Owner.Stances[target.Owner];
if( playerRelationship == Stance.Enemy && !ci.AllowEnemies ) return false; if (playerRelationship == Stance.Ally && !ci.AllowAllies)
if( playerRelationship == Stance.Neutral && !ci.AllowNeutral ) return false; return false;
if (playerRelationship == Stance.Enemy && !ci.AllowEnemies)
return false;
if (playerRelationship == Stance.Neutral && !ci.AllowNeutral)
return false;
IsQueued = forceQueued; IsQueued = forceQueued;
var Info = self.Info.Traits.Get<CapturesInfo>(); var Info = self.Info.Traits.Get<CapturesInfo>();
if (captureTypes.Contains(ci.Type)) if (captureTypes.Contains(ci.Type))
{ {
cursor = (Info.WastedAfterwards) ? (useEnterCursor(target) ? "enter" : "enter-blocked") : "attack"; cursor = (Info.WastedAfterwards) ? (useEnterCursor(target) ? "enter" : "enter-blocked") : "attack";

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA
{ {
get get
{ {
yield return new UnitTraitOrderTargeter<Building>("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); yield return new DeployOrderTargeter("DemoDeploy", 5);
} }
} }

View File

@@ -52,7 +52,7 @@ namespace OpenRA.Mods.RA
} }
} }
class EngineerRepairOrderTargeter : UnitTraitOrderTargeter<Building> class EngineerRepairOrderTargeter : UnitOrderTargeter
{ {
public EngineerRepairOrderTargeter() public EngineerRepairOrderTargeter()
: base("EngineerRepair", 6, "goldwrench", false, true) { } : base("EngineerRepair", 6, "goldwrench", false, true) { }

View File

@@ -88,13 +88,14 @@ namespace OpenRA.Mods.RA
return false; return false;
} }
class InfiltratorOrderTargeter : UnitTraitOrderTargeter<IAcceptInfiltrator> class InfiltratorOrderTargeter : UnitOrderTargeter
{ {
readonly Func<Actor, bool> useEnterCursor; readonly Func<Actor, bool> useEnterCursor;
public InfiltratorOrderTargeter(Func<Actor, bool> useEnterCursor) : base("Infiltrate", 7, "enter", true, false) public InfiltratorOrderTargeter(Func<Actor, bool> useEnterCursor)
: base("Infiltrate", 7, "enter", true, false)
{ {
ForceAttack=false; ForceAttack = false;
this.useEnterCursor = useEnterCursor; this.useEnterCursor = useEnterCursor;
} }
@@ -102,7 +103,10 @@ namespace OpenRA.Mods.RA
{ {
if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor)) if (!base.CanTargetActor(self, target, forceAttack, forceQueued, ref cursor))
return false; return false;
if (!target.HasTrait<IAcceptInfiltrator>())
return false;
if (!useEnterCursor(target)) if (!useEnterCursor(target))
cursor = "enter-blocked"; cursor = "enter-blocked";

View File

@@ -12,14 +12,14 @@ using System;
namespace OpenRA.Mods.RA.Orders namespace OpenRA.Mods.RA.Orders
{ {
public class EnterOrderTargeter<T> : UnitTraitOrderTargeter<T> public class EnterOrderTargeter<T> : UnitOrderTargeter
{ {
readonly Func<Actor, bool> canTarget; readonly Func<Actor, bool> canTarget;
readonly Func<Actor, bool> useEnterCursor; readonly Func<Actor, bool> useEnterCursor;
public EnterOrderTargeter( string order, int priority, bool targetEnemy, bool targetAlly, public EnterOrderTargeter(string order, int priority, bool targetEnemy, bool targetAlly,
Func<Actor, bool> canTarget, Func<Actor, bool> useEnterCursor ) Func<Actor, bool> canTarget, Func<Actor, bool> useEnterCursor)
: base( order, priority, "enter", targetEnemy, targetAlly ) : base (order, priority, "enter", targetEnemy, targetAlly)
{ {
this.canTarget = canTarget; this.canTarget = canTarget;
this.useEnterCursor = useEnterCursor; 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) 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))
if( !canTarget( target ) ) return false; return false;
if (!target.HasTrait<T>())
return false;
if (!canTarget(target))
return false;
cursor = useEnterCursor(target) ? "enter" : "enter-blocked"; cursor = useEnterCursor(target) ? "enter" : "enter-blocked";
IsQueued = forceQueued; IsQueued = forceQueued;
return true; return true;

View File

@@ -10,6 +10,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.RA.Orders namespace OpenRA.Mods.RA.Orders
@@ -57,17 +58,23 @@ namespace OpenRA.Mods.RA.Orders
public virtual bool IsQueued { get; protected set; } public virtual bool IsQueued { get; protected set; }
} }
public class UnitTraitOrderTargeter<T> : UnitOrderTargeter public class TargetTypeOrderTargeter : UnitOrderTargeter
{ {
public UnitTraitOrderTargeter( string order, int priority, string cursor, bool targetEnemyUnits, bool targetAllyUnits ) string targetType;
: base( order, priority, cursor, targetEnemyUnits, targetAllyUnits )
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) 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))
if( !target.HasTrait<T>() ) return false; return false;
if (!target.TraitsImplementing<ITargetable>().Any(t => t.TargetTypes.Contains(targetType)))
return false;
IsQueued = forceQueued; IsQueued = forceQueued;

View File

@@ -84,7 +84,7 @@ namespace OpenRA.Mods.RA
{ {
get get
{ {
yield return new UnitTraitOrderTargeter<RenderInfantry>("Disguise", 7, "ability", true, true) { ForceAttack=false }; yield return new TargetTypeOrderTargeter("Disguise", "Disguise", 7, "ability", true, true) { ForceAttack=false };
} }
} }

View File

@@ -63,7 +63,7 @@ namespace OpenRA.Mods.RA
} }
} }
class SupplyTruckOrderTargeter : UnitTraitOrderTargeter<Building> class SupplyTruckOrderTargeter : UnitOrderTargeter
{ {
public SupplyTruckOrderTargeter() public SupplyTruckOrderTargeter()
: base("DeliverSupplies", 5, "enter", false, true) : 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) 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))
if (target.AppearsHostileTo(self)) return false; return false;
if (!target.HasTrait<AcceptsSupplies>()) return false;
if (target.AppearsHostileTo(self))
return false;
if (!target.HasTrait<AcceptsSupplies>())
return false;
IsQueued = forceQueued; IsQueued = forceQueued;
return true; return true;

View File

@@ -208,7 +208,7 @@
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4
Armor: Armor:
Type: Wood Type: Wood
RepairableBuilding: RepairableBuilding:

View File

@@ -225,7 +225,7 @@
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4
Armor: Armor:
Type: Wood Type: Wood
RepairableBuilding: RepairableBuilding:
@@ -267,7 +267,6 @@
Sellable: Sellable:
Capturable: Capturable:
CapturableBar: CapturableBar:
C4Demolishable:
DebugMuzzlePositions: DebugMuzzlePositions:
^CivBuilding: ^CivBuilding:
@@ -339,7 +338,7 @@
Adjacent: 7 Adjacent: 7
TerrainTypes: Clear,Road TerrainTypes: Clear,Road
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4
Wall: Wall:
CrushClasses: wall CrushClasses: wall
CrushSound: sandbag2.aud CrushSound: sandbag2.aud
@@ -356,7 +355,6 @@
RelativeToTopLeft: yes RelativeToTopLeft: yes
AutoTargetIgnore: AutoTargetIgnore:
Sellable: Sellable:
C4Demolishable:
^Tree: ^Tree:
Tooltip: Tooltip:

View File

@@ -215,7 +215,7 @@
Selectable: Selectable:
Priority: 2 Priority: 2
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4
Building: Building:
Dimensions: 1,1 Dimensions: 1,1
Footprint: x Footprint: x
@@ -263,6 +263,5 @@
Types:Building Types:Building
Sellable: Sellable:
GivesBounty: GivesBounty:
C4Demolishable:
DebugMuzzlePositions: DebugMuzzlePositions:
Bib: Bib:

View File

@@ -433,7 +433,7 @@ WALL:
#Selectable: #Selectable:
# Priority: 1 # Priority: 1
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4
RenderBuildingWall: RenderBuildingWall:
HasMakeAnimation: false HasMakeAnimation: false
#GivesExperience: #GivesExperience:

View File

@@ -83,7 +83,7 @@
Selectable: Selectable:
Voice: GenericVoice Voice: GenericVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground, Disguise
RenderInfantry: RenderInfantry:
AutoTarget: AutoTarget:
AttackMove: AttackMove:
@@ -164,7 +164,7 @@
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4, DemoTruck
Building: Building:
Dimensions: 1,1 Dimensions: 1,1
Footprint: x Footprint: x
@@ -210,7 +210,7 @@
Selectable: Selectable:
Priority: 1 Priority: 1
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4, DemoTruck
RenderBuildingWall: RenderBuildingWall:
HasMakeAnimation: false HasMakeAnimation: false
Palette: terrain Palette: terrain

View File

@@ -246,7 +246,8 @@ BARL:
AutoTargetIgnore: AutoTargetIgnore:
Armor: Armor:
Type: Light Type: Light
-C4Demolishable: TargetableBuilding:
TargetTypes: Ground, DemoTruck
BRL3: BRL3:
Inherits: ^TechBuilding Inherits: ^TechBuilding
@@ -261,7 +262,8 @@ BRL3:
AutoTargetIgnore: AutoTargetIgnore:
Armor: Armor:
Type: Light Type: Light
-C4Demolishable: TargetableBuilding:
TargetTypes: Ground, DemoTruck
MISS: MISS:
Inherits: ^TechBuilding Inherits: ^TechBuilding

View File

@@ -96,7 +96,7 @@
Selectable: Selectable:
Voice: GenericVoice Voice: GenericVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground, Disguise
RenderInfantry: RenderInfantry:
AutoTarget: AutoTarget:
DebugRetiliateAgainstAggressor: DebugRetiliateAgainstAggressor:
@@ -196,7 +196,7 @@
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4, DemoTruck
Building: Building:
Dimensions: 1,1 Dimensions: 1,1
Footprint: x Footprint: x
@@ -227,7 +227,6 @@
AcceptsSupplies: AcceptsSupplies:
GivesBounty: GivesBounty:
UpdatesPlayerStatistics: UpdatesPlayerStatistics:
C4Demolishable:
DebugMuzzlePositions: DebugMuzzlePositions:
^Wall: ^Wall:
@@ -249,7 +248,7 @@
Selectable: Selectable:
Priority: 1 Priority: 1
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground, C4, DemoTruck
RenderBuildingWall: RenderBuildingWall:
HasMakeAnimation: false HasMakeAnimation: false
Palette: terrain Palette: terrain
@@ -262,7 +261,6 @@
Types:Wall Types:Wall
Sellable: Sellable:
UpdatesPlayerStatistics: UpdatesPlayerStatistics:
C4Demolishable:
^TechBuilding: ^TechBuilding:
Inherits: ^Building Inherits: ^Building