diff --git a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs index d2da0f0b34..de93e9334d 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs @@ -24,6 +24,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Actor types that are valid for naval squads.")] public readonly HashSet NavalUnitsTypes = new HashSet(); + [Desc("Actor types that are excluded from ground attacks.")] + public readonly HashSet AirUnitsTypes = new HashSet(); + [Desc("Actor types that should generally be excluded from attack squads.")] public readonly HashSet ExcludeFromSquadsTypes = new HashSet(); @@ -257,7 +260,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var a in newUnits) { - if (a.Info.HasTraitInfo() && a.Info.HasTraitInfo()) + if (Info.AirUnitsTypes.Contains(a.Info.Name)) { var air = GetSquadOfType(SquadType.Air); if (air == null) @@ -307,10 +310,9 @@ namespace OpenRA.Mods.Common.Traits { var allEnemyBaseBuilder = AIUtils.FindEnemiesByCommonName(Info.ConstructionYardTypes, Player); - // TODO: This should use common names & ExcludeFromSquads instead of hardcoding TraitInfo checks var ownUnits = activeUnits .Where(unit => unit.IsIdle && unit.Info.HasTraitInfo() - && !unit.Info.HasTraitInfo() && !Info.NavalUnitsTypes.Contains(unit.Info.Name) && !unit.Info.HasTraitInfo()).ToList(); + && !Info.AirUnitsTypes.Contains(unit.Info.Name) && !Info.NavalUnitsTypes.Contains(unit.Info.Name) && !Info.ExcludeFromSquadsTypes.Contains(unit.Info.Name)).ToList(); if (!allEnemyBaseBuilder.Any() || ownUnits.Count < Info.SquadSize) return; diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/UnhardcodeSquadManager.cs b/OpenRA.Mods.Common/UpdateRules/Rules/UnhardcodeSquadManager.cs new file mode 100644 index 0000000000..f07665d36c --- /dev/null +++ b/OpenRA.Mods.Common/UpdateRules/Rules/UnhardcodeSquadManager.cs @@ -0,0 +1,43 @@ +#region Copyright & License Information +/* + * Copyright 2007-2021 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Mods.Common.Traits; + +namespace OpenRA.Mods.Common.UpdateRules.Rules +{ + public class UnhardcodeSquadManager : UpdateRule + { + public override string Name => "SquadManagerBotModule got new fields to configure ground attacks and defensive actions."; + + public override string Description => "AirUnitsTypes and ProtectionTypes were added."; + + public override IEnumerable UpdateActorNode(ModData modData, MiniYamlNode actorNode) + { + var addNodes = new List(); + + var aircraft = modData.DefaultRules.Actors.Values.Where(a => a.HasTraitInfo() && a.HasTraitInfo()).Select(a => a.Name); + var airUnits = new MiniYamlNode("AirUnitsTypes", FieldSaver.FormatValue(aircraft.ToList())); + addNodes.Add(airUnits); + + var vips = modData.DefaultRules.Actors.Values.Where(a => a.HasTraitInfo() || a.HasTraitInfo() || (a.HasTraitInfo() && a.HasTraitInfo() && !a.HasTraitInfo() && !a.HasTraitInfo())).Select(a => a.Name); + var protection = new MiniYamlNode("ProtectionTypes", FieldSaver.FormatValue(vips.ToList())); + addNodes.Add(protection); + + foreach (var squadManager in actorNode.ChildrenMatching("SquadManagerBotModule")) + foreach (var addNode in addNodes) + squadManager.AddNode(addNode); + + yield break; + } + } +} diff --git a/mods/cnc/rules/ai.yaml b/mods/cnc/rules/ai.yaml index a92157a55e..7a4471f224 100644 --- a/mods/cnc/rules/ai.yaml +++ b/mods/cnc/rules/ai.yaml @@ -216,8 +216,9 @@ Player: SquadManagerBotModule@cabal: RequiresCondition: enable-cabal-ai SquadSize: 15 - ExcludeFromSquadsTypes: harv, mcv + ExcludeFromSquadsTypes: harv, mcv, a10 ConstructionYardTypes: fact + AirUnitsTypes: heli, orca UnitBuilderBotModule@cabal: RequiresCondition: enable-cabal-ai UnitQueues: Vehicle.Nod, Vehicle.GDI, Infantry.Nod, Infantry.GDI, Aircraft.Nod, Aircraft.GDI @@ -250,8 +251,9 @@ Player: SquadManagerBotModule@watson: RequiresCondition: enable-watson-ai SquadSize: 15 - ExcludeFromSquadsTypes: harv, mcv + ExcludeFromSquadsTypes: harv, mcv, a10 ConstructionYardTypes: fact + AirUnitsTypes: heli, orca UnitBuilderBotModule@watson: RequiresCondition: enable-watson-ai UnitQueues: Vehicle.Nod, Vehicle.GDI, Infantry.Nod, Infantry.GDI, Aircraft.Nod, Aircraft.GDI @@ -279,8 +281,9 @@ Player: SquadManagerBotModule@hal9001: RequiresCondition: enable-hal9001-ai SquadSize: 8 - ExcludeFromSquadsTypes: harv, mcv + ExcludeFromSquadsTypes: harv, mcv, a10 ConstructionYardTypes: fact + AirUnitsTypes: heli, orca UnitBuilderBotModule@hal9001: RequiresCondition: enable-hal9001-ai UnitQueues: Vehicle.Nod, Vehicle.GDI, Infantry.Nod, Infantry.GDI, Aircraft.Nod, Aircraft.GDI diff --git a/mods/d2k/rules/ai.yaml b/mods/d2k/rules/ai.yaml index 4713b514d7..6fad5988a7 100644 --- a/mods/d2k/rules/ai.yaml +++ b/mods/d2k/rules/ai.yaml @@ -219,7 +219,7 @@ Player: RequiresCondition: enable-omnius-ai SquadSize: 8 MaxBaseRadius: 40 - ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce + ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce, ornithopter ConstructionYardTypes: construction_yard IgnoredEnemyTargetTypes: Creep UnitBuilderBotModule@omnius: @@ -263,7 +263,7 @@ Player: RequiresCondition: enable-vidious-ai SquadSize: 6 MaxBaseRadius: 40 - ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce + ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce, ornithopter ConstructionYardTypes: construction_yard IgnoredEnemyTargetTypes: Creep UnitBuilderBotModule@vidious: @@ -302,7 +302,7 @@ Player: RequiresCondition: enable-gladius-ai SquadSize: 10 MaxBaseRadius: 40 - ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce + ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce, ornithopter ConstructionYardTypes: construction_yard IgnoredEnemyTargetTypes: Creep UnitBuilderBotModule@gladius: diff --git a/mods/ra/rules/ai.yaml b/mods/ra/rules/ai.yaml index 5a46c080c4..b118fdd32d 100644 --- a/mods/ra/rules/ai.yaml +++ b/mods/ra/rules/ai.yaml @@ -274,9 +274,10 @@ Player: SquadManagerBotModule@rush: RequiresCondition: enable-rush-ai SquadSize: 20 - ExcludeFromSquadsTypes: harv, mcv, dog NavalUnitsTypes: ss,msub,dd,ca,lst,pt + ExcludeFromSquadsTypes: harv, mcv, dog, badr.bomber, u2 ConstructionYardTypes: fact + AirUnitsTypes: mig, yak, heli, hind, mh60 McvManagerBotModule: RequiresCondition: enable-rush-ai || enable-normal-ai || enable-turtle-ai || enable-naval-ai McvTypes: mcv @@ -311,10 +312,11 @@ Player: SquadManagerBotModule@normal: RequiresCondition: enable-normal-ai SquadSize: 40 - ExcludeFromSquadsTypes: harv, mcv, dog NavalUnitsTypes: ss,msub,dd,ca,lst,pt + ExcludeFromSquadsTypes: harv, mcv, dog, badr.bomber, u2 ConstructionYardTypes: fact NavalProductionTypes: spen,syrd + AirUnitsTypes: mig, yak, heli, hind, mh60 UnitBuilderBotModule@normal: RequiresCondition: enable-normal-ai UnitsToBuild: @@ -353,10 +355,11 @@ Player: SquadManagerBotModule@turtle: RequiresCondition: enable-turtle-ai SquadSize: 10 - ExcludeFromSquadsTypes: harv, mcv, dog NavalUnitsTypes: ss,msub,dd,ca,lst,pt + ExcludeFromSquadsTypes: harv, mcv, dog, badr.bomber, u2 ConstructionYardTypes: fact NavalProductionTypes: spen,syrd + AirUnitsTypes: mig, yak, heli, hind, mh60 UnitBuilderBotModule@turtle: RequiresCondition: enable-turtle-ai UnitsToBuild: @@ -395,10 +398,11 @@ Player: SquadManagerBotModule@naval: RequiresCondition: enable-naval-ai SquadSize: 1 - ExcludeFromSquadsTypes: harv, mcv, dog + ExcludeFromSquadsTypes: harv, mcv, dog, badr.bomber, u2 NavalUnitsTypes: ss,msub,dd,ca,lst,pt ConstructionYardTypes: fact NavalProductionTypes: spen,syrd + AirUnitsTypes: mig, yak, heli, hind, mh60 UnitBuilderBotModule@naval: RequiresCondition: enable-naval-ai UnitsToBuild: diff --git a/mods/ts/rules/ai.yaml b/mods/ts/rules/ai.yaml index 98523e9cc8..8431b88e2a 100644 --- a/mods/ts/rules/ai.yaml +++ b/mods/ts/rules/ai.yaml @@ -70,8 +70,9 @@ Player: SquadManagerBotModule@test: RequiresCondition: enable-test-ai SquadSize: 20 - ExcludeFromSquadsTypes: harv, mcv + ExcludeFromSquadsTypes: harv, mcv, dpod, hunter ConstructionYardTypes: gacnst + AirUnitsTypes: orca, orcab, scrin, apache, jumpjet UnitBuilderBotModule@test: RequiresCondition: enable-test-ai UnitQueues: Vehicle, Infantry, Air