From 88cac0c5e9d79505e282306c06e638bf6f7d4e42 Mon Sep 17 00:00:00 2001 From: ZareMate <0.zaremate@gmail.com> Date: Tue, 24 Mar 2026 23:45:04 +0100 Subject: [PATCH] Refactor Kelp Profit Calculator to include buy kelp option and update pricing constants --- .../kelp_profit_calculator.cpython-314.pyc | Bin 27539 -> 29804 bytes kelp_profit_calculator.py | 62 ++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/__pycache__/kelp_profit_calculator.cpython-314.pyc b/__pycache__/kelp_profit_calculator.cpython-314.pyc index 6a3ea84a15d65709183e77acec505740169cbd38..56c6e630bfcf7c35ccda85fb1acb3114040b36de 100644 GIT binary patch delta 8372 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 delta 6689 zcmaJ_3v^t?d7jz3@Aqoo@0VVyw`55xzmQ}}w&jN`kL)W0da#mK^4gMCzPkqOHb*8W zP-sGq@r2-%p4O+QC6F}1L1{Tj$N>W>J?Vj5>TKdJIW28z8&jaySUEI6lKyjdB}+hh zkMzwq|NqbHpMPd&=AB<+`g3fqH=FbbzB>+G$^6C9N6a4l(?@FdEKl_0O+=eFPpI;i z31i+mq08HdZUPfMF%Tm$5i_wgEAth^>PE!oM)TIZom2p~%iKX6z@0L85*Ki{%w5C- z+$(c8@d5YC+(QDugEIG$klTRrJ`#4Lynj6K$j4E;KZ@E}FX0O#g5zjBL|d>M`{-WW z?WP3hwY}O5&YVF(DLy(&M2hBJp-iU%)P^P<((J z=!c3N;3D_uxMjtxd_@7t&(xI|_pf}Unc^UsFx-#v_{v+xC?r&E{w7YZJY)WdgXG&4 zEm&`cesS=BbDl04tEt&Bpl;U0Q9?`8jw!cb1yzC*Dj*Rm0gB3*%ygdK-~!7JK{huE za1MQd?!s7oL&jfNof5~gZ#jLEijh?{at9=hOtmN&lXNoGBeP91$kd1`oRUeVW~A2N zurMmPq3&rlz}lw+BKP$RDun1)oCi(nF~yp4SV?c}bW+Y0v1vw6HGsw1x1^=*t{Rn& z*G=r8L$1j3=3WN$V!fhORH! zcU9T>R`6Dy+tiGmxAPU78ggvzD6ierP3I?T;BE8|-TttPck#|m^|;3%fJz_X zXvE{Bf8%yzp8l)Xht>4AZa=5t6&E~y%w6z!IUTQLiJn(Mf(^3$L!O|5S3}-p=B-9V zEW8cSdco_)HfG?g;58tykFAdxat=_NoMV=?ws|crdZS(!uOn^~A|75(ypZ~MgPi*5 zC8#dIsxt*Ql(Mi=rqBk7gGuPCUL$q`i_v4gc-%7@**Iq2voW{i<+(9E4Y^(PHJ@qO z*NjM%M^l)@cnlcl6@ZmI2Ux``0jqfxU=6PZtmUnM3El=+$7=xVc_Uy0uLW%6b%0I0 z9rXPCDa{(1-mOS6T!AhUw+7jz&Yf zSI&ka82jnt;c$2soF-%#oMaGWFwbCt!3p~B;e=t4(K!aksXLOuS=t-v@GLRGDFy??|uLTqSAXUxaFtG{o>F>AvsY9PKrvOq;wh8*R+oFCnOHo zn_BP1Zb=19QX`#T3^Yg@meC?zRE%{=I+oERUB&sNWMJHgbguJ%Aek69Bc1nRlVoAs zigZCSwA>=uSgxX^u`}*KIv=#*WZZ>xj`O!mZpJ+&?q%GEbe@Yr$x|kT>c1;_he^qJK)H4}!(dQ~>)sx^x!A{@f!tr;2=6nEb zCk(TV5a3T85=;IvF6Zd0W-o_s{(?SG^<5gPuF#l=Fc0g9j#Q6DZf#;lG=zzJ2#>9A zUtr{+wi>U>3sMbzqq=qsM7{>rT=^pb6Dt;!YYc7Dgk?=c)X;5Z15O z_24CHuHS=CQNF$d3-n9%4IviU38hfW?C)m4qFiVJcnS-jr$4I?FW(Otd2&>8sDGdg z=#Jr=h@pfOI=3X#H{Je=2MX?l=&F-cvQCNX17)g4!KfH*D+IQP{&qOqVePcxA0v+f#`5im_diLDuVWA9j?v5jnjVy^kIe?Uj;A z)*5k@r%cVr8@xDP@YIX$2FW68&5A~UnO2}cu0WV#wczDCj0xGaTbO$ax+N^~^>M}dp|m;8l5<5gFa=xmmvvPlHDgi3TZ zhQdux&Rp&;H1%B#^^3s)DK4AD@NR4@^Gam0oevj`(My%0p+>5b4JuJ>!#Ztjy&PUH zH1xhuDc0{}+uEJ1CoSGF6&aEjF$8l4MuhydG_RIa^)&qt1gIAk| z#KuEXLT;-T5968=U#&y6jZYpC+Xf1ayRX*l5v%t~^|H}&9UjE}xRhIMLPpzphv;f9 z*jla{T19=E)GV7dDYn#?=xQ5kXua$ZJBJFbhpyHSi*<*kEwW7;CU|R!uXdIzYAo2A zt{R#}eT$TojXH5_nXY!B*3QfAGvfAes!yC#D!GlqZKTU^^curQ2NrLuvM(O1N zC9VTj1vuAP#nmMh^u9Jb9qx8%6r>(*7!CCK&N$adny77uvn+2WHd!7t;0ZLLAdMtV zT4;B&nVW?cP9>{Utz?e0(Z`dl-Ydycy}ijsS?}$tvbB=qq%Elg2f`OdJREs@ykMK@ zsxm!9D+8Hbr|CG$*Po>3#|B~I|#LU$1Svx_dbm1f#V`iL9kkM%`2$xWpH zGwn@f`|keD_GU8hnfB(gy}LWAf_9Ubjg~o)>xMYA+!l61e1R8_Z}Pn5Q+{NUPy11p zZuFzZQt~6s+!lxRu}Zhdp7oCN}tOt;|EcpZ1%T?EcJgS;-#a1HaAnZ1#hV z?ENfzyAAvR_G|N-^^SNc?sTsE{M;^&YVcDfL2BDv&Nt%QRPM{$TpA_WNA`m^uXOt9 z<$k4VCs`o3tVA~fo2oTKq+#U;5rA<=Cmt8-?}NHLEhuFY>Zv| za2!^Q+r2?{>n1gP8(U>jJ2?pJEDAfDg%~IF6MC{phLYubXf`wwD#tdg9eHi`uu>X3 zIW!U)-bHbn-BL-0*H+?^gLkk z%uHr+E};-EKwfy13Drji7W2ZHvzmBox^=d#?JO;7PXSr!d>A$xl6 z_;hwYDup*QKuHCk3(CkjpnSvzh>|afCMh8?#ayLj~5l6 ztai-=&fAxmCHIL+&KgG+()0Pqu#lb2sPYLce3vc{KeX>W7#9_@b46un3NJGFO%O=dbZ4-I^u71c~<7Zy@reTfbou2M7i3SXsX4iChL7NH&5 zl;Irmqp@=EA~aV1H9=^^NZ&lX6B}uW?Bt9@K_g^4r0^(0TIs7q4_pbnmMTV^z}3K8 z3`Dbj7^1&BT1g)piP7heIO%I6&GdV~!$&Sr%){P)6z*q7m@YuQM`QFikd7XWVLN@{ zh=YFlXfrm+?6naS{TI;x5dPzQjH?(9vZY1u}}%wjqXllw9= z`4NM^WAF+yiPBUMj$dOl=5tKe15o7V(s>#iuQU{O)7iz@%-m@qP4|zt;`{06#%o;; z;q%P2o0)2sSS03i!t3-0V&`BXk#3{%^k zVT;I4uMa{{{TiN66bAb8#07SYb(kOQmpm&cC*M;9)rVTpPg)Ga)!a|EM~0)E7*zoW zH(i0&Xm-lKO#*VAZQl^pj0-mzynjn@UH3@=d&L6_`tnp0{{e8=OJ?OSp}g*b{PhZE z@V^Xx4FDSk`!TxCo_N8+%H$tyg0h9&H1L~W(Yf$wlBMw%g(2AB>^Y=ZcSMlnnL)H3FI!-6pcsrPxkV?g9mzd9T+GY$?3&> zW`SB}Jop-|or&QB-9IC=Kg3G>F#|X=BH>F6AvCj%ID1<1by+Q>wPotj z^?K(CCHFRmPbldZPfbomggi7-)Z|ZQ7V~LAxCS|a?R5gXA_xc?6chkO-N3!m>7{%o zyC|;%;s5oha1Sdizo^_x4-2u%b1W}k=-AawU}Gt2CnpzE3+c&8LC0D-Lmv}b^c_Iq z59NC4>%w+w%Z+;3L;kOJbMO%Mem~aZ$osxNB|LuY)6)BLI}}+feLj~^+-s$8=eqW} z(Um4mp95V 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)