Tidy TargetableUnit and subclasses.

This commit is contained in:
Paul Chote
2013-07-10 19:22:11 +12:00
parent bed2745c61
commit 935b829532
5 changed files with 31 additions and 24 deletions

View File

@@ -226,18 +226,18 @@ namespace OpenRA.Mods.RA.AI
protected static bool CanAttackTarget(Actor a, Actor target)
{
if (!a.HasTrait<AttackBase>()) return false;
if (!target.HasTrait<TargetableUnit<TargetableUnitInfo>>() &&
!target.HasTrait<TargetableBuilding>()) return false;
if (!a.HasTrait<AttackBase>())
return false;
var targetable = target.TraitOrDefault<ITargetable>();
if (targetable == null)
return false;
var arms = a.TraitsImplementing<Armament>();
foreach (var arm in arms)
if (target.HasTrait<TargetableUnit<TargetableUnitInfo>>() &&
arm.Weapon.ValidTargets.Intersect(target.Trait<TargetableUnit<TargetableUnitInfo>>().TargetTypes) != null)
return true;
else if (target.HasTrait<TargetableBuilding>() &&
arm.Weapon.ValidTargets.Intersect(target.Trait<TargetableBuilding>().TargetTypes) != null)
if (arm.Weapon.ValidTargets.Intersect(targetable.TargetTypes) != null)
return true;
return false;
}
}

View File

@@ -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<TargetableAircraftInfo>
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<Aircraft>();
}

View File

@@ -52,7 +52,7 @@ namespace OpenRA.Mods.RA.Crates
w.Remove(collector);
collector.AddTrait(cloak);
var t = collector.TraitOrDefault<TargetableUnit<TargetableUnitInfo>>();
var t = collector.TraitOrDefault<TargetableUnit>();
if (t != null) t.ReceivedCloak(collector);
w.Add(collector);

View File

@@ -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<TargetableSubmarineInfo>
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;}
}
}

View File

@@ -18,16 +18,15 @@ namespace OpenRA.Mods.RA
{
public readonly string[] TargetTypes = { };
public virtual object Create( ActorInitializer init ) { return new TargetableUnit<TargetableUnitInfo>( init.self, this ); }
public virtual object Create(ActorInitializer init) { return new TargetableUnit(init.self, this); }
}
public class TargetableUnit<Info> : 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>();
cloak = self.TraitOrDefault<Cloak>();
}
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<DetectCloaked>().Any(a => (self.Location - a.Actor.Location).Length < a.Actor.Info.Traits.Get<DetectCloakedInfo>().Range);