From ae882b85a95c59525c140b082e081484b9552e23 Mon Sep 17 00:00:00 2001 From: darkademic <41052878+darkademic@users.noreply.github.com> Date: Mon, 18 May 2020 17:53:42 +0100 Subject: [PATCH] Make AI randomly scan map for targets for its air squads. --- .../BotModules/SquadManagerBotModule.cs | 8 ++++++++ .../BotModules/Squads/States/AirStates.cs | 20 +++++++++---------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs index e984fee5b3..3ffaa91ee5 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/SquadManagerBotModule.cs @@ -78,6 +78,14 @@ namespace OpenRA.Mods.Common.Traits [Desc("Enemy target types to never target.")] public readonly BitSet IgnoredEnemyTargetTypes = default(BitSet); + public override void RulesetLoaded(Ruleset rules, ActorInfo ai) + { + base.RulesetLoaded(rules, ai); + + if (DangerScanRadius <= 0) + throw new YamlException("DangerScanRadius must be greater than zero."); + } + public override object Create(ActorInitializer init) { return new SquadManagerBotModule(init.Self, this); } } diff --git a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs index 6518299327..0e6e64a49c 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/Squads/States/AirStates.cs @@ -65,21 +65,19 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads var map = owner.World.Map; var dangerRadius = owner.SquadManager.Info.DangerScanRadius; detectedEnemyTarget = null; - var x = (map.MapSize.X % dangerRadius) == 0 ? map.MapSize.X : map.MapSize.X + dangerRadius; - var y = (map.MapSize.Y % dangerRadius) == 0 ? map.MapSize.Y : map.MapSize.Y + dangerRadius; - for (var i = 0; i < x; i += dangerRadius * 2) + var columnCount = (map.MapSize.X + dangerRadius - 1) / dangerRadius; + var rowCount = (map.MapSize.Y + dangerRadius - 1) / dangerRadius; + var checkIndices = Exts.MakeArray(columnCount * rowCount, i => i).Shuffle(owner.World.LocalRandom); + foreach (var i in checkIndices) { - for (var j = 0; j < y; j += dangerRadius * 2) + var pos = new CPos((i % columnCount) * dangerRadius + dangerRadius / 2, (i / columnCount) * dangerRadius + dangerRadius / 2); + if (NearToPosSafely(owner, map.CenterOfCell(pos), out detectedEnemyTarget)) { - var pos = new CPos(i, j); - if (NearToPosSafely(owner, map.CenterOfCell(pos), out detectedEnemyTarget)) - { - if (needTarget && detectedEnemyTarget == null) - continue; + if (needTarget && detectedEnemyTarget == null) + continue; - return pos; - } + return pos; } }