Add ActorInfo.HasTraitInfo<T>() requiring ITraitInfo types

This commit is contained in:
atlimit8
2015-08-02 12:44:46 -05:00
parent 85fab45451
commit 8162fa27ab
77 changed files with 138 additions and 136 deletions

View File

@@ -176,7 +176,7 @@ namespace OpenRA.Mods.Common.AI
var sumOfHp = 0;
foreach (var a in actors)
{
if (a.Info.Traits.Contains<HealthInfo>())
if (a.Info.HasTraitInfo<HealthInfo>())
{
sumOfMaxHp += a.Trait<Health>().MaxHP;
sumOfHp += a.Trait<Health>().HP;
@@ -228,7 +228,7 @@ namespace OpenRA.Mods.Common.AI
{
var sum = 0;
foreach (var a in actors)
if (a.Info.Traits.Contains<TTraitInfo>())
if (a.Info.HasTraitInfo<TTraitInfo>())
sum += getValue(a);
return sum;
@@ -240,7 +240,7 @@ namespace OpenRA.Mods.Common.AI
var countActors = 0;
foreach (var a in actors)
{
if (a.Info.Traits.Contains<TTraitInfo>())
if (a.Info.HasTraitInfo<TTraitInfo>())
{
sum += getValue(a);
countActors++;

View File

@@ -167,8 +167,8 @@ namespace OpenRA.Mods.Common.AI
{
var randomBaseBuilding = World.Actors.Where(
a => a.Owner == Player
&& a.Info.Traits.Contains<BaseBuildingInfo>()
&& !a.Info.Traits.Contains<MobileInfo>())
&& a.Info.HasTraitInfo<BaseBuildingInfo>()
&& !a.Info.HasTraitInfo<MobileInfo>())
.RandomOrDefault(Random);
return randomBaseBuilding != null ? randomBaseBuilding.Location : initialBaseCenter;
@@ -233,8 +233,8 @@ namespace OpenRA.Mods.Common.AI
isEnemyUnit = unit =>
Player.Stances[unit.Owner] == Stance.Enemy
&& !unit.Info.Traits.Contains<HuskInfo>()
&& unit.Info.Traits.Contains<ITargetableInfo>();
&& !unit.Info.HasTraitInfo<HuskInfo>()
&& unit.Info.HasTraitInfo<ITargetableInfo>();
foreach (var decision in info.PowerDecisions)
powerDecisions.Add(decision.OrderName, decision);
@@ -281,8 +281,8 @@ namespace OpenRA.Mods.Common.AI
{
var baseProviders = World.Actors.Where(
a => a.Owner == Player
&& a.Info.Traits.Contains<BaseProviderInfo>()
&& !a.Info.Traits.Contains<MobileInfo>());
&& a.Info.HasTraitInfo<BaseProviderInfo>()
&& !a.Info.HasTraitInfo<MobileInfo>());
foreach (var b in baseProviders)
{
@@ -308,8 +308,8 @@ namespace OpenRA.Mods.Common.AI
{
var areaProviders = World.Actors.Where(
a => a.Owner == Player
&& a.Info.Traits.Contains<GivesBuildableAreaInfo>()
&& !a.Info.Traits.Contains<MobileInfo>());
&& a.Info.HasTraitInfo<GivesBuildableAreaInfo>()
&& !a.Info.HasTraitInfo<MobileInfo>());
foreach (var a in areaProviders)
{
@@ -489,7 +489,7 @@ namespace OpenRA.Mods.Common.AI
case BuildingType.Defense:
// Build near the closest enemy structure
var closestEnemy = World.Actors.Where(a => !a.Disposed && a.Info.Traits.Contains<BuildingInfo>() && Player.Stances[a.Owner] == Stance.Enemy)
var closestEnemy = World.Actors.Where(a => !a.Disposed && a.Info.HasTraitInfo<BuildingInfo>() && Player.Stances[a.Owner] == Stance.Enemy)
.ClosestTo(World.Map.CenterOfCell(defenseCenter));
var targetCell = closestEnemy != null ? closestEnemy.Location : baseCenter;
@@ -565,7 +565,7 @@ namespace OpenRA.Mods.Common.AI
// Pick something worth attacking owned by that player
var target = World.Actors
.Where(a => a.Owner == enemy && a.Info.Traits.Contains<IOccupySpaceInfo>())
.Where(a => a.Owner == enemy && a.Info.HasTraitInfo<IOccupySpaceInfo>())
.ClosestTo(World.Map.CenterOfCell(GetRandomBaseCenter()));
if (target == null)
@@ -597,7 +597,7 @@ namespace OpenRA.Mods.Common.AI
List<Actor> FindEnemyConstructionYards()
{
return World.Actors.Where(a => Player.Stances[a.Owner] == Stance.Enemy && !a.IsDead
&& a.Info.Traits.Contains<BaseBuildingInfo>() && !a.Info.Traits.Contains<MobileInfo>()).ToList();
&& a.Info.HasTraitInfo<BaseBuildingInfo>() && !a.Info.HasTraitInfo<MobileInfo>()).ToList();
}
void CleanSquads()
@@ -707,18 +707,18 @@ namespace OpenRA.Mods.Common.AI
void FindNewUnits(Actor self)
{
var newUnits = self.World.ActorsWithTrait<IPositionable>()
.Where(a => a.Actor.Owner == Player && !a.Actor.Info.Traits.Contains<BaseBuildingInfo>()
.Where(a => a.Actor.Owner == Player && !a.Actor.Info.HasTraitInfo<BaseBuildingInfo>()
&& !activeUnits.Contains(a.Actor))
.Select(a => a.Actor);
foreach (var a in newUnits)
{
if (a.Info.Traits.Contains<HarvesterInfo>())
if (a.Info.HasTraitInfo<HarvesterInfo>())
QueueOrder(new Order("Harvest", a, false));
else
unitsHangingAroundTheBase.Add(a);
if (a.Info.Traits.Contains<AircraftInfo>() && a.Info.Traits.Contains<AttackBaseInfo>())
if (a.Info.HasTraitInfo<AircraftInfo>() && a.Info.HasTraitInfo<AttackBaseInfo>())
{
var air = GetSquadOfType(SquadType.Air);
if (air == null)
@@ -742,7 +742,7 @@ namespace OpenRA.Mods.Common.AI
var attackForce = RegisterNewSquad(SquadType.Assault);
foreach (var a in unitsHangingAroundTheBase)
if (!a.Info.Traits.Contains<AircraftInfo>())
if (!a.Info.HasTraitInfo<AircraftInfo>())
attackForce.Units.Add(a);
unitsHangingAroundTheBase.Clear();
@@ -753,7 +753,7 @@ namespace OpenRA.Mods.Common.AI
{
var allEnemyBaseBuilder = FindEnemyConstructionYards();
var ownUnits = activeUnits
.Where(unit => unit.Info.Traits.Contains<AttackBaseInfo>() && !unit.Info.Traits.Contains<AircraftInfo>() && unit.IsIdle).ToList();
.Where(unit => unit.Info.HasTraitInfo<AttackBaseInfo>() && !unit.Info.HasTraitInfo<AircraftInfo>() && unit.IsIdle).ToList();
if (!allEnemyBaseBuilder.Any() || (ownUnits.Count < Info.SquadSize))
return;
@@ -761,7 +761,7 @@ namespace OpenRA.Mods.Common.AI
foreach (var b in allEnemyBaseBuilder)
{
var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius))
.Where(unit => Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.Traits.Contains<AttackBaseInfo>()).ToList();
.Where(unit => Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.HasTraitInfo<AttackBaseInfo>()).ToList();
if (rushFuzzy.CanAttack(ownUnits, enemies))
{
@@ -790,8 +790,8 @@ namespace OpenRA.Mods.Common.AI
if (!protectSq.IsValid)
{
var ownUnits = World.FindActorsInCircle(World.Map.CenterOfCell(GetRandomBaseCenter()), WDist.FromCells(Info.ProtectUnitScanRadius))
.Where(unit => unit.Owner == Player && !unit.Info.Traits.Contains<BuildingInfo>()
&& unit.Info.Traits.Contains<AttackBaseInfo>());
.Where(unit => unit.Owner == Player && !unit.Info.HasTraitInfo<BuildingInfo>()
&& unit.Info.HasTraitInfo<AttackBaseInfo>());
foreach (var a in ownUnits)
protectSq.Units.Add(a);
@@ -832,7 +832,7 @@ namespace OpenRA.Mods.Common.AI
{
// Find and deploy our mcv
var mcv = self.World.Actors
.FirstOrDefault(a => a.Owner == Player && a.Info.Traits.Contains<BaseBuildingInfo>());
.FirstOrDefault(a => a.Owner == Player && a.Info.HasTraitInfo<BaseBuildingInfo>());
if (mcv != null)
{
@@ -841,7 +841,7 @@ namespace OpenRA.Mods.Common.AI
// Don't transform the mcv if it is a fact
// HACK: This needs to query against MCVs directly
if (mcv.Info.Traits.Contains<MobileInfo>())
if (mcv.Info.HasTraitInfo<MobileInfo>())
QueueOrder(new Order("DeployTransform", mcv, false));
}
else
@@ -854,7 +854,7 @@ namespace OpenRA.Mods.Common.AI
{
// HACK: This needs to query against MCVs directly
var mcvs = self.World.Actors
.Where(a => a.Owner == Player && a.Info.Traits.Contains<BaseBuildingInfo>() && a.Info.Traits.Contains<MobileInfo>());
.Where(a => a.Owner == Player && a.Info.HasTraitInfo<BaseBuildingInfo>() && a.Info.HasTraitInfo<MobileInfo>());
if (!mcvs.Any())
return;
@@ -1014,7 +1014,7 @@ namespace OpenRA.Mods.Common.AI
// No construction yards - Build a new MCV
if (!HasAdequateFact() && !self.World.Actors.Any(a =>
a.Owner == Player && a.Info.Traits.Contains<BaseBuildingInfo>() && a.Info.Traits.Contains<MobileInfo>()))
a.Owner == Player && a.Info.HasTraitInfo<BaseBuildingInfo>() && a.Info.HasTraitInfo<MobileInfo>()))
BuildUnit("Vehicle", GetUnitInfoByCommonName("Mcv", Player).Name);
foreach (var q in Info.UnitQueues)
@@ -1073,14 +1073,14 @@ namespace OpenRA.Mods.Common.AI
if (e.Attacker.Disposed)
return;
if (!e.Attacker.Info.Traits.Contains<ITargetableInfo>())
if (!e.Attacker.Info.HasTraitInfo<ITargetableInfo>())
return;
if (e.Damage > 0)
aggro[e.Attacker.Owner].Aggro += e.Damage;
// Protected harvesters or building
if ((self.Info.Traits.Contains<HarvesterInfo>() || self.Info.Traits.Contains<BuildingInfo>()) &&
if ((self.Info.HasTraitInfo<HarvesterInfo>() || self.Info.HasTraitInfo<BuildingInfo>()) &&
Player.Stances[e.Attacker.Owner] == Stance.Enemy)
{
defenseCenter = e.Attacker.Location;

View File

@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.AI
public bool IsTargetValid
{
get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.Info.Traits.Contains<HuskInfo>(); }
get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.Info.HasTraitInfo<HuskInfo>(); }
}
public bool IsTargetVisible

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.AI
var missileUnitsCount = 0;
foreach (var unit in units)
{
if (unit != null && unit.Info.Traits.Contains<AttackBaseInfo>() && !unit.Info.Traits.Contains<AircraftInfo>()
if (unit != null && unit.Info.HasTraitInfo<AttackBaseInfo>() && !unit.Info.HasTraitInfo<AircraftInfo>()
&& !unit.IsDisabled())
{
var arms = unit.TraitsImplementing<Armament>();
@@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.AI
continue;
}
if (owner.TargetActor.Info.Traits.Contains<ITargetableInfo>() && CanAttackTarget(a, owner.TargetActor))
if (owner.TargetActor.Info.HasTraitInfo<ITargetableInfo>() && CanAttackTarget(a, owner.TargetActor))
owner.Bot.QueueOrder(new Order("Attack", a, false) { TargetActor = owner.TargetActor });
}
}

View File

@@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.AI
{
var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(12))
.Where(a1 => !a1.Disposed && !a1.IsDead);
var enemynearby = enemies.Where(a1 => a1.Info.Traits.Contains<ITargetableInfo>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy);
var enemynearby = enemies.Where(a1 => a1.Info.HasTraitInfo<ITargetableInfo>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy);
var target = enemynearby.ClosestTo(leader.CenterPosition);
if (target != null)
{

View File

@@ -60,7 +60,7 @@ namespace OpenRA.Mods.Common.AI
protected static bool CanAttackTarget(Actor a, Actor target)
{
if (!a.Info.Traits.Contains<AttackBaseInfo>())
if (!a.Info.HasTraitInfo<AttackBaseInfo>())
return false;
var targetTypes = target.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled).SelectMany(t => t.TargetTypes);
@@ -82,11 +82,11 @@ namespace OpenRA.Mods.Common.AI
var u = squad.Units.Random(squad.Random);
var units = squad.World.FindActorsInCircle(u.CenterPosition, WDist.FromCells(DangerRadius)).ToList();
var ownBaseBuildingAround = units.Where(unit => unit.Owner == squad.Bot.Player && unit.Info.Traits.Contains<BuildingInfo>());
var ownBaseBuildingAround = units.Where(unit => unit.Owner == squad.Bot.Player && unit.Info.HasTraitInfo<BuildingInfo>());
if (ownBaseBuildingAround.Any())
return false;
var enemyAroundUnit = units.Where(unit => squad.Bot.Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.Traits.Contains<AttackBaseInfo>());
var enemyAroundUnit = units.Where(unit => squad.Bot.Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.HasTraitInfo<AttackBaseInfo>());
if (!enemyAroundUnit.Any())
return false;