Make AI randomly select from map squares with above average attractiveness when using support powers.

This commit is contained in:
darkademic
2020-05-08 13:40:56 +01:00
committed by Paul Chote
parent df39d4fcc4
commit 8f9c212921

View File

@@ -125,8 +125,6 @@ namespace OpenRA.Mods.Common.Traits
/// <summary>Scans the map in chunks, evaluating all actors in each.</summary> /// <summary>Scans the map in chunks, evaluating all actors in each.</summary>
CPos? FindCoarseAttackLocationToSupportPower(SupportPowerInstance readyPower) CPos? FindCoarseAttackLocationToSupportPower(SupportPowerInstance readyPower)
{ {
CPos? bestLocation = null;
var bestAttractiveness = 0;
var powerDecision = powerDecisions[readyPower.Info.OrderName]; var powerDecision = powerDecisions[readyPower.Info.OrderName];
if (powerDecision == null) if (powerDecision == null)
{ {
@@ -136,6 +134,9 @@ namespace OpenRA.Mods.Common.Traits
var map = world.Map; var map = world.Map;
var checkRadius = powerDecision.CoarseScanRadius; var checkRadius = powerDecision.CoarseScanRadius;
var suitableLocations = new List<(MPos UV, int Attractiveness)>();
var totalAttractiveness = 0;
for (var i = 0; i < map.MapSize.X; i += checkRadius) for (var i = 0; i < map.MapSize.X; i += checkRadius)
{ {
for (var j = 0; j < map.MapSize.Y; j += checkRadius) for (var j = 0; j < map.MapSize.Y; j += checkRadius)
@@ -151,15 +152,22 @@ namespace OpenRA.Mods.Common.Traits
var frozenTargets = player.FrozenActorLayer != null ? player.FrozenActorLayer.FrozenActorsInRegion(region) : Enumerable.Empty<FrozenActor>(); var frozenTargets = player.FrozenActorLayer != null ? player.FrozenActorLayer.FrozenActorsInRegion(region) : Enumerable.Empty<FrozenActor>();
var consideredAttractiveness = powerDecision.GetAttractiveness(targets, player) + powerDecision.GetAttractiveness(frozenTargets, player); var consideredAttractiveness = powerDecision.GetAttractiveness(targets, player) + powerDecision.GetAttractiveness(frozenTargets, player);
if (consideredAttractiveness <= bestAttractiveness || consideredAttractiveness < powerDecision.MinimumAttractiveness) if (consideredAttractiveness < powerDecision.MinimumAttractiveness)
continue; continue;
bestAttractiveness = consideredAttractiveness; suitableLocations.Add((tl, consideredAttractiveness));
bestLocation = new MPos(i, j).ToCPos(map); totalAttractiveness += consideredAttractiveness;
} }
} }
return bestLocation; if (suitableLocations.Count == 0)
return null;
// Pick a random location with above average attractiveness.
var averageAttractiveness = totalAttractiveness / suitableLocations.Count;
return suitableLocations.Shuffle(world.LocalRandom)
.First(x => x.Attractiveness >= averageAttractiveness)
.UV.ToCPos(map);
} }
/// <summary>Detail scans an area, evaluating positions.</summary> /// <summary>Detail scans an area, evaluating positions.</summary>