From d272715c50ddb38c1cc48fe3448ac7224856c64e Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 8 Sep 2013 16:57:29 +1200 Subject: [PATCH] Revert "Filter AI targets based on what it can actually attack. Fixes #3763." This reverts commit 4791f93d7707417e52176a1e646c9ac6d26488ba. --- OpenRA.Mods.RA/AI/HackyAI.cs | 36 ++++++++------------ OpenRA.Mods.RA/AI/States/AirStates.cs | 4 +-- OpenRA.Mods.RA/AI/States/GroundStates.cs | 15 +++----- OpenRA.Mods.RA/AI/States/ProtectionStates.cs | 3 +- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/OpenRA.Mods.RA/AI/HackyAI.cs b/OpenRA.Mods.RA/AI/HackyAI.cs index c25260e0ca..553e53b662 100644 --- a/OpenRA.Mods.RA/AI/HackyAI.cs +++ b/OpenRA.Mods.RA/AI/HackyAI.cs @@ -441,34 +441,28 @@ namespace OpenRA.Mods.RA.AI return target; } - bool IsValidTarget(Actor a, Actor targeter) + internal Actor FindClosestEnemy(WPos pos) { - if (p.Stances[a.Owner] != Stance.Enemy) - return false; + var allEnemyUnits = world.Actors + .Where(unit => p.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait() && + unit.HasTrait()).ToList(); - // TODO: We shouldn't need to check this explicitly - if (!a.HasTrait()) - return false; + if (allEnemyUnits.Count > 0) + return allEnemyUnits.ClosestTo(pos); - var targetable = a.TraitOrDefault(); - if (targetable == null || !targetable.TargetableBy(a, targeter)) - return false; - - return true; + return null; } - internal Actor FindClosestEnemy(Actor targeter, WPos pos) + internal Actor FindClosestEnemy(WPos pos, WRange radius) { - return world.Actors - .Where(unit => IsValidTarget(unit, targeter)) - .ClosestTo(pos); - } + var enemyUnits = world.FindActorsInCircle(pos, radius) + .Where(unit => p.Stances[unit.Owner] == Stance.Enemy && + !unit.HasTrait() && unit.HasTrait()).ToList(); - internal Actor FindClosestEnemy(Actor targeter, WPos pos, WRange radius) - { - return world.FindActorsInCircle(pos, radius) - .Where(unit => IsValidTarget(unit, targeter)) - .ClosestTo(pos); + if (enemyUnits.Count > 0) + return enemyUnits.ClosestTo(pos); + + return null; } List FindEnemyConstructionYards() diff --git a/OpenRA.Mods.RA/AI/States/AirStates.cs b/OpenRA.Mods.RA/AI/States/AirStates.cs index 24449d50cc..99d7a7dcb1 100644 --- a/OpenRA.Mods.RA/AI/States/AirStates.cs +++ b/OpenRA.Mods.RA/AI/States/AirStates.cs @@ -183,8 +183,8 @@ namespace OpenRA.Mods.RA.AI if (!owner.TargetIsValid) { - var targeter = owner.units.Random(owner.random); - var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition); + var a = owner.units.Random(owner.random); + var closestEnemy = owner.bot.FindClosestEnemy(a.CenterPosition); if (closestEnemy != null) owner.Target = closestEnemy; else diff --git a/OpenRA.Mods.RA/AI/States/GroundStates.cs b/OpenRA.Mods.RA/AI/States/GroundStates.cs index aee6455ecb..1846c9758b 100644 --- a/OpenRA.Mods.RA/AI/States/GroundStates.cs +++ b/OpenRA.Mods.RA/AI/States/GroundStates.cs @@ -33,11 +33,8 @@ namespace OpenRA.Mods.RA.AI if (!owner.TargetIsValid) { - var targeter = owner.units.First(); - var t = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition); - if (t == null) - return; - + var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterPosition); + if (t == null) return; owner.Target = t; } @@ -74,8 +71,7 @@ namespace OpenRA.Mods.RA.AI if (!owner.TargetIsValid) { - var targeter = owner.units.Random(owner.random); - var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition); + var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition); if (closestEnemy != null) owner.Target = closestEnemy; else @@ -133,8 +129,7 @@ namespace OpenRA.Mods.RA.AI if (!owner.TargetIsValid) { - var targeter = owner.units.Random(owner.random); - var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition); + var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition); if (closestEnemy != null) owner.Target = closestEnemy; else @@ -146,7 +141,7 @@ namespace OpenRA.Mods.RA.AI foreach (var a in owner.units) 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)) { diff --git a/OpenRA.Mods.RA/AI/States/ProtectionStates.cs b/OpenRA.Mods.RA/AI/States/ProtectionStates.cs index d473457e7f..ff40ec8219 100644 --- a/OpenRA.Mods.RA/AI/States/ProtectionStates.cs +++ b/OpenRA.Mods.RA/AI/States/ProtectionStates.cs @@ -32,8 +32,7 @@ namespace OpenRA.Mods.RA.AI if (!owner.TargetIsValid) { - var targeter = owner.units.FirstOrDefault(); - owner.Target = owner.bot.FindClosestEnemy(targeter, owner.CenterPosition, WRange.FromCells(8)); + owner.Target = owner.bot.FindClosestEnemy(owner.CenterPosition, WRange.FromCells(8)); if (owner.Target == null) {