From 2dac16ee029cf1feeb971af9093589df6771286f Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Mon, 23 Mar 2020 01:50:11 -0500 Subject: [PATCH] add SquadManagerBotModuleInfo.IgnoredEnemyTargetTypes --- .../BotModules/SquadManagerBotModule.cs | 23 ++++++++++++------- .../BotModules/Squads/States/AirStates.cs | 2 +- .../BotModules/Squads/States/GroundStates.cs | 4 ++-- .../BotModules/Squads/States/NavyStates.cs | 4 ++-- .../BotModules/Squads/States/StateBase.cs | 2 +- mods/d2k/rules/ai.yaml | 3 +++ 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs index 8eccc4b38d..a78dd106c5 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs @@ -14,6 +14,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Traits.BotModules.Squads; +using OpenRA.Primitives; using OpenRA.Support; using OpenRA.Traits; @@ -74,6 +75,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Radius in cells that protecting squads should scan for enemies around their position.")] public readonly int ProtectionScanRadius = 8; + [Desc("Enemy target types to never target.")] + public readonly BitSet IgnoredEnemyTargetTypes = default(BitSet); + public override object Create(ActorInitializer init) { return new SquadManagerBotModule(init.Self, this); } } @@ -119,11 +123,14 @@ namespace OpenRA.Mods.Common.Traits unitCannotBeOrdered = a => a == null || a.Owner != Player || a.IsDead || !a.IsInWorld; } - public bool IsEnemyUnit(Actor a) + // Use for proactive targeting. + public bool IsPreferredEnemyUnit(Actor a) { - return a != null && !a.IsDead && Player.Stances[a.Owner] == Stance.Enemy - && !a.Info.HasTraitInfo() - && !a.GetEnabledTargetTypes().IsEmpty; + if (a == null || a.IsDead || Player.Stances[a.Owner] != Stance.Enemy || a.Info.HasTraitInfo()) + return false; + + var targetTypes = a.GetEnabledTargetTypes(); + return !targetTypes.IsEmpty && !targetTypes.Overlaps(Info.IgnoredEnemyTargetTypes); } public bool IsNotHiddenUnit(Actor a) @@ -175,13 +182,13 @@ namespace OpenRA.Mods.Common.Traits internal Actor FindClosestEnemy(WPos pos) { - var units = World.Actors.Where(IsEnemyUnit); + var units = World.Actors.Where(IsPreferredEnemyUnit); return units.Where(IsNotHiddenUnit).ClosestTo(pos) ?? units.ClosestTo(pos); } internal Actor FindClosestEnemy(WPos pos, WDist radius) { - return World.FindActorsInCircle(pos, radius).Where(a => IsEnemyUnit(a) && IsNotHiddenUnit(a)).ClosestTo(pos); + return World.FindActorsInCircle(pos, radius).Where(a => IsPreferredEnemyUnit(a) && IsNotHiddenUnit(a)).ClosestTo(pos); } void CleanSquads() @@ -311,7 +318,7 @@ namespace OpenRA.Mods.Common.Traits { // Don't rush enemy aircraft! var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius)) - .Where(unit => IsEnemyUnit(unit) && unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList(); + .Where(unit => IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList(); if (AttackOrFleeFuzzy.Rush.CanAttack(ownUnits, enemies)) { @@ -357,7 +364,7 @@ namespace OpenRA.Mods.Common.Traits void IBotRespondToAttack.RespondToAttack(IBot bot, Actor self, AttackInfo e) { - if (!IsEnemyUnit(e.Attacker)) + if (!IsPreferredEnemyUnit(e.Attacker)) return; // Protected priority assets, MCVs, harvesters and buildings diff --git a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs index f4b8dfdcfd..6518299327 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs @@ -97,7 +97,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads detectedEnemyTarget = null; var dangerRadius = owner.SquadManager.Info.DangerScanRadius; var unitsAroundPos = owner.World.FindActorsInCircle(loc, WDist.FromCells(dangerRadius)) - .Where(owner.SquadManager.IsEnemyUnit).ToList(); + .Where(owner.SquadManager.IsPreferredEnemyUnit).ToList(); if (!unitsAroundPos.Any()) return true; diff --git a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/GroundStates.cs b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/GroundStates.cs index d43121d0b2..82e5d4c6c2 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/GroundStates.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/GroundStates.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads } var enemyUnits = owner.World.FindActorsInCircle(owner.TargetActor.CenterPosition, WDist.FromCells(owner.SquadManager.Info.IdleScanRadius)) - .Where(owner.SquadManager.IsEnemyUnit).ToList(); + .Where(owner.SquadManager.IsPreferredEnemyUnit).ToList(); if (enemyUnits.Count == 0) return; @@ -105,7 +105,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads else { var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)) - .Where(owner.SquadManager.IsEnemyUnit); + .Where(owner.SquadManager.IsPreferredEnemyUnit); var target = enemies.ClosestTo(leader.CenterPosition); if (target != null) { diff --git a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/NavyStates.cs b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/NavyStates.cs index 03b5af5795..ad37b91b13 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/NavyStates.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/NavyStates.cs @@ -71,7 +71,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads } var enemyUnits = owner.World.FindActorsInCircle(owner.TargetActor.CenterPosition, WDist.FromCells(owner.SquadManager.Info.IdleScanRadius)) - .Where(owner.SquadManager.IsEnemyUnit).ToList(); + .Where(owner.SquadManager.IsPreferredEnemyUnit).ToList(); if (enemyUnits.Count == 0) return; @@ -130,7 +130,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads else { var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius)) - .Where(owner.SquadManager.IsEnemyUnit); + .Where(owner.SquadManager.IsPreferredEnemyUnit); var target = enemies.ClosestTo(leader.CenterPosition); if (target != null) { diff --git a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/StateBase.cs b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/StateBase.cs index 050b3ad591..6ab4642b56 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/StateBase.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/StateBase.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads if (u.Owner == squad.Bot.Player && u.Info.HasTraitInfo()) return false; - var enemyAroundUnit = units.Where(unit => squad.SquadManager.IsEnemyUnit(unit) && unit.Info.HasTraitInfo()); + var enemyAroundUnit = units.Where(unit => squad.SquadManager.IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo()); if (!enemyAroundUnit.Any()) return false; diff --git a/mods/d2k/rules/ai.yaml b/mods/d2k/rules/ai.yaml index df583e80c3..90f2d19518 100644 --- a/mods/d2k/rules/ai.yaml +++ b/mods/d2k/rules/ai.yaml @@ -221,6 +221,7 @@ Player: MaxBaseRadius: 40 ExcludeFromSquadsTypes: harvester, mcv ConstructionYardTypes: construction_yard + IgnoredEnemyTargetTypes: Creep UnitBuilderBotModule@omnius: RequiresCondition: enable-omnius-ai UnitQueues: Infantry, Vehicle, Armor, Starport, Aircraft @@ -264,6 +265,7 @@ Player: MaxBaseRadius: 40 ExcludeFromSquadsTypes: harvester, mcv ConstructionYardTypes: construction_yard + IgnoredEnemyTargetTypes: Creep UnitBuilderBotModule@vidious: RequiresCondition: enable-vidious-ai UnitQueues: Infantry, Vehicle, Armor, Starport, Aircraft @@ -302,6 +304,7 @@ Player: MaxBaseRadius: 40 ExcludeFromSquadsTypes: harvester, mcv ConstructionYardTypes: construction_yard + IgnoredEnemyTargetTypes: Creep UnitBuilderBotModule@gladius: RequiresCondition: enable-gladius-ai UnitQueues: Infantry, Vehicle, Armor, Starport, Aircraft