Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Discourage harvesters from wandering too far from the refinery. #16935

Merged
merged 1 commit into from Aug 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 26 additions & 1 deletion OpenRA.Mods.Common/Activities/FindAndDeliverResources.cs
Expand Up @@ -9,6 +9,7 @@
*/
#endregion

using System;
using System.Collections.Generic;
using OpenRA.Activities;
using OpenRA.Mods.Common.Pathfinder;
Expand Down Expand Up @@ -175,7 +176,8 @@ public override bool Tick(Actor self)
}

// Determine where to search from and how far to search:
var searchFromLoc = lastHarvestedCell ?? GetSearchFromProcLocation(self);
var procLoc = GetSearchFromProcLocation(self);
var searchFromLoc = lastHarvestedCell ?? procLoc;
var searchRadius = lastHarvestedCell.HasValue ? harvInfo.SearchFromHarvesterRadius : harvInfo.SearchFromProcRadius;
if (!searchFromLoc.HasValue)
{
Expand All @@ -185,6 +187,9 @@ public override bool Tick(Actor self)

var searchRadiusSquared = searchRadius * searchRadius;

var procPos = procLoc.HasValue ? (WPos?)self.World.Map.CenterOfCell(procLoc.Value) : null;
var harvPos = self.CenterPosition;

// Find any harvestable resources:
List<CPos> path;
using (var search = PathSearch.Search(self.World, mobile.Locomotor, self, true, loc =>
Expand All @@ -194,6 +199,26 @@ public override bool Tick(Actor self)
if ((loc - searchFromLoc.Value).LengthSquared > searchRadiusSquared)
return int.MaxValue;

// Add a cost modifier to harvestable cells to prefer resources that are closer to the refinery.
// This reduces the tendancy for harvesters to move in straight lines
if (procPos.HasValue && harvInfo.ResourceRefineryDirectionPenalty > 0 && harv.CanHarvestCell(self, loc))
{
var pos = self.World.Map.CenterOfCell(loc);

// Calculate harv-cell-refinery angle (cosine rule)
var aSq = (harvPos - procPos.Value).LengthSquared;
var bSq = (pos - procPos.Value).LengthSquared;
var cSq = (pos - harvPos).LengthSquared;

if (bSq > 0 && cSq > 0)
{
var cosA = (int)(1024 * (bSq + cSq - aSq) / (2 * Exts.ISqrt(bSq * cSq)));

// Cost modifier varies between 0 and ResourceRefineryDirectionPenalty
return Math.Abs(harvInfo.ResourceRefineryDirectionPenalty / 2) + harvInfo.ResourceRefineryDirectionPenalty * cosA / 2048;
}
}

return 0;
})
.FromPoint(searchFromLoc.Value)
Expand Down
3 changes: 3 additions & 0 deletions OpenRA.Mods.Common/Traits/Harvester.cs
Expand Up @@ -71,6 +71,9 @@ public class HarvesterInfo : ITraitInfo, Requires<MobileInfo>
[Desc("The pathfinding cost penalty applied for each harvester waiting to unload at a refinery.")]
public readonly int UnloadQueueCostModifier = 12;

[Desc("The pathfinding cost penalty applied for cells directly away from the refinery.")]
public readonly int ResourceRefineryDirectionPenalty = 200;

[Desc("Does the unit queue harvesting runs instead of individual harvest actions?")]
public readonly bool QueueFullLoad = false;

Expand Down