diff --git a/OpenRA.Game/Traits/Player/FrozenActorLayer.cs b/OpenRA.Game/Traits/Player/FrozenActorLayer.cs index 4724de23da..9e34ddadb8 100644 --- a/OpenRA.Game/Traits/Player/FrozenActorLayer.cs +++ b/OpenRA.Game/Traits/Player/FrozenActorLayer.cs @@ -323,11 +323,28 @@ namespace OpenRA.Traits return fa; } - public IEnumerable FrozenActorsInRegion(CellRegion region) + public IEnumerable FrozenActorsInRegion(CellRegion region, bool onlyVisible = true) { var tl = region.TopLeft; var br = region.BottomRight; - return partitionedFrozenActorIds.InBox(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y)).Select(FromID); + return partitionedFrozenActorIds.InBox(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y)) + .Select(FromID) + .Where(fa => fa.IsValid && (!onlyVisible || fa.Visible)); + } + + public IEnumerable FrozenActorsInCircle(World world, WPos origin, WDist r, bool onlyVisible = true) + { + var centerCell = world.Map.CellContaining(origin); + var cellRange = (r.Length + 1023) / 1024; + var tl = centerCell - new CVec(cellRange, cellRange); + var br = centerCell + new CVec(cellRange, cellRange); + + // Target ranges are calculated in 2D, so ignore height differences + return partitionedFrozenActorIds.InBox(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y)) + .Select(FromID) + .Where(fa => fa.IsValid && + (!onlyVisible || fa.Visible) && + (fa.CenterPosition - origin).HorizontalLengthSquared <= r.LengthSquared); } } } diff --git a/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs b/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs index a6cc850b15..210b02feb5 100644 --- a/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs +++ b/OpenRA.Mods.Common/Traits/BotModules/BotModuleLogic/SupportPowerDecision.cs @@ -81,8 +81,7 @@ namespace OpenRA.Mods.Common.Traits // IsValid check filters out Frozen Actors that have not initizialized their Owner foreach (var scrutinized in checkFrozen) - if (scrutinized.IsValid) - answer += consideration.GetAttractiveness(scrutinized, firedBy.Stances[scrutinized.Owner], firedBy); + answer += consideration.GetAttractiveness(scrutinized, firedBy.Stances[scrutinized.Owner], firedBy); } return answer;