Refactor Kelp Profit Calculator to include buy kelp option and update pricing constants

This commit is contained in:
ZareMate 2026-03-24 23:45:04 +01:00
parent 4a7adf1006
commit 88cac0c5e9
2 changed files with 56 additions and 6 deletions

View File

@ -17,10 +17,11 @@ except Exception as exc:
# EDIT VALUES HERE (CONFIG)
# =========================
KELP_PRICE = 61.6 # per kelp item
KELP_PRICE = 61 # per kelp item
BLAZE_ROD_PRICE = 150 # per blaze rod
DRIED_KELP_PRICE = 86 # per dried kelp item
DRIED_KELP_BLOCK_PRICE = 751.01 # per dried kelp block
DRIED_KELP_PRICE = 83.18 # per dried kelp item
DRIED_KELP_BLOCK_PRICE = 750.5 # per dried kelp block
BUY_KELP = True # True = buy kelp, False = use owned kelp
SMOKERS = 64 # amount of smokers
KELP_AMOUNT = "1s" # amount of kelp to process (items)
@ -141,6 +142,7 @@ def calculate(
dried_kelp_block_price: float,
smokers: int,
kelp_amount: int,
buy_kelp: bool,
) -> dict:
if smokers <= 0:
@ -160,7 +162,11 @@ def calculate(
total_hours = total_minutes / 60
# --- Scenario 1: Smelt and sell dried kelp ---
kelp_cost = kelp_amount * kelp_price
kelp_market_value = kelp_amount * kelp_price
# In owned mode we still use kelp market value as opportunity cost,
# but label it as raw kelp profit in the UI.
kelp_cost = kelp_market_value
kelp_value_label = "Kelp Cost" if buy_kelp else "Raw Kelp Profit"
cost_smelt_only = kelp_cost + fuel_cost
revenue_smelt_only = dried_kelp_out * dried_kelp_price
profit_smelt_only = revenue_smelt_only - cost_smelt_only
@ -175,7 +181,7 @@ def calculate(
profit_craft_only = revenue_craft_only - cost_craft_only
# --- Scenario 3: Smelt then craft, sell blocks + leftover dried kelp ---
cost_smelt_then_craft = kelp_amount * kelp_price + fuel_cost
cost_smelt_then_craft = kelp_cost + fuel_cost
revenue_smelt_then_craft = (blocks_from_amount * dried_kelp_block_price) + (leftover_dried * dried_kelp_price)
profit_smelt_then_craft = revenue_smelt_then_craft - cost_smelt_then_craft
@ -185,6 +191,7 @@ def calculate(
print(f"BLAZE_ROD_PRICE: {blaze_rod_price}")
print(f"DRIED_KELP_PRICE: {dried_kelp_price}")
print(f"DRIED_KELP_BLOCK_PRICE: {dried_kelp_block_price}")
print(f"BUY_KELP: {buy_kelp}")
print(f"SMOKERS: {smokers}")
print(f"KELP_AMOUNT: {kelp_amount}")
@ -213,12 +220,15 @@ def calculate(
"blaze_rod_price": blaze_rod_price,
"dried_kelp_price": dried_kelp_price,
"dried_kelp_block_price": dried_kelp_block_price,
"buy_kelp": buy_kelp,
"smokers": smokers,
"kelp_amount": kelp_amount,
"dried_kelp_out": dried_kelp_out,
"blocks_from_amount": blocks_from_amount,
"leftover_dried": leftover_dried,
"blaze_rods_used": blaze_rods_used,
"kelp_market_value": kelp_market_value,
"kelp_value_label": kelp_value_label,
"kelp_cost": kelp_cost,
"fuel_cost": fuel_cost,
"total_seconds": total_seconds,
@ -241,6 +251,7 @@ def format_results(data: dict) -> str:
f"BLAZE_ROD_PRICE: {data['blaze_rod_price']}\n"
f"DRIED_KELP_PRICE: {data['dried_kelp_price']}\n"
f"DRIED_KELP_BLOCK_PRICE: {data['dried_kelp_block_price']}\n"
f"BUY_KELP: {data['buy_kelp']}\n"
f"SMOKERS: {data['smokers']}\n"
f"KELP_AMOUNT: {data['kelp_amount']}\n\n"
"=== Results ===\n"
@ -275,6 +286,7 @@ def main():
dried_kelp_block_price=parse_number_with_suffix(DRIED_KELP_BLOCK_PRICE),
smokers=parse_int_with_suffix(SMOKERS, "SMOKERS"),
kelp_amount=parse_kelp_amount(KELP_AMOUNT),
buy_kelp=BUY_KELP,
)
print(format_results(data))
@ -320,6 +332,18 @@ def launch_ui():
bordercolor="#2b2d31",
insertcolor="#f2f3f5",
)
style.configure("SourceOn.TButton", font=("Segoe UI", 9, "bold"), padding=7)
style.map(
"SourceOn.TButton",
background=[("active", "#4752c4"), ("!disabled", "#5865f2")],
foreground=[("!disabled", "#ffffff")],
)
style.configure("SourceOff.TButton", font=("Segoe UI", 9, "bold"), padding=7)
style.map(
"SourceOff.TButton",
background=[("active", "#3a3d42"), ("!disabled", "#2b2d31")],
foreground=[("!disabled", "#dbdee1")],
)
style.configure("Dark.Vertical.TScrollbar", background="#2b2d31", troughcolor="#1e1f22")
@ -358,6 +382,7 @@ def launch_ui():
]
entries = {}
buy_kelp_var = tk.BooleanVar(value=BUY_KELP)
ttk.Label(input_card, text="Inputs", style="FieldLabel.TLabel").grid(
row=0, column=0, columnspan=2, sticky="w", pady=(0, 10)
@ -372,6 +397,28 @@ def launch_ui():
entry.grid(row=row + 1, column=1, sticky="ew", pady=6)
entries[label_text] = entry
source_row = ttk.Frame(input_card, style="Card.TFrame")
source_row.grid(row=len(fields) + 1, column=0, columnspan=2, sticky="ew", pady=(10, 2))
source_row.grid_columnconfigure(1, weight=1)
ttk.Label(source_row, text="Kelp Source", style="FieldLabel.TLabel").grid(row=0, column=0, sticky="w", padx=(0, 8))
source_toggle_btn = ttk.Button(source_row)
source_toggle_btn.grid(row=0, column=1, sticky="ew")
def refresh_source_toggle():
if buy_kelp_var.get():
source_toggle_btn.configure(text="Buying Kelp (click to use owned)", style="SourceOn.TButton")
else:
source_toggle_btn.configure(text="Using Owned Kelp (click to buy)", style="SourceOff.TButton")
def toggle_kelp_source():
buy_kelp_var.set(not buy_kelp_var.get())
refresh_source_toggle()
on_calculate()
source_toggle_btn.configure(command=toggle_kelp_source)
refresh_source_toggle()
kpi_row = ttk.Frame(results_card, style="Card.TFrame")
kpi_row.grid(row=0, column=0, sticky="ew")
kpi_row.grid_columnconfigure(0, weight=1)
@ -418,7 +465,8 @@ def launch_ui():
fuel_cost_value = ttk.Label(fuel_card, text="0.00", style="KpiValueProfit.TLabel")
fuel_cost_value.pack(anchor="w")
ttk.Label(kelp_card, text="Kelp Cost", style="KpiLabel.TLabel").pack(anchor="w")
kelp_cost_label = ttk.Label(kelp_card, text="Kelp Cost", style="KpiLabel.TLabel")
kelp_cost_label.pack(anchor="w")
kelp_cost_value = ttk.Label(kelp_card, text="0.00", style="KpiValueProfit.TLabel")
kelp_cost_value.pack(anchor="w")
@ -470,6 +518,7 @@ def launch_ui():
dried_kelp_block_price=parse_number_with_suffix(entries["Dried Kelp Block Price (k/m/b)"].get()),
smokers=parse_int_with_suffix(entries["Smokers (k/m/b)"].get(), "SMOKERS"),
kelp_amount=parse_kelp_amount(entries["Kelp Amount (items k/m/b or s/ks/ms/bs)"].get()),
buy_kelp=buy_kelp_var.get(),
)
except ValueError as exc:
messagebox.showerror("Invalid input", str(exc))
@ -499,6 +548,7 @@ def launch_ui():
smelt_time_value.configure(text=format_duration(data["total_seconds"]))
fuel_cost_value.configure(text=money(data["fuel_cost"]))
kelp_cost_label.configure(text=data["kelp_value_label"])
kelp_cost_value.configure(text=money(data["kelp_cost"]))
result_text.delete("1.0", tk.END)