From d9be82afd2248543568ff3408c75a2764cb0cf96 Mon Sep 17 00:00:00 2001 From: Joel Verhagen Date: Mon, 15 Jan 2024 15:22:33 -0500 Subject: [PATCH] Add DeltaX/Y to calculate original positions and pumpjack direction --- .../OilField/Steps/GridToBlueprintString.cs | 4 +-- .../OilField/Grid/PumpjackCenter.cs | 6 +++- src/FactorioTools/OilField/Models/Context.cs | 2 ++ .../OilField/Steps/AddPipeEntities.cs | 5 +-- .../OilField/Steps/AddPipes.0.cs | 11 ++++++ .../OilField/Steps/InitializeContext.cs | 15 +++++--- .../OilField/PlannerFacts.cs | 35 ++++++++++++++++++- 7 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/FactorioTools.Serialization/OilField/Steps/GridToBlueprintString.cs b/src/FactorioTools.Serialization/OilField/Steps/GridToBlueprintString.cs index 838e41ff..d8054433 100644 --- a/src/FactorioTools.Serialization/OilField/Steps/GridToBlueprintString.cs +++ b/src/FactorioTools.Serialization/OilField/Steps/GridToBlueprintString.cs @@ -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, diff --git a/src/FactorioTools/OilField/Grid/PumpjackCenter.cs b/src/FactorioTools/OilField/Grid/PumpjackCenter.cs index 52fc6ddc..e686562a 100644 --- a/src/FactorioTools/OilField/Grid/PumpjackCenter.cs +++ b/src/FactorioTools/OilField/Grid/PumpjackCenter.cs @@ -1,4 +1,6 @@ -namespace Knapcode.FactorioTools.OilField; +using Knapcode.FactorioTools.Data; + +namespace Knapcode.FactorioTools.OilField; public class PumpjackCenter : GridEntity { @@ -6,6 +8,8 @@ public PumpjackCenter(int id) : base(id) { } + public Direction Direction { get; set; } + #if ENABLE_GRID_TOSTRING public override string Label => "J"; #endif diff --git a/src/FactorioTools/OilField/Models/Context.cs b/src/FactorioTools/OilField/Models/Context.cs index b9181dd1..41a6f1d9 100644 --- a/src/FactorioTools/OilField/Models/Context.cs +++ b/src/FactorioTools/OilField/Models/Context.cs @@ -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 Centers { get; set; } public required ILocationDictionary> CenterToTerminals { get; set; } diff --git a/src/FactorioTools/OilField/Steps/AddPipeEntities.cs b/src/FactorioTools/OilField/Steps/AddPipeEntities.cs index dafa5b0f..39774bbd 100644 --- a/src/FactorioTools/OilField/Steps/AddPipeEntities.cs +++ b/src/FactorioTools/OilField/Steps/AddPipeEntities.cs @@ -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())); } } } diff --git a/src/FactorioTools/OilField/Steps/AddPipes.0.cs b/src/FactorioTools/OilField/Steps/AddPipes.0.cs index 92be2c66..5baa3946 100644 --- a/src/FactorioTools/OilField/Steps/AddPipes.0.cs +++ b/src/FactorioTools/OilField/Steps/AddPipes.0.cs @@ -37,6 +37,17 @@ public static (List SelectedPlans, List 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()); diff --git a/src/FactorioTools/OilField/Steps/InitializeContext.cs b/src/FactorioTools/OilField/Steps/InitializeContext.cs index 3ca2e496..9fd81149 100644 --- a/src/FactorioTools/OilField/Steps/InitializeContext.cs +++ b/src/FactorioTools/OilField/Steps/InitializeContext.cs @@ -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); @@ -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, @@ -146,7 +148,7 @@ private static int[] GetLocationToAdjacentCount(SquareGrid grid) return locationToHasAdjacentPumpjack; } - private static List> GetCenterAndOriginalDirections(Blueprint blueprint, int marginX, int marginY) + private static Tuple>, float, float> GetCenterOriginalDirectionsAndDelta(Blueprint blueprint, int marginX, int marginY) { var pumpjacks = new List(); for (var i = 0; i < blueprint.Entities.Length; i++) @@ -166,10 +168,13 @@ private static List> GetCenterAndOriginalDirections(B var centerAndOriginalDirections = new List>(); + 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; @@ -191,7 +196,7 @@ private static List> GetCenterAndOriginalDirections(B } } - return centerAndOriginalDirections; + return Tuple.Create(centerAndOriginalDirections, deltaX, deltaY); } private static int ToInt(float x) diff --git a/test/FactorioTools.Test/OilField/PlannerFacts.cs b/test/FactorioTools.Test/OilField/PlannerFacts.cs index e4e57314..cd2fd509 100644 --- a/test/FactorioTools.Test/OilField/PlannerFacts.cs +++ b/test/FactorioTools.Test/OilField/PlannerFacts.cs @@ -1,4 +1,7 @@ -namespace Knapcode.FactorioTools.OilField; +using Knapcode.FactorioTools.Data; +using NuGet.Frameworks; + +namespace Knapcode.FactorioTools.OilField; public class PlannerFacts : BasePlannerFacts { @@ -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() {