diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml index 2937e44..c363388 100644 --- a/.idea/dictionaries/project.xml +++ b/.idea/dictionaries/project.xml @@ -5,6 +5,7 @@ callanite caterium heatsink + kyalite larrussite quickwire siterite diff --git a/main.py b/main.py index fc72dda..ffc5e1b 100644 --- a/main.py +++ b/main.py @@ -50,6 +50,7 @@ class ProductionChain: self.excess: Dict[Items, float] = defaultdict(float) self.byproduct: Dict[Items, float] = defaultdict(float) self.preferred_recipes = preferred_recipes or {} + self.preferred_recipes[Items.Steam] = Recipes.SteamMk1.value def get_recipe(self, item: Items) -> Optional[Recipe]: if item in self.preferred_recipes: @@ -98,6 +99,7 @@ class ProductionChain: continue levels = [] + for out, quantity in recipe.outputs.items(): if out in demand: target_quantity = demand[out] - production[out] @@ -365,6 +367,27 @@ def index(): "building": "", "rate": target_rates_by_item[item_name], }) + # If there is excess of this item, show it as a destination + if item_name in excess and excess[item_name] > 0: + dests.append({ + "recipe": f"Excess: {item_name}", + "building": "", + "rate": excess[item_name], + }) + # Also list byproducts produced by this step's recipe at the computed level + # Find this step's recipe and level to compute byproduct rates + rec_obj = prod_chain.recipe_name_to_obj.get(s["recipe"]) if hasattr(prod_chain, "recipe_name_to_obj") else None + if rec_obj is not None: + # Find buildings_float for this step (already stored on s) + lvl = s.get("buildings_float", 0.0) + for byp_item, per_building in rec_obj.byproducts.items(): + rate = lvl * per_building + if rate > 0: + dests.append({ + "recipe": f"Byproduct: {byp_item.value.name}", + "building": "", + "rate": rate, + }) # Sort destinations by descending rate for display dests.sort(key=lambda x: x["rate"], reverse=True) s["destinations"] = dests @@ -457,4 +480,4 @@ if __name__ == "__main__": # For local dev: python main.py app.run(host="0.0.0.0", port=5000, debug=True) # prod_chain = ProductionChain() - # prod_chain.compute_chain({Items.CateriumHeatsink: 10.0}) \ No newline at end of file + # prod_chain.compute_chain({Items.SteelBeam: 3.0}) \ No newline at end of file diff --git a/plus.py b/plus.py index 4f40908..1fd83ad 100644 --- a/plus.py +++ b/plus.py @@ -15,6 +15,7 @@ class Machines(Enum): FlexibleBlastFurnace = Machine(name="Flexible Blast Furnace") Reformer = Machine(name="Reformer") WetWasher = Machine(name="Wet Washer") + BoilerMk1 = Machine(name="Boiler Mk1") class Items(Enum): @@ -88,6 +89,21 @@ class Items(Enum): ColdSlag = Item(name="Cold Slag") FanBlades = Item(name="Fan Blades") TailingsSlurry = Item(name="Tailings Slurry") + CarbonPowder = Item(name="Carbon Powder") + Coal = Item(name="Coal") + MoltenSteel = Item(name="Molten Steel") + FlueGas = Item(name="Flue Gas") + SteelIngot = Item(name="Steel Ingot") + Air = Item(name="Air") + SteelBeam = Item(name="Steel Beam") + SteelPipe = Item(name="Steel Pipe") + SteelBolt = Item(name="Steel Bolt") + SteelRod = Item(name="Steel Rod") + Stator = Item(name="Stator") + Kyalite = Item(name="Kyalite") + Salt = Item(name="Salt") + Diamonds = Item(name="Diamonds") + QuartzCrystal = Item(name="Quartz Crystal") class RawResources(Enum): Water = Items.Water @@ -95,6 +111,9 @@ class RawResources(Enum): LarrussiteOre = Items.LarrussiteOre CallaniteOre = Items.CallaniteOre AuroviteOre = Items.AuroviteOre + Kyalite = Items.Kyalite + Coal = Items.Coal + Air = Items.Air class Recipe(BaseModel): @@ -122,9 +141,9 @@ class Recipes(Enum): building=Machines.Crusher, outputs={ Items.CrushedLarrussite: 40.0, - Items.CrushedGangue: 20.0, }, inputs={Items.LarrussiteOre: 60.0}, + byproducts={Items.CrushedGangue: 20.0,} ) CrushedCallanite = Recipe( name="Crushed Callanite", @@ -144,6 +163,15 @@ class Recipes(Enum): }, inputs={Items.AuroviteOre: 60.0}, ) + CrushedSilica = Recipe( + name="Crushed Silica", + building=Machines.Crusher, + outputs={ + Items.Silica: 60.0, + Items.Sand: 40.0, + }, + inputs={Items.Kyalite: 60.0}, + ) # - Crushing Powders CoarseSand = Recipe( name="Coarse Sand", @@ -161,7 +189,14 @@ class Recipes(Enum): }, inputs={Items.CrushedMagnesium: 80.0}, ) - + CarbonPowder = Recipe( + name="Carbon Powder", + building=Machines.Crusher, + outputs={ + Items.CarbonPowder: 40.0 + }, + inputs={Items.Coal: 80.0}, + ) # Sorter # - Simple Sorting CrushedIron = Recipe( @@ -190,9 +225,11 @@ class Recipes(Enum): outputs={ Items.CrushedZinc: 96.0, Items.Sand: 48.0, - Items.CrushedGangue: 60.0, }, inputs={Items.CrushedLarrussite: 120.0}, + byproducts={ + Items.CrushedGangue: 60.0, + } ) CrushedCaterium = Recipe( name="Crushed Caterium", @@ -204,6 +241,30 @@ class Recipes(Enum): }, inputs={Items.CrushedAurovite: 120.0}, ) + QuartzCrystal = Recipe( + name="Quartz Crystal", + building=Machines.Sorter, + outputs={ + Items.QuartzCrystal: 100.0, + Items.Salt: 40.0, + Items.Sand: 40.0, + }, + inputs={Items.Kyalite: 120.0}, + ) + # - Advanced Sorting + SaltKyalite = Recipe( + name="Salt (Kyalite)", + building=Machines.Sorter, + outputs={ + Items.Salt: 90.0, + Items.Silica: 45.0, + Items.Sand: 30.0, + }, + inputs={ + Items.Kyalite: 120.0, + Items.Water: 45.0, + }, + ) # Smelter # - smelting IronIngot = Recipe( @@ -411,6 +472,18 @@ class Recipes(Enum): outputs={Items.BrassPlates: 18.0}, inputs={Items.BrassIngot: 25.0}, ) + SteelBolt = Recipe( + name="Steel Bolt", + building=Machines.Constructor, + outputs={Items.SteelBolt: 37.5}, + inputs={Items.SteelRod: 12.5}, + ) + HighPressureDiamond = Recipe( + name="High Pressure Diamond", + building=Machines.Constructor, + outputs={Items.Diamonds: 1.0}, + inputs={Items.CarbonPowder: 20.0}, + ) # Foundry # - Building Parts SolarCell = Recipe( @@ -442,6 +515,25 @@ class Recipes(Enum): Items.TinIngot: 15.0, }, ) + # - Industrial Parts + SteelBeam = Recipe( + name="Steel Beam", + building=Machines.Foundry, + outputs={Items.SteelBeam: 22.5}, + inputs={ + Items.SteelIngot: 60.0, + Items.ZincIngot: 20.0 + }, + ) + CastSteelPipe = Recipe( + name="Cast Steel Pipe", + building=Machines.Foundry, + outputs={Items.SteelPipe: 45.0}, + inputs={ + Items.SteelIngot: 30.0, + Items.Sand: 24.0, + }, + ) # - Other ThermalSilica = Recipe( name="Thermal Silica", @@ -452,6 +544,15 @@ class Recipes(Enum): Items.MagnesiumGranules: 27.0, }, ) + SaltySlag = Recipe( + name="Salty Slag", + building=Machines.Foundry, + outputs={Items.ColdSlag: 15.0}, + inputs={ + Items.Salt: 22.5, + Items.MagnesiumGranules: 30.0, + }, + ) # Assembler # - Building Parts SmoothBeltDrive = Recipe( @@ -583,6 +684,15 @@ class Recipes(Enum): Items.CopperBusbars: 10.0, }, ) + Stator = Recipe( + name="Stator", + building=Machines.Assembler, + outputs={Items.Stator: 6.0}, + inputs={ + Items.SteelPipe: 18.0, + Items.TinnedWire: 36.0, + }, + ) # Flexible Blast Furnace # - Molten Metals MoltenIron = Recipe( @@ -619,7 +729,36 @@ class Recipes(Enum): Items.MoltenCopper: 20.0, }, ) + MoltenSteel = Recipe( + name="Molten Steel", + building=Machines.FlexibleBlastFurnace, + outputs={ + Items.MoltenSteel: 40.0, + Items.FlueGas: 30.0 + }, + inputs={ + Items.MoltenIron: 40.0, + Items.CarbonPowder: 40.0, + Items.Steam: 60.0 + }, + ) # Reformer + # - Cooling + CastSteelRod = Recipe( + name="Cast Steel Rod", + building=Machines.Reformer, + outputs={ + Items.SteelRod: 37.5, + }, + inputs={ + Items.MoltenSteel: 20.0, + Items.Water: 40.0, + }, + byproducts={ + Items.Steam: 40.0, + Items.ColdSlag: 15.0, + } + ) # - Ingots CastIronIngot = Recipe( name="Cast Iron Ingot", @@ -669,6 +808,20 @@ class Recipes(Enum): Items.Water: 15.0, } ) + CastSteelIngot = Recipe( + name="Cast Steel Ingot", + building=Machines.Reformer, + outputs={ + Items.SteelIngot: 90.0, + Items.FlueGas: 30.0, + Items.ColdSlag: 37.5, + }, + inputs={ + Items.CrushedGangue: 37.5, + Items.MoltenSteel: 30.0, + Items.Air: 30.0 + } + ) # Wet Washer # - Washing WashedIron = Recipe( @@ -707,5 +860,15 @@ class Recipes(Enum): Items.Water: 30.0, } ) + SteamMk1 = Recipe( + name="Steam Mk1", + building=Machines.BoilerMk1, + outputs={ + Items.Steam: 30.0, + }, + inputs={ + Items.Water: 15.0, + } + ) Recipe.model_rebuild() \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 2d7b46c..6193394 100644 --- a/templates/index.html +++ b/templates/index.html @@ -147,11 +147,10 @@ Done - Output Item Recipe - Building Inputs - Destinations + Output Items + Building Target rate Per-building output Buildings @@ -162,10 +161,8 @@ {% for s in result.steps %} - {{ s.item }} {{ s.recipe }} - {{ s.building }} - + {% if s.inputs and s.inputs|length > 0 %}
{% for inp in s.inputs %} @@ -176,7 +173,7 @@ None {% endif %} - + {% if s.destinations and s.destinations|length > 0 %}
{% for d in s.destinations %} @@ -187,6 +184,9 @@ None {% endif %} + {{ s.building }} + + {{ '%.2f'|format(s.target_rate) }} {{ '%.2f'|format(s.per_building_output) }} {{ '%.2f'|format(s.buildings_float) }} (~ {{ s.buildings }})