From 935b82953214f0ae6dcecc7552c1c4d2afee1442 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 10 Jul 2013 19:22:11 +1200 Subject: [PATCH] Tidy TargetableUnit and subclasses. --- OpenRA.Mods.RA/AI/HackyAI.cs | 16 ++++++++-------- OpenRA.Mods.RA/Air/TargetableAircraft.cs | 7 +++++-- OpenRA.Mods.RA/Crates/CloakCrateAction.cs | 2 +- OpenRA.Mods.RA/TargetableSubmarine.cs | 13 +++++++++---- OpenRA.Mods.RA/TargetableUnit.cs | 17 ++++++++--------- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/OpenRA.Mods.RA/AI/HackyAI.cs b/OpenRA.Mods.RA/AI/HackyAI.cs index b864e199b0..d6407cdf84 100644 --- a/OpenRA.Mods.RA/AI/HackyAI.cs +++ b/OpenRA.Mods.RA/AI/HackyAI.cs @@ -226,18 +226,18 @@ namespace OpenRA.Mods.RA.AI protected static bool CanAttackTarget(Actor a, Actor target) { - if (!a.HasTrait()) return false; - if (!target.HasTrait>() && - !target.HasTrait()) return false; + if (!a.HasTrait()) + return false; + + var targetable = target.TraitOrDefault(); + if (targetable == null) + return false; var arms = a.TraitsImplementing(); foreach (var arm in arms) - if (target.HasTrait>() && - arm.Weapon.ValidTargets.Intersect(target.Trait>().TargetTypes) != null) - return true; - else if (target.HasTrait() && - arm.Weapon.ValidTargets.Intersect(target.Trait().TargetTypes) != null) + if (arm.Weapon.ValidTargets.Intersect(targetable.TargetTypes) != null) return true; + return false; } } diff --git a/OpenRA.Mods.RA/Air/TargetableAircraft.cs b/OpenRA.Mods.RA/Air/TargetableAircraft.cs index 9dff2197fe..49bcd2ffd8 100755 --- a/OpenRA.Mods.RA/Air/TargetableAircraft.cs +++ b/OpenRA.Mods.RA/Air/TargetableAircraft.cs @@ -21,12 +21,15 @@ namespace OpenRA.Mods.RA.Air public override object Create(ActorInitializer init) { return new TargetableAircraft(init.self, this); } } - public class TargetableAircraft : TargetableUnit + public class TargetableAircraft : TargetableUnit { - Aircraft Aircraft; + readonly TargetableAircraftInfo info; + readonly Aircraft Aircraft; + public TargetableAircraft(Actor self, TargetableAircraftInfo info) : base(self, info) { + this.info = info; Aircraft = self.Trait(); } diff --git a/OpenRA.Mods.RA/Crates/CloakCrateAction.cs b/OpenRA.Mods.RA/Crates/CloakCrateAction.cs index bf6702200f..e7b7498685 100644 --- a/OpenRA.Mods.RA/Crates/CloakCrateAction.cs +++ b/OpenRA.Mods.RA/Crates/CloakCrateAction.cs @@ -52,7 +52,7 @@ namespace OpenRA.Mods.RA.Crates w.Remove(collector); collector.AddTrait(cloak); - var t = collector.TraitOrDefault>(); + var t = collector.TraitOrDefault(); if (t != null) t.ReceivedCloak(collector); w.Add(collector); diff --git a/OpenRA.Mods.RA/TargetableSubmarine.cs b/OpenRA.Mods.RA/TargetableSubmarine.cs index 904d1f3b3c..20b34adc50 100644 --- a/OpenRA.Mods.RA/TargetableSubmarine.cs +++ b/OpenRA.Mods.RA/TargetableSubmarine.cs @@ -17,17 +17,22 @@ namespace OpenRA.Mods.RA { public readonly string[] CloakedTargetTypes = {}; - public override object Create( ActorInitializer init ) { return new TargetableSubmarine(init.self, this); } + public override object Create(ActorInitializer init) { return new TargetableSubmarine(init.self, this); } } - public class TargetableSubmarine : TargetableUnit + public class TargetableSubmarine : TargetableUnit { + readonly TargetableSubmarineInfo info; + public TargetableSubmarine(Actor self, TargetableSubmarineInfo info) - : base(self, info) {} + : base(self, info) + { + this.info = info; + } public override string[] TargetTypes { - get { return Cloak.Cloaked ? info.CloakedTargetTypes + get { return cloak.Cloaked ? info.CloakedTargetTypes : info.TargetTypes;} } } diff --git a/OpenRA.Mods.RA/TargetableUnit.cs b/OpenRA.Mods.RA/TargetableUnit.cs index 01e6d582e9..282e97c8eb 100755 --- a/OpenRA.Mods.RA/TargetableUnit.cs +++ b/OpenRA.Mods.RA/TargetableUnit.cs @@ -18,16 +18,15 @@ namespace OpenRA.Mods.RA { public readonly string[] TargetTypes = { }; - public virtual object Create( ActorInitializer init ) { return new TargetableUnit( init.self, this ); } + public virtual object Create(ActorInitializer init) { return new TargetableUnit(init.self, this); } } - public class TargetableUnit : ITargetable - where Info : TargetableUnitInfo + public class TargetableUnit : ITargetable { - protected readonly Info info; - protected Cloak Cloak; + readonly TargetableUnitInfo info; + protected Cloak cloak; - public TargetableUnit( Actor self, Info info ) + public TargetableUnit(Actor self, TargetableUnitInfo info) { this.info = info; ReceivedCloak(self); @@ -36,15 +35,15 @@ namespace OpenRA.Mods.RA // Arbitrary units can receive cloak via a crate during gameplay public void ReceivedCloak(Actor self) { - Cloak = self.TraitOrDefault(); + cloak = self.TraitOrDefault(); } public virtual bool TargetableBy(Actor self, Actor byActor) { - if (Cloak == null) + if (cloak == null || !cloak.Cloaked) return true; - if (!Cloak.Cloaked || self.Owner == byActor.Owner || self.Owner.Stances[byActor.Owner] == Stance.Ally) + if (self.Owner.IsAlliedWith(byActor.Owner)) return true; return self.World.ActorsWithTrait().Any(a => (self.Location - a.Actor.Location).Length < a.Actor.Info.Traits.Get().Range);