Fix resource area calculation
This commit is contained in:
@@ -174,12 +174,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
void UpdateNetWorth(string oldResourceType, int oldDensity, string newResourceType, int newDensity)
|
void UpdateNetWorth(string oldResourceType, int oldDensity, string newResourceType, int newDensity)
|
||||||
{
|
{
|
||||||
// Density + 1 as workaround for fixing ResourceLayer.Harvest as it would be very disruptive to balancing
|
|
||||||
if (oldResourceType != null && oldDensity > 0 && resourceValues.TryGetValue(oldResourceType, out var oldResourceValue))
|
if (oldResourceType != null && oldDensity > 0 && resourceValues.TryGetValue(oldResourceType, out var oldResourceValue))
|
||||||
NetWorth -= (oldDensity + 1) * oldResourceValue;
|
NetWorth -= oldDensity * oldResourceValue;
|
||||||
|
|
||||||
if (newResourceType != null && newDensity > 0 && resourceValues.TryGetValue(newResourceType, out var newResourceValue))
|
if (newResourceType != null && newDensity > 0 && resourceValues.TryGetValue(newResourceType, out var newResourceValue))
|
||||||
NetWorth += (newDensity + 1) * newResourceValue;
|
NetWorth += newDensity * newResourceValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int CalculateRegionValue(CellRegion sourceRegion)
|
public int CalculateRegionValue(CellRegion sourceRegion)
|
||||||
@@ -188,39 +187,44 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
foreach (var cell in sourceRegion.CellCoords)
|
foreach (var cell in sourceRegion.CellCoords)
|
||||||
{
|
{
|
||||||
var mcell = cell.ToMPos(Map);
|
var mcell = cell.ToMPos(Map);
|
||||||
if (Map.Resources.Contains(mcell) && Map.Resources[mcell].Type != 0)
|
if (!Map.Resources.Contains(mcell))
|
||||||
{
|
continue;
|
||||||
resourceValueInRegion++;
|
|
||||||
var rcell = Map.Resources[mcell];
|
var resource = Map.Resources[mcell].Type;
|
||||||
if (ResourceTypesByIndex.TryGetValue(rcell.Type, out var resourceType) && resourceValues.TryGetValue(resourceType, out var resourceValuePerUnit))
|
if (resource != 0
|
||||||
resourceValueInRegion += Tiles[mcell].Density * resourceValuePerUnit;
|
&& ResourceTypesByIndex.TryGetValue(resource, out var resourceType)
|
||||||
}
|
&& resourceValues.TryGetValue(resourceType, out var resourceValuePerUnit))
|
||||||
|
resourceValueInRegion += Tiles[mcell].Density * resourceValuePerUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
return resourceValueInRegion;
|
return resourceValueInRegion;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual int CalculateCellDensity(ResourceLayerContents contents, CPos c)
|
/// <summary>
|
||||||
|
/// Matches the logic in <see cref="ResourceLayer"/> trait.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual int CalculateCellDensity(ResourceLayerContents contents, CPos cell)
|
||||||
{
|
{
|
||||||
var resources = Map.Resources;
|
var resources = Map.Resources;
|
||||||
if (contents.Type == null || !info.ResourceTypes.TryGetValue(contents.Type, out var resourceInfo) || resources[c].Type != resourceInfo.ResourceIndex)
|
if (contents.Type == null || !info.ResourceTypes.TryGetValue(contents.Type, out var resourceInfo) || resources[cell].Type != resourceInfo.ResourceIndex)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!info.RecalculateResourceDensity)
|
if (!info.RecalculateResourceDensity)
|
||||||
return contents.Density.Clamp(1, resourceInfo.MaxDensity);
|
return contents.Density.Clamp(1, resourceInfo.MaxDensity);
|
||||||
|
|
||||||
// Set density based on the number of neighboring resources
|
// Set density based on the number of neighboring resources.
|
||||||
var adjacent = 0;
|
var adjacent = 0;
|
||||||
for (var u = -1; u < 2; u++)
|
var directions = CVec.Directions;
|
||||||
|
for (var i = 0; i < directions.Length; i++)
|
||||||
{
|
{
|
||||||
for (var v = -1; v < 2; v++)
|
var c = cell + directions[i];
|
||||||
{
|
if (resources.Contains(c) && resources[c].Type == resourceInfo.ResourceIndex)
|
||||||
var cell = c + new CVec(u, v);
|
++adjacent;
|
||||||
if (resources.Contains(cell) && resources[cell].Type == resourceInfo.ResourceIndex)
|
|
||||||
adjacent++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We need to have at least one resource in the cell.
|
||||||
|
// HACK: we should not be lerping to 9, as maximum adjacent resources is 8.
|
||||||
|
// HACK: it's too disruptive to fix.
|
||||||
return Math.Max(int2.Lerp(0, resourceInfo.MaxDensity, adjacent, 9), 1);
|
return Math.Max(int2.Lerp(0, resourceInfo.MaxDensity, adjacent, 9), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -160,7 +160,9 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
++adjacent;
|
++adjacent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjacent includes the current cell, so is always >= 1
|
// We need to have at least one resource in the cell.
|
||||||
|
// HACK: we should not be lerping to 9, as maximum adjacent resources is 8.
|
||||||
|
// HACK: it's too disruptive to fix.
|
||||||
var density = Math.Max(int2.Lerp(0, resourceInfo.MaxDensity, adjacent, 9), 1);
|
var density = Math.Max(int2.Lerp(0, resourceInfo.MaxDensity, adjacent, 9), 1);
|
||||||
Content[cell] = new ResourceLayerContents(resource.Type, density);
|
Content[cell] = new ResourceLayerContents(resource.Type, density);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user