Make AI randomly select from map squares with above average attractiveness when using support powers.
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user