Merge pull request #3822 from pchote/new-target-fix

Revert AI target filtering
This commit is contained in:
Matthias Mailänder
2013-09-08 00:03:11 -07:00
4 changed files with 23 additions and 35 deletions

View File

@@ -441,34 +441,28 @@ namespace OpenRA.Mods.RA.AI
return target; return target;
} }
bool IsValidTarget(Actor a, Actor targeter) internal Actor FindClosestEnemy(WPos pos)
{ {
if (p.Stances[a.Owner] != Stance.Enemy) var allEnemyUnits = world.Actors
return false; .Where(unit => p.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait<Husk>() &&
unit.HasTrait<ITargetable>()).ToList();
// TODO: We shouldn't need to check this explicitly if (allEnemyUnits.Count > 0)
if (!a.HasTrait<Husk>()) return allEnemyUnits.ClosestTo(pos);
return false;
var targetable = a.TraitOrDefault<ITargetable>(); return null;
if (targetable == null || !targetable.TargetableBy(a, targeter))
return false;
return true;
} }
internal Actor FindClosestEnemy(Actor targeter, WPos pos) internal Actor FindClosestEnemy(WPos pos, WRange radius)
{ {
return world.Actors var enemyUnits = world.FindActorsInCircle(pos, radius)
.Where(unit => IsValidTarget(unit, targeter)) .Where(unit => p.Stances[unit.Owner] == Stance.Enemy &&
.ClosestTo(pos); !unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>()).ToList();
}
internal Actor FindClosestEnemy(Actor targeter, WPos pos, WRange radius) if (enemyUnits.Count > 0)
{ return enemyUnits.ClosestTo(pos);
return world.FindActorsInCircle(pos, radius)
.Where(unit => IsValidTarget(unit, targeter)) return null;
.ClosestTo(pos);
} }
List<Actor> FindEnemyConstructionYards() List<Actor> FindEnemyConstructionYards()

View File

@@ -183,8 +183,8 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var targeter = owner.units.Random(owner.random); var a = owner.units.Random(owner.random);
var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition); var closestEnemy = owner.bot.FindClosestEnemy(a.CenterPosition);
if (closestEnemy != null) if (closestEnemy != null)
owner.Target = closestEnemy; owner.Target = closestEnemy;
else else

View File

@@ -33,11 +33,8 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var targeter = owner.units.First(); var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterPosition);
var t = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition); if (t == null) return;
if (t == null)
return;
owner.Target = t; owner.Target = t;
} }
@@ -74,8 +71,7 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var targeter = owner.units.Random(owner.random); var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition);
if (closestEnemy != null) if (closestEnemy != null)
owner.Target = closestEnemy; owner.Target = closestEnemy;
else else
@@ -133,8 +129,7 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var targeter = owner.units.Random(owner.random); var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition);
if (closestEnemy != null) if (closestEnemy != null)
owner.Target = closestEnemy; owner.Target = closestEnemy;
else else
@@ -146,7 +141,7 @@ namespace OpenRA.Mods.RA.AI
foreach (var a in owner.units) foreach (var a in owner.units)
if (!BusyAttack(a)) if (!BusyAttack(a))
owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a, a.CenterPosition) }); owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a.CenterPosition) });
if (ShouldFlee(owner)) if (ShouldFlee(owner))
{ {

View File

@@ -32,8 +32,7 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var targeter = owner.units.FirstOrDefault(); owner.Target = owner.bot.FindClosestEnemy(owner.CenterPosition, WRange.FromCells(8));
owner.Target = owner.bot.FindClosestEnemy(targeter, owner.CenterPosition, WRange.FromCells(8));
if (owner.Target == null) if (owner.Target == null)
{ {