diff --git a/.gitignore b/.gitignore index 1f6bf52..e959451 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ out/ build/ .gradle/ +plots/ diff --git a/build.gradle b/build.gradle index dabf1d7..8d49ef2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,27 +1,22 @@ plugins { id 'java' } + group 'de.clkl.satisfactory' -version '1.0-snapshot' +version '1.0-SNAPSHOT' repositories { mavenCentral() } -sourceSets { - main { - java { - srcDirs = ['src'] - } - } + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + implementation 'com.fasterxml.jackson.core:jackson-core:2.12.2' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.2' + implementation 'org.jgrapht:jgrapht-io:1.5.1' } test { useJUnitPlatform() -} - -dependencies{ - implementation 'org.junit.jupiter:junit-jupiter:5.7.0' - compile 'com.fasterxml.jackson.core:jackson-core:2.12.2' - compile 'com.fasterxml.jackson.core:jackson-databind:2.12.2' - compile 'org.jgrapht:jgrapht-io:1.5.1' } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index be52383..f371643 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plots/.gitkeep b/plots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/satisfactory.iml b/satisfactory.iml deleted file mode 100644 index 533a03b..0000000 --- a/satisfactory.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..cb2ee81 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'satisfactory' + diff --git a/src/main/satisfactory/Database.java b/src/main/java/satisfactory/Database.java similarity index 83% rename from src/main/satisfactory/Database.java rename to src/main/java/satisfactory/Database.java index 309a90d..ca51e8a 100644 --- a/src/main/satisfactory/Database.java +++ b/src/main/java/satisfactory/Database.java @@ -7,8 +7,8 @@ import satisfactory.items.type.*; import java.util.*; public class Database { - private static final Collection items = new HashSet<>(); - public static final Map preferences = new HashMap<>(); + private static final Collection items = new HashSet<>(); + public static final Map preferences = new HashMap<>(); // Items & recipes public static final Item IronOre = new Ore("Iron Ore"); @@ -78,10 +78,23 @@ public class Database { public static final Item LiquidBiofuel = new ProcessedFluid("Liquid Biofuel"); public static final Item PetroleumCoke = new Part("Petroleum Coke"); public static final Item PolymerResin = new Part("Polymer Resin"); + // TODO: verify below! + public static final Item AluminumIngot = new Part("Aluminum Ingot"); + public static final Item AlcladAluminumSheet = new Part("Alclad Aluminum Sheet"); + public static final Item AluminumCasing = new Part("Aluminum Casing"); + public static final Item RawQuartz = new Ore("Raw Quartz"); + public static final Item QuartzCristal = new Part("Quartz Cristal"); + public static final Item CrystalOscillator = new Part("Crystal Oscillator"); + public static final Item RadioControlUnit = new Part("Radio Control Unit"); + public static final Item AluminumScrap = new Part("Aluminum Scrap"); + public static final Item Silica = new Part("Silica"); + public static final Item Bauxite = new Ore("Bauxite"); + public static final Item AluminaSolution = new ProcessedFluid("Alumina Solution"); static { { Set ores = new HashSet<>(Arrays.asList(IronOre, Coal, Limestone, CopperOre, CateriumOre, Sulfur)); + ores.addAll(Arrays.asList(Bauxite, RawQuartz));// TODO: rly? for (Item ore : ores) { Recipe mk1 = new Recipe(1, "Miner MK 1", false); ore.add(mk1, 1); @@ -93,7 +106,10 @@ public class Database { Set rawFluids = new HashSet<>(Arrays.asList(CrudeOil, Water)); // no common well yet CrudeOil.add(new Recipe(1, "Oil extracting thingy", false), 2); - Water.add(new Recipe(1, "water pump thingy", false), 2); + //CrudeOil.setPreference(); + Recipe water = new Recipe(1, "water pump thingy", false); + Water.add(water, 2); + Water.setPreference(water); } { // Steel Ingot @@ -372,9 +388,6 @@ public class Database { Plastic.add(residualPlastic, 2); Plastic.setPreference(recipe); - - HeavyOilResidue.add(recipe); - HeavyOilResidue.setPreference(recipe); } { // Rubber @@ -388,8 +401,6 @@ public class Database { Rubber.add(residualRubber, 2); Rubber.setPreference(recipe); - - HeavyOilResidue.add(recipe); } { // Petroleum Coke @@ -397,13 +408,60 @@ public class Database { recipe.addInput(HeavyOilResidue, 4); PetroleumCoke.add(recipe, 12); } + // TODO: verify below! + { + Recipe recipe = new Recipe(6, AluminumIngot, 3); + recipe.addInput(CopperIngot, 1); + AlcladAluminumSheet.add(recipe, 3); + } + { + Recipe recipe = new Recipe(120, QuartzCristal, 36); + recipe.addInput(Cable, 28); + recipe.addInput(ReinforcedIronPlate, 5); + + CrystalOscillator.add(recipe, 2); + } + { + Recipe recipe = new Recipe(48, AluminumCasing, 32); + recipe.addInput(CrystalOscillator, 1); + recipe.addInput(Computer, 1); + + RadioControlUnit.add(recipe, 2); + } + { + Recipe recipe = new Recipe(2, AluminumIngot, 3); + AluminumCasing.add(recipe, 2); + } + { + Recipe recipe = new Recipe(8, RawQuartz, 5); + QuartzCristal.add(recipe, 3); + } + { + Recipe recipe = new Recipe(4, AluminumScrap, 6); + recipe.addInput(Silica, 5); + recipe.addOutput(AluminumIngot, 4); + } + { + Recipe recipe = new Recipe(6); + recipe.addInput(Bauxite, 12); + recipe.addInput(Water, 18); + recipe.addOutput(Silica, 5); + recipe.addOutput(AluminaSolution, 12); + } + { + Recipe recipe = new Recipe(1); + recipe.addInput(AluminaSolution, 4); + recipe.addInput(Coal, 2); + recipe.addOutput(AluminumScrap,6); + recipe.addOutput(Water,2); + } } - public static void add(Item i) { - items.add(i); - } + public static void add(Item i) { + items.add(i); + } - public static Collection getItems() { - return new HashSet<>(items); - } + public static Collection getItems() { + return new HashSet<>(items); + } } diff --git a/src/main/satisfactory/Test.java b/src/main/java/satisfactory/Test.java similarity index 74% rename from src/main/satisfactory/Test.java rename to src/main/java/satisfactory/Test.java index 1fb1434..b139876 100644 --- a/src/main/satisfactory/Test.java +++ b/src/main/java/satisfactory/Test.java @@ -1,25 +1,26 @@ package satisfactory; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import satisfactory.items.*; import org.jgrapht.Graph; import org.jgrapht.graph.DefaultWeightedEdge; -import org.jgrapht.graph.EdgeReversedGraph; 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.File; import java.util.HashMap; import java.util.Map; +import static satisfactory.Utils.PLOTS; import static satisfactory.Utils.plot2; public class Test { - public static void main(String[] args) throws JsonProcessingException { - //System.out.println(satisfactory.items.Database.AdaptiveControlUnit); + public static void main(String[] args) throws JsonProcessingException { + /* //System.out.println(satisfactory.items.Database.AdaptiveControlUnit); Map totalRequirements = Database.HeavyModularFrame.getRecipe().getTotalRequirements(); System.out.println(totalRequirements); @@ -91,15 +92,33 @@ public class Test { plot2(SumResult.sum(Database.Rubber, 75),"rubber"); System.out.println("\ntest"); SumResult.sum(Database.Plastic, 4); +*/ + Item a = Database.HeavyOilResidue; + Item b = Database.Water; + Map preferences = Database.preferences; + Recipe recipe = b.getRecipe(); + System.out.println(recipe); + //plot(Database.GasFilter, "rubber",1); + plot(Database.RadioControlUnit, "alu", 1); + Item i = Database.AluminumIngot; + //plot2(SumResult.sum(i, 1),"rubber_"); + //plot(i, "rcu_hierarchy",1); + SumResult s = SumResult.sum(new Production(Database.RadioControlUnit, 2)); + plot2(s.getProduction(), "rcu"); + } - } - - private static void plot(Item target, String name, int amount, DOTExporter de) { - Graph screws = target.productionHierarchy(amount); - de.exportGraph(screws, new File(name + ".dot")); - System.out.println(name); - Item.production(screws).forEach((item, rate) -> { - System.out.println("\t" + item.getName() + "\t" + rate); - }); - } + 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); + }); + } } diff --git a/src/main/satisfactory/Utils.java b/src/main/java/satisfactory/Utils.java similarity index 97% rename from src/main/satisfactory/Utils.java rename to src/main/java/satisfactory/Utils.java index 6e1b6e3..eff4154 100644 --- a/src/main/satisfactory/Utils.java +++ b/src/main/java/satisfactory/Utils.java @@ -24,6 +24,9 @@ import java.util.Map; import java.util.stream.Collectors; public class Utils { + + public static final String PLOTS = "plots/"; + public static Map getRawOnly(Map totals) { Map raws = new HashMap<>(); for (Item item : totals.keySet().stream().filter(Item::isRaw).collect(Collectors.toList())) { @@ -100,7 +103,7 @@ public class Utils { m.put("label", DefaultAttribute.createAttribute(item.getName())); return m; }); - de.exportGraph(sum, new File(filename + ".dot")); + de.exportGraph(sum, new File(PLOTS +filename + ".dot")); } } diff --git a/src/main/satisfactory/buildings/Building.java b/src/main/java/satisfactory/buildings/Building.java similarity index 100% rename from src/main/satisfactory/buildings/Building.java rename to src/main/java/satisfactory/buildings/Building.java diff --git a/src/main/satisfactory/buildings/production/Assembler.java b/src/main/java/satisfactory/buildings/production/Assembler.java similarity index 100% rename from src/main/satisfactory/buildings/production/Assembler.java rename to src/main/java/satisfactory/buildings/production/Assembler.java diff --git a/src/main/satisfactory/buildings/production/Constructor.java b/src/main/java/satisfactory/buildings/production/Constructor.java similarity index 100% rename from src/main/satisfactory/buildings/production/Constructor.java rename to src/main/java/satisfactory/buildings/production/Constructor.java diff --git a/src/main/satisfactory/buildings/production/CraftBench.java b/src/main/java/satisfactory/buildings/production/CraftBench.java similarity index 100% rename from src/main/satisfactory/buildings/production/CraftBench.java rename to src/main/java/satisfactory/buildings/production/CraftBench.java diff --git a/src/main/satisfactory/buildings/production/EquipmentWorkshop.java b/src/main/java/satisfactory/buildings/production/EquipmentWorkshop.java similarity index 100% rename from src/main/satisfactory/buildings/production/EquipmentWorkshop.java rename to src/main/java/satisfactory/buildings/production/EquipmentWorkshop.java diff --git a/src/main/satisfactory/buildings/production/Foundry.java b/src/main/java/satisfactory/buildings/production/Foundry.java similarity index 100% rename from src/main/satisfactory/buildings/production/Foundry.java rename to src/main/java/satisfactory/buildings/production/Foundry.java diff --git a/src/main/satisfactory/buildings/production/Manufacturer.java b/src/main/java/satisfactory/buildings/production/Manufacturer.java similarity index 100% rename from src/main/satisfactory/buildings/production/Manufacturer.java rename to src/main/java/satisfactory/buildings/production/Manufacturer.java diff --git a/src/main/satisfactory/buildings/production/Miner.java b/src/main/java/satisfactory/buildings/production/Miner.java similarity index 100% rename from src/main/satisfactory/buildings/production/Miner.java rename to src/main/java/satisfactory/buildings/production/Miner.java diff --git a/src/main/satisfactory/buildings/production/OilExtractor.java b/src/main/java/satisfactory/buildings/production/OilExtractor.java similarity index 100% rename from src/main/satisfactory/buildings/production/OilExtractor.java rename to src/main/java/satisfactory/buildings/production/OilExtractor.java diff --git a/src/main/satisfactory/buildings/production/Packager.java b/src/main/java/satisfactory/buildings/production/Packager.java similarity index 100% rename from src/main/satisfactory/buildings/production/Packager.java rename to src/main/java/satisfactory/buildings/production/Packager.java diff --git a/src/main/satisfactory/buildings/production/Refinery.java b/src/main/java/satisfactory/buildings/production/Refinery.java similarity index 100% rename from src/main/satisfactory/buildings/production/Refinery.java rename to src/main/java/satisfactory/buildings/production/Refinery.java diff --git a/src/main/satisfactory/buildings/production/Smelter.java b/src/main/java/satisfactory/buildings/production/Smelter.java similarity index 100% rename from src/main/satisfactory/buildings/production/Smelter.java rename to src/main/java/satisfactory/buildings/production/Smelter.java diff --git a/src/main/satisfactory/buildings/production/WaterExtractor.java b/src/main/java/satisfactory/buildings/production/WaterExtractor.java similarity index 100% rename from src/main/satisfactory/buildings/production/WaterExtractor.java rename to src/main/java/satisfactory/buildings/production/WaterExtractor.java diff --git a/src/main/java/satisfactory/items/Item.java b/src/main/java/satisfactory/items/Item.java new file mode 100644 index 0000000..35d3637 --- /dev/null +++ b/src/main/java/satisfactory/items/Item.java @@ -0,0 +1,108 @@ +package satisfactory.items; + +import org.jgrapht.Graph; +import org.jgrapht.graph.DefaultWeightedEdge; +import satisfactory.Database; + +import java.util.*; + + +public abstract class Item { + protected boolean isRaw = false; + private String name; + private Set recipes; + private Recipe preference = null; + public int sum = 0; + + protected Item(String name, Set recipes) { + this.name = name; + this.recipes = recipes; + Database.add(this); + for (Recipe recipe : recipes) { + add(recipe); + } + } + + public Item(String name, Recipe... recipes) { + this(name, new HashSet<>(Arrays.asList(recipes))); + } + + public Item(String name) { + this(name, new HashSet<>()); + } + + public void add(Recipe recipe) { + add(recipe, 1); + } + + public void add(Recipe recipe, int output) { + recipes.add(recipe); + recipe.checkOutput(this, output); + } + + public String getName() { + return name; + } + + public Set getRecipes() { + return recipes; + } + + public boolean isRaw() { + return isRaw; + } + + public float getProductionRate() { + Recipe recipe = getRecipe(); + if (recipe == null) { + return 0; + } + return recipe.getProductionRate(this); + } + + public Recipe getRecipe() { + Recipe recipe = Database.preferences.getOrDefault(this, preference); + if (recipe == null) { + recipe = recipes.stream().findFirst().orElse(null); + } + return recipe; + } + + protected void setIsRaw() { + isRaw = true; + } + + @Override + public String toString() { + return "Item{" + + "name='" + name + '\'' + + ", #recipes=" + recipes.size() + + '}'; + } + + public void setPreference(Recipe preference) { + this.preference = preference; + } + + public static Map production(Graph graph) { + Map map = new HashMap<>(); + graph.vertexSet().forEach(item -> { + double rate = graph.outgoingEdgesOf(item).stream().mapToDouble(graph::getEdgeWeight).sum(); + map.put(item, rate); + }); + return map; + } + + public Graph hierarchy() { + System.out.println(getRecipe() + " == " + this.preference); + return getRecipe().buildGraph(this); + } + + public String ID() { + return getName().replace(" ", ""); + } + + public Recipe getPreference() { + return preference; + } +} diff --git a/src/main/satisfactory/items/Production.java b/src/main/java/satisfactory/items/Production.java similarity index 100% rename from src/main/satisfactory/items/Production.java rename to src/main/java/satisfactory/items/Production.java diff --git a/src/main/satisfactory/items/ProductionEdge.java b/src/main/java/satisfactory/items/ProductionEdge.java similarity index 100% rename from src/main/satisfactory/items/ProductionEdge.java rename to src/main/java/satisfactory/items/ProductionEdge.java diff --git a/src/main/satisfactory/items/Recipe.java b/src/main/java/satisfactory/items/Recipe.java similarity index 81% rename from src/main/satisfactory/items/Recipe.java rename to src/main/java/satisfactory/items/Recipe.java index 3bdd0f2..0422311 100644 --- a/src/main/satisfactory/items/Recipe.java +++ b/src/main/java/satisfactory/items/Recipe.java @@ -74,6 +74,7 @@ public class Recipe { public void addOutput(Item item, int amount) { this.outputs.put(item, amount); + item.add(this, amount); } public void checkOutput(Item item, int amount) { @@ -107,6 +108,7 @@ public class Recipe { } public Graph buildGraph(Item target) { + System.out.println("buildGraph(" + target.getName() + ") @ "+ name); Graph graph = new DefaultDirectedWeightedGraph<>(DefaultWeightedEdge.class); graph.addVertex(target); target.sum += 1; @@ -124,57 +126,14 @@ public class Recipe { graph.setEdgeWeight(item, target, integer); Recipe recipe = item.getRecipe(); - if (recipe != null) { + if (recipe != null && item != target) { Graph g = recipe.buildGraph(item); Graphs.addGraph(graph, g); } }); - - return graph; } - private float getLoad(Item target, float amount) { - return getUsage(target, amount) * duration; - } - - private float getUsage(Item target, float amount) { - return amount / outputs.get(target); - } - - public Graph buildGraph(Item target, float amountPerSecond) { - Graph graph = new DefaultDirectedWeightedGraph<>(DefaultWeightedEdge.class); - graph.addVertex(target); - target.sum += 1; - float load = getLoad(target, amountPerSecond); - // byproducts - Map output = outputs.entrySet().stream() - .filter(itemIntegerEntry -> itemIntegerEntry.getKey() != target) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - output.forEach((item, integer) -> { - graph.addVertex(item); - graph.addEdge(target, item); - graph.setEdgeWeight(target, item, integer * load); - }); - // inputs - inputs.forEach((item, integer) -> { - graph.addVertex(item); - graph.addEdge(item, target); - float rate = (amountPerSecond / outputs.get(target)) / integer; - graph.setEdgeWeight(item, target, rate); - - Recipe recipe = item.getRecipe(); - if (recipe != null) { - Graph g = recipe.buildGraph(item, rate); - Graphs.addGraph(graph, g); - } - }); - - - return graph; - } - - private double processesNeeded(Item target, double n) { Recipe r = target.getRecipe(); return n / r.getProductionRate(target); @@ -202,8 +161,10 @@ public class Recipe { for (DefaultWeightedEdge edge : buildGraph.outgoingEdgesOf(item)) { Item product = buildGraph.getEdgeTarget(edge); Double productWantedPerMinute = map.get(product); + System.out.println(item.getName()); if (item.getRecipe().outputs.containsKey(product)) { // product is by-product, no forward dependency + System.out.println("BY-PRODUCT " + item.getName() + " -> " + product.getName()); byProducts.add(product); continue; } diff --git a/src/main/satisfactory/items/SumResult.java b/src/main/java/satisfactory/items/SumResult.java similarity index 100% rename from src/main/satisfactory/items/SumResult.java rename to src/main/java/satisfactory/items/SumResult.java diff --git a/src/main/satisfactory/items/requirements/Accumulator.java b/src/main/java/satisfactory/items/requirements/Accumulator.java similarity index 100% rename from src/main/satisfactory/items/requirements/Accumulator.java rename to src/main/java/satisfactory/items/requirements/Accumulator.java diff --git a/src/main/satisfactory/items/requirements/RateAccumulator.java b/src/main/java/satisfactory/items/requirements/RateAccumulator.java similarity index 100% rename from src/main/satisfactory/items/requirements/RateAccumulator.java rename to src/main/java/satisfactory/items/requirements/RateAccumulator.java diff --git a/src/main/satisfactory/items/requirements/RequirementAccumulator.java b/src/main/java/satisfactory/items/requirements/RequirementAccumulator.java similarity index 100% rename from src/main/satisfactory/items/requirements/RequirementAccumulator.java rename to src/main/java/satisfactory/items/requirements/RequirementAccumulator.java diff --git a/src/main/satisfactory/items/requirements/TotalAccumulator.java b/src/main/java/satisfactory/items/requirements/TotalAccumulator.java similarity index 100% rename from src/main/satisfactory/items/requirements/TotalAccumulator.java rename to src/main/java/satisfactory/items/requirements/TotalAccumulator.java diff --git a/src/main/satisfactory/items/type/Fluid.java b/src/main/java/satisfactory/items/type/Fluid.java similarity index 100% rename from src/main/satisfactory/items/type/Fluid.java rename to src/main/java/satisfactory/items/type/Fluid.java diff --git a/src/main/satisfactory/items/type/Ingot.java b/src/main/java/satisfactory/items/type/Ingot.java similarity index 100% rename from src/main/satisfactory/items/type/Ingot.java rename to src/main/java/satisfactory/items/type/Ingot.java diff --git a/src/main/satisfactory/items/type/Ore.java b/src/main/java/satisfactory/items/type/Ore.java similarity index 100% rename from src/main/satisfactory/items/type/Ore.java rename to src/main/java/satisfactory/items/type/Ore.java diff --git a/src/main/satisfactory/items/type/Part.java b/src/main/java/satisfactory/items/type/Part.java similarity index 100% rename from src/main/satisfactory/items/type/Part.java rename to src/main/java/satisfactory/items/type/Part.java diff --git a/src/main/satisfactory/items/type/Pickup.java b/src/main/java/satisfactory/items/type/Pickup.java similarity index 100% rename from src/main/satisfactory/items/type/Pickup.java rename to src/main/java/satisfactory/items/type/Pickup.java diff --git a/src/main/satisfactory/items/type/ProcessedFluid.java b/src/main/java/satisfactory/items/type/ProcessedFluid.java similarity index 100% rename from src/main/satisfactory/items/type/ProcessedFluid.java rename to src/main/java/satisfactory/items/type/ProcessedFluid.java diff --git a/src/main/satisfactory/items/type/RawFluid.java b/src/main/java/satisfactory/items/type/RawFluid.java similarity index 100% rename from src/main/satisfactory/items/type/RawFluid.java rename to src/main/java/satisfactory/items/type/RawFluid.java diff --git a/src/main/satisfactory/items/type/Tool.java b/src/main/java/satisfactory/items/type/Tool.java similarity index 100% rename from src/main/satisfactory/items/type/Tool.java rename to src/main/java/satisfactory/items/type/Tool.java diff --git a/src/main/satisfactory/items/Item.java b/src/main/satisfactory/items/Item.java deleted file mode 100644 index 52f42ad..0000000 --- a/src/main/satisfactory/items/Item.java +++ /dev/null @@ -1,126 +0,0 @@ -package satisfactory.items; - -import org.jgrapht.Graph; -import org.jgrapht.graph.DefaultWeightedEdge; -import satisfactory.Database; - -import java.util.*; - - -public abstract class Item { - protected boolean isRaw = false; - private String name; - private Set recipes; - private Recipe preference = null; - public int sum = 0; - - protected Item(String name, Set recipes) { - this.name = name; - this.recipes = recipes; - Database.add(this); - for (Recipe recipe : recipes) { - add(recipe); - } - } - - public Item(String name, Recipe... recipes) { - this(name, new HashSet<>(Arrays.asList(recipes))); - } - - public Item(String name) { - this(name, new HashSet<>()); - } - - public void add(Recipe recipe) { - add(recipe, 1); - } - - public void add(Recipe recipe, int output) { - recipes.add(recipe); - recipe.checkOutput(this, output); - } - - public String getName() { - return name; - } - - public Set getRecipes() { - return recipes; - } - - public boolean isRaw() { - return isRaw; - } - - public float getProductionRate() { - Recipe recipe = getRecipe(); - if (recipe == null) { - return 0; - } - return recipe.getProductionRate(this); - } - - public Recipe getRecipe() { - Recipe recipe = preference; - if (recipe == null) { - if (Database.preferences.containsKey(this)) { - recipe = Database.preferences.get(this); - } - if (recipe == null) { - recipe = recipes.stream().findFirst().orElse(null); - - } - } - return recipe; - } - - protected void setIsRaw() { - isRaw = true; - } - - @Override - public String toString() { - return "Item{" + - "name='" + name + '\'' + - ", #recipes=" + recipes.size() + - '}'; - } - - public void setPreference(Recipe preference) { - this.preference = preference; - } - - public Graph productionHierarchy() { - return productionHierarchy(1); - } - - public Graph productionHierarchy(int amount) { - - Graph graph = getRecipe().buildGraph(this, amount); - graph.addEdge(this,this); - graph.setEdgeWeight(this,this,amount); - return graph; - } - - public Map production(int amount){ - Graph graph = productionHierarchy(amount); - return production(graph); - } - - public static Map production(Graph graph){ - Map map = new HashMap<>(); - graph.vertexSet().forEach(item -> { - double rate = graph.outgoingEdgesOf(item).stream().mapToDouble(graph::getEdgeWeight).sum(); - map.put(item, rate); - }); - return map; - } - - public Graph hierarchy(){ - return getRecipe().buildGraph(this); - } - - public String ID(){ - return getName().replace(" ",""); - } -} diff --git a/src/test/java/satisfactory/items/DatabaseTest.java b/src/test/java/satisfactory/items/DatabaseTest.java new file mode 100644 index 0000000..c27ef0f --- /dev/null +++ b/src/test/java/satisfactory/items/DatabaseTest.java @@ -0,0 +1,15 @@ +package satisfactory.items; + +import org.junit.jupiter.api.Test; +import satisfactory.Database; +import static org.junit.jupiter.api.Assertions.*; + +public class DatabaseTest { + @Test + void testWaterPreference() { + Item i = Database.Water; + assertSame(i.getPreference(), i.getRecipe()); + assertTrue(i.getPreference() == i.getRecipe()); + assertTrue(i.getRecipe().toString().contains("water pump thingy")); + } +} diff --git a/src/test/satisfactory/items/ItemTest.java b/src/test/java/satisfactory/items/ItemTest.java similarity index 95% rename from src/test/satisfactory/items/ItemTest.java rename to src/test/java/satisfactory/items/ItemTest.java index 80c5073..1c66e62 100644 --- a/src/test/satisfactory/items/ItemTest.java +++ b/src/test/java/satisfactory/items/ItemTest.java @@ -14,11 +14,12 @@ class ItemTest { @Test void productionScrews() { - Map production = Database.Screw.production(100); + /*Map production = Database.Screw.production(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"); + assertEquals(25, production.get(Database.IronOre), "IronOre");*/ + fail(); } @Test @@ -35,13 +36,14 @@ class ItemTest { @Test void productionReinforcedIronPlates() { - Map production = Database.ReinforcedIronPlate.production(100); + /*Map production = Database.ReinforcedIronPlate.production(100); assertEquals(100, production.get(Database.ReinforcedIronPlate), "output"); assertEquals(1200, production.get(Database.Screw), "Screws"); assertEquals(300, production.get(Database.IronRod), "IronRod"); assertEquals(1200, production.get(Database.IronIngot), "IronIngot"); assertEquals(1200, production.get(Database.IronOre), "IronOre"); - assertEquals(600, production.get(Database.IronPlate), "IronPlate"); + assertEquals(600, production.get(Database.IronPlate), "IronPlate");*/ + fail(); } @Test