Skip to content

Commit 2dac16e

Browse files
atlimit8pchote
authored andcommitted
add SquadManagerBotModuleInfo.IgnoredEnemyTargetTypes
1 parent d4b92a1 commit 2dac16e

File tree

6 files changed

+24
-14
lines changed

6 files changed

+24
-14
lines changed

Diff for: OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs

+15-8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using System.Collections.Generic;
1515
using System.Linq;
1616
using OpenRA.Mods.Common.Traits.BotModules.Squads;
17+
using OpenRA.Primitives;
1718
using OpenRA.Support;
1819
using OpenRA.Traits;
1920

@@ -74,6 +75,9 @@ public class SquadManagerBotModuleInfo : ConditionalTraitInfo
7475
[Desc("Radius in cells that protecting squads should scan for enemies around their position.")]
7576
public readonly int ProtectionScanRadius = 8;
7677

78+
[Desc("Enemy target types to never target.")]
79+
public readonly BitSet<TargetableType> IgnoredEnemyTargetTypes = default(BitSet<TargetableType>);
80+
7781
public override object Create(ActorInitializer init) { return new SquadManagerBotModule(init.Self, this); }
7882
}
7983

@@ -119,11 +123,14 @@ public SquadManagerBotModule(Actor self, SquadManagerBotModuleInfo info)
119123
unitCannotBeOrdered = a => a == null || a.Owner != Player || a.IsDead || !a.IsInWorld;
120124
}
121125

122-
public bool IsEnemyUnit(Actor a)
126+
// Use for proactive targeting.
127+
public bool IsPreferredEnemyUnit(Actor a)
123128
{
124-
return a != null && !a.IsDead && Player.Stances[a.Owner] == Stance.Enemy
125-
&& !a.Info.HasTraitInfo<HuskInfo>()
126-
&& !a.GetEnabledTargetTypes().IsEmpty;
129+
if (a == null || a.IsDead || Player.Stances[a.Owner] != Stance.Enemy || a.Info.HasTraitInfo<HuskInfo>())
130+
return false;
131+
132+
var targetTypes = a.GetEnabledTargetTypes();
133+
return !targetTypes.IsEmpty && !targetTypes.Overlaps(Info.IgnoredEnemyTargetTypes);
127134
}
128135

129136
public bool IsNotHiddenUnit(Actor a)
@@ -175,13 +182,13 @@ void IBotTick.BotTick(IBot bot)
175182

176183
internal Actor FindClosestEnemy(WPos pos)
177184
{
178-
var units = World.Actors.Where(IsEnemyUnit);
185+
var units = World.Actors.Where(IsPreferredEnemyUnit);
179186
return units.Where(IsNotHiddenUnit).ClosestTo(pos) ?? units.ClosestTo(pos);
180187
}
181188

182189
internal Actor FindClosestEnemy(WPos pos, WDist radius)
183190
{
184-
return World.FindActorsInCircle(pos, radius).Where(a => IsEnemyUnit(a) && IsNotHiddenUnit(a)).ClosestTo(pos);
191+
return World.FindActorsInCircle(pos, radius).Where(a => IsPreferredEnemyUnit(a) && IsNotHiddenUnit(a)).ClosestTo(pos);
185192
}
186193

187194
void CleanSquads()
@@ -311,7 +318,7 @@ void TryToRushAttack(IBot bot)
311318
{
312319
// Don't rush enemy aircraft!
313320
var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius))
314-
.Where(unit => IsEnemyUnit(unit) && unit.Info.HasTraitInfo<AttackBaseInfo>() && !unit.Info.HasTraitInfo<AircraftInfo>() && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList();
321+
.Where(unit => IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo<AttackBaseInfo>() && !unit.Info.HasTraitInfo<AircraftInfo>() && !Info.NavalUnitsTypes.Contains(unit.Info.Name)).ToList();
315322

316323
if (AttackOrFleeFuzzy.Rush.CanAttack(ownUnits, enemies))
317324
{
@@ -357,7 +364,7 @@ void IBotPositionsUpdated.UpdatedDefenseCenter(CPos newLocation) { }
357364

358365
void IBotRespondToAttack.RespondToAttack(IBot bot, Actor self, AttackInfo e)
359366
{
360-
if (!IsEnemyUnit(e.Attacker))
367+
if (!IsPreferredEnemyUnit(e.Attacker))
361368
return;
362369

363370
// Protected priority assets, MCVs, harvesters and buildings

Diff for: OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ protected static bool NearToPosSafely(Squad owner, WPos loc, out Actor detectedE
9797
detectedEnemyTarget = null;
9898
var dangerRadius = owner.SquadManager.Info.DangerScanRadius;
9999
var unitsAroundPos = owner.World.FindActorsInCircle(loc, WDist.FromCells(dangerRadius))
100-
.Where(owner.SquadManager.IsEnemyUnit).ToList();
100+
.Where(owner.SquadManager.IsPreferredEnemyUnit).ToList();
101101

102102
if (!unitsAroundPos.Any())
103103
return true;

Diff for: OpenRA.Mods.Common/Traits/BotModules/Squads/States/GroundStates.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public void Tick(Squad owner)
4646
}
4747

4848
var enemyUnits = owner.World.FindActorsInCircle(owner.TargetActor.CenterPosition, WDist.FromCells(owner.SquadManager.Info.IdleScanRadius))
49-
.Where(owner.SquadManager.IsEnemyUnit).ToList();
49+
.Where(owner.SquadManager.IsPreferredEnemyUnit).ToList();
5050

5151
if (enemyUnits.Count == 0)
5252
return;
@@ -105,7 +105,7 @@ public void Tick(Squad owner)
105105
else
106106
{
107107
var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius))
108-
.Where(owner.SquadManager.IsEnemyUnit);
108+
.Where(owner.SquadManager.IsPreferredEnemyUnit);
109109
var target = enemies.ClosestTo(leader.CenterPosition);
110110
if (target != null)
111111
{

Diff for: OpenRA.Mods.Common/Traits/BotModules/Squads/States/NavyStates.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void Tick(Squad owner)
7171
}
7272

7373
var enemyUnits = owner.World.FindActorsInCircle(owner.TargetActor.CenterPosition, WDist.FromCells(owner.SquadManager.Info.IdleScanRadius))
74-
.Where(owner.SquadManager.IsEnemyUnit).ToList();
74+
.Where(owner.SquadManager.IsPreferredEnemyUnit).ToList();
7575

7676
if (enemyUnits.Count == 0)
7777
return;
@@ -130,7 +130,7 @@ public void Tick(Squad owner)
130130
else
131131
{
132132
var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(owner.SquadManager.Info.AttackScanRadius))
133-
.Where(owner.SquadManager.IsEnemyUnit);
133+
.Where(owner.SquadManager.IsPreferredEnemyUnit);
134134
var target = enemies.ClosestTo(leader.CenterPosition);
135135
if (target != null)
136136
{

Diff for: OpenRA.Mods.Common/Traits/BotModules/Squads/States/StateBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ protected virtual bool ShouldFlee(Squad squad, Func<IEnumerable<Actor>, bool> fl
9595
if (u.Owner == squad.Bot.Player && u.Info.HasTraitInfo<BuildingInfo>())
9696
return false;
9797

98-
var enemyAroundUnit = units.Where(unit => squad.SquadManager.IsEnemyUnit(unit) && unit.Info.HasTraitInfo<AttackBaseInfo>());
98+
var enemyAroundUnit = units.Where(unit => squad.SquadManager.IsPreferredEnemyUnit(unit) && unit.Info.HasTraitInfo<AttackBaseInfo>());
9999
if (!enemyAroundUnit.Any())
100100
return false;
101101

Diff for: mods/d2k/rules/ai.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ Player:
221221
MaxBaseRadius: 40
222222
ExcludeFromSquadsTypes: harvester, mcv
223223
ConstructionYardTypes: construction_yard
224+
IgnoredEnemyTargetTypes: Creep
224225
UnitBuilderBotModule@omnius:
225226
RequiresCondition: enable-omnius-ai
226227
UnitQueues: Infantry, Vehicle, Armor, Starport, Aircraft
@@ -264,6 +265,7 @@ Player:
264265
MaxBaseRadius: 40
265266
ExcludeFromSquadsTypes: harvester, mcv
266267
ConstructionYardTypes: construction_yard
268+
IgnoredEnemyTargetTypes: Creep
267269
UnitBuilderBotModule@vidious:
268270
RequiresCondition: enable-vidious-ai
269271
UnitQueues: Infantry, Vehicle, Armor, Starport, Aircraft
@@ -302,6 +304,7 @@ Player:
302304
MaxBaseRadius: 40
303305
ExcludeFromSquadsTypes: harvester, mcv
304306
ConstructionYardTypes: construction_yard
307+
IgnoredEnemyTargetTypes: Creep
305308
UnitBuilderBotModule@gladius:
306309
RequiresCondition: enable-gladius-ai
307310
UnitQueues: Infantry, Vehicle, Armor, Starport, Aircraft

0 commit comments

Comments
 (0)