diff --git a/src/main/java/satisfactory/Test.java b/src/main/java/satisfactory/Test.java index 0aa5a09..550360a 100644 --- a/src/main/java/satisfactory/Test.java +++ b/src/main/java/satisfactory/Test.java @@ -1,26 +1,11 @@ package satisfactory; import com.fasterxml.jackson.core.JsonProcessingException; -import guru.nidi.graphviz.engine.Format; -import guru.nidi.graphviz.engine.Graphviz; -import guru.nidi.graphviz.model.MutableGraph; -import guru.nidi.graphviz.parse.Parser; -import org.jgrapht.Graph; -import org.jgrapht.graph.DefaultWeightedEdge; -import org.jgrapht.nio.Attribute; -import org.jgrapht.nio.DefaultAttribute; -import org.jgrapht.nio.dot.DOTExporter; import satisfactory.items.Item; import satisfactory.items.Production; import satisfactory.items.Recipe; import satisfactory.items.SumResult; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -120,7 +105,7 @@ public class Test { planFor(Database.AlcladAluminumSheet, 100, "alclad"); - // planFor(Database.UraniumFuelRod, 1, "fuelrod"); + // planFor(Database.UraniumFuelRod, 1, "fuelrod"); planFor(Database.FusedModularFrame, 100, "fusedFrame"); planFor(Database.SteelIngot, 100, "steelIngot"); @@ -162,64 +147,6 @@ public class Test { list(plan, name); } - private static void plot(Item target, String name, int amount) { - Graph screws = target.hierarchy(); - DOTExporter de = new DOTExporter<>(Utils::dotID); - de.setEdgeAttributeProvider(defaultWeightedEdge -> { - Map m = new HashMap<>(); - m.put("label", DefaultAttribute.createAttribute(screws.getEdgeWeight(defaultWeightedEdge))); - return m; - }); - de.exportGraph(screws, new File(PLOTS + name + ".dot")); - System.out.println(name); - Item.production(screws).forEach((item, rate) -> { - System.out.println("\t" + item.getName() + "\t" + rate); - }); - } - - private static void javaPlot(String name) { - try { - MutableGraph dot = new Parser().read(new File(PLOTS + name + ".dot")); - Graphviz.fromGraph(dot).render(Format.PNG).toFile(new File(PLOTS + name + "_java.png")); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static String name2(String name3) { - return Arrays.stream(Database.class.getFields()).filter(field -> { - try { - return field.getType().equals(Item.class) && ((Item) field.get(null)).getName().equals(name3); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - }).findFirst().get().getName(); - } - - - private static void list(SumResult plan, String name) { - try (BufferedWriter bw = new BufferedWriter(new FileWriter(LISTS + name + ".txt"))) { - String list = plan.getMap().entrySet().stream().map(item -> item.getKey().getName() + ": " + item.getValue()).reduce("", (s, s2) -> s + "\n" + s2); - bw.write(list); - } catch (IOException e) { - throw new RuntimeException(e); - } - try (BufferedWriter bw = new BufferedWriter(new FileWriter(LISTS + name + "_java.txt"))) { - String list = plan.getMap().entrySet().stream().map(item -> - "ref.put(Database." + name2(item.getKey().getName()) + ", " + item.getValue() + ");" - ).reduce("", (s, s2) -> s + "\n" + s2); - bw.write(list); - } catch (IOException e) { - throw new RuntimeException(e); - } - try (BufferedWriter bw = new BufferedWriter(new FileWriter(LISTS + name + "_buildings.txt"))) { - String list = SumResult.format(plan.getBuildings()); - bw.write(list); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public static Set unlocks(String... unlock) { return Set.of(unlock); } diff --git a/src/main/java/satisfactory/Utils.java b/src/main/java/satisfactory/Utils.java index 3328076..b582734 100644 --- a/src/main/java/satisfactory/Utils.java +++ b/src/main/java/satisfactory/Utils.java @@ -1,5 +1,9 @@ package satisfactory; +import guru.nidi.graphviz.engine.Format; +import guru.nidi.graphviz.engine.Graphviz; +import guru.nidi.graphviz.model.MutableGraph; +import guru.nidi.graphviz.parse.Parser; import org.jgrapht.Graph; import org.jgrapht.event.ConnectedComponentTraversalEvent; import org.jgrapht.event.EdgeTraversalEvent; @@ -14,8 +18,13 @@ import org.jgrapht.traverse.DepthFirstIterator; import org.jgrapht.traverse.GraphIterator; import satisfactory.items.Item; import satisfactory.items.ProductionEdge; +import satisfactory.items.SumResult; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -105,4 +114,60 @@ public class Utils { de.exportGraph(sum, new File(PLOTS + filename + ".dot")); } + public static void plot(Item target, String name, int amount) { + Graph screws = target.hierarchy(); + DOTExporter de = new DOTExporter<>(Utils::dotID); + de.setEdgeAttributeProvider(defaultWeightedEdge -> { + Map m = new HashMap<>(); + m.put("label", DefaultAttribute.createAttribute(screws.getEdgeWeight(defaultWeightedEdge))); + return m; + }); + de.exportGraph(screws, new File(PLOTS + name + ".dot")); + System.out.println(name); + Item.production(screws).forEach((item, rate) -> { + System.out.println("\t" + item.getName() + "\t" + rate); + }); + } + + public static void javaPlot(String name) { + try { + MutableGraph dot = new Parser().read(new File(PLOTS + name + ".dot")); + Graphviz.fromGraph(dot).render(Format.PNG).toFile(new File(PLOTS + name + "_java.png")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static String reflectionFieldName(String name3) { + return Arrays.stream(Database.class.getFields()).filter(field -> { + try { + return field.getType().equals(Item.class) && ((Item) field.get(null)).getName().equals(name3); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }).findFirst().get().getName(); + } + + + public static void list(SumResult plan, String name) { + try (BufferedWriter bw = new BufferedWriter(new FileWriter(LISTS + name + ".txt"))) { + String list = plan.getMap().entrySet().stream().map(item -> item.getKey().getName() + ": " + item.getValue()).reduce("", (s, s2) -> s + "\n" + s2); + bw.write(list); + } catch (IOException e) { + throw new RuntimeException(e); + } + try (BufferedWriter bw = new BufferedWriter(new FileWriter(LISTS + name + "_java.txt"))) { + String list = plan.getMap().entrySet().stream().map(item -> "ref.put(Database." + reflectionFieldName(item.getKey().getName()) + ", " + item.getValue() + ");").reduce("", (s, s2) -> s + "\n" + s2); + bw.write(list); + } catch (IOException e) { + throw new RuntimeException(e); + } + try (BufferedWriter bw = new BufferedWriter(new FileWriter(LISTS + name + "_buildings.txt"))) { + String list = SumResult.format(plan.getBuildings()); + bw.write(list); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } diff --git a/src/main/java/satisfactory/buildings/Building.java b/src/main/java/satisfactory/buildings/Building.java index 819f591..9f067c6 100644 --- a/src/main/java/satisfactory/buildings/Building.java +++ b/src/main/java/satisfactory/buildings/Building.java @@ -18,4 +18,19 @@ public abstract class Building { public String getName() { return name; } + + public Map getCost() { + return cost; + } + + public Map getCost(int n) { + Map instances = new HashMap<>(); + cost.forEach((item, integer) -> instances.put(item, n * integer)); + return instances; + } + + public Integer getPower() { + return power; + } + } diff --git a/src/main/java/satisfactory/items/SumResult.java b/src/main/java/satisfactory/items/SumResult.java index 53021eb..1fc5a95 100644 --- a/src/main/java/satisfactory/items/SumResult.java +++ b/src/main/java/satisfactory/items/SumResult.java @@ -4,10 +4,7 @@ import org.jgrapht.Graph; import org.jgrapht.graph.DefaultDirectedWeightedGraph; import satisfactory.buildings.Building; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class SumResult { private final Graph production; @@ -78,7 +75,7 @@ public class SumResult { return new SumResult(merge(production, other.getProduction()), map); } - public Map< Building, Map> getBuildings() { + public Map> getBuildings() { Map> buildings = new HashMap<>(); for (Item item : production.vertexSet()) { double n = 0.0; @@ -95,17 +92,37 @@ public class SumResult { return buildings; } - public static String format(Map< Building, Map> buildings){ + public static String format(Map> buildings) { StringBuilder sb = new StringBuilder(); - for (Map.Entry< Building, Map> entry : buildings.entrySet()) { + int total_sum = 0; + int total_power = 0; + Map total_cost = new HashMap<>(); + for (Map.Entry> entry : buildings.entrySet()) { double sum = 0.0; StringBuilder internal = new StringBuilder(); for (Map.Entry recipes : entry.getValue().entrySet()) { sum += Math.ceil(recipes.getValue()); internal.append("\t").append(recipes.getKey().formatName()).append("\t").append(recipes.getValue()).append("\n"); } - sb.append(entry.getKey().getName()). append("\t"). append(sum).append("\n").append(internal); + Map cost = entry.getKey().getCost((int) sum); + Integer power = entry.getKey().getPower() * (int) sum; + sb.append(entry.getKey().getName()).append("\tx").append((int) sum).append("\t => ").append(formatRequirements(cost, power)).append("\n").append(internal); + total_sum += (int) sum; + cost.forEach((item, integer) -> total_cost.merge(item, integer, Integer::sum)); + total_power += power; } + sb.append("\n=================\nTOTAL\n\n").append(total_sum).append(" buildings, consuming ").append(total_power).append(" MW\n\n"); + total_cost.forEach((item, integer) -> sb.append(integer).append("\t").append(item.getName()).append("\n")); + return sb.toString(); + } + + + public static String formatRequirements(Map cost, int power) { + StringBuilder sb = new StringBuilder(); + sb.append(power).append(" Power; "); + StringJoiner sj = new StringJoiner(", "); + cost.forEach((item, integer) -> sj.add((integer) + " " + item.getName())); + sb.append(sj); return sb.toString(); } } diff --git a/src/test/java/satisfactory/items/ItemTest.java b/src/test/java/satisfactory/items/ItemTest.java index fb2bea0..6e65898 100644 --- a/src/test/java/satisfactory/items/ItemTest.java +++ b/src/test/java/satisfactory/items/ItemTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import satisfactory.Database; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import static satisfactory.items.TestHelper.test; class ItemTest { @@ -35,7 +36,7 @@ class ItemTest { @Test void productionEncasedIndustrialBeam() { - test(Database.EncasedIndustrialBeam); + test(Database.EncasedIndustrialBeam,"enc_beam"); } @Test @@ -44,4 +45,10 @@ class ItemTest { assertEquals(40, productionRate); } + @Test + void productionUraniumFuelRod(){ + //test(Database.UraniumFuelRod, "uranium_fuel_rod"); + fail(); + } + } \ No newline at end of file diff --git a/src/test/java/satisfactory/items/TestHelper.java b/src/test/java/satisfactory/items/TestHelper.java index a59111d..d7f87b7 100644 --- a/src/test/java/satisfactory/items/TestHelper.java +++ b/src/test/java/satisfactory/items/TestHelper.java @@ -7,6 +7,7 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static satisfactory.Utils.*; public class TestHelper { @@ -21,12 +22,25 @@ public class TestHelper { public static void test(Item item) { Map ref = ValidatedValues.get(item); - - // calculate - Map calculations = SumResult.sum(new Production(item, 1)).getMap(); + Map calculations = calculate(item).getMap(); assertMap(ref, calculations); } + public static void test(Item item, String name) { + name = "test_" + name; + Map ref = ValidatedValues.get(item); + SumResult calculations = calculate(item); + assertMap(ref, calculations.getMap()); + plot2(calculations.getProduction(), name); + javaPlot(name); + list(calculations, name); + } + + private static SumResult calculate(Item item) { + // calculate + return SumResult.sum(new Production(item, 1)); + } + public static Map merge(Map... single_refs) { Map ref = new HashMap<>(); for (Map singleRef : single_refs) { diff --git a/src/test/java/satisfactory/items/ValidatedValues.java b/src/test/java/satisfactory/items/ValidatedValues.java index 61e0157..6f979c6 100644 --- a/src/test/java/satisfactory/items/ValidatedValues.java +++ b/src/test/java/satisfactory/items/ValidatedValues.java @@ -13,6 +13,7 @@ public class ValidatedValues { values.put(Database.AdaptiveControlUnit, ACU()); values.put(Database.ModularEngine, ME()); values.put(Database.VersatileFrameWork, VF()); + values.put(Database.UraniumFuelRod, UFR()); { Item item = Database.Screw; Map ref = new HashMap<>(); @@ -160,4 +161,34 @@ public class ValidatedValues { return ref; } + private static Map UFR(){ + // references, validated + Map ref = new HashMap<>(); + ref.put(Database.Limestone ,135.); + ref.put(Database.Uranium ,100.); + ref.put(Database.Quickwire ,100.); + ref.put(Database.SteelIngot ,81.75); + ref.put(Database.IronOre ,81.75); + ref.put(Database.Coal ,81.75); + ref.put(Database.SulfuricAcid ,80.); + ref.put(Database.CopperIngot ,80.); + ref.put(Database.CopperOre ,80.); + ref.put(Database.Wire ,60.); + ref.put(Database.CateriumOre ,60.); + //ref.put(Database.Sulfur ,60.); + //ref.put(Database.Water ,60.); + ref.put(Database.EncasedUraniumCell ,50.); + ref.put(Database.Concrete ,45.); + ref.put(Database.CopperSheet ,25.); + ref.put(Database.SteelPipe ,22.5); + ref.put(Database.CateriumIngot ,20.); + ref.put(Database.SteelBeam ,12.); + ref.put(Database.Stator ,7.5); + ref.put(Database.ElectromagneticControlRod ,5.); + ref.put(Database.AILimiter ,5.); + ref.put(Database.EncasedIndustrialBeam ,3.); + ref.put(Database.UraniumFuelRod ,1.); + return ref; + } + }