checkpoint
This commit is contained in:
1
.idea/dictionaries/project.xml
generated
1
.idea/dictionaries/project.xml
generated
@@ -5,6 +5,7 @@
|
|||||||
<w>callanite</w>
|
<w>callanite</w>
|
||||||
<w>caterium</w>
|
<w>caterium</w>
|
||||||
<w>heatsink</w>
|
<w>heatsink</w>
|
||||||
|
<w>kyalite</w>
|
||||||
<w>larrussite</w>
|
<w>larrussite</w>
|
||||||
<w>quickwire</w>
|
<w>quickwire</w>
|
||||||
<w>siterite</w>
|
<w>siterite</w>
|
||||||
|
|||||||
25
main.py
25
main.py
@@ -50,6 +50,7 @@ class ProductionChain:
|
|||||||
self.excess: Dict[Items, float] = defaultdict(float)
|
self.excess: Dict[Items, float] = defaultdict(float)
|
||||||
self.byproduct: Dict[Items, float] = defaultdict(float)
|
self.byproduct: Dict[Items, float] = defaultdict(float)
|
||||||
self.preferred_recipes = preferred_recipes or {}
|
self.preferred_recipes = preferred_recipes or {}
|
||||||
|
self.preferred_recipes[Items.Steam] = Recipes.SteamMk1.value
|
||||||
|
|
||||||
def get_recipe(self, item: Items) -> Optional[Recipe]:
|
def get_recipe(self, item: Items) -> Optional[Recipe]:
|
||||||
if item in self.preferred_recipes:
|
if item in self.preferred_recipes:
|
||||||
@@ -98,6 +99,7 @@ class ProductionChain:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
levels = []
|
levels = []
|
||||||
|
|
||||||
for out, quantity in recipe.outputs.items():
|
for out, quantity in recipe.outputs.items():
|
||||||
if out in demand:
|
if out in demand:
|
||||||
target_quantity = demand[out] - production[out]
|
target_quantity = demand[out] - production[out]
|
||||||
@@ -365,6 +367,27 @@ def index():
|
|||||||
"building": "",
|
"building": "",
|
||||||
"rate": target_rates_by_item[item_name],
|
"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
|
# Sort destinations by descending rate for display
|
||||||
dests.sort(key=lambda x: x["rate"], reverse=True)
|
dests.sort(key=lambda x: x["rate"], reverse=True)
|
||||||
s["destinations"] = dests
|
s["destinations"] = dests
|
||||||
@@ -457,4 +480,4 @@ if __name__ == "__main__":
|
|||||||
# For local dev: python main.py
|
# For local dev: python main.py
|
||||||
app.run(host="0.0.0.0", port=5000, debug=True)
|
app.run(host="0.0.0.0", port=5000, debug=True)
|
||||||
# prod_chain = ProductionChain()
|
# prod_chain = ProductionChain()
|
||||||
# prod_chain.compute_chain({Items.CateriumHeatsink: 10.0})
|
# prod_chain.compute_chain({Items.SteelBeam: 3.0})
|
||||||
169
plus.py
169
plus.py
@@ -15,6 +15,7 @@ class Machines(Enum):
|
|||||||
FlexibleBlastFurnace = Machine(name="Flexible Blast Furnace")
|
FlexibleBlastFurnace = Machine(name="Flexible Blast Furnace")
|
||||||
Reformer = Machine(name="Reformer")
|
Reformer = Machine(name="Reformer")
|
||||||
WetWasher = Machine(name="Wet Washer")
|
WetWasher = Machine(name="Wet Washer")
|
||||||
|
BoilerMk1 = Machine(name="Boiler Mk1")
|
||||||
|
|
||||||
|
|
||||||
class Items(Enum):
|
class Items(Enum):
|
||||||
@@ -88,6 +89,21 @@ class Items(Enum):
|
|||||||
ColdSlag = Item(name="Cold Slag")
|
ColdSlag = Item(name="Cold Slag")
|
||||||
FanBlades = Item(name="Fan Blades")
|
FanBlades = Item(name="Fan Blades")
|
||||||
TailingsSlurry = Item(name="Tailings Slurry")
|
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):
|
class RawResources(Enum):
|
||||||
Water = Items.Water
|
Water = Items.Water
|
||||||
@@ -95,6 +111,9 @@ class RawResources(Enum):
|
|||||||
LarrussiteOre = Items.LarrussiteOre
|
LarrussiteOre = Items.LarrussiteOre
|
||||||
CallaniteOre = Items.CallaniteOre
|
CallaniteOre = Items.CallaniteOre
|
||||||
AuroviteOre = Items.AuroviteOre
|
AuroviteOre = Items.AuroviteOre
|
||||||
|
Kyalite = Items.Kyalite
|
||||||
|
Coal = Items.Coal
|
||||||
|
Air = Items.Air
|
||||||
|
|
||||||
|
|
||||||
class Recipe(BaseModel):
|
class Recipe(BaseModel):
|
||||||
@@ -122,9 +141,9 @@ class Recipes(Enum):
|
|||||||
building=Machines.Crusher,
|
building=Machines.Crusher,
|
||||||
outputs={
|
outputs={
|
||||||
Items.CrushedLarrussite: 40.0,
|
Items.CrushedLarrussite: 40.0,
|
||||||
Items.CrushedGangue: 20.0,
|
|
||||||
},
|
},
|
||||||
inputs={Items.LarrussiteOre: 60.0},
|
inputs={Items.LarrussiteOre: 60.0},
|
||||||
|
byproducts={Items.CrushedGangue: 20.0,}
|
||||||
)
|
)
|
||||||
CrushedCallanite = Recipe(
|
CrushedCallanite = Recipe(
|
||||||
name="Crushed Callanite",
|
name="Crushed Callanite",
|
||||||
@@ -144,6 +163,15 @@ class Recipes(Enum):
|
|||||||
},
|
},
|
||||||
inputs={Items.AuroviteOre: 60.0},
|
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
|
# - Crushing Powders
|
||||||
CoarseSand = Recipe(
|
CoarseSand = Recipe(
|
||||||
name="Coarse Sand",
|
name="Coarse Sand",
|
||||||
@@ -161,7 +189,14 @@ class Recipes(Enum):
|
|||||||
},
|
},
|
||||||
inputs={Items.CrushedMagnesium: 80.0},
|
inputs={Items.CrushedMagnesium: 80.0},
|
||||||
)
|
)
|
||||||
|
CarbonPowder = Recipe(
|
||||||
|
name="Carbon Powder",
|
||||||
|
building=Machines.Crusher,
|
||||||
|
outputs={
|
||||||
|
Items.CarbonPowder: 40.0
|
||||||
|
},
|
||||||
|
inputs={Items.Coal: 80.0},
|
||||||
|
)
|
||||||
# Sorter
|
# Sorter
|
||||||
# - Simple Sorting
|
# - Simple Sorting
|
||||||
CrushedIron = Recipe(
|
CrushedIron = Recipe(
|
||||||
@@ -190,9 +225,11 @@ class Recipes(Enum):
|
|||||||
outputs={
|
outputs={
|
||||||
Items.CrushedZinc: 96.0,
|
Items.CrushedZinc: 96.0,
|
||||||
Items.Sand: 48.0,
|
Items.Sand: 48.0,
|
||||||
Items.CrushedGangue: 60.0,
|
|
||||||
},
|
},
|
||||||
inputs={Items.CrushedLarrussite: 120.0},
|
inputs={Items.CrushedLarrussite: 120.0},
|
||||||
|
byproducts={
|
||||||
|
Items.CrushedGangue: 60.0,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
CrushedCaterium = Recipe(
|
CrushedCaterium = Recipe(
|
||||||
name="Crushed Caterium",
|
name="Crushed Caterium",
|
||||||
@@ -204,6 +241,30 @@ class Recipes(Enum):
|
|||||||
},
|
},
|
||||||
inputs={Items.CrushedAurovite: 120.0},
|
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
|
# Smelter
|
||||||
# - smelting
|
# - smelting
|
||||||
IronIngot = Recipe(
|
IronIngot = Recipe(
|
||||||
@@ -411,6 +472,18 @@ class Recipes(Enum):
|
|||||||
outputs={Items.BrassPlates: 18.0},
|
outputs={Items.BrassPlates: 18.0},
|
||||||
inputs={Items.BrassIngot: 25.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
|
# Foundry
|
||||||
# - Building Parts
|
# - Building Parts
|
||||||
SolarCell = Recipe(
|
SolarCell = Recipe(
|
||||||
@@ -442,6 +515,25 @@ class Recipes(Enum):
|
|||||||
Items.TinIngot: 15.0,
|
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
|
# - Other
|
||||||
ThermalSilica = Recipe(
|
ThermalSilica = Recipe(
|
||||||
name="Thermal Silica",
|
name="Thermal Silica",
|
||||||
@@ -452,6 +544,15 @@ class Recipes(Enum):
|
|||||||
Items.MagnesiumGranules: 27.0,
|
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
|
# Assembler
|
||||||
# - Building Parts
|
# - Building Parts
|
||||||
SmoothBeltDrive = Recipe(
|
SmoothBeltDrive = Recipe(
|
||||||
@@ -583,6 +684,15 @@ class Recipes(Enum):
|
|||||||
Items.CopperBusbars: 10.0,
|
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
|
# Flexible Blast Furnace
|
||||||
# - Molten Metals
|
# - Molten Metals
|
||||||
MoltenIron = Recipe(
|
MoltenIron = Recipe(
|
||||||
@@ -619,7 +729,36 @@ class Recipes(Enum):
|
|||||||
Items.MoltenCopper: 20.0,
|
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
|
# 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
|
# - Ingots
|
||||||
CastIronIngot = Recipe(
|
CastIronIngot = Recipe(
|
||||||
name="Cast Iron Ingot",
|
name="Cast Iron Ingot",
|
||||||
@@ -669,6 +808,20 @@ class Recipes(Enum):
|
|||||||
Items.Water: 15.0,
|
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
|
# Wet Washer
|
||||||
# - Washing
|
# - Washing
|
||||||
WashedIron = Recipe(
|
WashedIron = Recipe(
|
||||||
@@ -707,5 +860,15 @@ class Recipes(Enum):
|
|||||||
Items.Water: 30.0,
|
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()
|
Recipe.model_rebuild()
|
||||||
@@ -147,11 +147,10 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="done-col">Done</th>
|
<th class="done-col">Done</th>
|
||||||
<th>Output Item</th>
|
|
||||||
<th>Recipe</th>
|
<th>Recipe</th>
|
||||||
<th>Building</th>
|
|
||||||
<th>Inputs</th>
|
<th>Inputs</th>
|
||||||
<th>Destinations</th>
|
<th>Output Items</th>
|
||||||
|
<th>Building</th>
|
||||||
<th class="mono">Target rate</th>
|
<th class="mono">Target rate</th>
|
||||||
<th class="mono">Per-building output</th>
|
<th class="mono">Per-building output</th>
|
||||||
<th class="mono">Buildings</th>
|
<th class="mono">Buildings</th>
|
||||||
@@ -162,10 +161,8 @@
|
|||||||
{% for s in result.steps %}
|
{% for s in result.steps %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="done-col"><input type="checkbox" onchange="toggleDone(this)"></td>
|
<td class="done-col"><input type="checkbox" onchange="toggleDone(this)"></td>
|
||||||
<td>{{ s.item }}</td>
|
|
||||||
<td>{{ s.recipe }}</td>
|
<td>{{ s.recipe }}</td>
|
||||||
<td>{{ s.building }}</td>
|
<td>
|
||||||
<td>
|
|
||||||
{% if s.inputs and s.inputs|length > 0 %}
|
{% if s.inputs and s.inputs|length > 0 %}
|
||||||
<div>
|
<div>
|
||||||
{% for inp in s.inputs %}
|
{% for inp in s.inputs %}
|
||||||
@@ -176,7 +173,7 @@
|
|||||||
<span class="pill">None</span>
|
<span class="pill">None</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% if s.destinations and s.destinations|length > 0 %}
|
{% if s.destinations and s.destinations|length > 0 %}
|
||||||
<div>
|
<div>
|
||||||
{% for d in s.destinations %}
|
{% for d in s.destinations %}
|
||||||
@@ -187,6 +184,9 @@
|
|||||||
<span class="pill">None</span>
|
<span class="pill">None</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
<td>{{ s.building }}</td>
|
||||||
|
|
||||||
|
|
||||||
<td class="mono">{{ '%.2f'|format(s.target_rate) }}</td>
|
<td class="mono">{{ '%.2f'|format(s.target_rate) }}</td>
|
||||||
<td class="mono">{{ '%.2f'|format(s.per_building_output) }}</td>
|
<td class="mono">{{ '%.2f'|format(s.per_building_output) }}</td>
|
||||||
<td class="mono">{{ '%.2f'|format(s.buildings_float) }} (~ {{ s.buildings }})</td>
|
<td class="mono">{{ '%.2f'|format(s.buildings_float) }} (~ {{ s.buildings }})</td>
|
||||||
|
|||||||
Reference in New Issue
Block a user