diff --git a/src/main/java/satisfactory/Database.java b/src/main/java/satisfactory/Database.java index 5048c00..a8722d1 100644 --- a/src/main/java/satisfactory/Database.java +++ b/src/main/java/satisfactory/Database.java @@ -13,27 +13,27 @@ public class Database { // Items & recipes public static final Item IronOre = new Ore("Iron Ore"); - public static final Item IronIngot = new Ingot("Iron Ingot", new Recipe(2, IronOre, 1, Smelter.class)); + public static final Item IronIngot = new Ingot("Iron Ingot"); public static final Item CopperOre = new Ore("Copper Ore"); - public static final Item CopperIngot = new Ingot("Copper Ingot", new Recipe(2, CopperOre, 1, Smelter.class)); + public static final Item CopperIngot = new Ingot("Copper Ingot"); public static final Item Coal = new Ore("Coal"); public static final Item SteelIngot = new Ingot("Steel Ingot"); public static final Item CateriumOre = new Ore("Caterium Ore"); - public static final Item CateriumIngot = new Ingot("Caterium Ingot", new Recipe(4, CateriumOre, 3, Smelter.class)); + public static final Item CateriumIngot = new Ingot("Caterium Ingot"); public static final Item IronPlate = new Part("Iron Plate"); - public static final Item IronRod = new Part("Iron Rod", new Recipe(4, IronIngot, 1, Constructor.class)); + public static final Item IronRod = new Part("Iron Rod"); public static final Item Screw = new Part("Screw"); public static final Item ReinforcedIronPlate = new Part("Reinforced Iron Plate"); public static final Item ModularFrame = new Part("Modular Frame"); - public static final Item SteelBeam = new Part("Steel Beam", new Recipe(4, SteelIngot, 4, Constructor.class)); + public static final Item SteelBeam = new Part("Steel Beam"); public static final Item SteelPipe = new Part("Steel Pipe"); public static final Item Limestone = new Ore("Limestone"); - public static final Item Concrete = new Part("Concrete", new Recipe(4, Limestone, 3, Constructor.class)); + public static final Item Concrete = new Part("Concrete"); public static final Item EncasedIndustrialBeam = new Part("Encased Industrial Beam"); public static final Item HeavyModularFrame = new Part("Heavy Modular Frame"); - public static final Item CopperSheet = new Part("Copper Sheet", new Recipe(6, CopperIngot, 2, Constructor.class)); + public static final Item CopperSheet = new Part("Copper Sheet"); public static final Item Wire = new Part("Wire"); - public static final Item Cable = new Part("Cable", new Recipe(2, Wire, 2, Constructor.class)); + public static final Item Cable = new Part("Cable"); public static final Item Quickwire = new Part("Quickwire"); public static final Item CircuitBoard = new Part("Circuit Board"); public static final Item AILimiter = new Part("A.I. Limiter"); @@ -43,8 +43,11 @@ public class Database { public static final Item Mycelia = new Pickup("Mycelia"); public static final Item Leaves = new Pickup("Leaves"); public static final Item Wood = new Pickup("Wood"); - public static final Item AlienCarapace = new Pickup("Alien Carapace"); - public static final Item AlienOrgans = new Pickup("Alien Organs"); + public static final Item AlienProtein = new Pickup("Alien Protein"); + public static final Item HogRemains = new Pickup("Hog Remains"); + public static final Item PlasmaSpitterRemains = new Pickup("Plasma Spitter Remains"); + public static final Item StingerRemains = new Pickup("Stinger Remains"); + public static final Item HatcherRemains = new Pickup("Hatcher Remains"); public static final Item Fabric = new Part("Fabric"); public static final Item Rotor = new Part("Rotor"); public static final Item Stator = new Part("Stator"); @@ -55,12 +58,12 @@ public class Database { public static final Item PowerShard = new Pickup("PowerShard"); public static final Item Sulfur = new Ore("Sulfur"); public static final Item BlackPowder = new Part("Black powder"); - public static final Item SpikedRebar = new Part("Spiked Rebar", new Recipe(4, IronRod, 1, Constructor.class)); + public static final Item IronRebar = new Part("Iron Rebar"); public static final Item FlowerPetals = new Pickup("Flower Petals"); public static final Item ColorCatridge = new Part("Color Catridge"); public static final Item Beacon = new Tool("Beacon"); public static final Item Rubber = new Part("Rubber"); - public static final Item RifleCatridge = new Part("Rifle Catridge"); + public static final Item RifleAmmo = new Part("Rifle Ammo"); public static final Item GasFilter = new Tool("Gas Filter"); public static final Item Plastic = new Part("Plastic"); public static final Item Computer = new Part("Computer"); @@ -77,6 +80,7 @@ public class Database { public static final Item HeavyOilResidue = new ProcessedFluid("Heavy Oil Residue"); public static final Item Fuel = new ProcessedFluid("Fuel"); public static final Item LiquidBiofuel = new ProcessedFluid("Liquid Biofuel"); + public static final Item PackagedLiquidBiofuel = new Part("Packaged Liquid Biofuel"); public static final Item PetroleumCoke = new Part("Petroleum Coke"); public static final Item PolymerResin = new Part("Polymer Resin"); // TODO: verify below! @@ -115,6 +119,20 @@ public class Database { public static final Item CoolingSystem = new Part("Cooling System"); public static final Item FusedModularFrame = new Part("Fused Modular Frame"); + public static final Item PortableMiner = new Tool("Portable Miner"); + public static final Item Turbofuel = new ProcessedFluid("Turbofuel"); + public static final Item PackagedTurboFuel = new Part("Packaged Turbofuel"); + public static final Item CompactedCoal = new Part("Compated Coal"); + public static final Item RebarGun = new Tool("Rebar Gun"); + public static final Item Rifle = new Tool("Rifle"); + public static final Item StunRebar = new Part("Stun Rebar"); + public static final Item ExplosiveRebar = new Part("Explosive Rebar"); + public static final Item SmokelessPowder = new Part("Smokeless Powder"); + public static final Item HomingRifleAmmo = new Part("Homing Rifle Ammo"); + public static final Item GasNobelisk = new Part("Gas Nobelisk"); + public static final Item ClusterNobelisk = new Part("Cluster Nobelisk"); + public static final Item ObjectScanner = new Tool("Object Scanner"); + public static final Item NobeliskDetonator = new Tool("Nobelisk Detonator"); static { { @@ -123,10 +141,12 @@ public class Database { Set ores = new HashSet<>(Arrays.asList(IronOre, Coal, Limestone, CopperOre, CateriumOre, Sulfur, Uranium)); ores.addAll(Arrays.asList(Bauxite, RawQuartz));// TODO: rly? for (Item ore : ores) { - Recipe mk1 = new Recipe(1, "Miner MK 1", false, Miner.class); + Recipe mk1 = new Recipe(1, "Miner Mk1", false, MinerMk1.class); ore.add(mk1, 1); - Recipe mk2 = new Recipe(1, "Miner MK2", false, Miner.class); + Recipe mk2 = new Recipe(1, "Miner Mk2", false, MinerMk2.class); ore.add(mk2, 2); + //Recipe mk3 = new Recipe(1, "Miner Mk3", false, MinerMk3.class); + //ore.add(mk3, 3); ore.setPreference(mk2); } @@ -140,7 +160,24 @@ public class Database { Water.setPreference(water); // gases - NitrogenGas.add(new Recipe(1,"pressure thingy", false, ResourceWellExtractor.class)); + NitrogenGas.add(new Recipe(1, "pressure thingy", false, ResourceWellExtractor.class)); + } + { + // Iron Ingot + IronIngot.add(new Recipe(2, IronOre, 1, Smelter.class)); + Recipe alt = new Recipe(12, Refinery.class); + alt.addInput(IronOre, 7); + alt.addInput(Water, 4); + alt.addOutput(IronIngot, 13); + IronIngot.add(alt); + } + { + // Copper Ingot + CopperIngot.add(new Recipe(2, CopperOre, 1, Smelter.class)); + } + { + // Caterium Ingot + CateriumIngot.add(new Recipe(4, CateriumOre, 3, Smelter.class)); } { // Steel Ingot @@ -149,6 +186,10 @@ public class Database { recipe.addInput(Coal, 3); SteelIngot.add(recipe, 3); } + { + // Concrete + Concrete.add(new Recipe(4, Limestone, 3, Constructor.class)); + } { // Iron Plate Recipe recipe = new Recipe(6, IronIngot, 3, Constructor.class); @@ -157,18 +198,27 @@ public class Database { steelCoated.addInput(SteelIngot, 3); steelCoated.addInput(Plastic, 2); IronPlate.add(steelCoated, 18); + IronPlate.setPreference(recipe); + } + { + // Iron Rod + IronRod.add(new Recipe(4, IronIngot, 1, Constructor.class)); } { // Screw Screw.add(new Recipe(6, IronRod, 1, Constructor.class), 4); } + { + // Steel Beam + SteelBeam.add(new Recipe(4, SteelIngot, 4, Constructor.class)); + } { // Reinforced Iron Plate Recipe recipe = new Recipe(12, Assembler.class); recipe.addInput(IronPlate, 6); recipe.addInput(Screw, 12); ReinforcedIronPlate.add(recipe); - Recipe bolted = new Recipe(12, "Bolted Iron Plate", false, Assembler.class); + Recipe bolted = new Recipe(4, "Bolted Iron Plate", false, Assembler.class); bolted.addInput(IronPlate, 18); bolted.addInput(Screw, 50); ReinforcedIronPlate.add(bolted, 3); @@ -203,11 +253,41 @@ public class Database { recipe.addInput(EncasedIndustrialBeam, 5); recipe.addInput(Screw, 100); HeavyModularFrame.add(recipe); + HeavyModularFrame.setPreference(recipe); + Recipe heavyEncasedFrame = new Recipe(21, Manufacturer.class); + // TODO: duration = 60/2.812 + heavyEncasedFrame.addInput(ModularFrame, 8); + heavyEncasedFrame.addInput(EncasedIndustrialBeam, 10); + heavyEncasedFrame.addInput(SteelPipe, 36); + heavyEncasedFrame.addInput(Concrete, 22); + heavyEncasedFrame.addOutput(HeavyModularFrame, 3); + HeavyModularFrame.add(heavyEncasedFrame); } { // Wire Wire.add(new Recipe(4, CopperIngot, 1, Constructor.class), 2); } + { + // Cable + Cable.add(new Recipe(2, Wire, 2, Constructor.class)); + Recipe quickWireCable = new Recipe(2, Assembler.class); + // TODO 60/27,5 + quickWireCable.addInput(Quickwire, 3); + quickWireCable.addInput(Rubber, 2); + quickWireCable.addOutput(Cable, 11); + Cable.add(quickWireCable); + } + { + // Copper Sheet + CopperSheet.add(new Recipe(6, CopperIngot, 2, Constructor.class)); + Recipe steamedCopperSheet = new Recipe(2, Refinery.class); + // TODO: duration = 60/22.5 + steamedCopperSheet.addInput(CopperIngot, 3); + steamedCopperSheet.addInput(Water, 3); + steamedCopperSheet.addOutput(CopperSheet, 3); + + CopperSheet.add(steamedCopperSheet); + } { // Quickwire Quickwire.add(new Recipe(5, CateriumIngot, 1, Constructor.class), 5); @@ -219,6 +299,11 @@ public class Database { recipe.addInput(Plastic, 4); CircuitBoard.add(recipe); // TODO: alternative + Recipe electrodeCircuitBoard = new Recipe(12, Assembler.class); + electrodeCircuitBoard.addInput(Rubber, 6); + electrodeCircuitBoard.addInput(PetroleumCoke, 9); + electrodeCircuitBoard.addOutput(CircuitBoard, 1); + CircuitBoard.add(electrodeCircuitBoard); } { // A.I. Limiter @@ -237,11 +322,17 @@ public class Database { } { // Biomass - Biomass.add(new Recipe(5, Leaves, 10, Constructor.class), 5); - Biomass.add(new Recipe(4, Wood, 4, Constructor.class), 20); - Biomass.add(new Recipe(4, Mycelia, 10, Constructor.class), 10); - Biomass.add(new Recipe(4, AlienCarapace, 1, Constructor.class), 100); - Biomass.add(new Recipe(8, AlienOrgans, 1, Constructor.class), 200); + Biomass.add(new Recipe(5, Leaves, 10, Constructor.class), 5); // TODO CraftBench + Biomass.add(new Recipe(4, Wood, 4, Constructor.class), 20); // TODO CraftBench + Biomass.add(new Recipe(4, Mycelia, 1, Constructor.class), 10); // TODO CraftBench + Biomass.add(new Recipe(4, AlienProtein, 1, Constructor.class), 100); // TODO CraftBench + } + { + // Alien Protein + AlienProtein.add(new Recipe(3,HogRemains,1, Constructor.class)); // TODO CraftBench + AlienProtein.add(new Recipe(3,PlasmaSpitterRemains,1, Constructor.class)); // TODO CraftBench + AlienProtein.add(new Recipe(3, StingerRemains,1, Constructor.class)); // TODO CraftBench + AlienProtein.add(new Recipe(3,HatcherRemains,1, Constructor.class)); // TODO CraftBench } { // Fabric @@ -249,6 +340,10 @@ public class Database { recipe.addInput(Mycelia); recipe.addInput(Biomass, 5); Fabric.add(recipe); + Recipe alt = new Recipe(2, Refinery.class); + recipe.addInput(PolymerResin,1); + recipe.addInput(Water,1); + recipe.addOutput(Fabric,1); } { // Solid Biofuel @@ -267,6 +362,13 @@ public class Database { recipe.addInput(SteelPipe, 3); recipe.addInput(Wire, 8); Stator.add(recipe); + Stator.setPreference(recipe); + Recipe quickwireStator = new Recipe(8, Assembler.class); + //TODO 60/8 + quickwireStator.addInput(SteelPipe, 4); + quickwireStator.addInput(Quickwire, 15); + quickwireStator.addOutput(Stator, 2); + Stator.add(quickwireStator); } { // Motor @@ -290,16 +392,7 @@ public class Database { } { // Color Catridge - ColorCatridge.add(new Recipe(8, FlowerPetals, 5, Constructor.class), 10); - } - { - // Rifle Catridge - Recipe recipe = new Recipe(20, Manufacturer.class); - recipe.addInput(Beacon, 1); - recipe.addInput(SteelPipe, 10); - recipe.addInput(BlackPowder, 10); - recipe.addInput(Rubber, 10); - RifleCatridge.add(recipe, 5); + ColorCatridge.add(new Recipe(6, FlowerPetals, 5, Constructor.class), 10); } { // Gas Filter @@ -371,6 +464,32 @@ public class Database { recipe.addInput(SteelPipe, 10); Nobelisk.add(recipe); } + { + // Gas Nobelisk + Recipe recipe = new Recipe(12, Assembler.class); //TODO EquipmentWorkshop + recipe.addInput(Nobelisk,1); + recipe.addInput(Biomass,10); + recipe.addOutput(GasNobelisk, 1); + GasNobelisk.add(recipe); + } + { + // Cluster Nobelisk + Recipe recipe = new Recipe(24, Assembler.class); //TODO EquipmentWorkshop + recipe.addInput(Nobelisk,3); + recipe.addInput(SmokelessPowder,4); + recipe.addOutput(ClusterNobelisk, 1); + ClusterNobelisk.add(recipe); + + } + { + // NobeliskDetonator + Recipe recipe = new Recipe(80, EquipmentWorkshop.class); + recipe.addInput(ObjectScanner, 1); + recipe.addInput(SteelBeam,10); + recipe.addInput(Cable,50); + recipe.addOutput(NobeliskDetonator,1); + NobeliskDetonator.add(recipe); + } { // Smart Plating Recipe recipe = new Recipe(30, false, Assembler.class); @@ -404,12 +523,32 @@ public class Database { Fuel.setPreference(recipe); } + { + PolymerResin.setPreference(PolymerResin.getRecipe()); + // Polymer Resin + Recipe polymerResin = new Recipe(1, Refinery.class); + // TODO: duration=60/130 + polymerResin.addInput(CrudeOil, 6); + polymerResin.addOutput(PolymerResin, 13); + polymerResin.addOutput(HeavyOilResidue, 2); + PolymerResin.add(polymerResin); + } { // Liquid Biofuel Recipe recipe = new Recipe(4, false, Refinery.class); recipe.addInput(SolidBiofuel, 6); recipe.addInput(Water, 3); LiquidBiofuel.add(recipe, 4); + + Recipe unpack = new Recipe(2, Packager.class); + recipe.addInput(PackagedLiquidBiofuel, 2); + recipe.addOutput(LiquidBiofuel, 2); + recipe.addOutput(EmptyCanister,2); + LiquidBiofuel.add(unpack); + } + { + // Packaged Liquid Biofuel + } { // Plastic @@ -496,72 +635,173 @@ public class Database { } { Recipe recipe = new Recipe(6, Refinery.class); - recipe.addInput(Sulfur,5); - recipe.addInput(Water,5); + recipe.addInput(Sulfur, 5); + recipe.addInput(Water, 5); recipe.addOutput(SulfuricAcid, 5); } { - Recipe recipe = new Recipe(150,Manufacturer.class); + Recipe recipe = new Recipe(150, Manufacturer.class); recipe.addInput(EncasedUraniumCell, 50); - recipe.addInput(EncasedIndustrialBeam,3); + recipe.addInput(EncasedIndustrialBeam, 3); recipe.addInput(ElectromagneticControlRod, 5); - recipe.addOutput(UraniumFuelRod,1); + recipe.addOutput(UraniumFuelRod, 1); } { Recipe recipe = new Recipe(12, Blender.class); recipe.addInput(Uranium, 10); - recipe.addInput(Concrete,3); + recipe.addInput(Concrete, 3); recipe.addInput(SulfuricAcid, 8); recipe.addOutput(EncasedUraniumCell, 5); recipe.addOutput(SulfuricAcid, 2); } { - Recipe recipe = new Recipe(120,Manufacturer.class); - recipe.addInput(VersatileFrameWork,5); + Recipe recipe = new Recipe(120, Manufacturer.class); + recipe.addInput(VersatileFrameWork, 5); recipe.addInput(ElectromagneticControlRod, 5); recipe.addInput(Battery, 10); - recipe.addOutput(MagneticFieldGenerator,2); + recipe.addOutput(MagneticFieldGenerator, 2); } { Recipe recipe = new Recipe(3, Blender.class); - recipe.addInput(SulfuricAcid,2.5); - recipe.addInput(AluminaSolution,2); - recipe.addInput(AluminumCasing,1); + recipe.addInput(SulfuricAcid, 2.5); + recipe.addInput(AluminaSolution, 2); + recipe.addInput(AluminumCasing, 1); recipe.addOutput(Battery, 1); recipe.addOutput(Water, 1.5); } { Recipe recipe = new Recipe(8, Assembler.class); - recipe.addInput(AlcladAluminumSheet,5); - recipe.addInput(CopperSheet,3); + recipe.addInput(AlcladAluminumSheet, 5); + recipe.addInput(CopperSheet, 3); recipe.addOutput(HeatSink, 1); } { Recipe recipe = new Recipe(80, Assembler.class); - recipe.addInput(AdaptiveControlUnit,2); - recipe.addInput(SuperComputer,1); - recipe.addOutput(AssemblyDirectorSystem,1); + recipe.addInput(AdaptiveControlUnit, 2); + recipe.addInput(SuperComputer, 1); + recipe.addOutput(AssemblyDirectorSystem, 1); } { - Recipe recipe = new Recipe(30,Assembler.class); - recipe.addInput(Stator,3); - recipe.addInput(AILimiter,2); - recipe.addOutput(ElectromagneticControlRod,2); + Recipe recipe = new Recipe(30, Assembler.class); + recipe.addInput(Stator, 3); + recipe.addInput(AILimiter, 2); + recipe.addOutput(ElectromagneticControlRod, 2); } { Recipe recipe = new Recipe(10, Blender.class); - recipe.addInput(HeatSink,2); - recipe.addInput(Rubber,2); - recipe.addInput(Water,5); - recipe.addInput(NitrogenGas,25); - recipe.addOutput(CoolingSystem,1); + recipe.addInput(HeatSink, 2); + recipe.addInput(Rubber, 2); + recipe.addInput(Water, 5); + recipe.addInput(NitrogenGas, 25); + recipe.addOutput(CoolingSystem, 1); } { Recipe recipe = new Recipe(40, Blender.class); - recipe.addInput(HeavyModularFrame,1); - recipe.addInput(AluminumCasing,50); - recipe.addInput(NitrogenGas,25); - recipe.addOutput(FusedModularFrame,1); + recipe.addInput(HeavyModularFrame, 1); + recipe.addInput(AluminumCasing, 50); + recipe.addInput(NitrogenGas, 25); + recipe.addOutput(FusedModularFrame, 1); + } + { + Recipe recipe = new Recipe(40, true, EquipmentWorkshop.class); + recipe.addInput(IronPlate, 2); + recipe.addInput(IronRod, 2); + recipe.addOutput(PortableMiner, 1); + } + { + //Turbofuel + Recipe recipe = new Recipe(3, Refinery.class); + //TODO: 60/18,75 + recipe.addInput(Fuel, 6); + recipe.addInput(CompactedCoal, 4); + recipe.addOutput(Turbofuel, 5); + Turbofuel.add(recipe); + Recipe packaged = new Recipe(3, Packager.class); + recipe.addInput(PackagedTurboFuel, 2); + recipe.addOutput(Turbofuel, 2); + recipe.addOutput(EmptyCanister, 2); + Turbofuel.add(packaged); + } + { + // Packaged Turbofuel + Recipe recipe = new Recipe(3, Packager.class); + recipe.addInput(Turbofuel, 2); + recipe.addInput(EmptyCanister, 2); + recipe.addOutput(PackagedTurboFuel, 2); + PackagedTurboFuel.add(recipe); + } + { + // Compacted Coal + Recipe recipe = new Recipe(2, Assembler.class); + //TODO: 60/25 + recipe.addInput(Coal, 5); + recipe.addInput(Sulfur, 5); + recipe.addOutput(CompactedCoal, 5); + CompactedCoal.add(recipe); + } + { + // Iron Rebar + IronRebar.add(new Recipe(4, IronRod, 1, Constructor.class)); + } + { + // Stun Rebar + Recipe recipe = new Recipe(6, Assembler.class);//TODO , EquipmentWorkshop.class) + recipe.addInput(IronRebar,1); + recipe.addInput(Quickwire,5); + recipe.addOutput(StunRebar, 1); + StunRebar.add(recipe); + } + { + // Explosive Rebar + Recipe recipe = new Recipe(12, Manufacturer.class);//TODO , EquipmentWorkshop.class) + recipe.addInput(IronRebar,1); + recipe.addInput(SmokelessPowder,2); + recipe.addInput(SteelPipe,2); + recipe.addOutput(ExplosiveRebar, 1); + ExplosiveRebar.add(recipe); + } + { + // Rebar Gun + Recipe recipe = new Recipe(60, EquipmentWorkshop.class); + recipe.addInput(ReinforcedIronPlate,6); + recipe.addInput(IronRod,16); + recipe.addInput(Screw,100); + recipe.addOutput(RebarGun, 1); + RebarGun.add(recipe); + } + { + // Rifle Ammo + Recipe recipe=new Recipe(12, Assembler.class);//TODO , EquipmentWorkshop.class) + recipe.addInput(CopperSheet,3); + recipe.addInput(SmokelessPowder, 2); + recipe.addOutput(RifleAmmo,15); + RifleAmmo.add(recipe); + } + { + // Homing Rifle Ammo + Recipe recipe=new Recipe(12, Assembler.class);//TODO , EquipmentWorkshop.class) + recipe.addInput(RifleAmmo,20); + recipe.addInput(HighSpeedConnector,1); + recipe.addOutput(HomingRifleAmmo,10); + HomingRifleAmmo.add(recipe); + } + { + // Rifle + Recipe recipe=new Recipe(120, EquipmentWorkshop.class); + recipe.addInput(Motor,2); + recipe.addInput(Rubber,10); + recipe.addInput(SteelPipe,25); + recipe.addInput(Screw,250); + recipe.addOutput(Rifle,1); + Rifle.add(recipe); + } + { + // Smokeless Powder + Recipe recipe=new Recipe(6, Refinery.class); + recipe.addInput(BlackPowder,2); + recipe.addInput(HeavyOilResidue,1); + recipe.addOutput(SmokelessPowder,2); + SmokelessPowder.add(recipe); } } diff --git a/src/main/java/satisfactory/Test.java b/src/main/java/satisfactory/Test.java index 5f50eba..dc1467e 100644 --- a/src/main/java/satisfactory/Test.java +++ b/src/main/java/satisfactory/Test.java @@ -20,7 +20,9 @@ import satisfactory.items.SumResult; import java.io.File; import java.io.IOException; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import static satisfactory.Utils.PLOTS; import static satisfactory.Utils.plot2; @@ -123,6 +125,23 @@ public class Test { planFor(Database.FusedModularFrame, 100, "fusedFrame"); planFor(Database.SteelIngot, 100, "steelIngot"); + + Set unlocks = unlocks(); + planFor( + "phase2", + new Production(Database.SmartPlating, 5), + new Production(Database.VersatileFrameWork, 5), + new Production(Database.AutomatedWiring, 1) + ); + planFor( + "phase3", + new Production(Database.VersatileFrameWork,5), + new Production(Database.ModularEngine,1), + new Production(Database.AdaptiveControlUnit,1) + ); + planFor("allIron", + new Production(Database.IronRod,1), + new Production(Database.IronPlate,1)); } private static void planFor(Item item, int amount, String name) { @@ -131,6 +150,12 @@ public class Test { javaPlot(name); } + private static void planFor(String name, Production... prods) { + SumResult plan = SumResult.sum(prods); + plot2(plan.getProduction(), name); + javaPlot(name); + } + private static void plot(Item target, String name, int amount) { Graph screws = target.hierarchy(); DOTExporter de = new DOTExporter<>(Utils::dotID); @@ -154,4 +179,8 @@ public class Test { e.printStackTrace(); } } + + public static Set unlocks(String... unlock) { + return Set.of(unlock); + } } \ No newline at end of file diff --git a/src/main/java/satisfactory/buildings/Building.java b/src/main/java/satisfactory/buildings/Building.java index 2038ba0..a1c07f6 100644 --- a/src/main/java/satisfactory/buildings/Building.java +++ b/src/main/java/satisfactory/buildings/Building.java @@ -1,4 +1,15 @@ package satisfactory.buildings; +import satisfactory.items.Item; + +import java.util.HashMap; +import java.util.Map; + public abstract class Building { + protected Map cost; + protected Integer power; + + public Building() { + cost = new HashMap<>(); + } } diff --git a/src/main/java/satisfactory/buildings/power/BiomassBurner.java b/src/main/java/satisfactory/buildings/power/BiomassBurner.java new file mode 100644 index 0000000..9ef1660 --- /dev/null +++ b/src/main/java/satisfactory/buildings/power/BiomassBurner.java @@ -0,0 +1,13 @@ +package satisfactory.buildings.power; + +import satisfactory.Database; + +public class BiomassBurner extends PowerGenerationBuilding { + public BiomassBurner() { + power = 30; + cost.put(Database.IronPlate, 15); + cost.put(Database.IronRod, 15); + cost.put(Database.Wire, 25); + consumes.put(Database.Coal, 15); + } +} diff --git a/src/main/java/satisfactory/buildings/power/CoalGenerator.java b/src/main/java/satisfactory/buildings/power/CoalGenerator.java new file mode 100644 index 0000000..c769870 --- /dev/null +++ b/src/main/java/satisfactory/buildings/power/CoalGenerator.java @@ -0,0 +1,14 @@ +package satisfactory.buildings.power; + +import satisfactory.Database; + +public class CoalGenerator extends PowerGenerationBuilding { + public CoalGenerator() { + power = 75; + cost.put(Database.ReinforcedIronPlate, 20); + cost.put(Database.Rotor, 10); + cost.put(Database.Cable, 30); + consumes.put(Database.Coal, 15); + consumes.put(Database.PetroleumCoke, 25); + } +} diff --git a/src/main/java/satisfactory/buildings/power/FuelGenerator.java b/src/main/java/satisfactory/buildings/power/FuelGenerator.java new file mode 100644 index 0000000..5cfc74a --- /dev/null +++ b/src/main/java/satisfactory/buildings/power/FuelGenerator.java @@ -0,0 +1,15 @@ +package satisfactory.buildings.power; + +import satisfactory.Database; + +public class FuelGenerator extends PowerGenerationBuilding { + public FuelGenerator() { + power = 150; + cost.put(Database.Computer, 5); + cost.put(Database.HeavyModularFrame, 10); + cost.put(Database.Motor, 15); + cost.put(Database.Rubber, 50); + cost.put(Database.Quickwire, 50); + consumes.put(Database.Fuel, 12); + } +} diff --git a/src/main/java/satisfactory/buildings/power/GeothermalGenerator.java b/src/main/java/satisfactory/buildings/power/GeothermalGenerator.java new file mode 100644 index 0000000..0de32fb --- /dev/null +++ b/src/main/java/satisfactory/buildings/power/GeothermalGenerator.java @@ -0,0 +1,14 @@ +package satisfactory.buildings.power; + +import satisfactory.Database; + +public class GeothermalGenerator extends PowerGenerationBuilding { + public GeothermalGenerator() { + power = 9999; // TODO + cost.put(Database.SuperComputer,8); + cost.put(Database.HeavyModularFrame,16); + cost.put(Database.HighSpeedConnector,16); + cost.put(Database.CopperSheet,40); + cost.put(Database.Rubber,80); + } +} diff --git a/src/main/java/satisfactory/buildings/power/PowerGenerationBuilding.java b/src/main/java/satisfactory/buildings/power/PowerGenerationBuilding.java new file mode 100644 index 0000000..2cdc538 --- /dev/null +++ b/src/main/java/satisfactory/buildings/power/PowerGenerationBuilding.java @@ -0,0 +1,15 @@ +package satisfactory.buildings.power; + +import satisfactory.buildings.Building; +import satisfactory.items.Item; + +import java.util.HashMap; +import java.util.Map; + +public abstract class PowerGenerationBuilding extends Building { + protected Map consumes; + + public PowerGenerationBuilding() { + consumes=new HashMap<>(); + } +} diff --git a/src/main/java/satisfactory/buildings/production/Assembler.java b/src/main/java/satisfactory/buildings/production/Assembler.java index c6075f5..424f364 100644 --- a/src/main/java/satisfactory/buildings/production/Assembler.java +++ b/src/main/java/satisfactory/buildings/production/Assembler.java @@ -1,6 +1,13 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Assembler extends Building { + public Assembler() { + power = 15; + cost.put(Database.ReinforcedIronPlate, 8); + cost.put(Database.Rotor, 4); + cost.put(Database.Cable, 10); + } } diff --git a/src/main/java/satisfactory/buildings/production/Blender.java b/src/main/java/satisfactory/buildings/production/Blender.java index f2540bb..e902658 100644 --- a/src/main/java/satisfactory/buildings/production/Blender.java +++ b/src/main/java/satisfactory/buildings/production/Blender.java @@ -3,4 +3,9 @@ package satisfactory.buildings.production; import satisfactory.buildings.Building; public class Blender extends Building { + public Blender() { + power = -9999; + cost.put(null, null); + // TODO + } } diff --git a/src/main/java/satisfactory/buildings/production/Constructor.java b/src/main/java/satisfactory/buildings/production/Constructor.java index 46b7dbb..e11c93d 100644 --- a/src/main/java/satisfactory/buildings/production/Constructor.java +++ b/src/main/java/satisfactory/buildings/production/Constructor.java @@ -1,6 +1,12 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Constructor extends Building { + public Constructor() { + power = 4; + cost.put(Database.ReinforcedIronPlate, 2); + cost.put(Database.Cable, 8); + } } diff --git a/src/main/java/satisfactory/buildings/production/CraftBench.java b/src/main/java/satisfactory/buildings/production/CraftBench.java index c551375..a4d9877 100644 --- a/src/main/java/satisfactory/buildings/production/CraftBench.java +++ b/src/main/java/satisfactory/buildings/production/CraftBench.java @@ -1,6 +1,12 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class CraftBench extends Building { + public CraftBench() { + power = null; + cost.put(Database.IronPlate, 3); + cost.put(Database.IronRod, 3); + } } diff --git a/src/main/java/satisfactory/buildings/production/EquipmentWorkshop.java b/src/main/java/satisfactory/buildings/production/EquipmentWorkshop.java index 4672d88..fbf865d 100644 --- a/src/main/java/satisfactory/buildings/production/EquipmentWorkshop.java +++ b/src/main/java/satisfactory/buildings/production/EquipmentWorkshop.java @@ -1,6 +1,12 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class EquipmentWorkshop extends Building { + public EquipmentWorkshop() { + power = null; + cost.put(Database.IronPlate, 6); + cost.put(Database.IronRod, 4); + } } diff --git a/src/main/java/satisfactory/buildings/production/Foundry.java b/src/main/java/satisfactory/buildings/production/Foundry.java index 75fdba5..a1f8b71 100644 --- a/src/main/java/satisfactory/buildings/production/Foundry.java +++ b/src/main/java/satisfactory/buildings/production/Foundry.java @@ -1,6 +1,13 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Foundry extends Building { + public Foundry() { + power = 16; + cost.put(Database.ModularFrame, 10); + cost.put(Database.Rotor, 10); + cost.put(Database.Concrete, 20); + } } diff --git a/src/main/java/satisfactory/buildings/production/Manufacturer.java b/src/main/java/satisfactory/buildings/production/Manufacturer.java index ff8f104..53b4c34 100644 --- a/src/main/java/satisfactory/buildings/production/Manufacturer.java +++ b/src/main/java/satisfactory/buildings/production/Manufacturer.java @@ -1,6 +1,14 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Manufacturer extends Building { + public Manufacturer() { + power = 55; + cost.put(Database.Motor, 5); + cost.put(Database.HeavyModularFrame, 10); + cost.put(Database.Cable, 50); + cost.put(Database.Plastic, 50); + } } diff --git a/src/main/java/satisfactory/buildings/production/Miner.java b/src/main/java/satisfactory/buildings/production/Miner.java deleted file mode 100644 index 5500474..0000000 --- a/src/main/java/satisfactory/buildings/production/Miner.java +++ /dev/null @@ -1,6 +0,0 @@ -package satisfactory.buildings.production; - -import satisfactory.buildings.Building; - -public class Miner extends Building { -} diff --git a/src/main/java/satisfactory/buildings/production/MinerMk1.java b/src/main/java/satisfactory/buildings/production/MinerMk1.java new file mode 100644 index 0000000..9f67cec --- /dev/null +++ b/src/main/java/satisfactory/buildings/production/MinerMk1.java @@ -0,0 +1,13 @@ +package satisfactory.buildings.production; + +import satisfactory.Database; +import satisfactory.buildings.Building; + +public class MinerMk1 extends Building { + public MinerMk1() { + power = 5; + cost.put(Database.PortableMiner, 1); + cost.put(Database.IronPlate, 10); + cost.put(Database.Concrete, 10); + } +} diff --git a/src/main/java/satisfactory/buildings/production/MinerMk2.java b/src/main/java/satisfactory/buildings/production/MinerMk2.java new file mode 100644 index 0000000..46aaa62 --- /dev/null +++ b/src/main/java/satisfactory/buildings/production/MinerMk2.java @@ -0,0 +1,13 @@ +package satisfactory.buildings.production; + +import satisfactory.Database; + +public class MinerMk2 extends MinerMk1{ + public MinerMk2() { + power = 12; + cost.put(Database.PortableMiner, 2); + cost.put(Database.EncasedIndustrialBeam, 10); + cost.put(Database.SteelPipe, 20); + cost.put(Database.ModularFrame, 10); + } +} diff --git a/src/main/java/satisfactory/buildings/production/MinerMk3.java b/src/main/java/satisfactory/buildings/production/MinerMk3.java new file mode 100644 index 0000000..7940425 --- /dev/null +++ b/src/main/java/satisfactory/buildings/production/MinerMk3.java @@ -0,0 +1,14 @@ +package satisfactory.buildings.production; + +import satisfactory.Database; + +public class MinerMk3 extends MinerMk1{ + public MinerMk3() { + // TODO: real values! + power = 12; + cost.put(Database.PortableMiner, 2); + cost.put(Database.EncasedIndustrialBeam, 10); + cost.put(Database.SteelPipe, 20); + cost.put(Database.ModularFrame, 10); + } +} diff --git a/src/main/java/satisfactory/buildings/production/OilExtractor.java b/src/main/java/satisfactory/buildings/production/OilExtractor.java index ef3ce46..1b7f38d 100644 --- a/src/main/java/satisfactory/buildings/production/OilExtractor.java +++ b/src/main/java/satisfactory/buildings/production/OilExtractor.java @@ -1,6 +1,13 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class OilExtractor extends Building { + public OilExtractor() { + power = 40; + cost.put(Database.Motor, 15); + cost.put(Database.EncasedIndustrialBeam, 20); + cost.put(Database.Cable, 60); + } } diff --git a/src/main/java/satisfactory/buildings/production/Packager.java b/src/main/java/satisfactory/buildings/production/Packager.java index b1a425a..14ffcbc 100644 --- a/src/main/java/satisfactory/buildings/production/Packager.java +++ b/src/main/java/satisfactory/buildings/production/Packager.java @@ -1,6 +1,13 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Packager extends Building { + public Packager() { + power = 10; + cost.put(Database.SteelBeam, 20); + cost.put(Database.Rubber, 10); + cost.put(Database.Plastic, 10); + } } diff --git a/src/main/java/satisfactory/buildings/production/Refinery.java b/src/main/java/satisfactory/buildings/production/Refinery.java index 654484d..a12c529 100644 --- a/src/main/java/satisfactory/buildings/production/Refinery.java +++ b/src/main/java/satisfactory/buildings/production/Refinery.java @@ -1,6 +1,14 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Refinery extends Building { + public Refinery() { + power = 30; + cost.put(Database.Motor, 10); + cost.put(Database.EncasedIndustrialBeam, 10); + cost.put(Database.SteelPipe, 30); + cost.put(Database.CopperSheet, 20); + } } diff --git a/src/main/java/satisfactory/buildings/production/ResourceWellExtractor.java b/src/main/java/satisfactory/buildings/production/ResourceWellExtractor.java index d0e3868..93811d3 100644 --- a/src/main/java/satisfactory/buildings/production/ResourceWellExtractor.java +++ b/src/main/java/satisfactory/buildings/production/ResourceWellExtractor.java @@ -3,4 +3,9 @@ package satisfactory.buildings.production; import satisfactory.buildings.Building; public class ResourceWellExtractor extends Building { + public ResourceWellExtractor() { + power = -9999; + cost.put(null, null); + // TODO + } } diff --git a/src/main/java/satisfactory/buildings/production/Smelter.java b/src/main/java/satisfactory/buildings/production/Smelter.java index 095c401..f60f5a9 100644 --- a/src/main/java/satisfactory/buildings/production/Smelter.java +++ b/src/main/java/satisfactory/buildings/production/Smelter.java @@ -1,6 +1,12 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class Smelter extends Building { + public Smelter() { + power = 4; + cost.put(Database.IronRod, 5); + cost.put(Database.Wire, 8); + } } diff --git a/src/main/java/satisfactory/buildings/production/WaterExtractor.java b/src/main/java/satisfactory/buildings/production/WaterExtractor.java index 8f01a62..520d9b4 100644 --- a/src/main/java/satisfactory/buildings/production/WaterExtractor.java +++ b/src/main/java/satisfactory/buildings/production/WaterExtractor.java @@ -1,6 +1,13 @@ package satisfactory.buildings.production; +import satisfactory.Database; import satisfactory.buildings.Building; public class WaterExtractor extends Building { + public WaterExtractor() { + power = 20; + cost.put(Database.CopperSheet, 20); + cost.put(Database.ReinforcedIronPlate, 10); + cost.put(Database.Rotor, 10); + } } diff --git a/src/main/java/satisfactory/items/Item.java b/src/main/java/satisfactory/items/Item.java index ba26bf2..bb262b4 100644 --- a/src/main/java/satisfactory/items/Item.java +++ b/src/main/java/satisfactory/items/Item.java @@ -23,15 +23,14 @@ public abstract class Item { } } - 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) { + if (recipes.isEmpty()) { + setPreference(recipe); + } add(recipe, 1); } diff --git a/src/main/java/satisfactory/items/Recipe.java b/src/main/java/satisfactory/items/Recipe.java index 65eca02..87a7e90 100644 --- a/src/main/java/satisfactory/items/Recipe.java +++ b/src/main/java/satisfactory/items/Recipe.java @@ -20,9 +20,7 @@ public class Recipe { private final int duration; public Recipe(int duration, Class building) { - inputs = new HashMap<>(); - outputs = new HashMap<>(); - this.duration = duration; + this(duration, new HashMap<>(), new HashMap<>(), building); } public Recipe(int duration, boolean isHandCraftable, Class building) { diff --git a/src/main/java/satisfactory/items/type/Fluid.java b/src/main/java/satisfactory/items/type/Fluid.java index 5c504f6..78132a4 100644 --- a/src/main/java/satisfactory/items/type/Fluid.java +++ b/src/main/java/satisfactory/items/type/Fluid.java @@ -5,10 +5,6 @@ import satisfactory.items.Recipe; public abstract class Fluid extends Item { - public Fluid(String name, Recipe... recipes) { - super(name, recipes); - } - public Fluid(String name) { super(name); } diff --git a/src/main/java/satisfactory/items/type/Gas.java b/src/main/java/satisfactory/items/type/Gas.java index 4716c5e..6cd8527 100644 --- a/src/main/java/satisfactory/items/type/Gas.java +++ b/src/main/java/satisfactory/items/type/Gas.java @@ -5,11 +5,6 @@ import satisfactory.items.Recipe; public class Gas extends Item { - public Gas(String name, Recipe... recipes) { - super(name, recipes); - setIsRaw(); - } - public Gas(String name) { super(name); setIsRaw(); diff --git a/src/main/java/satisfactory/items/type/Ingot.java b/src/main/java/satisfactory/items/type/Ingot.java index 0acd7ed..b09bcd0 100644 --- a/src/main/java/satisfactory/items/type/Ingot.java +++ b/src/main/java/satisfactory/items/type/Ingot.java @@ -5,10 +5,6 @@ import satisfactory.items.Recipe; public class Ingot extends Item { - public Ingot(String name, Recipe... recipes) { - super(name, recipes); - } - public Ingot(String name) { super(name); } diff --git a/src/main/java/satisfactory/items/type/Ore.java b/src/main/java/satisfactory/items/type/Ore.java index b3a928f..3641366 100644 --- a/src/main/java/satisfactory/items/type/Ore.java +++ b/src/main/java/satisfactory/items/type/Ore.java @@ -5,11 +5,6 @@ import satisfactory.items.Recipe; public class Ore extends Item { - public Ore(String name, Recipe... recipes) { - super(name, recipes); - setIsRaw(); - } - public Ore(String name) { super(name); setIsRaw(); diff --git a/src/main/java/satisfactory/items/type/Part.java b/src/main/java/satisfactory/items/type/Part.java index 4029797..d8aa3c5 100644 --- a/src/main/java/satisfactory/items/type/Part.java +++ b/src/main/java/satisfactory/items/type/Part.java @@ -5,10 +5,6 @@ import satisfactory.items.Recipe; public class Part extends Item { - public Part(String name, Recipe... recipes) { - super(name, recipes); - } - public Part(String name) { super(name); } diff --git a/src/main/java/satisfactory/items/type/Pickup.java b/src/main/java/satisfactory/items/type/Pickup.java index f24833b..6dafd33 100644 --- a/src/main/java/satisfactory/items/type/Pickup.java +++ b/src/main/java/satisfactory/items/type/Pickup.java @@ -5,11 +5,6 @@ import satisfactory.items.Recipe; public class Pickup extends Item { - public Pickup(String name, Recipe... recipes) { - super(name, recipes); - setIsRaw(); - } - public Pickup(String name) { super(name); setIsRaw(); diff --git a/src/main/java/satisfactory/items/type/ProcessedFluid.java b/src/main/java/satisfactory/items/type/ProcessedFluid.java index f5b9209..97de2eb 100644 --- a/src/main/java/satisfactory/items/type/ProcessedFluid.java +++ b/src/main/java/satisfactory/items/type/ProcessedFluid.java @@ -4,10 +4,6 @@ import satisfactory.items.Recipe; public class ProcessedFluid extends Fluid { - public ProcessedFluid(String name, Recipe... recipes) { - super(name, recipes); - } - public ProcessedFluid(String name) { super(name); } diff --git a/src/main/java/satisfactory/items/type/RawFluid.java b/src/main/java/satisfactory/items/type/RawFluid.java index 4e89e78..44ae9e7 100644 --- a/src/main/java/satisfactory/items/type/RawFluid.java +++ b/src/main/java/satisfactory/items/type/RawFluid.java @@ -4,11 +4,6 @@ import satisfactory.items.Recipe; public class RawFluid extends Fluid { - public RawFluid(String name, Recipe... recipes) { - super(name, recipes); - setIsRaw(); - } - public RawFluid(String name) { super(name); setIsRaw(); diff --git a/src/main/java/satisfactory/items/type/Tool.java b/src/main/java/satisfactory/items/type/Tool.java index c1a4f4f..f654641 100644 --- a/src/main/java/satisfactory/items/type/Tool.java +++ b/src/main/java/satisfactory/items/type/Tool.java @@ -5,10 +5,6 @@ import satisfactory.items.Recipe; public class Tool extends Item { - public Tool(String name, Recipe... recipes) { - super(name, recipes); - } - public Tool(String name) { super(name); } diff --git a/src/test/java/satisfactory/PlanTest.java b/src/test/java/satisfactory/PlanTest.java new file mode 100644 index 0000000..4dd508a --- /dev/null +++ b/src/test/java/satisfactory/PlanTest.java @@ -0,0 +1,12 @@ +package satisfactory; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class PlanTest { + + @Test + void twoItems() { + fail(); + } +} \ No newline at end of file diff --git a/src/test/java/satisfactory/items/Phase3Test.java b/src/test/java/satisfactory/items/Phase3Test.java new file mode 100644 index 0000000..50b3bf1 --- /dev/null +++ b/src/test/java/satisfactory/items/Phase3Test.java @@ -0,0 +1,60 @@ +package satisfactory.items; + +import org.junit.jupiter.api.Test; +import satisfactory.Database; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class Phase3Test { + + @Test + void testPhase3_ME_ACU() { + // references + Map ref = new HashMap<>(); + ref.put(Database.CircuitBoard, 15.0); + ref.put(Database.Computer, 1.0); + ref.put(Database.Limestone,75.0); + ref.put(Database.Concrete,25.0); + ref.put(Database.SteelBeam,20.0); + ref.put(Database.EncasedIndustrialBeam, 5.0); + ref.put(Database.ModularFrame,5.0); + ref.put(Database.HeavyModularFrame,1.0); + ref.put(Database.Plastic, 78.0); + ref.put(Database.CopperSheet, 30.0); + ref.put(Database.Coal,226.25); + ref.put(Database.Cable,159.0); + ref.put(Database.CopperOre,329.0); + ref.put(Database.AutomatedWiring, 7.5); + ref.put(Database.AdaptiveControlUnit, 1.0); + ref.put(Database.CrudeOil, 229.5); + ref.put(Database.ReinforcedIronPlate, 17.5); + ref.put(Database.CopperIngot, 329.0); + ref.put(Database.SteelIngot, 226.25); + ref.put(Database.IronPlate, 105.0); + ref.put(Database.SmartPlating, 10.0); + //ref.put(Database.HeavyOilResidue, 114.0); // TODO: implement calculation + ref.put(Database.Rubber, 75.0); + ref.put(Database.Wire, 538.0); + ref.put(Database.SteelPipe, 97.5); + ref.put(Database.Stator, 27.5); + ref.put(Database.Screw, 1112.0); + ref.put(Database.IronOre, 841.75); + ref.put(Database.IronIngot, 615.5); + ref.put(Database.IronRod, 458.0); + ref.put(Database.Rotor, 30.0); + ref.put(Database.Motor, 10.0); + ref.put(Database.ModularEngine, 5.0); + + // calculate + Map calculations = SumResult.sum(new Production(Database.ModularEngine, 5), new Production(Database.AdaptiveControlUnit, 1)).getMap(); + + // assert + ref.forEach((item, amount) -> { + assertTrue(calculations.containsKey(item), "exists? " + item.getName()); + assertEquals(amount, calculations.get(item), 0.01, item.getName()); + }); + } +} \ No newline at end of file