diff --git a/__pycache__/kelp_profit_calculator.cpython-314.pyc b/__pycache__/kelp_profit_calculator.cpython-314.pyc index 6a3ea84..56c6e63 100644 Binary files a/__pycache__/kelp_profit_calculator.cpython-314.pyc and b/__pycache__/kelp_profit_calculator.cpython-314.pyc differ diff --git a/kelp_profit_calculator.py b/kelp_profit_calculator.py index e45ff31..836237e 100644 --- a/kelp_profit_calculator.py +++ b/kelp_profit_calculator.py @@ -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)