Skip to content

Commit

Permalink
Add DeltaX/Y to calculate original positions and pumpjack direction
Browse files Browse the repository at this point in the history
  • Loading branch information
joelverhagen committed Jan 15, 2024
1 parent 3e5a71b commit d9be82a
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@ int GetEntityNumber(ElectricPoleCenter pole)

switch (gridEntity)
{
case PumpjackCenter:
case PumpjackCenter pumpjackCenter:
entities.Add(new Entity
{
EntityNumber = nextEntityNumber++,
Direction = context.CenterToTerminals[location].Single().Direction,
Direction = pumpjackCenter.Direction,
Name = EntityNames.Vanilla.Pumpjack,
Position = position,
Items = context.Options.PumpjackModules,
Expand Down
6 changes: 5 additions & 1 deletion src/FactorioTools/OilField/Grid/PumpjackCenter.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
namespace Knapcode.FactorioTools.OilField;
using Knapcode.FactorioTools.Data;

namespace Knapcode.FactorioTools.OilField;

public class PumpjackCenter : GridEntity
{
public PumpjackCenter(int id) : base(id)
{
}

public Direction Direction { get; set; }

#if ENABLE_GRID_TOSTRING
public override string Label => "J";
#endif
Expand Down
2 changes: 2 additions & 0 deletions src/FactorioTools/OilField/Models/Context.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ public class Context
{
public required OilFieldOptions Options { get; set; }
public required Blueprint InputBlueprint { get; set; }
public required float DeltaX { get; set; }
public required float DeltaY { get; set; }
public required SquareGrid Grid { get; set; }
public required List<Location> Centers { get; set; }
public required ILocationDictionary<List<TerminalLocation>> CenterToTerminals { get; set; }
Expand Down
5 changes: 3 additions & 2 deletions src/FactorioTools/OilField/Steps/AddPipeEntities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@ public static void Execute(

for (int i = 0; i < terminals.Count; i++)
{
if (addedPipes.Add(terminals[i].Terminal))
var terminal = terminals[i];
if (addedPipes.Add(terminal.Terminal))
{
grid.AddEntity(terminals[i].Terminal, new Terminal(grid.GetId()));
grid.AddEntity(terminal.Terminal, new Terminal(grid.GetId()));
}
}
}
Expand Down
11 changes: 11 additions & 0 deletions src/FactorioTools/OilField/Steps/AddPipes.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,17 @@ public static (List<OilFieldPlan> SelectedPlans, List<OilFieldPlan> AlternatePla

AddPipeEntities.Execute(context, bestSolution.Pipes, bestSolution.UndergroundPipes);

foreach (var (center, terminals) in context.CenterToTerminals.EnumeratePairs())
{
var centerEntity = context.Grid[center] as PumpjackCenter;
if (centerEntity is null)
{
throw new FactorioToolsException("A pumpjack center entity was not at the expected location.");
}

centerEntity.Direction = terminals[0].Direction;
}

if (bestBeacons is not null)
{
// Visualizer.Show(context.Grid, bestSolution.Beacons.Select(c => (DelaunatorSharp.IPoint)new DelaunatorSharp.Point(c.X, c.Y)), Array.Empty<DelaunatorSharp.IEdge>());
Expand Down
15 changes: 10 additions & 5 deletions src/FactorioTools/OilField/Steps/InitializeContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public static Context GetEmpty(OilFieldOptions options, int width, int height)

private static Context Execute(OilFieldOptions options, Blueprint blueprint, int marginX, int marginY)
{
var centerAndOriginalDirections = GetCenterAndOriginalDirections(blueprint, marginX, marginY);
var (centerAndOriginalDirections, deltaX, deltaY) = GetCenterOriginalDirectionsAndDelta(blueprint, marginX, marginY);

var grid = InitializeGrid(centerAndOriginalDirections, marginX, marginY);

Expand Down Expand Up @@ -86,6 +86,8 @@ private static Context Execute(OilFieldOptions options, Blueprint blueprint, int
{
Options = options,
InputBlueprint = blueprint,
DeltaX = deltaX,
DeltaY = deltaY,
Grid = grid,
Centers = centers,
CenterToTerminals = centerToTerminals,
Expand Down Expand Up @@ -146,7 +148,7 @@ private static int[] GetLocationToAdjacentCount(SquareGrid grid)
return locationToHasAdjacentPumpjack;
}

private static List<Tuple<Location, Direction>> GetCenterAndOriginalDirections(Blueprint blueprint, int marginX, int marginY)
private static Tuple<List<Tuple<Location, Direction>>, float, float> GetCenterOriginalDirectionsAndDelta(Blueprint blueprint, int marginX, int marginY)
{
var pumpjacks = new List<Entity>();
for (var i = 0; i < blueprint.Entities.Length; i++)
Expand All @@ -166,10 +168,13 @@ private static List<Tuple<Location, Direction>> GetCenterAndOriginalDirections(B

var centerAndOriginalDirections = new List<Tuple<Location, Direction>>();

float deltaX = 0;
float deltaY = 0;

if (pumpjacks.Count > 0)
{
var deltaX = 0 - pumpjacks.Min(x => x.Position.X) + marginX;
var deltaY = 0 - pumpjacks.Min(x => x.Position.Y) + marginY;
deltaX = 0 - pumpjacks.Min(x => x.Position.X) + marginX;
deltaY = 0 - pumpjacks.Min(x => x.Position.Y) + marginY;
foreach (var entity in pumpjacks)
{
var x = entity.Position.X + deltaX;
Expand All @@ -191,7 +196,7 @@ private static List<Tuple<Location, Direction>> GetCenterAndOriginalDirections(B
}
}

return centerAndOriginalDirections;
return Tuple.Create(centerAndOriginalDirections, deltaX, deltaY);
}

private static int ToInt(float x)
Expand Down
35 changes: 34 additions & 1 deletion test/FactorioTools.Test/OilField/PlannerFacts.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
namespace Knapcode.FactorioTools.OilField;
using Knapcode.FactorioTools.Data;
using NuGet.Frameworks;

namespace Knapcode.FactorioTools.OilField;

public class PlannerFacts : BasePlannerFacts
{
Expand Down Expand Up @@ -75,6 +78,36 @@ public async Task ExecuteSample()
#endif
}

[Fact]
public void SetsPumpjackCenterDirection()
{
var (context, _) = Planner.ExecuteSample();

var centers = context
.Grid
.EntityLocations
.EnumerateItems()
.Select(l => (Location: l, Entity: (context.Grid[l] as PumpjackCenter)!))
.Where(l => l.Entity is not null)
.OrderBy(x => x.Location.Y)
.ThenBy(x => x.Location.X)
.ToList();
Assert.Equal(4, centers.Count);
Assert.Equal(Direction.Down, centers[0].Entity.Direction);
Assert.Equal(Direction.Left, centers[1].Entity.Direction);
Assert.Equal(Direction.Up, centers[2].Entity.Direction);
Assert.Equal(Direction.Right, centers[3].Entity.Direction);
}

[Fact]
public void SetsDeltasFromOriginalPositions()
{
var (context, _) = Planner.ExecuteSample();

Assert.Equal(21, context.DeltaX);
Assert.Equal(18, context.DeltaY);
}

[Fact]
public void CountsAllRotatedPumpjacks()
{
Expand Down

0 comments on commit d9be82a

Please sign in to comment.