diff --git a/src/Test.java b/src/Test.java index d338549..085e437 100644 --- a/src/Test.java +++ b/src/Test.java @@ -1,10 +1,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import items.Database; -import items.Item; -import items.Recipe; -import items.Utils; +import items.*; import org.jgrapht.Graph; import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.EdgeReversedGraph; @@ -66,12 +63,22 @@ public class Test { System.out.println("\nSUM_reif"); Database.ReinforcedIronPlate.getRecipe().sum(Database.ReinforcedIronPlate, 100); System.out.println("\nSUM_screw"); - Database.Screw.getRecipe().sum(Database.Screw, 100); + plot2(Database.Screw.getRecipe().sum(Database.Screw, 100), "screw_sum"); System.out.println("\nSUM_ACU"); - Database.AdaptiveControlUnit.getRecipe().sum(Database.AdaptiveControlUnit, 100); + plot2(Database.AdaptiveControlUnit.getRecipe().sum(Database.AdaptiveControlUnit, 1), "acu4"); } + private static void plot2(Graph sum, String filename) { + DOTExporter de = new DOTExporter<>(Item::ID); + de.setEdgeAttributeProvider(productionEdge -> { + Map m = new HashMap<>(); + m.put("label", DefaultAttribute.createAttribute(productionEdge.label())); + return m; + }); + de.exportGraph(sum, new File(filename+".dot")); + } + private static void plot(Item target, String name, int amount, DOTExporter de) { Graph screws = target.productionHierarchy(amount); de.exportGraph(screws, new File(name + ".dot")); diff --git a/src/buildings/Building.java b/src/buildings/Building.java new file mode 100644 index 0000000..dafc823 --- /dev/null +++ b/src/buildings/Building.java @@ -0,0 +1,4 @@ +package buildings; + +public abstract class Building { +} diff --git a/src/buildings/production/Assembler.java b/src/buildings/production/Assembler.java new file mode 100644 index 0000000..077a16d --- /dev/null +++ b/src/buildings/production/Assembler.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Assembler extends Building { +} diff --git a/src/buildings/production/Constructor.java b/src/buildings/production/Constructor.java new file mode 100644 index 0000000..5079244 --- /dev/null +++ b/src/buildings/production/Constructor.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Constructor extends Building { +} diff --git a/src/buildings/production/CraftBench.java b/src/buildings/production/CraftBench.java new file mode 100644 index 0000000..974cede --- /dev/null +++ b/src/buildings/production/CraftBench.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class CraftBench extends Building { +} diff --git a/src/buildings/production/EquipmentWorkshop.java b/src/buildings/production/EquipmentWorkshop.java new file mode 100644 index 0000000..1eaaab6 --- /dev/null +++ b/src/buildings/production/EquipmentWorkshop.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class EquipmentWorkshop extends Building { +} diff --git a/src/buildings/production/Foundry.java b/src/buildings/production/Foundry.java new file mode 100644 index 0000000..61f7463 --- /dev/null +++ b/src/buildings/production/Foundry.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Foundry extends Building { +} diff --git a/src/buildings/production/Manufacturer.java b/src/buildings/production/Manufacturer.java new file mode 100644 index 0000000..907e82d --- /dev/null +++ b/src/buildings/production/Manufacturer.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Manufacturer extends Building { +} diff --git a/src/buildings/production/Miner.java b/src/buildings/production/Miner.java new file mode 100644 index 0000000..7f04e94 --- /dev/null +++ b/src/buildings/production/Miner.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Miner extends Building { +} diff --git a/src/buildings/production/OilExtractor.java b/src/buildings/production/OilExtractor.java new file mode 100644 index 0000000..93c6259 --- /dev/null +++ b/src/buildings/production/OilExtractor.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class OilExtractor extends Building { +} diff --git a/src/buildings/production/Packager.java b/src/buildings/production/Packager.java new file mode 100644 index 0000000..d7d0ffb --- /dev/null +++ b/src/buildings/production/Packager.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Packager extends Building { +} diff --git a/src/buildings/production/Refinery.java b/src/buildings/production/Refinery.java new file mode 100644 index 0000000..eb51db2 --- /dev/null +++ b/src/buildings/production/Refinery.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Refinery extends Building { +} diff --git a/src/buildings/production/Smelter.java b/src/buildings/production/Smelter.java new file mode 100644 index 0000000..e0ac198 --- /dev/null +++ b/src/buildings/production/Smelter.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class Smelter extends Building { +} diff --git a/src/buildings/production/WaterExtractor.java b/src/buildings/production/WaterExtractor.java new file mode 100644 index 0000000..9d1743f --- /dev/null +++ b/src/buildings/production/WaterExtractor.java @@ -0,0 +1,6 @@ +package buildings.production; + +import buildings.Building; + +public class WaterExtractor extends Building { +} diff --git a/src/items/Database.java b/src/items/Database.java index bfe8344..d88d0cb 100644 --- a/src/items/Database.java +++ b/src/items/Database.java @@ -308,7 +308,7 @@ public class Database { recipe.addInput(CircuitBoard, 10); recipe.addInput(HeavyModularFrame, 2); recipe.addInput(Computer, 2); - AdaptiveControlUnit.add(recipe); + AdaptiveControlUnit.add(recipe, 2); } { // Nobelisk diff --git a/src/items/Item.java b/src/items/Item.java index 6a52e91..a960173 100644 --- a/src/items/Item.java +++ b/src/items/Item.java @@ -118,4 +118,8 @@ public abstract class Item { public Graph hierarchy(){ return getRecipe().buildGraph(this); } + + public String ID(){ + return getName().replace(" ",""); + } } diff --git a/src/items/ProductionEdge.java b/src/items/ProductionEdge.java new file mode 100644 index 0000000..fa99ee7 --- /dev/null +++ b/src/items/ProductionEdge.java @@ -0,0 +1,41 @@ +package items; + +import java.util.Objects; + +public class ProductionEdge { + private Item source; + private double totalRequired; + private double instances; + + public ProductionEdge(Item source,double totalRequired, double productionRate) { + this.source=source; + this.totalRequired = totalRequired; + this.instances = productionRate; + } + public String label(){ + //return "(" + totalRequired + "||" + instances + ")"; + return "(%.2f||%.2f)".formatted(totalRequired,instances); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ProductionEdge that = (ProductionEdge) o; + return Double.compare(that.totalRequired, totalRequired) == 0 && instances == that.instances && Objects.equals(source, that.source); + } + + @Override + public int hashCode() { + return Objects.hash(source, totalRequired, instances); + } + + @Override + public String toString() { + return "ProductionEdge{" + + "totalRequired=" + totalRequired + + ", instances=" + instances + + '}'; + } + +} diff --git a/src/items/Recipe.java b/src/items/Recipe.java index 8da86aa..e09e678 100644 --- a/src/items/Recipe.java +++ b/src/items/Recipe.java @@ -97,7 +97,7 @@ public class Recipe { public float getProductionRate(Item item) { float production = outputs.get(item); - return production / duration; + return (float) (production / (duration / 60.0)); } public Map getRequirementRates(Item item) { @@ -177,12 +177,21 @@ public class Recipe { return graph; } - public Map sum(Item target, int prodPerMinute) { + + private double processesNeeded(Item target, double n) { + Recipe r = target.getRecipe(); + return n / r.getProductionRate(target); + } + + public Graph sum(Item target, int prodPerMinute) { Graph buildGraph = buildGraph(target); + Graph production = new DefaultDirectedWeightedGraph<>(ProductionEdge.class); Map map = new HashMap<>(); Queue queue = new LinkedList<>(); queue.add(target); map.put(target, (double) prodPerMinute); + production.addVertex(target); + production.addEdge(target, target, new ProductionEdge(target, prodPerMinute, processesNeeded(target, prodPerMinute))); while (!queue.isEmpty()) { Item item = queue.remove(); // next items @@ -204,6 +213,10 @@ public class Recipe { double requiredProcesRuns = productWantedPerMinute / productPerProcess; double requiredInput = amountNeeded * requiredProcesRuns; sum += requiredInput; + + production.addVertex(item); + production.addEdge(item, product, new ProductionEdge(item, requiredInput, processesNeeded(item, requiredInput))); + } if (!map.containsKey(item) && sum > 0) { map.put(item, sum); @@ -212,6 +225,6 @@ public class Recipe { map.forEach((item, aDouble) -> { System.out.println(item.getName() + ": " + aDouble); }); - return map; + return production; } } diff --git a/src/test/java/items/ItemTest.java b/src/test/java/items/ItemTest.java index 5e28660..a4411a7 100644 --- a/src/test/java/items/ItemTest.java +++ b/src/test/java/items/ItemTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; class ItemTest { @@ -19,11 +20,14 @@ class ItemTest { @Test void productionScrews2() { - Map production = Database.Screw.getRecipe().sum(Database.Screw, 100); + /*Map production = Database.Screw.getRecipe().sum(Database.Screw, 100); assertEquals(100, production.get(Database.Screw), "Screws (output)"); assertEquals(25, production.get(Database.IronRod), "IronRod"); assertEquals(25, production.get(Database.IronIngot), "IronIngot"); assertEquals(25, production.get(Database.IronOre), "IronOre"); + + */ + fail("TODO: migrate"); } @Test @@ -36,4 +40,10 @@ class ItemTest { assertEquals(1200, production.get(Database.IronOre), "IronOre"); assertEquals(600, production.get(Database.IronPlate), "IronPlate"); } + + @Test + void testScrewProd(){ + float productionRate = Database.Screw.getRecipe().getProductionRate(Database.Screw); + assertEquals(40, productionRate); + } } \ No newline at end of file