From 9c2967123e26d538fb9e16fac10aa93724b49433 Mon Sep 17 00:00:00 2001 From: MiraclePatrickLumowa Date: Sat, 18 Oct 2025 02:19:11 +0800 Subject: [PATCH] save file restore --- Extension/Wplace-AutoBot.zip | Bin 0 -> 964599 bytes Extension/scripts/Auto-Image.js | 22997 +++++++++++++++--------------- 2 files changed, 11515 insertions(+), 11482 deletions(-) create mode 100644 Extension/Wplace-AutoBot.zip diff --git a/Extension/Wplace-AutoBot.zip b/Extension/Wplace-AutoBot.zip new file mode 100644 index 0000000000000000000000000000000000000000..d04a0bba27c34e6ac64600d4d94280ab9690891e GIT binary patch literal 964599 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�ABWfF!Vjmc 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�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%0ACsF}_c9b*mT5sN;e;#aA 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%0Ac48qfefk=f@cyT^CN{5I1#_M1#|0&E@NDN4IX7 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

q3~7m)1l;J)T~Va{nc>i#FK6}W>S=qYbl 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%0A}-r+Od!@b_^*AJfS-tOJ56H531 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

  • 6Ad{dYD}}`goT%Bg!eej0Ru1-z{4?)ztK2=G=0y)L*pt zGOUjbh~Xipkd_b$r8xgHHJF!zY1x`cf?~wV24|>jxy=e+nK%hztfSFh_R!#fiX$1W7**gs4f?B4`P5>!UVlSYze{T<0m2DLf{w1nE8ti%b&;p7cT_CM%$%1wGQ zcb1^91sqnTDaIq`g8ze4pj+vx$+?a%bS)rLhL%J_t_#24K5c}2i>9lv9-M&(ho-)F zbOu-qd{>ajJv{)fpJP+CkcH`sFQ7t}E~(3A$_licp`*~PCQaPDjl#h>P%bSUI?d=@rf+TZe<-%gd_@L)o@e0qE36efsI(LpHg&i6bkyRKQ-wZWE{ zy}=O@${7_+BM4HCK$JAC)6D4z@YHoX#eeKcP92Q*yzcj3O$FM*x#L2H)I`NSq>|fA z-_gsh#|N@(XH}%v{WuAlBBTS za~NWm6AS%j3J3IZ%`-aY^ZWu}BliP6X1 zy*Akv7vKhiR?aK0X#Ed_OHqJEX7L_&=F!-fjPp>ptEd{toYIk$X7dlWb=*|G?o0(C ziacStqQQcNPOWsDH5q#)+?t3%aBq9aR-;wDoO^!dKyH|-<5)vEss3W}5Oyk9DkD>; z3^#)lu6P56_LQ0$)!g#lJ2g0*mH|#>8XZL&K^o2Uq+x9wW&o|eNYhRfL~arL-M{I@ z*Vj+Nd6ZaNEf#H7;6blsyDNVvf0vFD5WKKafdZ~c#S32l3^hs&VaMfPL+dZ$_sZOD ztjrk|T|u${O-;=j$(Z6Sb~ko0Yyvv;K}P4m&vgqGzx8#~iB?mmI<^#FhjR?IWdJXj zBAKcPb}Y$m3Z-m0o@N3IYrPA7VG$ypINvD3IZSc!9}sjW_()vVx){)QE*^7>A|;x> z(BalJ^NIErLYP^hd}{2@=t(`J$nnn%4DW%7+9^ZBXA-d69?ukdn9^~U{w0L;cn%WC z%sjC)N$HdGW5{@@R!^{=F7(VhPu!g8_D1G@%SZW0@m|{qE)BIe(j6 z8Hog0@VMABti;SFOK{GYN_KS)M=vgj&*s|AXf8k(wu(6mre2wRz+oz{D-)Slkr^5S z;Z{C}@+g;<{5O)^-ub{rPwMCq$u+jN>&KV6u)Dc^rsv{`A{gkFRI^-D$zNNo@xp1% zCPo`oQ~+a!n#l#a#ulClEkf&t^geTZ)4IW(nXZ`PF4O z0`k9$X#j$Q{>APLEOp;)uAx6IAn#kCO({!P>lGh!VMaOSC8twO(t&;^kqYlV)YRbqKaJ zlOjk%oCg4)SeFz(!HPJKl2eo=`+`(uTVC9>%o~V1q^@P^_G#Dk_i_?DcBKF}>xR@& zD|M%%`+XMDnUO!*d(fBG>HKx@zuYmhK=EUs&QtAompE;l0mkBMU?=jp+5i99*}b--1oF=eUi{|W_HXNFw4Q7qn-jF?8gl13+xqN+I?YMbEuZ=|G7tjlDZv`J7%e#A)}cyi3-V{IPw)L7cQ8GY0!O>%LQ2raIN54U_q%x zn48eBHCXwOQHH9LtCX*l%+R^pj*4@?xy37S$+@0rGBg9c2GiSUIMb)r} z{q$;5ayWc7HzFD~4}!5M^`6V#eXf?Tdl^uZnuWK<3!E?Vin~w)jz-niyzf@&)Yjn% zvI;6A0o;^QxDvn~$;k1(XJ7hw-TtIC_kEH+y-)~;INVJ!DdM;HHt@Y3@rImuSNokPDqNu9i{fb6?Tow1L>Ir@2v zKv*<8htn+jyV|N8944P z53%rvPDrMVSX}if60dFp&dE_s*20}rh@(Zolw8~LasX%j$6yHirP)Ua9Y7kQ$+4$= zoiBNzY64*Upqc^kD{63gR)jicF^PN7=@?}Lv~;I3aSb4c5pT&)xtyuQgZGK#=m>Vr zJUi?gY0tlO8%ZGiRsPr@wcCPeEaoPQbkOHCKNm~uLL4%{KS$bG8v7k&W%YdqKrjRg z3G$3#${6Go7*Ew(P|UuNIE)O==dN;Rg=4PNk-ltX0JIAYWuu3})0uSV0>Cf*Z~ZIt z=peC<(SjZHY-ZTk*-%>OICByJor!NNTu67MI$8wxOHsp9!6WRa{_`B<365E$XGNbb zpOcjwW9HGY5d(XWEZ<|L11t=K8yrn+z+k~_VsQsv(6d`pq>jaec3JQYqK9jw-S=;9 zo6a1j6X(mVEH|@vpKu-mnB-5#2Q+T_EyLzE&UkPqv@dk^@66hBb zh?1=Gnax8grbRrovqE$m$%2@0r|p4kjO?=eF0T|QRQC#XX=Z{SV0gx1!TutWn$19i z3d!Qao>35Wsp+Z4|F9b1yq@SN?EVs`wf*T?D1sr*Llo8?XXF3^O)xl;{6Nr08SQgx zKqG~AuwAY@L*PO{rviJNvux1$HMl2Mq3kxn3|EzqKK?0B<@sv1M9s#kdb?~3uEBvI zW%y^Qicq54hgFph7|Wo#Sk9z7;A=QScShf*d0jwUufd@T>yjl}|NQ0CwVu1UT%V05 z#1+k~n{9sy;oavaFo|wPl=YRBrsyTJDqqsNgd)(tRn*q4x0ug~;ei)&Dq#%Xcig06 z>4|N^hCn!Dhz_yt>^(Bz-TcbT=dq_M13oFuIZ z4t7SWjT)BGqwI=@$Z%&nS|@cpNWRx(m#>5ogLIdm>mr_U4;W;h5#hv`(p99f#w7p* zc$_nqB%#*!6{x>RyjAyYk*zLbh+8X$Xsi-8I86`DizH?&)!AnB2v>cX{k-`eBfOxQ z-2W=mw!eUxGvsGH-Z~Tdj#>z6(vAP{G-pZd>^G!w@(uKCzab|i$|(W?Qc&CEZ~HV* zEIoe7Xw$RYM!$%DZzILYh2c-|?FNvZ1)*BMfBDR&%b_-?oRQf?`ryr+y+sQ|;r$+WolMuF zD~)(N)Huf4ajc}gfeU)$kOc5LjD*~k68umT>iFo)poPp(8H1@4h zdd<6UsGQ_0xx|N96@)?KqhzU37Sa(C%h%H1^@B5x$aySvvGst1C(z1$f$i^)kmZ(r zgPD~3G)}*^gYPwvE2`xClJ7dg2_a{}78Pl4Q&!C`t?B1~3wIRy>YR^LK{u+Ha0Gwm z)e9!P;3f>wKtbP^eQ+|Y!8j+c{QBgPM|c_}Qo*sgu&Z;Hw9aKSsg>h1IS3_7M14O0 z`dxd2UulyNaRDdLAu#~!``aBRk;VC!UOBYQH{R5&Ro;l%osq4sU`@u6zYqRIln9a= zg{%1o>wr44_SFHp(|acOX`}GF?gNL=6FixMGyaWQF1oHBc7F4ET4E^)I>6N)qtDJxV1+3W;>D9l`E1A(xmHnl|t?mWVcCP}mtK z2P29?+u}*Z5(YSe%>f2LC$1QR5}Z8J4@bD7gVeM|eVSIGD-ZA}Yfa-)F@gNQ_wZ@7^C%{iKU*o5P$3AkBqC|HT!&|3$(8QXj+94% zO;<0bYG<#0@ZKfYkO+t|foK-tNT}f*A*z%b_jkJX5i#$V?mdP=SIoyx4fMX<+$7@? z?k^f|CP0iTaPes+BS;1i*MNGz3RIy7VCSZVESYzK8{g3<$za-=3M ziOQq;)QWaT=?Dh^33<&hM-r_)pLj2if1t4 zLQ5%>Kord>6wM@P#X#~`5jPe;#-RYDJmC4G1wp*<)Fog^{u;!(Tw4k8;?qnA4_`(t zZ=cT<{(MVIchZ+b3dmR6PCpAo4W;;id9KlOXiQikq09pVJY{nacJeVVTog1vgOoif zOuXwVjukF9P(3~Pt?nLtd$J*Z^eT*jB2gZKwEs;UleuLz^4gX=jVo*Y*HpRDMshPB zEtob@(K4nZ=t~m2Xs16A;;jKxC}Z99w<L3)sT(If&nFl-n6_&f7*ycy zX0}gcc{*M^E^N67PBj^HY{e5-?lH-;HN20g(b^URvT&3J&|8lwSkt%NxL=Lx3QmWI z)eu<#uZrx4?>mnYxI}BCh9x1hf-7$?b%hgtr^>mL@xJiArA~wQ(-^@{R*%N_rF91w zGwv)Zzz~R>Or2yKUf~N{(g7=2&{|PyjZD_2vy6ZpoW+-c0})}R&qUjcT4lU~;Yzp` z1p8Lj40rEg#FEu<9T`-RYyNvcIK_nY9yP^O1tqjQVbe+w!CJxX$R3x0D8i^tAy0Ku z*W690 zp5C7-Ye?qg3`3>Z3n9r6;-gZ}`&2-P1pyB5LG-=&@7yx!yM@(7Qy9b`*Z#IP-oUF+ zy+=Crc8{Z6}L@$$sqp&Qxk7=^sP(~1 zzfx*&3p1;jl+-P4O(|#{4xqMo9r~h}%59IesMQ24#FcY7tyG$O`G@Z}8e7G{0KCt4 zazI7FRSK2Moa96l_{^V)CkZ8aYvij=qDG2jjj~%#@k-@Al4jL3ybq;WZo-|2s8bFW zcD7xrfCEE%`ty_%Kc4Jj#eW3sA$t)Ddm((0a;R2H$SR^P8CE+*Uh3>>Z_sMKlhZUcbXOAGrS4*z z4UJu@=_&JIQ3G_E(|FLm5mKlD@SlXvbD|V4eMmV#h}gNXa*hD!Pv{rV$7EAA6*XvS zRA15S+W`HM={`oGohW&A9W7ENTn3KB3p?ciEd`DAu_foUU_pAJxn2k| zT5BsR&Ndh<^^VT$)d%)!O80yncQnq2CvIorKs$8sjkJ0r(~$|m2fZh!k#-sX2Gvn0 zvxa?Va9V2-s~}QA^W=HaiRxI@cmk>!rbPcno|-uRT#;^X>R%(LNz%WfQ}Rj>0f+c} z8zY@*-?D^E9D;=11Ib)R;>={IZ3*oeJH{FG12mz?tlfuGO=z~2uX(On=;+sR>O*HK zB3FW)!@l#4`{9WeKKi#bcb?>hCI|yllys<1Ah(>Sv`QbPQ6?bV{x5_QL<4YSUBvbj zOi^D3j#{}12vNSq>(PiMy;jgY0stzB;QrGD2FzFPkwAQ!2p=$SUEBk>!(hf1cYlRd z(0maed?l@P;VhCkQm7;34=;!AL2{gk@b-lW99e)eq;wkkf~Bf*MoQX`3Q;K~dxLos z#w~I7e|FJk4v=6!A9U?4L_6?9h~G%m<4+^o#T0Fbu3io;Sb~!8!SeISB*go%|5P3n zrl&#dRvgqqyn(}qf#mYPb4ScjdpsMxK1%|uR1=l13+o9eOZ#643t-{$Iw$0M@qVH+ zEX()tqT3$)zKVF07*{zqVOqnAhI8$2)QKNObKPdc47YsBEmzU z-wsa@5aJnxCcs0Cz#pRDBWDPYZ!yp1kn8}F5a?_jJG}Sc!HYNlGkkw~wxr8d>LIR^ zGQN?512pzHiZE#Nuh`&gI|Jt7Jry8MG>^b=|LL4srR5)FalIeGqj{~~uKh(=c2!V> z-~GjjLAjF{)|(oQ-ee&|o4t&ANGxkkw+YSw*9m}=W~3Iiafa9eHt%sBsc#9#U`a2O zke8%L+kanl7ByFVVvTT?Np{vsfzsOUq!Am>0FR-*8YW@-Ksfql zQl7CBSQ|mHEnhbJW?)Mq2qJmvUV}v~KBQ6IKj6<~eU1NYGck09IM5nKQT<;4RY0o0 zKFlYSf6@Im0}*)d;}1RnMWD7I3NR6ex8xjC=fVzuJKMSSmfif;L(T$p3;HD93Pwyo z`|Oro`s>hnp{EAXqdw$`b&Q1_Ggd#jKepmeo}z(QyR2jIrGw^9u7P|<%Nq>6=}Gmc zO<(Qw;!ThR0Kx}!Lcg*c)x+})ddo&Ao%nV~-ys9i96@0UvkRAY1=OTw^vj6@%i>8U z(U%@OZWnkqO3{Buc4C=LSAG!dHn|Rt>E)?W$U74X2lXsMc&_8WH*dmVdWRGL-qA$S z!K~9}K%}T>fy7(0KMIOSZ7s@6`SD} zhIN^rbbCvmVLN>Mc4oue%6#Eiw2{EvG_LN_U-H!p#jE?%tVD68Om}^})Y*8y2}>%|mD^EF)-bvr zrnbqmd|h?+9A2*|K;S$P9^ni5B%`LjSfbFfbc<-C@ugU?g3Hm94CF_hO_g&(m4a8pf zczp`p5I^du4!{yA7@fD#1)Ja$u)Rhs3=^Xw#TW&HWCZ`?NES(>=qfI{s-@^^F1nhE zl;+s<)KYt{iubG?w)$E$Y%#PzCoNq-;CJ;=yWZrLjq0wj+K$dmfEFBrhRfrtuO;8y zWBYT&KQ+Dh0AYy486+M%9`*hB_I(fqa2}(0#9Lt7>@T{vy~NZcF7{s>TSN08;jp_H zkdl`esiFAl&BU5}Ap_A>lrJ@p8ua?(i8)$jj2*+zY1tYTtPh14L&j}jW3|l}%K|e| zxw9S8mtoD9#GNC&xe=x582xInoUeT^msN_{n7r(uQrFwCEOr1LD`Z2a?hyZ`C?LK( z#e!b@{Vs|k6UXsxG|$loakb0!05A6RU<#W{S5*psE~a&`DM>lgmg(MY#2UlysW$Fc zRJqd&0K@<7S9t3M0UKz1SaFqCmhAGOf~lxeI@k{7e&J7&t8qzLZMhQ$_Ag{ky1V+< zvZetU)HLMfo%LS|vb1zKXx^JfJK?o+ql$k+Xe2Z}z19AQf7xooQ}(}Nsohz;I@61d zrl(Im!{wXdSKq}&aT)p{bf3j0pp?8$N<3I%(1}mQAm61mAuoS9U=zq9wFo&d8OkPv z?$=J2tlG4xKM!9hvm*{E)A$Hmv*L9#E?sKClHZ*Z;V*5#b?7OZv1aNwqv1iY>f)uw z@BlM86^NV-HXb&aSc>qg>I?jw|DY~Pyt_uTa-E%YJL-%vD(b;pf$fN#Tm&MNo0Gpb z*Ed(+;KWMo42bf=(fG7#@e&t#ild>&5{tq^coE1cAix5qNZ#4BJ1l=K5b$T*)a+f-FG|I3BuO43Av4z(CVb2BY zC$MrNu@4(14lFmrm29WWWJ^CWkk_zT)NhMZ5NgO}wxxK-E1SSazpj^6%xlmnaawt) zmP9+J%xNjJZFo)HLfKX(-|zv*8a@=6i$g-NrJ}V>&EYk)1+tAz&*3++C4MXa$mF&3 zO1;)+?%&qu-GgGjC%1`(!nf(62E$idhssy)!A4vx7Zp@r&BF4KMGr z#OAh8|G23y9!ZJOW2In>B=lf+dkP0f=ka6Y?Q=w77%qwNo0Hslpi>~OqDZEcxxM@7 z0!Dk+YZxLio6!5>x@41Hv8d67^_A1c+taYY&E0aVWm~TQD2G+wD2uZj^f3@S2LaES zl@-U>HxLx;1Cwp=K>cIHL`4b2|7(u0Uj%;zP8`)VKfzk;q$b{AAt=K^a^;yea*1Kf zl}k%6F0Q_MQ8|l(8$~S!yC4sc;PY&v^4+X?(r9qfxo{IvUviYZq&OgDQ3EnOU#71% zUt3QW87(8mC3zXwO9EZwb!9J7mNBkm-m81j$4bn2ld>mj0S0=krqfR<>WDVF{M@Ox zf_`=3^{gqn1vMo-+bMdDps0;PpIwc?)&ZI6G#O=0mt(*!D;dTrp7l8)7Gabhs2ArkFN4EImQgaJ+=b%;feK0k7hk{i_W-1Pm643ztI!#qW8p%nU zTrkoUF=5YXlAt*dy>Vvavm`FQl_y&s8d@4V~wC+>llpgu$j%!BB1Uu1gV``;LF z2O1r|{j2ziqd{^_AUs*^pl;(rdHZdv;3Fvem&0)3E8#F@w292ZFG}-zmw;;`$vItl z2QI0gGU2)jy};81lMEjLVwxF%E;<-JmO9G|De(GPZ!@wZG#|J}O@JIXm`6C_7f?!r zOM!03K4-aw&QSV^-?y*8QnF^fpA4#bHpcvY$%UWTnq{G4v#qGQln|@($FM1ojCb^JCb_LP4;NW2XT%~ zjYb@cO_g-pQ$O{bmFO~yJXfNM%%`%vqW`aIpx+^`W;YrP&YQd(qy&D*)+;(wPfL5D zJwy)Y!YYsssIXlF0MUlS>0Zj0^h98+KdymrR){;t4#v=$IZJDtz*? zlMWcp9U;jcZZis%=Jn_@q0QO*YUZG+kPifU0`|6Np~rMhyZAy}Y1#xiQJ&v6VnPFh z#a&$U`*b6^3*f0w2KscGS4>Xe-0?U?4n9Pr5N4=#1HQxTIDL@`Tdy*z(R@2?w&1RQoki7p;C@tvp z_T-hEf}X?3R^V~-CQQgi69sv-<%G>6x_*S|#4($2t61BKVSQkiFgJ(n>{1>^_#onB zb1aG#&yg76yJ4oxM73p`inCz`0Cty8w=kO3pz-O*6Y^Hx9v4&LrTB&vr%Xk%r-H2*QW~MG;}4mM-z+LO@!2gS|NhuI458NE{*l z6kVp&p4K#yg~l$Su-x_1LU4>LHVKWCpLTi#>N!8wMsNh)XuMVXgu4vAK&V76?fV_( zTl-J2HQZ~*N9}sNJSA@6{lMmruzs>JBWPJc3{k&>!&QVRt~Ih~sNLR>>>)ZW-&rq) zXJv#5hJr>F0OPDN_gH>6D4g`HpC_A{*D#c_t@!>O=d-(Mn{_WHW|TtLGk8w&3CRZa zroY{A?3y@}M>wM<3k@4KoDYV~KZ_Gjj&N=qD1leg8T1Mc7I?noqvaF#^(i093FsbV`Svr!rd6IDTq7l{K2w~;WsuF z3tyHY{PVgrvbv59hiUG8k8IYz z>uNeDK3;$&KIRE*Q#S7TUt4p7 z&9ByT`ayKi0tfAjvIYYvIf$Uh?$j*dQ{r#v)&di6MAhi5MzxNMqHs`bb5D%(V{&z; z^Kebv%rS9Ox5Rj-#7$fhH+4wd+#T^eoDsKiMO@zzaT7Ph&7BZYNUY<4xJoHt55?{L z6F2cr+}1a78_&dsU*frVC2sGNcqUV!n@0v1yQ0On1QI5JZHpvi*Rd$Tu?dRit6$~TQ}DI z;BMQk)j@}ezFk9dX+!rU+D%2cxo}he{7#?a-A*1VcXe z6ao>c!i!CLk89Uoz5nY|=cP|A5mhunBqP&T35L=m=(6Vl24ahY-Oay_8z-_{4&`kZMBcE6f9PE>QoPQtD0~QL-^kV4?p(&gZqyN zY-DH8J}0M&|Id0czBAc24!MP7qmbLY)?OHLFGTlU6)Yn7|3o2D>d5b;g;11LbjHIU zMKJ{gwu#Kl!X49= zF_>LgUB9b2zd<}f6T4mQ?3!PdcYd<+JZf@^vNms7*cQJDT zpk{6G9np{T!!_KQ>S{TzC;4%i){U#dC$HA;;I=@j1*(Rr{EfohU-jqoe^oRBSF2z{ z=iC3)3MRkrR=u|x^S4_`%kKxAej7IR^XSuy7z56W?KD3B`E8$C>0!D3NZVnyhNma# zrM5DiDa70pK5^e3Wsp0{kGH@^LRB!uW^3z!zoNpXb=T!#C67Gz@Evy@ z96bD3d+s1d6I`A>h$EyYUJILdi=82glAU`F%5l$$gL?;^xj~WPK&DA?gx;IFHxI0C zht6rk=jZw}dv9xs$`Ld=_Y!3&bF0 zP5kPQ`8ccZG+wxR*!KJ&KzQ|Az&)aq&BsAA)g`bp!w4rBFpsbHk>mKr-a=+}S2n+v zA%|f^PTt=-RUY|xl#=GNjAeNCN}j#y9u{KeU|DmwGZr75QY1M6AJSstBrWOo+{3u( zOP+=W9tMPSU=^v@Kw3Vqf5%ylmAsB|*B z-8bXJN?rdH&}aMm)9U~5H#ySug0@l?4jhJ;Q<{h%e8A&6`--k&Lh^NL{O~-7n&gHu zi7=1D^Ps6946}=?lL(#h#!B?VEdy_m7NndiNAo@S_nGDF}OG&}CEZ zQ)zWV5G8T-fS5$y^7Zl(9!4c(wt2$M&u7jKy&R^@r{ItF$ioMZlS7(JYx;W9xkDwY zeH;_jLTyZLunV2$vzyT#P-XRnCmz3ha3fg8c3vCI(^v6b;DAW5v!_VGdRk<<#FcsK zo0Rw23Mj_8Qu$%fwO3xV+OQ0jlDms?lurPyq0JSokUxP1PY&L>x;`cU^LY-V@E!9j z!9KX3I(3*GxKs!6bt{C|fL;B|vPp6x$$)kAHthyT-tJ(dQr8zITdswZ?6&7GT=Keg#ymSr>;jN{xTE-R$7R(N-f?5X>taA^ zd8f&GkrUxl#zi8Z=y+Tcw`V4cDpY^nHl%O}lt0_44JiTrn(zthUFFo%hC9FVEPIWh z8cXWK58V0iQx83V=UsR2Kk>lh4va}z;GL32P5GZ$K<@ep$%H?>@E77}7l`hnuz)So={UIm#j<)5&tHY`H zpuaG1T{t!FY-i_lVq_S2kcXErkatkNGpk;zi#c3<*7=c&FP*3}y3z8SQdMYmqJp6av?aUgjD*$z{n9qxnf{}x>>8mMSSGL_jc3`#TP|e@^7_TN$!?{79 z-}-{dX+}LLSoX`!ON9o)F-y|vLDETLOwENNAg{~Q>ys|pPwEtpxH@2- z5+)+InNh9*T$AD&H5@m0(dvm;n<6%oZQy%*BzZv5;6 z4sZ*e@g2hG5x(xL-j0BTkvo5v8RI5GfwIKd;}a|k4_B#AC&yX1xI$0s+PRcrzKV6d zcApmAQ^G{Sdo^=s9$xf3!<`(69Fefhvyl}Cl4)7Mp@aF zgEO08K3mioDYMtXs=8e5h|W?i)i9+X<{M4qhU7wM@)0yq{^s`9j}hk39!EGxy5Y$t zjk^bgGo$qm!xkN=>VQ|cyZxV3DB{cxI5v|yIen0G%ys%A8Zt*c+-sdv;y_RP=6dk6 zy-uyCdv7^6P%|kZtOZTU@Yc~dnnACR1MeHr&JB%(*PtU-9!!{jPG2Dgcre2%A6D~>E-Do`X%+0B32ng($tm zewlV(lMMX2@KE7w`N^5mjyy}~uwj1i=UH+yz-V~ysGejq%d*fw|CF`t67XbHvlIBz zYvJv%NVk>cw#d_Rd6ILs!pnEt&L4g5!95rF`jNvz?!Mv9rYSTLi#1TMqQzS>M8L6* z|Bw8Em!#w~FL>SEoF&IERX&rY{LUSimFB>vWgK2@XZ}4XIj$uS?mvFVz4twIkI8Wd z(*NN(IAp;^&4i*4&_Nv_nIj*Yv+qER)WsuuMfD71yo!C|kvsPvzpIfruRF=$p0os* zFdtJ2X_UTFjf=!*uuPppEgMPp3x4^1+NAA2%aiJ!?o&fiS5_R* zGIb*U7A41C?Ub1wU$W2xG%ZCkz{(+l<~#D8z=ZHaHA_{u(*P#3XgP3DL69VtDLn3^ zhzm7GQscQ@o}W|Y`jbB2r? zv0K>)CU>rMED2o-v@$h)8Fw+)ZOS-jBVu#I^l=*MQb4LEa}U=iSccjjR#x}6&InIb zHcS6FokMXpaUz8CYm}}jn=J5}RlT60o!_okfIpzi2o2$dtOT>s0{VEB!tAD%>4YM; zbL33Q90*?+W&{7$h!H43mPPia9pXyYW9z;nICLqbIE>3E%Vrjr(@aVJL?ubrZ5;}d zcRBp`-p3z&00S4?GRa?ISF#H`%~eJaSuK@|l*dv#?19rVcVZFYDsl94%hw=Cy5rSQ3 zU+4tx+6sqhblMuQ?o7$uvd&JliOkQ&3X9t_kFgASh^{v~&UT&yoKBmG+t(68opC_j zCH)@Dgf5qzeLixP%MjEa}31CV-;>l750o0)IJ@vCTDa7*2l?Eld2zGC~HD;nk5 z4(Q1GQ8ERxX0wbu+r_lFthSQV0P0<@0Bs*oFuNVL<^)IR+J;;q#;`)v zNjJ@CK%*7)3`3c!QtNRV7%;ZM8Ba&#c$)6L_nDIe+u{nC#`gL0RX2T@v9R`G_LkjPmItmuqH|YtAcaDCA+I(CY1s44p1C{A-b@86|dfd zpi?a6y~4M9ktv(g>*=SL>1=FoSFx^DTj_+?sg#RsRV?r-d2TGoT-ln~soDY6VoM*u zhE3I&`ebx~4}M4;F=97&jB|M1l|6KV8xDuf zW}QbscH^Q90Gq2~U1kVqcN~y2Id3(bol0jW6tnISUOi>2nIf*{;Y=hNJ`CNutu&uz zito*>9v9hQz>j5%iUi3(p`)1+k+HiiEEk^XCaM-K$#v3~Ojcsa#1r9olgX;uCUt9a z^_9BX5`pr?&k)j^#s;9BA)oYZYH)dPa|5UfV;Q&;U8E%Bwk` ztf{IpMq)tzF6wDG783ukWjkY}@kH(spCnEb68z70Vv0IThX2ejTrNStTgK{rY=c-~B9} zIx&&3lC9D~#@My~uC^2g`v75RMymtik&D>bp%GC+;BpjwW+EZ`gH)nKW4;`e{&2|g z1XO#tkcp-%w98~*w9jB9tV2LnY|Dn@-DDK`4CtWyK0B!nrG~};gy&UQw`k7A;eCyl zU?+1h>eTDlP}|N@ zzUNLvxW1)r&!={{m84$JBSI9W4!wHqWVG#@;YJ^S0Ve(tZ5rWH%lOtI;c>h#ow66A zSO7HwVZB%-nkTRp*nB=c)t_)(-!j0>YY!E$hA0G@0;jL74wEf9FxI|P~h^)p(_@>(;cmtJH-pnJ>;4d)0zdnPayD|OFlSdgBd zJDZfQc%hkk!Eh{AZ}FhP&O5!HfA`tN?_^iQAM^~3wgvp*J_vGHpz^#dY|I#Q-r(V8 zyv~VntvkmGa?E^icQ zWs~;PE@S;HY5R0H|6EcW>C5_T292_++i0vgz@k?*eTXa^&n#e(1~y~nbf^eBUzjx< z25=1j2*Nj>`JCL*?`p@B*^3oif)tC%(KId5fBR%NeKCD)cbbo?UAiJlU(Jw>cCQ~^ zJG^ptTvfZUH4abm*${qvGLaV85S!hdp5)Whp?Y%*{&bk(vEp#S$<>c^EZM@?A)IP> zTohn;PUm@r*dYQ}-*!aMFA&Tt2<8=6KXRG!r@R1{D)UZ@0ga-+R}CcOBpfr?ueOPAly?&$XMfkur2@y&Kf(5Z&`xnA#ULDRdy%c@qf=Z~wpVH?H5o*4i5f$sKm|(-%d@>Z04<>;sqm0Tm0EGO z_-gY%Q%mR8T7y)r{U-?ou6{q^v%+3-mpdmMV!CVbO7494!QOIc?|hahg3%NB7ogcznqCA<+)HGzySALfWpc-9BixXkBuC)B)>ex*tg zCYg!Thl36GkFjS^Tcbg&xjqTzs*R)B8)C7PQJL&nXjP+<5?TzQlLUvozF^8JQTkm;D=lnQUrhcRqHglso(8%wNKR1bvI>Kj?Apc zaiXYiC#H?M-(Kzt%=RicyzqR!Yjef0lJ7^X4?vX$BjkI}0JBG1JM;7%cRmD2dJOHk z@j2eUcJ`KSlJ9*)y`fZBCLii)$|?nzOr#EBW9{>GR1o9^>PPOH>L|U5u5a~KQ2$f&uBUPR8?B#L2*bt z`-A3L;w8H1XaYP-z$Lc@A8^JEi*}hANv^DJvlriWM70a-RTGcmH;bsxWnyq zxWfn?PMH&`U5}C|Gkb?iA%FRnD>Uz;xW+XNE$Pl^chwSfDJT*~kMo4K&)=cUxFMlo z%p@W<3v?4FixFb7d!zK|e<*gpRmA-YEoATJr(-Z}`^M?M`c zyM1w5h-X)NSS`=5;G9NJuCU6AN&|Ybz*SAb9!C6tBgrQhcJw6>c!ln?!x&)+;c{W8ft_v$2r~5Whyjh` zmhtW~8e!DxwB7(O@Rh}zoH)eb{8$f0X}JM<6gzxeuZ^H;hnc*iP=xAeWZeKm(6Pv~ za%~hj5qykgSza zSIqH)fJvfIS#Lz~Go0WR&@@{<(dyYvQLQEjS6z=DTk-0E>2nSct17Q*fJy&ns4E015e2?%EqXZ)|+fECFQ2J-Ge%duEm&nP;fOYHlw-0zwzG6uSL zkJ2~Ybko+f_9*-=fKwT`esjwV-Kg&*eW1aFA;l56L$Q5AVCJpdfct)wPG()A)P@N+s- z-t#AMrQQSos|QC#34>5)wFG-^LW$C9{FNE=-Tfy2cJ~iTw7=cnv3lqD{p(MDrH=ki zOAn-1{j(0`2s&QPg~~{awN+eqIB{kxHJo+qR`jyRyhK{haCJlh>|meDX3_M(fow#N zNL3?>F&;1O&ZiOVfrhB{cmoB=gr8Z!)q!mrd5RZ|Z?;M3Z>MTK;wD zJ(ZzLt2@@b#ng@DRi=FQ)!M`lXN=jjW|>$%3AXZ$srm`8o^qZ>Rkk@1&C zfqPGBe?3C&i#4(J?--rth~|oeIle-4hAwzfDtptS$__TV0X0n{FspO8uwRLqCA<9{ zdutcCfzwkXuidJBSSYL22dGI_n23F!>Q4DwC@6q=cLw9U98cB$9KO8UMoy4YwMu6q z8l+=NBsZvDMW@oz6h^6Cycmr}j4x;Nqf*-&;p zDAp@4j&V^qmV6=K_n8vO0aGHvWD>Ac@uO(QD9TKQ)*tMZ%~3JtBz4lK_v&Cg|?EINgdpa2^MfyyQa6sXtwu_-uid*ivoHpy$OTiMoxx>dGrGjo_FUiuoKi zhru{4m$3~{Cb@las?#*a@lAtfbMRlXJFbV8toZ^sNRbDmd!z12b*BkPZk4WKhaN+s zp%5()#SED3;iDrhf#X0qFu?rqJe|H#u0sOKEkMy`Y=M#CU4z>|3`TP{prV9ewGn$S z-|`k!X0OWx?||o;5<3pxgmnmL!3|<}>c_YpMJ3k5T*>-`bhIB;n}b+$Z=rabxXl`L z4ZWvOVtId!ZCI~=Wq9Bg6Lnla!i!J&v;~Ngobgv6;jK+;QNmNo9k!V zGP&qTCx`JgX8F8(XJ{6T?@`2KCX~n^jyn{@ zai=Zxs>M*98Yomcdg|hNfd0Tholk?eH1(HUj^g?3(w?Ph2uJE`WJ9{@kOVtQ*6G(i z7IQbaudV2HrQCjT&qKj}ftsSEs}*L)R zi^MDe4#&X$&?={`lQaV5M2)2wF(StSnwPjHZ&X@ywPKzWM<%3;S?A7SoDo?6JkIUJ zkvtqY#fh(r-qt(}IP+HO8W$RfkQ%q!ymS}%%TQV4Onlbl5L#ww37078Bu7lIy5_n` zc8syaofc={(q}&!w=0a$7*nD(()I;969L$h3qE0QUfy(Ek&|cg2Y1K0BRviLkHkBKx_fYY z9KF|%D$&Hz5rW)q_AaoOtdcBnpp!r#_=6C=NC*(UcSILIcma3>5TXer9)T%#9B1N< zvv<@FeSCNE%y>K=kH=$se7HFRjvF}x<(D3F)GBzXWkGmbS#UzN;PwGo%9DZ<@lW}g z&(oKEQt&hPAeBv+F?%~2j&~_Ip#nnJQ#c^bfxWe8BaI+ON^d#1JlssT!ez<@bqoA^ zWt5G=1b)cF1U;rK9v^6^!=eT}=MaL7hB$m%qff-oYJklQj)DJSUi=V}$kBf*M=vc0 ztMuQIy6C85k6l)O0pQ4`GLuwUA$1!*WIo_r@}^c@a4vnPs@Es8tbZg_yi}0~?q!ZA z$nR!68dY*gg$bxIEmg`6<%Ji>KY+aUd4T(3gLGDCl(Oy;H9vi2185sNcRKg{9tf)k ziPD-jXGnra142o%oPy2p#OqpA!9lC5WB6m_QQ?o$yVowv-dMFgNg5~lRBhGl%X5`0 z?p$RYYlETlRS1pgcPBzavs*s6HG^fm@F_Qso{QD$8H4{A)G^VMY+4^SUth4D>CK}F z$sLmu7bYa<1c=@toQQb(u~rA&Yk|b1MSM-})^YMSm2wW|XYYMGs==(dJi;n96ppdA z_82CaWeU_$_Dq_nO~>dZ;?V^ls6NgZ5C*2jW#_AnzgY#Q-lAHDTornWl} zbkC6xu!QO1I}SR{*)satBrZi zR5*uo2G||jkl)a-c{nwpy!P+QD5p7`!zcsnj!}~m{!&V(c&SdOD7e&W%2m}rPhC}w zB1}F(q=a786R)%HsuJMmb_&Q9D;YapkIn--izUC3wqa$G%vV(N7>!OlzyduN$s_Bn zoO(rqY#UW-YTD&Y+TUfLGE5_2St$C_GNDvc|L?TgD{ZJvH}LCQbd^c3?Ser$RR^$+ zrkj+uc@Nj&Gl;HT;_AF-xhDGuAe6GrRf^@`8h z(5XUHt)1B}G(GtQ_Gvx+x#Zqv#H?#fgTf&O(a~wOzw8{fdLx>&MkgJF8q`Rq8O9}X z#W%|hb^d%AeIqe~`yyl?&^4K@!t_39QM+2oUUtZhAkX*d5mH{flgz$IcO9AJ)U1*} zvr3K(?4`L`woXC9c&@V8dEi#w)pRu$4}w;bd9zPucP+=1mv#>6a%$0aI9h7XTJ`WV z3~O`zIWM9qep)?N9M82$>>TKMz}nJ0x7yWXY%r5&I4>>xPE}TTZ#v7Slc*_pFgiLs z27?D2s6&<5BNaPFs+h5TKAlGv@hlKIIGPzob~)s2tfKHLU}NFb1KAfsJVs+I*TPKP zN3qD3Y@W3Nf>xJvM$a0Bx-h)f1yZ;H#z0Dz~g93x~Y?g0YjyZmBTQ?DmYMSrL ziC5q%jLd41YjMZ~2?)%v`}DEEpqsl+Bvd$Co-LF;bro6w=Cb6=SMtVyc^R+0Hd|u( z<>)bLBDD~EO=6S=?%!wHIyUcY!;hn-Q{NfTZTqwkF4dI_>sMz>7{47kH@BKWfuRN7 z%>oK**L=s$IbJR|PUZi5)KnV!{~bG(M*dSHsKSC6N44_*>}dK|4~VMH)b+!>({3h^ zf3eE9vTv*Ro+xv3MM9Muq5ex=@h*JgwP_TM7RV~{clpFcID}Ig5qgZ_#NJNGk#!%p z7^(j|_w@-JKiA19EeA6)(i7U`fw5<4gnUwj` zGcUOK@(V6L?}oKY&pGGpm5VO8c!vY;Zjdvt-Vt$lYv%I}!*|(2a0!T7>@A;NB|A~4 z%8W$+vMeXA3@2P|*YqZTabNpN>o3cILZjQ%&euj!M zpeGyd!4|WuD6hcI>t}9cm-@on8tTi!_4T+A^$Df%HJTn15zlgJBEqT8V-Dh3bb&dD z5xdVp7T!h{kNns0qzZG$8L!GCKMkeYq|_9af5pmkMBGT^BFq~-+hSLXCV7Nv-v)7; zs(K$l4Yf>5u+O<#+Lcm|E<5vLcpvSCv(CJH-}yJdFXx>@y6f_WESu-Oq51c9!)$7G z0yKP1Cxo~C)twODws0q$dG%g)LgTmT9NEu5Wm)xw2|UQrQB~LFvB?1xVw1V8dAGxm zY?9nj46`Hd5tTqhZC6w*tiuI&-fN}WRaD7kgKs$J;xo^>@SL;#!%D=Nu1uEu!TIuqwN#>=lI0rEtksih1m`t|m zCE6`Dl!!j{W~VFtK_C+`W^f7!D&PaX|K1a@Gdn!PUm9#qbCWs;tNwLyg~Hy*E>KOH zO|EJ6La~KmDZjl7Fkp^sk99x1!FU-!2L1EXEWRC=J(B=lu#0l<5Ci9n@T%*^eq zeYmbx#KZ2DVU8BM+|^p&_isHG>?82tl34+lfhq4q@cq3H2j`47y4M*eU8=kw3HnqG zRmgRF*SJ1Ohd293^w~Fpvj{fmQ!KN?#g2S)HXcK>yz7ElagA}xI(e4d>rm0zIu}W4 z3^?;5n`6}LBb3f9IX(7~rcwIqf3xkNMPZ&>21I>pG$HgPH;UXee{m~PlGqzlQlwMN zr|B`|?tL6H|6UI87XrMmDk6P62kBG66S{)S0KvNknDUEs%eN6vVI5}?N~d;kE#6Ie z(o{pO>2!(6V;rp|;mr|j0Tp0+66IEQ9!NP7aSb9W989?ev-s_L`R>26hiwV;U%Xj; zCLU2EZ>%(f)Z-ECMq;o7{I%ks}mTc>t^9gG2x`*kt^v_Xy*gsw&Dx>&q0jgKtQ-T@ATl~6bZj6aa zH?v`uq~N%AjZ)2zVc?Udn4Bg2x1L1@n2Dul_@PP5;Mms9;C@;S`YY~wCRO^K9HARV_3~Hb^6S?dnzcx+P*}+$B>r~GAu5wl9rH{ zUDajij{OHEhOP@nR6)7UO@|Oj-Ic5++gBuGCgYM9SEs=KHi6L?chie8paV07hrqIE z8ifU<=F7G{C8Z`TBc}^gZB0|wac0VD8krguHq9V9a&!TEY*mdXTYR-QoW5-=?GHnK1wR^l8d z9y2IAqOs{N3Q0<~S1_$49$@)!DvI5DMa-A&m^7GHR=$y4B1G};nPWx5VKGliY z{V>&MEl+|9i5ZJj0`DBy_;f#K=P9Aw>3KYp^i*ps18O%KBGs1Nl*UQF2c5M*z|EoJ z7s82>S-A1<)^bRnv2N)&eQDG1iE7&4r`)Q>MfJO;i?_tax6qXNiu)~bPwHK(rv35k zeV@bM4}#0%?>_qqBKKFu-+g|cceFSjx!8$E3$pVz{Cy41d~Ak!2s==tG>P&!^kpcU zxfsf33o`UE{QWHW=DBb0{`RhK@A~GmZ$A0vQ(tywH@n!G-Mk<>pTXakgKu8==Cg0_ z{N~+npZMlWVC#Nh>s?=_qQu2il1oT$*OZY-9HI>$xv0g+uqsJLIo_UZ@AQD@Fa8$9($3? zcr+wIJIjYmsG&EbspSTLF-!*?y)(0Im zI{NryPO!LBj2pF;xnNi4jt11`4qQvMlBIK6a7=jYvB#a@s&7T#sm;QT4Pf3TRC&Sb z#Caoh6^H1m+p>Y?`Km1qJ~1*S&+-WdEr|}}29!HEAl|~qcfzFTS|7jA)TzRweCj*m zuwdUTFTe|18)hjcfY0b)!#;lSAi(F!g2RrG3=SEfGJ%!&(waA@VHb*nB7>%OYCJlD z?m=<%?zq7@s}naz|JB?qppVAZN}VuiOfKSgt2QtReKZQx5jCL^k&2T^oTyVd-qS0;lewA2$<1IM++wCzg4zXLZ3Jz}x|$NM=WwRew#tA3 z|z_1LELXJmmo^~Gdb7b*_f*bgKf)uGt~dX;9e9>mVDN^0+r3JzOd%4JaTKGc!; z3{aP@wgv+}a@HRV@>w>Nl)sH1- zz149L2IVAmlqNX5Yachc+E@2UE?!(n2b9fcJ<@__-v=~uYhzaCH3w14vRhdVz)Q1D z6NO4*TC%Q67g!HkWX&8Z0p&Px75`g0xr4PTt>Tfcj^;XLC-WbCKvnI4`uUDh z1(LMrYdu(+rwC0QIKVegmVK)6(6r_X@;uIKGoS1ReA$pYVN8Ggl#nauwb}sRrHm8b zSqP$ss6t?xj4_t$G+xh2v_U!^=aDdMJ0`YH(Pio3J;sG~BXB3C<;%NI-n;k1p5+h%*#itC^J8W`mA&bNf1$j(D0ydqFxQgcylkB{o1o45vIzDRAV4FxsotXLV4KS9Nh!EiHy|_RqUc+e8#=nGPZRK zHH}gKvbNRE(3~@h^*hY!$s^1?AB1DPzssxyT&w#`O$0OsOvC7Osffy_g`f`^_@+7L zK*tM!Oqx{G=fEM_<<|2!mDK6(7wu6h+-Y53{+_Qy<f)-(C{-_LI)HE}ntD~Nu)ORIW&nr;cxDn|i= zT{3f>QLWIj-o2NHPkT&ApFUmMX*j}~gIf-1Tkxo{x;UXN0Vut3Y7qZSX93~1)+1?#70iOzw>!W+n)?K@dMUOU(QZv z>yzmFJ0B{-sV-RjfJuY3nr6{0pnleAQrS8NzBEkMif}{73D_UxSism${Cy!jq?`kZ z;mtxwR5Zx3EU>@n^a&nSb>3{P6S1plK?BI31i6d;mLB5%F_rGBbNp^2i!V}Q91pREU#D)uiLm{u9cm<1#GRr|srfSRN*JSK zMHg%&X%;zWZ6?U)2N~4sVwR?UMH2hd2jK2Cu+u+(aj7F-vP#BY`0`f$y?gL3SxBS# zo)AG=uFyXGLZ?Y$CO{8Kqw-Kms{Z^jy zG%JR)Lis#voAI~^PQ^TFFX)bENcSCR- ziStNYW!-i=G+EE5C-X}JmvVu>*PeX15@zdkV9Rc-fnxf^#wSIC2FnH;=rM zuG+Byit20*py+|tTFETwUdp*R-D>;O;oOuHqKNvs+UME!d$wb^fg=QU_i7;SP@|k z1de42gu!=W(0&qT(b`Be*b&+iLsTT*!}gWn)@4Oeh3{oW;KW=7p$fG8%8K}62mton zmu7cPgX`$SXo@kBpnqYwE|N7ms*g6p;kG9S1Ur|B3kd`gMxJ+;Cj*=LEq=8F;M}Uu zU%L{Lo6e%aT3F07zAaDQv^OIYUq&V^j9e%fxe)g<4!h+r&+4~*tKV*^{u-?Q!r4|h*teOb zTcKzD>CN6llR)S4a0x;L{mK}H`SZaA}l;lVY2Vyiedj6SI?aT?(a924`Y#iEoKV0s8@D zaRW@4v*fo9_ej^yY%8woDRUY?+SBFK+huA!qP=&ee1=rJI(DPyZI2$d@%W&zM|K@X zyNa-+KP_V_Rd^9q5q#+IN;$@=qGci-vfeoMry7V_k1OdtbvPwk*?KYorg_ZGZC$z9 zb%b<7{~Lpt(~bpa)ARIT_I5jr&z+>(qwnv0WUYweWIf6@f+)*if*i%;@hnHn8z+I< zbD(D+@D6Dljqq3x^zELF^0Gno5kArd-U-+Ccz72&Lt4jBV2MVhyXbPW#Xa2anoO&x z;FhW0s!6q0O(0heFS?m3D7^xU= z%hFtv6xA_<07dv<2$!v@}5S-!p#Gi3<4$` zjR@a>uTcDQMMYmx#B`siSL?>v6vrG4cYrXskl8TX=5SJ)^?L`EP|%f93EHq3N@Ab2o#PpFi!Zg=;d3tU<@v5019rd3Jj<^q< z8f>rBQWp*c#{0dMrU-6tX$67{=Rn@sejh(j0zW?0uC)Hl5xBHL#)|`38w8ZOJBY_Y zT)FC?qWEA3((FoX0DK+*?}GRTu#?vm zZkys-ARUvz$o2CrR#l_XIf#BChz>Jz!wi5ld&@x|J3&f_si0~w0Y22J1Y~5R;aECI zeTBK}_cVK>UZq+3#~sVqoz0Jq8$9aH{*-RpE zC(-U^@R8#jNRpL8jh{;At1m11DK==^0qi6y>T5`RpCWv69gXAwIBpapmD8=nk+3fM zu5vn@#`G zo~zp1Eqs&IV~*5t(qi)?zpZne0h2Ri(LTc>kicbgqaCL<8WwOfAG7>&SPr&w!eBN0 zX_jt)Cy}2OW^)Nt;F=_X7x@97T{b6?60}Bw<3@8^P`j#LCooC#XiZ7Goev9KIA3F2 zyK+)@KXNvTBxz-`nJ;D=)Io<9>t19C(m_SPPVPlW13NkDK#PFgv@nS4M~EPe|HQ6K zX{GQ2S%y`up}%p(1!ifGq(v~M+r_b z3(E$eWQ1W1V>TGG#~}1`y*QofQvPvSdIFX>Y}KV!m!pt=v&O=b<`gZ;X1 zZ4KIfE8n=!1H4%Yz7e<$V3bn03(Bi1@R}gn6&8HQ`zTDK(x+Q=!BHoyE-mvoD$9?? zWGgF;_MLYNeCz>38YKWmZjSIA`vy*J{h?e7j%NvZST#u1#Z^ZjD)6%Jk-)~P=>z<9 zl>BtG{B#U{I=MqGFaBG-B zV(p95V5H@xSmnWh)3~l428RBz>hfnWxo1g}JI;hw(qt>0EQhcV5&*hVdU3n}lRf8P++5YeO77_ly<}XGi03HYxg*R@xn0 zWV6UZ)f3DRjCa{vQ1e+RL%@Mm34FN>%895{0uDZu7xi)7gg3-{Cp$sYDF9)O^yA?{ zZ+e>>8b_r9r=JbHP<4m{6SG&JEL2_>T_fu;iyB-%^?S99P344O#d(xs%&;ZYMJQsi zZW8c#(bR|;amsecFcP;PureMuQnEWz2dlIjH1GhU4BZup?G8(OAf#=~5DR@!5&EKC zg@wjaCDE<$C}%}Y`FcBk8&K6J3wV54Qy|dC0X1hgL%~ABy$NRS);Ixsp{}s=J>mhY zFW)L|!bFa0sB~vsW72$O@v3EkC*C$!fCQukQ$NQ^pG%h&Q%e3*ggsJ@a#T zYZ&83&?qdpr(q&ZmX;9q7~XqCkd*Tm~{EcE|jJb1`^wd z(A-2~bk*rXO=iKwl|xlh4Ix=j|3(V+o(Y(P98lrRQ=Qo90l#di4m)Xu=-zdedeU;hqnk-l?-uXwWWQ4&b84%WmOv*(=89uQgBrQ9~{m>pr2K7v1V* z{SzHTn6EQ;EW;@^e5- zzk31yv*vSm_P1+6WEJpi-=#BfjoV5V83o+Bx#Xlt$J)BmtRvMnJrn_Z1!{d0)fyeq z)puQr$hE0#hY1QO@#nm3=q>p!P?@CAxDfVrLv@~_CtiWUZ2FX1lYYbKGz73mIcb%f zvnT`xTLN2*aWl`%)b)Y$jJ(w z+!rx$=e4tWoI8;O`%cIuOBcXxv)SBzc};R6i6%KA8=BMri@P*omPc?G zDJlbOE z94LFgf>+&~^(e}UzS#s)&})DU2h*3q2c8XwQLb0z4#%7Puxbs~D8DF7!VUBg!6U=7 z)NAxwYLnL|H*wvUfXwmRo1$F-RtLnsMPe2dY?oQM`dI3_*|(Y{S?bu0n>vdHQQ_ z*#_U-UeDqYz?Klf;T&l_7xt*|iI+OYR+!Af31D1AKLnU88~zUm5Xk7+;5)>=OSNsn zrJ`FsSm5bT)#Q_^O}|b^>w3^un^`kNs-N2fk4GF~9?qhdW%PSlwVkf10=fiYI%v4S z6FP1~NG-R@ccbSPp*_^}2VNB-v~^w9-l*-2>`?YR0?7ga&_|;_wrEO-p3n_W=e52) zpdWfJ5_|)CoBru7Ev()*+TuVhQKB#{yskki*YDi8XG(n*ZEIt?ONT|(BK zIAZ@cfrvvmp{n<(O1C#JFIyHx+IOQqVB0&`%F+;Pe0Btc{HWrS z?2l4+ZIuX4H{|)#Wym+EN@W7zemNIhn-S)auFoBN=4hb$+D60DSi7iU1XIor#{e$x z?^TvSwXq@>Jpis(I*1Bu9el5EmAH};7A6uV=e9Z@@UI@W_I zu1?3YveP$Gm>b~5OcbyUFNZ7aY@KS}iMCuQI_fVd>YI8ZzXww;T8ws$lF?@xf((PQrPb%~7j+Zo=5J@a<>U0No z0pjNFtlS$s3yLlZGx&*uoqpsSQAG_Up-c6fY+dRQ$X>Nn-ca+d%XBo?>LynDR`peo z>`XeP)zp9D&ZRyUu7H4HR6>Mxs&&es)@GwYYOsff5606JEYPM#@M!Tuz{>eu(0%0< z{~Hg!gRVf)Bh7uy_F-gYb`H6*I>wYl-K=!91sy-F7xQ{qxgd&9fTuzS)5LD zXs$}}=fqb%aL%@MjR;(xo=ND93bJhT2=C2;`K1@Yk9B%&j!|K2l>`z;MOiKCk0qY$ zL8GG`Zmy`|l;`dPeY^pzo+;5QKv_2)2)*QDItzNqx#!l7fyz`HPGMOyDiXb_Qhg97 zmc+?A{0wX!4AK7R>y66Q`Ql^ay5 zRt-!km^Zz})vQ8mua(X2w5sYArqY@MO0FDgSS8*?B?V=nm=y?5_0&lpBHqozqpY`t z@dRgmK7Lf!U#pV8Q;RX`H-(ja8QKd5!FmeJvvH>2A59ZArvY&~cxx4SU`o=WV;+8P zumNwTq|&eWcrHZDV7NHzN)IvI^!&Y011`eGRAl@lBNP11;K6S-p%`HL;C81-D}0=( zKiNBy-B@biuQZ!x24+ISP9BTGzJu7qBIwL?l7`vT-NR#m+~CG`Kp?S5aDodLP6+We z`~bf|Eq1%B%bsy3Y(gO5y=j-r<#M@PE|<%Mu6b|U1hG7I@bDAQKK#UkuRZhB{rBIu z^Z3J0xcl58n1dIGwbR2j441vb$6kg`Cc|(^#qf|wI}z`*RfdxXr!oupFyREm{B>AcWoH{!P&69bfV?&z&;Hjh#rt*7+9nv2Xzut;%@RNmuI&q0g~antHsKSL zO_>?3$kKfKo2at0!rb3zQDRCvGGhC9Rc2UpoS&=;_D1ZlHW@&Y&t};q2U(r2|0+woZ`1AbCZS#;%LJ~r@IxDvn7CRbmlwsG zyvyL+)(MaXLpk`%u!+cGhl?O&U@g4pG>g5gM-`sV;B#4-ddMn`^jQGtgw#}M&DSP@ zVye~!=S-}@q%JeOo5T9j8>LyeuI6P41$}*(he-Iq`=m(cq#MIpRL2)@(xnu{5Q)su zcwaWp4OUEU2h0zOv*I-kgXT3Cbi8-u4}9g2`C1@fE^&L^ZsUfjP!3#UXOQ8p|_PdJ;28T>cbS zP^p5``CDlTCF3`vQQhn6NNkkgmPZkTx5 zr5g0Nm>SI|ePRYf!0WLXXVZ987F=TjOSHnBSEQ6Va3yE0M~~w0wJK?>&6o4zP_}CH z#2XFwE*8ZkpM&wu*CS|ccK$rFT+3NnRGg|KpTc>dAg8Y1F*I6L)QgA%xi2sHL5g!V zAZv$Pd1juz*(DIbTeB?$w(U+a*s4|wYl-c3!su#fY!pP>37e@A#zx6Z<4+!1b$l2( zvua0_u9DY4d2Vhuqvqr^dhihy$7O6n)MGH2CdFSt`8Wb#;WJGQd?^Z7C&!7mxu~P_ zu+JoXY`&Ve4)^TYrKTa~2t9CG8Nx*soyWwLyVFTS)x{1e_v3Ik&MMF8A2}Q7w^@8@ zxFLnQ*k*L7nI}Om>6+)gXQ9yhu39K=m`s*ji$e(!rwoht;ugD1rGZ7M(WbhDb(JbX z-k)zSK8oBN)2IviuiGKs9`X-qdnJ%HjErGnz~#sP%WrS{@Uk?#Ywev~l6 zWm;8PF(PQHN!{@RKxAGTnJSd(y0^(3YSwFqvzQXRjI7G;vqq2&wApIb z`lj>wr*g+>?9*o5g}gnzqhwr7Ze)v`;TM|S-Dmcn!wj179eH63B{Q_Bq;ItdgD+jz z8_JrcV$KL>L`2str*N{TDS9okw$vQ!Zwr<34lwRj4uG1f=SJF!4-+gJ7*29Uk28Z*C8a_Cp z^Tjh3rsqOaV#l;ud*G^f5>sH>Z(o0q-23#y&pv$b!DGn-55KsdJf5Ev=95Fct_pate~WDB!kOR%EV0Y-j~=-~*nL)@TOIsoh>$+SjkS=Z*_I zq<&ye=RT1xB0%`u7@c;do!UK3vRHP5hIGvH6WpCAyJ|ZWeDa$qy`t5hScM4{(lW#M zy&rC1KDRiE18cfjf2aK=T{u_2Ta!>T<$=X&4*KovmH8|4*OTi6Jk1nz*5NIE0M499 z!g@8!fIGA00Bp3!FeyOxOobBO2V4r1m1#uQ9uIRY!N(eB*K2@kQKeH;oS0h@4!hpO zI!=fsEV#b#Qsu2xIk9{1)Ry5PV|z!q*kuqeivQ!Lc$(x6Jx<0>nVrL2KK1Y=$qQ!R2E zjM=1turHK=^5pt}n-0!O`Cf>AWvr5qfP|B5J3E{zjB1>MapCt&s`WBk95;K%A*42W zu}-ALYQD%%P5?ui9Amd97(cN}r*(%H$F85Qy2`ELF)Frmp38LZ3@xUT=BIg@+WjOl zgcb;1XfLOwU4V{@#Z2TW5vatZw|hp+po%itAMDTza((lHobH%@M(zPvPUy5GDI|rO z5dE^8zH8%IfB3BRUR5&RtYAP+6EhlMq-F# zTl&A+JNLZ(_ILei`H#31#2?}R1)|Pz&b!Y=c4B_V2@;`+Bd7+I(RSXEqSbuf9VyoR6L+MDj$Xk$|2`Bor{=mX+0J*h zgy@6L9t0YEl)QZ3{r5cg;H#86iZv@zZ=c{IbmZ%a!SS%qG9&FAwx^7S)~}g53nDMd ziuY8=p34~qeiAEiF=cW`@Ymdg%~Tm(Jfek+_D0$q+};&fR|~XD7(MICot>SY=SCKR z@V<+eW^qFkhw3@1o)sk1aqUAjCKsOu&vFn=WaAZAU|VcMcg6E&wk`pOqxSCP$)h(g zdIC%OHDYwyK5_j4^;D&Rw@~<02>o#TiEYoq{`Sp>4MBlZ$QJ0IG|(Ot<}x7O()8VCJT{|O zk_4;nYFYvMc8S#if1dNEMa^$te*62+pVXp3*w8)d1SFkL;6r=f;7mqcVf;Gr+iB+` z!YQvDMCX|EVL`t)olcR+mLr6hk?#JJuB!iOS>KJaZ3z*@dSXN~;H4GX*X|Ha<>S>9 zF7-zEA2xe)puc~THz&*^bF7gIsJzQvMwP+?p(5vkn>L5lx$Pe#-7341kc?>c!iB8G=8d6v%7c=ePu z8(1lP`&%H-_c;=k+h#K&`7s)e*qHNz>nVsthTD0E#eMNRkK(rc;enx$1~)LJRWAY~ zjLZf6HC;M!YSs%~3+6 z3BOI=i*Rctq^1*A(=?b-Js`IYCNVp@<_8E+iX6qpx48gaadAPnu3HH(%y~T6}>lqLEEUla3kT|_U~Gr4)JM|MZKt1~rb~W#^FDsX@-q0&M-J~Lky(mDCtND4 z`FOgbrORTepayy_m>96|3M{obHj@&mOUgL_1BrqVi}XQ&C2}mv>l^)5&uCpXV+HVr zN6B?9OrsWKS~$ij-ZQPyxYVK!Ik9~p8G)J9vFCjGb$93Xo86QE~*WICQ zKw;sk%OV@+kdZ^o%Qm;vW20c|r8zpa9!FTv5Rb#r+Or62QApZ(TA3!TuniNZ<66py zq#Tv4i?qWA%*TGC`F6TprC^%8ZWp>3V9wz0NkCN z&q52gc)itJEFYMrC!&mtiq#x@Za+8sCl-^kZUDSKiqX0gO_gepx)2PYH#=G_S^O@U3u37&pr0o9oHkoU9YR7(byKGMdxep_~zTQ z-6LoZ%oHO`XQtU^WkEt9lv@Vy*hA60>ZD=_Bn40nWSV-Myn$iRNo# zoRQN$g`D79$*;jy8(?$?I6va7|d&u1)&7xsk5uoA0!K zJeHOfgSOYp{uTz|x#4abZ(fqpSXh+4hCq=0T~{oJuMjwkzW0M=4#>n1Li4gURsCJN zZnmt9wN(NWdQm9wR-0KopW1p$5VHcv|7F1YP^ zxB9xTsyZflO)0>v_4j_wM^^+G_lc|SlQU}e>%Y5VXMgQCzn+Dq4r7~;AyT{ki z@I@&SDH$6KXl-$$6t)Aj*S1rsLD()CeB1#9_kd|xhmYHqlBCfJ9G zn`}wAN<;aDVDPmu_~_OWDd=vw0l+<0G+PmtSyj{KD4;Nts9jQH=-k)PGe%Y(Tw;Ft z1tm1O;?6sjyh?`ZI=Y5nk|Lmf3P615);v{-Xx&Mz%eP+}_33yF2DjZL*mpDdv&jMP z>WlLiqfibA62=fChFCzIl}^VlJaqQTRZrO2fvZe1XRG!7-Pv5MRm3?)4503D&oT8q zVe85Dy5@i%Y(hQdL{{0nb#@}%@+i?Qv5Hd<9ZZs}tgH)RoKDB9DgB+Ckr2J_RtNCD z=3|+oe{mVL3XTDR2P{i_mBr-`H?jEbyD6sitdWyB>C?9B*t|@SV`P069;o>mb^^ZH_Fikkgzf<7Enbu=XPm(jrTTcfMHwW20D)b0cYhCKxj4*`_HztUhi54 zG@LMy?p47*e`!n{RI$S+XrfN=$d zRo0jG$N)j)C#*P7v3;bLoI-PfFDeL1xz+S8+G}-rA}t(~6dD}nEjvMwwLPEzzD3y` zsukbu78D9}Y&tE$u;lDSGomq|$9dt@yK)&h0n^OugnyR(JvTFH*B;cvB= z+8N67I$IPZw5vkgV6zhxd&+ukRc58?0gTDQ>6PRZ-^@+tAkJ$rmr7K#bD&lYG;2~! zy?rkN;xOwO>>3M83^f!vg+-gbM_SRGwU5Hv9`sQF0E?CZlb|yjD0yp;gqFM#FS{bT z6ra@covo@Pta`2Df*SaZLZg}qiivyj#JNLBhfgvN{;)3+wEMg9sRPzGdSS3iNAtzP z-AB#dsVoQBB%@J`7Kp|>*vJftTXG`2NIlcg&^YwVf*Do<56MHVquVLkWloLvuGMAg?%w{u4Mb*=S6PQzy|vyG*Ze zQo7H7(*TqF__zg;jQrTn2Jz|r!m=*E2ya7tSeu$>A$B(j28(*x?^9KrM*$1vto4SVdW7 zSbhdUPaP2{`+K$m0!P+0gdE9Xl^&N(;|PNvitJyFUlje~ zfce0b_vMMLfwgl}*=gv30YyRWQbO7(?nKk+2saZ0ial{+jYcz(L$}}z)eSk+y{wxr zvdLD*qhnhyJxV?sm(HCyL-o;00C4f-(OHwAb250-I;-hH<{P`UWv{O#jFd7sy#({y^Q$D?@!_g4*y ziw?BoVq^1Sc?M&nZN~;klrrJUqmq-AGwwm zQC`ltg7IlUPKXf$&YiH%@3)r=uys$Si=z}SPLegtkxFB8um}F(hwr=NOV zX$}&=VcGmezHmxa5wi$p9ury<&)n~U_`2zT$~t!iZ!62T>G$NuF@BW3H^DfqK_kPTDm&YrTrpM z;HkdzHf)Qz)l1%bhk<%)Tkp{HDfrA1YEoEB?c&9Eu)+W6r3SX){*v|C0K^09VP^;o zsRNH?>-0C!%R7k)m$m_}8PIjgt-}~InBakU_BO}>_Q+l{t9Xnl&?QAzcc~M}xFbHItM?vvVJ z$_RH>ozVoe(uMkl5^!0u<4Q3S;Idw79)u-<$%<{mNtsHKdGqcrOO>gF7jaN^r-evcbbcAyEb~+|@N?hyy#FN#z4?zir192Y^L)wDNLKTF=TRXK?)P%VGG+ocu?cG^!G!g-ccAt+VBF3Ci(l zj46Z)jP`oRe+k@(>fwYo_QfWPoe_vzAdK?b5n8fWTgc(=cBSW`VH?AC zf|_*OMew}}Anu=n8i&oRhO#Lw=+?`91PnmO z8L7zr-1|zEY!(GtelaIq9O4Md@J6xsk+5cAdtkaqs~d0N07a^!UL{gpp_bKG*}87o z!MfI;gOR??v^`K+M&Miz4Y&Ok<*?&2h@eDcK67eLj>s%6-*iVzJQ^AzSO`wWYV9Ay z*I+Tjm6ie2_NK1-E?(cpgu^CUe2Bjf#qacOC?D<7-wyF_sz0__qPKXnZWVOYIv_O& zGH6n%^0vR7++oPvK@tbeAAtPr7Wi6#A2z|!-?vuS@3Iis!9nAP7rOvIY=RT^Fhh=~ z5H_vHL34v7*byOnFAEQ4UsawR+xXiu%1W?P0k4C=hZ^{D^G*!P=)EaiF|d}yD1ni0 z^aVbkPj*k^ISt_9^#tmzhoax`0THPOoozI*i3lW2)!RGERaH-~zMO5a^TL0DQf%Wg z*yjzTN-zV1%c}Bmz-!!V4Sk6y@tWV!DxXsFeFU>w-75!@Kpb-Ug}BSg?6NL3Jfq@M zx#!c0#xjVHOdXGy52`BHYN4U+MH5zaR;8~!lRa+1d;R>gmU;g0$$Y^q_XXa;vg#;q z0zeT)=}-H+`W2~}^3G2aua5bpc&q6cFO(eE`c=~u} ziC-9SKKM&`*zB~qR?Q86Eo}`@UDX-4KNlJhnnFljT<>FfXXLo7s>|Z7)nSmxv-31; zefy-^6xyN21pQGLo}Cx?h_xA=4)IYC&sa{WOxQT2dQ$J`6MkaeVGZg?R*>p-7%u{SQ+f+QE*J0i;hV^yV2~!(zsxv_Ip1<2(scjSOuY6VQ^Ywab7Ow0JcUzCF z+fBSMqE{&@a8^+r5o-h(-!{2kw168eDA34a@E4(GrED+8Jn06^;r zHr4vd{T~o|oh)3!VsKVJa5CVyqNjLZ*mT7S%SGz``-H)UZ z_>?R!-S>VmOknCA4fHXy6^56AxnRXNDZd+%vF&TKpQH%E(Se3lij5FZY z3W^qCN0o0IBt`@Uk8?CT&SF|BW4GB=C9qQoZCuoBqD!-@G9w2jZ1v}B432>RPT;?z zAy^aRO5HJaH=J=|?BZy_-|pgFH=w9LuJPlkaKEUT&J$;DXU-g_j$&LrymK7iO$bTH zB0@7F0HX#AL0)Y-R$x~-6uun?1|($#ATo>?gz%w!MB+qH!g~^j_l9`9HxS+U?4{95lKyBd_;HoL#Z8#z+K_|uEJ}7M!YNgRO0DqEPr?u^ z#`B{M5H~sxkDpSsH*k1Ijur)Sf=Ze|PC_6@sG$kuNH=9QVxK&+!=$AUZ-tZcy;~eB zb*&NA!pgGdjoWH^Yu&7CX)3)n_v)H4t}IjyGHuSA`4V20NY?hwXmzP48fBYa$mo8yQ!(KJ|oUAWm6-@$sdbsY|^t}U9bbt zv1CaIJ7{U5IUg< zmJ5fOoRQ=p5Y9+#+|jD9Tp73tc0Pg>m@FGLChq^hCeGzIdf3}k&V(-3* zIcyiQKVsi7P!wOLdeonx<~0>OLsNk`dLp$C530YKp#3Gda{@_ea-oN4ZALUr_AM{*lA z|3;$G>RhH2gVflq;-^DTo~tp&vO>JMQX9^VT%=1}#%X5FpQ$Ja9C~n%c_QiFX$~Ev zg&vJRK%ghUu2=eZTcWSs*L`(x4GmCQS9f5kDxS6~a&zIDE=cE&JL}$Zb5cbTTjg^T zeF+a6h0C~p-w?Cus1g$@rg2=-tvV0XZo~hC7={Ef7=+_kPDRg{AG&LYfv&k=r_*kI zLxdhAmsGpq&K(X3LUt|?tO$Tlr^i~xStThMckD4WwdLz@(j%i;SsmDi_Z}$HS?0Tz zWha!Go#De~axB9>afXQ)=m(~^yKw@S%^J%t;*g>sQ?e|kWfBY@D! zd@J3c<{EQ$gSnv$>J6#`io7#essjV1r>j3iMV{|pR!8(2)yZg9xhJ*#+OW^K`>pe23L0w-bzycj)5wUD0v$uM5$3 z&6uY$ILESMfFe-ewaU>(?hUoXI=f|4_)CM~19d6j;rTsPGm5+Zw)M_kT;m`JyE`x# zs^KSBm1-G3{)tVGxM?Y6Eo<@5u_4;lrmbt$GpL1VJ=2Da(=|3pVgb%cdP7K+kzU0` zS+D10Ev5DXcCexV1t43R z!^UIbGaR=sVdAo33FUYx+HsqOT6&DbAfTN5gZAyT9skoVhBX?TL< zSw_O&Rkr~8lFzVwimSsk56`n2#52=eA?HU!9kIhB(C@LQzBjZ`1Aj%}+(A_pIWQM1 z6?r;Z;#&vV#8m}nNe_dAdzfgDM!y%*xJ`OpUsQkl9%?#kJ13ErO@uV6&BTdJztPK+ zB0ZvB_O#-*J2EX%qO10!uP=)^8hx{DzJeZUhYDl0k~9F3H!q0X$4}JQmVX+(O>HVBR;_Xe%??BozhR7L zIPJHv{ECJ$0T^G9(dMyF8Y_k#6SrUhuV}4(Q5PRJiVwM1FCw%+dJ7M^5Nie{;Rv&w zbQf9VASI*N%0cYEW1bE;d%MYkWMuf_gIqVcVIdEFzA49@>!1OTgU7K5A=U)ZHU-WA zMnJj0F_DQYJTd$%sX3yiL&&<&!)7N=Qx#r(PBd%x;F3x<6)Af4AiH6PF{z5_quCnW z@9=AuRVn-ugC0F+&TpE!y5qJ?k@bhk9FvioEvlA~FI%fxEVMa zz76|v0xiuw(IKK-R zON?aN=h@brF+~pflI(?rR^rT8bh1_L#U6_jF`s2I`U3+~8D5*7p(<&tH&>T$d zz3u0sdP2P8Iu+q@X!cu*?m#BQl7$+DJ&;kT^^^hrdMJ<$L}j6af40uIMv}Q3Z`k$F z4IflD!V~HS5&rwZxCj6vxuCHJ^(3CE@;jGTentwf3Lu!#-^(RGN>Z8aa` z4ak;hMJ$FU`eKm5qeTVGgNs;**K$M764bWf70wn^GNtW1=04hO!YCB>TiD=ZW=GeS z7T{LBuGA|r@m#7B&B$};O4g6reA3)B#%>EkmTB03hH|of1F3vzP6&b4$!cojfx;mS zT<$X&WSKsbSa}_-NjP6vbimSC>nzXg<4r8Z!xOmfZe9Wz1ey-nARZKb=*SQRq+-B* z%p?Mgg)1DpI%4H~&B^EwY*3?D9$~7!B;ZmJmaR*wDGP%lBMz8KcB>5YfXx_fVR$abZDubkjn+VhQsbb*}*|8f#1b& zM3I5sq$XFolF+Un+k7Z6L4>6D2XUN_COX)vjVbQjY(wfXd53!q{W-|eMsGAzu!y=@4;L@UQAcBd4lIc zkV-@?qRfc6C_w_@W{0nc;(^RzOE0I?JUu!Av_F#flHO|G_`zG!o|uB%^!-yn!hy&b z{sL6Oc!AO>*3VEXZQNF0h3(yA355kjHmoPjt3wIlL}%z`lY+7mF*K7*Lg2nsT+K7PtZWK; z=+$I#jKq-*qOL~=?nEigt5Rln)!#T9UFlg5ZA3)nWzVqj(RAzwM=&U}f z;MQ0*bs82sjC!d1q4RE|(Qs$%l#*btf#|X#B~C{-FL_u@?tVu*oGWP%A>#`j#B5n|;xC=tCO}6bqnhm>2zXsGdgakt36ucmK;05snFTn5N55P}g4tu?` zV`n#QxdebdzIeyuu{|D-$K#pG2wwu_Vw_9S({(#tqpO8kJRK{nYR;G}tPEEEu_E62 zB#4;>T({i)R=`SPhjBXf>`{(A1kJ8D0(iV zr!OdNN>h}v+eoJ5$m(om2UU4?gr4QOF*-$a5W(Z<0K@y!#Tn8TpJeF>^uhE11Tna} zfx4RHP+~8zA7hYZ)N;{s5R5WriF}ltI>*#CL zvdW$gyeqx+MyI}TyAovK4K__d6J)sMP~gmeS$EH`(`!HraNdg%Zt-Ega@2e?LnZ2Y+J z+_+=#6+l2&1Nb)_6ByH`&^l#o9ewKn{YQ=n1_!2iJ6?;gP$jM8_St-PomvRxh`@s_+gFrU==mq8psQQ_QLv^j11V2Z2gymjg^!9JGD-P*w$zk6BBI)uo8`Y0VOI$Z^BOvFRY zqcYHvsHFECBpzzoOI-R1;*}8cFS7xhE7(~@9y4Ya?d+oBcokvn6U7%4#7+#ikpxx* ztA%qB@vDXJs-m|lc+VwvTMDk0VymUVzE{Y+YQoozRM4-Xg=i^AFGv zS9tw1)H&tz{bcv2Oe}w^h<2JLDVi-sG~ZhM*;4wYnv_0mlF}kpfSIM!W+@H5ftuDa zhkvq^Hor*to-=x-Cm6;u`ekhDj~#Wq-B3IZVBSUfIkeXUOmCbzScSx-L1@_ zoy0ljC8Zx*t9R`y?R#Q#TgY8bA4ydEY@?}eK-<0Q2F8~icK?#QDh^z61h!dxnId`E zp3OS;kOUK2A`g)wGOq5(oiSrd3*y*b~XK>mZeRt4b89hpdl+ijH9s# zzxfTbBCx-Go@`c14s=XJ=5gUjq23l$)>kJ{o+UO28Cl?u(l@}n2{5sXd32Z*KtxiY zf?yZhCYt5p|7`|^VZzTZ)Ibq6H&BPI-=CpBx?!_2+km3c<+^+4c}PTe>wh+dpvV37 z1fKIXBeH#!JG(8o@jOoiRXbul!k$LW@z{VgQaAN@Y*;L+N~J zHMlm3(*B{ztC0LZCkqu~zWgjy-W*he%Su8e-`>vR@e46PeLN60#+O|!+7JWQ+q zOXZQ3TeLU0fswN6o&XjJwL^~>nv!Zggv-;)k^l2+wMr(_B9+NMFTWNtDaoQ^!->bn z(00CrT-PwZ#!Op{$+`yrXX`pgwyss|ZL}xvrO9}No@5vsJ$n98bcdd1ly5~_SUV7H z1I&(_(Z~Q+g*k6XASS($%xXF5oza3ujSeG1?fPDZmmTUE@WSub9+`fZ=NqXmq!r& zN3(ZT4HM1Txa3V}d?E}_IFi&hElztqDt%ortz9w0TFy|_p{Kc7QGouiFt62-C#KAA zMdq$r=P>G2xrmRGD4WlK+^9&B2^d~2d(;o%wjG}7sRd5>fL>goM@)SpQ$b5-j+!(Ep>!`*Y%(}$z z_oXv_O3GUjTSF^fI?h5_VGoA3toH<6hUWOrl8t+H^p%?RItlKNa)V`;BVz&=k%#eS zp?vNctkM{Bm|uFTh5Z;DTot!DlWELLFw4_J>|UQe)rxGM50g9PT6K%uESq=?<2qUZ zcD#(jcI7~_9sgNqTUzM3{P{;a>xSp%L!<`#P?Udt=TbOG4F@I)eFA)6*rJZz=dr+E zqv+z9LkX77QuIKYC z{&jkN&Axv)IgVKP&sh5F-DZW2tJtS}>4B@6R%SDq`E)<3Y6+2hJfm&s=UI)S=ZOh; zi?QA_9o&UB9|x2BCjRZY?4fkbzaIkC6@PR&nVFq5=zWc?h`;rtL%uo93UjOUKpI0X z*MK($`dXmb-&{RGzud)q=lv_Bfrqxnz`LNj-sY*olUE>sO}Zc$oA}l%I_$M5fdg zK>t24V>8Q;(VlG4MFq8%x>@MLQr8ljc{5 z@no2c)orKZ{7RK%l=A-8z~^uebmc*S1s|eh99TId&h3W9NdizLOxY`NeSe${-zTjCeNm@bh{Ch-XjC9)#}6&6KVTWIs08Z9h1T3tuKmRH90 z{&5md=F?VkqLM%-Pl)?ogbs8n#V~D?z1-)0(`TAD6!z-CGFNMuvznHu%wmI z-fE)(%wcoq$${}!?ikRv<0DDa5&mS8EyMjaM)X@ok<7Af>x!@559A82O4)SqB3Sz2 zGCT0qUj7M)Fz*Q%y)fh!rxu0KUg@ySzB(}|d*BI)_LDd|!E(~-j3!1k9w$i9d`b#MJTcJV7zKw3Bei> z;gmm8T#e>;-{Mg?TUWr=Rr0vX$NHKff`roJzFxHLGv)m?v&sw4kFmbN!KZRc&@Mx6 zxj87IopL)mq>C77p*s;$t|V0^Hxy;N+K>o*S;6eSVOg_ki11P~#tmxy*RQ^dI7-aD z`7A;@fWfnAG68Mb*bMLui5X(4auavM)N0i9rL+EEo*Qg*nxx^6p;bYJ!J)ze0jHGx963prYW24oRwAV3o zKXc$-yb}-rk39Fp%oGYeRw$0+@p$+5Z@&2Pw_iSr9tSESI#}&Q5b_fo zGNNZtu5;Pu{j+?0BYKkWL@>GVkusn~l<;LILhbRcO+u&%+XTv>w6Uz-fk}KqBc5kt z(E$yPy1D`tz}A{HV%#sYa=#`JKs>6oh>TlzuaPDW5K#v^4i_8!F5}gscyh>=zq{AA zZ(TEnKK?ryX0p?}*S5f`WpFe6w??r+?_M)Pj81n3uf{x$LEHhsPi)^2ZQu0BEhqiK z(e}+JgSXc<{iJLHE$~H`bMJkh*mOtZLT5VqDTjqY5f?%IqW6|3C5wtMr6Rc>9|y>-PZx3BHqzG9Va=>PVr1F#LWZLdn);AR-=Aa_Ojl>&dN0{lQ89Ru)mWzHrOY0E%wCTuD_KCzInh zJV@{nm7EvpEmb*GTirF-?LPZqg;rpFhg;z^z7f3}wQX!e8{0eEwux4oq2Bsd+RN^X zhxqiTq?3)rNNME$3Q`qxUAoaQ02cyUzhwv2)iZ z|B`@u4(N)L!d$PZ#!ML9H9Cq>3B$WBn<_?~`-uO)_|VQrW2;FX7YP!o8x^e)T-n-# z_$!Y(4^neqe$u|VMKa1W@XpEGv{?eXhD{MR{wOv6>HDo4NBP&HSp;)p27W}Hhp4IV zzZFe2GdlirdF(_}OrmHxPf;Y@2+V^(evYeije2h%z{5}Q6eb-9e1u^~1o3BgR5>yQ zTL0bHKVKx#E77Z%R=NmnNO08V#zeSwke9F>OylM$!h`I?c{-AWu>V0xh>53;a8c*s zE=ao%zW$qLrb7B0Hlk+nS;}ZPtWb~lmK$I0qU8RmHACmg`I>wtDVuy2!ycH1e_o;C zBAKDt|9q`O7ofk5jx8n99zV#kHQdLuCynPsS(dVN50tfLZ~8 z-u1&{WGmTWlBn8^l%=DJ54m=lfaUWu~zB)TmhnyzButbNCo#@&v`UeW|$g>miQ5*2I(<41Z z^5F*lFHSdlFTJ1P)JCdiUY?g8U_)^^`_xQ-WJ-72PnL)D^3H^bFP2b$uLb3SETWDa zd@8*^o8w~HG6ULe)7P@H-h;WThgj}s;A{GQOU@Nkn)cCoZ8{&v=%|Ozw^6@;AqH>D z_M$}ne%;xJoppLY8!a|a{(=)W#9bP7s&_Hc@8j77{Rtz=jA-N46culP`Lr~SQ!ZP&hOCG7JvNi{PQOu{MC{s%)}aT9rXmRiP6tLm&Xxr2r(e z5?J26H||yjEqCE-c}E?(tzY4Kzvk$7CVN7X&P4UIBHW3}hCajygR+|~U?}GQaUDbf zrX9zfgkIJ^u7((lOkel9S~{WL78z9tAajCyC5&Y)KUxy_s~|*pi%O3wNnJKc*itKK zmo;Fu;$)*Dy06it+^j?!PRiv$+f{-8cp-O!J>pHhaKV7xHU&Lmdy?)^Z7&O@tKvXI z>ea=4_It;ro|09%L3+_-vWZ3vQ)c%wHT+nPYqZk!Jn@6(i3OEyv9$t^cec=NPZ|w> z1Uv*#$MxXk2p#T5B*Y_o0bl^!&Ze=lYpm-37QMYls4{NBD5if@K;db`V*$H~ks`0C3zKBSWP+KG(3?$th; zL-)Elb^E_RI^wuPJtYZtfY|En@NbvZ8zQk(fA8^cw?2Vp^gDUQy=~4DUnynry#fwU zCT%u-aOtka2Pr09x&1-`6^SxYB4}d^5IyJ8#r%-VmOJV7G@KMAB{Bdju!$T;jyFn4 ze%%M1ryIosw5C7aPrlYW7^oM&M+^9~WV}1In^rs?($V{==?vI*Ob1MyMRu4ofxGDM z+(mWjv<593fR2M!vKy6qaH`=MU9AEaYQdVHBxVJIo-&Pxzh#~%WA3q@ zm%MMyGL+fQIa6n#s}I8_13R|S+2>ThO&$IvD_L@QlXAgtxcQ#J*~2j6*qsN!1)k4M zP|?;MFSyIj!??mPe5hfO;Lyvdya6Qm9k-Y@WQqh~H&(})tY@?cpMU&oyWPY z(EfccLS9Ms--L&tt>KTew^slzmclk{gDje9g2k%ka>J=%&8t2QJw41mTV-kesfd(% z^79Spy1p*+@d_;6x=o^HU9wE+IDGF!x*?P8U?dg9miRHAuN)eyw!P6Py8qc{!Mc|W-%RrTEY9IM6i6lX=9r-UhQdvl%Xq7AMx9AEqYq3$ zw`xo~N(;_jP+$~_yg(d9l8C@THXAU82|uDEK3 z0*W0rJ*7X~r`H3s4v`gXXla<%%sp9?L5WS69a_U~+VRUqMvv6BO@r4xJvyYc$sD_Q zrKQL_?SoG|^}>S>>_lWwt1#7lZYcZoMjnqXlI{5ER04xa(PKu$B#I%TNCq2#UIjuV z-8;S#FA7w`QOsftLd#?)X+e=u(Z>ZwlH*}eI1zrU>(KbEE|GzA219CDu1;$+p)YP( z8Usnk8_~(?QLLuWK7opa46E~?-HyBsM@}w`%!bW_&45xo*gZY)>`cGf4?Z&!uk-x_ zf*x@^)1Z>%v*BFP^q2v7)_xCR;;baae2Th$4asw4LEul``j&D!*)F%_`(vQ+i2%f8 zUbohk?i?L2N3wOoOpiNaDYjB}Xt9QidP_Q zl9?OJ{^EdY=siF5UTyekg3P`K^Q2Xemuy^T`*ZhhFZ$j~!$$&p%l;Ll_h zwJoD@)Zz}G?0uWX-+P`%<^Gnk3#tz z%$Fp3wzQlLCy~>4z;3XzNttsjy1PxzG0ZTA_-FZ;Q?dc;R-d>=ut|{HGySS2{bHm+ z`+*Lt7Kt$|yBGCq78YHF2iFZly~>`eB8G!>cQT(8S&o(yN=hYxH;e}QKynbz$Ft5V zp%lzn7H76P&z(d?Dgc9M@K2T3Y;yb7>S-Lo&@U;&Xt%4YuG_@Z$q4mL{0O zBq^^ih}kkO2bw6U?Xz%3M11~L4H#9blM&}^!vEhzq{Clb;wBBgFyIRZzL4P3Dh%9W znK)(}BFkyD+QcCNiGox(ZisFKs_yiHB0-B9s5{#TwUhFYZJ`XALT_o%gpCS6EF8>2 zz-a4KeelU{IYs4k!LFSuc}^(0suTorx{b#?wEO?;{aLd|7lfBEeanOgg?OWF+7Kb- zc&q(XZJJgPxtpB;1;j*-gumC+`KQUrmDa_ItD^myh&o6&rRScJzUrnKw9|8}mKD~D zXQjAF39l4}Q7h#<>tyAH;S{V>z_!?i{}15*1GT-$>ZTp`Rt!>}KJ zP8WJG@nRC`8#N%o8J~lL!%qr3eW#}4M`1lhTiH%=e}PUQ6D;uWKx`K{JBi;kutGu% zBDApIfRxuP!tiM~>W^x1YpIKU=%cj1onj8PqRQZB3fo;UFd7+Dtgnm(AzR$J3eS-! zB&L)6COPd{3@#cMC5J})b6(6`|G&vxwO!ZFRXWzZ!v32f4 zc-a48&w4N(9(5qJPW?5WNad818D3{|;-k(bZ2cBRaV14RSJ7?84V+@tk{v8=d>mU1 z9nc~x)zZ7MVV)JmQJm)Tg3L0aB$BwgC6VQO*Nf8#zJ`5rC`?AJs4TC?+LBsUxEy+i z*>ur{P&^8?BoRR`hqx(P+7jP%Hy`b5FH%XfG`t*kNk^cT&jy4Knf5TU0aqGVp9R#q zw~kS>44DU9tm%>>5jA^#U2Y^U%0D40*xz41K+hLwUxW4;XF&!yb^_$E{{SrWd%?!R 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 bnG8dHv>;$Z1po@*`+4xpPv;D9Zv^}g68_j+ literal 0 HcmV?d00001 diff --git a/Extension/scripts/Auto-Image.js b/Extension/scripts/Auto-Image.js index 457a0f4..7f8cc6a 100644 --- a/Extension/scripts/Auto-Image.js +++ b/Extension/scripts/Auto-Image.js @@ -1,11482 +1,11515 @@ -// ==UserScript== -// @name WPlaceBot -// @namespace http://tampermonkey.net/ -// @version 2025-08-08.3 -// @description Bot -// @author Wbot -// @match https://wplace.live/* -// @grant none -// @icon -// ==/UserScript== -localStorage.removeItem("lp"); - - -; (async () => { - // Prevent multiple instances of this script from running - if (window.WPLACE_AUTO_IMAGE_LOADED) { - console.log('%c⚠️ Auto-Image script already loaded, skipping duplicate execution', 'color: #ff9800; font-weight: bold;'); - return; - } - window.WPLACE_AUTO_IMAGE_LOADED = true; - - console.log('%c🚀 WPlace AutoBot Auto-Image Starting...', 'color: #00ff41; font-weight: bold; font-size: 16px;'); - - const buyTypes = [ - 'none', - 'max_charges', - 'paint_charges' - ]; - - // CONFIGURATION CONSTANTS - const CONFIG = { - COOLDOWN_DEFAULT: 31000, - TRANSPARENCY_THRESHOLD: 100, - WHITE_THRESHOLD: 250, - LOG_INTERVAL: 10, - PAINTING_SPEED: { - MIN: 1, // Minimum 1 pixel batch size - MAX: 1000, // Maximum 1000 pixels batch size - DEFAULT: 5, // Default 5 pixels batch size - }, - BATCH_MODE: 'normal', // "normal" or "random" - default to normal - RANDOM_BATCH_RANGE: { - MIN: 3, // Random range minimum - MAX: 20, // Random range maximum - }, - PAINTING_ORDER: 'sequential', // "sequential" or "color-by-color" - default to sequential - PAINTING_SPEED_ENABLED: false, // Off by default - AUTO_CAPTCHA_ENABLED: true, // Turnstile generator enabled by default - TOKEN_SOURCE: 'generator', // "generator", "manual", or "hybrid" - default to generator - COOLDOWN_CHARGE_THRESHOLD: 1, // Default wait threshold - // Desktop Notifications (defaults) - NOTIFICATIONS: { - ENABLED: false, - ON_CHARGES_REACHED: true, - ONLY_WHEN_UNFOCUSED: true, - REPEAT_MINUTES: 5, // repeat reminder while threshold condition holds - }, - OVERLAY: { - OPACITY_DEFAULT: 0.6, - BLUE_MARBLE_DEFAULT: true, // Enable blue marble effect by default - ditheringEnabled: false, // Default dithering OFF - }, // --- START: Color data from colour-converter.js --- - // New color structure with proper ID mapping - COLOR_MAP: { - 0: { id: 1, name: 'Black', rgb: { r: 0, g: 0, b: 0 } }, - 1: { id: 2, name: 'Dark Gray', rgb: { r: 60, g: 60, b: 60 } }, - 2: { id: 3, name: 'Gray', rgb: { r: 120, g: 120, b: 120 } }, - 3: { id: 4, name: 'Light Gray', rgb: { r: 210, g: 210, b: 210 } }, - 4: { id: 5, name: 'White', rgb: { r: 255, g: 255, b: 255 } }, - 5: { id: 6, name: 'Deep Red', rgb: { r: 96, g: 0, b: 24 } }, - 6: { id: 7, name: 'Red', rgb: { r: 237, g: 28, b: 36 } }, - 7: { id: 8, name: 'Orange', rgb: { r: 255, g: 127, b: 39 } }, - 8: { id: 9, name: 'Gold', rgb: { r: 246, g: 170, b: 9 } }, - 9: { id: 10, name: 'Yellow', rgb: { r: 249, g: 221, b: 59 } }, - 10: { id: 11, name: 'Light Yellow', rgb: { r: 255, g: 250, b: 188 } }, - 11: { id: 12, name: 'Dark Green', rgb: { r: 14, g: 185, b: 104 } }, - 12: { id: 13, name: 'Green', rgb: { r: 19, g: 230, b: 123 } }, - 13: { id: 14, name: 'Light Green', rgb: { r: 135, g: 255, b: 94 } }, - 14: { id: 15, name: 'Dark Teal', rgb: { r: 12, g: 129, b: 110 } }, - 15: { id: 16, name: 'Teal', rgb: { r: 16, g: 174, b: 166 } }, - 16: { id: 17, name: 'Light Teal', rgb: { r: 19, g: 225, b: 190 } }, - 17: { id: 20, name: 'Cyan', rgb: { r: 96, g: 247, b: 242 } }, - 18: { id: 44, name: 'Light Cyan', rgb: { r: 187, g: 250, b: 242 } }, - 19: { id: 18, name: 'Dark Blue', rgb: { r: 40, g: 80, b: 158 } }, - 20: { id: 19, name: 'Blue', rgb: { r: 64, g: 147, b: 228 } }, - 21: { id: 21, name: 'Indigo', rgb: { r: 107, g: 80, b: 246 } }, - 22: { id: 22, name: 'Light Indigo', rgb: { r: 153, g: 177, b: 251 } }, - 23: { id: 23, name: 'Dark Purple', rgb: { r: 120, g: 12, b: 153 } }, - 24: { id: 24, name: 'Purple', rgb: { r: 170, g: 56, b: 185 } }, - 25: { id: 25, name: 'Light Purple', rgb: { r: 224, g: 159, b: 249 } }, - 26: { id: 26, name: 'Dark Pink', rgb: { r: 203, g: 0, b: 122 } }, - 27: { id: 27, name: 'Pink', rgb: { r: 236, g: 31, b: 128 } }, - 28: { id: 28, name: 'Light Pink', rgb: { r: 243, g: 141, b: 169 } }, - 29: { id: 29, name: 'Dark Brown', rgb: { r: 104, g: 70, b: 52 } }, - 30: { id: 30, name: 'Brown', rgb: { r: 149, g: 104, b: 42 } }, - 31: { id: 31, name: 'Beige', rgb: { r: 248, g: 178, b: 119 } }, - 32: { id: 52, name: 'Light Beige', rgb: { r: 255, g: 197, b: 165 } }, - 33: { id: 32, name: 'Medium Gray', rgb: { r: 170, g: 170, b: 170 } }, - 34: { id: 33, name: 'Dark Red', rgb: { r: 165, g: 14, b: 30 } }, - 35: { id: 34, name: 'Light Red', rgb: { r: 250, g: 128, b: 114 } }, - 36: { id: 35, name: 'Dark Orange', rgb: { r: 228, g: 92, b: 26 } }, - 37: { id: 37, name: 'Dark Goldenrod', rgb: { r: 156, g: 132, b: 49 } }, - 38: { id: 38, name: 'Goldenrod', rgb: { r: 197, g: 173, b: 49 } }, - 39: { id: 39, name: 'Light Goldenrod', rgb: { r: 232, g: 212, b: 95 } }, - 40: { id: 40, name: 'Dark Olive', rgb: { r: 74, g: 107, b: 58 } }, - 41: { id: 41, name: 'Olive', rgb: { r: 90, g: 148, b: 74 } }, - 42: { id: 42, name: 'Light Olive', rgb: { r: 132, g: 197, b: 115 } }, - 43: { id: 43, name: 'Dark Cyan', rgb: { r: 15, g: 121, b: 159 } }, - 44: { id: 45, name: 'Light Blue', rgb: { r: 125, g: 199, b: 255 } }, - 45: { id: 46, name: 'Dark Indigo', rgb: { r: 77, g: 49, b: 184 } }, - 46: { id: 47, name: 'Dark Slate Blue', rgb: { r: 74, g: 66, b: 132 } }, - 47: { id: 48, name: 'Slate Blue', rgb: { r: 122, g: 113, b: 196 } }, - 48: { id: 49, name: 'Light Slate Blue', rgb: { r: 181, g: 174, b: 241 } }, - 49: { id: 53, name: 'Dark Peach', rgb: { r: 155, g: 82, b: 73 } }, - 50: { id: 54, name: 'Peach', rgb: { r: 209, g: 128, b: 120 } }, - 51: { id: 55, name: 'Light Peach', rgb: { r: 250, g: 182, b: 164 } }, - 52: { id: 50, name: 'Light Brown', rgb: { r: 219, g: 164, b: 99 } }, - 53: { id: 56, name: 'Dark Tan', rgb: { r: 123, g: 99, b: 82 } }, - 54: { id: 57, name: 'Tan', rgb: { r: 156, g: 132, b: 107 } }, - 55: { id: 36, name: 'Light Tan', rgb: { r: 214, g: 181, b: 148 } }, - 56: { id: 51, name: 'Dark Beige', rgb: { r: 209, g: 128, b: 81 } }, - 57: { id: 61, name: 'Dark Stone', rgb: { r: 109, g: 100, b: 63 } }, - 58: { id: 62, name: 'Stone', rgb: { r: 148, g: 140, b: 107 } }, - 59: { id: 63, name: 'Light Stone', rgb: { r: 205, g: 197, b: 158 } }, - 60: { id: 58, name: 'Dark Slate', rgb: { r: 51, g: 57, b: 65 } }, - 61: { id: 59, name: 'Slate', rgb: { r: 109, g: 117, b: 141 } }, - 62: { id: 60, name: 'Light Slate', rgb: { r: 179, g: 185, b: 209 } }, - 63: { id: 0, name: 'Transparent', rgb: null }, - }, // --- END: Color data --- - // Optimized CSS Classes for reuse - CSS_CLASSES: { - BUTTON_PRIMARY: ` - background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); - color: white; border: none; border-radius: 8px; padding: 10px 16px; - cursor: pointer; font-weight: 500; transition: all 0.3s ease; - display: flex; align-items: center; gap: 8px; - `, - BUTTON_SECONDARY: ` - background: rgba(255,255,255,0.1); color: white; - border: 1px solid rgba(255,255,255,0.2); border-radius: 8px; - padding: 8px 12px; cursor: pointer; transition: all 0.3s ease; - `, - MODERN_CARD: ` - background: rgba(255,255,255,0.1); border-radius: 12px; - padding: 18px; border: 1px solid rgba(255,255,255,0.1); - backdrop-filter: blur(5px); - `, - GRADIENT_TEXT: ` - background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); - -webkit-background-clip: text; -webkit-text-fill-color: transparent; - background-clip: text; font-weight: bold; - `, - }, - THEMES: { - 'Classic Autobot': { - primary: '#000000', - secondary: '#111111', - accent: '#222222', - text: '#ffffff', - highlight: '#775ce3', - success: '#00ff00', - error: '#ff0000', - warning: '#ffaa00', - fontFamily: "'Segoe UI', Roboto, sans-serif", - borderRadius: '12px', - borderStyle: 'solid', - borderWidth: '1px', - boxShadow: '0 8px 32px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.1)', - backdropFilter: 'blur(10px)', - animations: { - glow: false, - scanline: false, - 'pixel-blink': false, - }, - }, - 'Classic Light': { - primary: '#E0E0E1', - secondary: '#FBFBFB', - accent: '#F3F3F3', - text: '#203C5D', - highlight: '#203C5D', - success: '#28a745', - error: '#dc3545', - warning: '#ffc107', - fontFamily: "'Segoe UI', Roboto, sans-serif", - borderRadius: '12px', - borderStyle: 'solid', - borderWidth: '1px', - boxShadow: '0 8px 32px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.08)', - backdropFilter: 'blur(10px)', - animations: { - glow: false, - scanline: false, - 'pixel-blink': false, - }, - }, - 'Neon Retro': { - primary: '#1a1a2e', - secondary: '#16213e', - accent: '#0f3460', - text: '#00ff41', - highlight: '#ff6b35', - success: '#39ff14', - error: '#ff073a', - warning: '#ffff00', - neon: '#00ffff', - purple: '#bf00ff', - pink: '#ff1493', - fontFamily: "'Press Start 2P', monospace", - borderRadius: '0', - borderStyle: 'solid', - borderWidth: '3px', - boxShadow: '0 0 20px rgba(0, 255, 65, 0.3), inset 0 0 20px rgba(0, 255, 65, 0.1)', - backdropFilter: 'none', - animations: { - glow: true, - scanline: true, - 'pixel-blink': true, - }, - }, - 'Neon Retro Cyan': { - primary: '#1959A1', - secondary: '#3C74AF', - accent: '#538CC0', - text: '#81DCF7', - highlight: '#EA9C00', - success: '#39ff14', - error: '#ff073a', - warning: '#ffff00', - neon: '00ffff', - purple: '#bf00ff', - pink: '#ff1493', - fontFamily: "'Press Start 2P', monospace", - borderRadius: '0', - borderStyle: 'solid', - borderWidth: '3px', - boxShadow: '0 0 20px rgba(234 156 0, 0.3), inset 0 0 20px rgba(234 156 0, 0.1)', - backdropFilter: 'none', - animations: { - glow: true, - scanline: true, - 'pixel-blink': true, - }, - }, - 'Neon Retro Light': { - primary: '#E0E0E1', - secondary: '#FBFBFB', - accent: '#F3F3F3', - text: '#203C5D', - highlight: '#203C5D', - success: '#39ff14', - error: '#ff073a', - warning: '#ffff00', - neon: '#203C5D', - purple: '#bf00ff', - pink: '#ff1493', - fontFamily: "'Press Start 2P', monospace", - borderRadius: '0', - borderStyle: 'solid', - borderWidth: '3px', - boxShadow: '0 0 20px rgba(234 156 0, 0.3), inset 0 0 20px rgba(234 156 0, 0.1)', - backdropFilter: 'none', - animations: { - glow: true, - scanline: true, - 'pixel-blink': true, - }, - }, - 'Acrylic': { - primary: '#00000080', - secondary: '#00000040', - accent: 'rgba(0,0,0,0.75)', - text: '#ffffff', - highlight: '#ffffff', - success: '#00e500', - error: '#e50000', - warning: '#e5e500', - fontFamily: "'Inter', 'Apple Color Emoji'", - borderRadius: '10px', - borderStyle: 'solid', - borderWidth: '0px', - boxShadow: 'none', - backdropFilter: 'blur(20px)', - animations: { - glow: false, - scanline: false, - 'pixel-blink': false, - }, - }, - }, - currentTheme: 'Classic Autobot', - PAINT_UNAVAILABLE: true, - COORDINATE_MODE: 'rows', - COORDINATE_DIRECTION: 'top-left', - COORDINATE_SNAKE: true, - COORDINATE_BLOCK_WIDTH: 6, - COORDINATE_BLOCK_HEIGHT: 2, - autoSwap: true, - autoBuy: 'none', // "none", "max_charges", or "paint_charges" - autoBuyToggle: false, - maxChargesStopEnable: false, - maxChargesBeforeStop: 1500, - }; - - // Expose CONFIG globally for the utils manager and other modules - window.CONFIG = CONFIG; - - const getCurrentTheme = () => CONFIG.THEMES[CONFIG.currentTheme]; - - const switchTheme = (themeName) => { - if (CONFIG.THEMES[themeName]) { - CONFIG.currentTheme = themeName; - saveThemePreference(); - - // APPLY THEME VARS/CLASS (new) - applyTheme(); - - // Recreate UI (kept for now) - createUI(); - } - }; - - // Add this helper (place it after getCurrentTheme/switchTheme definitions) - function applyTheme() { - const theme = getCurrentTheme(); - console.group('%c🎨 Applying Theme in Auto-Image Script', 'color: #8b5cf6; font-weight: bold;'); - console.log(`%c🎯 Target theme: ${CONFIG.currentTheme}`, 'color: #8b5cf6;'); - - // Toggle theme class on documentElement so CSS vars cascade to our UI - document.documentElement.classList.remove( - 'wplace-theme-classic', - 'wplace-theme-classic-light', - 'wplace-theme-acrylic', - 'wplace-theme-neon', - 'wplace-theme-neon-cyan', - 'wplace-theme-neon-light' - ); - - let themeClass = 'wplace-theme-classic'; // default - let themeFileName = 'classic'; // corresponding file name - - if (CONFIG.currentTheme === 'Neon Retro') { - themeClass = 'wplace-theme-neon'; - themeFileName = 'neon'; - } else if (CONFIG.currentTheme === 'Classic Light') { - themeClass = 'wplace-theme-classic-light'; - themeFileName = 'classic-light'; - } else if (CONFIG.currentTheme === 'Neon Retro Cyan') { - themeClass = 'wplace-theme-neon-cyan'; - themeFileName = 'neon-cyan'; - } else if (CONFIG.currentTheme === 'Neon Retro Light') { - themeClass = 'wplace-theme-neon-light'; - themeFileName = 'neon-light'; - } else if (CONFIG.currentTheme === 'Acrylic') { - themeClass = 'wplace-theme-acrylic'; - themeFileName = 'acrylic'; - } - - document.documentElement.classList.add(themeClass); - console.log(`%c✅ Applied theme class: ${themeClass}`, 'color: #8b5cf6;'); - - // Use extension's applyTheme helper if available (loads from local extension resources) - if (typeof window.applyTheme === 'function') { - console.log(`%c🔧 Using extension's applyTheme() helper for: ${themeFileName}`, 'color: #10b981; font-weight: bold;'); - const success = window.applyTheme(themeFileName); - if (success) { - console.log(`%c✅ Theme CSS loaded from extension local resources`, 'color: #10b981; font-weight: bold;'); - console.log(` 📍 Source: Extension local file (themes/${themeFileName}.css)`); - console.log(` 🚀 Performance: Instant load (no network request)`); - } else { - console.warn(`%c⚠️ Extension theme loading failed, fallback to CSS classes only`, 'color: #f59e0b;'); - console.log(` 🎨 Using CSS class: ${themeClass}`); - console.log(` 📝 Note: Theme variables may be limited without CSS file`); - } - } else { - console.log(`%c📝 Extension applyTheme() not available, using CSS class only`, 'color: #f59e0b;'); - console.log(` 🎨 Using CSS class: ${themeClass}`); - console.log(` ⚠️ Note: Full theme styling requires extension helper function`); - } - - // Also set CSS variables explicitly in case you want runtime overrides - const root = document.documentElement; - const setVar = (k, v) => { - try { - root.style.setProperty(k, v); - } catch { } - }; - - setVar('--wplace-primary', theme.primary); - setVar('--wplace-secondary', theme.secondary); - setVar('--wplace-accent', theme.accent); - setVar('--wplace-text', theme.text); - setVar('--wplace-highlight', theme.highlight); - setVar('--wplace-success', theme.success); - setVar('--wplace-error', theme.error); - setVar('--wplace-warning', theme.warning); - - // Typography + look - setVar('--wplace-font', theme.fontFamily || "'Segoe UI', Roboto, sans-serif"); - setVar('--wplace-radius', '' + (theme.borderRadius || '12px')); - setVar('--wplace-border-style', '' + (theme.borderStyle || 'solid')); - setVar('--wplace-border-width', '' + (theme.borderWidth || '1px')); - setVar('--wplace-backdrop', '' + (theme.backdropFilter || 'blur(10px)')); - setVar('--wplace-border-color', 'rgba(255,255,255,0.1)'); - - console.log(`%c🎨 Theme application complete`, 'color: #8b5cf6; font-weight: bold;'); - console.groupEnd(); - } - - const saveThemePreference = () => { - try { - localStorage.setItem('wplace-theme', CONFIG.currentTheme); - } catch (e) { - console.warn('Could not save theme preference:', e); - } - }; - - const loadThemePreference = () => { - try { - const saved = localStorage.getItem('wplace-theme'); - if (saved && CONFIG.THEMES[saved]) { - CONFIG.currentTheme = saved; - } - } catch (e) { - console.warn('Could not load theme preference:', e); - } - }; - - // Dynamically loaded translations - window.loadedTranslations = {}; - - // Available languages - const AVAILABLE_LANGUAGES = [ - 'en', - 'es', - 'ru', - 'pt', - 'vi', - 'fr', - 'id', - 'tr', - 'zh-CN', - 'zh-TW', - 'ja', - 'ko', - 'uk', - ]; - - // Function to load translations from JSON file with retry mechanism - const loadTranslations = async (language, retryCount = 0) => { - if (window.loadedTranslations[language]) { - return window.loadedTranslations[language]; - } - - console.group(`%c🌍 Loading ${language.toUpperCase()} translations`, 'color: #06b6d4; font-weight: bold;'); - - // First try: Check if extension has loaded local resources - if (window.AUTOBOT_LANGUAGES && Object.keys(window.AUTOBOT_LANGUAGES).length > 0) { - console.log(`%c🔍 Checking extension local resources...`, 'color: #06b6d4;'); - - const langFile = `${language}.json`; - const availableFiles = Object.keys(window.AUTOBOT_LANGUAGES || {}); - const regionalMatch = availableFiles.find(file => file.toLowerCase().startsWith(`${language.toLowerCase()}-`)); - const resolvedFile = window.AUTOBOT_LANGUAGES[langFile] ? langFile : regionalMatch; - - if (resolvedFile && window.AUTOBOT_LANGUAGES[resolvedFile]) { - const translations = window.AUTOBOT_LANGUAGES[resolvedFile]; - - // Validate that translations is an object with keys - if ( - typeof translations === 'object' && - translations !== null && - Object.keys(translations).length > 0 - ) { - window.loadedTranslations[language] = translations; - console.log(`%c✅ Loaded ${language} translations from EXTENSION LOCAL FILES`, 'color: #10b981; font-weight: bold;'); - console.log(` 📍 Source: Extension local storage (chrome-extension://)`); - if (resolvedFile !== langFile) { - console.log(` 🔄 Resolved locale: ${resolvedFile.replace('.json', '')}`); - } - console.log(` 📏 Keys count: ${Object.keys(translations).length}`); - console.log(` 🚀 Performance: Instant load (no network request)`); - console.groupEnd(); - return translations; - } - } else { - console.log(`%c📝 ${langFile} not found in extension resources`, 'color: #f59e0b;'); - console.log(` 📋 Available in extension: ${Object.keys(window.AUTOBOT_LANGUAGES).join(', ')}`); - } - } else { - console.log(`%c📝 No extension local resources available`, 'color: #f59e0b;'); - console.log(` 🔍 window.AUTOBOT_LANGUAGES: ${typeof window.AUTOBOT_LANGUAGES}`); - } - - // Second try: Use helper function if available - if (typeof window.getLanguage === 'function') { - console.log(`%c🔧 Trying extension getLanguage() helper...`, 'color: #06b6d4;'); - try { - const translations = window.getLanguage(language); - if ( - typeof translations === 'object' && - translations !== null && - Object.keys(translations).length > 0 - ) { - window.loadedTranslations[language] = translations; - console.log(`%c✅ Loaded ${language} translations via extension helper`, 'color: #10b981; font-weight: bold;'); - console.log(` 📍 Source: Extension getLanguage() function`); - console.log(` 📏 Keys count: ${Object.keys(translations).length}`); - console.groupEnd(); - return translations; - } - } catch (error) { - console.warn(`%c⚠️ Extension helper failed:`, 'color: #f59e0b;', error); - } - } - - // Fallback: Load from CDN (original behavior) - console.log(`%c🌐 Falling back to CDN loading...`, 'color: #8b5cf6;'); - const url = `https://wplace-autobot.github.io/WPlace-AutoBOT/main/lang/${language}.json`; - const maxRetries = 3; - const baseDelay = 1000; // 1 second - - try { - if (retryCount === 0) { - console.log(`🔄 Loading ${language} translations from CDN...`); - } else { - console.log( - `🔄 Retrying ${language} translations (attempt ${retryCount + 1}/${maxRetries + 1})...` - ); - } - - const response = await fetch(url); - if (response.ok) { - const translations = await response.json(); - - // Validate that translations is an object with keys - if ( - typeof translations === 'object' && - translations !== null && - Object.keys(translations).length > 0 - ) { - window.loadedTranslations[language] = translations; - console.log( - `%c📚 Loaded ${language} translations from CDN (${Object.keys(translations).length} keys)`, 'color: #f59e0b; font-weight: bold;' - ); - console.log(` 📍 Source: CDN (wplace-autobot.github.io)`); - console.log(` 🌐 URL: ${url}`); - console.log(` ⚠️ Performance: Network request required`); - console.groupEnd(); - return translations; - } else { - console.warn(`❌ Invalid translation format for ${language}`); - throw new Error('Invalid translation format'); - } - } else { - console.warn( - `❌ CDN returned HTTP ${response.status}: ${response.statusText} for ${language} translations` - ); - throw new Error(`HTTP ${response.status}: ${response.statusText}`); - } - } catch (error) { - console.error( - `❌ Failed to load ${language} translations from CDN (attempt ${retryCount + 1}):`, - error - ); - - // Retry with exponential backoff - if (retryCount < maxRetries) { - const delay = baseDelay * Math.pow(2, retryCount); - console.log(`⏳ Retrying in ${delay}ms...`); - await new Promise((resolve) => setTimeout(resolve, delay)); - console.groupEnd(); - return loadTranslations(language, retryCount + 1); - } - } - - console.error(`%c💥 All translation loading methods failed for ${language}`, 'color: #ef4444; font-weight: bold;'); - console.groupEnd(); - return null; - }; - - const loadLanguagePreference = async () => { - const savedLanguage = localStorage.getItem('wplace_language'); - const browserLocale = navigator.language; - const browserLanguage = browserLocale.split('-')[0]; - - let selectedLanguage = 'en'; // Default fallback - - try { - // Check if we have the saved language available - if (savedLanguage && AVAILABLE_LANGUAGES.includes(savedLanguage)) { - selectedLanguage = savedLanguage; - console.log(`🔄 Using saved language preference: ${selectedLanguage}`); - } - // Try full locale match (e.g. "zh-CN", "zh-TW" etc) - else if (AVAILABLE_LANGUAGES.includes(browserLocale)) { - selectedLanguage = browserLocale; - localStorage.setItem('wplace_language', browserLocale); - console.log(`🔄 Using browser locale: ${selectedLanguage}`); - } - // Try base language match (e.g. "en" for "en-US" or "en-GB" etc) - else if (AVAILABLE_LANGUAGES.includes(browserLanguage)) { - selectedLanguage = browserLanguage; - localStorage.setItem('wplace_language', browserLanguage); - console.log(`🔄 Using browser language: ${selectedLanguage}`); - } - // Use English as fallback - else { - console.log(`🔄 No matching language found, using English fallback`); - } - - // Set the language in state first - state.language = selectedLanguage; - - // Only load translations if not already loaded and not English (which should already be loaded) - if (selectedLanguage !== 'en' && !window.loadedTranslations[selectedLanguage]) { - const loaded = await loadTranslations(selectedLanguage); - if (!loaded) { - console.warn( - `⚠️ Failed to load ${selectedLanguage} translations, falling back to English` - ); - state.language = 'en'; - localStorage.setItem('wplace_language', 'en'); - } - } - } catch (error) { - console.error(`❌ Error in loadLanguagePreference:`, error); - state.language = 'en'; // Always ensure we have a valid language - } - }; - - // Simple user notification function for critical issues - const showTranslationWarning = (message) => { - try { - // Create a simple temporary notification banner - const warning = document.createElement('div'); - warning.style.cssText = ` - position: fixed; top: 10px; right: 10px; z-index: 10001; - background: rgba(255, 193, 7, 0.95); color: #212529; padding: 12px 16px; - border-radius: 8px; font-size: 14px; font-weight: 500; - box-shadow: 0 4px 12px rgba(0,0,0,0.3); border: 1px solid rgba(255, 193, 7, 0.8); - max-width: 300px; word-wrap: break-word; - `; - warning.textContent = message; - document.body.appendChild(warning); - - // Auto-remove after 8 seconds - setTimeout(() => { - if (warning.parentNode) { - warning.remove(); - } - }, 8000); - } catch (e) { - // If DOM manipulation fails, just log - console.warn('Failed to show translation warning UI:', e); - } - }; - - // Initialize translations function - const initializeTranslations = async () => { - try { - console.log('🌐 Initializing translation system...'); - - // Always ensure English is loaded as fallback first - if (!window.loadedTranslations['en']) { - const englishLoaded = await loadTranslations('en'); - if (!englishLoaded) { - console.warn('⚠️ Failed to load English translations from CDN, using fallback'); - showTranslationWarning('⚠️ Translation loading failed, using basic fallbacks'); - } - } - - // Then load user's language preference - await loadLanguagePreference(); - - console.log(`✅ Translation system initialized. Active language: ${state.language}`); - } catch (error) { - console.error('❌ Translation initialization failed:', error); - // Ensure state has a valid language even if loading fails - if (!state.language) { - state.language = 'en'; - } - console.warn('⚠️ Using fallback translations due to initialization failure'); - showTranslationWarning('⚠️ Translation system error, using basic English'); - } - }; - - // Emergency fallback TEXT (minimal) - const FALLBACK_TEXT = { - en: { - title: 'WPlace Auto-Image', - toggleOverlay: 'Toggle Overlay', - scanColors: 'Scan Colors', - uploadImage: 'Upload Image', - resizeImage: 'Process/Edit Image', - processImageFirst: '⚠️ Process the image first via "Process/Edit Image" before placing!', - imageNeedsProcessing: 'Image needs processing', - selectPosition: 'Select Position', - startPainting: 'Start Painting', - stopPainting: 'Stop Painting', - progress: 'Progress', - pixels: 'Pixels', - charges: 'Charges', - batchSize: 'Batch Size', - paintingOrder: 'Painting Order', - paintingOrderSequential: 'Sequential (Top to Bottom)', - paintingOrderColorByColor: 'Color by Color', - currentlyPaintingColor: 'Currently painting: {colorName}', - colorProgress: '{painted} of {total} {colorName} pixels', - cooldownSettings: 'Cooldown Settings', - waitCharges: 'Wait for Charges', - settings: 'Settings', - showStats: 'Show Statistics', - compactMode: 'Compact Mode', - minimize: 'Minimize', - tokenCapturedSuccess: 'Token captured successfully', - turnstileInstructions: 'Complete the verification', - hideTurnstileBtn: 'Hide', - notificationsNotSupported: 'Notifications not supported', - chargesReadyMessage: 'Charges are ready', - chargesReadyNotification: 'WPlace AutoBot', - initMessage: "Click 'Upload Image' to begin", - }, - }; - - // Safe translation function with multiple fallback levels - const getText = (key, replacements = {}) => { - // Try current language first - let text = window.loadedTranslations[state.language]?.[key]; - - // Fallback to English translations - if (!text && state.language !== 'en') { - text = window.loadedTranslations['en']?.[key]; - } - - // Fallback to hardcoded English - if (!text) { - text = FALLBACK_TEXT['en']?.[key]; - } - - // Last resort - return the key itself - if (!text) { - console.warn(`⚠️ Missing translation for key: ${key}`); - return key; - } - - // Handle string replacements like {count}, {time}, etc. - return Object.entries(replacements).reduce((result, [placeholder, value]) => { - return result.replace(new RegExp(`\\{${placeholder}\\}`, 'g'), value); - }, text); - }; - - // UNIFIED ACCOUNT MANAGER - class AccountManager { - constructor() { - this.accounts = []; - this.currentIndex = 0; - } - - // Load accounts from storage - async loadAccounts() { - try { - // Get tokens from localStorage - const tokens = JSON.parse(localStorage.getItem("accounts")) || []; - - // Get account info from storage - const infoAccountsResult = await new Promise((resolve) => { - if (typeof chrome !== 'undefined' && chrome.storage) { - chrome.storage.local.get('infoAccounts', (result) => { - resolve(result.infoAccounts || []); - }); - } else { - // Fallback for when chrome storage isn't available - resolve([]); - } - }); - - console.log(`📥 [ACCOUNT MANAGER] Loading ${tokens.length} accounts`); - - this.accounts = tokens.map((token, index) => { - const info = infoAccountsResult.find(acc => acc.token === token); - return { - token, - displayName: info?.displayName || info?.name || `Account ${index + 1}`, - ID: info?.ID || null, - Charges: info?.Charges || 0, - Max: info?.Max || 0, - Droplets: info?.Droplets || 0, - isCurrent: info?.isCurrent || false, - lastUsed: info?.lastUsed || null, - lastImported: info?.lastImported || null - }; - }); - - // Find current account index - this.currentIndex = this.accounts.findIndex(acc => acc.isCurrent); - if (this.currentIndex === -1) this.currentIndex = 0; - - console.log(`✅ [ACCOUNT MANAGER] Loaded ${this.accounts.length} accounts, current index: ${this.currentIndex}`); - console.log(`🎯 [ACCOUNT MANAGER] Current account: ${this.getCurrentAccount()?.displayName || 'None'}`); - - // Auto-refresh account statuses after loading - if (this.accounts.length > 0) { - console.log('🔄 [ACCOUNT MANAGER] Auto-refreshing account statuses...'); - // Use setTimeout to avoid blocking the load operation - setTimeout(async () => { - try { - await fetchAllAccountDetails(); - console.log('✅ [ACCOUNT MANAGER] Auto-refresh completed'); - } catch (error) { - console.warn('⚠️ [ACCOUNT MANAGER] Auto-refresh failed:', error); - } - }, 100); - } - - return this.accounts; - } catch (error) { - console.error('❌ [ACCOUNT MANAGER] Error loading accounts:', error); - this.accounts = []; - this.currentIndex = 0; - return []; - } - } - - // Simple linear switching - switchToNext() { - if (this.accounts.length === 0) return null; - - const previousIndex = this.currentIndex; - this.currentIndex = (this.currentIndex + 1) % this.accounts.length; - - console.log(`🔄 [ACCOUNT MANAGER] Switching: ${previousIndex} → ${this.currentIndex}`); - console.log(`🎯 [ACCOUNT MANAGER] Target: ${this.accounts[this.currentIndex].displayName}`); - - // Update current flags - this.accounts.forEach((acc, idx) => { - acc.isCurrent = idx === this.currentIndex; - }); - - return this.accounts[this.currentIndex]; - } - - getCurrentAccount() { - return this.accounts[this.currentIndex] || null; - } - - getAccountByIndex(index) { - return this.accounts[index] || null; - } - - updateAccountData(tokenOrData, dataObject = null) { - let accountData; - let targetAccount; - - if (dataObject !== null) { - // Called with (token, dataObject) format - const token = tokenOrData; - accountData = dataObject; - targetAccount = this.accounts.find(acc => acc.token === token); - if (!targetAccount) { - console.warn(`⚠️ [ACCOUNT MANAGER] Account with token not found for update`); - return; - } - } else { - // Called with (dataObject) format - update current account - accountData = tokenOrData; - targetAccount = this.getCurrentAccount(); - } - - if (targetAccount && accountData) { - // Update all provided properties - if (accountData.charges !== undefined || accountData.Charges !== undefined) { - targetAccount.Charges = Math.floor(accountData.charges || accountData.Charges || 0); - } - if (accountData.max !== undefined || accountData.Max !== undefined) { - targetAccount.Max = Math.floor(accountData.max || accountData.Max || 0); - } - if (accountData.droplets !== undefined || accountData.Droplets !== undefined) { - targetAccount.Droplets = Math.floor(accountData.droplets || accountData.Droplets || 0); - } - if (accountData.id !== undefined || accountData.ID !== undefined) { - targetAccount.ID = accountData.id || accountData.ID || targetAccount.ID; - } - if (accountData.displayName !== undefined) { - targetAccount.displayName = accountData.displayName; - } - if (accountData.isCurrent !== undefined) { - // Clear isCurrent from all accounts first, then set for target - this.accounts.forEach(acc => acc.isCurrent = false); - targetAccount.isCurrent = accountData.isCurrent; - } - if (accountData.cooldown !== undefined) { - targetAccount.cooldown = accountData.cooldown; - } - - console.log(`📊 [ACCOUNT MANAGER] Updated ${targetAccount.displayName}: ⚡${targetAccount.Charges}/${targetAccount.Max} 💧${targetAccount.Droplets}${targetAccount.isCurrent ? ' (CURRENT)' : ''}`); - } - } - - getAccountCount() { - return this.accounts.length; - } - - getAllAccounts() { - return [...this.accounts]; // Return copy to prevent direct mutation - } - - setCurrentIndex(index) { - if (index >= 0 && index < this.accounts.length) { - this.currentIndex = index; - console.log(`🔄 [ACCOUNT MANAGER] Current index set to: ${index}`); - } else { - console.warn(`⚠️ [ACCOUNT MANAGER] Invalid index ${index}, keeping current: ${this.currentIndex}`); - } - } - - getNextAccount() { - if (this.accounts.length === 0) return null; - const nextIndex = (this.currentIndex + 1) % this.accounts.length; - return this.accounts[nextIndex]; - } - } - - // Create global account manager instance - const accountManager = new AccountManager(); - - // Local Charge Model to minimize API calls and drive account switching - const ChargeModel = (() => { - class Model { - constructor() { - this.map = new Map(); // token -> {charges,max,lastTickAt,lastSyncAt} - this.tickIntervalMs = 30_000; // +1 charge per 30s - this.timer = null; - this.startedAt = Date.now(); - } - seedFromAccounts(accounts) { - const now = Date.now(); - (accounts || []).forEach(acc => { - if (!acc || !acc.token) return; - const existing = this.map.get(acc.token) || {}; - const charges = Number.isFinite(acc.Charges) ? Math.floor(acc.Charges) : (existing.charges || 0); - const max = Number.isFinite(acc.Max) ? Math.floor(acc.Max) : (existing.max || 1); - this.map.set(acc.token, { - charges: Math.max(0, Math.min(charges, max)), - max: Math.max(1, max), - lastTickAt: existing.lastTickAt || now, - lastSyncAt: existing.lastSyncAt || now, - }); - }); - } - ensureToken(token) { - if (!token) return null; - if (!this.map.has(token)) { - this.map.set(token, { charges: 0, max: Math.max(1, state.maxCharges || 1), lastTickAt: Date.now(), lastSyncAt: 0 }); - } - return this.map.get(token); - } - get(token) { return this.ensureToken(token); } - getForCurrent() { return this.get(accountManager.getCurrentAccount()?.token); } - setFromServer(token, charges, max) { - const node = this.ensureToken(token); - if (!node) return; - node.charges = Math.max(0, Math.min(Math.floor(charges || 0), Math.max(1, Math.floor(max || node.max || 1)))); - node.max = Math.max(1, Math.floor(max || node.max || 1)); - node.lastSyncAt = Date.now(); - } - decrement(token, amount) { - const node = this.ensureToken(token); - if (!node) return 0; - const n = Math.max(0, Math.floor(amount || 0)); - node.charges = Math.max(0, node.charges - n); - return node.charges; - } - incrementTickAll() { - const now = Date.now(); - accountManager.getAllAccounts().forEach(acc => { - if (!acc?.token) return; - const node = this.ensureToken(acc.token); - if (!node) return; - // catch-up ticks if tab was inactive - const elapsed = now - (node.lastTickAt || now); - const ticks = Math.floor(elapsed / this.tickIntervalMs); - if (ticks > 0) { - node.charges = Math.min(node.max, node.charges + ticks); - node.lastTickAt = (node.lastTickAt || now) + ticks * this.tickIntervalMs; - } - }); - // Mirror values into AccountManager and UI state - this.syncToAccountManager(); - } - start() { - if (this.timer) return; - this.timer = setInterval(() => this.incrementTickAll(), this.tickIntervalMs); - } - stop() { if (this.timer) { clearInterval(this.timer); this.timer = null; } } - predictTimeToReach(token, target) { - const node = this.get(token); - if (!node) return Infinity; - if (node.charges >= target) return 0; - return (target - node.charges) * this.tickIntervalMs; - } - syncToAccountManager() { - const list = accountManager.getAllAccounts(); - list.forEach(acc => { - const node = this.map.get(acc.token); - if (!node) return; - accountManager.updateAccountData(acc.token, { Charges: node.charges, Max: node.max }); - }); - renderAccountsList(); - } - } - return new Model(); - })(); - - // GLOBAL STATE - const state = { - running: false, - imageLoaded: false, - imageProcessed: false, // Track if image has been processed through resize panel - processing: false, - totalPixels: 0, - paintedPixels: 0, - preFilteringDone: false, // Track if pre-filtering detection has been done this session - progressResetDone: false, // Track if progress reset has been done this save file session - availableColors: [], - activeColorPalette: [], // User-selected colors for conversion - paintWhitePixels: true, // Default to ON - fullChargeData: null, - fullChargeInterval: null, - paintTransparentPixels: false, // Default to OFF - displayCharges: 0, - preciseCurrentCharges: 0, - maxCharges: 1, // Default max charges - cooldown: CONFIG.COOLDOWN_DEFAULT, - imageData: null, - stopFlag: false, - colorsChecked: false, - startPosition: null, - selectingPosition: false, - region: null, - minimized: false, - lastPosition: { x: 0, y: 0 }, - lastPaintedPosition: { x: 0, y: 0 }, // Track last successfully painted coordinate - estimatedTime: 0, - language: 'en', - paintingSpeed: CONFIG.PAINTING_SPEED.DEFAULT, // pixels batch size - batchMode: CONFIG.BATCH_MODE, // "normal" or "random" - paintingOrder: CONFIG.PAINTING_ORDER, // "sequential" or "color-by-color" - currentPaintingColor: null, // Track current color being painted in color-by-color mode - randomBatchMin: CONFIG.RANDOM_BATCH_RANGE.MIN, // Random range minimum - randomBatchMax: CONFIG.RANDOM_BATCH_RANGE.MAX, // Random range maximum - cooldownChargeThreshold: CONFIG.COOLDOWN_CHARGE_THRESHOLD, - chargesThresholdInterval: null, - tokenSource: CONFIG.TOKEN_SOURCE, // "generator" or "manual" - initialSetupComplete: false, // Track if initial startup setup is complete (only happens once) - overlayOpacity: CONFIG.OVERLAY.OPACITY_DEFAULT, - blueMarbleEnabled: CONFIG.OVERLAY.BLUE_MARBLE_DEFAULT, - ditheringEnabled: false, - // Advanced color matching settings - colorMatchingAlgorithm: 'lab', - enableChromaPenalty: true, - chromaPenaltyWeight: 0.15, - customTransparencyThreshold: CONFIG.TRANSPARENCY_THRESHOLD, - customWhiteThreshold: CONFIG.WHITE_THRESHOLD, - resizeSettings: null, - originalImage: null, - resizeIgnoreMask: null, - paintUnavailablePixels: CONFIG.PAINT_UNAVAILABLE, - // Coordinate generation settings - coordinateMode: CONFIG.COORDINATE_MODE, - coordinateDirection: CONFIG.COORDINATE_DIRECTION, - coordinateSnake: CONFIG.COORDINATE_SNAKE, - blockWidth: CONFIG.COORDINATE_BLOCK_WIDTH, - blockHeight: CONFIG.COORDINATE_BLOCK_HEIGHT, - notificationsEnabled: CONFIG.NOTIFICATIONS.ENABLED, - notifyOnChargesReached: CONFIG.NOTIFICATIONS.ON_CHARGES_REACHED, - notifyOnlyWhenUnfocused: CONFIG.NOTIFICATIONS.ONLY_WHEN_UNFOCUSED, - notificationIntervalMinutes: CONFIG.NOTIFICATIONS.REPEAT_MINUTES, - _lastChargesNotifyAt: 0, - _lastChargesBelow: true, - // Switch debouncing state - lastSwitchAt: 0, - paintedSinceSwitch: 0, - minMsBetweenSwitches: 3000, - // Smart save tracking - _lastSavePixelCount: 0, - _lastSaveTime: 0, - _saveInProgress: false, - paintedMap: null, - accountIndex: 0, // Keep for backward compatibility with existing logic - // Legacy state removed - now using accountManager instead - isFetchingAllAccounts: false, - paintingMode: 'auto', // 'auto' or 'assist' - default to auto - }; - - // Expose state globally for the utils manager and other modules - window.state = state; - - let _updateResizePreview = () => { }; - let _resizeDialogCleanup = null; - - // --- OVERLAY UPDATE: Optimized OverlayManager class with performance improvements --- - // OverlayManager class extracted to overlay-manager.js module - - // Overlay management is now handled by the OverlayManager module - // Check for overlay manager availability - if (!window.WPlaceOverlayManager) { - console.error('❌ WPlaceOverlayManager not available - please ensure overlay-manager.js is loaded first'); - throw new Error('OverlayManager dependency not found'); - } - - // Ensure we only have ONE overlay manager instance globally - let overlayManager; - if (!window.autoImageOverlayManager) { - overlayManager = new window.WPlaceOverlayManager(); - window.autoImageOverlayManager = overlayManager; - console.log('🎯 Created NEW overlay manager instance'); - } else { - overlayManager = window.autoImageOverlayManager; - console.log('🎯 Using EXISTING overlay manager instance'); - } - - // Token management is now handled by the TokenManager module - // Global references for backward compatibility - if (!window.WPlaceTokenManager) { - console.error('❌ WPlaceTokenManager not available - please ensure token-manager.js is loaded first'); - throw new Error('TokenManager dependency not found'); - } - - const tokenManager = window.WPlaceTokenManager; - const setTurnstileToken = (token) => tokenManager.setTurnstileToken(token); - const isTokenValid = () => tokenManager.isTokenValid(); - const invalidateToken = () => tokenManager.invalidateToken(); - const ensureToken = (forceRefresh = false) => tokenManager.ensureToken(forceRefresh); - - // Getter for the current token value - const getTurnstileToken = () => tokenManager.turnstileToken; - - // Token promise management - const createTokenPromise = () => { - tokenManager.tokenPromise = new Promise((resolve) => { - tokenManager._resolveToken = resolve; - }); - }; - - // Create global image processor instance for utility functions - if (!window.WPlaceImageProcessor) { - console.error('❌ WPlaceImageProcessor not available - please ensure image-processor.js is loaded first'); - throw new Error('ImageProcessor dependency not found'); - } - - const globalImageProcessor = new window.WPlaceImageProcessor(); - - // Keep these constants for compatibility with other parts of the script - let retryCount = 0; - const MAX_RETRIES = 10; - const MAX_BATCH_RETRIES = 10; // Maximum attempts for batch sending - - function inject(callback) { - const script = document.createElement('script'); - script.textContent = `(${callback})();`; - document.documentElement?.appendChild(script); - script.remove(); - } - - inject(() => { - const fetchedBlobQueue = new Map(); - - window.addEventListener('message', (event) => { - const { source, blobID, blobData } = event.data; - if (source === 'auto-image-overlay' && blobID && blobData) { - const callback = fetchedBlobQueue.get(blobID); - if (typeof callback === 'function') { - callback(blobData); - } - fetchedBlobQueue.delete(blobID); - } - }); - - // Helper function to find closest color ID for assist mode - function findClosestColorId(r, g, b) { - let minDistance = Infinity; - let closestColorId = null; - - for (const colorData of Object.values(CONFIG.COLOR_MAP)) { - if (!colorData.rgb) continue; - - const distance = Math.sqrt( - Math.pow(r - colorData.rgb.r, 2) + - Math.pow(g - colorData.rgb.g, 2) + - Math.pow(b - colorData.rgb.b, 2) - ); - - if (distance < minDistance) { - minDistance = distance; - closestColorId = colorData.id; - } - } - - return closestColorId; - } - - const originalFetch = window.fetch; - // Setup fetch interceptions - console.log('🚀 [Auto-Image] Fetch interception initialized'); - - // Expose state for debugging - window.__WPLACE_AUTOBOT_STATE__ = state; - - window.fetch = async function (...args) { - let url = args[0] instanceof Request ? args[0].url : args[0]; - - // Parse URL if it's a string - let urlObj = null; - if (typeof url === 'string') { - try { - urlObj = new URL(url); - } catch (e) { - // Invalid URL, proceed normally - } - } - - // ASSIST MODE: Intercept pixel placement requests - if (state.paintingMode === 'assist' && urlObj !== null && urlObj.pathname.startsWith('/s0/pixel')) { - console.log(`🎯 [Assist Mode] Intercepting pixel placement:`, urlObj.pathname); - console.log(`🔍 [Assist Mode] Check state - imageData:`, !!state.imageData, 'startPosition:', !!state.startPosition, 'body:', !!args[1]?.body); - - // Check if we have overlay data - if (state.imageData && state.startPosition && args[1]?.body) { - try { - // Parse region coordinates from URL path: /s0/pixel/{tileX}/{tileY} - const pathParts = urlObj.pathname.split('/'); - const regionX = parseInt(pathParts[3]); - const regionY = parseInt(pathParts[4]); - - console.log(`📦 [Assist Mode] Region coords: (${regionX}, ${regionY})`); - - // Parse request body - const payload = typeof args[1].body === 'string' ? JSON.parse(args[1].body) : args[1].body; - console.log(`📝 [Assist Mode] Original payload:`, JSON.stringify(payload)); - - // Debug: Check what's in state.region - console.log(`🔍 [Assist Mode] state.region:`, state.region); - console.log(`🔍 [Assist Mode] state.startPosition:`, state.startPosition); - - // CRITICAL FIX: The issue is that startPosition is in TILE-LOCAL coordinates (0-999) - // but we're clicking on a tile at (1732, 1014). We need to find which tile - // our image overlay is on by checking all loaded tiles. - - // For now, let's use the REQUEST's tile coordinates as a reference - // If the user is clicking within this tile, check if our LOCAL startPosition - // would overlap with the click position - let startX, startY; - - // COORDINATE RECONSTRUCTION - // state.startPosition = LOCAL coords within a 1000x1000 tile (0-999) - // state.region = TILE coordinates {x, y} (e.g., {x: 1732, y: 1014}) - // Absolute canvas coords = region.x * 1000 + startPosition.x - - if (state.region && state.region.x !== undefined && state.region.y !== undefined) { - // Use saved region to reconstruct absolute coordinates - startX = state.region.x * 1000 + state.startPosition.x; - startY = state.region.y * 1000 + state.startPosition.y; - console.log(`[Assist Mode] Using saved region: tile=(${state.region.x},${state.region.y}) + local=(${state.startPosition.x},${state.startPosition.y}) = absolute (${startX},${startY})`); - } else { - // Fallback: assume image is on the clicked tile (may be wrong!) - // Since startPosition appears to be LOCAL coords within a tile, - // we need to convert them to absolute by finding which tile they're on. - // The simplest approach: assume the image is on the tile being clicked! - startX = regionX * 1000 + state.startPosition.x; - startY = regionY * 1000 + state.startPosition.y; - console.log(`[Assist Mode] No saved region - assuming image on clicked tile (${regionX},${regionY}): absolute = (${startX},${startY})`); - } - console.log(`� [Assist Mode] Assuming image is on clicked tile: absolute coords = (${startX},${startY})`); - - const { width, height } = state.imageData; - - console.log(`🖼️ [Assist Mode] Image bounds: start=(${startX},${startY}), size=${width}x${height}`); - - // Calculate which tiles the image spans - // Note: startX/startY are ABSOLUTE canvas coordinates (e.g., 1732432 means tile 1732, pixel 432) - const imageStartTileX = Math.floor(startX / 1000); - const imageStartTileY = Math.floor(startY / 1000); - const imageEndTileX = Math.floor((startX + width - 1) / 1000); - const imageEndTileY = Math.floor((startY + height - 1) / 1000); - - console.log(`🗺️ [Assist Mode] Image tiles: X[${imageStartTileX}-${imageEndTileX}], Y[${imageStartTileY}-${imageEndTileY}]`); - console.log(`🎯 [Assist Mode] Checking if region (${regionX},${regionY}) overlaps...`); - - if (regionX >= imageStartTileX && regionX <= imageEndTileX && - regionY >= imageStartTileY && regionY <= imageEndTileY) { - - console.log(`✅ [Assist Mode] Region (${regionX},${regionY}) overlaps with image - modifying pixels`); - - // Modify the colors array based on overlay data - if (payload.coords && payload.colors) { - let modifiedCount = 0; - - for (let i = 0; i < payload.coords.length; i += 2) { - // Calculate absolute pixel position - const absoluteX = regionX * 1000 + payload.coords[i]; - const absoluteY = regionY * 1000 + payload.coords[i + 1]; - - // Calculate position relative to our image - const imgX = absoluteX - startX; - const imgY = absoluteY - startY; - - console.log(`🎨 [Assist Mode] Pixel ${i/2}: absolute=(${absoluteX},${absoluteY}), relative=(${imgX},${imgY})`); - - // Check if pixel is within our image bounds - if (imgX >= 0 && imgX < width && imgY >= 0 && imgY < height) { - // Get color from processed image data - // Note: state.imageData uses 'pixels' property, not 'data' - const pixelData = state.imageData.pixels || state.imageData.data; - if (!pixelData) { - console.error(`❌ [Assist Mode] No pixel data available in state.imageData`); - continue; - } - - const pixelIndex = (imgY * width + imgX) * 4; - const r = pixelData[pixelIndex]; - const g = pixelData[pixelIndex + 1]; - const b = pixelData[pixelIndex + 2]; - const a = pixelData[pixelIndex + 3]; - - console.log(`🎨 [Assist Mode] Color at (${imgX},${imgY}): rgba(${r},${g},${b},${a}), original colorId: ${payload.colors[i/2]}`); - - // Skip transparent pixels - if (a < CONFIG.TRANSPARENCY_THRESHOLD) { - console.log(`⏭️ [Assist Mode] Skipping transparent pixel`); - continue; - } - - // Find matching color from palette - const colorId = findClosestColorId(r, g, b); - console.log(`🔍 [Assist Mode] Found closest colorId: ${colorId}`); - if (colorId) { - const oldColorId = payload.colors[i / 2]; - payload.colors[i / 2] = colorId; - console.log(`✏️ [Assist Mode] Changed colorId from ${oldColorId} to ${colorId}`); - modifiedCount++; - } - } else { - console.log(`❌ [Assist Mode] Pixel out of bounds`); - } - } - - // Update request body with modified payload - args[1] = { - ...args[1], - body: JSON.stringify(payload) - }; - - console.log(`✅ [Assist Mode] Modified ${modifiedCount} pixel color(s)`); - console.log(`📝 [Assist Mode] Modified payload:`, JSON.stringify(payload)); - } else { - console.warn(`⚠️ [Assist Mode] Payload missing coords or colors`); - } - } else { - console.log(`⏭️ [Assist Mode] Region (${regionX},${regionY}) does NOT overlap with image`); - } - } catch (error) { - console.error('❌ [Assist Mode] Error intercepting pixel placement:', error); - console.error(error.stack); - } - } else { - console.warn('⚠️ [Assist Mode] No overlay data available - imageData:', !!state.imageData, 'startPosition:', !!state.startPosition); - } - } - - const response = await originalFetch.apply(this, args); - - // TILE REQUEST logging removed to reduce console spam - - if (typeof url === 'string') { - if (url.includes('https://backend.wplace.live/s0/pixel/')) { - try { - const payload = JSON.parse(args[1].body); - if (payload.t) { - console.log( - `🔍✅ Turnstile Token Captured - Type: ${typeof payload.t}, Value: ${payload.t - ? typeof payload.t === 'string' - ? payload.t.length > 50 - ? payload.t.substring(0, 50) + '...' - : payload.t - : JSON.stringify(payload.t) - : 'null/undefined' - }, Length: ${payload.t?.length || 0}` - ); - window.postMessage({ source: 'turnstile-capture', token: payload.t }, '*'); - } - } catch (_) { - /* ignore */ - } - } - - const contentType = response.headers.get('content-type') || ''; - if (contentType.includes('image/png') && url.includes('.png')) { - const cloned = response.clone(); - return new Promise(async (resolve) => { - const blobUUID = crypto.randomUUID(); - const originalBlob = await cloned.blob(); - - fetchedBlobQueue.set(blobUUID, (processedBlob) => { - resolve( - new Response(processedBlob, { - headers: cloned.headers, - status: cloned.status, - statusText: cloned.statusText, - }) - ); - }); - - window.postMessage( - { - source: 'auto-image-tile', - endpoint: url, - blobID: blobUUID, - blobData: originalBlob, - }, - '*' - ); - }); - } - } - - return response; - }; - }); - - window.addEventListener('message', (event) => { - const { source, endpoint, blobID, blobData } = event.data; - - if (source === 'auto-image-tile' && endpoint && blobID && blobData) { - overlayManager.processAndRespondToTileRequest(event.data); - } - - // Token capture is now handled by TokenManager module - // No need to handle 'turnstile-capture' events here - }); - - async function detectLanguage() { - try { - const response = await fetch('https://backend.wplace.live/me', { - credentials: 'include', - }); - const data = await response.json(); - state.language = data.language === 'pt' ? 'pt' : 'en'; - } catch { - state.language = navigator.language.startsWith('pt') ? 'pt' : 'en'; - } - } - - // UTILITY FUNCTIONS WRAPPER - Uses WPlaceUtilsManager for modular functionality - const Utils = { - // Basic utilities - sleep: (ms) => window.globalUtilsManager ? window.globalUtilsManager.sleep(ms) : new Promise(r => setTimeout(r, ms)), - dynamicSleep: (tickAndGetRemainingMs) => window.globalUtilsManager ? window.globalUtilsManager.dynamicSleep(tickAndGetRemainingMs) : Promise.resolve(), - waitForSelector: (selector, interval, timeout) => window.globalUtilsManager ? window.globalUtilsManager.waitForSelector(selector, interval, timeout) : Promise.resolve(null), - msToTimeText: (ms) => window.globalUtilsManager ? window.globalUtilsManager.msToTimeText(ms) : `${Math.ceil(ms / 1000)}s`, - createScrollToAdjust: (element, updateCallback, min, max, step) => window.globalUtilsManager ? window.globalUtilsManager.createScrollToAdjust(element, updateCallback, min, max, step) : () => { }, - - // Tile calculation - calculateTileRange: (startRegionX, startRegionY, startPixelX, startPixelY, width, height, tileSize) => - window.globalUtilsManager ? window.globalUtilsManager.calculateTileRange(startRegionX, startRegionY, startPixelX, startPixelY, width, height, tileSize) : {}, - - // Token management - loadTurnstile: () => window.globalUtilsManager ? window.globalUtilsManager.loadTurnstile() : Promise.resolve(), - ensureTurnstileContainer: () => window.globalUtilsManager ? window.globalUtilsManager.ensureTurnstileContainer() : Promise.resolve(), - ensureTurnstileOverlayContainer: () => window.globalUtilsManager ? window.globalUtilsManager.ensureTurnstileOverlayContainer() : Promise.resolve(), - executeTurnstile: (sitekey, action) => window.globalUtilsManager ? window.globalUtilsManager.executeTurnstile(sitekey, action) : Promise.resolve(null), - createTurnstileWidget: (sitekey, action) => window.globalUtilsManager ? window.globalUtilsManager.createTurnstileWidget(sitekey, action) : Promise.resolve(), - createTurnstileWidgetInteractive: (sitekey, action) => window.globalUtilsManager ? window.globalUtilsManager.createTurnstileWidgetInteractive(sitekey, action) : Promise.resolve(), - cleanupTurnstile: () => window.globalUtilsManager ? window.globalUtilsManager.cleanupTurnstile() : Promise.resolve(), - obtainSitekeyAndToken: (fallback) => window.globalUtilsManager ? window.globalUtilsManager.obtainSitekeyAndToken(fallback) : Promise.resolve(fallback), - - // DOM utilities - createElement: (tag, props, children) => window.globalUtilsManager ? window.globalUtilsManager.createElement(tag, props, children) : document.createElement(tag), - createButton: (id, text, icon, onClick, style) => { - if (window.globalUtilsManager) { - return window.globalUtilsManager.createButton(id, text, icon, onClick, style); - } - const btn = document.createElement('button'); - btn.id = id; - btn.innerHTML = `${icon ? `` : ''}${text}`; - if (onClick) btn.addEventListener('click', onClick); - return btn; - }, - - // Translation with fallback - t: (key, params) => { - if (window.globalUtilsManager) { - return window.globalUtilsManager.t(key, params); - } - return getText(key, params); - }, - - // Open website color palette if not already open - openColorPalette: () => { - try { - // Check if color palette modal is already open - const paletteModal = document.querySelector('dialog[open]'); - if (paletteModal) { - console.log('✅ Color palette already open'); - return true; - } - - // Search for Paint/Pintar button (like Auto-Farm does) - const allButtons = Array.from(document.querySelectorAll('button')); - const paletteButton = allButtons.find(btn => - /(Pintar|Paint)/i.test(btn.textContent.trim()) - ); - - if (paletteButton) { - console.log('🎨 Opening color palette automatically...'); - paletteButton.click(); - return true; - } - - console.warn('⚠️ Color palette button not found'); - return false; - } catch (error) { - console.error('❌ Error opening color palette:', error); - return false; - } - }, - - showAlert: (message, type) => { - if (window.globalUtilsManager) { - window.globalUtilsManager.showAlert(message, type); - } else { - console.log(`Alert [${type}]: ${message}`); - } - }, - - hideAlert: () => { - // Remove existing alerts immediately with safety checks - const alerts = document.querySelectorAll('.wplace-alert-base'); - alerts.forEach(alert => { - try { - if (alert && alert.parentNode) { - alert.parentNode.removeChild(alert); - } - } catch (error) { - // Ignore removeChild errors if element was already removed - console.debug('Alert already removed:', error); - } - }); - }, - - // Color utilities - colorDistance: (a, b) => window.globalUtilsManager ? window.globalUtilsManager.colorDistance(a, b) : Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2) + Math.pow(a[2] - b[2], 2)), - findClosestPaletteColor: (r, g, b, palette) => window.globalUtilsManager ? window.globalUtilsManager.findClosestPaletteColor(r, g, b, palette) : [r, g, b], - isWhitePixel: (r, g, b) => window.globalUtilsManager ? window.globalUtilsManager.isWhitePixel(r, g, b) : (r > 240 && g > 240 && b > 240), - resolveColor: (targetRgb, availableColors, exactMatch) => window.globalUtilsManager ? window.globalUtilsManager.resolveColor(targetRgb, availableColors, exactMatch) : targetRgb, - - // CRITICAL FUNCTIONS - Direct implementations to ensure they work - createImageUploader: () => { - return new Promise((resolve, reject) => { - const input = document.createElement('input'); - input.type = 'file'; - input.accept = 'image/*'; - input.onchange = (e) => { - const file = e.target.files[0]; - if (file) { - const reader = new FileReader(); - reader.onload = () => resolve(reader.result); - reader.onerror = () => reject(new Error('File reading error')); - reader.readAsDataURL(file); - } else { - reject(new Error('No file selected')); - } - }; - input.click(); - }); - }, - - createFileUploader: () => { - return new Promise((resolve, reject) => { - const input = document.createElement('input'); - input.type = 'file'; - input.accept = '.json'; - input.onchange = (e) => { - const file = e.target.files[0]; - if (file) { - const reader = new FileReader(); - reader.onload = () => { - try { - const data = JSON.parse(reader.result); - resolve(data); - } catch (error) { - reject(new Error('Invalid JSON file')); - } - }; - reader.onerror = () => reject(new Error('File reading error')); - reader.readAsText(file); - } else { - reject(new Error('No file selected')); - } - }; - input.click(); - }); - }, - - createFileDownloader: (data, filename) => { - const blob = new Blob([data], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); - }, - - loadProgress: () => { - try { - const saved = localStorage.getItem('wplace-bot-progress'); - if (!saved) return null; - return JSON.parse(saved); - } catch (error) { - console.error('Error loading progress:', error); - return null; - } - }, - - saveProgress: () => { - try { - // Use utils manager to build proper save structure like old version - const data = window.globalUtilsManager ? - window.globalUtilsManager.buildProgressData() : - { - timestamp: Date.now(), - version: '2.2', - state: { - totalPixels: window.state.totalPixels, - paintedPixels: window.state.paintedPixels, - lastPosition: window.state.lastPosition, - startPosition: window.state.startPosition, - region: window.state.region, - imageLoaded: window.state.imageLoaded, - colorsChecked: window.state.colorsChecked, - coordinateMode: window.state.coordinateMode, - coordinateDirection: window.state.coordinateDirection, - coordinateSnake: window.state.coordinateSnake, - blockWidth: window.state.blockWidth, - blockHeight: window.state.blockHeight, - availableColors: window.state.availableColors, - }, - imageData: window.state.imageData ? { - width: window.state.imageData.width, - height: window.state.imageData.height, - pixels: Array.from(window.state.imageData.pixels), - totalPixels: window.state.imageData.totalPixels, - } : null, - paintedMapPacked: window.globalUtilsManager ? - window.globalUtilsManager.buildPaintedMapPacked() : null - }; - - // Attempt to save; if payload is too large (QuotaExceeded), retry without heavy pixel data - try { - localStorage.setItem('wplace-bot-progress', JSON.stringify(data)); - return true; - } catch (e) { - // Fallback: strip image pixels to reduce size and retry - if (data && data.imageData && data.imageData.pixels) { - const slimData = { - ...data, - imageData: { - width: data.imageData.width, - height: data.imageData.height, - totalPixels: data.imageData.totalPixels, - pixelsStripped: true, - } - }; - try { - localStorage.setItem('wplace-bot-progress', JSON.stringify(slimData)); - console.warn('Saved progress without raw pixel data due to storage quota limits.'); - return true; - } catch (e2) { - try { - // Last resort: try sessionStorage - sessionStorage.setItem('wplace-bot-progress', JSON.stringify(slimData)); - console.warn('Saved progress to sessionStorage without pixel data due to storage quota limits.'); - return true; - } catch (e3) { - throw e2; // will be handled by outer catch - } - } - } - throw e; - } - } catch (error) { - console.error('Error saving progress:', error); - return false; - } - }, - - clearProgress: () => { - try { - localStorage.removeItem('wplace-bot-progress'); - if (window.state) { - window.state.paintedMap = null; - window.state._lastSavePixelCount = 0; - window.state._lastSaveTime = 0; - } - return true; - } catch (error) { - console.error('Error clearing progress:', error); - return false; - } - }, - - restoreProgress: (savedData) => { - try { - console.log('🔍 [DEBUG] RestoreProgress: Starting restoration...'); - console.log('🔍 [DEBUG] SavedData exists:', !!savedData); - console.log('🔍 [DEBUG] SavedData.state exists:', !!savedData?.state); - - if (!savedData || !savedData.state) { - console.error('❌ [DEBUG] RestoreProgress: Invalid savedData or missing state'); - return false; - } - - console.log('🔍 [DEBUG] Current window.state keys before restore:', Object.keys(window.state || {})); - console.log('🔍 [DEBUG] SavedData.state keys:', Object.keys(savedData.state)); - - console.log('🔍 [DEBUG] Performing Object.assign...'); - Object.assign(window.state, savedData.state); - - // Reset session-specific flags when loading a new save file - window.state.preFilteringDone = false; - window.state.progressResetDone = false; - console.log('🔄 Reset session flags for new save file load'); - - console.log('✅ [DEBUG] Object.assign completed successfully'); - - // Restore available colors from old save files (backward compatibility) - if (savedData.state.availableColors && Array.isArray(savedData.state.availableColors)) { - console.log('🔍 [DEBUG] Restoring availableColors, count:', savedData.state.availableColors.length); - window.state.availableColors = savedData.state.availableColors; - window.state.colorsChecked = true; // Mark colors as checked - console.log('✅ [DEBUG] AvailableColors restored successfully'); - } else { - console.log('⚠️ [DEBUG] No availableColors found in savedData or not an array'); - } - - if (savedData.imageData && Array.isArray(savedData.imageData.pixels)) { - console.log('🔍 [DEBUG] Restoring imageData...'); - console.log('🔍 [DEBUG] ImageData type check - pixels is array:', Array.isArray(savedData.imageData.pixels)); - console.log('🔍 [DEBUG] ImageData pixels length:', savedData.imageData.pixels?.length); - - window.state.imageData = { - ...savedData.imageData, - pixels: new Uint8ClampedArray(savedData.imageData.pixels), - }; - console.log('✅ [DEBUG] ImageData restored successfully'); - console.log('🔍 [DEBUG] Converted pixels to Uint8ClampedArray, length:', window.state.imageData.pixels.length); - } else if (savedData.imageData && savedData.imageData.pixelsRef) { - console.warn('ℹ️ [DEBUG] Large image detected; loading pixels from IndexedDB via ref:', savedData.imageData.pixelsRef); - window.state.imageData = { - width: savedData.imageData.width, - height: savedData.imageData.height, - totalPixels: savedData.imageData.totalPixels, - pixels: null, - }; - window.state.imageLoaded = false; - - if (window.globalUtilsManager && typeof window.globalUtilsManager.loadPixelsFromIndexedDB === 'function') { - window.globalUtilsManager.loadPixelsFromIndexedDB(savedData.imageData.pixelsRef) - .then(payload => { - if (!payload || !payload.pixels) { - console.warn('⚠️ [DEBUG] Pixels not found in IDB. Ask user to reload image.'); - return; - } - window.state.imageData.pixels = new Uint8ClampedArray(payload.pixels); - window.state.imageLoaded = true; - console.log('✅ [DEBUG] Pixels loaded from IDB'); - - // Try to restore overlay immediately - if (typeof window.globalUtilsManager.restoreOverlayFromData === 'function') { - window.globalUtilsManager.restoreOverlayFromData().catch(() => {}); - } - }) - .catch(err => console.warn('❌ [DEBUG] Failed to load pixels from IDB:', err)); - } - } else if (savedData.imageData && savedData.imageData.pixelsStripped) { - console.warn('⚠️ [DEBUG] Saved progress did not include raw pixel data due to quota limits. Please reload the image file to resume.'); - // Preserve dimensions for UI, but mark image as not loaded - window.state.imageData = { - width: savedData.imageData.width, - height: savedData.imageData.height, - totalPixels: savedData.imageData.totalPixels, - pixels: null, - }; - window.state.imageLoaded = false; - } else { - console.log('⚠️ [DEBUG] No imageData found in savedData'); - } - - if (savedData.paintedMap) { - console.log('🔍 [DEBUG] Restoring paintedMap...'); - window.state.paintedMap = savedData.paintedMap.map((row) => Array.from(row)); - console.log('✅ [DEBUG] PaintedMap restored successfully'); - } else { - console.log('🔍 [DEBUG] No paintedMap found in savedData (this is normal for extracted data)'); - } - - console.log('✅ [DEBUG] RestoreProgress completed successfully'); - console.log('🔍 [DEBUG] Final window.state.imageLoaded:', window.state.imageLoaded); - console.log('🔍 [DEBUG] Final window.state.totalPixels:', window.state.totalPixels); - - return true; - } catch (error) { - console.error('❌ [DEBUG] Error in restoreProgress:', error); - console.error('❌ [DEBUG] Error stack:', error.stack); - console.error('❌ [DEBUG] SavedData structure at error:', JSON.stringify(savedData, null, 2)); - return false; - } - }, - - saveProgressToFile: () => { - try { - // Use utils manager to build proper save structure like old version - const progressData = window.globalUtilsManager ? - window.globalUtilsManager.buildProgressData() : - { - timestamp: Date.now(), - version: '2.2', - state: { - totalPixels: window.state.totalPixels, - paintedPixels: window.state.paintedPixels, - lastPosition: window.state.lastPosition, - startPosition: window.state.startPosition, - region: window.state.region, - imageLoaded: window.state.imageLoaded, - colorsChecked: window.state.colorsChecked, - coordinateMode: window.state.coordinateMode, - coordinateDirection: window.state.coordinateDirection, - coordinateSnake: window.state.coordinateSnake, - blockWidth: window.state.blockWidth, - blockHeight: window.state.blockHeight, - availableColors: window.state.availableColors, - }, - imageData: window.state.imageData ? { - width: window.state.imageData.width, - height: window.state.imageData.height, - pixels: Array.from(window.state.imageData.pixels), - totalPixels: window.state.imageData.totalPixels, - } : null, - paintedMapPacked: window.globalUtilsManager ? - window.globalUtilsManager.buildPaintedMapPacked() : null - }; - - const filename = `wplace-bot-progress-${new Date() - .toISOString() - .slice(0, 19) - .replace(/:/g, '-')}.json`; - Utils.createFileDownloader(JSON.stringify(progressData, null, 2), filename); - return true; - } catch (error) { - console.error('Error saving to file:', error); - return false; - } - }, - - loadProgressFromFile: async () => { - try { - console.log('🔍 [DEBUG] Starting file upload process...'); - const data = await Utils.createFileUploader(); - - console.log('🔍 [DEBUG] File upload completed. Data type:', typeof data); - console.log('🔍 [DEBUG] Data exists:', !!data); - - if (!data) { - console.error('❌ [DEBUG] No data received from file uploader'); - throw new Error('No data received from file'); - } - - console.log('🔍 [DEBUG] Data keys:', Object.keys(data)); - console.log('🔍 [DEBUG] Data.state exists:', !!data.state); - console.log('🔍 [DEBUG] Data.imageData exists:', !!data.imageData); - console.log('🔍 [DEBUG] Data.version:', data.version); - console.log('🔍 [DEBUG] Data.timestamp:', data.timestamp); - - if (!data.state) { - console.error('❌ [DEBUG] Missing state object in loaded data'); - console.log('🔍 [DEBUG] Available top-level keys:', Object.keys(data)); - throw new Error('Invalid file format - missing state object'); - } - - console.log('🔍 [DEBUG] State object keys:', Object.keys(data.state)); - console.log('🔍 [DEBUG] State.imageLoaded:', data.state.imageLoaded); - console.log('🔍 [DEBUG] State.totalPixels:', data.state.totalPixels); - console.log('🔍 [DEBUG] State.startPosition:', data.state.startPosition); - console.log('🔍 [DEBUG] State.region:', data.state.region); - - if (data.imageData) { - console.log('🔍 [DEBUG] ImageData width:', data.imageData.width); - console.log('🔍 [DEBUG] ImageData height:', data.imageData.height); - console.log('🔍 [DEBUG] ImageData pixels length:', data.imageData.pixels?.length); - console.log('🔍 [DEBUG] ImageData totalPixels:', data.imageData.totalPixels); - } - - console.log('🔍 [DEBUG] Calling restoreProgress...'); - const success = Utils.restoreProgress(data); - console.log('🔍 [DEBUG] RestoreProgress result:', success); - - return success; - } catch (error) { - console.error('❌ [DEBUG] Error in loadProgressFromFile:', error); - console.error('❌ [DEBUG] Error stack:', error.stack); - return false; - } - }, - - loadExtractedFileData: async () => { - try { - console.log('🔍 [DEBUG] Starting Art-Extractor file upload process...'); - const data = await Utils.createFileUploader(); - - console.log('🔍 [DEBUG] File upload completed. Data type:', typeof data); - console.log('🔍 [DEBUG] Data exists:', !!data); - console.log('📖 Raw loaded data:', data); - - if (!data) { - console.error('❌ [DEBUG] No data received from file uploader'); - return null; - } - - console.log('🔍 [DEBUG] Data keys:', Object.keys(data)); - console.log('🔍 [DEBUG] Data.state exists:', !!data.state); - console.log('🔍 [DEBUG] Data.imageData exists:', !!data.imageData); - console.log('🔍 [DEBUG] Data.version:', data.version); - console.log('🔍 [DEBUG] Data.timestamp:', data.timestamp); - - console.log('🔍 [DEBUG] Returning raw data object for Load Extracted feature'); - return data; - } catch (error) { - console.error('❌ [DEBUG] Error in loadExtractedFileData:', error); - return null; - } - }, - - // Other utilities - delegate to globalUtilsManager or provide simple fallbacks - extractAvailableColors: () => { - if (window.globalUtilsManager) { - return window.globalUtilsManager.extractAvailableColors(); - } else if (window.globalImageProcessor) { - return window.globalImageProcessor.extractAvailableColors(window.CONFIG.COLOR_MAP); - } else { - return []; - } - }, - formatTime: (ms) => window.globalUtilsManager ? window.globalUtilsManager.formatTime(ms) : `${Math.floor(ms / 1000)}s`, - calculateEstimatedTime: (remainingPixels, charges, cooldown) => window.globalUtilsManager ? window.globalUtilsManager.calculateEstimatedTime(remainingPixels, charges, cooldown) : 0, - initializePaintedMap: (width, height) => window.globalUtilsManager ? window.globalUtilsManager.initializePaintedMap(width, height) : console.log('Painted map not available'), - markPixelPainted: (x, y, regionX, regionY) => window.globalUtilsManager ? window.globalUtilsManager.markPixelPainted(x, y, regionX, regionY) : false, - isPixelPainted: (x, y, regionX, regionY) => window.globalUtilsManager ? window.globalUtilsManager.isPixelPainted(x, y, regionX, regionY) : false, - shouldAutoSave: () => window.globalUtilsManager ? window.globalUtilsManager.shouldAutoSave() : false, - performSmartSave: () => window.globalUtilsManager ? window.globalUtilsManager.performSmartSave() : false, - packPaintedMapToBase64: (paintedMap, width, height) => window.globalUtilsManager ? window.globalUtilsManager.packPaintedMapToBase64(paintedMap, width, height) : null, - unpackPaintedMapFromBase64: (base64, width, height) => window.globalUtilsManager ? window.globalUtilsManager.unpackPaintedMapFromBase64(base64, width, height) : null, - migrateProgressToV2: (saved) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgressToV2(saved) : saved, - migrateProgressToV21: (saved) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgressToV21(saved) : saved, - migrateProgressToV22: (data) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgressToV22(data) : data, - buildPaintedMapPacked: () => window.globalUtilsManager ? window.globalUtilsManager.buildPaintedMapPacked() : null, - buildProgressData: () => window.globalUtilsManager ? window.globalUtilsManager.buildProgressData() : {}, - migrateProgress: (saved) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgress(saved) : saved, - restoreOverlayFromData: () => window.globalUtilsManager ? window.globalUtilsManager.restoreOverlayFromData() : Promise.resolve(false), - updateCoordinateUI: (config) => window.globalUtilsManager ? window.globalUtilsManager.updateCoordinateUI(config) : console.log('Coordinate UI update not available'), - }; - - // IMAGE PROCESSOR WRAPPER - Uses WPlaceImageProcessor for modular functionality - class ImageProcessor { - constructor(imageSrc) { - // Create instance of the modular ImageProcessor - this._processor = new window.WPlaceImageProcessor(imageSrc); - - // Legacy compatibility properties - this.imageSrc = imageSrc; - this.img = null; - this.canvas = null; - this.ctx = null; - } - - async load() { - await this._processor.load(); - - // Update legacy properties for compatibility - this.img = this._processor.img; - this.canvas = this._processor.canvas; - this.ctx = this._processor.ctx; - } - - getDimensions() { - return this._processor.getDimensions(); - } - - getPixelData() { - return this._processor.getPixelData(); - } - - resize(newWidth, newHeight) { - const result = this._processor.resize(newWidth, newHeight); - - // Update legacy properties - this.img = this._processor.img; - this.canvas = this._processor.canvas; - this.ctx = this._processor.ctx; - - return result; - } - - generatePreview(width, height) { - return this._processor.generatePreview(width, height); - } - - // Cleanup method - cleanup() { - if (this._processor) { - this._processor.cleanup(); - } - } - } - - // WPLACE API SERVICE - const WPlaceService = { - async paintPixelInRegion(regionX, regionY, pixelX, pixelY, color) { - try { - await ensureToken(); - if (!getTurnstileToken()) return 'token_error'; - const payload = { - coords: [pixelX, pixelY], - colors: [color], - t: getTurnstileToken(), - fp: fpStr32, - }; - var token = await createWasmToken(regionX, regionY, payload); - const res = await fetch(`https://backend.wplace.live/s0/pixel/${regionX}/${regionY}`, { - method: 'POST', - headers: { 'Content-Type': 'text/plain;charset=UTF-8', "x-pawtect-token": token }, - credentials: 'include', - body: JSON.stringify(payload), - }); - if (res.status === 403) { - console.error('❌ 403 Forbidden. Turnstile token might be invalid or expired.'); - setTurnstileToken(null); - createTokenPromise(); - return 'token_error'; - } - const data = await res.json(); - return data?.painted === 1; - } catch (e) { - console.error('Paint request failed:', e); - return false; - } - }, - - async getCharges() { - try { - const res = await fetch(`https://backend.wplace.live/me?_=${Date.now()}` , { - credentials: "include", - cache: 'no-store' - }) - const data = await res.json() - return { - id: data.id, - charges: data.charges?.count || 0, - max: data.charges?.max || 1, - cooldown: data.charges?.next || CONFIG.COOLDOWN_DEFAULT, - droplets: data.droplets || 0, - } - } catch (e) { - console.error("Failed to get charges:", e) - return { - id: null, - charges: 0, - max: 1, - cooldown: CONFIG.COOLDOWN_DEFAULT, - droplets: 0, - } - } - }, - - async fetchCheck() { - try { - const res = await fetch(`https://backend.wplace.live/me?_=${Date.now()}` , { - credentials: "include", - cache: 'no-store' - }) - const data = await res.json() - return { - ID: data.id, - Username: data.username || data.name || null, - Charges: data.charges.count, - Max: data.charges.max, - Droplets: data.droplets - } - } catch (e) { - console.error("Failed to get ID:", e) - return { - - } - } - } - }; - - // Desktop Notification Manager - const NotificationManager = { - pollTimer: null, - pollIntervalMs: 60_000, - icon() { - const link = document.querySelector("link[rel~='icon']"); - return link?.href || location.origin + '/favicon.ico'; - }, - async requestPermission() { - if (!('Notification' in window)) { - Utils.showAlert(Utils.t('notificationsNotSupported'), 'warning'); - return 'denied'; - } - if (Notification.permission === 'granted') return 'granted'; - try { - const perm = await Notification.requestPermission(); - return perm; - } catch { - return Notification.permission; - } - }, - canNotify() { - return ( - state.notificationsEnabled && - typeof Notification !== 'undefined' && - Notification.permission === 'granted' - ); - }, - notify(title, body, tag = 'wplace-charges', force = false) { - if (!this.canNotify()) return false; - if (!force && state.notifyOnlyWhenUnfocused && document.hasFocus()) return false; - try { - new Notification(title, { - body, - tag, - renotify: true, - icon: this.icon(), - badge: this.icon(), - silent: false, - }); - return true; - } catch { - // Graceful fallback - Utils.showAlert(body, 'info'); - return false; - } - }, - resetEdgeTracking() { - state._lastChargesBelow = state.displayCharges < state.cooldownChargeThreshold; - state._lastChargesNotifyAt = 0; - }, - maybeNotifyChargesReached(force = false) { - if (!state.notificationsEnabled || !state.notifyOnChargesReached) return; - const reached = state.displayCharges >= state.cooldownChargeThreshold; - const now = Date.now(); - const repeatMs = Math.max(1, Number(state.notificationIntervalMinutes || 5)) * 60_000; - if (reached) { - const shouldEdge = state._lastChargesBelow || force; - const shouldRepeat = now - (state._lastChargesNotifyAt || 0) >= repeatMs; - if (shouldEdge || shouldRepeat) { - const msg = Utils.t('chargesReadyMessage', { - current: state.displayCharges, - max: state.maxCharges, - threshold: state.cooldownChargeThreshold, - }); - this.notify(Utils.t('chargesReadyNotification'), msg, 'wplace-notify-charges'); - state._lastChargesNotifyAt = now; - } - state._lastChargesBelow = false; - } else { - state._lastChargesBelow = true; - } - }, - startPolling() { - this.stopPolling(); - if (!state.notificationsEnabled || !state.notifyOnChargesReached) return; - // lightweight background polling - this.pollTimer = setInterval(async () => { - try { - const { charges, cooldown, max } = await WPlaceService.getCharges(); - state.displayCharges = Math.floor(charges); - state.cooldown = cooldown; - state.maxCharges = Math.max(1, Math.floor(max)); - this.maybeNotifyChargesReached(); - } catch { - /* ignore */ - } - }, this.pollIntervalMs); - }, - stopPolling() { - if (this.pollTimer) { - clearInterval(this.pollTimer); - this.pollTimer = null; - } - }, - syncFromState() { - this.resetEdgeTracking(); - if (state.notificationsEnabled && state.notifyOnChargesReached) this.startPolling(); - else this.stopPolling(); - }, - }; - - // COLOR MATCHING FUNCTION - Optimized with caching - const colorCache = new Map(); - - // UI UPDATE FUNCTIONS (declared early to avoid reference errors) - let updateUI = () => { }; - let updateStats = async () => { }; - let updateDataButtons = () => { }; - - function updateActiveColorPalette() { - state.activeColorPalette = []; - const activeSwatches = document.querySelectorAll('.wplace-color-swatch.active'); - if (activeSwatches) { - activeSwatches.forEach((swatch) => { - const rgbStr = swatch.getAttribute('data-rgb'); - if (rgbStr) { - const rgb = rgbStr.split(',').map(Number); - state.activeColorPalette.push(rgb); - } - }); - } - if (document.querySelector('.resize-container')?.style.display === 'block') { - _updateResizePreview(); - } - } - - function toggleAllColors(select, showingUnavailable = false) { - const swatches = document.querySelectorAll('.wplace-color-swatch'); - if (swatches) { - swatches.forEach((swatch) => { - // Only toggle colors that are available or if we're showing unavailable colors - const isUnavailable = swatch.classList.contains('unavailable'); - if (!isUnavailable || showingUnavailable) { - // Don't try to select unavailable colors - if (!isUnavailable) { - swatch.classList.toggle('active', select); - } - } - }); - } - updateActiveColorPalette(); - } - - function unselectAllPaidColors() { - const swatches = document.querySelectorAll('.wplace-color-swatch'); - if (swatches) { - swatches.forEach((swatch) => { - const colorId = parseInt(swatch.getAttribute('data-color-id'), 10); - if (!isNaN(colorId) && colorId >= 32) { - swatch.classList.toggle('active', false); - } - }); - } - updateActiveColorPalette(); - } - - function initializeColorPalette(container) { - const colorsContainer = container.querySelector('#colors-container'); - const showAllToggle = container.querySelector('#showAllColorsToggle'); - if (!colorsContainer) return; - - // Use already captured colors from state (captured during upload) - // Don't re-fetch colors here, use what was captured when user clicked upload - if (!state.availableColors || state.availableColors.length === 0) { - // If no colors have been captured yet, show message - colorsContainer.innerHTML = `

    ${Utils.t( - 'uploadImageFirst' - )}
    `; - return; - } - - function populateColors(showUnavailable = false) { - colorsContainer.innerHTML = ''; - let availableCount = 0; - let totalCount = 0; - - // Convert COLOR_MAP to array and filter out transparent - const allColors = Object.values(CONFIG.COLOR_MAP).filter((color) => color.rgb !== null); - - allColors.forEach((colorData) => { - const { id, name, rgb } = colorData; - const rgbKey = `${rgb.r},${rgb.g},${rgb.b}`; - totalCount++; - - // Check if this color is available in the captured colors - const isAvailable = state.availableColors.some( - (c) => c.rgb[0] === rgb.r && c.rgb[1] === rgb.g && c.rgb[2] === rgb.b - ); - - // If not showing all colors and this color is not available, skip it - if (!showUnavailable && !isAvailable) { - return; - } - - if (isAvailable) availableCount++; - - const colorItem = Utils.createElement('div', { - className: 'wplace-color-item', - }); - const swatch = Utils.createElement('button', { - className: `wplace-color-swatch ${!isAvailable ? 'unavailable' : ''}`, - title: `${name} (ID: ${id})${!isAvailable ? ' (Unavailable)' : ''}`, - 'data-rgb': rgbKey, - 'data-color-id': id, - }); - swatch.style.backgroundColor = `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`; - - // Make unavailable colors visually distinct - if (!isAvailable) { - swatch.style.opacity = '0.4'; - swatch.style.filter = 'grayscale(50%)'; - swatch.disabled = true; - } else { - // Select available colors by default - swatch.classList.add('active'); - } - - const nameLabel = Utils.createElement( - 'span', - { - className: 'wplace-color-item-name', - style: !isAvailable ? 'color: #888; font-style: italic;' : '', - }, - name + (!isAvailable ? ' (N/A)' : '') - ); - - // Only add click listener for available colors - if (isAvailable) { - swatch.addEventListener('click', () => { - swatch.classList.toggle('active'); - updateActiveColorPalette(); - }); - } - - colorItem.appendChild(swatch); - colorItem.appendChild(nameLabel); - colorsContainer.appendChild(colorItem); - }); - - updateActiveColorPalette(); - } - - // Initialize with only available colors - populateColors(false); - - // Add toggle functionality - if (showAllToggle) { - showAllToggle.addEventListener('change', (e) => { - populateColors(e.target.checked); - }); - } - - container - .querySelector('#selectAllBtn') - ?.addEventListener('click', () => toggleAllColors(true, showAllToggle?.checked)); - container - .querySelector('#unselectAllBtn') - ?.addEventListener('click', () => toggleAllColors(false, showAllToggle?.checked)); - container - .querySelector('#unselectPaidBtn') - ?.addEventListener('click', () => unselectAllPaidColors()); - } - - async function handleCaptcha(allowGeneration = true) { - const startTime = performance.now(); - - // Check user's token source preference - if (state.tokenSource === 'manual') { - console.log('🎯 Manual token source selected - using pixel placement automation'); - if (!allowGeneration) { - console.log('❌ Token generation disabled during processing'); - return null; - } - return await tokenManager.handleCaptchaFallback(); - } - - // Generator mode (pure) or Hybrid mode - try generator first - try { - // Use optimized token generation with automatic sitekey detection - const { sitekey, token: preGeneratedToken } = await Utils.obtainSitekeyAndToken(); - - if (!sitekey) { - throw new Error('No valid sitekey found'); - } - - console.log('🔑 Generating Turnstile token for sitekey:', sitekey); - console.log( - '🧭 UA:', - navigator.userAgent.substring(0, 50) + '...', - 'Platform:', - navigator.platform - ); - - // Add additional checks before token generation - if (!window.turnstile) { - await Utils.loadTurnstile(); - } - - let token = null; - - // ✅ Reuse pre-generated token if available and valid - if ( - preGeneratedToken && - typeof preGeneratedToken === 'string' && - preGeneratedToken.length > 20 - ) { - console.log('♻️ Reusing pre-generated token from sitekey detection phase'); - token = preGeneratedToken; - } - // ✅ Or use globally cached token if still valid - else if (isTokenValid()) { - console.log('♻️ Using existing cached token (from previous operation)'); - token = getTurnstileToken(); - } - // ✅ Otherwise generate a new one (only if allowed) - else { - if (!allowGeneration) { - console.log('❌ Token expired/missing but generation disabled during processing'); - return null; - } - console.log('🔐 No valid pre-generated or cached token, creating new one...'); - token = await Utils.executeTurnstile(sitekey, 'paint'); - if (token) { - setTurnstileToken(token); - } - } - - console.log( - `🔍 Token received - Type: ${typeof token}, Value: ${token - ? typeof token === 'string' - ? token.length > 50 - ? token.substring(0, 50) + '...' - : token - : JSON.stringify(token) - : 'null/undefined' - }, Length: ${token?.length || 0}` - ); - - // ✅ Final validation - if (typeof token === 'string' && token.length > 20) { - const duration = Math.round(performance.now() - startTime); - console.log(`✅ Turnstile token generated successfully in ${duration}ms`); - return token; - } else { - throw new Error( - `Invalid or empty token received - Type: ${typeof token}, Value: ${JSON.stringify( - token - )}, Length: ${token?.length || 0}` - ); - } - } catch (error) { - const duration = Math.round(performance.now() - startTime); - console.error(`❌ Turnstile token generation failed after ${duration}ms:`, error); - - // Fallback to manual pixel placement for hybrid mode - if (state.tokenSource === 'hybrid') { - console.log( - '🔄 Hybrid mode: Generator failed, automatically switching to manual pixel placement...' - ); - const fbToken = await tokenManager.handleCaptchaFallback(); - return fbToken; - } else { - // Pure generator mode - don't fallback, just fail - throw error; - } - } - } - - async function createUI() { - await detectLanguage(); - - const existingContainer = document.getElementById('wplace-image-bot-container'); - const existingStats = document.getElementById('wplace-stats-container'); - const existingSettings = document.getElementById('wplace-settings-container'); - const existingResizeContainer = document.querySelector('.resize-container'); - const existingResizeOverlay = document.querySelector('.resize-overlay'); - - if (existingContainer) existingContainer.remove(); - if (existingStats) existingStats.remove(); - if (existingSettings) existingSettings.remove(); - if (existingResizeContainer) existingResizeContainer.remove(); - if (existingResizeOverlay) existingResizeOverlay.remove(); - - loadThemePreference(); - await initializeTranslations(); - - const theme = getCurrentTheme(); - applyTheme(); // <- new: set CSS vars and theme class before building UI - - function appendLinkOnce(href, attributes = {}) { - // Check if a link with the same href already exists in the document head - const exists = Array.from(document.head.querySelectorAll('link')).some( - (link) => link.href === href - ); - if (exists) return; - - // Create a new link element - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = href; - - // Add any additional attributes (e.g., data-* attributes) - for (const [key, value] of Object.entries(attributes)) { - link.setAttribute(key, value); - } - - // Append the link element to the document head - document.head.appendChild(link); - } - - appendLinkOnce('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'); - - if (theme.fontFamily.includes('Press Start 2P')) { - appendLinkOnce('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap'); - } - - // Load auto-image-styles.css - prioritize extension local resources - console.group('%c🎨 Loading Auto-Image Styles', 'color: #8b5cf6; font-weight: bold;'); - - let stylesLoaded = false; - - // First try: Check if extension has loaded local CSS resources - if (window.AUTOBOT_THEMES && window.AUTOBOT_THEMES['auto-image-styles.css']) { - console.log('%c🔍 Found auto-image-styles.css in extension local resources!', 'color: #10b981; font-weight: bold;'); - - // Check if it's already injected by the extension - const existingStyle = document.getElementById('autobot-auto-image-styles'); - if (existingStyle) { - console.log('%c✅ Styles already injected by extension - using local version', 'color: #10b981; font-weight: bold;'); - console.log(' 📍 Source: Extension local file (already in DOM)'); - console.log(' 🆔 Element ID: autobot-auto-image-styles'); - stylesLoaded = true; - } else { - // Inject it ourselves - const styleElement = document.createElement('style'); - styleElement.id = 'autobot-auto-image-styles-script'; - styleElement.setAttribute('data-wplace-theme', 'true'); - styleElement.textContent = window.AUTOBOT_THEMES['auto-image-styles.css']; - document.head.appendChild(styleElement); - - console.log('%c✅ Injected auto-image-styles.css from extension local resources', 'color: #10b981; font-weight: bold;'); - console.log(' 📍 Source: Extension local file'); - console.log(' 📏 Size: ' + window.AUTOBOT_THEMES['auto-image-styles.css'].length + ' characters'); - console.log(' 🆔 Element ID: autobot-auto-image-styles-script'); - stylesLoaded = true; - } - } else { - console.log('%c📝 auto-image-styles.css not found in extension resources', 'color: #f59e0b;'); - console.log(' 🔍 window.AUTOBOT_THEMES:', typeof window.AUTOBOT_THEMES); - if (window.AUTOBOT_THEMES) { - console.log(' 📋 Available themes:', Object.keys(window.AUTOBOT_THEMES)); - } - } - - // Fallback: Load from CDN if local resources not available - if (!stylesLoaded) { - console.log('%c🌐 Falling back to CDN loading...', 'color: #8b5cf6;'); - appendLinkOnce( - 'https://wplace-autobot.github.io/WPlace-AutoBOT/main/auto-image-styles.css', - { 'data-wplace-theme': 'true' } - ); - console.log('%c📚 Loaded auto-image-styles.css from CDN (fallback)', 'color: #f59e0b; font-weight: bold;'); - console.log(' 📍 Source: CDN (wplace-autobot.github.io)'); - console.log(' 🌐 URL: https://wplace-autobot.github.io/WPlace-AutoBOT/main/auto-image-styles.css'); - console.log(' ⚠️ Performance: Network request required'); - } - - console.groupEnd(); - - // Ensure default theme is loaded from extension resources - if (window.applyTheme && typeof window.applyTheme === 'function') { - console.group('%c🎨 Loading Default Theme from Extension', 'color: #8b5cf6; font-weight: bold;'); - - // Determine the current theme file name - let defaultTheme = 'classic'; // fallback - if (CONFIG.currentTheme === 'Neon Retro') { - defaultTheme = 'neon'; - } else if (CONFIG.currentTheme === 'Neon Retro Cyan') { - defaultTheme = 'neon-cyan'; - } else if (CONFIG.currentTheme === 'Neon Retro Light') { - defaultTheme = 'neon-light'; - } else if (CONFIG.currentTheme === 'Classic Light') { - defaultTheme = 'classic-light'; - } else if (CONFIG.currentTheme === 'Acrylic') { - defaultTheme = 'acrylic'; - } - - console.log(`%c🎯 Loading theme: ${defaultTheme} (${CONFIG.currentTheme})`, 'color: #8b5cf6;'); - const success = window.applyTheme(defaultTheme); - - if (success) { - console.log(`%c✅ Default theme loaded from extension local resources`, 'color: #10b981; font-weight: bold;'); - console.log(` 📍 Source: Extension local file (themes/${defaultTheme}.css)`); - console.log(` 🚀 Performance: Instant load (no CDN request)`); - console.log(` 🎨 Theme: ${CONFIG.currentTheme}`); - } else { - console.warn(`%c⚠️ Failed to load theme ${defaultTheme} from extension`, 'color: #f59e0b;'); - console.log(` 📝 Note: Theme CSS classes will still work`); - } - - console.groupEnd(); - } else { - console.warn(`%c⚠️ Extension applyTheme() function not available`, 'color: #f59e0b; font-weight: bold;'); - console.log(` 📝 Themes will be limited to CSS classes only`); - } - - const container = document.createElement('div'); - container.id = 'wplace-image-bot-container'; - container.innerHTML = ` -
    -
    - - ${Utils.t('title')} -
    -
    - - - - -
    -
    -
    - -
    -
    - ${Utils.t('initMessage')} -
    -
    -
    -
    -
    - - -
    -
    🖼️ Image Management
    -
    -
    - - -
    -
    - - -
    -
    - -
    -
    -
    - - -
    -
    🎮 Painting Control
    -
    -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    ⏱️ ${Utils.t('cooldownSettings')}
    -
    - -
    -
    - -
    -
    - - - - ${Utils.t('charges')} - -
    -
    -
    -
    - - -
    -
    💾 Data Management
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    - `; - - const statsContainer = document.createElement('div'); - statsContainer.id = 'wplace-stats-container'; - statsContainer.style.display = 'none'; - statsContainer.innerHTML = ` -
    -
    - - ${Utils.t('paintingStats')} -
    -
    - - -
    -
    -
    -
    -
    -
    -
    ${Utils.t('initMessage')}
    -
    -
    -
    - -
    -
    -
    - - Account Swapper -
    - -
    -
    - -
    -
    -
    - - Auto Buy Charges -
    -
    -
    - - - -
    -
    -
    - -
    -
    - - All Accounts - -
    -
    -
    Click the icon to load accounts.
    -
    -
    -
    - `; - - function initPillSelector() { - const buttons = statsContainer.querySelectorAll(".pill-btn"); - const highlight = statsContainer.querySelector(".pill-highlight"); - - buttons.forEach((btn, index) => { - btn.addEventListener("click", () => { - highlight.style.transform = `translateX(${index * 100}%)`; - - buttons.forEach((b) => b.classList.remove("active")); - btn.classList.add("active"); - - CONFIG.autoBuy = btn.dataset.mode; - if (CONFIG.autoBuy === 'none') { - console.log("AutoBuy disabled"); - CONFIG.autoBuyToggle = false; - } - else { - CONFIG.autoBuyToggle = true; - console.log("AutoBuy enabled"); - } - console.log("AutoBuy mode set to:", CONFIG.autoBuy); - }); - }); - } - - initPillSelector(); - - // Modern Settings Container with Theme Support - // Use the theme variable already declared at the top of createUI function - const settingsContainer = document.createElement('div'); - settingsContainer.id = 'wplace-settings-container'; - - // Apply theme-based styling - const themeBackground = theme.primary - ? `linear-gradient(135deg, ${theme.primary} 0%, ${theme.secondary || theme.primary} 100%)` - : `linear-gradient(135deg, #667eea 0%, #764ba2 100%)`; - - settingsContainer.className = 'wplace-settings-container-base'; - // Apply theme-specific background - settingsContainer.style.background = themeBackground; - settingsContainer.style.cssText += ` - min-width: 420px; - max-width: 480px; - z-index: 99999; - color: ${theme.text || 'white'}; - font-family: ${theme.fontFamily || "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif"}; - box-shadow: ${theme.boxShadow || '0 20px 40px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.1)' - }; - backdrop-filter: ${theme.backdropFilter || 'blur(10px)'}; - overflow: hidden; - animation: settings-slide-in 0.4s ease-out; - ${theme.animations?.glow - ? ` - box-shadow: ${theme.boxShadow || '0 20px 40px rgba(0,0,0,0.3)'}, - 0 0 30px ${theme.highlight || theme.neon || '#00ffff'}; - ` - : '' - } - `; - - // noinspection CssInvalidFunction - settingsContainer.innerHTML = ` -
    -
    -

    - - ${Utils.t('settings')} -

    - -
    -
    - -
    - - -
    - -
    - -

    - Generator mode creates tokens automatically. Hybrid mode falls back to manual when generator fails. Manual mode only uses pixel placement. -

    -
    -
    - - -
    - - -
    - - -
    - -
    - -
    -
    - Overlay Opacity -
    ${Math.round(state.overlayOpacity * 100)}%
    -
    - -
    - - -
    -
    - - -
    - - -
    - - - - - - -
    -
    - - -
    - - - -
    - - -
    - - -
    - - -
    - - -
    -
    - ${Utils.t('batchSize')} -
    -
    -
    - -
    -
    -
    - - - - pixels -
    -
    -
    -
    - ${CONFIG.PAINTING_SPEED.MIN} - ${CONFIG.PAINTING_SPEED.MAX} -
    -
    - - -
    -
    -
    - - -
    -
    - - -
    -
    -

    - 🎲 Random batch size between min and max values -

    -
    - - - -
    - - -
    - - - -
    - - -
    - - -
    - - -
    - - -
    - -
    - - -
    -
    -
    - - -
    -
    - - -
    -
    -

    - 🧱 Block dimensions for block-based generation modes -

    -
    -
    - - -
    - -
    - - - -
    - ${Utils.t('repeatEvery')} - - ${Utils.t('minutesPl')} -
    -
    - - -
    -
    -
    - - -
    - -
    - -
    -
    - - -
    - -
    - -
    -
    -
    - - - - - `; - - const resizeContainer = document.createElement('div'); - resizeContainer.className = 'resize-container'; - resizeContainer.innerHTML = ` -

    ${Utils.t('resizeImage')}

    -
    - - - - -
    - -
    - - - - -
    - - - - - - - 100% -
    - Drag to pan • Pinch to zoom • Double‑tap to zoom -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    - -
    - - 1 -
    -
    -
    - -
    - - 1 -
    -
    -
    -
    - -
    - - - -
    -
    - - - Shift = Row • Alt = Column -
    -
    - -
    -
    -  Color Palette -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    - -
    -
    -  Advanced Color Matching -
    -
    - - -
    -
    - ${Utils.t('chromaWeight')} - ${state.chromaPenaltyWeight} -
    - -
    - -
    - - -
    - -
    -
    - -
    - - - -
    - `; - - const resizeOverlay = document.createElement('div'); - resizeOverlay.className = 'resize-overlay'; - - document.body.appendChild(container); - document.body.appendChild(resizeOverlay); - document.body.appendChild(resizeContainer); - document.body.appendChild(statsContainer); - document.body.appendChild(settingsContainer); - - // Show the main container after all elements are appended - container.style.display = 'block'; - - const uploadBtn = container.querySelector('#uploadBtn'); - const resizeBtn = container.querySelector('#resizeBtn'); - const selectPosBtn = container.querySelector('#selectPosBtn'); - const startBtn = container.querySelector('#startBtn'); - const stopBtn = container.querySelector('#stopBtn'); - const saveBtn = container.querySelector('#saveBtn'); - const loadBtn = container.querySelector('#loadBtn'); - const saveToFileBtn = container.querySelector('#saveToFileBtn'); - const loadFromFileBtn = container.querySelector('#loadFromFileBtn'); - - container.querySelectorAll('.wplace-section-title').forEach((title) => { - // Add a right-side arrow if it doesn't exist - if (!title.querySelector('i.arrow')) { - const arrow = document.createElement('i'); - arrow.className = 'fas fa-chevron-down arrow'; // FontAwesome down arrow - title.appendChild(arrow); - } - - // Click event to toggle collapse/expand of the section - title.addEventListener('click', () => { - const section = title.parentElement; - section.classList.toggle('collapsed'); - }); - }); - - // Disable load/upload buttons until initial setup is complete (startup only) - if (loadBtn) { - loadBtn.disabled = !state.initialSetupComplete; - loadBtn.title = state.initialSetupComplete - ? '' - : '🔄 Waiting for initial setup to complete...'; - } - if (loadFromFileBtn) { - loadFromFileBtn.disabled = !state.initialSetupComplete; - loadFromFileBtn.title = state.initialSetupComplete - ? '' - : '🔄 Waiting for initial setup to complete...'; - } - if (uploadBtn) { - uploadBtn.disabled = !state.initialSetupComplete; - uploadBtn.title = state.initialSetupComplete - ? '' - : '🔄 Waiting for initial setup to complete...'; - } - - const minimizeBtn = container.querySelector('#minimizeBtn'); - const compactBtn = container.querySelector('#compactBtn'); - const statsBtn = container.querySelector('#statsBtn'); - const toggleOverlayBtn = container.querySelector('#toggleOverlayBtn'); - const statusText = container.querySelector('#statusText'); - const progressBar = container.querySelector('#progressBar'); - const statsArea = statsContainer.querySelector('#statsArea'); - const content = container.querySelector('.wplace-content'); - const closeStatsBtn = statsContainer.querySelector('#closeStatsBtn'); - const refreshChargesBtn = statsContainer.querySelector('#refreshChargesBtn'); - const cooldownSlider = container.querySelector('#cooldownSlider'); - const cooldownInput = container.querySelector('#cooldownInput'); - const cooldownDecrease = container.querySelector('#cooldownDecrease'); - const cooldownIncrease = container.querySelector('#cooldownIncrease'); - const cooldownValue = container.querySelector('#cooldownValue'); - - if (!uploadBtn || !selectPosBtn || !startBtn || !stopBtn) { - console.error('Some UI elements not found:', { - uploadBtn: !!uploadBtn, - selectPosBtn: !!selectPosBtn, - startBtn: !!startBtn, - stopBtn: !!stopBtn, - }); - } - - if (!statsContainer || !statsArea || !closeStatsBtn) { - // Note: base CSS now aligns with this layout: main panel at left:20px (width 280), stats at left:330px. - } - - const header = container.querySelector('.wplace-header'); - - makeDraggable(container); - - function makeDraggable(element) { - let pos1 = 0, - pos2 = 0, - pos3 = 0, - pos4 = 0; - let isDragging = false; - const header = - element.querySelector('.wplace-header') || element.querySelector('.wplace-settings-header'); - - if (!header) { - console.warn('No draggable header found for element:', element); - return; - } - - header.onmousedown = dragMouseDown; - - function dragMouseDown(e) { - if (e.target.closest('.wplace-header-btn') || e.target.closest('button')) return; - - e.preventDefault(); - isDragging = true; - - const rect = element.getBoundingClientRect(); - - element.style.transform = 'none'; - element.style.top = rect.top + 'px'; - element.style.left = rect.left + 'px'; - - pos3 = e.clientX; - pos4 = e.clientY; - element.classList.add('wplace-dragging'); - document.onmouseup = closeDragElement; - document.onmousemove = elementDrag; - - document.body.style.userSelect = 'none'; - } - - function elementDrag(e) { - if (!isDragging) return; - - e.preventDefault(); - pos1 = pos3 - e.clientX; - pos2 = pos4 - e.clientY; - pos3 = e.clientX; - pos4 = e.clientY; - - let newTop = element.offsetTop - pos2; - let newLeft = element.offsetLeft - pos1; - - const rect = element.getBoundingClientRect(); - const maxTop = window.innerHeight - rect.height; - const maxLeft = window.innerWidth - rect.width; - - newTop = Math.max(0, Math.min(newTop, maxTop)); - newLeft = Math.max(0, Math.min(newLeft, maxLeft)); - - element.style.top = newTop + 'px'; - element.style.left = newLeft + 'px'; - } - - function closeDragElement() { - isDragging = false; - element.classList.remove('wplace-dragging'); - document.onmouseup = null; - document.onmousemove = null; - document.body.style.userSelect = ''; - } - } - - makeDraggable(statsContainer); - makeDraggable(container); - - if (statsBtn && closeStatsBtn) { - statsBtn.addEventListener('click', () => { - const isVisible = statsContainer.style.display !== 'none'; - if (isVisible) { - statsContainer.style.display = 'none'; - statsBtn.innerHTML = ''; - statsBtn.title = Utils.t('showStats'); - } else { - statsContainer.style.display = 'block'; - statsBtn.innerHTML = ''; - statsBtn.title = Utils.t('hideStats'); - } - }); - - closeStatsBtn.addEventListener('click', () => { - statsContainer.style.display = 'none'; - statsBtn.innerHTML = ''; - statsBtn.title = Utils.t('showStats'); - }); - - if (refreshChargesBtn) { - refreshChargesBtn.addEventListener('click', async () => { - refreshChargesBtn.innerHTML = ''; - refreshChargesBtn.disabled = true; - - try { - await updateStats(); - await updateCurrentAccountInList(); - } catch (error) { - console.error('Error refreshing charges:', error); - } finally { - refreshChargesBtn.innerHTML = ''; - refreshChargesBtn.disabled = false; - } - }); - } - - // Account-related event handlers - const autoSwapToggle = statsContainer.querySelector('#autoSwapToggle'); - const refreshAllAccountsBtn = statsContainer.querySelector('#refreshAllAccountsBtn'); - - if (autoSwapToggle) { - autoSwapToggle.checked = CONFIG.autoSwap; - autoSwapToggle.addEventListener('change', (e) => { - CONFIG.autoSwap = e.target.checked; - console.log(`🔄 Auto-swap ${CONFIG.autoSwap ? 'enabled' : 'disabled'}`); - - // Handle autoBuy toggle dependency - const autoBuyToggle = statsContainer.querySelector('#autoBuyToggle'); - if (autoBuyToggle) { - if (!CONFIG.autoSwap) { - // If autoSwap is disabled, disable and uncheck autoBuy - autoBuyToggle.disabled = true; - autoBuyToggle.checked = false; - CONFIG.autoBuyToggle = false; - console.log(`💰 Auto-buy disabled (requires auto-swap)`); - } else { - // If autoSwap is enabled, enable autoBuy toggle - autoBuyToggle.disabled = false; - } - } - }); - } - - // Auto Buy toggle logic - const autoBuyToggle = statsContainer.querySelector('#autoBuyToggle'); - if (autoBuyToggle) { - autoBuyToggle.checked = CONFIG.autoBuyToggle; - autoBuyToggle.disabled = !CONFIG.autoSwap; // Disable if autoSwap is off - - autoBuyToggle.addEventListener('change', (e) => { - CONFIG.autoBuyToggle = e.target.checked; - console.log(`💰 Auto-buy ${CONFIG.autoBuyToggle ? 'enabled' : 'disabled'}`); - }); - } - - if (refreshAllAccountsBtn) { - refreshAllAccountsBtn.addEventListener('click', fetchAllAccountDetails); - } - } - if (statsContainer && statsBtn) { - // Stats container starts visible by default - user clicks button to hide - statsContainer.style.display = 'block'; - statsBtn.innerHTML = ''; - statsBtn.title = Utils.t('hideStats'); - } - - const settingsBtn = container.querySelector('#settingsBtn'); - const closeSettingsBtn = settingsContainer.querySelector('#closeSettingsBtn'); - const applySettingsBtn = settingsContainer.querySelector('#applySettingsBtn'); - - if (settingsBtn && closeSettingsBtn && applySettingsBtn) { - settingsBtn.addEventListener('click', () => { - const isVisible = settingsContainer.classList.contains('show'); - if (isVisible) { - settingsContainer.style.animation = 'settings-fade-out 0.3s ease-out forwards'; - settingsContainer.classList.remove('show'); - setTimeout(() => { - settingsContainer.style.animation = ''; - }, 300); - } else { - settingsContainer.style.top = '50%'; - settingsContainer.style.left = '50%'; - settingsContainer.style.transform = 'translate(-50%, -50%)'; - settingsContainer.classList.add('show'); - settingsContainer.style.animation = 'settings-slide-in 0.4s ease-out'; - } - }); - - closeSettingsBtn.addEventListener('click', () => { - settingsContainer.style.animation = 'settings-fade-out 0.3s ease-out forwards'; - settingsContainer.classList.remove('show'); - setTimeout(() => { - settingsContainer.style.animation = ''; - settingsContainer.style.top = '50%'; - settingsContainer.style.left = '50%'; - settingsContainer.style.transform = 'translate(-50%, -50%)'; - }, 300); - }); - - applySettingsBtn.addEventListener('click', () => { - // Sync advanced settings before save - const colorAlgorithmSelect = document.getElementById('colorAlgorithmSelect'); - if (colorAlgorithmSelect) state.colorMatchingAlgorithm = colorAlgorithmSelect.value; - const enableChromaPenaltyToggle = document.getElementById('enableChromaPenaltyToggle'); - if (enableChromaPenaltyToggle) - state.enableChromaPenalty = enableChromaPenaltyToggle.checked; - const chromaPenaltyWeightSlider = document.getElementById('chromaPenaltyWeightSlider'); - if (chromaPenaltyWeightSlider) - state.chromaPenaltyWeight = parseFloat(chromaPenaltyWeightSlider.value) || 0.15; - const transparencyThresholdInput = document.getElementById('transparencyThresholdInput'); - if (transparencyThresholdInput) { - const v = parseInt(transparencyThresholdInput.value, 10); - if (!isNaN(v) && v >= 0 && v <= 255) state.customTransparencyThreshold = v; - } - const whiteThresholdInput = document.getElementById('whiteThresholdInput'); - if (whiteThresholdInput) { - const v = parseInt(whiteThresholdInput.value, 10); - if (!isNaN(v) && v >= 200 && v <= 255) state.customWhiteThreshold = v; - } - // Update functional thresholds - CONFIG.TRANSPARENCY_THRESHOLD = state.customTransparencyThreshold; - CONFIG.WHITE_THRESHOLD = state.customWhiteThreshold; - // Notifications - const notifEnabledToggle = document.getElementById('notifEnabledToggle'); - const notifOnChargesToggle = document.getElementById('notifOnChargesToggle'); - const notifOnlyUnfocusedToggle = document.getElementById('notifOnlyUnfocusedToggle'); - const notifIntervalInput = document.getElementById('notifIntervalInput'); - if (notifEnabledToggle) state.notificationsEnabled = !!notifEnabledToggle.checked; - if (notifOnChargesToggle) state.notifyOnChargesReached = !!notifOnChargesToggle.checked; - if (notifOnlyUnfocusedToggle) - state.notifyOnlyWhenUnfocused = !!notifOnlyUnfocusedToggle.checked; - if (notifIntervalInput) { - const v = parseInt(notifIntervalInput.value, 10); - if (!isNaN(v) && v >= 1 && v <= 60) state.notificationIntervalMinutes = v; - } - saveBotSettings(); - Utils.showAlert(Utils.t('settingsSaved'), 'success'); - closeSettingsBtn.click(); - NotificationManager.syncFromState(); - }); - - makeDraggable(settingsContainer); - - const tokenSourceSelect = settingsContainer.querySelector('#tokenSourceSelect'); - if (tokenSourceSelect) { - tokenSourceSelect.addEventListener('change', (e) => { - state.tokenSource = e.target.value; - saveBotSettings(); - console.log(`🔑 Token source changed to: ${state.tokenSource}`); - const sourceNames = { - generator: 'Automatic Generator', - hybrid: 'Generator + Auto Fallback', - manual: 'Manual Pixel Placement', - }; - Utils.showAlert( - Utils.t('tokenSourceSet', { source: sourceNames[state.tokenSource] }), - 'success' - ); - }); - } - - // Painting order controls - const paintingOrderSelect = settingsContainer.querySelector('#paintingOrderSelect'); - if (paintingOrderSelect) { - paintingOrderSelect.addEventListener('change', (e) => { - state.paintingOrder = e.target.value; - saveBotSettings(); - console.log(`🎨 Painting order changed to: ${state.paintingOrder}`); - const orderNames = { - sequential: Utils.t('paintingOrderSequential'), - 'color-by-color': Utils.t('paintingOrderColorByColor'), - }; - Utils.showAlert( - `Painting order set to: ${orderNames[state.paintingOrder]}`, - 'success' - ); - }); - } - - // Batch mode controls - const batchModeSelect = settingsContainer.querySelector('#batchModeSelect'); - const normalBatchControls = settingsContainer.querySelector('#normalBatchControls'); - const randomBatchControls = settingsContainer.querySelector('#randomBatchControls'); - const randomBatchMin = settingsContainer.querySelector('#randomBatchMin'); - const randomBatchMax = settingsContainer.querySelector('#randomBatchMax'); - - if (batchModeSelect) { - batchModeSelect.addEventListener('change', (e) => { - state.batchMode = e.target.value; - - // Switch between normal and random controls - if (normalBatchControls && randomBatchControls) { - if (e.target.value === 'random') { - normalBatchControls.style.display = 'none'; - randomBatchControls.style.display = 'block'; - } else { - normalBatchControls.style.display = 'block'; - randomBatchControls.style.display = 'none'; - } - } - - saveBotSettings(); - console.log(`📦 Batch mode changed to: ${state.batchMode}`); - Utils.showAlert( - Utils.t('batchModeSet', { - mode: - state.batchMode === 'random' ? Utils.t('randomRange') : Utils.t('normalFixedSize'), - }), - 'success' - ); - }); - } - - if (randomBatchMin) { - randomBatchMin.addEventListener('input', (e) => { - const min = parseInt(e.target.value); - if (min >= 1 && min <= 1000) { - state.randomBatchMin = min; - // Ensure min doesn't exceed max - if (randomBatchMax && min > state.randomBatchMax) { - state.randomBatchMax = min; - randomBatchMax.value = min; - } - saveBotSettings(); - } - }); - } - - if (randomBatchMax) { - randomBatchMax.addEventListener('input', (e) => { - const max = parseInt(e.target.value); - if (max >= 1 && max <= 1000) { - state.randomBatchMax = max; - // Ensure max doesn't go below min - if (randomBatchMin && max < state.randomBatchMin) { - state.randomBatchMin = max; - randomBatchMin.value = max; - } - saveBotSettings(); - } - }); - } - - const languageSelect = settingsContainer.querySelector('#languageSelect'); - if (languageSelect) { - languageSelect.addEventListener('change', async (e) => { - const newLanguage = e.target.value; - state.language = newLanguage; - localStorage.setItem('wplace_language', newLanguage); - - // Load the new language translations - await loadTranslations(newLanguage); - - setTimeout(() => { - settingsContainer.style.display = 'none'; - createUI(); - }, 100); - }); - } - - const themeSelect = settingsContainer.querySelector('#themeSelect'); - if (themeSelect) { - themeSelect.addEventListener('change', (e) => { - const newTheme = e.target.value; - switchTheme(newTheme); - }); - } - - const overlayOpacitySlider = settingsContainer.querySelector('#overlayOpacitySlider'); - const overlayOpacityValue = settingsContainer.querySelector('#overlayOpacityValue'); - const enableBlueMarbleToggle = settingsContainer.querySelector('#enableBlueMarbleToggle'); - const settingsPaintWhiteToggle = settingsContainer.querySelector('#settingsPaintWhiteToggle'); - const settingsPaintTransparentToggle = settingsContainer.querySelector( - '#settingsPaintTransparentToggle' - ); - - if (overlayOpacitySlider && overlayOpacityValue) { - const updateOpacity = (newValue) => { - const opacity = parseFloat(newValue); - state.overlayOpacity = opacity; - overlayOpacitySlider.value = opacity; - overlayOpacityValue.textContent = `${Math.round(opacity * 100)}%`; - }; - - overlayOpacitySlider.addEventListener('input', (e) => { - updateOpacity(e.target.value); - }); - - // Add scroll-to-adjust for overlay opacity slider - Utils.createScrollToAdjust(overlayOpacitySlider, updateOpacity, 0, 1, 0.05); - } - - if (settingsPaintWhiteToggle) { - settingsPaintWhiteToggle.checked = state.paintWhitePixels; - settingsPaintWhiteToggle.addEventListener('change', (e) => { - state.paintWhitePixels = e.target.checked; - saveBotSettings(); - console.log(`🎨 Paint white pixels: ${state.paintWhitePixels ? 'ON' : 'OFF'}`); - const statusText = state.paintWhitePixels - ? 'White pixels in the template will be painted' - : 'White pixels will be skipped'; - Utils.showAlert(statusText, 'success'); - }); - } - - if (settingsPaintTransparentToggle) { - settingsPaintTransparentToggle.checked = state.paintTransparentPixels; - settingsPaintTransparentToggle.addEventListener('change', (e) => { - state.paintTransparentPixels = e.target.checked; - saveBotSettings(); - console.log( - `🎨 Paint transparent pixels: ${state.paintTransparentPixels ? 'ON' : 'OFF'}` - ); - const statusText = state.paintTransparentPixels - ? 'Transparent pixels in the template will be painted with the closest available color' - : 'Transparent pixels will be skipped'; - Utils.showAlert(statusText, 'success'); - }); - } - - // Speed controls - both slider and input - const speedSlider = settingsContainer.querySelector('#speedSlider'); - const speedInput = settingsContainer.querySelector('#speedInput'); - const speedDecrease = settingsContainer.querySelector('#speedDecrease'); - const speedIncrease = settingsContainer.querySelector('#speedIncrease'); - const speedValue = settingsContainer.querySelector('#speedValue'); - - if (speedSlider && speedInput && speedValue && speedDecrease && speedIncrease) { - const updateSpeed = (newValue) => { - const speed = Math.max(CONFIG.PAINTING_SPEED.MIN, Math.min(CONFIG.PAINTING_SPEED.MAX, parseInt(newValue))); - state.paintingSpeed = speed; - - // Update both controls (value shows in input, label shows unit only) - speedSlider.value = speed; - speedInput.value = speed; - speedValue.textContent = `pixels`; - - saveBotSettings(); - }; - - // Slider event listener - speedSlider.addEventListener('input', (e) => { - updateSpeed(e.target.value); - }); - - // Number input event listener - speedInput.addEventListener('input', (e) => { - updateSpeed(e.target.value); - }); - - // Decrease button - speedDecrease.addEventListener('click', () => { - updateSpeed(parseInt(speedInput.value) - 1); - }); - - // Increase button - speedIncrease.addEventListener('click', () => { - updateSpeed(parseInt(speedInput.value) + 1); - }); - - // Add scroll-to-adjust for speed slider - Utils.createScrollToAdjust(speedSlider, updateSpeed, CONFIG.PAINTING_SPEED.MIN, CONFIG.PAINTING_SPEED.MAX, 1); - } - - if (enableBlueMarbleToggle) { - enableBlueMarbleToggle.addEventListener('click', async () => { - state.blueMarbleEnabled = enableBlueMarbleToggle.checked; - if (state.imageLoaded && overlayManager.imageBitmap) { - Utils.showAlert(Utils.t('reprocessingOverlay'), 'info'); - await overlayManager.processImageIntoChunks(); - Utils.showAlert(Utils.t('overlayUpdated'), 'success'); - } - }); - } - - // Speed control toggle - const enableSpeedToggle = settingsContainer.querySelector('#enableSpeedToggle'); - if (enableSpeedToggle) { - enableSpeedToggle.addEventListener('change', (e) => { - CONFIG.PAINTING_SPEED_ENABLED = e.target.checked; - saveBotSettings(); - console.log(`⚡ Batch speed control: ${CONFIG.PAINTING_SPEED_ENABLED ? 'ON' : 'OFF'}`); - const statusText = CONFIG.PAINTING_SPEED_ENABLED - ? 'Batch speed control enabled - will use configured batch size' - : 'Batch speed control disabled - will use all available charges immediately'; - Utils.showAlert(statusText, 'success'); - }); - } - - // (Advanced color listeners moved outside to work with resize dialog) - // (Advanced color listeners moved outside to work with resize dialog) - // Notifications listeners - const notifPermBtn = settingsContainer.querySelector('#notifRequestPermBtn'); - const notifTestBtn = settingsContainer.querySelector('#notifTestBtn'); - if (notifPermBtn) { - notifPermBtn.addEventListener('click', async () => { - const perm = await NotificationManager.requestPermission(); - if (perm === 'granted') Utils.showAlert(Utils.t('notificationsEnabled'), 'success'); - else Utils.showAlert(Utils.t('notificationsPermissionDenied'), 'warning'); - }); - } - if (notifTestBtn) { - notifTestBtn.addEventListener('click', () => { - NotificationManager.notify( - Utils.t('testNotificationTitle'), - Utils.t('testNotificationMessage'), - 'wplace-notify-test', - true - ); - }); - } - } - - const widthSlider = resizeContainer.querySelector('#widthSlider'); - const heightSlider = resizeContainer.querySelector('#heightSlider'); - const widthValue = resizeContainer.querySelector('#widthValue'); - const heightValue = resizeContainer.querySelector('#heightValue'); - const keepAspect = resizeContainer.querySelector('#keepAspect'); - const paintWhiteToggle = resizeContainer.querySelector('#paintWhiteToggle'); - const paintTransparentToggle = resizeContainer.querySelector('#paintTransparentToggle'); - const zoomSlider = resizeContainer.querySelector('#zoomSlider'); - const zoomValue = resizeContainer.querySelector('#zoomValue'); - const zoomInBtn = resizeContainer.querySelector('#zoomInBtn'); - const zoomOutBtn = resizeContainer.querySelector('#zoomOutBtn'); - const zoomFitBtn = resizeContainer.querySelector('#zoomFitBtn'); - const zoomActualBtn = resizeContainer.querySelector('#zoomActualBtn'); - const panModeBtn = resizeContainer.querySelector('#panModeBtn'); - const panStage = resizeContainer.querySelector('#resizePanStage'); - const canvasStack = resizeContainer.querySelector('#resizeCanvasStack'); - const baseCanvas = resizeContainer.querySelector('#resizeCanvas'); - const maskCanvas = resizeContainer.querySelector('#maskCanvas'); - const baseCtx = baseCanvas.getContext('2d'); - const maskCtx = maskCanvas.getContext('2d'); - const confirmResize = resizeContainer.querySelector('#confirmResize'); - const cancelResize = resizeContainer.querySelector('#cancelResize'); - const editImageBtn = resizeContainer.querySelector('#editImageBtn'); - const downloadPreviewBtn = resizeContainer.querySelector('#downloadPreviewBtn'); - const clearIgnoredBtn = resizeContainer.querySelector('#clearIgnoredBtn'); - - // Coordinate generation controls with smart visibility - const coordinateModeSelect = settingsContainer.querySelector('#coordinateModeSelect'); - const coordinateDirectionSelect = settingsContainer.querySelector('#coordinateDirectionSelect'); - const coordinateSnakeToggle = settingsContainer.querySelector('#coordinateSnakeToggle'); - const directionControls = settingsContainer.querySelector('#directionControls'); - const snakeControls = settingsContainer.querySelector('#snakeControls'); - const blockControls = settingsContainer.querySelector('#blockControls'); - const blockWidthInput = settingsContainer.querySelector('#blockWidthInput'); - const blockHeightInput = settingsContainer.querySelector('#blockHeightInput'); - const paintUnavailablePixelsToggle = settingsContainer.querySelector( - '#paintUnavailablePixelsToggle' - ); - - if (paintUnavailablePixelsToggle) { - paintUnavailablePixelsToggle.checked = state.paintUnavailablePixels; - paintUnavailablePixelsToggle.addEventListener('change', (e) => { - state.paintUnavailablePixels = e.target.checked; - saveBotSettings(); - console.log(`🎨 Paint unavailable colors: ${state.paintUnavailablePixels ? 'ON' : 'OFF'}`); - const statusText = state.paintUnavailablePixels - ? 'Unavailable template colors will be painted with the closest available color' - : 'Unavailable template colors will be skipped'; - Utils.showAlert(statusText, 'success'); - }); - } - if (coordinateModeSelect) { - coordinateModeSelect.value = state.coordinateMode; - coordinateModeSelect.addEventListener('change', (e) => { - state.coordinateMode = e.target.value; - Utils.updateCoordinateUI({ - mode: state.coordinateMode, - directionControls, - snakeControls, - blockControls, - }); - saveBotSettings(); - console.log(`🔄 Coordinate mode changed to: ${state.coordinateMode}`); - Utils.showAlert(`Coordinate mode set to: ${state.coordinateMode}`, 'success'); - }); - } - - if (coordinateDirectionSelect) { - coordinateDirectionSelect.value = state.coordinateDirection; - coordinateDirectionSelect.addEventListener('change', (e) => { - state.coordinateDirection = e.target.value; - saveBotSettings(); - console.log(`🧭 Coordinate direction changed to: ${state.coordinateDirection}`); - Utils.showAlert(`Coordinate direction set to: ${state.coordinateDirection}`, 'success'); - }); - } - - if (coordinateSnakeToggle) { - coordinateSnakeToggle.checked = state.coordinateSnake; - coordinateSnakeToggle.addEventListener('change', (e) => { - state.coordinateSnake = e.target.checked; - saveBotSettings(); - console.log(`🐍 Snake pattern ${state.coordinateSnake ? 'enabled' : 'disabled'}`); - Utils.showAlert( - `Snake pattern ${state.coordinateSnake ? 'enabled' : 'disabled'}`, - 'success' - ); - }); - } - - if (blockWidthInput) { - blockWidthInput.value = state.blockWidth; - blockWidthInput.addEventListener('input', (e) => { - const width = parseInt(e.target.value); - if (width >= 1 && width <= 50) { - state.blockWidth = width; - saveBotSettings(); - } - }); - } - - if (blockHeightInput) { - blockHeightInput.value = state.blockHeight; - blockHeightInput.addEventListener('change', (e) => { - const height = parseInt(e.target.value); - if (height >= 1 && height <= 50) { - state.blockHeight = height; - saveBotSettings(); - } - }); - } - - if (compactBtn) { - compactBtn.addEventListener('click', () => { - container.classList.toggle('wplace-compact'); - const isCompact = container.classList.contains('wplace-compact'); - - if (isCompact) { - compactBtn.innerHTML = ''; - compactBtn.title = Utils.t('expandMode'); - } else { - compactBtn.innerHTML = ''; - compactBtn.title = Utils.t('compactMode'); - } - }); - } - - if (minimizeBtn) { - minimizeBtn.addEventListener('click', () => { - state.minimized = !state.minimized; - if (state.minimized) { - container.classList.add('wplace-minimized'); - content.classList.add('wplace-hidden'); - minimizeBtn.innerHTML = ''; - minimizeBtn.title = Utils.t('restore'); - } else { - container.classList.remove('wplace-minimized'); - content.classList.remove('wplace-hidden'); - minimizeBtn.innerHTML = ''; - minimizeBtn.title = Utils.t('minimize'); - } - saveBotSettings(); - }); - } - - if (toggleOverlayBtn) { - toggleOverlayBtn.addEventListener('click', () => { - const isEnabled = overlayManager.toggle(); - toggleOverlayBtn.classList.toggle('active', isEnabled); - toggleOverlayBtn.setAttribute('aria-pressed', isEnabled ? 'true' : 'false'); - Utils.showAlert(isEnabled ? Utils.t('overlayEnabled') : Utils.t('overlayDisabled'), 'info'); - }); - } - - if (state.minimized) { - container.classList.add('wplace-minimized'); - content.classList.add('wplace-hidden'); - if (minimizeBtn) { - minimizeBtn.innerHTML = ''; - minimizeBtn.title = Utils.t('restore'); - } - } else { - container.classList.remove('wplace-minimized'); - content.classList.remove('wplace-hidden'); - if (minimizeBtn) { - minimizeBtn.innerHTML = ''; - minimizeBtn.title = Utils.t('minimize'); - } - } - - if (saveBtn) { - saveBtn.addEventListener('click', () => { - if (!state.imageLoaded) { - Utils.showAlert(Utils.t('missingRequirements'), 'error'); - return; - } - - const success = Utils.saveProgress(); - if (success) { - updateUI('autoSaved', 'success'); - Utils.showAlert(Utils.t('autoSaved'), 'success'); - } else { - Utils.showAlert(Utils.t('errorSavingProgress'), 'error'); - } - }); - } - - if (loadBtn) { - loadBtn.addEventListener('click', async () => { - // Auto-open color palette if not already open - Utils.openColorPalette(); - - const savedData = Utils.loadProgress(); - if (!savedData) { - updateUI('noSavedData', 'warning'); - Utils.showAlert(Utils.t('noSavedData'), 'warning'); - return; - } - - // CRITICAL FIX: If save file contains complete data, bypass initial setup check - // This matches old version behavior where save files could be loaded immediately - const hasCompleteData = savedData.state && savedData.imageData && - savedData.state.availableColors && - savedData.state.availableColors.length > 0; - - if (!state.initialSetupComplete && !hasCompleteData) { - Utils.showAlert(Utils.t('pleaseWaitInitialSetup'), 'warning'); - return; - } - - const confirmLoad = confirm( - `${Utils.t('savedDataFound')}\n\n` + - `Saved: ${new Date(savedData.timestamp).toLocaleString()}\n` + - `Progress: ${savedData.state.paintedPixels}/${savedData.state.totalPixels} pixels` - ); - - if (confirmLoad) { - const success = Utils.restoreProgress(savedData); - if (success) { - // CRITICAL FIX: Set initial setup complete if save had complete data - if (hasCompleteData) { - state.initialSetupComplete = true; - } - - updateUI('dataLoaded', 'success'); - Utils.showAlert(Utils.t('dataLoaded'), 'success'); - updateDataButtons(); - - // CRITICAL FIX: Force immediate stats update after save loading - await updateStats(); - - // Force stats display refresh by updating the stats container - const statsContainer = document.getElementById('wplace-stats-container'); - if (statsContainer && typeof updateStats === 'function') { - // Trigger a forced visual refresh of the stats - setTimeout(async () => { - await updateStats(); - }, 100); - } - - // Restore overlay if image data was loaded from localStorage - Utils.restoreOverlayFromData().catch((error) => { - console.error('Failed to restore overlay from localStorage:', error); - }); - - if (!state.colorsChecked) { - uploadBtn.disabled = false; - const loadExtractedBtn = document.getElementById('loadExtractedBtn'); - if (loadExtractedBtn) loadExtractedBtn.disabled = false; - } else { - uploadBtn.disabled = false; - const loadExtractedBtn = document.getElementById('loadExtractedBtn'); - if (loadExtractedBtn) loadExtractedBtn.disabled = false; - selectPosBtn.disabled = false; - } - - if (state.imageLoaded && state.startPosition && state.region && state.colorsChecked) { - startBtn.disabled = false; - } - } else { - Utils.showAlert(Utils.t('errorLoadingProgress'), 'error'); - } - } - }); - } - - if (saveToFileBtn) { - saveToFileBtn.addEventListener('click', () => { - const success = Utils.saveProgressToFile(); - if (success) { - updateUI('fileSaved', 'success'); - Utils.showAlert(Utils.t('fileSaved'), 'success'); - } else { - Utils.showAlert(Utils.t('fileError'), 'error'); - } - }); - } - - if (loadFromFileBtn) { - loadFromFileBtn.addEventListener('click', async () => { - console.log('🔍 [DEBUG] Load from file button clicked'); - console.log('🔍 [DEBUG] Initial setup complete:', state.initialSetupComplete); - - try { - // First check if we can load the file - this will tell us if it has complete data - console.log('🔍 [DEBUG] Starting file upload...'); - const fileData = await Utils.createFileUploader(); - - console.log('🔍 [DEBUG] File data received:', !!fileData); - console.log('🔍 [DEBUG] File data keys:', fileData ? Object.keys(fileData) : 'N/A'); - - if (!fileData || !fileData.state) { - console.error('❌ [DEBUG] Invalid file data or missing state'); - console.log('🔍 [DEBUG] FileData:', fileData); - Utils.showAlert(Utils.t('invalidFileFormat'), 'error'); - return; - } - - // CRITICAL FIX: If file contains complete data, bypass initial setup check - const hasCompleteData = fileData.state && fileData.imageData && - fileData.state.availableColors && - fileData.state.availableColors.length > 0; - - console.log('🔍 [DEBUG] Has complete data check:'); - console.log(' - fileData.state:', !!fileData.state); - console.log(' - fileData.imageData:', !!fileData.imageData); - console.log(' - fileData.state.availableColors:', !!fileData.state.availableColors); - console.log(' - availableColors length:', fileData.state.availableColors?.length); - console.log(' - hasCompleteData result:', hasCompleteData); - - if (!state.initialSetupComplete && !hasCompleteData) { - console.log('⚠️ [DEBUG] Setup not complete and no complete data, showing warning'); - Utils.showAlert(Utils.t('pleaseWaitFileSetup'), 'warning'); - return; - } - - console.log('🔍 [DEBUG] Calling restoreProgress...'); - const success = Utils.restoreProgress(fileData); - console.log('🔍 [DEBUG] RestoreProgress result:', success); - - if (success) { - console.log('✅ [DEBUG] File loaded successfully'); - - // CRITICAL FIX: Set initial setup complete if file had complete data - if (hasCompleteData) { - console.log('🔍 [DEBUG] Setting initialSetupComplete to true due to complete data'); - state.initialSetupComplete = true; - } - - updateUI('fileLoaded', 'success'); - Utils.showAlert(Utils.t('fileLoaded'), 'success'); - updateDataButtons(); - - console.log('🔍 [DEBUG] Updating stats...'); - await updateStats(); - - // Restore overlay if image data was loaded from file - console.log('🔍 [DEBUG] Attempting to restore overlay...'); - await Utils.restoreOverlayFromData().catch((error) => { - console.error('❌ [DEBUG] Failed to restore overlay from file:', error); - }); - - console.log('🔍 [DEBUG] Updating button states after load...'); - console.log(' - state.colorsChecked:', state.colorsChecked); - console.log(' - state.imageLoaded:', state.imageLoaded); - console.log(' - state.startPosition:', !!state.startPosition); - console.log(' - state.region:', !!state.region); - - if (state.colorsChecked) { - console.log('🔍 [DEBUG] Enabling buttons due to colorsChecked'); - uploadBtn.disabled = false; - selectPosBtn.disabled = false; - resizeBtn.disabled = false; - } else { - console.log('🔍 [DEBUG] Only enabling upload button'); - uploadBtn.disabled = false; - } - - if (state.imageLoaded && state.startPosition && state.region && state.colorsChecked) { - console.log('🔍 [DEBUG] All conditions met, enabling start button'); - startBtn.disabled = false; - } else { - console.log('⚠️ [DEBUG] Start button requirements not met'); - } - } else { - console.error('❌ [DEBUG] RestoreProgress failed'); - Utils.showAlert('File loading failed - check console for details', 'error'); - } - } catch (error) { - console.error('❌ [DEBUG] Error in file load process:', error); - console.error('❌ [DEBUG] Error stack:', error.stack); - - if (error.message === 'Invalid JSON file') { - console.error('❌ [DEBUG] Invalid JSON file detected'); - Utils.showAlert(Utils.t('invalidFileFormat'), 'error'); - } else { - console.error('❌ [DEBUG] General file error:', error.message); - Utils.showAlert(`File error: ${error.message}`, 'error'); - } - } - }); - } - - updateUI = (messageKey, type = 'default', params = {}, silent = false) => { - const message = Utils.t(messageKey, params); - statusText.textContent = message; - statusText.className = `wplace-status status-${type}`; - - if (!silent) { - // Trigger animation only when silent = false - statusText.style.animation = 'none'; - void statusText.offsetWidth; // trick to restart the animation - statusText.style.animation = 'slide-in 0.3s ease-out'; - } - }; - - function updateChargeStatsDisplay(intervalMs) { - const currentChargesEl = document.getElementById('wplace-stat-charges-value'); - const fullChargeEl = document.getElementById('wplace-stat-fullcharge-value'); - if (!fullChargeEl && !currentChargesEl) return; - if (!state.fullChargeData) { - fullChargeEl.textContent = '--:--:--'; - return; - } - - const { current, max, cooldownMs, startTime, spentSinceShot } = state.fullChargeData; - const elapsed = Date.now() - startTime; - - // total charges including elapsed time and spent during painting since snapshot - const chargesGained = elapsed / cooldownMs; - const rawCharges = current + chargesGained - spentSinceShot; - const cappedCharges = Math.min(rawCharges, max); - - // rounding with 0.95 threshold - let displayCharges; - const fraction = cappedCharges - Math.floor(cappedCharges); - if (fraction >= 0.95) { - displayCharges = Math.ceil(cappedCharges); - } else { - displayCharges = Math.floor(cappedCharges); - } - - state.displayCharges = Math.max(0, displayCharges); - state.preciseCurrentCharges = cappedCharges; - - const remainingMs = getMsToTargetCharges(cappedCharges, max, state.cooldown, intervalMs); - const timeText = Utils.msToTimeText(remainingMs); - - if (currentChargesEl) { - currentChargesEl.innerHTML = `${state.displayCharges} / ${max}`; - } - - if ( - state.displayCharges < state.cooldownChargeThreshold && - !state.stopFlag && - state.running - ) { - updateChargesThresholdUI(intervalMs); - } - - if (fullChargeEl) { - if (state.displayCharges >= max) { - fullChargeEl.innerHTML = `FULL`; - } else { - fullChargeEl.innerHTML = ` - ${timeText} - `; - } - } - } - - updateStats = async (isManualRefresh = false) => { - const isFirstCheck = !state.fullChargeData?.startTime; - - const minUpdateInterval = 60_000; - const maxUpdateInterval = 90_000; - const randomUpdateThreshold = - minUpdateInterval + Math.random() * (maxUpdateInterval - minUpdateInterval); - const timeSinceLastUpdate = Date.now() - (state.fullChargeData?.startTime || 0); - const isTimeToUpdate = timeSinceLastUpdate >= randomUpdateThreshold; - - const shouldCallApi = isFirstCheck || isTimeToUpdate; - - const { charges, max, cooldown } = await WPlaceService.getCharges(); - state.displayCharges = Math.floor(charges); - state.preciseCurrentCharges = charges; - state.cooldown = cooldown; - state.maxCharges = Math.floor(max) > 1 ? Math.floor(max) : state.maxCharges; - - state.fullChargeData = { - current: charges, - max: max, - cooldownMs: cooldown, - startTime: Date.now(), - spentSinceShot: 0, - }; - // Evaluate notifications every time we refresh server-side charges - NotificationManager.maybeNotifyChargesReached(); - - if (state.fullChargeInterval) { - clearInterval(state.fullChargeInterval); - state.fullChargeInterval = null; - } - const intervalMs = 1000; - state.fullChargeInterval = setInterval( - () => updateChargeStatsDisplay(intervalMs), - intervalMs - ); - - if (cooldownSlider && cooldownSlider.max !== state.maxCharges) { - cooldownSlider.max = state.maxCharges; - } - if (cooldownInput && cooldownInput.max !== state.maxCharges) { - cooldownInput.max = state.maxCharges; - } - - // // Update current account charges in the account list - // await updateCurrentAccountInList(); - - let imageStatsHTML = ''; - if (state.imageLoaded) { - const progress = - state.totalPixels > 0 ? Math.round((state.paintedPixels / state.totalPixels) * 100) : 0; - const remainingPixels = state.totalPixels - state.paintedPixels; - - // Updated estimation calculation for new cooldown logic - // Now we wait for cooldownChargeThreshold before processing pixels - - // Calculate batch size (with fallback if function not yet defined) - let batchSize; - try { - batchSize = typeof calculateBatchSize === 'function' ? calculateBatchSize() : state.paintingSpeed || 5; - } catch (e) { - batchSize = state.paintingSpeed || 5; - } - - // Ensure batchSize is valid and not zero - batchSize = Math.max(1, Math.min(batchSize, remainingPixels)); - const batchesNeeded = Math.ceil(remainingPixels / batchSize); - - // Calculate time accounting for cooldown threshold behavior with safety checks - let estimatedMs = 0; - if (remainingPixels > 0 && Number.isFinite(state.cooldown) && state.cooldown > 0) { - // Current charges available check - const currentCharges = Math.max(0, state.displayCharges); - const thresholdCharges = Math.max(1, state.cooldownChargeThreshold || 1); - - if (currentCharges < thresholdCharges) { - // Need to wait for charges to reach threshold first - const chargesNeeded = thresholdCharges - currentCharges; - estimatedMs += chargesNeeded * state.cooldown; - } - - // Calculate painting time more accurately - // Each batch uses thresholdCharges, so calculate how many cycles we need - const pixelsPerCycle = Math.min(batchSize, thresholdCharges); - const cyclesNeeded = Math.ceil(remainingPixels / pixelsPerCycle); - - // Time between cycles (waiting for charges to regenerate) - if (cyclesNeeded > 1) { - const regenerationTime = (cyclesNeeded - 1) * thresholdCharges * state.cooldown; - estimatedMs += regenerationTime; - } - - // Add painting speed delay if enabled - if (CONFIG.PAINTING_SPEED_ENABLED && state.paintingSpeed > 0) { - const paintingDelay = remainingPixels * (1000 / state.paintingSpeed); - estimatedMs += paintingDelay; - } - } - - // Safety check to prevent infinity or invalid values - if (!Number.isFinite(estimatedMs) || estimatedMs < 0) { - estimatedMs = 0; - } - - state.estimatedTime = estimatedMs; - progressBar.style.width = `${progress}%`; - - imageStatsHTML = ` -
    -
    ${Utils.t('progress')}
    -
    ${progress}%
    -
    -
    -
    ${Utils.t( - 'pixels' - )}
    -
    ${state.paintedPixels}/${state.totalPixels}
    -
    - `; - } - - let colorSwatchesHTML = ''; - state.availableColors = state.availableColors.filter( - (c) => c.name !== 'Unknown CoIor NaN' && c.id !== null - ); - - const availableColors = Utils.extractAvailableColors(); - const newCount = Array.isArray(availableColors) ? availableColors.length : 0; - - if (newCount === 0 && isManualRefresh) { - Utils.showAlert(Utils.t('noColorsFound'), 'warning'); - } else if (newCount > 0 && state.availableColors.length < newCount) { - const oldCount = state.availableColors.length; - - Utils.showAlert( - Utils.t('colorsUpdated', { - oldCount, - newCount: newCount, - diffCount: newCount - oldCount, - }), - 'success' - ); - state.availableColors = availableColors; - } - if (state.colorsChecked) { - colorSwatchesHTML = state.availableColors - .map((color) => { - const rgbString = `rgb(${color.rgb.join(',')})`; - return `
    `; - }) - .join(''); - } - - // Calculate multi-account statistics - let totalAllCharges = 0; - let totalMaxCharges = 0; - const accounts = accountManager.getAllAccounts(); - if (accounts.length > 0) { - // Use ChargeModel (real-time) when available for consistent totals - totalAllCharges = accounts.reduce((sum, acc) => { - const node = ChargeModel.get(acc.token); - const charges = Number.isFinite(node?.charges) ? Math.floor(node.charges) : Math.floor(acc.Charges || 0); - const max = Number.isFinite(node?.max) ? Math.floor(node.max) : Math.floor(acc.Max || 0); - const safeCharges = Math.max(0, Math.min(charges, max)); - return sum + safeCharges; - }, 0); - totalMaxCharges = accounts.reduce((sum, acc) => { - const node = ChargeModel.get(acc.token); - const max = Number.isFinite(node?.max) ? Math.floor(node.max) : Math.floor(acc.Max || 0); - return sum + Math.max(0, max); - }, 0); - } - - statsArea.innerHTML = ` - ${imageStatsHTML} - ${accounts.length > 0 ? ` -
    -
    - Total All Accounts Charges -
    -
    - ${totalAllCharges}/${totalMaxCharges} -
    -
    - ` : ''} -
    -
    - ${Utils.t('charges')} -
    -
    - ${state.displayCharges} / ${state.fullChargeData?.max ?? state.maxCharges} -
    -
    -
    -
    - ${Utils.t('fullChargeIn')} -
    -
    --:--:--
    -
    - ${state.colorsChecked - ? ` -
    -
    ${Utils.t( - 'availableColors', - { count: state.availableColors.length } - )}
    -
    - ${colorSwatchesHTML} -
    -
    - ` - : '' - } - `; - - // should be after statsArea.innerHTML = '...'. todo make full stats ui update partial - updateChargeStatsDisplay(intervalMs); - }; - - updateDataButtons = () => { - const hasImageData = state.imageLoaded && state.imageData; - saveBtn.disabled = !hasImageData; - saveToFileBtn.disabled = !hasImageData; - }; - - updateDataButtons(); - - function showMoveArtworkPanel() { - // Create move artwork control panel like status panels - const movePanel = document.createElement('div'); - movePanel.id = 'moveArtworkPanel'; - movePanel.className = 'wplace-move-panel'; - - movePanel.innerHTML = ` -
    -
    - - Move Artwork -
    -
    - -
    -
    -
    -
    - -
    - -
    1px
    - -
    - -
    -
    - `; - - // No overlay - append directly to body like other panels - document.body.appendChild(movePanel); - - // Make the panel draggable - makeDraggable(movePanel); - - // Add event listeners for movement - let currentMessageTimeout = null; - - function moveArtwork(deltaX, deltaY) { - if (state.startPosition && state.region) { - const newX = state.startPosition.x + deltaX; - const newY = state.startPosition.y + deltaY; - - console.log(`🔄 Moving artwork from (${state.startPosition.x}, ${state.startPosition.y}) to (${newX}, ${newY})`); - - state.startPosition.x = newX; - state.startPosition.y = newY; - - // Clear any existing message timeout and alerts immediately - if (currentMessageTimeout) { - clearTimeout(currentMessageTimeout); - currentMessageTimeout = null; - } - Utils.hideAlert(); // Hide current alert immediately - - // Update overlay position if available - if (overlayManager) { - overlayManager.setPosition(state.startPosition, state.region) - .then(() => { - console.log('✅ Overlay position updated'); - Utils.showAlert(`Moved to position (${newX}, ${newY})`, 'success'); - // Set new timeout for this message - currentMessageTimeout = setTimeout(() => { - Utils.hideAlert(); - currentMessageTimeout = null; - }, 1500); // Message disappears after 1.5 seconds - }) - .catch(err => { - console.error('❌ Failed to update overlay:', err); - Utils.showAlert('Failed to update overlay position', 'error'); - }); - } else { - Utils.showAlert(`Position updated to (${newX}, ${newY})`, 'success'); - // Set new timeout for this message - currentMessageTimeout = setTimeout(() => { - Utils.hideAlert(); - currentMessageTimeout = null; - }, 1500); - } - } else { - Utils.showAlert('Please select a position first before moving artwork', 'warning'); - } - } - - document.getElementById('moveUp').addEventListener('click', () => moveArtwork(0, -1)); - document.getElementById('moveDown').addEventListener('click', () => moveArtwork(0, 1)); - document.getElementById('moveLeft').addEventListener('click', () => moveArtwork(-1, 0)); - document.getElementById('moveRight').addEventListener('click', () => moveArtwork(1, 0)); - - // Close panel - function closeMovePanel() { - if (currentMessageTimeout) { - clearTimeout(currentMessageTimeout); - currentMessageTimeout = null; - } - Utils.hideAlert(); - document.body.removeChild(movePanel); - } - - document.getElementById('closeMovePanel').addEventListener('click', closeMovePanel); - } - - function showResizeDialog(processor) { - let baseProcessor = processor; - let width, height; - if (state.originalImage?.dataUrl) { - baseProcessor = new ImageProcessor(state.originalImage.dataUrl); - width = state.originalImage.width; - height = state.originalImage.height; - } else { - const dims = processor.getDimensions(); - width = dims.width; - height = dims.height; - } - const aspectRatio = width / height; - - const rs = state.resizeSettings; - widthSlider.max = width * 2; - heightSlider.max = height * 2; - let initialW = width; - let initialH = height; - if ( - rs && - Number.isFinite(rs.width) && - Number.isFinite(rs.height) && - rs.width > 0 && - rs.height > 0 - ) { - initialW = rs.width; - initialH = rs.height; - } - // Clamp to slider ranges - initialW = Math.max( - parseInt(widthSlider.min, 10) || 10, - Math.min(initialW, parseInt(widthSlider.max, 10)) - ); - initialH = Math.max( - parseInt(heightSlider.min, 10) || 10, - Math.min(initialH, parseInt(heightSlider.max, 10)) - ); - widthSlider.value = initialW; - heightSlider.value = initialH; - widthValue.textContent = initialW; - heightValue.textContent = initialH; - zoomSlider.value = 1; - if (zoomValue) zoomValue.textContent = '100%'; - paintWhiteToggle.checked = state.paintWhitePixels; - paintTransparentToggle.checked = state.paintTransparentPixels; - - let _previewTimer = null; - let _previewJobId = 0; - let _isDraggingSize = false; - let _zoomLevel = 1; - let _ditherWorkBuf = null; - let _ditherEligibleBuf = null; - const ensureDitherBuffers = (n) => { - if (!_ditherWorkBuf || _ditherWorkBuf.length !== n * 3) - _ditherWorkBuf = new Float32Array(n * 3); - if (!_ditherEligibleBuf || _ditherEligibleBuf.length !== n) - _ditherEligibleBuf = new Uint8Array(n); - return { work: _ditherWorkBuf, eligible: _ditherEligibleBuf }; - }; - let _maskImageData = null; - let _maskData = null; - let _dirty = null; - const _resetDirty = () => { - _dirty = { minX: Infinity, minY: Infinity, maxX: -1, maxY: -1 }; - }; - const _markDirty = (x, y) => { - if (!_dirty) _resetDirty(); - if (x < _dirty.minX) _dirty.minX = x; - if (y < _dirty.minY) _dirty.minY = y; - if (x > _dirty.maxX) _dirty.maxX = x; - if (y > _dirty.maxY) _dirty.maxY = y; - }; - const _flushDirty = () => { - if (!_dirty || _dirty.maxX < _dirty.minX || _dirty.maxY < _dirty.minY) return; - const x = Math.max(0, _dirty.minX); - const y = Math.max(0, _dirty.minY); - const w = Math.min(maskCanvas.width - x, _dirty.maxX - x + 1); - const h = Math.min(maskCanvas.height - y, _dirty.maxY - y + 1); - if (w > 0 && h > 0) maskCtx.putImageData(_maskImageData, 0, 0, x, y, w, h); - _resetDirty(); - }; - const _ensureMaskOverlayBuffers = (w, h, rebuildFromMask = false) => { - if (!_maskImageData || _maskImageData.width !== w || _maskImageData.height !== h) { - _maskImageData = maskCtx.createImageData(w, h); - _maskData = _maskImageData.data; - rebuildFromMask = true; - } - if (rebuildFromMask) { - const m = state.resizeIgnoreMask; - const md = _maskData; - md.fill(0); - if (m) { - for (let i = 0; i < m.length; i++) - if (m[i]) { - const p = i * 4; - md[p] = 255; - md[p + 1] = 0; - md[p + 2] = 0; - md[p + 3] = 150; - } - } - maskCtx.putImageData(_maskImageData, 0, 0); - _resetDirty(); - } - }; - const ensureMaskSize = (w, h) => { - if (!state.resizeIgnoreMask || state.resizeIgnoreMask.length !== w * h) { - state.resizeIgnoreMask = new Uint8Array(w * h); - } - baseCanvas.width = w; - baseCanvas.height = h; - maskCanvas.width = w; - maskCanvas.height = h; - maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); - // Ensure overlay buffers exist and rebuild from mask when dimensions change - _ensureMaskOverlayBuffers(w, h, true); - }; - _updateResizePreview = async () => { - const jobId = ++_previewJobId; - const newWidth = parseInt(widthSlider.value, 10); - const newHeight = parseInt(heightSlider.value, 10); - _zoomLevel = parseFloat(zoomSlider.value); - - widthValue.textContent = newWidth; - heightValue.textContent = newHeight; - - ensureMaskSize(newWidth, newHeight); - canvasStack.style.width = newWidth + 'px'; - canvasStack.style.height = newHeight + 'px'; - baseCtx.imageSmoothingEnabled = false; - - if (!state.availableColors || state.availableColors.length === 0) { - if (baseProcessor !== processor && (!baseProcessor.img || !baseProcessor.canvas)) { - await baseProcessor.load(); - } - baseCtx.clearRect(0, 0, newWidth, newHeight); - baseCtx.drawImage(baseProcessor.img, 0, 0, newWidth, newHeight); - // Draw existing mask overlay buffer - maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); - if (_maskImageData) maskCtx.putImageData(_maskImageData, 0, 0); - updateZoomLayout(); - return; - } - - if (baseProcessor !== processor && (!baseProcessor.img || !baseProcessor.canvas)) { - await baseProcessor.load(); - } - baseCtx.clearRect(0, 0, newWidth, newHeight); - baseCtx.drawImage(baseProcessor.img, 0, 0, newWidth, newHeight); - const imgData = baseCtx.getImageData(0, 0, newWidth, newHeight); - const data = imgData.data; - - const tThresh = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; - - const applyFSDither = () => { - const w = newWidth, - h = newHeight; - const n = w * h; - const { work, eligible } = ensureDitherBuffers(n); - for (let y = 0; y < h; y++) { - for (let x = 0; x < w; x++) { - const idx = y * w + x; - const i4 = idx * 4; - const r = data[i4], - g = data[i4 + 1], - b = data[i4 + 2], - a = data[i4 + 3]; - const isEligible = - (state.paintTransparentPixels || a >= tThresh) && - (state.paintWhitePixels || !Utils.isWhitePixel(r, g, b)); - eligible[idx] = isEligible ? 1 : 0; - work[idx * 3] = r; - work[idx * 3 + 1] = g; - work[idx * 3 + 2] = b; - if (!isEligible) { - data[i4 + 3] = 0; // transparent in preview overlay - } - } - } - - const diffuse = (nx, ny, er, eg, eb, factor) => { - if (nx < 0 || nx >= w || ny < 0 || ny >= h) return; - const nidx = ny * w + nx; - if (!eligible[nidx]) return; - const base = nidx * 3; - work[base] = Math.min(255, Math.max(0, work[base] + er * factor)); - work[base + 1] = Math.min(255, Math.max(0, work[base + 1] + eg * factor)); - work[base + 2] = Math.min(255, Math.max(0, work[base + 2] + eb * factor)); - }; - - for (let y = 0; y < h; y++) { - for (let x = 0; x < w; x++) { - const idx = y * w + x; - if (!eligible[idx]) continue; - const base = idx * 3; - const r0 = work[base], - g0 = work[base + 1], - b0 = work[base + 2]; - const [nr, ng, nb] = Utils.findClosestPaletteColor( - r0, - g0, - b0, - state.activeColorPalette - ); - const i4 = idx * 4; - data[i4] = nr; - data[i4 + 1] = ng; - data[i4 + 2] = nb; - data[i4 + 3] = 255; - - const er = r0 - nr; - const eg = g0 - ng; - const eb = b0 - nb; - - diffuse(x + 1, y, er, eg, eb, 7 / 16); - diffuse(x - 1, y + 1, er, eg, eb, 3 / 16); - diffuse(x, y + 1, er, eg, eb, 5 / 16); - diffuse(x + 1, y + 1, er, eg, eb, 1 / 16); - } - } - }; - - // Skip expensive dithering while user is dragging sliders - console.log(`🎨 Preview render - ditheringEnabled: ${state.ditheringEnabled}, _isDraggingSize: ${_isDraggingSize}`); - if (state.ditheringEnabled && !_isDraggingSize) { - console.log('✅ Applying dithering to preview'); - applyFSDither(); - } else { - console.log('⛔ Skipping dithering - applying direct color conversion'); - for (let i = 0; i < data.length; i += 4) { - const r = data[i], - g = data[i + 1], - b = data[i + 2], - a = data[i + 3]; - if ( - (!state.paintTransparentPixels && a < tThresh) || - (!state.paintWhitePixels && Utils.isWhitePixel(r, g, b)) - ) { - data[i + 3] = 0; - continue; - } - const [nr, ng, nb] = Utils.findClosestPaletteColor(r, g, b, state.activeColorPalette); - data[i] = nr; - data[i + 1] = ng; - data[i + 2] = nb; - data[i + 3] = 255; - } - } - - if (jobId !== _previewJobId) return; - baseCtx.putImageData(imgData, 0, 0); - maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); - if (_maskImageData) maskCtx.putImageData(_maskImageData, 0, 0); - updateZoomLayout(); - }; - - const onWidthInput = () => { - if (keepAspect.checked) { - heightSlider.value = Math.round(parseInt(widthSlider.value, 10) / aspectRatio); - } - _updateResizePreview(); - const curW = parseInt(widthSlider.value, 10); - const curH = parseInt(heightSlider.value, 10); - state.resizeSettings = { - baseWidth: width, - baseHeight: height, - width: curW, - height: curH, - }; - saveBotSettings(); - // Auto-fit after size changes - const fit = typeof computeFitZoom === 'function' ? computeFitZoom() : 1; - if (!isNaN(fit) && isFinite(fit)) applyZoom(fit); - }; - - const onHeightInput = () => { - if (keepAspect.checked) { - widthSlider.value = Math.round(parseInt(heightSlider.value, 10) * aspectRatio); - } - _updateResizePreview(); - const curW = parseInt(widthSlider.value, 10); - const curH = parseInt(heightSlider.value, 10); - state.resizeSettings = { - baseWidth: width, - baseHeight: height, - width: curW, - height: curH, - }; - saveBotSettings(); - // Auto-fit after size changes - const fit = typeof computeFitZoom === 'function' ? computeFitZoom() : 1; - if (!isNaN(fit) && isFinite(fit)) applyZoom(fit); - }; - - paintWhiteToggle.onchange = (e) => { - state.paintWhitePixels = e.target.checked; - _updateResizePreview(); - saveBotSettings(); - }; - - paintTransparentToggle.onchange = (e) => { - state.paintTransparentPixels = e.target.checked; - _updateResizePreview(); - saveBotSettings(); - }; - - let panX = 0, - panY = 0; - const clampPan = () => { - const wrapRect = panStage?.getBoundingClientRect() || { - width: 0, - height: 0, - }; - const w = (baseCanvas.width || 1) * _zoomLevel; - const h = (baseCanvas.height || 1) * _zoomLevel; - if (w <= wrapRect.width) { - panX = Math.floor((wrapRect.width - w) / 2); - } else { - const minX = wrapRect.width - w; - panX = Math.min(0, Math.max(minX, panX)); - } - if (h <= wrapRect.height) { - panY = Math.floor((wrapRect.height - h) / 2); - } else { - const minY = wrapRect.height - h; - panY = Math.min(0, Math.max(minY, panY)); - } - }; - let _panRaf = 0; - const applyPan = () => { - if (_panRaf) return; - _panRaf = requestAnimationFrame(() => { - clampPan(); - canvasStack.style.transform = `translate3d(${Math.round( - panX - )}px, ${Math.round(panY)}px, 0) scale(${_zoomLevel})`; - _panRaf = 0; - }); - }; - - const updateZoomLayout = () => { - const w = baseCanvas.width || 1, - h = baseCanvas.height || 1; - baseCanvas.style.width = w + 'px'; - baseCanvas.style.height = h + 'px'; - maskCanvas.style.width = w + 'px'; - maskCanvas.style.height = h + 'px'; - canvasStack.style.width = w + 'px'; - canvasStack.style.height = h + 'px'; - applyPan(); - }; - const applyZoom = (z) => { - _zoomLevel = Math.max(0.05, Math.min(20, z || 1)); - zoomSlider.value = _zoomLevel; - updateZoomLayout(); - if (zoomValue) zoomValue.textContent = `${Math.round(_zoomLevel * 100)}%`; - }; - zoomSlider.addEventListener('input', () => { - applyZoom(parseFloat(zoomSlider.value)); - }); - if (zoomInBtn) - zoomInBtn.addEventListener('click', () => applyZoom(parseFloat(zoomSlider.value) + 0.1)); - if (zoomOutBtn) - zoomOutBtn.addEventListener('click', () => applyZoom(parseFloat(zoomSlider.value) - 0.1)); - const computeFitZoom = () => { - const wrapRect = panStage?.getBoundingClientRect(); - if (!wrapRect) return 1; - const w = baseCanvas.width || 1; - const h = baseCanvas.height || 1; - const margin = 10; - const scaleX = (wrapRect.width - margin) / w; - const scaleY = (wrapRect.height - margin) / h; - return Math.max(0.05, Math.min(20, Math.min(scaleX, scaleY))); - }; - if (zoomFitBtn) - zoomFitBtn.addEventListener('click', () => { - applyZoom(computeFitZoom()); - centerInView(); - }); - if (zoomActualBtn) - zoomActualBtn.addEventListener('click', () => { - applyZoom(1); - centerInView(); - }); - - const centerInView = () => { - if (!panStage) return; - const rect = panStage.getBoundingClientRect(); - const w = (baseCanvas.width || 1) * _zoomLevel; - const h = (baseCanvas.height || 1) * _zoomLevel; - panX = Math.floor((rect.width - w) / 2); - panY = Math.floor((rect.height - h) / 2); - applyPan(); - }; - - let isPanning = false; - let startX = 0, - startY = 0, - startPanX = 0, - startPanY = 0; - let allowPan = false; // Space key - let panMode = false; // Explicit pan mode toggle for touch/one-button mice - const isPanMouseButton = (e) => e.button === 1 || e.button === 2; - const setCursor = (val) => { - if (panStage) panStage.style.cursor = val; - }; - const isPanActive = (e) => panMode || allowPan || isPanMouseButton(e); - const updatePanModeBtn = () => { - if (!panModeBtn) return; - panModeBtn.classList.toggle('active', panMode); - panModeBtn.setAttribute('aria-pressed', panMode ? 'true' : 'false'); - }; - if (panModeBtn) { - updatePanModeBtn(); - panModeBtn.addEventListener('click', () => { - panMode = !panMode; - updatePanModeBtn(); - setCursor(panMode ? 'grab' : ''); - }); - } - if (panStage) { - panStage.addEventListener('contextmenu', (e) => { - if (allowPan) e.preventDefault(); - }); - window.addEventListener('keydown', (e) => { - if (e.code === 'Space') { - allowPan = true; - setCursor('grab'); - } - }); - window.addEventListener('keyup', (e) => { - if (e.code === 'Space') { - allowPan = false; - if (!isPanning) setCursor(''); - } - }); - panStage.addEventListener('mousedown', (e) => { - if (!isPanActive(e)) return; - e.preventDefault(); - isPanning = true; - startX = e.clientX; - startY = e.clientY; - startPanX = panX; - startPanY = panY; - setCursor('grabbing'); - }); - window.addEventListener('mousemove', (e) => { - if (!isPanning) return; - const dx = e.clientX - startX; - const dy = e.clientY - startY; - panX = startPanX + dx; - panY = startPanY + dy; - applyPan(); - }); - window.addEventListener('mouseup', () => { - if (isPanning) { - isPanning = false; - setCursor(allowPan ? 'grab' : ''); - } - }); - panStage.addEventListener( - 'wheel', - (e) => { - if (!e.ctrlKey && !e.metaKey) return; - e.preventDefault(); - const rect = panStage.getBoundingClientRect(); - const cx = e.clientX - rect.left - panX; - const cy = e.clientY - rect.top - panY; - const before = _zoomLevel; - const step = Math.max(0.05, Math.min(0.5, Math.abs(e.deltaY) > 20 ? 0.2 : 0.1)); - const next = Math.max(0.05, Math.min(20, before + (e.deltaY > 0 ? -step : step))); - if (next === before) return; - const scale = next / before; - panX = panX - cx * (scale - 1); - panY = panY - cy * (scale - 1); - applyZoom(next); - }, - { passive: false } - ); - let lastTouchDist = null; - let touchStartTime = 0; - let doubleTapTimer = null; - panStage.addEventListener( - 'touchstart', - (e) => { - if (e.touches.length === 1) { - const t = e.touches[0]; - isPanning = true; - startX = t.clientX; - startY = t.clientY; - startPanX = panX; - startPanY = panY; - setCursor('grabbing'); - const now = Date.now(); - if (now - touchStartTime < 300) { - // double tap -> toggle 100%/fit - const z = Math.abs(_zoomLevel - 1) < 0.01 ? computeFitZoom() : 1; - applyZoom(z); - centerInView(); - if (doubleTapTimer) clearTimeout(doubleTapTimer); - } else { - touchStartTime = now; - doubleTapTimer = setTimeout(() => { - doubleTapTimer = null; - }, 320); - } - } else if (e.touches.length === 2) { - // Pinch start - const [a, b] = e.touches; - lastTouchDist = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY); - } - }, - { passive: true } - ); - panStage.addEventListener( - 'touchmove', - (e) => { - if (e.touches.length === 1 && isPanning) { - const t = e.touches[0]; - const dx = t.clientX - startX; - const dy = t.clientY - startY; - panX = startPanX + dx; - panY = startPanY + dy; - applyPan(); - } else if (e.touches.length === 2 && lastTouchDist != null) { - e.preventDefault(); - const [a, b] = e.touches; - const dist = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY); - const rect = panStage.getBoundingClientRect(); - const centerX = (a.clientX + b.clientX) / 2 - rect.left - panX; - const centerY = (a.clientY + b.clientY) / 2 - rect.top - panY; - const before = _zoomLevel; - const scale = dist / (lastTouchDist || dist); - const next = Math.max(0.05, Math.min(20, before * scale)); - if (next !== before) { - panX = panX - centerX * (next / before - 1); - panY = panY - centerY * (next / before - 1); - applyZoom(next); - } - lastTouchDist = dist; - } - }, - { passive: false } - ); - panStage.addEventListener('touchend', () => { - isPanning = false; - lastTouchDist = null; - setCursor(panMode || allowPan ? 'grab' : ''); - }); - } - const schedulePreview = () => { - if (_previewTimer) clearTimeout(_previewTimer); - const run = () => { - _previewTimer = null; - _updateResizePreview(); - }; - if (window.requestIdleCallback) { - _previewTimer = setTimeout(() => requestIdleCallback(run, { timeout: 150 }), 50); - } else { - _previewTimer = setTimeout(() => requestAnimationFrame(run), 50); - } - }; - // Track dragging to reduce work and skip dithering during drag - const markDragStart = () => { - _isDraggingSize = true; - }; - const markDragEnd = () => { - _isDraggingSize = false; - schedulePreview(); - }; - widthSlider.addEventListener('pointerdown', markDragStart); - heightSlider.addEventListener('pointerdown', markDragStart); - widthSlider.addEventListener('pointerup', markDragEnd); - heightSlider.addEventListener('pointerup', markDragEnd); - widthSlider.addEventListener('input', () => { - onWidthInput(); - schedulePreview(); - }); - heightSlider.addEventListener('input', () => { - onHeightInput(); - schedulePreview(); - }); - - // Mask painting UX: brush size, modes, row/column fills, and precise coords - let draggingMask = false; - let lastPaintX = -1, - lastPaintY = -1; - let brushSize = 1; - let rowColSize = 1; - let maskMode = 'ignore'; // 'ignore' | 'unignore' | 'toggle' - const brushEl = resizeContainer.querySelector('#maskBrushSize'); - const brushValEl = resizeContainer.querySelector('#maskBrushSizeValue'); - const btnIgnore = resizeContainer.querySelector('#maskModeIgnore'); - const btnUnignore = resizeContainer.querySelector('#maskModeUnignore'); - const btnToggle = resizeContainer.querySelector('#maskModeToggle'); - const clearIgnoredBtnEl = resizeContainer.querySelector('#clearIgnoredBtn'); - const invertMaskBtn = resizeContainer.querySelector('#invertMaskBtn'); - const rowColSizeEl = resizeContainer.querySelector('#rowColSize'); - const rowColSizeValEl = resizeContainer.querySelector('#rowColSizeValue'); - - const updateModeButtons = () => { - const map = [ - [btnIgnore, 'ignore'], - [btnUnignore, 'unignore'], - [btnToggle, 'toggle'], - ]; - for (const [el, m] of map) { - if (!el) continue; - const active = maskMode === m; - el.classList.toggle('active', active); - el.setAttribute('aria-pressed', active ? 'true' : 'false'); - } - }; - const setMode = (mode) => { - maskMode = mode; - updateModeButtons(); - }; - if (brushEl && brushValEl) { - brushEl.addEventListener('input', () => { - brushSize = parseInt(brushEl.value, 10) || 1; - brushValEl.textContent = brushSize; - }); - brushValEl.textContent = brushEl.value; - brushSize = parseInt(brushEl.value, 10) || 1; - } - if (rowColSizeEl && rowColSizeValEl) { - rowColSizeEl.addEventListener('input', () => { - rowColSize = parseInt(rowColSizeEl.value, 10) || 1; - rowColSizeValEl.textContent = rowColSize; - }); - rowColSizeValEl.textContent = rowColSizeEl.value; - rowColSize = parseInt(rowColSizeEl.value, 10) || 1; - } - if (btnIgnore) btnIgnore.addEventListener('click', () => setMode('ignore')); - if (btnUnignore) btnUnignore.addEventListener('click', () => setMode('unignore')); - if (btnToggle) btnToggle.addEventListener('click', () => setMode('toggle')); - // Initialize button state (default to toggle mode) - updateModeButtons(); - - const mapClientToPixel = (clientX, clientY) => { - // Compute without rounding until final step to avoid drift at higher zoom - const rect = baseCanvas.getBoundingClientRect(); - const scaleX = rect.width / baseCanvas.width; - const scaleY = rect.height / baseCanvas.height; - const dx = (clientX - rect.left) / scaleX; - const dy = (clientY - rect.top) / scaleY; - const x = Math.floor(dx); - const y = Math.floor(dy); - return { x, y }; - }; - - const ensureMask = (w, h) => { - if (!state.resizeIgnoreMask || state.resizeIgnoreMask.length !== w * h) { - state.resizeIgnoreMask = new Uint8Array(w * h); - } - }; - - const paintCircle = (cx, cy, radius, value) => { - const w = baseCanvas.width, - h = baseCanvas.height; - ensureMask(w, h); - const r2 = radius * radius; - for (let yy = cy - radius; yy <= cy + radius; yy++) { - if (yy < 0 || yy >= h) continue; - for (let xx = cx - radius; xx <= cx + radius; xx++) { - if (xx < 0 || xx >= w) continue; - const dx = xx - cx, - dy = yy - cy; - if (dx * dx + dy * dy <= r2) { - const idx = yy * w + xx; - let val = state.resizeIgnoreMask[idx]; - if (maskMode === 'toggle') { - val = val ? 0 : 1; - } else if (maskMode === 'ignore') { - val = 1; - } else { - val = 0; - } - state.resizeIgnoreMask[idx] = val; - if (_maskData) { - const p = idx * 4; - if (val) { - _maskData[p] = 255; - _maskData[p + 1] = 0; - _maskData[p + 2] = 0; - _maskData[p + 3] = 150; - } else { - _maskData[p] = 0; - _maskData[p + 1] = 0; - _maskData[p + 2] = 0; - _maskData[p + 3] = 0; - } - _markDirty(xx, yy); - } - } - } - } - }; - - const paintRow = (y, value) => { - const w = baseCanvas.width, - h = baseCanvas.height; - ensureMask(w, h); - if (y < 0 || y >= h) return; - - // Paint multiple rows based on rowColSize - const halfSize = Math.floor(rowColSize / 2); - const startY = Math.max(0, y - halfSize); - const endY = Math.min(h - 1, y + halfSize); - - for (let rowY = startY; rowY <= endY; rowY++) { - for (let x = 0; x < w; x++) { - const idx = rowY * w + x; - let val = state.resizeIgnoreMask[idx]; - if (maskMode === 'toggle') { - val = val ? 0 : 1; - } else if (maskMode === 'ignore') { - val = 1; - } else { - val = 0; - } - state.resizeIgnoreMask[idx] = val; - if (_maskData) { - const p = idx * 4; - if (val) { - _maskData[p] = 255; - _maskData[p + 1] = 0; - _maskData[p + 2] = 0; - _maskData[p + 3] = 150; - } else { - _maskData[p] = 0; - _maskData[p + 1] = 0; - _maskData[p + 2] = 0; - _maskData[p + 3] = 0; - } - } - } - if (_maskData) { - _markDirty(0, rowY); - _markDirty(w - 1, rowY); - } - } - }; - - const paintColumn = (x, value) => { - const w = baseCanvas.width, - h = baseCanvas.height; - ensureMask(w, h); - if (x < 0 || x >= w) return; - - // Paint multiple columns based on rowColSize - const halfSize = Math.floor(rowColSize / 2); - const startX = Math.max(0, x - halfSize); - const endX = Math.min(w - 1, x + halfSize); - - for (let colX = startX; colX <= endX; colX++) { - for (let y = 0; y < h; y++) { - const idx = y * w + colX; - let val = state.resizeIgnoreMask[idx]; - if (maskMode === 'toggle') { - val = val ? 0 : 1; - } else if (maskMode === 'ignore') { - val = 1; - } else { - val = 0; - } - state.resizeIgnoreMask[idx] = val; - if (_maskData) { - const p = idx * 4; - if (val) { - _maskData[p] = 255; - _maskData[p + 1] = 0; - _maskData[p + 2] = 0; - _maskData[p + 3] = 150; - } else { - _maskData[p] = 0; - _maskData[p + 1] = 0; - _maskData[p + 2] = 0; - _maskData[p + 3] = 0; - } - } - } - if (_maskData) { - _markDirty(colX, 0); - _markDirty(colX, h - 1); - } - } - }; - - const redrawMaskOverlay = () => { - // Only flush the dirty region; full rebuild happens on size change - _flushDirty(); - }; - - const handlePaint = (e) => { - // Suppress painting while panning - if ((e.buttons & 4) === 4 || (e.buttons & 2) === 2 || allowPan) return; - const { x, y } = mapClientToPixel(e.clientX, e.clientY); - const w = baseCanvas.width, - h = baseCanvas.height; - if (x < 0 || y < 0 || x >= w || y >= h) return; - const radius = Math.max(1, Math.floor(brushSize / 2)); - if (e.shiftKey) { - paintRow(y); - } else if (e.altKey) { - paintColumn(x); - } else { - paintCircle(x, y, radius); - } - lastPaintX = x; - lastPaintY = y; - redrawMaskOverlay(); - }; - - maskCanvas.addEventListener('mousedown', (e) => { - if (e.button === 1 || e.button === 2 || allowPan) return; // let pan handler manage - draggingMask = true; - handlePaint(e); - }); - // Avoid hijacking touch gestures for panning/zooming - maskCanvas.addEventListener( - 'touchstart', - (e) => { - /* let panStage handle */ - }, - { passive: true } - ); - maskCanvas.addEventListener( - 'touchmove', - (e) => { - /* let panStage handle */ - }, - { passive: true } - ); - maskCanvas.addEventListener( - 'touchend', - (e) => { - /* let panStage handle */ - }, - { passive: true } - ); - window.addEventListener('mousemove', (e) => { - if (draggingMask) handlePaint(e); - }); - window.addEventListener('mouseup', () => { - if (draggingMask) { - draggingMask = false; - saveBotSettings(); - } - }); - - if (clearIgnoredBtnEl) - clearIgnoredBtnEl.addEventListener('click', () => { - const w = baseCanvas.width, - h = baseCanvas.height; - if (state.resizeIgnoreMask) state.resizeIgnoreMask.fill(0); - _ensureMaskOverlayBuffers(w, h, true); - _updateResizePreview(); - saveBotSettings(); - }); - - if (invertMaskBtn) - invertMaskBtn.addEventListener('click', () => { - if (!state.resizeIgnoreMask) return; - for (let i = 0; i < state.resizeIgnoreMask.length; i++) - state.resizeIgnoreMask[i] = state.resizeIgnoreMask[i] ? 0 : 1; - const w = baseCanvas.width, - h = baseCanvas.height; - _ensureMaskOverlayBuffers(w, h, true); - _updateResizePreview(); - saveBotSettings(); - }); - - confirmResize.onclick = async () => { - const newWidth = parseInt(widthSlider.value, 10); - const newHeight = parseInt(heightSlider.value, 10); - - // Generate the final paletted image data - const tempCanvas = document.createElement('canvas'); - const tempCtx = tempCanvas.getContext('2d'); - tempCanvas.width = newWidth; - tempCanvas.height = newHeight; - tempCtx.imageSmoothingEnabled = false; - if (baseProcessor !== processor && (!baseProcessor.img || !baseProcessor.canvas)) { - await baseProcessor.load(); - } - tempCtx.drawImage(baseProcessor.img, 0, 0, newWidth, newHeight); - const imgData = tempCtx.getImageData(0, 0, newWidth, newHeight); - const data = imgData.data; - const tThresh2 = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; - let totalValidPixels = 0; - const mask = - state.resizeIgnoreMask && state.resizeIgnoreMask.length === newWidth * newHeight - ? state.resizeIgnoreMask - : null; - - const applyFSDitherFinal = async () => { - const w = newWidth, - h = newHeight; - const n = w * h; - const { work, eligible } = ensureDitherBuffers(n); - for (let y = 0; y < h; y++) { - for (let x = 0; x < w; x++) { - const idx = y * w + x; - const i4 = idx * 4; - const r = data[i4], - g = data[i4 + 1], - b = data[i4 + 2], - a = data[i4 + 3]; - const masked = mask && mask[idx]; - const isEligible = - !masked && - (state.paintTransparentPixels || a >= tThresh2) && - (state.paintWhitePixels || !Utils.isWhitePixel(r, g, b)); - eligible[idx] = isEligible ? 1 : 0; - work[idx * 3] = r; - work[idx * 3 + 1] = g; - work[idx * 3 + 2] = b; - if (!isEligible) { - data[i4 + 3] = 0; - } - } - // Yield to keep UI responsive - if ((y & 15) === 0) await Promise.resolve(); - } - - const diffuse = (nx, ny, er, eg, eb, factor) => { - if (nx < 0 || nx >= w || ny < 0 || ny >= h) return; - const nidx = ny * w + nx; - if (!eligible[nidx]) return; - const base = nidx * 3; - work[base] = Math.min(255, Math.max(0, work[base] + er * factor)); - work[base + 1] = Math.min(255, Math.max(0, work[base + 1] + eg * factor)); - work[base + 2] = Math.min(255, Math.max(0, work[base + 2] + eb * factor)); - }; - - for (let y = 0; y < h; y++) { - for (let x = 0; x < w; x++) { - const idx = y * w + x; - if (!eligible[idx]) continue; - const base = idx * 3; - const r0 = work[base], - g0 = work[base + 1], - b0 = work[base + 2]; - const [nr, ng, nb] = Utils.findClosestPaletteColor( - r0, - g0, - b0, - state.activeColorPalette - ); - const i4 = idx * 4; - data[i4] = nr; - data[i4 + 1] = ng; - data[i4 + 2] = nb; - data[i4 + 3] = 255; - totalValidPixels++; - - const er = r0 - nr; - const eg = g0 - ng; - const eb = b0 - nb; - - diffuse(x + 1, y, er, eg, eb, 7 / 16); - diffuse(x - 1, y + 1, er, eg, eb, 3 / 16); - diffuse(x, y + 1, er, eg, eb, 5 / 16); - diffuse(x + 1, y + 1, er, eg, eb, 1 / 16); - } - // Yield every row to reduce jank - await Promise.resolve(); - } - }; - - if (state.ditheringEnabled) { - await applyFSDitherFinal(); - } else { - for (let i = 0; i < data.length; i += 4) { - const r = data[i], - g = data[i + 1], - b = data[i + 2], - a = data[i + 3]; - const masked = mask && mask[i >> 2]; - const isTransparent = (!state.paintTransparentPixels && a < tThresh2) || masked; - const isWhiteAndSkipped = !state.paintWhitePixels && Utils.isWhitePixel(r, g, b); - if (isTransparent || isWhiteAndSkipped) { - data[i + 3] = 0; // overlay transparency - continue; - } - totalValidPixels++; - const [nr, ng, nb] = Utils.findClosestPaletteColor(r, g, b, state.activeColorPalette); - data[i] = nr; - data[i + 1] = ng; - data[i + 2] = nb; - data[i + 3] = 255; - } - } - tempCtx.putImageData(imgData, 0, 0); - - // Save the final pixel data for painting - // Persist the paletted (and possibly dithered) pixels so painting uses the same output seen in overlay - const palettedPixels = new Uint8ClampedArray(imgData.data); - state.imageData.pixels = palettedPixels; - state.imageData.width = newWidth; - state.imageData.height = newHeight; - state.imageData.totalPixels = totalValidPixels; - state.totalPixels = totalValidPixels; - state.paintedPixels = 0; - - state.resizeSettings = { - baseWidth: width, - baseHeight: height, - width: newWidth, - height: newHeight, - }; - saveBotSettings(); - - const finalImageBitmap = await createImageBitmap(tempCanvas); - await overlayManager.setImage(finalImageBitmap); - overlayManager.enable(); - toggleOverlayBtn.classList.add('active'); - toggleOverlayBtn.setAttribute('aria-pressed', 'true'); - - // Keep state.imageData.processor as the original-based source; painting uses paletted pixels already stored - - await updateStats(); - updateUI('resizeSuccess', 'success', { - width: newWidth, - height: newHeight, - }); - - // ✅ Mark image as processed and enable position selection - state.imageProcessed = true; - selectPosBtn.disabled = false; - selectPosBtn.title = Utils.t('selectPosition') || 'Select starting position on canvas'; - - // Enable start button if position is already set - if (state.startPosition) { - startBtn.disabled = false; - } - - closeResizeDialog(); - }; - - downloadPreviewBtn.onclick = () => { - try { - const w = baseCanvas.width, - h = baseCanvas.height; - const out = document.createElement('canvas'); - out.width = w; - out.height = h; - const octx = out.getContext('2d'); - octx.imageSmoothingEnabled = false; - octx.drawImage(baseCanvas, 0, 0); - octx.drawImage(maskCanvas, 0, 0); - const link = document.createElement('a'); - link.download = 'wplace-preview.png'; - link.href = out.toDataURL(); - link.click(); - } catch (e) { - console.warn('Failed to download preview:', e); - } - }; - - cancelResize.onclick = closeResizeDialog; - - editImageBtn.onclick = () => { - showEditPanel(); - }; - - resizeOverlay.style.display = 'block'; - resizeContainer.style.display = 'block'; - - // Reinitialize color palette with current available colors - initializeColorPalette(resizeContainer); - - _updateResizePreview(); - _resizeDialogCleanup = () => { - try { - zoomSlider.replaceWith(zoomSlider.cloneNode(true)); - } catch { } - try { - if (zoomInBtn) zoomInBtn.replaceWith(zoomInBtn.cloneNode(true)); - } catch { } - try { - if (zoomOutBtn) zoomOutBtn.replaceWith(zoomOutBtn.cloneNode(true)); - } catch { } - }; - setTimeout(() => { - if (typeof computeFitZoom === 'function') { - const z = computeFitZoom(); - if (!isNaN(z) && isFinite(z)) { - applyZoom(z); - centerInView(); - } - } else { - centerInView(); - } - }, 0); - } - - function closeResizeDialog() { - try { - if (typeof _resizeDialogCleanup === 'function') { - _resizeDialogCleanup(); - } - } catch { } - resizeOverlay.style.display = 'none'; - resizeContainer.style.display = 'none'; - _updateResizePreview = () => { }; - try { - if (typeof cancelAnimationFrame === 'function' && _panRaf) { - cancelAnimationFrame(_panRaf); - } - } catch { } - try { - if (_previewTimer) { - clearTimeout(_previewTimer); - _previewTimer = null; - } - } catch { } - _maskImageData = null; - _maskData = null; - _dirty = null; - _ditherWorkBuf = null; - _ditherEligibleBuf = null; - _resizeDialogCleanup = null; - } - - function showEditPanel() { - try { - // Validate that we have a valid base canvas - if (!baseCanvas || !baseCanvas.width || !baseCanvas.height) { - Utils.showAlert('No image available for editing. Please upload an image first.', 'error'); - return; - } - - // Hide resize panel - resizeContainer.style.display = 'none'; - - // Create edit panel if it doesn't exist - let editOverlay = document.getElementById('editOverlay'); - if (!editOverlay) { - createEditPanel(); - editOverlay = document.getElementById('editOverlay'); - } - - // Get current image data from baseCanvas - const imageData = baseCanvas.toDataURL(); - - // Initialize edit panel with current image - initializeEditPanel(imageData); - - // Show edit panel - editOverlay.style.display = 'block'; - - console.log('✨ Pixel Art Editor opened successfully'); - } catch (error) { - console.error('Error opening pixel art editor:', error); - Utils.showAlert('Failed to open pixel art editor. Please try again.', 'error'); - } - } - - function createEditPanel() { - const editOverlay = document.createElement('div'); - editOverlay.id = 'editOverlay'; - editOverlay.className = 'edit-overlay'; - - editOverlay.innerHTML = ` -
    -
    -
    -

    Manual Pixel Art Editor

    -
    - 🖱️ Left click: Draw | Right click/Ctrl+drag: Pan | Mouse wheel: Zoom -
    -
    -
    -
    - - - - - -
    -
    - - -
    -
    -
    - -
    -
    -
    -
    - - - - - -
    - -
    - - - 1 - -
    - -
    - - - -
    -
    - -
    -
    -
    - -
    -
    -
    Navigator
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    - Position: (0, 0) | Color: #000000 | Zoom: 100% -
    -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    -
    - - `; - - document.body.appendChild(editOverlay); - - // Set up event handlers - setupEditPanelEvents(); - } - - function setupEditPanelEvents() { - const editBackBtn = document.getElementById('editBackBtn'); - const editApplyBtn = document.getElementById('editApplyBtn'); - const paintBrush = document.getElementById('paintBrush'); - const eraseTool = document.getElementById('eraseTool'); - const eyedropperTool = document.getElementById('eyedropperTool'); - const fillTool = document.getElementById('fillTool'); - const brushSize = document.getElementById('brushSize'); - const brushSizeValue = document.getElementById('brushSizeValue'); - const showGrid = document.getElementById('showGrid'); - const undoBtn = document.getElementById('undoBtn'); - const redoBtn = document.getElementById('redoBtn'); - const resetViewBtn = document.getElementById('resetViewBtn'); - const editZoomIn = document.getElementById('editZoomIn'); - const editZoomOut = document.getElementById('editZoomOut'); - const zoomSelect = document.getElementById('zoomSelect'); - const zoomFit = document.getElementById('zoomFit'); - const zoom100 = document.getElementById('zoom100'); - const minimapCanvas = document.getElementById('minimapCanvas'); - - // Back to resize panel - editBackBtn.onclick = () => { - document.getElementById('editOverlay').style.display = 'none'; - resizeContainer.style.display = 'block'; - }; - - // Apply changes - editApplyBtn.onclick = () => { - applyEditChanges(); - document.getElementById('editOverlay').style.display = 'none'; - resizeContainer.style.display = 'block'; - }; - - // Tool selection - paintBrush.onclick = () => { - selectTool('paint'); - }; - - eraseTool.onclick = () => { - selectTool('erase'); - }; - - eyedropperTool.onclick = () => { - selectTool('eyedropper'); - }; - - fillTool.onclick = () => { - selectTool('fill'); - }; - - // Grid toggle - showGrid.onclick = () => { - editState.showGrid = !editState.showGrid; - showGrid.classList.toggle('active', editState.showGrid); - redrawCanvas(); - }; - - // Brush size - brushSize.oninput = () => { - brushSizeValue.textContent = brushSize.value; - updateBrushSize(parseInt(brushSize.value)); - }; - - // Undo/Redo - undoBtn.onclick = () => undoEdit(); - redoBtn.onclick = () => redoEdit(); - - // Reset view - resetViewBtn.onclick = () => resetEditView(); - - // Enhanced zoom controls - editZoomIn.onclick = () => zoomIn(); - editZoomOut.onclick = () => zoomOut(); - - zoomSelect.onchange = () => { - const newZoom = parseFloat(zoomSelect.value); - setZoom(newZoom); - }; - - zoomFit.onclick = () => fitToWindow(); - zoom100.onclick = () => setZoom(1); - - // Minimap navigation - if (minimapCanvas) { - minimapCanvas.onclick = (e) => navigateToMinimapPosition(e); - } - } - - const ZOOM_LEVELS = [0.1, 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6, 8, 12, 16, 24, 32]; - - let editState = { - currentTool: 'paint', - currentColor: '#000000', - currentColorId: null, - brushSize: 1, - zoom: 1, - panX: 0, - panY: 0, - undoStack: [], - redoStack: [], - isDrawing: false, - isPanning: false, - showGrid: false, - - mouseX: 0, - mouseY: 0, - canvasWidth: 0, - canvasHeight: 0, - updatePending: false, - lastPaintPos: null, - touchStart: null, - lastTouchDistance: 0, - lastTouchCenter: { x: 0, y: 0 } - }; - - function calculateOptimalPanelSize(imageWidth, imageHeight) { - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; - - // Reserve minimal space for UI elements for almost fullscreen experience - const uiReserved = { - header: 80, - toolbar: 60, - bottomBar: 120, - padding: 40 - }; - - const maxCanvasWidth = viewportWidth - uiReserved.padding; - const maxCanvasHeight = viewportHeight - uiReserved.header - uiReserved.toolbar - uiReserved.bottomBar - uiReserved.padding; - - // Calculate optimal initial zoom to fit image - const scaleX = maxCanvasWidth / imageWidth; - const scaleY = maxCanvasHeight / imageHeight; - const initialZoom = Math.min(scaleX, scaleY, 1); // Don't zoom in initially - - return { - panelWidth: Math.min(viewportWidth * 0.95, imageWidth * initialZoom + uiReserved.colorPanel + uiReserved.padding), - panelHeight: Math.min(viewportHeight * 0.95, imageHeight * initialZoom + uiReserved.toolbar + uiReserved.statusBar + uiReserved.canvasToolbar + uiReserved.padding), - canvasWidth: Math.min(maxCanvasWidth, imageWidth * initialZoom), - canvasHeight: Math.min(maxCanvasHeight, imageHeight * initialZoom), - initialZoom: Math.max(0.1, initialZoom) - }; - } - - function initializeEditPanel(imageData) { - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - - // Reset edit state - editState.zoom = 1; - editState.panX = 0; - editState.panY = 0; - editState.undoStack = []; - editState.redoStack = []; - editState.currentTool = 'paint'; - editState.brushSize = 1; - editState.showGrid = false; - editState.isPanning = false; - editState.isDrawing = false; - editState.lastPaintPos = null; - - // Set canvas size to match baseCanvas - editCanvas.width = baseCanvas.width; - editCanvas.height = baseCanvas.height; - editState.canvasWidth = editCanvas.width; - editState.canvasHeight = editCanvas.height; - - // Configure canvas context for pixel art - ctx.imageSmoothingEnabled = false; - ctx.webkitImageSmoothingEnabled = false; - ctx.mozImageSmoothingEnabled = false; - ctx.msImageSmoothingEnabled = false; - - // Calculate optimal panel size - const panelSize = calculateOptimalPanelSize(editCanvas.width, editCanvas.height); - const editContainer = document.querySelector('.edit-container'); - if (editContainer) { - editContainer.style.width = panelSize.panelWidth + 'px'; - editContainer.style.height = panelSize.panelHeight + 'px'; - } - - // Setup canvas container - setupCanvasContainer(); - - // Add CSS checkerboard background to the wrapper element (not the canvas) - // This allows users to see transparency without saving it to the template - const canvasWrapper = document.getElementById('editCanvasWrapper'); - if (canvasWrapper) { - canvasWrapper.style.background = ` - repeating-conic-gradient(#f0f0f0 0% 25%, #e0e0e0 0% 50%) - 50% / 16px 16px - `; - } - - // Load image onto canvas - const img = new Image(); - img.onload = () => { - ctx.clearRect(0, 0, editCanvas.width, editCanvas.height); - // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template - ctx.drawImage(img, 0, 0); - - // Always fit artwork to the visible area on start and center - fitToWindow(); - centerCanvas(); - - // Setup minimap - setupMinimap(); - - // Save initial state for undo - saveEditState(); - - // Set up canvas drawing events - setupCanvasDrawing(); - - // Initialize color palette - initializeEditColorPalette(); - - // Setup keyboard shortcuts - setupKeyboardShortcuts(); - - // Setup touch support - setupTouchSupport(); - - // Set initial tool - selectTool('paint'); - - // Update status bar - updateStatusBar(0, 0); - - // Center canvas initially - centerCanvas(); - }; - img.src = imageData; - } - - // mapClientToCanvas function for coordinate mapping - function mapClientToCanvas(clientX, clientY) { - const canvas = document.getElementById('editCanvas'); - const wrapper = document.getElementById('editCanvasWrapper'); - const container = document.getElementById('editCanvasContainer'); - - if (!canvas || !wrapper || !container) return null; - - // Get the actual canvas element bounds (after CSS transform) - const canvasRect = canvas.getBoundingClientRect(); - - // Calculate relative position within the actual canvas bounds - const relativeX = (clientX - canvasRect.left) / canvasRect.width * canvas.width; - const relativeY = (clientY - canvasRect.top) / canvasRect.height * canvas.height; - - // Convert to canvas coordinates - const canvasX = Math.floor(relativeX); - const canvasY = Math.floor(relativeY); - - // Bounds checking - if (canvasX < 0 || canvasX >= canvas.width || canvasY < 0 || canvasY >= canvas.height) { - return null; - } - - return { x: canvasX, y: canvasY }; - } - - function setupCanvasDrawing() { - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - - let isDrawing = false; - let isPanning = false; - let lastX = 0; - let lastY = 0; - let panStartX = 0; - let panStartY = 0; - - const getMousePos = (e) => { - return mapClientToCanvas(e.clientX, e.clientY); - }; - - editCanvas.onmousedown = (e) => { - if (e.button === 2 || e.ctrlKey) { // Right click or Ctrl+click for panning - editState.isPanning = true; - panStartX = e.clientX - editState.panX; - panStartY = e.clientY - editState.panY; - editCanvas.style.cursor = 'move'; - e.preventDefault(); - return; - } - - const pos = getMousePos(e); - if (!pos) return; - - if (editState.currentTool === 'eyedropper') { - handleEyedropper(pos.x, pos.y); - return; - } - - if (editState.currentTool === 'fill') { - floodFill(pos.x, pos.y, editState.currentColor); - saveEditState(); - return; - } - - editState.isDrawing = true; - editState.lastPaintPos = { x: pos.x, y: pos.y }; - lastX = pos.x; - lastY = pos.y; - - paintAtPosition(pos.x, pos.y, true); - }; - - editCanvas.onmousemove = (e) => { - const pos = getMousePos(e); - - if (pos) { - editState.mouseX = pos.x; - editState.mouseY = pos.y; - updateStatusBar(pos.x, pos.y); - } - - if (editState.isPanning) { - editState.panX = e.clientX - panStartX; - editState.panY = e.clientY - panStartY; - constrainPan(); - updateCanvasTransform(); - updateMinimap(); - return; - } - - if (!editState.isDrawing) { - return; - } - - if (pos && editState.lastPaintPos) { - paintAtPosition(pos.x, pos.y, true); - editState.lastPaintPos = { x: pos.x, y: pos.y }; - } - }; - - editCanvas.onmouseup = (e) => { - if (editState.isPanning) { - editState.isPanning = false; - selectTool(editState.currentTool); // Restore cursor - return; - } - - if (editState.isDrawing) { - editState.isDrawing = false; - editState.lastPaintPos = null; - saveEditState(); - } - }; - - editCanvas.onmouseleave = () => { - if (editState.isPanning) { - editState.isPanning = false; - selectTool(editState.currentTool); // Restore cursor - } - - if (editState.isDrawing) { - editState.isDrawing = false; - editState.lastPaintPos = null; - saveEditState(); - } - }; - - // Prevent context menu on right click - editCanvas.oncontextmenu = (e) => { - e.preventDefault(); - return false; - }; - - // Enhanced zoom with mouse wheel (zoom to cursor) - editCanvas.onwheel = (e) => { - e.preventDefault(); - const zoomFactor = e.deltaY < 0 ? 1.2 : 1 / 1.2; - zoomToPoint(editState.zoom * zoomFactor, e.clientX, e.clientY); - }; - } - - function paintAtPosition(x, y, isMouseDown = true) { - if (!isMouseDown || !editState.currentColor) return; - - const canvas = document.getElementById('editCanvas'); - const ctx = canvas.getContext('2d'); - - if (editState.lastPaintPos && editState.currentTool === 'paint') { - // Draw line from last position to current position - drawLine(ctx, editState.lastPaintPos.x, editState.lastPaintPos.y, x, y, editState.currentTool); - } else { - // Single brush stroke - drawBrush(ctx, x, y, editState.currentTool); - } - - editState.lastPaintPos = { x, y }; - - // Update minimap thumbnail - if (!editState.updatePending) { - editState.updatePending = true; - requestAnimationFrame(() => { - setupMinimap(); - editState.updatePending = false; - }); - } - } - - function drawBrush(ctx, x, y, tool) { - const size = editState.brushSize; - const halfSize = Math.floor(size / 2); - - if (tool === 'paint') { - ctx.fillStyle = editState.currentColor; - for (let dx = 0; dx < size; dx++) { - for (let dy = 0; dy < size; dy++) { - // Center the brush at the cursor position - const px = x - halfSize + dx; - const py = y - halfSize + dy; - - if (px >= 0 && px < ctx.canvas.width && py >= 0 && py < ctx.canvas.height) { - ctx.fillRect(px, py, 1, 1); - } - } - } - } else if (tool === 'erase') { - for (let dx = 0; dx < size; dx++) { - for (let dy = 0; dy < size; dy++) { - // Center the brush at the cursor position - const px = x - halfSize + dx; - const py = y - halfSize + dy; - - if (px >= 0 && px < ctx.canvas.width && py >= 0 && py < ctx.canvas.height) { - ctx.clearRect(px, py, 1, 1); - } - } - } - } - } - - function drawPixel(x, y) { - drawBrush(document.getElementById('editCanvas').getContext('2d'), x, y, 'paint'); - } - - function erasePixel(x, y) { - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - - const size = editState.brushSize; - const halfSize = Math.floor(size / 2); - - for (let dx = 0; dx < size; dx++) { - for (let dy = 0; dy < size; dy++) { - // Center the brush at the cursor position (consistent with drawBrush) - const px = x - halfSize + dx; - const py = y - halfSize + dy; - - if (px >= 0 && px < editCanvas.width && py >= 0 && py < editCanvas.height) { - ctx.clearRect(px, py, 1, 1); - } - } - } - } - - function drawLine(ctx, x1, y1, x2, y2, tool) { - // Bresenham's line algorithm with tool support - const dx = Math.abs(x2 - x1); - const dy = Math.abs(y2 - y1); - const sx = x1 < x2 ? 1 : -1; - const sy = y1 < y2 ? 1 : -1; - let err = dx - dy; - - let x = x1; - let y = y1; - - while (true) { - drawBrush(ctx, x, y, tool); - - if (x === x2 && y === y2) break; - - const e2 = 2 * err; - if (e2 > -dy) { - err -= dy; - x += sx; - } - if (e2 < dx) { - err += dx; - y += sy; - } - } - } - - function eraseLine(x1, y1, x2, y2) { - // Same as drawLine but with erase - const dx = Math.abs(x2 - x1); - const dy = Math.abs(y2 - y1); - const sx = x1 < x2 ? 1 : -1; - const sy = y1 < y2 ? 1 : -1; - let err = dx - dy; - - let x = x1; - let y = y1; - - while (true) { - erasePixel(x, y); - - if (x === x2 && y === y2) break; - - const e2 = 2 * err; - if (e2 > -dy) { - err -= dy; - x += sx; - } - if (e2 < dx) { - err += dx; - y += sy; - } - } - } - - function selectTool(tool) { - editState.currentTool = tool; - - document.querySelectorAll('.edit-tool').forEach(btn => { - btn.classList.remove('active'); - }); - - const editCanvas = document.getElementById('editCanvas'); - - switch (tool) { - case 'paint': - document.getElementById('paintBrush').classList.add('active'); - editCanvas.style.cursor = 'crosshair'; - break; - case 'erase': - document.getElementById('eraseTool').classList.add('active'); - editCanvas.style.cursor = 'not-allowed'; - break; - case 'eyedropper': - document.getElementById('eyedropperTool').classList.add('active'); - editCanvas.style.cursor = 'copy'; - break; - case 'fill': - document.getElementById('fillTool').classList.add('active'); - editCanvas.style.cursor = 'pointer'; - break; - } - } - - function updateBrushSize(size) { - editState.brushSize = size; - } - - function initializeEditColorPalette() { - const colorGrid = document.getElementById('editColorGrid'); - const currentColorDisplay = document.getElementById('currentColorDisplay'); - - colorGrid.innerHTML = ''; - - let availableColors = []; - - // Try to get colors from state first - if (state && state.availableColors && state.availableColors.length > 0) { - availableColors = state.availableColors.map(color => ({ - id: color.id, - name: color.name, - rgb: color.rgb, - hex: `#${color.rgb[0].toString(16).padStart(2, '0')}${color.rgb[1].toString(16).padStart(2, '0')}${color.rgb[2].toString(16).padStart(2, '0')}` - })); - } else { - // Fallback to CONFIG.COLOR_MAP - availableColors = Object.values(CONFIG.COLOR_MAP) - .filter(color => color.rgb !== null) - .map(color => ({ - id: color.id, - name: color.name, - rgb: [color.rgb.r, color.rgb.g, color.rgb.b], - hex: `#${color.rgb.r.toString(16).padStart(2, '0')}${color.rgb.g.toString(16).padStart(2, '0')}${color.rgb.b.toString(16).padStart(2, '0')}` - })); - } - - // Fallback to basic colors if nothing available - if (availableColors.length === 0) { - availableColors = [ - { id: 0, name: 'Black', rgb: [0, 0, 0], hex: '#000000' }, - { id: 1, name: 'White', rgb: [255, 255, 255], hex: '#ffffff' }, - { id: 2, name: 'Red', rgb: [255, 0, 0], hex: '#ff0000' }, - { id: 3, name: 'Green', rgb: [0, 255, 0], hex: '#00ff00' }, - { id: 4, name: 'Blue', rgb: [0, 0, 255], hex: '#0000ff' } - ]; - } - - // Update color count - const colorCount = document.getElementById('editColorCount'); - if (colorCount) { - colorCount.textContent = availableColors.length; - } - - availableColors.forEach(color => { - const colorBtn = document.createElement('button'); - colorBtn.className = 'color-btn'; - colorBtn.style.backgroundColor = color.hex; - colorBtn.title = `${color.name} (${color.hex})`; - colorBtn.dataset.colorId = color.id; - colorBtn.dataset.colorHex = color.hex; - - colorBtn.onclick = () => { - editState.currentColor = color.hex; - editState.currentColorId = color.id; - currentColorDisplay.style.backgroundColor = color.hex; - - // Update active color - document.querySelectorAll('.color-btn').forEach(btn => { - btn.classList.remove('selected'); - }); - colorBtn.classList.add('selected'); - - updateStatusBar(editState.mouseX, editState.mouseY); - }; - - colorGrid.appendChild(colorBtn); - }); - - // Set first color as default - if (availableColors.length > 0) { - editState.currentColor = availableColors[0].hex; - editState.currentColorId = availableColors[0].id; - currentColorDisplay.style.backgroundColor = availableColors[0].hex; - colorGrid.firstChild.classList.add('selected'); - } - } - - function saveEditState() { - const editCanvas = document.getElementById('editCanvas'); - const imageData = editCanvas.toDataURL(); - - editState.undoStack.push(imageData); - - // Limit undo stack size - if (editState.undoStack.length > 50) { - editState.undoStack.shift(); - } - - // Clear redo stack when new action is performed - editState.redoStack = []; - - updateUndoRedoButtons(); - } - - function undoEdit() { - if (editState.undoStack.length <= 1) return; - - const currentState = editState.undoStack.pop(); - editState.redoStack.push(currentState); - - const previousState = editState.undoStack[editState.undoStack.length - 1]; - loadEditState(previousState); - - updateUndoRedoButtons(); - } - - function redoEdit() { - if (editState.redoStack.length === 0) return; - - const nextState = editState.redoStack.pop(); - editState.undoStack.push(nextState); - - loadEditState(nextState); - - updateUndoRedoButtons(); - } - - function loadEditState(imageData) { - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - - const img = new Image(); - img.onload = () => { - ctx.clearRect(0, 0, editCanvas.width, editCanvas.height); - // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template - ctx.drawImage(img, 0, 0); - }; - img.src = imageData; - } - - function updateUndoRedoButtons() { - const undoBtn = document.getElementById('undoBtn'); - const redoBtn = document.getElementById('redoBtn'); - - if (undoBtn) { - undoBtn.disabled = editState.undoStack.length <= 1; - } - - if (redoBtn) { - redoBtn.disabled = editState.redoStack.length === 0; - } - } - - function updateCanvasTransform() { - const wrapper = document.getElementById('editCanvasWrapper'); - if (wrapper) { - wrapper.style.transform = `translate(${editState.panX}px, ${editState.panY}px) scale(${editState.zoom})`; - } - - // Update zoom select - const zoomSelect = document.getElementById('zoomSelect'); - if (zoomSelect) { - // If exact value exists, use it, otherwise show nearest but update displayed text - const exact = ZOOM_LEVELS.find(z => z === editState.zoom); - zoomSelect.value = exact != null ? exact : ZOOM_LEVELS.reduce((prev, curr) => Math.abs(curr - editState.zoom) < Math.abs(prev - editState.zoom) ? curr : prev); - // Also update status bar zoom text - updateStatusBar(editState.mouseX || 0, editState.mouseY || 0); - } - } - - function setupCanvasContainer() { - const canvasContainer = document.getElementById('editCanvasContainer'); - const editCanvas = document.getElementById('editCanvas'); - const wrapper = document.getElementById('editCanvasWrapper'); - - if (!canvasContainer || !wrapper) return; - - // Setup container styles - canvasContainer.style.cssText = ` - position: relative; - overflow: hidden; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - background: - linear-gradient(45deg, #f0f0f0 25%, transparent 25%), - linear-gradient(-45deg, #f0f0f0 25%, transparent 25%), - linear-gradient(45deg, transparent 75%, #f0f0f0 75%), - linear-gradient(-45deg, transparent 75%, #f0f0f0 75%); - background-size: 20px 20px; - background-position: 0 0, 0 10px, 10px -10px, -10px 0px; - background-color: #ddd; - `; - - // Setup wrapper styles - wrapper.style.cssText = ` - position: relative; - transform-origin: center center; - display: inline-block; - box-shadow: 0 4px 20px rgba(0,0,0,0.3); - border: 2px solid #333; - background: white; - `; - } - - function zoomToPoint(newZoom, clientX, clientY) { - const container = document.getElementById('editCanvasContainer'); - const wrapper = document.getElementById('editCanvasWrapper'); - - if (!container || !wrapper) return; - - newZoom = Math.max(0.1, Math.min(32, newZoom)); - - if (clientX !== undefined && clientY !== undefined) { - // Get current transform values - const oldZoom = editState.zoom; - const rect = container.getBoundingClientRect(); - - // Calculate zoom center point relative to container - const containerCenterX = rect.left + rect.width / 2; - const containerCenterY = rect.top + rect.height / 2; - - // Calculate offset to keep zoom point centered - const offsetX = (clientX - containerCenterX) * (1 - newZoom / oldZoom); - const offsetY = (clientY - containerCenterY) * (1 - newZoom / oldZoom); - - editState.panX += offsetX; - editState.panY += offsetY; - } - - editState.zoom = newZoom; - constrainPan(); - updateCanvasTransform(); - updateMinimap(); - updateStatusBar(editState.mouseX || 0, editState.mouseY || 0); - } - - function constrainPan() { - const container = document.getElementById('editCanvasContainer'); - const canvas = document.getElementById('editCanvas'); - - if (!container || !canvas) return; - - const containerRect = container.getBoundingClientRect(); - const scaledWidth = canvas.width * editState.zoom; - const scaledHeight = canvas.height * editState.zoom; - - // Small padding around edges to avoid snapping against borders - const padding = 10; - - // Calculate limits to keep canvas somewhat visible - const maxPanX = Math.max(0, (scaledWidth - containerRect.width) / 2 + padding); - const maxPanY = Math.max(0, (scaledHeight - containerRect.height) / 2 + padding); - - editState.panX = Math.max(-maxPanX, Math.min(maxPanX, editState.panX)); - editState.panY = Math.max(-maxPanY, Math.min(maxPanY, editState.panY)); - } - - function setZoom(zoom) { - zoomToPoint(zoom); - } - - function zoomIn() { - const currentIndex = ZOOM_LEVELS.findIndex(z => z >= editState.zoom); - const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1); - setZoom(ZOOM_LEVELS[nextIndex]); - } - - function zoomOut() { - const currentIndex = ZOOM_LEVELS.findIndex(z => z >= editState.zoom); - const prevIndex = Math.max(currentIndex - 1, 0); - setZoom(ZOOM_LEVELS[prevIndex]); - } - - function fitToWindow() { - const container = document.getElementById('editCanvasContainer'); - const canvas = document.getElementById('editCanvas'); - - if (!container || !canvas) return; - - const containerRect = container.getBoundingClientRect(); - const padding = 40; - - const scaleX = (containerRect.width - padding) / canvas.width; - const scaleY = (containerRect.height - padding) / canvas.height; - const fitZoom = Math.max(0.1, Math.min(scaleX, scaleY)); - - // Center the canvas - editState.zoom = fitZoom; - editState.panX = 0; - editState.panY = 0; - updateCanvasTransform(); - updateMinimap(); - updateStatusBar(editState.mouseX || 0, editState.mouseY || 0); - } - - function centerCanvas() { - editState.panX = 0; - editState.panY = 0; - updateCanvasTransform(); - updateMinimap(); - } - - function resetEditView() { - editState.zoom = 1; - editState.panX = 0; - editState.panY = 0; - - updateCanvasTransform(); - updateMinimap(); - } - - function setupMinimap() { - const minimapCanvas = document.getElementById('minimapCanvas'); - const editCanvas = document.getElementById('editCanvas'); - const minimapContainer = document.getElementById('minimapContainer'); - - if (!minimapCanvas || !editCanvas) return; - - // Show minimap only for larger images - if (editCanvas.width < 100 || editCanvas.height < 100) { - if (minimapContainer) minimapContainer.style.display = 'none'; - return; - } - - // Calculate minimap size - const maxSize = 150; - const scale = Math.min(maxSize / editCanvas.width, maxSize / editCanvas.height); - - minimapCanvas.width = editCanvas.width * scale; - minimapCanvas.height = editCanvas.height * scale; - - // Draw thumbnail - const minimapCtx = minimapCanvas.getContext('2d'); - minimapCtx.imageSmoothingEnabled = false; - // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template - minimapCtx.drawImage(editCanvas, 0, 0, minimapCanvas.width, minimapCanvas.height); - - // Update viewport indicator - updateMinimap(); - } - - function updateMinimap() { - const viewport = document.getElementById('minimapViewport'); - const minimapCanvas = document.getElementById('minimapCanvas'); - const container = document.getElementById('editCanvasContainer'); - const editCanvas = document.getElementById('editCanvas'); - - if (!viewport || !minimapCanvas || !container || !editCanvas) return; - - const containerRect = container.getBoundingClientRect(); - const scale = minimapCanvas.width / editCanvas.width; - - // Calculate visible area in minimap coordinates - const visibleWidth = Math.min(containerRect.width / editState.zoom * scale, minimapCanvas.width); - const visibleHeight = Math.min(containerRect.height / editState.zoom * scale, minimapCanvas.height); - - const viewportX = (minimapCanvas.width / 2) - (editState.panX / editState.zoom * scale) - (visibleWidth / 2); - const viewportY = (minimapCanvas.height / 2) - (editState.panY / editState.zoom * scale) - (visibleHeight / 2); - - viewport.style.width = `${visibleWidth}px`; - viewport.style.height = `${visibleHeight}px`; - viewport.style.left = `${Math.max(0, Math.min(minimapCanvas.width - visibleWidth, viewportX))}px`; - viewport.style.top = `${Math.max(0, Math.min(minimapCanvas.height - visibleHeight, viewportY))}px`; - } - - function navigateToMinimapPosition(e) { - const minimapCanvas = document.getElementById('minimapCanvas'); - const editCanvas = document.getElementById('editCanvas'); - - if (!minimapCanvas || !editCanvas) return; - - const rect = minimapCanvas.getBoundingClientRect(); - const x = (e.clientX - rect.left) / minimapCanvas.width; - const y = (e.clientY - rect.top) / minimapCanvas.height; - - // Convert to canvas coordinates and center - const targetX = (x - 0.5) * editCanvas.width * editState.zoom; - const targetY = (y - 0.5) * editCanvas.height * editState.zoom; - - editState.panX = -targetX; - editState.panY = -targetY; - - constrainPan(); - updateCanvasTransform(); - updateMinimap(); - } - - function updateStatusBar(x, y) { - const statusBar = document.getElementById('editStatusBar'); - if (statusBar) { - const zoomPercent = Math.round(editState.zoom * 100); - statusBar.textContent = `Position: (${x}, ${y}) | Color: ${editState.currentColor || '#000000'} | Zoom: ${zoomPercent}%`; - } - } - - function handleEyedropper(x, y) { - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - - if (x >= 0 && x < editCanvas.width && y >= 0 && y < editCanvas.height) { - const imageData = ctx.getImageData(x, y, 1, 1); - const [r, g, b] = imageData.data; - const pickedColor = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`; - - editState.currentColor = pickedColor; - const currentColorDisplay = document.getElementById('currentColorDisplay'); - if (currentColorDisplay) { - currentColorDisplay.style.backgroundColor = pickedColor; - } - - // Try to find matching color in palette - document.querySelectorAll('.edit-color-btn').forEach(btn => { - btn.classList.remove('active'); - if (btn.dataset.colorHex === pickedColor) { - btn.classList.add('active'); - editState.currentColorId = parseInt(btn.dataset.colorId); - } - }); - - updateStatusBar(x, y); - } - } - - function floodFill(startX, startY, fillColor) { - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - const imageData = ctx.getImageData(0, 0, editCanvas.width, editCanvas.height); - const data = imageData.data; - - if (startX < 0 || startX >= editCanvas.width || startY < 0 || startY >= editCanvas.height) return; - - const startIndex = (startY * editCanvas.width + startX) * 4; - const startR = data[startIndex]; - const startG = data[startIndex + 1]; - const startB = data[startIndex + 2]; - const startA = data[startIndex + 3]; - - // Convert fill color to RGB - const fillR = parseInt(fillColor.slice(1, 3), 16); - const fillG = parseInt(fillColor.slice(3, 5), 16); - const fillB = parseInt(fillColor.slice(5, 7), 16); - - // Don't fill if the color is already the same - if (startR === fillR && startG === fillG && startB === fillB) return; - - const pixelsToCheck = [{ x: startX, y: startY }]; - const checkedPixels = new Set(); - - while (pixelsToCheck.length > 0) { - const { x, y } = pixelsToCheck.pop(); - const key = `${x},${y}`; - - if (checkedPixels.has(key)) continue; - checkedPixels.add(key); - - if (x < 0 || x >= editCanvas.width || y < 0 || y >= editCanvas.height) continue; - - const index = (y * editCanvas.width + x) * 4; - const r = data[index]; - const g = data[index + 1]; - const b = data[index + 2]; - const a = data[index + 3]; - - if (r === startR && g === startG && b === startB && a === startA) { - data[index] = fillR; - data[index + 1] = fillG; - data[index + 2] = fillB; - data[index + 3] = 255; - - pixelsToCheck.push({ x: x + 1, y }); - pixelsToCheck.push({ x: x - 1, y }); - pixelsToCheck.push({ x, y: y + 1 }); - pixelsToCheck.push({ x, y: y - 1 }); - } - } - - ctx.putImageData(imageData, 0, 0); - } - - // Brush preview removed per user request - function hideBrushPreview() { - // No-op - brush preview disabled - } - - function drawGrid(ctx, width, height) { - if (!editState.showGrid || editState.zoom < 4) return; - - ctx.save(); - ctx.strokeStyle = 'rgba(128, 128, 128, 0.3)'; - ctx.lineWidth = 1 / editState.zoom; - - for (let x = 0; x <= width; x++) { - ctx.beginPath(); - ctx.moveTo(x, 0); - ctx.lineTo(x, height); - ctx.stroke(); - } - - for (let y = 0; y <= height; y++) { - ctx.beginPath(); - ctx.moveTo(0, y); - ctx.lineTo(width, y); - ctx.stroke(); - } - - ctx.restore(); - } - - function drawCheckerboardBackground(ctx, width, height) { - const checkerSize = 8; // Size of each checker square - ctx.fillStyle = '#f0f0f0'; // Light gray - ctx.fillRect(0, 0, width, height); - - ctx.fillStyle = '#e0e0e0'; // Slightly darker gray - for (let x = 0; x < width; x += checkerSize) { - for (let y = 0; y < height; y += checkerSize) { - if ((Math.floor(x / checkerSize) + Math.floor(y / checkerSize)) % 2 === 1) { - ctx.fillRect(x, y, checkerSize, checkerSize); - } - } - } - } - - function redrawCanvas() { - if (editState.undoStack.length === 0) return; - - const currentState = editState.undoStack[editState.undoStack.length - 1]; - const editCanvas = document.getElementById('editCanvas'); - const ctx = editCanvas.getContext('2d'); - - const img = new Image(); - img.onload = () => { - ctx.clearRect(0, 0, editCanvas.width, editCanvas.height); - // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template - ctx.drawImage(img, 0, 0); - drawGrid(ctx, editCanvas.width, editCanvas.height); - }; - img.src = currentState; - } - - function setupTouchSupport() { - const canvas = document.getElementById('editCanvas'); - if (!canvas) return; - - let touchStartTime = 0; - - canvas.addEventListener('touchstart', handleTouchStart, { passive: false }); - canvas.addEventListener('touchmove', handleTouchMove, { passive: false }); - canvas.addEventListener('touchend', handleTouchEnd, { passive: false }); - - function handleTouchStart(e) { - e.preventDefault(); - touchStartTime = Date.now(); - - if (e.touches.length === 1) { - // Single touch - start painting - const touch = e.touches[0]; - const coords = mapClientToCanvas(touch.clientX, touch.clientY); - if (coords) { - editState.isDrawing = true; - editState.lastPaintPos = { x: coords.x, y: coords.y }; - paintAtPosition(coords.x, coords.y, true); - } - } else if (e.touches.length === 2) { - // Two finger - prepare for zoom/pan - const touch1 = e.touches[0]; - const touch2 = e.touches[1]; - - editState.lastTouchDistance = Math.hypot( - touch2.clientX - touch1.clientX, - touch2.clientY - touch1.clientY - ); - - editState.lastTouchCenter = { - x: (touch1.clientX + touch2.clientX) / 2, - y: (touch1.clientY + touch2.clientY) / 2 - }; - } - } - - function handleTouchMove(e) { - e.preventDefault(); - - if (e.touches.length === 1 && editState.isDrawing) { - // Continue painting - const touch = e.touches[0]; - const coords = mapClientToCanvas(touch.clientX, touch.clientY); - if (coords) { - paintAtPosition(coords.x, coords.y, true); - } - } else if (e.touches.length === 2) { - // Pinch zoom and pan - const touch1 = e.touches[0]; - const touch2 = e.touches[1]; - - const currentDistance = Math.hypot( - touch2.clientX - touch1.clientX, - touch2.clientY - touch1.clientY - ); - - const currentCenter = { - x: (touch1.clientX + touch2.clientX) / 2, - y: (touch1.clientY + touch2.clientY) / 2 - }; - - // Zoom based on distance change - if (editState.lastTouchDistance > 0) { - const zoomFactor = currentDistance / editState.lastTouchDistance; - const newZoom = Math.max(0.1, Math.min(32, editState.zoom * zoomFactor)); - zoomToPoint(newZoom, currentCenter.x, currentCenter.y); - } - - // Pan based on center movement - editState.panX += currentCenter.x - editState.lastTouchCenter.x; - editState.panY += currentCenter.y - editState.lastTouchCenter.y; - - editState.lastTouchDistance = currentDistance; - editState.lastTouchCenter = currentCenter; - - constrainPan(); - updateCanvasTransform(); - updateMinimap(); - } - } - - function handleTouchEnd(e) { - e.preventDefault(); - - if (editState.isDrawing) { - editState.isDrawing = false; - editState.lastPaintPos = null; - saveEditState(); - } - - if (e.touches.length === 0) { - editState.lastTouchDistance = 0; - } - } - } - - function setupKeyboardShortcuts() { - document.addEventListener('keydown', (e) => { - // Only handle shortcuts when edit panel is visible - const editOverlay = document.getElementById('editOverlay'); - if (!editOverlay || editOverlay.style.display === 'none') return; - - // Prevent default for handled keys - const handledKeys = ['b', 'e', 'i', 'f', 'g', 'z', '[', ']']; - if (handledKeys.includes(e.key.toLowerCase()) || (e.ctrlKey && e.key.toLowerCase() === 'z')) { - e.preventDefault(); - } - - switch (e.key.toLowerCase()) { - case 'b': // Brush - selectTool('paint'); - break; - case 'e': // Erase - selectTool('erase'); - break; - case 'i': // Eyedropper - selectTool('eyedropper'); - break; - case 'f': // Fill - selectTool('fill'); - break; - case 'g': // Grid - const showGrid = document.getElementById('showGrid'); - if (showGrid) showGrid.click(); - break; - case 'z': - if (e.ctrlKey || e.metaKey) { - if (e.shiftKey) { - redoEdit(); - } else { - undoEdit(); - } - } - break; - case '=': - case '+': - if (e.ctrlKey || e.metaKey) { - zoomIn(); - } - break; - case '-': - if (e.ctrlKey || e.metaKey) { - zoomOut(); - } - break; - case '0': - if (e.ctrlKey || e.metaKey) { - fitToWindow(); - } - break; - case '1': - if (e.ctrlKey || e.metaKey) { - setZoom(1); - } - break; - case '[': // Decrease brush size - const brushSize = document.getElementById('brushSize'); - const currentSize = parseInt(brushSize.value); - if (currentSize > 1) { - brushSize.value = currentSize - 1; - document.getElementById('brushSizeValue').textContent = currentSize - 1; - updateBrushSize(currentSize - 1); - } - break; - case ']': // Increase brush size - const brushSize2 = document.getElementById('brushSize'); - const currentSize2 = parseInt(brushSize2.value); - if (currentSize2 < 20) { - brushSize2.value = currentSize2 + 1; - document.getElementById('brushSizeValue').textContent = currentSize2 + 1; - updateBrushSize(currentSize2 + 1); - } - break; - } - }); - } - - function applyEditChanges() { - try { - const editCanvas = document.getElementById('editCanvas'); - if (!editCanvas) { - throw new Error('Edit canvas not found'); - } - - // Find the resize canvas in the resize panel - const resizeCanvas = document.getElementById('resizeCanvas'); - if (!resizeCanvas) { - throw new Error('Resize canvas not found'); - } - - const baseCtx = resizeCanvas.getContext('2d'); - if (!baseCtx) { - throw new Error('Resize canvas context not available'); - } - - // Make sure the resize canvas has the same dimensions as the edit canvas - if (resizeCanvas.width !== editCanvas.width || resizeCanvas.height !== editCanvas.height) { - resizeCanvas.width = editCanvas.width; - resizeCanvas.height = editCanvas.height; - } - - // Clear resize canvas - baseCtx.clearRect(0, 0, resizeCanvas.width, resizeCanvas.height); - - // Copy edited image to resize canvas (no checkerboard since we removed it entirely) - baseCtx.imageSmoothingEnabled = false; - baseCtx.drawImage(editCanvas, 0, 0); - - // CRITICAL: Completely replace the template system with edited artwork - const editedImageData = editCanvas.toDataURL(); - - // Create new processor with edited image as the template - if (window.WPlaceImageProcessor) { - const newProcessor = new window.WPlaceImageProcessor(editedImageData); - newProcessor.load().then(() => { - // Get the processed pixel data from the edited canvas - const editCtx = editCanvas.getContext('2d'); - const editImageData = editCtx.getImageData(0, 0, editCanvas.width, editCanvas.height); - const pixels = editImageData.data; - - // Count valid pixels in the edited image - let totalValidPixels = 0; - for (let i = 0; i < pixels.length; i += 4) { - const a = pixels[i + 3]; - const r = pixels[i]; - const g = pixels[i + 1]; - const b = pixels[i + 2]; - - const isTransparent = !state.paintTransparentPixels && a < state.customTransparencyThreshold; - const isWhiteAndSkipped = !state.paintWhitePixels && Utils.isWhitePixel(r, g, b); - - if (!isTransparent && !isWhiteAndSkipped) { - totalValidPixels++; - } - } - - // COMPLETELY REBUILD state.imageData with the edited artwork - state.imageData = { - width: editCanvas.width, - height: editCanvas.height, - pixels: pixels, - totalPixels: totalValidPixels, - processor: newProcessor, - }; - - // CRITICAL: Update state.originalImage so resize panel uses edited artwork as base template - state.originalImage = { - dataUrl: editedImageData, - width: editCanvas.width, - height: editCanvas.height - }; - - // Update state with new totals - state.totalPixels = totalValidPixels; - state.paintedPixels = 0; // Reset progress since this is a new template - state.currentPaintingColor = null; // Reset color tracking - state.imageLoaded = true; - - // Update local processors - if (typeof processor !== 'undefined') { - processor = newProcessor; - console.log('🔄 Updated local processor with edited artwork'); - } - if (typeof baseProcessor !== 'undefined') { - baseProcessor = newProcessor; - console.log('🔄 Updated baseProcessor with edited artwork'); - } - - // Force regeneration of overlays by clearing cached mask data - if (typeof window._maskImageData !== 'undefined') { - delete window._maskImageData; - } - - // Update UI to reflect the new template - if (typeof updateUI === 'function') { - updateUI(); - } - - // Show loading and properly reload resize panel with new template - Utils.showAlert('Updating template... Please wait.', 'info'); - - // Give more time for template to fully update and force resize panel reload - setTimeout(() => { - // Hide edit overlay first - document.getElementById('editOverlay').style.display = 'none'; - - // Completely reload resize dialog with updated processor - setTimeout(() => { - // Clean up existing dialog - if (typeof _resizeDialogCleanup === 'function') { - _resizeDialogCleanup(); - } - - // Force complete reload of resize dialog with new processor - setTimeout(() => { - showResizeDialog(newProcessor); - - console.log('✅ Template COMPLETELY replaced with edited artwork'); - console.log(`📊 New template stats: ${editCanvas.width}x${editCanvas.height}, ${totalValidPixels} pixels`); - Utils.showAlert('Template successfully replaced with your edited artwork!', 'success'); - }, 100); - }, 300); - }, 100); - }).catch((error) => { - console.error('Failed to load new processor:', error); - Utils.showAlert('Failed to update template. Please try again.', 'error'); - }); - } else { - console.error('WPlaceImageProcessor not available'); - Utils.showAlert('Image processor not available. Please reload the page.', 'error'); - } - - console.log('✅ Edit changes applied - template replacement in progress'); - } catch (error) { - console.error('Error applying edit changes:', error); - Utils.showAlert('Failed to apply changes. Please try again.', 'error'); - } - } - - if (uploadBtn) { - uploadBtn.addEventListener('click', async () => { - // Auto-open color palette if not already open - Utils.openColorPalette(); - - const availableColors = Utils.extractAvailableColors(); - if (availableColors === null || availableColors.length < 10) { - updateUI('noColorsFound', 'error'); - Utils.showAlert(Utils.t('noColorsFound'), 'error'); - return; - } - - if (!state.colorsChecked) { - state.availableColors = availableColors; - state.colorsChecked = true; - updateUI('colorsFound', 'success', { count: availableColors.length }); - await updateStats(); - selectPosBtn.disabled = false; - // Only enable resize button if image is also loaded - if (state.imageLoaded) { - resizeBtn.disabled = false; - } - } - - try { - updateUI('loadingImage', 'default'); - const imageSrc = await Utils.createImageUploader(); - if (!imageSrc) { - updateUI('colorsFound', 'success', { - count: state.availableColors.length, - }); - return; - } - - const processor = new ImageProcessor(imageSrc); - await processor.load(); - - const { width, height } = processor.getDimensions(); - const pixels = processor.getPixelData(); - - let totalValidPixels = 0; - for (let i = 0; i < pixels.length; i += 4) { - const isTransparent = - !state.paintTransparentPixels && - pixels[i + 3] < (state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD); - const isWhiteAndSkipped = - !state.paintWhitePixels && - Utils.isWhitePixel(pixels[i], pixels[i + 1], pixels[i + 2]); - if (!isTransparent && !isWhiteAndSkipped) { - totalValidPixels++; - } - } - - state.imageData = { - width, - height, - pixels, - totalPixels: totalValidPixels, - processor, - }; - - state.totalPixels = totalValidPixels; - state.paintedPixels = 0; - state.currentPaintingColor = null; // Reset color tracking - state.imageLoaded = true; - state.imageProcessed = false; // New upload - not processed yet - - // Reset session-specific flags when a new image is loaded - state.preFilteringDone = false; - state.progressResetDone = false; - console.log('🔄 Reset session flags for new image load'); - - // Keep existing lastPosition to continue from where we left off - // state.lastPosition = { x: 0, y: 0 }; // REMOVED: Don't reset position - - // Initialize painted map for tracking - Utils.initializePaintedMap(width, height); - - // New image: clear previous resize settings - state.resizeSettings = null; - // Also clear any previous ignore mask - state.resizeIgnoreMask = null; - // Save original image for this browser (dataUrl + dims) - state.originalImage = { dataUrl: imageSrc, width, height }; - saveBotSettings(); - - // ⚠️ Use the ORIGINAL image for the overlay initially (will be replaced after processing) - const imageBitmap = await createImageBitmap(processor.img); - await overlayManager.setImage(imageBitmap); - overlayManager.enable(); - toggleOverlayBtn.disabled = false; - toggleOverlayBtn.classList.add('active'); - toggleOverlayBtn.setAttribute('aria-pressed', 'true'); - - // Only enable resize button if colors have also been captured - if (state.colorsChecked) { - resizeBtn.disabled = false; - } - saveBtn.disabled = false; - - // ⚠️ IMPORTANT: Disable position selection until image is processed - selectPosBtn.disabled = true; - selectPosBtn.title = Utils.t('imageNeedsProcessing'); - - // Disable start button since position can't be set yet - if (state.startPosition) { - startBtn.disabled = true; // Disable even if position was set before - } - - await updateStats(); - updateDataButtons(); - - // Show warning alert to process image first - Utils.showAlert(Utils.t('processImageFirst'), 'warning'); - updateUI('imageLoaded', 'success', { count: totalValidPixels }); - } catch { - updateUI('imageError', 'error'); - } - }); - } - - // Load Extracted button event listener - for loading Art-Extractor JSON files - const loadExtractedBtn = document.getElementById('loadExtractedBtn'); - if (loadExtractedBtn) { - loadExtractedBtn.addEventListener('click', async () => { - try { - // Auto-open color palette if not already open - Utils.openColorPalette(); - - updateUI('loadingImage', 'default'); - const fileData = await Utils.loadExtractedFileData(); - - if (!fileData) { - updateUI('ready', 'default'); - return; - } - - console.log('📁 Loading extracted artwork from Art-Extractor...'); - console.log('🔍 [DEBUG] Loaded file data structure:', { - hasState: !!fileData.state, - hasImageData: !!fileData.imageData, - topLevelKeys: Object.keys(fileData), - stateKeys: fileData.state ? Object.keys(fileData.state) : 'N/A', - imageDataKeys: fileData.imageData ? Object.keys(fileData.imageData) : 'N/A', - fileDataType: typeof fileData, - stateType: typeof fileData.state, - imageDataType: typeof fileData.imageData - }); - - // Validate the data structure before restoring - if (!fileData || typeof fileData !== 'object') { - throw new Error('Invalid file format: File data is not a valid object'); - } - - if (!fileData.state || typeof fileData.state !== 'object') { - console.error('❌ State validation failed. FileData:', fileData); - throw new Error('Invalid file format: Missing or invalid state object. Please ensure you exported from Art-Extractor correctly.'); - } - - if (!fileData.imageData || typeof fileData.imageData !== 'object') { - console.error('❌ ImageData validation failed. FileData:', fileData); - throw new Error('Invalid file format: Missing or invalid imageData object. Please ensure you completed the area scan in Art-Extractor.'); - } - - if (!fileData.imageData.pixels || !Array.isArray(fileData.imageData.pixels) || fileData.imageData.pixels.length === 0) { - console.error('❌ Pixel data validation failed. ImageData:', fileData.imageData); - throw new Error('Invalid file format: No pixel data found. Please scan an area in Art-Extractor before exporting.'); - } - - // Ensure critical fields are present for Art-Extractor compatibility - if (!fileData.state.availableColors) { - console.warn('⚠️ No availableColors in file, using defaults'); - fileData.state.availableColors = []; - } - - // Reset session-specific flags when loading extracted file data - state.preFilteringDone = false; - state.progressResetDone = false; - console.log('🔄 Reset session flags for extracted file load'); - - // Use the existing restoreProgress function but with special handling - const restoreSuccess = await Utils.restoreProgress(fileData); - - if (!restoreSuccess) { - throw new Error('Failed to restore progress data'); - } - - // After loading, we need to enter position selection mode like when uploading images - if (state.imageLoaded) { - console.log('🎯 Extracted artwork loaded, entering position selection mode...'); - - // Clear position data since Art-Extractor exports may have null positions for manual placement - state.startPosition = null; - state.region = null; - state.selectingPosition = true; - - // For extracted files, force enable all necessary flags for full functionality - state.colorsChecked = true; - state.currentPaintingColor = null; // Reset color tracking - state.imageLoaded = true; - - // Ensure image processor is available for extracted files - if (state.imageData && !state.imageData.processor) { - try { - // Create a temporary canvas to generate a data URL for the processor - const canvas = document.createElement('canvas'); - canvas.width = state.imageData.width; - canvas.height = state.imageData.height; - const ctx = canvas.getContext('2d'); - - // Create image data from pixels - const imageData = new ImageData( - new Uint8ClampedArray(state.imageData.pixels), - state.imageData.width, - state.imageData.height - ); - ctx.putImageData(imageData, 0, 0); - - // Create processor with canvas data URL using the correct class - const dataUrl = canvas.toDataURL(); - state.imageData.processor = new window.WPlaceImageProcessor(dataUrl); - - // CRITICAL: Load the processor before using it - await state.imageData.processor.load(); - console.log('🔧 Created and loaded WPlaceImageProcessor for extracted artwork'); - } catch (error) { - console.error('❌ Failed to create image processor for extracted artwork:', error); - // Fallback: use global processor if available - if (window.globalImageProcessor) { - console.log('🔄 Using global image processor as fallback'); - state.imageData.processor = window.globalImageProcessor; - } - } - } - - console.log('🎨 Force-enabled all flags for extracted JSON to access resize panel'); - - // For extracted images, ensure overlay is enabled but don't set position yet - try { - if (overlayManager && state.imageData) { - console.log('🖼️ Creating overlay from loaded pixel data:', { - width: state.imageData.width, - height: state.imageData.height, - pixelCount: state.imageData.pixels?.length, - firstPixels: state.imageData.pixels?.slice(0, 12), // First 3 pixels (RGBA) - isUint8ClampedArray: state.imageData.pixels instanceof Uint8ClampedArray, - isArray: Array.isArray(state.imageData.pixels) - }); - - // Create image bitmap from the restored image data - const canvas = new OffscreenCanvas(state.imageData.width, state.imageData.height); - const ctx = canvas.getContext('2d'); - const imageData = new ImageData( - new Uint8ClampedArray(state.imageData.pixels), - state.imageData.width, - state.imageData.height - ); - ctx.putImageData(imageData, 0, 0); - const imageBitmap = await canvas.transferToImageBitmap(); - - await overlayManager.setImage(imageBitmap); - overlayManager.enable(); - console.log('✅ Overlay enabled for extracted artwork - should show PROCESSED pixels'); - - // ✅ Loaded files already contain processed pixels - no need to reprocess - // Mark as processed since the overlay is showing the correct processed data - state.imageProcessed = true; - - // Enable position selection immediately - selectPosBtn.disabled = false; - selectPosBtn.title = Utils.t('selectPosition') || 'Select starting position on canvas'; - } - } catch (overlayError) { - console.warn('⚠️ Could not set overlay for extracted artwork:', overlayError); - } - - // For extracted images, don't try to set overlay position until user selects one - // The overlay should already be enabled from the restoreProgress function - - // Update UI with custom message for extracted artwork - Utils.showAlert('🎨 Extracted artwork loaded! Please click on the canvas to select where to place it.', 'info'); - updateUI('ready', 'default'); // Use 'ready' instead of 'waitingPosition' to avoid translation issues - - // Enable relevant buttons - selectPosBtn.disabled = false; - // Always enable resize button for extracted files since they have image processor - resizeBtn.disabled = false; - console.log('🔧 Resize button enabled for extracted artwork'); - - // Enable move artwork button (will be fully enabled after position is set) - const moveArtworkBtn = document.getElementById('moveArtworkBtn'); - if (moveArtworkBtn) { - moveArtworkBtn.disabled = false; - } - - // Set up position selection like the regular selectPosBtn - const tempFetch = async (url, options) => { - if ( - typeof url === 'string' && - url.includes('/s0/pixel/') && - options && - options.method === 'POST' - ) { - let coords; - try { - const body = JSON.parse(options.body); - coords = body.coords; - } catch (e) { - return window.originalFetch(url, options); - } - - const tileMatches = url.match(/\/s0\/pixel\/(\-?\d+)\/(\-?\d+)/); - if (tileMatches && coords && coords.length >= 2) { - const tileX = parseInt(tileMatches[1]); - const tileY = parseInt(tileMatches[2]); - const pixelX = coords[0]; - const pixelY = coords[1]; - - state.startPosition = { x: pixelX, y: pixelY }; - state.region = { x: tileX, y: tileY }; - state.selectingPosition = false; - - console.log('🎯 Position selected for extracted artwork:', { - startPosition: state.startPosition, - region: state.region - }); - - // Restore original fetch - window.fetch = window.originalFetch; - - // Update overlay position with validation - try { - if (state.startPosition && state.region && overlayManager) { - await overlayManager.setPosition(state.startPosition, state.region); - console.log('✅ Overlay position updated successfully'); - } else { - console.warn('⚠️ Cannot set overlay position: missing startPosition or region'); - } - } catch (positionError) { - console.error('❌ Failed to set overlay position:', positionError); - } - - startBtn.disabled = false; - selectPosBtn.textContent = Utils.t('selectPosition'); - - // Enable Move Artwork button when position is set - const moveArtworkBtn = document.getElementById('moveArtworkBtn'); - if (moveArtworkBtn) { - moveArtworkBtn.disabled = false; - } - - updateUI('ready', 'success'); - Utils.showAlert('Position selected! Ready to start painting.', 'success'); - } - } - return window.originalFetch(url, options); - }; - - // Store original fetch and replace with position capture - if (!window.originalFetch) { - window.originalFetch = window.fetch; - } - window.fetch = tempFetch; - } - - } catch (error) { - console.error('❌ Failed to load extracted artwork:', error); - Utils.showAlert(`Failed to load extracted artwork: ${error.message}`, 'error'); - updateUI('ready', 'default'); - } - }); - } - - if (resizeBtn) { - resizeBtn.addEventListener('click', () => { - console.log('🔍 [DEBUG] Resize button clicked. State check:', { - imageLoaded: state.imageLoaded, - hasProcessor: !!(state.imageData && state.imageData.processor), - colorsChecked: state.colorsChecked, - hasAvailableColors: !!(state.availableColors && state.availableColors.length > 0) - }); - - if (state.imageLoaded && state.imageData && state.imageData.processor) { - showResizeDialog(state.imageData.processor); - } else { - let message = 'Please upload an image and check colors first.'; - if (!state.imageLoaded) message = 'Please upload an image first.'; - else if (!state.imageData || !state.imageData.processor) message = 'Image processor not available. Please reload the image.'; - Utils.showAlert(message, 'warning'); - } - }); - } - - // Move Artwork button event listener - const moveArtworkBtn = document.getElementById('moveArtworkBtn'); - if (moveArtworkBtn) { - moveArtworkBtn.addEventListener('click', () => { - if (state.imageLoaded && (state.startPosition || state.selectingPosition)) { - showMoveArtworkPanel(); - } else if (!state.imageLoaded) { - Utils.showAlert('Please upload or load an image first', 'warning'); - } else { - Utils.showAlert('Please select a position for the artwork first', 'warning'); - } - }); - } - - if (selectPosBtn) { - selectPosBtn.addEventListener('click', async () => { - if (state.selectingPosition) return; - - state.selectingPosition = true; - state.startPosition = null; - state.region = null; - startBtn.disabled = true; - - // Disable Move Artwork button when selecting new position - const moveArtworkBtn = document.getElementById('moveArtworkBtn'); - if (moveArtworkBtn) { - moveArtworkBtn.disabled = true; - } - - Utils.showAlert(Utils.t('selectPositionAlert'), 'info'); - updateUI('waitingPosition', 'default'); - - const tempFetch = async (url, options) => { - if ( - typeof url === 'string' && - url.includes('https://backend.wplace.live/s0/pixel/') && - options?.method?.toUpperCase() === 'POST' - ) { - try { - const response = await originalFetch(url, options); - const clonedResponse = response.clone(); - const data = await clonedResponse.json(); - - if (data?.painted === 1) { - const regionMatch = url.match(/\/pixel\/(\d+)\/(\d+)/); - if (regionMatch && regionMatch.length >= 3) { - state.region = { - x: Number.parseInt(regionMatch[1]), - y: Number.parseInt(regionMatch[2]), - }; - } - - const payload = JSON.parse(options.body); - if (payload?.coords && Array.isArray(payload.coords)) { - state.startPosition = { - x: payload.coords[0], - y: payload.coords[1], - }; - // Keep existing lastPosition to continue from where we left off - // state.lastPosition = { x: 0, y: 0 }; // REMOVED: Don't reset position - - // Update overlay position with validation - try { - if (state.startPosition && state.region && overlayManager) { - await overlayManager.setPosition(state.startPosition, state.region); - console.log('✅ Regular overlay position updated successfully'); - } else { - console.warn('⚠️ Cannot set regular overlay position: missing startPosition or region'); - } - } catch (positionError) { - console.error('❌ Failed to set regular overlay position:', positionError); - } - - if (state.imageLoaded) { - startBtn.disabled = false; - - // Enable Move Artwork button when position is set - const moveArtworkBtn = document.getElementById('moveArtworkBtn'); - if (moveArtworkBtn) { - moveArtworkBtn.disabled = false; - } - } - - window.fetch = originalFetch; - state.selectingPosition = false; - updateUI('positionSet', 'success'); - } - } - - return response; - } catch { - return originalFetch(url, options); - } - } - return originalFetch(url, options); - }; - - const originalFetch = window.fetch; - window.fetch = tempFetch; - - setTimeout(() => { - if (state.selectingPosition) { - window.fetch = originalFetch; - state.selectingPosition = false; - updateUI('positionTimeout', 'error'); - Utils.showAlert(Utils.t('positionTimeout'), 'error'); - } - }, 120000); - }); - } - - async function startPainting() { - if (!state.imageLoaded || !state.startPosition || !state.region) { - updateUI('missingRequirements', 'error'); - return; - } - await ensureToken(); - if (!getTurnstileToken()) return; - - // Only perform progressive pixel detection on first start of session - if (!state.preFilteringDone) { - // Perform progressive pixel detection from top-left to bottom-right - console.log('🔍 Starting progressive pixel detection from top-left to bottom-right...'); - await performProgressivePixelDetection(); - - // Mark pre-filtering as done to prevent duplicate scanning - state.preFilteringDone = true; - console.log('✅ Pre-filtering marked as complete - will not scan again this session'); - } else { - console.log('🔄 Continuing session - pre-filtering already done'); - } - - state.running = true; - state.stopFlag = false; - startBtn.disabled = true; - stopBtn.disabled = false; - uploadBtn.disabled = true; - selectPosBtn.disabled = true; - resizeBtn.disabled = true; - saveBtn.disabled = true; - toggleOverlayBtn.disabled = true; - - updateUI('startPaintingMsg', 'success'); - - try { - await getAccounts(); - await processImage(); - } catch (e) { - console.error('Unexpected error:', e); - updateUI('paintingError', 'error'); - } finally { - state.running = false; - stopBtn.disabled = true; - saveBtn.disabled = false; - - if (state.stopFlag) { - startBtn.disabled = false; - } else { - startBtn.disabled = true; - uploadBtn.disabled = false; - const loadExtractedBtn = document.getElementById('loadExtractedBtn'); - if (loadExtractedBtn) loadExtractedBtn.disabled = false; - selectPosBtn.disabled = false; - resizeBtn.disabled = false; - } - toggleOverlayBtn.disabled = false; - } - } - - // Helper function to update start button state - function updateStartButtonState() { - if (!startBtn) return; - - if (state.paintingMode === 'assist') { - startBtn.disabled = true; - startBtn.title = 'Start button is disabled in Assist mode. Manually place pixels with overlay guidance.'; - } else { - startBtn.disabled = !state.imageLoaded || state.running || !state.startPosition; - startBtn.title = ''; - } - } - - if (startBtn) { - startBtn.addEventListener('click', startPainting); - } - - // Painting Mode Toggle - const paintingModeToggle = container.querySelector('#paintingModeToggle'); - if (paintingModeToggle) { - // Initialize toggle state - MUST be unchecked for auto mode (default) - paintingModeToggle.checked = state.paintingMode === 'assist'; - console.log(`🎨 [Painting Mode] Initial state: ${state.paintingMode}, Toggle checked: ${paintingModeToggle.checked}`); - - paintingModeToggle.addEventListener('change', () => { - state.paintingMode = paintingModeToggle.checked ? 'assist' : 'auto'; - - // Update start button state - updateStartButtonState(); - - // NOTE: We don't save paintingMode - it always resets to 'auto' on page load - - // Show notification - const modeName = state.paintingMode === 'assist' ? 'Assist' : 'Auto'; - const modeDesc = state.paintingMode === 'assist' - ? 'Overlay will guide your manual pixel placement' - : 'Bot will automatically paint pixels'; - Utils.showAlert(`Painting Mode: ${modeName}\n${modeDesc}`, 'info'); - - console.log(`🎨 [Painting Mode] Switched to ${modeName.toUpperCase()} mode`); - }); - - // Initial state update - updateStartButtonState(); - } - - if (stopBtn) { - stopBtn.addEventListener('click', () => { - state.stopFlag = true; - state.running = false; - stopBtn.disabled = true; - updateUI('paintingStoppedByUser', 'warning'); - - if (state.imageLoaded && state.paintedPixels > 0) { - Utils.saveProgress(); - Utils.showAlert(Utils.t('autoSaved'), 'success'); - } - }); - } - - const checkSavedProgress = () => { - const savedData = Utils.loadProgress(); - if (savedData && savedData.state.paintedPixels > 0) { - const savedDate = new Date(savedData.timestamp).toLocaleString(); - const progress = Math.round( - (savedData.state.paintedPixels / savedData.state.totalPixels) * 100 - ); - - Utils.showAlert( - `${Utils.t('savedDataFound')}\n\n` + - `Saved: ${savedDate}\n` + - `Progress: ${savedData.state.paintedPixels}/${savedData.state.totalPixels} pixels (${progress}%)\n` + - `${Utils.t('clickLoadToContinue')}`, - 'info' - ); - } - }; - - setTimeout(checkSavedProgress, 1000); - - if (cooldownSlider && cooldownInput && cooldownValue && cooldownDecrease && cooldownIncrease) { - const updateCooldown = (newValue) => { - const threshold = Math.max(1, Math.min(state.maxCharges || 999, parseInt(newValue))); - state.cooldownChargeThreshold = threshold; - - // Update both controls (value shows in input, label shows unit only) - cooldownSlider.value = threshold; - cooldownInput.value = threshold; - cooldownValue.textContent = `${Utils.t('charges')}`; - - saveBotSettings(); - NotificationManager.resetEdgeTracking(); // prevent spurious notify after threshold change - }; - - // Slider event listener - cooldownSlider.addEventListener('input', (e) => { - updateCooldown(e.target.value); - }); - - // Number input event listener - cooldownInput.addEventListener('input', (e) => { - updateCooldown(e.target.value); - }); - - // Decrease button - cooldownDecrease.addEventListener('click', () => { - updateCooldown(parseInt(cooldownInput.value) - 1); - }); - - // Increase button - cooldownIncrease.addEventListener('click', () => { - updateCooldown(parseInt(cooldownInput.value) + 1); - }); - - // Add scroll-to-adjust for cooldown slider - Utils.createScrollToAdjust(cooldownSlider, updateCooldown, 1, state.maxCharges, 1); - - // Skip cooldown button event handler - const skipCooldownBtn = document.getElementById('skipCooldownBtn'); - if (skipCooldownBtn) { - skipCooldownBtn.addEventListener('click', () => { - if (state.preciseCurrentCharges < state.cooldownChargeThreshold) { - console.log(`[Auto-Image] Skip cooldown requested - resetting to account index 0`); - - // Reset to account index 0 (start new cycle) - state.currentActiveIndex = 0; - console.log(`🔄 Reset currentActiveIndex to 0 for new cycle`); - - // Reset charges to threshold to bypass cooldown - state.preciseCurrentCharges = state.cooldownChargeThreshold; - console.log(`[Auto-Image] Cooldown skipped! Charges set to threshold: ${state.cooldownChargeThreshold}`); - - // Switch to first account if we have multiple accounts - if (accountManager.getAccountCount() > 1) { - const firstAccountInfo = accountManager.getAccountByIndex(0); - if (firstAccountInfo && firstAccountInfo.token) { - console.log(`🔄 Switching to first account: index 0 (${firstAccountInfo.displayName})`); - // Get accounts array for the switch - const accounts = JSON.parse(localStorage.getItem("accounts")) || []; - if (accounts.length > 0) { - switchToSpecificAccount(firstAccountInfo.token, firstAccountInfo.displayName).then(() => { - console.log(`✅ Successfully switched to account index 0 after cooldown skip`); - // Update UI immediately - updateChargesThresholdUI(0); - // Trigger immediate check for painting - if (state.isEnabled && !state.stopFlag) { - setTimeout(() => { - checkAndPaint(); - }, 100); - } - }).catch(err => { - console.error(`❌ Failed to switch to account index 0:`, err); - }); - } else { - console.warn(`⚠️ No accounts available for switching`); - } - } else { - console.warn(`⚠️ First account info not found or missing token`); - } - } else { - console.log(`📝 Single account mode - no switching needed`); - // Update UI immediately - updateChargesThresholdUI(0); - // Trigger immediate check for painting - if (state.isEnabled && !state.stopFlag) { - setTimeout(() => { - checkAndPaint(); - }, 100); - } - } - } - }); - } - } - - loadBotSettings(); - // Ensure notification poller reflects current settings - NotificationManager.syncFromState(); - - // Sync painting mode toggle with loaded state - if (paintingModeToggle) { - paintingModeToggle.checked = state.paintingMode === 'assist'; - updateStartButtonState(); - console.log(`🔄 [Painting Mode] Synced after load: ${state.paintingMode}, Toggle checked: ${paintingModeToggle.checked}`); - } - } - - function getMsToTargetCharges(current, target, cooldown, intervalMs = 0) { - const remainingCharges = target - current; - return Math.max(0, remainingCharges * cooldown - intervalMs); - } - - function updateChargesThresholdUI(intervalMs) { - if (state.stopFlag) return; - - const threshold = state.cooldownChargeThreshold; - const remainingMs = getMsToTargetCharges( - state.preciseCurrentCharges, - threshold, - state.cooldown, - intervalMs - ); - const timeText = Utils.msToTimeText(remainingMs); - - updateUI( - 'noChargesThreshold', - 'warning', - { - threshold, - current: state.displayCharges, - time: timeText, - }, - true - ); - - // Update skip cooldown button state - const skipCooldownBtn = document.getElementById('skipCooldownBtn'); - if (skipCooldownBtn) { - const isInCooldown = state.preciseCurrentCharges < threshold && remainingMs > 0; - skipCooldownBtn.disabled = !isInCooldown; - skipCooldownBtn.title = isInCooldown - ? `Skip cooldown (${timeText} remaining)` - : 'Skip cooldown (only available during cooldown)'; - } - } - - // Fast tile-based pixel detection from top-left to bottom-right - async function performProgressivePixelDetection() { - if (!state.imageLoaded || !state.imageData) { - console.log('⚠️ No image loaded, skipping pixel detection'); - return; - } - - const startTime = performance.now(); - const { width, height } = state.imageData; - const startX = state.startPosition.x; - const startY = state.startPosition.y; - const regionX = state.region.x; - const regionY = state.region.y; - - let detectedPixels = 0; - let totalChecked = 0; - - console.log(`🚀 Fast scanning ${width}x${height} image from top-left (0,0) to bottom-right (${width - 1},${height - 1})...`); - - updateUI('pixelDetection', 'info', { message: 'Fast detecting already painted pixels...' }); - - // Calculate affected tiles - const worldX1 = startX; - const worldY1 = startY; - const worldX2 = startX + width - 1; - const worldY2 = startY + height - 1; - - const startTileX = Math.floor(worldX1 / 1000); - const startTileY = Math.floor(worldY1 / 1000); - const endTileX = Math.floor(worldX2 / 1000); - const endTileY = Math.floor(worldY2 / 1000); - - console.log(`📄 Processing tiles from (${startTileX},${startTileY}) to (${endTileX},${endTileY})`); - - // Cache for downloaded tile data - const tileDataCache = new Map(); - - // Download and cache all required tiles in parallel - const tilePromises = []; - for (let tileY = startTileY; tileY <= endTileY; tileY++) { - for (let tileX = startTileX; tileX <= endTileX; tileX++) { - const absoluteTileX = regionX + tileX; - const absoluteTileY = regionY + tileY; - const tileKey = `${absoluteTileX},${absoluteTileY}`; - - tilePromises.push( - downloadTileImageData(absoluteTileX, absoluteTileY).then(imageData => { - if (imageData) { - tileDataCache.set(tileKey, imageData); - } - }).catch(e => { - console.warn(`⚠️ Failed to download tile ${absoluteTileX},${absoluteTileY}:`, e.message); - }) - ); - } - } - - // Wait for all tiles to download - await Promise.all(tilePromises); - console.log(`📦 Downloaded ${tileDataCache.size} tiles for fast pixel checking`); - - // Fast pixel detection using cached tile data - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - totalChecked++; - - // Check if pixel is eligible for painting - const targetPixelInfo = checkPixelEligibility(x, y); - if (!targetPixelInfo.eligible) { - continue; // Skip non-eligible pixels - } - - // Calculate absolute world coordinates - const absX = startX + x; - const absY = startY + y; - const adderX = Math.floor(absX / 1000); - const adderY = Math.floor(absY / 1000); - const pixelX = absX % 1000; - const pixelY = absY % 1000; - const absoluteTileX = regionX + adderX; - const absoluteTileY = regionY + adderY; - - // Check if already marked as painted in local map - if (Utils.isPixelPainted(x, y, absoluteTileX, absoluteTileY)) { - detectedPixels++; - continue; - } - - // Fast pixel color check using cached tile data - const tileKey = `${absoluteTileX},${absoluteTileY}`; - const tileImageData = tileDataCache.get(tileKey); - - if (tileImageData) { - try { - // Direct array access - much faster than canvas operations - const tileWidth = tileImageData.width; - const tileHeight = tileImageData.height; - const data = tileImageData.data; - - // Ensure pixel coordinates are within tile bounds - if (pixelX >= 0 && pixelX < tileWidth && pixelY >= 0 && pixelY < tileHeight) { - const pixelIndex = (pixelY * tileWidth + pixelX) * 4; - const r = data[pixelIndex]; - const g = data[pixelIndex + 1]; - const b = data[pixelIndex + 2]; - const a = data[pixelIndex + 3]; - - // Check alpha threshold - const alphaThresh = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; - if (a >= alphaThresh) { - const existingMappedColor = Utils.resolveColor( - [r, g, b], - state.availableColors, - !state.paintUnavailablePixels - ); - const isAlreadyPainted = existingMappedColor.id === targetPixelInfo.mappedColorId; - - if (isAlreadyPainted) { - // Check if pixel is already marked as painted to avoid double counting - if (!Utils.isPixelPainted(x, y, absoluteTileX, absoluteTileY)) { - // Mark as painted in the map but DO NOT increment progress counter - // Progress counter should only reflect actual painting sequence position - Utils.markPixelPainted(x, y, absoluteTileX, absoluteTileY); - detectedPixels++; - } else { - // Pixel already tracked, just count it for detection stats - detectedPixels++; - } - } - } - } - } catch (e) { - // Skip pixels we can't check - console.warn(`⚠️ Could not check pixel (${x}, ${y}):`, e.message); - } - } - - // Update progress periodically - if (totalChecked % 2500 === 0) { - const progress = Math.round((totalChecked / (width * height)) * 100); - updateUI('pixelDetection', 'info', { - message: `Fast detecting... ${progress}% (Found: ${detectedPixels})` - }); - // Yield control briefly to prevent UI blocking - await new Promise(resolve => setTimeout(resolve, 0)); - } - } - } - - const processingTime = Math.round(performance.now() - startTime); - console.log(`🏁 Fast pixel detection complete in ${processingTime}ms:`); - console.log(` - Total pixels checked: ${totalChecked}`); - console.log(` - Already painted pixels found: ${detectedPixels}`); - console.log(` - Updated progress: ${state.paintedPixels}/${state.totalPixels}`); - console.log(` - Performance: ${Math.round(totalChecked / (processingTime / 1000))} pixels/second`); - - // Update progress display - await updateStats(); - updateUI('pixelDetectionComplete', 'success', { - message: `Found ${detectedPixels} already painted pixels in ${processingTime}ms` - }); - } - - // Fast tile download and ImageData extraction (similar to Art-Extractor approach) - async function downloadTileImageData(tileX, tileY) { - try { - const tileUrl = `https://backend.wplace.live/files/s0/tiles/${tileX}/${tileY}.png`; - const response = await fetch(tileUrl); - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const blob = await response.blob(); - return await processTileBlob(blob); - } catch (error) { - console.warn(`Failed to download tile ${tileX},${tileY}:`, error.message); - return null; - } - } - - // Process tile blob into ImageData (adapted from Art-Extractor) - async function processTileBlob(blob) { - try { - const img = new Image(); - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - - return new Promise((resolve, reject) => { - img.onload = () => { - canvas.width = img.width; - canvas.height = img.height; - ctx.imageSmoothingEnabled = false; - ctx.drawImage(img, 0, 0); - const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); - resolve(imageData); - }; - img.onerror = () => reject(new Error('Failed to load image')); - img.src = URL.createObjectURL(blob); - }); - } catch (error) { - console.error('Error processing tile blob:', error); - return null; - } - } - - function generateCoordinates(width, height, mode, direction, snake, blockWidth, blockHeight, startFromX = 0, startFromY = 0) { - const coords = []; - console.log( - 'Generating coordinates with \n mode:', - mode, - '\n direction:', - direction, - '\n snake:', - snake, - '\n blockWidth:', - blockWidth, - '\n blockHeight:', - blockHeight, - '\n startFromX:', - startFromX, - '\n startFromY:', - startFromY - ); - // --------- Standard 4 corners traversal ---------- - let xStart, xEnd, xStep; - let yStart, yEnd, yStep; - switch (direction) { - case 'top-left': - xStart = 0; - xEnd = width; - xStep = 1; - yStart = 0; - yEnd = height; - yStep = 1; - break; - case 'top-right': - xStart = width - 1; - xEnd = -1; - xStep = -1; - yStart = 0; - yEnd = height; - yStep = 1; - break; - case 'bottom-left': - xStart = 0; - xEnd = width; - xStep = 1; - yStart = height - 1; - yEnd = -1; - yStep = -1; - break; - case 'bottom-right': - xStart = width - 1; - xEnd = -1; - xStep = -1; - yStart = height - 1; - yEnd = -1; - yStep = -1; - break; - default: - throw new Error(`Unknown direction: ${direction}`); - } - - // --------- Traversal modes ---------- - if (mode === 'rows') { - let rowIndex = 0; - for (let y = yStart; y !== yEnd; y += yStep) { - if (snake && rowIndex % 2 !== 0) { - for (let x = xEnd - xStep; x !== xStart - xStep; x -= xStep) { - coords.push([x, y]); - } - } else { - for (let x = xStart; x !== xEnd; x += xStep) { - coords.push([x, y]); - } - } - rowIndex++; - } - } else if (mode === 'columns') { - let colIndex = 0; - for (let x = xStart; x !== xEnd; x += xStep) { - if (snake && colIndex % 2 !== 0) { - for (let y = yEnd - yStep; y !== yStart - yStep; y -= yStep) { - coords.push([x, y]); - } - } else { - for (let y = yStart; y !== yEnd; y += yStep) { - coords.push([x, y]); - } - } - colIndex++; - } - } else if (mode === 'circle-out') { - const cx = Math.floor(width / 2); - const cy = Math.floor(height / 2); - const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); - - for (let r = 0; r <= maxRadius; r++) { - for (let y = cy - r; y <= cy + r; y++) { - for (let x = cx - r; x <= cx + r; x++) { - if (x >= 0 && x < width && y >= 0 && y < height) { - const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); - if (dist === r) coords.push([x, y]); - } - } - } - } - } else if (mode === 'circle-in') { - const cx = Math.floor(width / 2); - const cy = Math.floor(height / 2); - const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); - - for (let r = maxRadius; r >= 0; r--) { - for (let y = cy - r; y <= cy + r; y++) { - for (let x = cx - r; x <= cx + r; x++) { - if (x >= 0 && x < width && y >= 0 && y < height) { - const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); - if (dist === r) coords.push([x, y]); - } - } - } - } - } else if (mode === 'blocks' || mode === 'shuffle-blocks') { - const blocks = []; - for (let by = 0; by < height; by += blockHeight) { - for (let bx = 0; bx < width; bx += blockWidth) { - const block = []; - for (let y = by; y < Math.min(by + blockHeight, height); y++) { - for (let x = bx; x < Math.min(bx + blockWidth, width); x++) { - block.push([x, y]); - } - } - blocks.push(block); - } - } - - if (mode === 'shuffle-blocks') { - // Simple Fisher-Yates shuffle - for (let i = blocks.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [blocks[i], blocks[j]] = [blocks[j], blocks[i]]; - } - } - - // Append all blocks without spread/concat to avoid large allocations and argument explosion - for (const block of blocks) { - for (let i = 0; i < block.length; i++) { - coords.push(block[i]); - } - } - } else { - throw new Error(`Unknown mode: ${mode}`); - } - - // Filter coordinates to start from the specified position - if (startFromX > 0 || startFromY > 0) { - console.log(`🔄 Filtering coordinates to resume from position (${startFromX}, ${startFromY})`); - let startIndex = -1; - - // Find the starting position in the coordinate list - for (let i = 0; i < coords.length; i++) { - const [x, y] = coords[i]; - if (x === startFromX && y === startFromY) { - startIndex = i; - break; - } - } - - if (startIndex >= 0) { - // Resume from the found position (skip all previous coordinates) - const filteredCoords = coords.slice(startIndex); - console.log(`✂️ Resuming: skipped ${startIndex} coordinates, continuing with ${filteredCoords.length} remaining`); - return filteredCoords; - } else { - console.warn(`⚠️ Resume position (${startFromX}, ${startFromY}) not found in coordinate list, starting from beginning`); - } - } - - return coords; - } - - async function flushPixelBatch(pixelBatch) { - if (!pixelBatch || pixelBatch.pixels.length === 0) return true; - - const batchSize = pixelBatch.pixels.length; - console.log( - `📦 Sending batch with ${batchSize} pixels (region: ${pixelBatch.regionX},${pixelBatch.regionY})` - ); - const success = await sendBatchWithRetry( - pixelBatch.pixels, - pixelBatch.regionX, - pixelBatch.regionY - ); - if (success) { - // Only increment progress for actually painted pixels to prevent multiplication - const actuallyPaintedCount = pixelBatch.pixels.length; - state.paintedPixels += actuallyPaintedCount; - console.log(`📊 Added ${actuallyPaintedCount} painted pixels to progress (total: ${state.paintedPixels})`); - - pixelBatch.pixels.forEach((p) => { - Utils.markPixelPainted(p.x, p.y, pixelBatch.regionX, pixelBatch.regionY); - }); - - // Update last painted position to the last pixel in the successful batch - if (pixelBatch.pixels.length > 0) { - const lastPixel = pixelBatch.pixels[pixelBatch.pixels.length - 1]; - // FIXED: Use localX/localY (image-relative coordinates) instead of x/y (absolute canvas coordinates) - state.lastPaintedPosition = { x: lastPixel.localX, y: lastPixel.localY }; - } - - // Track painted pixels since last account switch to avoid flip-flop - state.paintedSinceSwitch = (state.paintedSinceSwitch || 0) + actuallyPaintedCount; - - // IMPORTANT: Decrement charges locally to match Acc-Switch.js behavior - state.displayCharges = Math.max(0, state.displayCharges - batchSize); - state.preciseCurrentCharges = Math.max(0, state.preciseCurrentCharges - batchSize); - // Also update the global local charge model per account with bonus logic - try { - const tok = accountManager.getCurrentAccount()?.token; - const after = ChargeModel.decrement(tok, batchSize); - state.displayCharges = Math.floor(after); - state.preciseCurrentCharges = after; - if (tok) accountManager.updateAccountData(tok, { Charges: state.displayCharges }); - } catch {} - - state.fullChargeData = { - ...state.fullChargeData, - spentSinceShot: state.fullChargeData.spentSinceShot + batchSize, - }; - await updateStats(); - // Update account list with new charges - await updateCurrentAccountInList(); - // Progress tracking removed from UI to reduce visual clutter - Utils.performSmartSave(); - - if (CONFIG.PAINTING_SPEED_ENABLED && state.paintingSpeed > 0 && batchSize > 0) { - const delayPerPixel = 1000 / state.paintingSpeed; - const totalDelay = Math.max(100, delayPerPixel * batchSize); - await Utils.sleep(totalDelay); - } - } else { - console.error(`❌ Batch failed permanently after retries. Stopping painting.`); - state.stopFlag = true; - updateUI('paintingBatchFailed', 'error'); - } - - pixelBatch.pixels = []; - return success; - } - - async function processImage() { - console.log('🚀 Starting auto-swap enabled painting workflow'); - - try { - // Main painting cycle - repeats until image complete or stopped - while (!state.stopFlag) { - console.log('📋 Phase 1: Starting painting session'); - const paintingResult = await executePaintingSession(); - - if (paintingResult === 'completed') { - console.log('🎉 Image painting completed!'); - state.currentPaintingColor = null; // Reset color tracking - break; - } - - if (paintingResult === 'stopped') { - console.log('⏹️ Painting stopped by user'); - break; - } - - if (paintingResult === 'charges_depleted') { - if (CONFIG.autoBuyToggle && CONFIG.autoBuy != 'none') { - console.log('Trying to buy more charges before swapping account...'); - const purchaseResult = await purchase(CONFIG.autoBuy); - if (purchaseResult == 2) { - console.log('✅ Purchase successful, continuing painting'); - await updateStats(); - await updateCurrentAccountInList(); - if (CONFIG.autoBuy == 'paint_charges') continue; - } - else if (purchaseResult == 1) { - console.log('😭 Not enough droplets to buy more charges, swapping account.'); - } - else { - console.log('🤔 Purchase failed.'); - } - } - else console.log('🤫 Auto buy is disabled, wait for cooldown or swapping account.'); - if (!CONFIG.autoSwap) { - // Original workflow: cooldown period - console.log('⏱️ Phase 2: Entering cooldown period (auto-swap disabled)'); - const cooldownResult = await executeCooldownPeriod(); - - if (cooldownResult === 'stopped') { - console.log('⏹️ Cooldown stopped by user'); - break; - } - - // Phase 3: Regenerate token for next painting session - console.log('🔑 Phase 3: Regenerating token for next session'); - const tokenResult = await regenerateTokenForNewSession(); - - if (!tokenResult) { - console.log('❌ Failed to regenerate token, stopping'); - state.stopFlag = true; - break; - } - } else { - // Auto-swap workflow: simplified logic - console.log('🔄 Auto-swap enabled: checking account switching options'); - - // Retrieve fresh accounts list each time to avoid stale data - const accounts = JSON.parse(localStorage.getItem("accounts")) || []; - console.log(`📊 Retrieved ${accounts.length} accounts from localStorage`); - - if (accounts.length <= 1) { - console.log('📋 Only one account available, using standard cooldown'); - const cooldownResult = await executeCooldownPeriod(); - if (cooldownResult === 'stopped') break; - - const tokenResult = await regenerateTokenForNewSession(); - if (!tokenResult) { - state.stopFlag = true; - break; - } - } else { - // Try to find an account with enough charges to continue painting - const minRequired = Math.max(1, state.cooldownChargeThreshold || 1); - console.log(`🔎 Searching for account with ≥${minRequired} charges...`); - const switched = await selectAndSwitchToAccountWithCharges(minRequired); - if (switched) { - console.log('✅ Switched to an account with sufficient charges, continuing painting immediately'); - continue; - } - // If none had enough charges, enter cooldown on the best available account - console.log('🕒 No accounts have enough charges. Entering cooldown on the account with the soonest recharge...'); - const cooldownResult = await executeCooldownPeriod(); - if (cooldownResult === 'stopped') break; - continue; - } - } - } - - console.log('🔄 Cycle complete, starting next painting session'); - } - } finally { - await finalizePaintingProcess(); - } - } - - // Phase 1: Execute a complete painting session using all available charges - async function executePaintingSession() { - console.log('🎨 Starting painting session - using all charges until 0'); - const { width, height, pixels } = state.imageData; - const { x: startX, y: startY } = state.startPosition; - const { x: regionX, y: regionY } = state.region; - - // Check if we're working with restored data by looking for existing availableColors - const isRestoredData = state.availableColors && state.availableColors.length > 0 && state.colorsChecked; - - if (!isRestoredData) { - // Wait for original tiles to load if needed - const tilesReady = await overlayManager.waitForTiles( - regionX, - regionY, - width, - height, - startX, - startY, - 10000 // timeout 10s - ); - - if (!tilesReady) { - updateUI('overlayTilesNotLoaded', 'error'); - state.stopFlag = true; - return 'stopped'; - } - } - - let pixelBatch = null; - let skippedPixels = { - transparent: 0, - white: 0, - alreadyPainted: 0, - colorUnavailable: 0, - }; - - // IMPORTANT: Check charges once at start, then paint until depleted - // Use local charge model to avoid extra API calls - console.log('🔋 Checking initial charges for painting session'); - const currentToken = accountManager.getCurrentAccount()?.token; - let node = ChargeModel.get(currentToken); - // One-time sync for current account if never synced - if (node && !node.lastSyncAt) { - try { - const sync = await WPlaceService.getCharges(); - ChargeModel.setFromServer(currentToken, sync.charges, sync.max); - node = ChargeModel.get(currentToken); - } catch {} - } - state.displayCharges = Math.floor(node?.charges || 0); - state.preciseCurrentCharges = node?.charges || 0; - state.cooldown = CONFIG.COOLDOWN_DEFAULT; - await updateStats(); - if (state.displayCharges <= 0) { - console.log('⚡ No charges available (local), skipping painting session'); - return 'charges_depleted'; - } - - // If current account has less than threshold charges but another account - // has reached the threshold, switch BEFORE painting anything on the under-threshold account - try { - const threshold = Math.max(1, state.cooldownChargeThreshold || 1); - if (CONFIG.autoSwap && state.displayCharges < threshold) { - console.log(`🛑 Current charges (${state.displayCharges}) < threshold (${threshold}). Checking other accounts before painting...`); - const switched = await selectAndSwitchToAccountWithCharges(threshold); - if (switched) { - console.log('🔀 Switched to an account that met the threshold before painting. Restarting cycle...'); - return 'charges_depleted'; - } - } - } catch (e) { - console.warn('⚠️ Pre-paint switch guard failed:', e); - } - - console.log(`🔋 Starting with ${state.displayCharges} charges - painting until depleted`); - - // Paint pixels until we run out of charges or complete the image - try { - - // Generate the actual filtered coordinates for painting (resuming from last position) - const coords = await generateCoordinatesAsync( - width, - height, - state.coordinateMode, - state.coordinateDirection, - state.coordinateSnake, - state.blockWidth, - state.blockHeight, - state.lastPosition.x, - state.lastPosition.y - ); - - // OPTIMIZATION: Pre-filter already painted pixels (happens only once per session) - let eligibleCoords = []; - let alreadyPaintedCount = 0; - - if (!state.preFilteringDone) { - console.log('🔍 Pre-filtering already painted pixels (one-time detection for this session)...'); - - for (const [x, y] of coords) { - const targetPixelInfo = checkPixelEligibility(x, y); - - if (!targetPixelInfo.eligible) { - if (targetPixelInfo.reason !== 'alreadyPainted') { - skippedPixels[targetPixelInfo.reason]++; - - } - continue; - } - - // Check if already painted (only once per session) - let absX = startX + x; - let absY = startY + y; - let adderX = Math.floor(absX / 1000); - let adderY = Math.floor(absY / 1000); - let pixelX = absX % 1000; - let pixelY = absY % 1000; - - try { - const tilePixelRGBA = await overlayManager.getTilePixelColor( - regionX + adderX, - regionY + adderY, - pixelX, - pixelY - ); - - if (tilePixelRGBA && Array.isArray(tilePixelRGBA)) { - const mappedCanvasColor = Utils.resolveColor( - tilePixelRGBA.slice(0, 3), - state.availableColors, - !state.paintUnavailablePixels // Use same parameter as target pixel - ); - const isMatch = mappedCanvasColor.id === targetPixelInfo.mappedColorId; - if (isMatch) { - alreadyPaintedCount++; - // Mark as painted in map but DO NOT increment progress counter - // Progress should only reflect actual painting sequence position - Utils.markPixelPainted(x, y, regionX + adderX, regionY + adderY); - continue; // Skip already painted pixels - } - } - } catch (e) { - // If we can't check, include the pixel (better to attempt than skip) - } - - // Add eligible unpainted pixel to list - eligibleCoords.push([x, y, targetPixelInfo]); - } - - // Mark pre-filtering as done for this session - state.preFilteringDone = true; - - // Log pre-filtering results - if (alreadyPaintedCount > 0) { - console.log(`✓ Pre-filter complete: ${alreadyPaintedCount} already painted pixels detected (not added to progress counter)`); - console.log('ℹ️ This detection will not happen again until a new image/save is loaded'); - console.log('📊 Progress counter only reflects actual painting sequence position'); - // No need to update stats since progress wasn't changed - } - skippedPixels.alreadyPainted = alreadyPaintedCount; - } else { - // Pre-filtering already done this session, just filter for basic eligibility - console.log('🔍 Using existing pre-filter results (already done this session)'); - for (const [x, y] of coords) { - const targetPixelInfo = checkPixelEligibility(x, y); - - if (!targetPixelInfo.eligible) { - if (targetPixelInfo.reason !== 'alreadyPainted') { - skippedPixels[targetPixelInfo.reason]++; - } - continue; - } - - // Only include pixels that haven't been marked as painted yet - let absX = startX + x; - let absY = startY + y; - let adderX = Math.floor(absX / 1000); - let adderY = Math.floor(absY / 1000); - - if (!Utils.isPixelPainted(x, y, regionX + adderX, regionY + adderY)) { - eligibleCoords.push([x, y, targetPixelInfo]); - } - } - } - - // Group pixels by color if color-by-color mode is enabled - let pixelsToProcess = eligibleCoords; - if (state.paintingOrder === 'color-by-color') { - console.log('🎨 Color-by-color mode enabled - grouping pixels by color'); - - // Group pixels by color ID - const colorGroups = new Map(); - for (const [x, y, targetPixelInfo] of eligibleCoords) { - const colorId = targetPixelInfo.mappedColorId; - if (!colorGroups.has(colorId)) { - colorGroups.set(colorId, []); - } - colorGroups.get(colorId).push([x, y, targetPixelInfo]); - } - - // Log color groups - console.log(`📊 Found ${colorGroups.size} different colors to paint:`); - for (const [colorId, pixels] of colorGroups.entries()) { - const colorInfo = Object.values(CONFIG.COLOR_MAP).find(c => c.id === colorId); - const colorName = colorInfo ? colorInfo.name : `Color ${colorId}`; - console.log(` 🎨 ${colorName} (ID: ${colorId}): ${pixels.length} pixels`); - } - - // Process colors one by one - const sortedColorGroups = Array.from(colorGroups.entries()).sort((a, b) => a[0] - b[0]); - - // If we have a current painting color, resume from that color - let startIndex = 0; - if (state.currentPaintingColor !== null) { - startIndex = sortedColorGroups.findIndex(([colorId]) => colorId === state.currentPaintingColor); - if (startIndex === -1) startIndex = 0; - console.log(`🔄 Resuming from color ID ${state.currentPaintingColor} (index ${startIndex})`); - } - - // Flatten the groups starting from the current color - pixelsToProcess = []; - for (let i = startIndex; i < sortedColorGroups.length; i++) { - const [colorId, pixels] = sortedColorGroups[i]; - // Avoid using spread or concat with very large arrays to prevent call stack/alloc overhead - for (let j = 0; j < pixels.length; j++) { - pixelsToProcess.push(pixels[j]); - } - } - - console.log(`✅ Prepared ${pixelsToProcess.length} pixels for color-by-color painting`); - } - - // Paint eligible pixels (already pre-filtered, no duplicate checks) - outerLoop: for (const [x, y, targetPixelInfo] of pixelsToProcess) { - // Track current color being painted in color-by-color mode - if (state.paintingOrder === 'color-by-color') { - if (state.currentPaintingColor !== targetPixelInfo.mappedColorId) { - state.currentPaintingColor = targetPixelInfo.mappedColorId; - const colorInfo = Object.values(CONFIG.COLOR_MAP).find(c => c.id === state.currentPaintingColor); - const colorName = colorInfo ? colorInfo.name : `Color ${state.currentPaintingColor}`; - console.log(`🎨 Now painting: ${colorName} (ID: ${state.currentPaintingColor})`); - - // Update UI to show current color - const statusDiv = document.getElementById('statusDiv'); - if (statusDiv) { - const colorMessage = Utils.t('currentlyPaintingColor', { colorName }); - const colorIndicator = document.getElementById('currentColorIndicator'); - if (colorIndicator) { - colorIndicator.textContent = colorMessage; - } else { - const indicator = document.createElement('div'); - indicator.id = 'currentColorIndicator'; - indicator.textContent = colorMessage; - indicator.style.cssText = 'margin-top: 8px; padding: 8px; background: rgba(255,255,255,0.1); border-radius: 6px; font-weight: bold;'; - statusDiv.appendChild(indicator); - } - } - } - } - - if (state.stopFlag) { - if (pixelBatch && pixelBatch.pixels.length > 0) { - console.log(`🎯 Sending last batch before stop with ${pixelBatch.pixels.length} pixels`); - await flushPixelBatch(pixelBatch); - } - state.lastPosition = { x, y }; - // Show paused coordinates in UI with proper translation template - // Use last painted position if available, otherwise use current position - const pausedX = state.lastPaintedPosition.x || x; - const pausedY = state.lastPaintedPosition.y || y; - updateUI('paintingPaused', 'warning', { x: pausedX, y: pausedY }); - console.log(`⏸️ Painting paused after last painted coordinates (${pausedX}, ${pausedY})`); - return 'stopped'; - } - - // Check if we have charges left (local count, no API call) - if (state.displayCharges <= 0) { - // console.log("Try to buy paint charges"); - // await purchase("paint_charges"); - await updateStats(); - if (state.displayCharges <= 0) { - console.log('⚡ No charges left (local count), ending painting session'); - if (pixelBatch && pixelBatch.pixels.length > 0) { - console.log(`🎯 Sending final batch with ${pixelBatch.pixels.length} pixels`); - await flushPixelBatch(pixelBatch); - } - state.lastPosition = { x, y }; - return 'charges_depleted'; - } - // else { - // console.log(`🔋 Charges after purchase: ${state.displayCharges}, continuing painting`); - // } - } - - let absX = startX + x; - let absY = startY + y; - - let adderX = Math.floor(absX / 1000); - let adderY = Math.floor(absY / 1000); - let pixelX = absX % 1000; - let pixelY = absY % 1000; - - // CRITICAL FIX: Always check if pixel is already painted (both locally and on canvas) - if (Utils.isPixelPainted(x, y, regionX + adderX, regionY + adderY)) { - console.log(`⏭️ Skipping already painted pixel at (${x}, ${y}) - marked in local map`); - continue; // Skip already painted pixels - } - - // REAL-TIME CANVAS CHECK: Verify against actual canvas state to prevent overpainting - try { - const existingColorRGBA = await overlayManager.getTilePixelColor( - regionX + adderX, - regionY + adderY, - pixelX, - pixelY - ).catch(() => null); - - if (existingColorRGBA && Array.isArray(existingColorRGBA)) { - const [er, eg, eb] = existingColorRGBA; - const existingMappedColor = Utils.resolveColor( - [er, eg, eb], - state.availableColors, - !state.paintUnavailablePixels - ); - const isAlreadyCorrect = existingMappedColor.id === targetPixelInfo.mappedColorId; - - if (isAlreadyCorrect) { - console.log(`✅ Pixel at (${x}, ${y}) already has correct color (${existingMappedColor.id}) - marking as painted`); - // Mark it as painted in local map but DO NOT increment progress counter - // Progress should only reflect actual painting sequence position - Utils.markPixelPainted(x, y, regionX + adderX, regionY + adderY); - continue; // Skip painting this pixel - } - } - } catch (e) { - // If we can't check the canvas, proceed with painting (better to attempt than skip) - console.warn(`⚠️ Could not verify canvas state for pixel (${x}, ${y}), proceeding with paint:`, e.message); - } - - const targetMappedColorId = targetPixelInfo.mappedColorId; - - // Set up pixel batch for new region if needed - if ( - !pixelBatch || - pixelBatch.regionX !== regionX + adderX || - pixelBatch.regionY !== regionY + adderY - ) { - if (pixelBatch && pixelBatch.pixels.length > 0) { - console.log(`🌍 Sending region-change batch with ${pixelBatch.pixels.length} pixels`); - const success = await flushPixelBatch(pixelBatch); - if (!success) { - console.error(`❌ Batch failed permanently after retries. Stopping painting.`); - state.stopFlag = true; - return 'stopped'; - } - await updateStats(); - } - - pixelBatch = { - regionX: regionX + adderX, - regionY: regionY + adderY, - pixels: [], - }; - } - - // Add pixel to batch (no need to check again - already pre-filtered) - pixelBatch.pixels.push({ - x: pixelX, - y: pixelY, - color: targetMappedColorId, - localX: x, - localY: y, - }); - - // Send batch if it's full - const maxBatchSize = calculateBatchSize(); - if (pixelBatch.pixels.length >= maxBatchSize) { - console.log(`📦 Sending batch with ${pixelBatch.pixels.length} pixels`); - const success = await flushPixelBatch(pixelBatch); - if (!success) { - console.error(`❌ Batch failed permanently after retries. Stopping painting.`); - state.stopFlag = true; - return 'stopped'; - } - pixelBatch.pixels = []; - await updateStats(); - } - } - - // Send final batch if any pixels remain - if (pixelBatch && pixelBatch.pixels.length > 0 && !state.stopFlag) { - console.log(`🏁 Sending final batch with ${pixelBatch.pixels.length} pixels`); - const success = await flushPixelBatch(pixelBatch); - if (!success) { - console.warn(`⚠️ Final batch failed with ${pixelBatch.pixels.length} pixels`); - } - } - - // If we completed the entire coordinate loop, image is complete - return state.stopFlag ? 'stopped' : 'completed'; - - } finally { - // Log skip statistics for this session - console.log(`📊 Session Statistics:`); - console.log(` New pixels painted: ${state.paintedPixels - (skippedPixels.alreadyPainted || 0)}`); - console.log(` Already painted detected: ${skippedPixels.alreadyPainted}`); - console.log(` Total progress: ${state.paintedPixels}`); - console.log(` Pre-filtered - Transparent: ${skippedPixels.transparent}`); - console.log(` Pre-filtered - White: ${skippedPixels.white}`); - console.log(` Pre-filtered - Color Unavailable: ${skippedPixels.colorUnavailable}`); - } - } - - // Phase 2: Execute cooldown period - wait for target charges (NO token regeneration) - async function executeCooldownPeriod() { - console.log('⏱️ Entering cooldown period - waiting for target charges'); - console.log('🚫 NO token regeneration during cooldown (even if expired/invalid)'); - - // Check initial charges to calculate wait time - let chargeCheckCount = 0; - // const maxChargeChecks = 10; // REMOVED: No limit on API calls during cooldown - - while (!state.stopFlag) { - const threshold = Math.max(1, state.cooldownChargeThreshold || 1); - const accounts = accountManager.getAllAccounts(); - let anyReady = false; - let bestMs = Infinity; - let currentCharges = ChargeModel.getForCurrent()?.charges || 0; - - for (const acc of accounts) { - const node = ChargeModel.get(acc.token); - if (!node) continue; - if (node.charges >= threshold) { - anyReady = true; - break; - } - const ms = ChargeModel.predictTimeToReach(acc.token, threshold); - if (ms < bestMs) bestMs = ms; - } - - if (anyReady) { - console.log(`✅ Cooldown target reached locally (≥${threshold})`); - NotificationManager.maybeNotifyChargesReached(true); - await updateStats(); - return 'target_reached'; - } - - const waitMs = Number.isFinite(bestMs) ? Math.max(1000, Math.min(bestMs, 10000)) : 10000; - updateUI('noChargesThreshold', 'warning', { - time: Utils.msToTimeText(waitMs), - threshold, - current: currentCharges, - }); - await updateStats(); - await Utils.sleep(waitMs); - } - - return 'stopped'; - } - - // Phase 3: Regenerate token for new painting session - async function regenerateTokenForNewSession() { - console.log('🔑 Regenerating token for new painting session'); - - try { - // Force regenerate token for new session - await ensureToken(true); // forceRefresh = true - - if (!getTurnstileToken()) { - console.error('❌ Failed to generate token for new session'); - return false; - } - - console.log('✅ Token regenerated successfully for new session'); - return true; - } catch (error) { - console.error('❌ Token regeneration failed:', error); - return false; - } - } - - // Finalize painting process cleanup - async function finalizePaintingProcess() { - console.log('🧹 Finalizing painting process'); - - if (window._chargesInterval) { - clearInterval(window._chargesInterval); - window._chargesInterval = null; - } - - if (state.stopFlag) { - // Save progress when stopped to preserve painted map - Utils.saveProgress(); - } else { - updateUI('paintingComplete', 'success', { count: state.paintedPixels }); - state.lastPosition = { x: 0, y: 0 }; // Only reset when truly complete - Utils.saveProgress(); // Save final complete state - overlayManager.clear(); - const toggleOverlayBtn = document.getElementById('toggleOverlayBtn'); - if (toggleOverlayBtn) { - toggleOverlayBtn.classList.remove('active'); - toggleOverlayBtn.disabled = true; - } - } - } - - // Helper function to check pixel eligibility (shared by painting functions) - function checkPixelEligibility(x, y) { - const { width, height, pixels } = state.imageData; - const transparencyThreshold = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; - - // CRITICAL FIX: Check module availability before processing - if (!Utils || typeof Utils.isWhitePixel !== 'function') { - console.error('❌ Utils module not available for pixel eligibility check'); - return { - eligible: false, - reason: 'moduleUnavailable', - }; - } - - const idx = (y * width + x) * 4; - const r = pixels[idx], - g = pixels[idx + 1], - b = pixels[idx + 2], - a = pixels[idx + 3]; - - if (!state.paintTransparentPixels && a < transparencyThreshold) - return { - eligible: false, - reason: 'transparent', - }; - if (!state.paintWhitePixels && Utils.isWhitePixel(r, g, b)) - return { - eligible: false, - reason: 'white', - }; - - let targetRgb = Utils.isWhitePixel(r, g, b) - ? [255, 255, 255] - : Utils.findClosestPaletteColor(r, g, b, state.activeColorPalette); - - const mappedTargetColorId = Utils.resolveColor( - targetRgb, - state.availableColors, - !state.paintUnavailablePixels - ); - - if (!state.paintUnavailablePixels && !mappedTargetColorId.id) { - return { - eligible: false, - reason: 'colorUnavailable', - r, - g, - b, - a, - mappedColorId: mappedTargetColorId.id, - }; - } - return { eligible: true, r, g, b, a, mappedColorId: mappedTargetColorId.id }; - } - - // Helper function to skip pixel and log the reason (minimized logging) - function skipPixel(reason, id, rgb, x, y, skippedPixels) { - // Minimize logging to prevent console flooding - only log non-routine skips - if (reason !== 'transparent' && reason !== 'alreadyPainted') { - console.log(`Skipped pixel for ${reason} (id: ${id}, (${rgb.join(', ')})) at (${x}, ${y})`); - } - skippedPixels[reason]++; - } - function calculateBatchSize() { - let targetBatchSize; - - // If speed control is disabled, use all available charges - if (!CONFIG.PAINTING_SPEED_ENABLED) { - targetBatchSize = state.displayCharges; - console.log(`🚀 Speed control disabled: using all ${targetBatchSize} available charges`); - return Math.max(1, targetBatchSize); - } - - // CRITICAL FIX: When speed control is ENABLED, use actual available charges as the batch size - // This ensures bot sends exactly the number of pixels matching available charges - // Example: 75 charges → send 75 pixels, 14 charges → send 14 pixels - const availableCharges = state.displayCharges; - - if (state.batchMode === 'random') { - // Generate random batch size within the specified range - const min = Math.max(1, state.randomBatchMin); - const max = Math.max(min, state.randomBatchMax); - targetBatchSize = Math.floor(Math.random() * (max - min + 1)) + min; - console.log(`🎲 Random batch size generated: ${targetBatchSize} (range: ${min}-${max})`); - } else { - // Normal mode - use the fixed paintingSpeed value - targetBatchSize = state.paintingSpeed; - } - - // FIXED: Use actual available charges as the maximum batch size - // This matches the available pixels exactly (e.g., 75 charges = 75 pixel batch) - const finalBatchSize = Math.min(targetBatchSize, availableCharges); - - console.log(`📊 Batch size: ${finalBatchSize} (target: ${targetBatchSize}, available: ${availableCharges})`); - - return Math.max(1, finalBatchSize); - } - - // Helper function to retry batch until success with exponential backoff - async function sendBatchWithRetry(pixels, regionX, regionY, maxRetries = MAX_BATCH_RETRIES) { - let attempt = 0; - while (attempt < maxRetries && !state.stopFlag) { - attempt++; - console.log( - `🔄 Attempting to send batch (attempt ${attempt}/${maxRetries}) for region ${regionX},${regionY} with ${pixels.length} pixels` - ); - - const result = await sendPixelBatch(pixels, regionX, regionY); - - if (result === true) { - console.log(`✅ Batch succeeded on attempt ${attempt}`); - return true; - } else if (result === 'token_error') { - console.log(`🔑 Token error on attempt ${attempt} - no token available during processing`); - console.log(`❌ Stopping batch processing - tokens must be generated at startup/start button only`); - updateUI('captchaFailed', 'error'); - await Utils.sleep(2000); // Wait longer before retrying after token failure - continue; // Continue to retry until maxRetries reached - } else if (result === 'token_regenerated') { - console.log(`🔄 Token regenerated on attempt ${attempt} after 403 error - retrying batch`); - const pausedX = state.lastPaintedPosition.x; - const pausedY = state.lastPaintedPosition.y; - updateUI('paintingPaused', 'warning', { x: pausedX, y: pausedY }); - // Don't count token regeneration as a failed attempt, retry immediately - attempt--; - await Utils.sleep(500); // Brief pause before retry - continue; - } else if (result === 'token_regeneration_failed') { - console.log(`❌ Token regeneration failed on attempt ${attempt} after 403 error`); - updateUI('captchaFailed', 'error'); - return false; // Stop processing if we can't get a valid token - } else if (result === 'invalid_token_error') { - console.log(`🔑 Invalid token detected on attempt ${attempt}, regenerating...`); - updateUI('captchaSolving', 'warning'); - try { - await handleCaptcha(true); // Allow generation for invalid token cases - // Don't count token regeneration as a failed attempt - attempt--; - continue; - } catch (e) { - console.error(`❌ Token regeneration failed after invalid token on attempt ${attempt}:`, e); - updateUI('captchaFailed', 'error'); - // Wait longer before retrying after token failure - await Utils.sleep(5000); - } - } else { - console.warn(`⚠️ Batch failed on attempt ${attempt}, retrying...`); - // Exponential backoff with jitter - const baseDelay = Math.min(1000 * Math.pow(2, attempt - 1), 30000); // Max 30s - const jitter = Math.random() * 1000; // Add up to 1s random delay - await Utils.sleep(baseDelay + jitter); - } - } - - if (attempt >= maxRetries) { - console.error( - `❌ Batch failed after ${maxRetries} attempts (MAX_BATCH_RETRIES=${MAX_BATCH_RETRIES}). This will stop painting to prevent infinite loops.` - ); - updateUI('paintingError', 'error'); - return false; - } - - return false; - } - - async function sendPixelBatch(pixelBatch, regionX, regionY) { - let token = getTurnstileToken(); - - // Don't auto-generate tokens during processing - return error if no token available - if (!token) { - console.warn('⚠️ No token available and auto-generation disabled during processing'); - return 'token_error'; - } - - const coords = new Array(pixelBatch.length * 2); - const colors = new Array(pixelBatch.length); - for (let i = 0; i < pixelBatch.length; i++) { - const pixel = pixelBatch[i]; - coords[i * 2] = pixel.x; - coords[i * 2 + 1] = pixel.y; - colors[i] = pixel.color; - } - - try { - const payload = { coords, colors, t: token, fp: fpStr32 }; - var wasmtoken = await createWasmToken(regionX, regionY, payload); - const res = await fetch(`https://backend.wplace.live/s0/pixel/${regionX}/${regionY}`, { - method: 'POST', - headers: { 'Content-Type': 'text/plain;charset=UTF-8', "x-pawtect-token": wasmtoken }, - credentials: 'include', - body: JSON.stringify(payload), - }); - - if (res.status === 403) { - let data = null; - try { - data = await res.json(); - } catch (_) { } - console.error('❌ 403 Forbidden. Token invalid during painting - regeneration allowed.'); - - // 403 errors during painting allow token regeneration per workflow requirements - console.log('� Token invalid (403) during painting - regenerating token as allowed by workflow'); - setTurnstileToken(null); - createTokenPromise(); - - // Attempt to regenerate token immediately - const newToken = await ensureToken(true); - if (newToken) { - console.log('✅ Token regenerated after 403 error, returning regenerate signal'); - return 'token_regenerated'; - } else { - console.error('❌ Failed to regenerate token after 403 error'); - return 'token_regeneration_failed'; - } - } - - const data = await res.json(); - return data?.painted === pixelBatch.length; - } catch (e) { - console.error('Batch paint request failed:', e); - return false; - } - } - - function saveBotSettings() { - try { - const settings = { - paintingSpeed: state.paintingSpeed, - paintingSpeedEnabled: document.getElementById('enableSpeedToggle')?.checked, - batchMode: state.batchMode, // "normal" or "random" - paintingOrder: state.paintingOrder, // "sequential" or "color-by-color" - randomBatchMin: state.randomBatchMin, - randomBatchMax: state.randomBatchMax, - cooldownChargeThreshold: state.cooldownChargeThreshold, - tokenSource: state.tokenSource, // "generator", "hybrid", or "manual" - minimized: state.minimized, - overlayOpacity: state.overlayOpacity, - blueMarbleEnabled: document.getElementById('enableBlueMarbleToggle')?.checked, - ditheringEnabled: state.ditheringEnabled, - colorMatchingAlgorithm: state.colorMatchingAlgorithm, - enableChromaPenalty: state.enableChromaPenalty, - chromaPenaltyWeight: state.chromaPenaltyWeight, - customTransparencyThreshold: state.customTransparencyThreshold, - customWhiteThreshold: state.customWhiteThreshold, - paintWhitePixels: state.paintWhitePixels, - paintTransparentPixels: state.paintTransparentPixels, - resizeSettings: state.resizeSettings, - paintUnavailablePixels: state.paintUnavailablePixels, - coordinateMode: state.coordinateMode, - coordinateDirection: state.coordinateDirection, - coordinateSnake: state.coordinateSnake, - blockWidth: state.blockWidth, - blockHeight: state.blockHeight, // Save ignore mask (as base64) with its dimensions - resizeIgnoreMask: - state.resizeIgnoreMask && - state.resizeSettings && - state.resizeSettings.width * state.resizeSettings.height === state.resizeIgnoreMask.length - ? { - w: state.resizeSettings.width, - h: state.resizeSettings.height, - data: btoa(String.fromCharCode(...state.resizeIgnoreMask)), - } - : null, // Notifications - notificationsEnabled: state.notificationsEnabled, - notifyOnChargesReached: state.notifyOnChargesReached, - notifyOnlyWhenUnfocused: state.notifyOnlyWhenUnfocused, - notificationIntervalMinutes: state.notificationIntervalMinutes, - originalImage: state.originalImage, - ditheringMigrated: true, // Migration flag for dithering default change - blueMarbleMigrated: true, // Migration flag for blue marble default change - // NOTE: paintingMode is intentionally NOT saved - always defaults to 'auto' on page load - // Save region and startPosition for assist mode coordinate calculations - region: state.region, - startPosition: state.startPosition, - }; - CONFIG.PAINTING_SPEED_ENABLED = settings.paintingSpeedEnabled; - // AUTO_CAPTCHA_ENABLED is always true - no need to save/load - - localStorage.setItem('wplace-bot-settings', JSON.stringify(settings)); - } catch (e) { - console.warn('Could not save bot settings:', e); - } - } - - function loadBotSettings() { - try { - const saved = localStorage.getItem('wplace-bot-settings'); - if (!saved) return; - const settings = JSON.parse(saved); - - state.paintingSpeed = settings.paintingSpeed || CONFIG.PAINTING_SPEED.DEFAULT; - state.batchMode = settings.batchMode || CONFIG.BATCH_MODE; // Default to "normal" - state.paintingOrder = settings.paintingOrder || CONFIG.PAINTING_ORDER; // Default to "sequential" - state.randomBatchMin = settings.randomBatchMin || CONFIG.RANDOM_BATCH_RANGE.MIN; - state.randomBatchMax = settings.randomBatchMax || CONFIG.RANDOM_BATCH_RANGE.MAX; - state.cooldownChargeThreshold = - settings.cooldownChargeThreshold || CONFIG.COOLDOWN_CHARGE_THRESHOLD; - state.tokenSource = settings.tokenSource || CONFIG.TOKEN_SOURCE; // Default to "generator" - state.minimized = settings.minimized ?? false; - CONFIG.PAINTING_SPEED_ENABLED = settings.paintingSpeedEnabled ?? false; - CONFIG.AUTO_CAPTCHA_ENABLED = settings.autoCaptchaEnabled ?? false; - state.overlayOpacity = settings.overlayOpacity ?? CONFIG.OVERLAY.OPACITY_DEFAULT; - - // MIGRATION: Force enable blue marble for existing users if not explicitly set - // This ensures the new default (blue marble ON) is applied to existing users - if (settings.blueMarbleMigrated !== true) { - state.blueMarbleEnabled = true; - console.log('🔄 Migrated: Blue Marble enabled (new default)'); - // Save the migration flag - settings.blueMarbleMigrated = true; - localStorage.setItem('wplace-bot-settings', JSON.stringify(settings)); - } else { - state.blueMarbleEnabled = settings.blueMarbleEnabled ?? CONFIG.OVERLAY.BLUE_MARBLE_DEFAULT; - } - - // MIGRATION: Force reset dithering to false if not explicitly set in saved settings - // This ensures the new default (dithering OFF) is applied to existing users - if (settings.ditheringMigrated !== true) { - state.ditheringEnabled = false; - console.log('🔄 Migrated: Dithering reset to OFF (new default)'); - // Save the migration flag - settings.ditheringMigrated = true; - localStorage.setItem('wplace-bot-settings', JSON.stringify(settings)); - } else { - state.ditheringEnabled = settings.ditheringEnabled ?? false; - } - - state.colorMatchingAlgorithm = settings.colorMatchingAlgorithm || 'lab'; - state.enableChromaPenalty = settings.enableChromaPenalty ?? true; - state.chromaPenaltyWeight = settings.chromaPenaltyWeight ?? 0.15; - state.customTransparencyThreshold = - settings.customTransparencyThreshold ?? CONFIG.TRANSPARENCY_THRESHOLD; - state.customWhiteThreshold = settings.customWhiteThreshold ?? CONFIG.WHITE_THRESHOLD; - state.paintWhitePixels = settings.paintWhitePixels ?? true; - state.paintTransparentPixels = settings.paintTransparentPixels ?? false; - state.resizeSettings = settings.resizeSettings ?? null; - state.originalImage = settings.originalImage ?? null; - state.paintUnavailablePixels = settings.paintUnavailablePixels ?? CONFIG.PAINT_UNAVAILABLE; - state.coordinateMode = settings.coordinateMode ?? CONFIG.COORDINATE_MODE; - state.coordinateDirection = settings.coordinateDirection ?? CONFIG.COORDINATE_DIRECTION; - state.coordinateSnake = settings.coordinateSnake ?? CONFIG.COORDINATE_SNAKE; - state.blockWidth = settings.blockWidth ?? CONFIG.COORDINATE_BLOCK_WIDTH; - state.blockHeight = settings.blockHeight ?? CONFIG.COORDINATE_BLOCK_HEIGHT; - // Notifications - state.notificationsEnabled = settings.notificationsEnabled ?? CONFIG.NOTIFICATIONS.ENABLED; - state.notifyOnChargesReached = - settings.notifyOnChargesReached ?? CONFIG.NOTIFICATIONS.ON_CHARGES_REACHED; - state.notifyOnlyWhenUnfocused = - settings.notifyOnlyWhenUnfocused ?? CONFIG.NOTIFICATIONS.ONLY_WHEN_UNFOCUSED; - state.notificationIntervalMinutes = - settings.notificationIntervalMinutes ?? CONFIG.NOTIFICATIONS.REPEAT_MINUTES; - // NOTE: paintingMode is NOT restored - always defaults to 'auto' on page load - - // Restore region and startPosition for assist mode coordinate calculations - if (settings.region) { - state.region = settings.region; - console.log('✅ Restored region from save file:', state.region); - } - if (settings.startPosition) { - state.startPosition = settings.startPosition; - console.log('✅ Restored startPosition from save file:', state.startPosition); - } - - // Restore ignore mask if dims match current resizeSettings - if ( - settings.resizeIgnoreMask && - settings.resizeIgnoreMask.data && - state.resizeSettings && - settings.resizeIgnoreMask.w === state.resizeSettings.width && - settings.resizeIgnoreMask.h === state.resizeSettings.height - ) { - try { - const bin = atob(settings.resizeIgnoreMask.data); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i); - state.resizeIgnoreMask = arr; - } catch { - state.resizeIgnoreMask = null; - } - } else { - state.resizeIgnoreMask = null; - } - // Initialize coordinate generation UI - const coordinateModeSelect = document.getElementById('coordinateModeSelect'); - if (coordinateModeSelect) coordinateModeSelect.value = state.coordinateMode; - - const coordinateDirectionSelect = document.getElementById('coordinateDirectionSelect'); - if (coordinateDirectionSelect) coordinateDirectionSelect.value = state.coordinateDirection; - - const coordinateSnakeToggle = document.getElementById('coordinateSnakeToggle'); - if (coordinateSnakeToggle) coordinateSnakeToggle.checked = state.coordinateSnake; - - const settingsContainer = document.getElementById('wplace-settings-container'); - const directionControls = settingsContainer.querySelector('#directionControls'); - const snakeControls = settingsContainer.querySelector('#snakeControls'); - const blockControls = settingsContainer.querySelector('#blockControls'); - Utils.updateCoordinateUI({ - mode: state.coordinateMode, - directionControls, - snakeControls, - blockControls, - }); - - const paintUnavailablePixelsToggle = document.getElementById('paintUnavailablePixelsToggle'); - if (paintUnavailablePixelsToggle) { - paintUnavailablePixelsToggle.checked = state.paintUnavailablePixels; - } - - const settingsPaintWhiteToggle = settingsContainer.querySelector('#settingsPaintWhiteToggle'); - if (settingsPaintWhiteToggle) { - settingsPaintWhiteToggle.checked = state.paintWhitePixels; - } - - const settingsPaintTransparentToggle = settingsContainer.querySelector( - '#settingsPaintTransparentToggle' - ); - if (settingsPaintTransparentToggle) { - settingsPaintTransparentToggle.checked = state.paintTransparentPixels; - } - - const speedSlider = document.getElementById('speedSlider'); - const speedInput = document.getElementById('speedInput'); - const speedValue = document.getElementById('speedValue'); - if (speedSlider) speedSlider.value = state.paintingSpeed; - if (speedInput) speedInput.value = state.paintingSpeed; - if (speedValue) speedValue.textContent = `pixels`; - - const enableSpeedToggle = document.getElementById('enableSpeedToggle'); - if (enableSpeedToggle) enableSpeedToggle.checked = CONFIG.PAINTING_SPEED_ENABLED; - - // Painting order UI initialization - const paintingOrderSelect = document.getElementById('paintingOrderSelect'); - if (paintingOrderSelect) paintingOrderSelect.value = state.paintingOrder; - - // Batch mode UI initialization - const batchModeSelect = document.getElementById('batchModeSelect'); - if (batchModeSelect) batchModeSelect.value = state.batchMode; - - const normalBatchControls = document.getElementById('normalBatchControls'); - const randomBatchControls = document.getElementById('randomBatchControls'); - - // Show/hide appropriate controls based on batch mode - if (normalBatchControls && randomBatchControls) { - if (state.batchMode === 'random') { - normalBatchControls.style.display = 'none'; - randomBatchControls.style.display = 'block'; - } else { - normalBatchControls.style.display = 'block'; - randomBatchControls.style.display = 'none'; - } - } - - const randomBatchMin = document.getElementById('randomBatchMin'); - if (randomBatchMin) randomBatchMin.value = state.randomBatchMin; - - const randomBatchMax = document.getElementById('randomBatchMax'); - if (randomBatchMax) randomBatchMax.value = state.randomBatchMax; - - // AUTO_CAPTCHA_ENABLED is always true - no toggle to set - - const cooldownSlider = document.getElementById('cooldownSlider'); - const cooldownInput = document.getElementById('cooldownInput'); - const cooldownValue = document.getElementById('cooldownValue'); - if (cooldownSlider) cooldownSlider.value = state.cooldownChargeThreshold; - if (cooldownInput) cooldownInput.value = state.cooldownChargeThreshold; - if (cooldownValue) cooldownValue.textContent = `${Utils.t('charges')}`; - - const overlayOpacitySlider = document.getElementById('overlayOpacitySlider'); - if (overlayOpacitySlider) overlayOpacitySlider.value = state.overlayOpacity; - const overlayOpacityValue = document.getElementById('overlayOpacityValue'); - if (overlayOpacityValue) - overlayOpacityValue.textContent = `${Math.round(state.overlayOpacity * 100)}%`; - const enableBlueMarbleToggle = document.getElementById('enableBlueMarbleToggle'); - if (enableBlueMarbleToggle) enableBlueMarbleToggle.checked = state.blueMarbleEnabled; - - const tokenSourceSelect = document.getElementById('tokenSourceSelect'); - if (tokenSourceSelect) tokenSourceSelect.value = state.tokenSource; - - const colorAlgorithmSelect = document.getElementById('colorAlgorithmSelect'); - if (colorAlgorithmSelect) colorAlgorithmSelect.value = state.colorMatchingAlgorithm; - const enableChromaPenaltyToggle = document.getElementById('enableChromaPenaltyToggle'); - if (enableChromaPenaltyToggle) enableChromaPenaltyToggle.checked = state.enableChromaPenalty; - const chromaPenaltyWeightSlider = document.getElementById('chromaPenaltyWeightSlider'); - if (chromaPenaltyWeightSlider) chromaPenaltyWeightSlider.value = state.chromaPenaltyWeight; - const chromaWeightValue = document.getElementById('chromaWeightValue'); - if (chromaWeightValue) chromaWeightValue.textContent = state.chromaPenaltyWeight; - const transparencyThresholdInput = document.getElementById('transparencyThresholdInput'); - if (transparencyThresholdInput) - transparencyThresholdInput.value = state.customTransparencyThreshold; - const whiteThresholdInput = document.getElementById('whiteThresholdInput'); - if (whiteThresholdInput) whiteThresholdInput.value = state.customWhiteThreshold; - // Notifications UI - const notifEnabledToggle = document.getElementById('notifEnabledToggle'); - if (notifEnabledToggle) notifEnabledToggle.checked = state.notificationsEnabled; - const notifOnChargesToggle = document.getElementById('notifOnChargesToggle'); - if (notifOnChargesToggle) notifOnChargesToggle.checked = state.notifyOnChargesReached; - const notifOnlyUnfocusedToggle = document.getElementById('notifOnlyUnfocusedToggle'); - if (notifOnlyUnfocusedToggle) - notifOnlyUnfocusedToggle.checked = state.notifyOnlyWhenUnfocused; - const notifIntervalInput = document.getElementById('notifIntervalInput'); - if (notifIntervalInput) notifIntervalInput.value = state.notificationIntervalMinutes; - NotificationManager.resetEdgeTracking(); - } catch (e) { - console.warn('Could not load bot settings:', e); - } - } - - // Initialize Turnstile generator integration - console.log('🚀 WPlace Auto-Image with Turnstile Token Generator loaded'); - console.log('🔑 Turnstile token generator: ALWAYS ENABLED (Background mode)'); - console.log('🎯 Manual pixel captcha solving: Available as fallback/alternative'); - console.log('📱 Turnstile widgets: DISABLED - pure background token generation only!'); - - // Generate fingerprint string for requests - if (!window.WPlaceTokenManager) { - console.error('❌ WPlaceTokenManager not available - dependency loading issue'); - return; - } - const fpStr32 = tokenManager._randStr(32); - console.log('🔑 Generated fingerprint string for API requests'); - - // Function to enable file operations after initial startup setup is complete - function enableFileOperations() { - state.initialSetupComplete = true; - - const loadBtn = document.querySelector('#loadBtn'); - const loadFromFileBtn = document.querySelector('#loadFromFileBtn'); - const uploadBtn = document.querySelector('#uploadBtn'); - - if (loadBtn) { - loadBtn.disabled = false; - loadBtn.title = ''; - // Add a subtle animation to indicate the button is now available - loadBtn.style.animation = 'pulse 0.6s ease-in-out'; - setTimeout(() => { - if (loadBtn) loadBtn.style.animation = ''; - }, 600); - console.log('✅ Load Progress button enabled after initial setup'); - } - - if (loadFromFileBtn) { - loadFromFileBtn.disabled = false; - loadFromFileBtn.title = ''; - // Add a subtle animation to indicate the button is now available - loadFromFileBtn.style.animation = 'pulse 0.6s ease-in-out'; - setTimeout(() => { - if (loadFromFileBtn) loadFromFileBtn.style.animation = ''; - }, 600); - console.log('✅ Load from File button enabled after initial setup'); - } - - if (uploadBtn) { - uploadBtn.disabled = false; - uploadBtn.title = ''; - // Add a subtle animation to indicate the button is now available - uploadBtn.style.animation = 'pulse 0.6s ease-in-out'; - setTimeout(() => { - if (uploadBtn) uploadBtn.style.animation = ''; - }, 600); - console.log('✅ Upload Image button enabled after initial setup'); - } - - // Enable Load Extracted button at the same time as Upload button - const loadExtractedBtn = document.getElementById('loadExtractedBtn'); - if (loadExtractedBtn) { - loadExtractedBtn.disabled = false; - loadExtractedBtn.title = ''; - console.log('✅ Load Extracted button enabled after initial setup'); - } - - // Show a notification that file operations are now available - Utils.showAlert(Utils.t('fileOperationsAvailable'), 'success'); - } - - // Optimized token initialization with better timing and error handling - async function initializeTokenGenerator() { - // Skip if already have valid token - if (isTokenValid()) { - console.log('✅ Valid token already available, skipping initialization'); - updateUI('tokenReady', 'success'); - enableFileOperations(); // Enable file operations since initial setup is complete - return; - } - - try { - console.log('🔧 Initializing Turnstile token generator...'); - updateUI('initializingToken', 'default'); - - console.log('Attempting to load Turnstile script...'); - await Utils.loadTurnstile(); - console.log('Turnstile script loaded. Attempting to generate token...'); - - // Use TokenManager's handleCaptchaWithRetry method instead - const token = await tokenManager.handleCaptchaWithRetry(); - if (token) { - setTurnstileToken(token); - console.log('✅ Startup token generated successfully'); - updateUI('tokenReady', 'success'); - Utils.showAlert(Utils.t('tokenGeneratorReady'), 'success'); - enableFileOperations(); // Enable file operations since initial setup is complete - } else { - console.warn( - '⚠️ Startup token generation failed (no token received), will retry when needed' - ); - updateUI('tokenRetryLater', 'warning'); - // Still enable file operations even if initial token generation fails - // Users can load progress and use manual/hybrid modes - enableFileOperations(); - } - } catch (error) { - console.error('❌ Critical error during Turnstile initialization:', error); // More specific error - updateUI('tokenRetryLater', 'warning'); - // Still enable file operations even if initial setup fails - // Users can load progress and use manual/hybrid modes - enableFileOperations(); - // Don't show error alert for initialization failures, just log them - } - } - - // Load theme preference immediately on startup before creating UI - loadThemePreference(); - applyTheme(); - - var pawtect_chunk = null; - - //find module if pawtect_chunk is null - pawtect_chunk ??= await findTokenModule("pawtect_wasm_bg.wasm"); - - async function createWasmToken(regionX, regionY, payload) { - try { - // Load the Pawtect module and WASM - const mod = await import(new URL('/_app/immutable/chunks/' + pawtect_chunk, location.origin).href); - let wasm; - try { - wasm = await mod._(); - console.log('✅ WASM initialized successfully'); - } catch (wasmError) { - console.error('❌ WASM initialization failed:', wasmError); - return null; - } - try { - try { - const me = await fetch(`https://backend.wplace.live/me`, { credentials: 'include' }).then(r => r.ok ? r.json() : null); - if (me?.id) { - mod.i(me.id); - console.log('✅ user ID set:', me.id); - } - } catch { } - } catch (userIdError) { - console.log('⚠️ Error setting user ID:', userIdError.message); - } - try { - const testUrl = `https://backend.wplace.live/s0/pixel/${regionX}/${regionY}`; - if (mod.r) { - mod.r(testUrl); - console.log('✅ Request URL set:', testUrl); - } else { - console.log('⚠️ request_url function (mod.r) not available'); - } - } catch (urlError) { - console.log('⚠️ Error setting request URL:', urlError.message); - } - - // Create test payload - - console.log('📝 payload:', payload); - - // Encode payload - const enc = new TextEncoder(); - const dec = new TextDecoder(); - const bodyStr = JSON.stringify(payload); - const bytes = enc.encode(bodyStr); - console.log('📏 Payload size:', bytes.length, 'bytes'); - console.log('📄 Payload string:', bodyStr); - - // Allocate WASM memory with validation - let inPtr; - try { - if (!wasm.__wbindgen_malloc) { - console.error('❌ __wbindgen_malloc function not found'); - return null; - } - - inPtr = wasm.__wbindgen_malloc(bytes.length, 1); - console.log('✅ WASM memory allocated, pointer:', inPtr); - - // Copy data to WASM memory - const wasmBuffer = new Uint8Array(wasm.memory.buffer, inPtr, bytes.length); - wasmBuffer.set(bytes); - console.log('✅ Data copied to WASM memory'); - } catch (memError) { - console.error('❌ Memory allocation error:', memError); - return null; - } - - // Call the WASM function - console.log('🚀 Calling get_pawtected_endpoint_payload...'); - let outPtr, outLen, token; - try { - const result = wasm.get_pawtected_endpoint_payload(inPtr, bytes.length); - console.log('✅ Function called, result type:', typeof result, result); - - if (Array.isArray(result) && result.length === 2) { - [outPtr, outLen] = result; - console.log('✅ Got output pointer:', outPtr, 'length:', outLen); - - // Decode the result - const outputBuffer = new Uint8Array(wasm.memory.buffer, outPtr, outLen); - token = dec.decode(outputBuffer); - console.log('✅ Token decoded successfully'); - } else { - console.error('❌ Unexpected function result format:', result); - return null; - } - } catch (funcError) { - console.error('❌ Function call error:', funcError); - console.error('Stack trace:', funcError.stack); - return null; - } - - // Cleanup memory - try { - if (wasm.__wbindgen_free && outPtr && outLen) { - wasm.__wbindgen_free(outPtr, outLen, 1); - console.log('✅ Output memory freed'); - } - if (wasm.__wbindgen_free && inPtr) { - wasm.__wbindgen_free(inPtr, bytes.length, 1); - console.log('✅ Input memory freed'); - } - } catch (cleanupError) { - console.log('⚠️ Cleanup warning:', cleanupError.message); - } - - // Display results - console.log(''); - console.log('🎉 SUCCESS!'); - console.log('🔑 Full token:'); - console.log(token); - return token; - } catch (error) { - console.error('❌ Failed to generate fp parameter:', error); - return null; - } - } - - async function findTokenModule(str) { - console.log('🔎 Searching for wasm Module...'); - const links = Array.from(document.querySelectorAll('link[rel="modulepreload"][href$=".js"]')); - - for (const link of links) { - try { - const url = new URL(link.getAttribute("href"), location.origin).href; - const code = await fetch(url).then(r => r.text()); - if (code.includes(str)) { - console.log('✅ Found wasm Module...'); - return url.split('/').pop(); - } - } catch (e) { /* ignore individual fetch errors */ } - } - console.error('❌ Could not find Pawtect chunk among preloaded modules'); - return null; - } - - async function purchase(type) { - // loadThemePreference() - let id; - let chargeMultiplier; - if (type === "max_charges") { - id = 70; - chargeMultiplier = 5; - } else if (type === "paint_charges") { - id = 80; - chargeMultiplier = 30; - } else { - console.error("Error: Invalid purchase type provided."); - return; - } - const { droplets } = await WPlaceService.getCharges(); - console.log("There are currently : ", droplets, "droplets."); - try { - const amounts = Math.floor(droplets / 500); - if (amounts < 1) { - console.log("Not enough droplets to purchase."); - return; - } - const payload = { - "product": { - "id": id, - "amount": amounts - } - }; - const res = await fetch("https://backend.wplace.live/purchase", { - method: "POST", - headers: { - "Content-Type": "text/plain;charset=UTF-8" - }, - body: JSON.stringify(payload), - credentials: "include" - }); - // POST request completed - const { droplets: newDroplets } = await WPlaceService.getCharges(); - if (droplets != newDroplets) { - console.log("Successfully bought", amounts * chargeMultiplier, type.replace('_', ' '), "."); - return 2; - } else { - console.log("Failed to buy charges"); - return 1; - } - } catch (e) { - console.error("An error occurred during the purchase:", e); - return 0; - } - } - async function swapAccountTrigger(token) { - // STRICT GUARD: Only allow account switching during active painting sessions OR controlled refresh - if (!state.running && !state.isFetchingAllAccounts) { - console.warn('🔒 Account switching blocked - only allowed during active painting or controlled refresh'); - console.warn('🔒 Current state.running:', state.running, 'state.isFetchingAllAccounts:', state.isFetchingAllAccounts); - return false; - } - - localStorage.removeItem("lp"); - if (!token) { - console.error('❌ Cannot swap account: token is null or undefined'); - return false; - } - - console.log(`🔄 Triggering account swap with token: ${token.substring(0, 20)}...`); - console.log('📤 Sending setCookie message to extension...'); - - try { - window.postMessage({ - source: 'my-userscript', - type: 'setCookie', - value: token - }, '*'); - console.log('✅ setCookie message sent successfully'); - } catch (error) { - console.error('❌ Failed to send setCookie message:', error); - return false; - } - - // Wait for background confirmation that cookie was set - const confirmed = await new Promise((resolve) => { - let settled = false; - const timer = setTimeout(() => { - if (!settled) { - settled = true; - console.warn('⚠️ cookieSet confirmation timeout'); - resolve(false); - } - }, 10000); - function onMessage(event) { - if (event.source !== window) return; - const data = event.data || {}; - if (data.type === 'cookieSet') { - if (!settled) { - settled = true; - clearTimeout(timer); - window.removeEventListener('message', onMessage); - resolve(true); - } - } - } - window.addEventListener('message', onMessage); - }); - - if (confirmed) { - console.log('✅ Cookie set confirmed'); - } else { - console.warn('⚠️ Proceeding without cookie confirmation'); - } - return true; - } - async function getAccounts() { - return new Promise((resolve, reject) => { - console.log("Requesting accounts from extension..."); - - // Ask extension for accounts - window.postMessage({ - source: "my-userscript", - type: "getAccounts" - }, "*"); - - function handler(event) { - if (event.source !== window) return; - if (event.data.source !== "extension") return; - if (event.data.type === "accountsData") { - // Remove listener when we get the response - window.removeEventListener("message", handler); - - try { - localStorage.setItem("accounts", JSON.stringify(event.data.accounts)); - console.log("✅ Accounts saved to localStorage:", event.data.accounts); - } catch (e) { - console.error("❌ Failed to save accounts:", e); - } - resolve(event.data.accounts); - } - } - window.addEventListener("message", handler); - }); - } - - - async function fetchAllAccountDetails() { - if (state.isFetchingAllAccounts) { - Utils.showAlert("Already fetching account details.", "warning"); - return; - } - - state.isFetchingAllAccounts = true; - - const refreshBtn = document.getElementById('refreshAllAccountsBtn'); - if (refreshBtn) { - refreshBtn.innerHTML = ''; - refreshBtn.disabled = true; - } - - const accountsListArea = document.getElementById('accountsListArea'); - if (accountsListArea) { - accountsListArea.innerHTML = `
    Loading accounts...
    `; - } - - try { - // First, get accounts from the extension - console.log(`🔄 [FETCH] Requesting accounts from extension...`); - try { - await getAccounts(); - console.log(`✅ [FETCH] Successfully retrieved accounts from extension`); - } catch (error) { - console.warn(`⚠️ [FETCH] Failed to get accounts from extension:`, error); - // Continue anyway in case we have cached accounts - } - - // Load accounts using the new AccountManager - await accountManager.loadAccounts(); - - console.log(`✅ [FETCH] Loaded ${accountManager.getAccountCount()} accounts from storage`); - - // Debug: Check if we actually have accounts - if (accountManager.getAccountCount() === 0) { - console.warn(`⚠️ [FETCH] No accounts found in storage. Check localStorage 'accounts' and chrome.storage 'infoAccounts'`); - - // Check localStorage for accounts - const localStorageAccounts = JSON.parse(localStorage.getItem("accounts")) || []; - console.log(`📋 [DEBUG] localStorage accounts:`, localStorageAccounts); - - // Render empty state and return early - renderAccountsList(); - return; - } - - // Now fetch fresh data for each account - const accounts = accountManager.getAllAccounts(); - if (accounts.length > 0) { - console.log(`🔄 [FETCH] Fetching fresh data for ${accounts.length} accounts...`); - - // Remember the current account so we can switch back - const originalCurrentAccount = accounts.find(acc => acc.isCurrent); - - for (let i = 0; i < accounts.length; i++) { - const account = accounts[i]; - console.log(`📊 [FETCH] Fetching data for account ${i + 1}: ${account.displayName}`); - - try { - // Switch to this account temporarily to fetch its data - console.log(`🔄 [FETCH] Switching to ${account.displayName} to fetch fresh data...`); - await switchToSpecificAccount(account.token, account.displayName); - // await Utils.sleep(500); // Small delay to ensure switch takes effect - - // Fetch fresh account details - const accountData = await WPlaceService.getCharges(); - const accountInfo = await WPlaceService.fetchCheck(); - - // Update account with fresh data - accountManager.updateAccountData(account.token, { - ID: accountData.id || accountInfo.ID, - Charges: Math.floor(accountData.charges || 0), - Max: Math.floor(accountData.max || 0), - Droplets: Math.floor(accountData.droplets || 0), - displayName: accountInfo.Username || accountInfo.name || account.displayName - }); - - console.log(`✅ [FETCH] Updated ${account.displayName}: ⚡${Math.floor(accountData.charges)}/${Math.floor(accountData.max)} 💧${Math.floor(accountData.droplets)}`); - - } catch (error) { - console.warn(`⚠️ [FETCH] Failed to fetch data for ${account.displayName}:`, error); - } - } - - // Switch back to the original current account if there was one - if (originalCurrentAccount) { - console.log(`🔙 [FETCH] Switching back to original current account: ${originalCurrentAccount.displayName}`); - try { - await switchToSpecificAccount(originalCurrentAccount.token, originalCurrentAccount.displayName); - //await Utils.sleep(300); - - // Mark it as current again and sync index - accountManager.updateAccountData(originalCurrentAccount.token, { - isCurrent: true - }); - const list = accountManager.getAllAccounts(); - const idxOriginal = list.findIndex(acc => acc.token === originalCurrentAccount.token); - if (idxOriginal !== -1 && typeof accountManager.setCurrentIndex === 'function') { - accountManager.setCurrentIndex(idxOriginal); - state.accountIndex = idxOriginal; - } - } catch (error) { - console.warn(`⚠️ [FETCH] Failed to switch back to original account:`, error); - } - } - - console.log(`🎯 [FETCH] Completed fetching fresh data for all accounts`); - try { ChargeModel.seedFromAccounts(accountManager.getAllAccounts()); } catch {} - } - - // Render the accounts list with fresh data - renderAccountsList(); - - } catch (error) { - console.error('❌ [FETCH] Error fetching account details:', error); - if (accountsListArea) { - accountsListArea.innerHTML = `
    Error loading accounts.
    `; - } - } finally { - state.isFetchingAllAccounts = false; - if (refreshBtn) { - refreshBtn.innerHTML = ''; - refreshBtn.disabled = false; - } - } - } - - // Function to update current account charges in the account list - async function updateCurrentAccountInList() { - if (accountManager.getAccountCount() === 0) return; - try { - const current = accountManager.getCurrentAccount(); - const node = ChargeModel.get(current?.token); - if (!current || !node) return; - state.displayCharges = Math.floor(node.charges || 0); - state.preciseCurrentCharges = node.charges || 0; - await updateStats(); - // Refresh server-backed fields (droplets/max) to avoid stale/incorrect UI - try { - const live = await WPlaceService.getCharges(); - accountManager.updateAccountData(current.token, { - Charges: Math.floor(node.charges || 0), - Max: Math.floor(live.max || node.max || current.Max || 0), - Droplets: Math.floor(live.droplets || 0) - }); - } catch {} - renderAccountsList(); - } catch (e) { - console.warn('⚠️ updateCurrentAccountInList failed:', e); - } - } - - // Function to update current account spotlight when switching during painting - async function updateCurrentAccountSpotlight() { - if (accountManager.getAccountCount() === 0) return; - try { - const currentAccountData = await WPlaceService.getCharges(); - console.log("Current account after switch:", currentAccountData); - console.log(`🔍 Switched to account with ID: ${currentAccountData.id}`); - - const accounts = accountManager.getAllAccounts(); - const idx = accounts.findIndex(acc => acc.ID === currentAccountData.id); - - if (idx !== -1) { - const currentAccount = accounts[idx]; - const currentAccountInfo = await WPlaceService.fetchCheck(); - - // Sync manager index and flags to actual account - if (typeof accountManager.setCurrentIndex === 'function') { - accountManager.setCurrentIndex(idx); - } else { - accounts.forEach((acc, i) => (acc.isCurrent = i === idx)); - } - - accountManager.updateAccountData(currentAccount.token, { - isCurrent: true, - Charges: Math.floor(currentAccountData.charges), - Max: Math.floor(currentAccountData.max), - Droplets: Math.floor(currentAccountData.droplets), - displayName: currentAccountInfo.Username || currentAccountInfo.name || currentAccount.displayName - }); - - // Mirror to UI state for consistency - state.displayCharges = Math.floor(currentAccountData.charges); - state.preciseCurrentCharges = currentAccountData.charges; - state.cooldown = currentAccountData.cooldown; - state.accountIndex = idx; - - renderAccountsList(); - console.log(`🎯 Updated current account spotlight: ${currentAccount.displayName}`); - } else { - console.warn(`⚠️ Could not find switched account with ID ${currentAccountData.id} in account list`); - } - - // Re-render the account list to show new current account - renderAccountsList(); - - } catch (error) { - console.warn('⚠️ Failed to update account spotlight:', error); - } - } - - function renderAccountsList() { - const accountsListArea = document.getElementById('accountsListArea'); - if (!accountsListArea) return; - - accountsListArea.innerHTML = ''; - - const accounts = accountManager.getAllAccounts(); - console.log(`🔍 [RENDER] Rendering ${accounts.length} accounts`); - - // Debug: Log account data to see what we're working with - accounts.forEach((account, index) => { - console.log(`📊 [RENDER] Account ${index + 1}: ${account.displayName} - ⚡${account.Charges}/${account.Max} 💧${account.Droplets} ${account.isCurrent ? '(CURRENT)' : ''}`); - }); - - if (accounts.length === 0) { - // Don't show any placeholder - just leave empty - console.log(`📝 [RENDER] No accounts to display`); - return; - } - - accounts.forEach((account, index) => { - const item = createAccountItem(account, index); - accountsListArea.appendChild(item); - }); - - console.log(`✅ [RENDER] Successfully rendered ${accounts.length} accounts`); - } - - function createAccountItem(account, index) { - const item = document.createElement('div'); - - // Determine if this is the current account - const isCurrentAccount = account.isCurrent; - const isNextInSequence = accountManager.currentIndex !== -1 && - ((accountManager.currentIndex + 1) % accountManager.getAccountCount()) === index; - - let itemClasses = 'wplace-account-item'; - if (isCurrentAccount) { - itemClasses += ' current'; - } else if (isNextInSequence) { - itemClasses += ' next-in-sequence'; - } - - item.className = itemClasses; - - // Create ordering number element with 1-based index for user display - const orderNumber = document.createElement('div'); - orderNumber.className = 'wplace-account-number'; - orderNumber.textContent = index + 1; // Show 1-based index for user-friendly display - - // Add visual indicator for current position in sequence - if (isCurrentAccount) { - orderNumber.style.background = '#2ecc71'; // Green color - orderNumber.style.color = 'white'; - orderNumber.style.boxShadow = '0 0 10px rgba(46, 204, 113, 0.8)'; - } else if (isNextInSequence) { - orderNumber.style.background = '#f39c12'; // Orange color for next - orderNumber.style.color = 'white'; - orderNumber.style.boxShadow = '0 0 8px rgba(243, 156, 18, 0.6)'; - } - - // Create account details - const details = document.createElement('div'); - details.className = 'wplace-account-details'; - - const accountName = document.createElement('div'); - accountName.className = 'wplace-account-name'; - const displayName = account.displayName || account.name || `Account ${index + 1}`; - accountName.textContent = displayName; - accountName.title = displayName; - - const accountStats = document.createElement('div'); - accountStats.className = 'wplace-account-stats'; - - // Safely handle undefined values - const charges = account.Charges !== undefined ? Math.floor(account.Charges) : 0; - const max = account.Max !== undefined ? Math.floor(account.Max) : 0; - const droplets = account.Droplets !== undefined ? Math.floor(account.Droplets) : 0; - - accountStats.innerHTML = ` - ${charges}/${max} - ${droplets} - `; - - details.appendChild(accountName); - details.appendChild(accountStats); - - // Add status indicators - const status = document.createElement('div'); - status.className = 'wplace-account-status'; - if (isCurrentAccount) { - status.innerHTML = ''; - } else if (isNextInSequence) { - status.innerHTML = ''; - } - - item.appendChild(orderNumber); - item.appendChild(details); - item.appendChild(status); - - return item; - } - - // SIMPLIFIED ACCOUNT SWITCHING - async function switchToNextAccount(accounts) { - console.log(`🔄 [SWITCH] Starting account switch`); - - // Debounce rapid consecutive switches when no painting happened - try { - const now = Date.now(); - const last = state.lastSwitchAt || 0; - const minGap = state.minMsBetweenSwitches || 3000; - const painted = state.paintedSinceSwitch || 0; - if (now - last < minGap && painted === 0) { - console.log(`⏳ [SWITCH] Debounced rapid switch (Δ${now - last}ms < ${minGap}ms and paintedSinceSwitch=${painted}).`); - return false; - } - } catch {} - - // Validate we have accounts - if (accountManager.getAccountCount() === 0) { - console.error('❌ No accounts available for switching'); - return false; - } - - // Capture the pre-switch (current) account to detect stale reads - const preSwitchAccount = accountManager.getCurrentAccount(); - const previousKnownId = preSwitchAccount?.ID || null; - - // Get next account using simplified manager - const nextAccount = accountManager.switchToNext(); - if (!nextAccount) { - console.error('❌ Failed to get next account'); - return false; - } - - console.log(`🎯 [SWITCH] Switching to: ${nextAccount.displayName} (index ${accountManager.currentIndex})`); - - // Ensure token exists - if (!nextAccount.token) { - console.error(`❌ Missing token for account: ${nextAccount.displayName}`); - return false; - } - - console.log(`� [SWITCH] Using token: ${nextAccount.token.substring(0, 20)}...`); - - // Perform the account switch - try { - await swapAccountTrigger(nextAccount.token); - - // Update account index for backward compatibility - state.accountIndex = accountManager.currentIndex; - - console.log(`✅ [SWITCH] Successfully switched to ${nextAccount.displayName}`); - - // Verify backend reflects the new account to avoid stale reads - // Strategy: poll /me until we see an ID different from the pre-switch account's ID - // Only then accept and (if needed) assign the next account's ID. - let verifiedId = null; - for (let attempt = 1; attempt <= 8 && !verifiedId; attempt++) { - try { - const currentAccountData = await WPlaceService.getCharges(); - const curId = currentAccountData?.id; - if (!curId) { - await Utils.sleep(500); - continue; - } - - if (previousKnownId && curId === previousKnownId) { - console.log(`⏳ [SWITCH] Still seeing previous ID ${curId} (attempt ${attempt}/8), waiting...`); - await Utils.sleep(500); - continue; - } - - // If we had a stored ID for the target and it's different from what we see now, - // prefer the live value (curId) and update the stored ID. - if (nextAccount.ID && nextAccount.ID !== curId) { - console.log(`🔁 [SWITCH] Updating stored ID for ${nextAccount.displayName}: ${nextAccount.ID} → ${curId}`); - } - - verifiedId = curId; - break; - } catch (e) { - await Utils.sleep(500); - } - } - - if (!verifiedId) { - console.warn('⚠️ [SWITCH] Could not verify account change via /me after cookie set; skipping ID update but proceeding cautiously.'); - } else { - // Persist verified ID for the next account - if (nextAccount.ID !== verifiedId) { - accountManager.updateAccountData(nextAccount.token, { ID: verifiedId }); - } - } - - // Update the account status and UI after successful switch - await updateCurrentAccountInList(); - - // Record switch time and reset painted counter to prevent rapid bouncing - state.lastSwitchAt = Date.now(); - state.paintedSinceSwitch = 0; - - return true; - } catch (error) { - console.error('❌ [SWITCH] Account switch failed:', error); - return false; - } - } - - // SIMPLIFIED helper function for specific account switching - async function switchToSpecificAccount(token, accountName) { - console.log(`🔄 [SPECIFIC SWITCH] Attempting to switch to account: ${accountName}`); - - // Debounce rapid consecutive switches when no painting happened - try { - const now = Date.now(); - const last = state.lastSwitchAt || 0; - const minGap = state.minMsBetweenSwitches || 3000; - const painted = state.paintedSinceSwitch || 0; - if (now - last < minGap && painted === 0) { - console.log(`⏳ [SPECIFIC SWITCH] Debounced rapid switch (Δ${now - last}ms < ${minGap}ms and paintedSinceSwitch=${painted}).`); - return false; - } - } catch {} - - if (!token) { - console.error('❌ [SPECIFIC SWITCH] Missing token'); - return false; - } - console.log(`🔑 [SPECIFIC SWITCH] Using token: ${token.substring(0, 20)}...`); - - // Capture previous account ID to detect stale responses - let previousId = null; - try { - const prev = await WPlaceService.getCharges(); - previousId = prev?.id || null; - } catch {} - - const ok = await swapAccountTrigger(token); - if (!ok) { - console.error('❌ [SPECIFIC SWITCH] Cookie confirmation failed'); - return false; - } - - // Poll /me until it reflects a different ID than the previous account - let verifiedId = null; - for (let attempt = 1; attempt <= 8 && !verifiedId; attempt++) { - try { - const currentAccountData = await WPlaceService.getCharges(); - const curId = currentAccountData?.id; - if (!curId) { - await Utils.sleep(500); - continue; - } - if (previousId && curId === previousId) { - console.log(`⏳ [SPECIFIC SWITCH] Still seeing previous ID ${curId} (attempt ${attempt}/8), waiting...`); - await Utils.sleep(500); - continue; - } - verifiedId = curId; - break; - } catch { - await Utils.sleep(500); - } - } - - if (!verifiedId) { - console.warn('⚠️ [SPECIFIC SWITCH] Could not verify account change via /me; proceeding.'); - } else { - // Persist ID and mark as current in AccountManager - accountManager.updateAccountData(token, { ID: verifiedId, isCurrent: true }); - } - - // Sync manager index to the token we explicitly switched to - try { - const list = accountManager.getAllAccounts(); - const idxByToken = list.findIndex(acc => acc.token === token); - if (idxByToken !== -1 && typeof accountManager.setCurrentIndex === 'function') { - accountManager.setCurrentIndex(idxByToken); - state.accountIndex = idxByToken; - } - } catch {} - - // Fetch fresh stats for UI/state - const { charges, cooldown, droplets, max } = await WPlaceService.getCharges(); - try { ChargeModel.setFromServer(token, charges, max); } catch {} - state.displayCharges = Math.floor(charges); - state.preciseCurrentCharges = charges; - state.cooldown = cooldown; - Utils.performSmartSave(); - await updateStats(); - - // Update the account status and UI after successful switch - await updateCurrentAccountSpotlight(); - - console.log(`✅ [SPECIFIC SWITCH] Switched to ${accountName} with ${Math.floor(charges)} charges`); - return true; - } - - // Wait for dependencies before initializing UI - async function waitForDependenciesAndInitialize() { - // Wait for all global managers to be available - let attempts = 0; - const maxAttempts = 50; // 5 seconds max wait - - while (attempts < maxAttempts) { - const managers = { - utilsManager: window.globalUtilsManager, - imageProcessor: window.globalImageProcessor, - overlayManager: window.globalOverlayManager, - tokenManager: window.globalTokenManager - }; - - const missingManagers = Object.entries(managers) - .filter(([name, manager]) => !manager) - .map(([name]) => name); - - if (missingManagers.length === 0) { - console.log('✅ All global managers are available, initializing UI...'); - break; - } - - console.log(`⏳ Waiting for managers: ${missingManagers.join(', ')} (attempt ${attempts + 1}/${maxAttempts})`); - await new Promise(resolve => setTimeout(resolve, 100)); - attempts++; - } - - if (attempts >= maxAttempts) { - console.warn('⚠️ Some global managers not available after waiting, proceeding anyway...'); - console.log('Available managers:', { - utilsManager: !!window.globalUtilsManager, - imageProcessor: !!window.globalImageProcessor, - overlayManager: !!window.globalOverlayManager, - tokenManager: !!window.globalTokenManager - }); - } - - return createUI(); - } - - // Helper: iterate over accounts to find one with enough charges; otherwise pick best cooldown - async function selectAndSwitchToAccountWithCharges(minRequired = 1) { - try { - const total = accountManager.getAccountCount(); - if (total <= 1) return false; - const threshold = Math.max(1, minRequired || 1); - - const startIdx = accountManager.currentIndex; - let candidate = null; // {token,name,idx} - let bestWait = Infinity; // ms to reach threshold - - for (let step = 1; step <= total - 1; step++) { - const idx = (startIdx + step) % total; - const acc = accountManager.getAccountByIndex(idx); - if (!acc || !acc.token) continue; - const node = ChargeModel.get(acc.token); - const localCharges = Math.floor(node?.charges || 0); - - console.log(`🔍 [SEARCH] Checking locally ${acc.displayName}: ⚡${localCharges}/${node?.max ?? 0}`); - if (localCharges >= threshold) { - candidate = { token: acc.token, name: acc.displayName, idx }; - break; - } else { - const eta = ChargeModel.predictTimeToReach(acc.token, threshold); - if (eta < bestWait) { - bestWait = eta; - candidate = { token: acc.token, name: acc.displayName, idx }; - } - } - } - - if (candidate && ChargeModel.get(candidate.token)?.charges >= threshold) { - console.log(`✅ [SEARCH] Local model found eligible account: ${candidate.name}`); - const ok = await switchToSpecificAccount(candidate.token, candidate.name); - return !!ok; - } - - // None eligible yet – do not switch now. Caller may enter cooldown. - if (candidate) { - console.log(`🕒 [SEARCH] No accounts meet threshold. Best candidate: ${candidate.name} in ~${Utils.msToTimeText(bestWait)}`); - } else { - console.log('🕒 [SEARCH] No candidate accounts available.'); - } - return false; - } catch (e) { - console.warn('⚠️ selectAndSwitchToAccountWithCharges failed:', e); - return false; - } - } - - waitForDependenciesAndInitialize().then(() => { - // Generate token automatically after UI is ready - setTimeout(initializeTokenGenerator, 1000); - - // Quick initial account load from cache - setTimeout(async () => { - console.log('🔄 Initial account load from cache...'); - try { - await accountManager.loadAccounts(); - // Seed and start local charge model regardless of count - try { - state.chargeModel = ChargeModel; - ChargeModel.seedFromAccounts(accountManager.getAllAccounts()); - ChargeModel.start(); - console.log('⚡ Local ChargeModel started (tick +1 per 30s for all accounts)'); - } catch (e) { console.warn('ChargeModel init failed:', e); } - - if (accountManager.getAccountCount() > 0) { - console.log(`✅ Loaded ${accountManager.getAccountCount()} cached accounts`); - renderAccountsList(); - } else { - console.log('📭 No cached accounts found'); - } - } catch (error) { - console.warn('⚠️ Initial account load failed:', error); - } - }, 500); - - // Auto-refresh account list on startup (with extension communication) - setTimeout(() => { - console.log('🔄 Auto-refreshing account list on startup...'); - fetchAllAccountDetails(); - }, 2000); - - // Attach advanced color matching listeners (resize dialog) - const advancedInit = () => { - const chromaSlider = document.getElementById('chromaPenaltyWeightSlider'); - const chromaValue = document.getElementById('chromaWeightValue'); - const resetBtn = document.getElementById('resetAdvancedColorBtn'); - const algoSelect = document.getElementById('colorAlgorithmSelect'); - const chromaToggle = document.getElementById('enableChromaPenaltyToggle'); - const transInput = document.getElementById('transparencyThresholdInput'); - const whiteInput = document.getElementById('whiteThresholdInput'); - const ditherToggle = document.getElementById('enableDitheringToggle'); - - // Ensure dithering checkbox matches state (explicit sync on init) - if (ditherToggle) { - ditherToggle.checked = state.ditheringEnabled; - console.log(`🎨 Dithering initialized: ${state.ditheringEnabled ? 'ON' : 'OFF'}`); - } - - if (algoSelect) - algoSelect.addEventListener('change', (e) => { - state.colorMatchingAlgorithm = e.target.value; - saveBotSettings(); - _updateResizePreview(); - }); - if (chromaToggle) - chromaToggle.addEventListener('change', (e) => { - state.enableChromaPenalty = e.target.checked; - saveBotSettings(); - _updateResizePreview(); - }); - if (chromaSlider && chromaValue) - chromaSlider.addEventListener('input', (e) => { - state.chromaPenaltyWeight = parseFloat(e.target.value) || 0.15; - chromaValue.textContent = state.chromaPenaltyWeight.toFixed(2); - saveBotSettings(); - _updateResizePreview(); - }); - if (transInput) - transInput.addEventListener('change', (e) => { - const v = parseInt(e.target.value, 10); - if (!isNaN(v) && v >= 0 && v <= 255) { - state.customTransparencyThreshold = v; - CONFIG.TRANSPARENCY_THRESHOLD = v; - saveBotSettings(); - _updateResizePreview(); - } - }); - if (whiteInput) - whiteInput.addEventListener('change', (e) => { - const v = parseInt(e.target.value, 10); - if (!isNaN(v) && v >= 200 && v <= 255) { - state.customWhiteThreshold = v; - CONFIG.WHITE_THRESHOLD = v; - saveBotSettings(); - _updateResizePreview(); - } - }); - if (ditherToggle) - ditherToggle.addEventListener('change', (e) => { - state.ditheringEnabled = e.target.checked; - saveBotSettings(); - _updateResizePreview(); - }); - if (resetBtn) - resetBtn.addEventListener('click', () => { - state.colorMatchingAlgorithm = 'lab'; - state.enableChromaPenalty = true; - state.chromaPenaltyWeight = 0.15; - state.customTransparencyThreshold = CONFIG.TRANSPARENCY_THRESHOLD = 100; - state.customWhiteThreshold = CONFIG.WHITE_THRESHOLD = 250; - saveBotSettings(); - const a = document.getElementById('colorAlgorithmSelect'); - if (a) a.value = 'lab'; - const ct = document.getElementById('enableChromaPenaltyToggle'); - if (ct) ct.checked = true; - if (chromaSlider) chromaSlider.value = 0.15; - if (chromaValue) chromaValue.textContent = '0.15'; - if (transInput) transInput.value = 100; - if (whiteInput) whiteInput.value = 250; - _updateResizePreview(); - Utils.showAlert(Utils.t('advancedColorSettingsReset'), 'success'); - }); - }; - // Delay to ensure resize UI built - setTimeout(advancedInit, 500); - - // Add cleanup on page unload - window.addEventListener('beforeunload', () => { - Utils.cleanupTurnstile(); - }); - }); -})(); - -// === Async coordinate generation (off-main-thread) === -async function generateCoordinatesAsync( - width, - height, - mode, - direction, - snake, - blockWidth, - blockHeight, - startFromX = 0, - startFromY = 0 -) { - try { - if (typeof Worker === 'undefined') { - // Environment does not support Web Workers – fall back - return generateCoordinates( - width, - height, - mode, - direction, - snake, - blockWidth, - blockHeight, - startFromX, - startFromY - ); - } - - const workerCode = `self.onmessage = function(e) { - const { width, height, mode, direction, snake, blockWidth, blockHeight, startFromX, startFromY } = e.data || {}; - - function generate() { - let coords = []; - - // Determine traversal direction - let xStart, xEnd, xStep; - let yStart, yEnd, yStep; - switch (direction) { - case 'top-left': - xStart = 0; xEnd = width; xStep = 1; - yStart = 0; yEnd = height; yStep = 1; - break; - case 'top-right': - xStart = width - 1; xEnd = -1; xStep = -1; - yStart = 0; yEnd = height; yStep = 1; - break; - case 'bottom-left': - xStart = 0; xEnd = width; xStep = 1; - yStart = height - 1; yEnd = -1; yStep = -1; - break; - case 'bottom-right': - xStart = width - 1; xEnd = -1; xStep = -1; - yStart = height - 1; yEnd = -1; yStep = -1; - break; - default: - throw new Error('Unknown direction: ' + direction); - } - - if (mode === 'rows') { - let rowIndex = 0; - for (let y = yStart; y !== yEnd; y += yStep) { - if (snake && rowIndex % 2 !== 0) { - for (let x = xEnd - xStep; x !== xStart - xStep; x -= xStep) { - coords.push([x, y]); - } - } else { - for (let x = xStart; x !== xEnd; x += xStep) { - coords.push([x, y]); - } - } - rowIndex++; - } - } else if (mode === 'columns') { - let colIndex = 0; - for (let x = xStart; x !== xEnd; x += xStep) { - if (snake && colIndex % 2 !== 0) { - for (let y = yEnd - yStep; y !== yStart - yStep; y -= yStep) { - coords.push([x, y]); - } - } else { - for (let y = yStart; y !== yEnd; y += yStep) { - coords.push([x, y]); - } - } - colIndex++; - } - } else if (mode === 'circle-out') { - const cx = Math.floor(width / 2); - const cy = Math.floor(height / 2); - const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); - for (let r = 0; r <= maxRadius; r++) { - for (let y = cy - r; y <= cy + r; y++) { - for (let x = cx - r; x <= cx + r; x++) { - if (x >= 0 && x < width && y >= 0 && y < height) { - const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); - if (dist === r) coords.push([x, y]); - } - } - } - } - } else if (mode === 'circle-in') { - const cx = Math.floor(width / 2); - const cy = Math.floor(height / 2); - const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); - for (let r = maxRadius; r >= 0; r--) { - for (let y = cy - r; y <= cy + r; y++) { - for (let x = cx - r; x <= cx + r; x++) { - if (x >= 0 && x < width && y >= 0 && y < height) { - const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); - if (dist === r) coords.push([x, y]); - } - } - } - } - } else if (mode === 'blocks' || mode === 'shuffle-blocks') { - const blocks = []; - for (let by = 0; by < height; by += blockHeight) { - for (let bx = 0; bx < width; bx += blockWidth) { - const block = []; - for (let y = by; y < Math.min(by + blockHeight, height); y++) { - for (let x = bx; x < Math.min(bx + blockWidth, width); x++) { - block.push([x, y]); - } - } - blocks.push(block); - } - } - if (mode === 'shuffle-blocks') { - for (let i = blocks.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - const tmp = blocks[i]; - blocks[i] = blocks[j]; - blocks[j] = tmp; - } - } - for (const block of blocks) { - for (let i = 0; i < block.length; i++) { - coords.push(block[i]); - } - } - } else { - throw new Error('Unknown mode: ' + mode); - } - - // Resume from specified position if provided - if (startFromX > 0 || startFromY > 0) { - let startIndex = -1; - for (let i = 0; i < coords.length; i++) { - const c = coords[i]; - if (c[0] === startFromX && c[1] === startFromY) { - startIndex = i; - break; - } - } - if (startIndex >= 0) { - coords = coords.slice(startIndex); - } - } - - return coords; - } - - try { - const coords = generate(); - self.postMessage({ ok: true, coords }); - } catch (err) { - self.postMessage({ ok: false, error: err && (err.message || String(err)) }); - } -};`; - - const blob = new Blob([workerCode], { type: 'application/javascript' }); - const url = URL.createObjectURL(blob); - - return await new Promise((resolve) => { - const worker = new Worker(url); - const cleanup = () => { - URL.revokeObjectURL(url); - try { worker.terminate(); } catch (e) { } - }; - - worker.onmessage = (e) => { - const { ok, coords, error } = e.data || {}; - cleanup(); - if (ok && Array.isArray(coords)) { - resolve(coords); - } else { - console.warn('Coordinate worker failed, falling back to sync:', error); - resolve( - generateCoordinates( - width, - height, - mode, - direction, - snake, - blockWidth, - blockHeight, - startFromX, - startFromY - ) - ); - } - }; - - worker.onerror = (err) => { - console.warn('Coordinate worker error, falling back to sync:', err && (err.message || err)); - cleanup(); - resolve( - generateCoordinates( - width, - height, - mode, - direction, - snake, - blockWidth, - blockHeight, - startFromX, - startFromY - ) - ); - }; - - worker.postMessage({ - width, - height, - mode, - direction, - snake, - blockWidth, - blockHeight, - startFromX, - startFromY, - }); - }); - } catch (e) { - console.warn('Failed to start coordinate worker, using sync generation:', e); - return generateCoordinates( - width, - height, - mode, - direction, - snake, - blockWidth, - blockHeight, - startFromX, - startFromY - ); - } -} +// ==UserScript== +// @name WPlaceBot +// @namespace http://tampermonkey.net/ +// @version 2025-08-08.3 +// @description Bot +// @author Wbot +// @match https://wplace.live/* +// @grant none +// @icon +// ==/UserScript== +localStorage.removeItem("lp"); + + +; (async () => { + // Prevent multiple instances of this script from running + if (window.WPLACE_AUTO_IMAGE_LOADED) { + console.log('%c⚠️ Auto-Image script already loaded, skipping duplicate execution', 'color: #ff9800; font-weight: bold;'); + return; + } + window.WPLACE_AUTO_IMAGE_LOADED = true; + + console.log('%c🚀 WPlace AutoBot Auto-Image Starting...', 'color: #00ff41; font-weight: bold; font-size: 16px;'); + + const buyTypes = [ + 'none', + 'max_charges', + 'paint_charges' + ]; + + // CONFIGURATION CONSTANTS + const CONFIG = { + COOLDOWN_DEFAULT: 31000, + TRANSPARENCY_THRESHOLD: 100, + WHITE_THRESHOLD: 250, + LOG_INTERVAL: 10, + PAINTING_SPEED: { + MIN: 1, // Minimum 1 pixel batch size + MAX: 1000, // Maximum 1000 pixels batch size + DEFAULT: 5, // Default 5 pixels batch size + }, + BATCH_MODE: 'normal', // "normal" or "random" - default to normal + RANDOM_BATCH_RANGE: { + MIN: 3, // Random range minimum + MAX: 20, // Random range maximum + }, + PAINTING_ORDER: 'sequential', // "sequential" or "color-by-color" - default to sequential + PAINTING_SPEED_ENABLED: false, // Off by default + AUTO_CAPTCHA_ENABLED: true, // Turnstile generator enabled by default + TOKEN_SOURCE: 'generator', // "generator", "manual", or "hybrid" - default to generator + COOLDOWN_CHARGE_THRESHOLD: 1, // Default wait threshold + // Desktop Notifications (defaults) + NOTIFICATIONS: { + ENABLED: false, + ON_CHARGES_REACHED: true, + ONLY_WHEN_UNFOCUSED: true, + REPEAT_MINUTES: 5, // repeat reminder while threshold condition holds + }, + OVERLAY: { + OPACITY_DEFAULT: 0.6, + BLUE_MARBLE_DEFAULT: true, // Enable blue marble effect by default + ditheringEnabled: false, // Default dithering OFF + }, // --- START: Color data from colour-converter.js --- + // New color structure with proper ID mapping + COLOR_MAP: { + 0: { id: 1, name: 'Black', rgb: { r: 0, g: 0, b: 0 } }, + 1: { id: 2, name: 'Dark Gray', rgb: { r: 60, g: 60, b: 60 } }, + 2: { id: 3, name: 'Gray', rgb: { r: 120, g: 120, b: 120 } }, + 3: { id: 4, name: 'Light Gray', rgb: { r: 210, g: 210, b: 210 } }, + 4: { id: 5, name: 'White', rgb: { r: 255, g: 255, b: 255 } }, + 5: { id: 6, name: 'Deep Red', rgb: { r: 96, g: 0, b: 24 } }, + 6: { id: 7, name: 'Red', rgb: { r: 237, g: 28, b: 36 } }, + 7: { id: 8, name: 'Orange', rgb: { r: 255, g: 127, b: 39 } }, + 8: { id: 9, name: 'Gold', rgb: { r: 246, g: 170, b: 9 } }, + 9: { id: 10, name: 'Yellow', rgb: { r: 249, g: 221, b: 59 } }, + 10: { id: 11, name: 'Light Yellow', rgb: { r: 255, g: 250, b: 188 } }, + 11: { id: 12, name: 'Dark Green', rgb: { r: 14, g: 185, b: 104 } }, + 12: { id: 13, name: 'Green', rgb: { r: 19, g: 230, b: 123 } }, + 13: { id: 14, name: 'Light Green', rgb: { r: 135, g: 255, b: 94 } }, + 14: { id: 15, name: 'Dark Teal', rgb: { r: 12, g: 129, b: 110 } }, + 15: { id: 16, name: 'Teal', rgb: { r: 16, g: 174, b: 166 } }, + 16: { id: 17, name: 'Light Teal', rgb: { r: 19, g: 225, b: 190 } }, + 17: { id: 20, name: 'Cyan', rgb: { r: 96, g: 247, b: 242 } }, + 18: { id: 44, name: 'Light Cyan', rgb: { r: 187, g: 250, b: 242 } }, + 19: { id: 18, name: 'Dark Blue', rgb: { r: 40, g: 80, b: 158 } }, + 20: { id: 19, name: 'Blue', rgb: { r: 64, g: 147, b: 228 } }, + 21: { id: 21, name: 'Indigo', rgb: { r: 107, g: 80, b: 246 } }, + 22: { id: 22, name: 'Light Indigo', rgb: { r: 153, g: 177, b: 251 } }, + 23: { id: 23, name: 'Dark Purple', rgb: { r: 120, g: 12, b: 153 } }, + 24: { id: 24, name: 'Purple', rgb: { r: 170, g: 56, b: 185 } }, + 25: { id: 25, name: 'Light Purple', rgb: { r: 224, g: 159, b: 249 } }, + 26: { id: 26, name: 'Dark Pink', rgb: { r: 203, g: 0, b: 122 } }, + 27: { id: 27, name: 'Pink', rgb: { r: 236, g: 31, b: 128 } }, + 28: { id: 28, name: 'Light Pink', rgb: { r: 243, g: 141, b: 169 } }, + 29: { id: 29, name: 'Dark Brown', rgb: { r: 104, g: 70, b: 52 } }, + 30: { id: 30, name: 'Brown', rgb: { r: 149, g: 104, b: 42 } }, + 31: { id: 31, name: 'Beige', rgb: { r: 248, g: 178, b: 119 } }, + 32: { id: 52, name: 'Light Beige', rgb: { r: 255, g: 197, b: 165 } }, + 33: { id: 32, name: 'Medium Gray', rgb: { r: 170, g: 170, b: 170 } }, + 34: { id: 33, name: 'Dark Red', rgb: { r: 165, g: 14, b: 30 } }, + 35: { id: 34, name: 'Light Red', rgb: { r: 250, g: 128, b: 114 } }, + 36: { id: 35, name: 'Dark Orange', rgb: { r: 228, g: 92, b: 26 } }, + 37: { id: 37, name: 'Dark Goldenrod', rgb: { r: 156, g: 132, b: 49 } }, + 38: { id: 38, name: 'Goldenrod', rgb: { r: 197, g: 173, b: 49 } }, + 39: { id: 39, name: 'Light Goldenrod', rgb: { r: 232, g: 212, b: 95 } }, + 40: { id: 40, name: 'Dark Olive', rgb: { r: 74, g: 107, b: 58 } }, + 41: { id: 41, name: 'Olive', rgb: { r: 90, g: 148, b: 74 } }, + 42: { id: 42, name: 'Light Olive', rgb: { r: 132, g: 197, b: 115 } }, + 43: { id: 43, name: 'Dark Cyan', rgb: { r: 15, g: 121, b: 159 } }, + 44: { id: 45, name: 'Light Blue', rgb: { r: 125, g: 199, b: 255 } }, + 45: { id: 46, name: 'Dark Indigo', rgb: { r: 77, g: 49, b: 184 } }, + 46: { id: 47, name: 'Dark Slate Blue', rgb: { r: 74, g: 66, b: 132 } }, + 47: { id: 48, name: 'Slate Blue', rgb: { r: 122, g: 113, b: 196 } }, + 48: { id: 49, name: 'Light Slate Blue', rgb: { r: 181, g: 174, b: 241 } }, + 49: { id: 53, name: 'Dark Peach', rgb: { r: 155, g: 82, b: 73 } }, + 50: { id: 54, name: 'Peach', rgb: { r: 209, g: 128, b: 120 } }, + 51: { id: 55, name: 'Light Peach', rgb: { r: 250, g: 182, b: 164 } }, + 52: { id: 50, name: 'Light Brown', rgb: { r: 219, g: 164, b: 99 } }, + 53: { id: 56, name: 'Dark Tan', rgb: { r: 123, g: 99, b: 82 } }, + 54: { id: 57, name: 'Tan', rgb: { r: 156, g: 132, b: 107 } }, + 55: { id: 36, name: 'Light Tan', rgb: { r: 214, g: 181, b: 148 } }, + 56: { id: 51, name: 'Dark Beige', rgb: { r: 209, g: 128, b: 81 } }, + 57: { id: 61, name: 'Dark Stone', rgb: { r: 109, g: 100, b: 63 } }, + 58: { id: 62, name: 'Stone', rgb: { r: 148, g: 140, b: 107 } }, + 59: { id: 63, name: 'Light Stone', rgb: { r: 205, g: 197, b: 158 } }, + 60: { id: 58, name: 'Dark Slate', rgb: { r: 51, g: 57, b: 65 } }, + 61: { id: 59, name: 'Slate', rgb: { r: 109, g: 117, b: 141 } }, + 62: { id: 60, name: 'Light Slate', rgb: { r: 179, g: 185, b: 209 } }, + 63: { id: 0, name: 'Transparent', rgb: null }, + }, // --- END: Color data --- + // Optimized CSS Classes for reuse + CSS_CLASSES: { + BUTTON_PRIMARY: ` + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + color: white; border: none; border-radius: 8px; padding: 10px 16px; + cursor: pointer; font-weight: 500; transition: all 0.3s ease; + display: flex; align-items: center; gap: 8px; + `, + BUTTON_SECONDARY: ` + background: rgba(255,255,255,0.1); color: white; + border: 1px solid rgba(255,255,255,0.2); border-radius: 8px; + padding: 8px 12px; cursor: pointer; transition: all 0.3s ease; + `, + MODERN_CARD: ` + background: rgba(255,255,255,0.1); border-radius: 12px; + padding: 18px; border: 1px solid rgba(255,255,255,0.1); + backdrop-filter: blur(5px); + `, + GRADIENT_TEXT: ` + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + -webkit-background-clip: text; -webkit-text-fill-color: transparent; + background-clip: text; font-weight: bold; + `, + }, + THEMES: { + 'Classic Autobot': { + primary: '#000000', + secondary: '#111111', + accent: '#222222', + text: '#ffffff', + highlight: '#775ce3', + success: '#00ff00', + error: '#ff0000', + warning: '#ffaa00', + fontFamily: "'Segoe UI', Roboto, sans-serif", + borderRadius: '12px', + borderStyle: 'solid', + borderWidth: '1px', + boxShadow: '0 8px 32px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.1)', + backdropFilter: 'blur(10px)', + animations: { + glow: false, + scanline: false, + 'pixel-blink': false, + }, + }, + 'Classic Light': { + primary: '#E0E0E1', + secondary: '#FBFBFB', + accent: '#F3F3F3', + text: '#203C5D', + highlight: '#203C5D', + success: '#28a745', + error: '#dc3545', + warning: '#ffc107', + fontFamily: "'Segoe UI', Roboto, sans-serif", + borderRadius: '12px', + borderStyle: 'solid', + borderWidth: '1px', + boxShadow: '0 8px 32px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.08)', + backdropFilter: 'blur(10px)', + animations: { + glow: false, + scanline: false, + 'pixel-blink': false, + }, + }, + 'Neon Retro': { + primary: '#1a1a2e', + secondary: '#16213e', + accent: '#0f3460', + text: '#00ff41', + highlight: '#ff6b35', + success: '#39ff14', + error: '#ff073a', + warning: '#ffff00', + neon: '#00ffff', + purple: '#bf00ff', + pink: '#ff1493', + fontFamily: "'Press Start 2P', monospace", + borderRadius: '0', + borderStyle: 'solid', + borderWidth: '3px', + boxShadow: '0 0 20px rgba(0, 255, 65, 0.3), inset 0 0 20px rgba(0, 255, 65, 0.1)', + backdropFilter: 'none', + animations: { + glow: true, + scanline: true, + 'pixel-blink': true, + }, + }, + 'Neon Retro Cyan': { + primary: '#1959A1', + secondary: '#3C74AF', + accent: '#538CC0', + text: '#81DCF7', + highlight: '#EA9C00', + success: '#39ff14', + error: '#ff073a', + warning: '#ffff00', + neon: '00ffff', + purple: '#bf00ff', + pink: '#ff1493', + fontFamily: "'Press Start 2P', monospace", + borderRadius: '0', + borderStyle: 'solid', + borderWidth: '3px', + boxShadow: '0 0 20px rgba(234 156 0, 0.3), inset 0 0 20px rgba(234 156 0, 0.1)', + backdropFilter: 'none', + animations: { + glow: true, + scanline: true, + 'pixel-blink': true, + }, + }, + 'Neon Retro Light': { + primary: '#E0E0E1', + secondary: '#FBFBFB', + accent: '#F3F3F3', + text: '#203C5D', + highlight: '#203C5D', + success: '#39ff14', + error: '#ff073a', + warning: '#ffff00', + neon: '#203C5D', + purple: '#bf00ff', + pink: '#ff1493', + fontFamily: "'Press Start 2P', monospace", + borderRadius: '0', + borderStyle: 'solid', + borderWidth: '3px', + boxShadow: '0 0 20px rgba(234 156 0, 0.3), inset 0 0 20px rgba(234 156 0, 0.1)', + backdropFilter: 'none', + animations: { + glow: true, + scanline: true, + 'pixel-blink': true, + }, + }, + 'Acrylic': { + primary: '#00000080', + secondary: '#00000040', + accent: 'rgba(0,0,0,0.75)', + text: '#ffffff', + highlight: '#ffffff', + success: '#00e500', + error: '#e50000', + warning: '#e5e500', + fontFamily: "'Inter', 'Apple Color Emoji'", + borderRadius: '10px', + borderStyle: 'solid', + borderWidth: '0px', + boxShadow: 'none', + backdropFilter: 'blur(20px)', + animations: { + glow: false, + scanline: false, + 'pixel-blink': false, + }, + }, + }, + currentTheme: 'Classic Autobot', + PAINT_UNAVAILABLE: true, + COORDINATE_MODE: 'rows', + COORDINATE_DIRECTION: 'top-left', + COORDINATE_SNAKE: true, + COORDINATE_BLOCK_WIDTH: 6, + COORDINATE_BLOCK_HEIGHT: 2, + autoSwap: true, + autoBuy: 'none', // "none", "max_charges", or "paint_charges" + autoBuyToggle: false, + maxChargesStopEnable: false, + maxChargesBeforeStop: 1500, + }; + + // Expose CONFIG globally for the utils manager and other modules + window.CONFIG = CONFIG; + + const getCurrentTheme = () => CONFIG.THEMES[CONFIG.currentTheme]; + + const switchTheme = (themeName) => { + if (CONFIG.THEMES[themeName]) { + CONFIG.currentTheme = themeName; + saveThemePreference(); + + // APPLY THEME VARS/CLASS (new) + applyTheme(); + + // Recreate UI (kept for now) + createUI(); + } + }; + + // Add this helper (place it after getCurrentTheme/switchTheme definitions) + function applyTheme() { + const theme = getCurrentTheme(); + console.group('%c🎨 Applying Theme in Auto-Image Script', 'color: #8b5cf6; font-weight: bold;'); + console.log(`%c🎯 Target theme: ${CONFIG.currentTheme}`, 'color: #8b5cf6;'); + + // Toggle theme class on documentElement so CSS vars cascade to our UI + document.documentElement.classList.remove( + 'wplace-theme-classic', + 'wplace-theme-classic-light', + 'wplace-theme-acrylic', + 'wplace-theme-neon', + 'wplace-theme-neon-cyan', + 'wplace-theme-neon-light' + ); + + let themeClass = 'wplace-theme-classic'; // default + let themeFileName = 'classic'; // corresponding file name + + if (CONFIG.currentTheme === 'Neon Retro') { + themeClass = 'wplace-theme-neon'; + themeFileName = 'neon'; + } else if (CONFIG.currentTheme === 'Classic Light') { + themeClass = 'wplace-theme-classic-light'; + themeFileName = 'classic-light'; + } else if (CONFIG.currentTheme === 'Neon Retro Cyan') { + themeClass = 'wplace-theme-neon-cyan'; + themeFileName = 'neon-cyan'; + } else if (CONFIG.currentTheme === 'Neon Retro Light') { + themeClass = 'wplace-theme-neon-light'; + themeFileName = 'neon-light'; + } else if (CONFIG.currentTheme === 'Acrylic') { + themeClass = 'wplace-theme-acrylic'; + themeFileName = 'acrylic'; + } + + document.documentElement.classList.add(themeClass); + console.log(`%c✅ Applied theme class: ${themeClass}`, 'color: #8b5cf6;'); + + // Use extension's applyTheme helper if available (loads from local extension resources) + if (typeof window.applyTheme === 'function') { + console.log(`%c🔧 Using extension's applyTheme() helper for: ${themeFileName}`, 'color: #10b981; font-weight: bold;'); + const success = window.applyTheme(themeFileName); + if (success) { + console.log(`%c✅ Theme CSS loaded from extension local resources`, 'color: #10b981; font-weight: bold;'); + console.log(` 📍 Source: Extension local file (themes/${themeFileName}.css)`); + console.log(` 🚀 Performance: Instant load (no network request)`); + } else { + console.warn(`%c⚠️ Extension theme loading failed, fallback to CSS classes only`, 'color: #f59e0b;'); + console.log(` 🎨 Using CSS class: ${themeClass}`); + console.log(` 📝 Note: Theme variables may be limited without CSS file`); + } + } else { + console.log(`%c📝 Extension applyTheme() not available, using CSS class only`, 'color: #f59e0b;'); + console.log(` 🎨 Using CSS class: ${themeClass}`); + console.log(` ⚠️ Note: Full theme styling requires extension helper function`); + } + + // Also set CSS variables explicitly in case you want runtime overrides + const root = document.documentElement; + const setVar = (k, v) => { + try { + root.style.setProperty(k, v); + } catch { } + }; + + setVar('--wplace-primary', theme.primary); + setVar('--wplace-secondary', theme.secondary); + setVar('--wplace-accent', theme.accent); + setVar('--wplace-text', theme.text); + setVar('--wplace-highlight', theme.highlight); + setVar('--wplace-success', theme.success); + setVar('--wplace-error', theme.error); + setVar('--wplace-warning', theme.warning); + + // Typography + look + setVar('--wplace-font', theme.fontFamily || "'Segoe UI', Roboto, sans-serif"); + setVar('--wplace-radius', '' + (theme.borderRadius || '12px')); + setVar('--wplace-border-style', '' + (theme.borderStyle || 'solid')); + setVar('--wplace-border-width', '' + (theme.borderWidth || '1px')); + setVar('--wplace-backdrop', '' + (theme.backdropFilter || 'blur(10px)')); + setVar('--wplace-border-color', 'rgba(255,255,255,0.1)'); + + console.log(`%c🎨 Theme application complete`, 'color: #8b5cf6; font-weight: bold;'); + console.groupEnd(); + } + + const saveThemePreference = () => { + try { + localStorage.setItem('wplace-theme', CONFIG.currentTheme); + } catch (e) { + console.warn('Could not save theme preference:', e); + } + }; + + const loadThemePreference = () => { + try { + const saved = localStorage.getItem('wplace-theme'); + if (saved && CONFIG.THEMES[saved]) { + CONFIG.currentTheme = saved; + } + } catch (e) { + console.warn('Could not load theme preference:', e); + } + }; + + // Dynamically loaded translations + window.loadedTranslations = {}; + + // Available languages + const AVAILABLE_LANGUAGES = [ + 'en', + 'es', + 'ru', + 'pt', + 'vi', + 'fr', + 'id', + 'tr', + 'zh-CN', + 'zh-TW', + 'ja', + 'ko', + 'uk', + ]; + + // Function to load translations from JSON file with retry mechanism + const loadTranslations = async (language, retryCount = 0) => { + if (window.loadedTranslations[language]) { + return window.loadedTranslations[language]; + } + + console.group(`%c🌍 Loading ${language.toUpperCase()} translations`, 'color: #06b6d4; font-weight: bold;'); + + // First try: Check if extension has loaded local resources + if (window.AUTOBOT_LANGUAGES && Object.keys(window.AUTOBOT_LANGUAGES).length > 0) { + console.log(`%c🔍 Checking extension local resources...`, 'color: #06b6d4;'); + + const langFile = `${language}.json`; + const availableFiles = Object.keys(window.AUTOBOT_LANGUAGES || {}); + const regionalMatch = availableFiles.find(file => file.toLowerCase().startsWith(`${language.toLowerCase()}-`)); + const resolvedFile = window.AUTOBOT_LANGUAGES[langFile] ? langFile : regionalMatch; + + if (resolvedFile && window.AUTOBOT_LANGUAGES[resolvedFile]) { + const translations = window.AUTOBOT_LANGUAGES[resolvedFile]; + + // Validate that translations is an object with keys + if ( + typeof translations === 'object' && + translations !== null && + Object.keys(translations).length > 0 + ) { + window.loadedTranslations[language] = translations; + console.log(`%c✅ Loaded ${language} translations from EXTENSION LOCAL FILES`, 'color: #10b981; font-weight: bold;'); + console.log(` 📍 Source: Extension local storage (chrome-extension://)`); + if (resolvedFile !== langFile) { + console.log(` 🔄 Resolved locale: ${resolvedFile.replace('.json', '')}`); + } + console.log(` 📏 Keys count: ${Object.keys(translations).length}`); + console.log(` 🚀 Performance: Instant load (no network request)`); + console.groupEnd(); + return translations; + } + } else { + console.log(`%c📝 ${langFile} not found in extension resources`, 'color: #f59e0b;'); + console.log(` 📋 Available in extension: ${Object.keys(window.AUTOBOT_LANGUAGES).join(', ')}`); + } + } else { + console.log(`%c📝 No extension local resources available`, 'color: #f59e0b;'); + console.log(` 🔍 window.AUTOBOT_LANGUAGES: ${typeof window.AUTOBOT_LANGUAGES}`); + } + + // Second try: Use helper function if available + if (typeof window.getLanguage === 'function') { + console.log(`%c🔧 Trying extension getLanguage() helper...`, 'color: #06b6d4;'); + try { + const translations = window.getLanguage(language); + if ( + typeof translations === 'object' && + translations !== null && + Object.keys(translations).length > 0 + ) { + window.loadedTranslations[language] = translations; + console.log(`%c✅ Loaded ${language} translations via extension helper`, 'color: #10b981; font-weight: bold;'); + console.log(` 📍 Source: Extension getLanguage() function`); + console.log(` 📏 Keys count: ${Object.keys(translations).length}`); + console.groupEnd(); + return translations; + } + } catch (error) { + console.warn(`%c⚠️ Extension helper failed:`, 'color: #f59e0b;', error); + } + } + + // Fallback: Load from CDN (original behavior) + console.log(`%c🌐 Falling back to CDN loading...`, 'color: #8b5cf6;'); + const url = `https://wplace-autobot.github.io/WPlace-AutoBOT/main/lang/${language}.json`; + const maxRetries = 3; + const baseDelay = 1000; // 1 second + + try { + if (retryCount === 0) { + console.log(`🔄 Loading ${language} translations from CDN...`); + } else { + console.log( + `🔄 Retrying ${language} translations (attempt ${retryCount + 1}/${maxRetries + 1})...` + ); + } + + const response = await fetch(url); + if (response.ok) { + const translations = await response.json(); + + // Validate that translations is an object with keys + if ( + typeof translations === 'object' && + translations !== null && + Object.keys(translations).length > 0 + ) { + window.loadedTranslations[language] = translations; + console.log( + `%c📚 Loaded ${language} translations from CDN (${Object.keys(translations).length} keys)`, 'color: #f59e0b; font-weight: bold;' + ); + console.log(` 📍 Source: CDN (wplace-autobot.github.io)`); + console.log(` 🌐 URL: ${url}`); + console.log(` ⚠️ Performance: Network request required`); + console.groupEnd(); + return translations; + } else { + console.warn(`❌ Invalid translation format for ${language}`); + throw new Error('Invalid translation format'); + } + } else { + console.warn( + `❌ CDN returned HTTP ${response.status}: ${response.statusText} for ${language} translations` + ); + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + } catch (error) { + console.error( + `❌ Failed to load ${language} translations from CDN (attempt ${retryCount + 1}):`, + error + ); + + // Retry with exponential backoff + if (retryCount < maxRetries) { + const delay = baseDelay * Math.pow(2, retryCount); + console.log(`⏳ Retrying in ${delay}ms...`); + await new Promise((resolve) => setTimeout(resolve, delay)); + console.groupEnd(); + return loadTranslations(language, retryCount + 1); + } + } + + console.error(`%c💥 All translation loading methods failed for ${language}`, 'color: #ef4444; font-weight: bold;'); + console.groupEnd(); + return null; + }; + + const loadLanguagePreference = async () => { + const savedLanguage = localStorage.getItem('wplace_language'); + const browserLocale = navigator.language; + const browserLanguage = browserLocale.split('-')[0]; + + let selectedLanguage = 'en'; // Default fallback + + try { + // Check if we have the saved language available + if (savedLanguage && AVAILABLE_LANGUAGES.includes(savedLanguage)) { + selectedLanguage = savedLanguage; + console.log(`🔄 Using saved language preference: ${selectedLanguage}`); + } + // Try full locale match (e.g. "zh-CN", "zh-TW" etc) + else if (AVAILABLE_LANGUAGES.includes(browserLocale)) { + selectedLanguage = browserLocale; + localStorage.setItem('wplace_language', browserLocale); + console.log(`🔄 Using browser locale: ${selectedLanguage}`); + } + // Try base language match (e.g. "en" for "en-US" or "en-GB" etc) + else if (AVAILABLE_LANGUAGES.includes(browserLanguage)) { + selectedLanguage = browserLanguage; + localStorage.setItem('wplace_language', browserLanguage); + console.log(`🔄 Using browser language: ${selectedLanguage}`); + } + // Use English as fallback + else { + console.log(`🔄 No matching language found, using English fallback`); + } + + // Set the language in state first + state.language = selectedLanguage; + + // Only load translations if not already loaded and not English (which should already be loaded) + if (selectedLanguage !== 'en' && !window.loadedTranslations[selectedLanguage]) { + const loaded = await loadTranslations(selectedLanguage); + if (!loaded) { + console.warn( + `⚠️ Failed to load ${selectedLanguage} translations, falling back to English` + ); + state.language = 'en'; + localStorage.setItem('wplace_language', 'en'); + } + } + } catch (error) { + console.error(`❌ Error in loadLanguagePreference:`, error); + state.language = 'en'; // Always ensure we have a valid language + } + }; + + // Simple user notification function for critical issues + const showTranslationWarning = (message) => { + try { + // Create a simple temporary notification banner + const warning = document.createElement('div'); + warning.style.cssText = ` + position: fixed; top: 10px; right: 10px; z-index: 10001; + background: rgba(255, 193, 7, 0.95); color: #212529; padding: 12px 16px; + border-radius: 8px; font-size: 14px; font-weight: 500; + box-shadow: 0 4px 12px rgba(0,0,0,0.3); border: 1px solid rgba(255, 193, 7, 0.8); + max-width: 300px; word-wrap: break-word; + `; + warning.textContent = message; + document.body.appendChild(warning); + + // Auto-remove after 8 seconds + setTimeout(() => { + if (warning.parentNode) { + warning.remove(); + } + }, 8000); + } catch (e) { + // If DOM manipulation fails, just log + console.warn('Failed to show translation warning UI:', e); + } + }; + + // Initialize translations function + const initializeTranslations = async () => { + try { + console.log('🌐 Initializing translation system...'); + + // Always ensure English is loaded as fallback first + if (!window.loadedTranslations['en']) { + const englishLoaded = await loadTranslations('en'); + if (!englishLoaded) { + console.warn('⚠️ Failed to load English translations from CDN, using fallback'); + showTranslationWarning('⚠️ Translation loading failed, using basic fallbacks'); + } + } + + // Then load user's language preference + await loadLanguagePreference(); + + console.log(`✅ Translation system initialized. Active language: ${state.language}`); + } catch (error) { + console.error('❌ Translation initialization failed:', error); + // Ensure state has a valid language even if loading fails + if (!state.language) { + state.language = 'en'; + } + console.warn('⚠️ Using fallback translations due to initialization failure'); + showTranslationWarning('⚠️ Translation system error, using basic English'); + } + }; + + // Emergency fallback TEXT (minimal) + const FALLBACK_TEXT = { + en: { + title: 'WPlace Auto-Image', + toggleOverlay: 'Toggle Overlay', + scanColors: 'Scan Colors', + uploadImage: 'Upload Image', + resizeImage: 'Process/Edit Image', + processImageFirst: '⚠️ Process the image first via "Process/Edit Image" before placing!', + imageNeedsProcessing: 'Image needs processing', + selectPosition: 'Select Position', + startPainting: 'Start Painting', + stopPainting: 'Stop Painting', + progress: 'Progress', + pixels: 'Pixels', + charges: 'Charges', + batchSize: 'Batch Size', + paintingOrder: 'Painting Order', + paintingOrderSequential: 'Sequential (Top to Bottom)', + paintingOrderColorByColor: 'Color by Color', + currentlyPaintingColor: 'Currently painting: {colorName}', + colorProgress: '{painted} of {total} {colorName} pixels', + cooldownSettings: 'Cooldown Settings', + waitCharges: 'Wait for Charges', + settings: 'Settings', + showStats: 'Show Statistics', + compactMode: 'Compact Mode', + minimize: 'Minimize', + tokenCapturedSuccess: 'Token captured successfully', + turnstileInstructions: 'Complete the verification', + hideTurnstileBtn: 'Hide', + notificationsNotSupported: 'Notifications not supported', + chargesReadyMessage: 'Charges are ready', + chargesReadyNotification: 'WPlace AutoBot', + initMessage: "Click 'Upload Image' to begin", + }, + }; + + // Safe translation function with multiple fallback levels + const getText = (key, replacements = {}) => { + // Try current language first + let text = window.loadedTranslations[state.language]?.[key]; + + // Fallback to English translations + if (!text && state.language !== 'en') { + text = window.loadedTranslations['en']?.[key]; + } + + // Fallback to hardcoded English + if (!text) { + text = FALLBACK_TEXT['en']?.[key]; + } + + // Last resort - return the key itself + if (!text) { + console.warn(`⚠️ Missing translation for key: ${key}`); + return key; + } + + // Handle string replacements like {count}, {time}, etc. + return Object.entries(replacements).reduce((result, [placeholder, value]) => { + return result.replace(new RegExp(`\\{${placeholder}\\}`, 'g'), value); + }, text); + }; + + // UNIFIED ACCOUNT MANAGER + class AccountManager { + constructor() { + this.accounts = []; + this.currentIndex = 0; + } + + // Load accounts from storage + async loadAccounts() { + try { + // Get tokens from localStorage + const tokens = JSON.parse(localStorage.getItem("accounts")) || []; + + // Get account info from storage + const infoAccountsResult = await new Promise((resolve) => { + if (typeof chrome !== 'undefined' && chrome.storage) { + chrome.storage.local.get('infoAccounts', (result) => { + resolve(result.infoAccounts || []); + }); + } else { + // Fallback for when chrome storage isn't available + resolve([]); + } + }); + + console.log(`📥 [ACCOUNT MANAGER] Loading ${tokens.length} accounts`); + + this.accounts = tokens.map((token, index) => { + const info = infoAccountsResult.find(acc => acc.token === token); + return { + token, + displayName: info?.displayName || info?.name || `Account ${index + 1}`, + ID: info?.ID || null, + Charges: info?.Charges || 0, + Max: info?.Max || 0, + Droplets: info?.Droplets || 0, + isCurrent: info?.isCurrent || false, + lastUsed: info?.lastUsed || null, + lastImported: info?.lastImported || null + }; + }); + + // Find current account index + this.currentIndex = this.accounts.findIndex(acc => acc.isCurrent); + if (this.currentIndex === -1) this.currentIndex = 0; + + console.log(`✅ [ACCOUNT MANAGER] Loaded ${this.accounts.length} accounts, current index: ${this.currentIndex}`); + console.log(`🎯 [ACCOUNT MANAGER] Current account: ${this.getCurrentAccount()?.displayName || 'None'}`); + + // Auto-refresh account statuses after loading + if (this.accounts.length > 0) { + console.log('🔄 [ACCOUNT MANAGER] Auto-refreshing account statuses...'); + // Use setTimeout to avoid blocking the load operation + setTimeout(async () => { + try { + await fetchAllAccountDetails(); + console.log('✅ [ACCOUNT MANAGER] Auto-refresh completed'); + } catch (error) { + console.warn('⚠️ [ACCOUNT MANAGER] Auto-refresh failed:', error); + } + }, 100); + } + + return this.accounts; + } catch (error) { + console.error('❌ [ACCOUNT MANAGER] Error loading accounts:', error); + this.accounts = []; + this.currentIndex = 0; + return []; + } + } + + // Simple linear switching + switchToNext() { + if (this.accounts.length === 0) return null; + + const previousIndex = this.currentIndex; + this.currentIndex = (this.currentIndex + 1) % this.accounts.length; + + console.log(`🔄 [ACCOUNT MANAGER] Switching: ${previousIndex} → ${this.currentIndex}`); + console.log(`🎯 [ACCOUNT MANAGER] Target: ${this.accounts[this.currentIndex].displayName}`); + + // Update current flags + this.accounts.forEach((acc, idx) => { + acc.isCurrent = idx === this.currentIndex; + }); + + return this.accounts[this.currentIndex]; + } + + getCurrentAccount() { + return this.accounts[this.currentIndex] || null; + } + + getAccountByIndex(index) { + return this.accounts[index] || null; + } + + updateAccountData(tokenOrData, dataObject = null) { + let accountData; + let targetAccount; + + if (dataObject !== null) { + // Called with (token, dataObject) format + const token = tokenOrData; + accountData = dataObject; + targetAccount = this.accounts.find(acc => acc.token === token); + if (!targetAccount) { + console.warn(`⚠️ [ACCOUNT MANAGER] Account with token not found for update`); + return; + } + } else { + // Called with (dataObject) format - update current account + accountData = tokenOrData; + targetAccount = this.getCurrentAccount(); + } + + if (targetAccount && accountData) { + // Update all provided properties + if (accountData.charges !== undefined || accountData.Charges !== undefined) { + targetAccount.Charges = Math.floor(accountData.charges || accountData.Charges || 0); + } + if (accountData.max !== undefined || accountData.Max !== undefined) { + targetAccount.Max = Math.floor(accountData.max || accountData.Max || 0); + } + if (accountData.droplets !== undefined || accountData.Droplets !== undefined) { + targetAccount.Droplets = Math.floor(accountData.droplets || accountData.Droplets || 0); + } + if (accountData.id !== undefined || accountData.ID !== undefined) { + targetAccount.ID = accountData.id || accountData.ID || targetAccount.ID; + } + if (accountData.displayName !== undefined) { + targetAccount.displayName = accountData.displayName; + } + if (accountData.isCurrent !== undefined) { + // Clear isCurrent from all accounts first, then set for target + this.accounts.forEach(acc => acc.isCurrent = false); + targetAccount.isCurrent = accountData.isCurrent; + } + if (accountData.cooldown !== undefined) { + targetAccount.cooldown = accountData.cooldown; + } + + console.log(`📊 [ACCOUNT MANAGER] Updated ${targetAccount.displayName}: ⚡${targetAccount.Charges}/${targetAccount.Max} 💧${targetAccount.Droplets}${targetAccount.isCurrent ? ' (CURRENT)' : ''}`); + } + } + + getAccountCount() { + return this.accounts.length; + } + + getAllAccounts() { + return [...this.accounts]; // Return copy to prevent direct mutation + } + + setCurrentIndex(index) { + if (index >= 0 && index < this.accounts.length) { + this.currentIndex = index; + console.log(`🔄 [ACCOUNT MANAGER] Current index set to: ${index}`); + } else { + console.warn(`⚠️ [ACCOUNT MANAGER] Invalid index ${index}, keeping current: ${this.currentIndex}`); + } + } + + getNextAccount() { + if (this.accounts.length === 0) return null; + const nextIndex = (this.currentIndex + 1) % this.accounts.length; + return this.accounts[nextIndex]; + } + } + + // Create global account manager instance + const accountManager = new AccountManager(); + + // Local Charge Model to minimize API calls and drive account switching + const ChargeModel = (() => { + class Model { + constructor() { + this.map = new Map(); // token -> {charges,max,lastTickAt,lastSyncAt} + this.tickIntervalMs = 30_000; // +1 charge per 30s + this.timer = null; + this.startedAt = Date.now(); + } + seedFromAccounts(accounts) { + const now = Date.now(); + (accounts || []).forEach(acc => { + if (!acc || !acc.token) return; + const existing = this.map.get(acc.token) || {}; + const charges = Number.isFinite(acc.Charges) ? Math.floor(acc.Charges) : (existing.charges || 0); + const max = Number.isFinite(acc.Max) ? Math.floor(acc.Max) : (existing.max || 1); + this.map.set(acc.token, { + charges: Math.max(0, Math.min(charges, max)), + max: Math.max(1, max), + lastTickAt: existing.lastTickAt || now, + lastSyncAt: existing.lastSyncAt || now, + }); + }); + } + ensureToken(token) { + if (!token) return null; + if (!this.map.has(token)) { + this.map.set(token, { charges: 0, max: Math.max(1, state.maxCharges || 1), lastTickAt: Date.now(), lastSyncAt: 0 }); + } + return this.map.get(token); + } + get(token) { return this.ensureToken(token); } + getForCurrent() { return this.get(accountManager.getCurrentAccount()?.token); } + setFromServer(token, charges, max) { + const node = this.ensureToken(token); + if (!node) return; + node.charges = Math.max(0, Math.min(Math.floor(charges || 0), Math.max(1, Math.floor(max || node.max || 1)))); + node.max = Math.max(1, Math.floor(max || node.max || 1)); + node.lastSyncAt = Date.now(); + } + decrement(token, amount) { + const node = this.ensureToken(token); + if (!node) return 0; + const n = Math.max(0, Math.floor(amount || 0)); + node.charges = Math.max(0, node.charges - n); + return node.charges; + } + incrementTickAll() { + const now = Date.now(); + accountManager.getAllAccounts().forEach(acc => { + if (!acc?.token) return; + const node = this.ensureToken(acc.token); + if (!node) return; + // catch-up ticks if tab was inactive + const elapsed = now - (node.lastTickAt || now); + const ticks = Math.floor(elapsed / this.tickIntervalMs); + if (ticks > 0) { + node.charges = Math.min(node.max, node.charges + ticks); + node.lastTickAt = (node.lastTickAt || now) + ticks * this.tickIntervalMs; + } + }); + // Mirror values into AccountManager and UI state + this.syncToAccountManager(); + } + start() { + if (this.timer) return; + this.timer = setInterval(() => this.incrementTickAll(), this.tickIntervalMs); + } + stop() { if (this.timer) { clearInterval(this.timer); this.timer = null; } } + predictTimeToReach(token, target) { + const node = this.get(token); + if (!node) return Infinity; + if (node.charges >= target) return 0; + return (target - node.charges) * this.tickIntervalMs; + } + syncToAccountManager() { + const list = accountManager.getAllAccounts(); + list.forEach(acc => { + const node = this.map.get(acc.token); + if (!node) return; + accountManager.updateAccountData(acc.token, { Charges: node.charges, Max: node.max }); + }); + renderAccountsList(); + } + } + return new Model(); + })(); + + // GLOBAL STATE + const state = { + running: false, + imageLoaded: false, + imageProcessed: false, // Track if image has been processed through resize panel + processing: false, + totalPixels: 0, + paintedPixels: 0, + preFilteringDone: false, // Track if pre-filtering detection has been done this session + progressResetDone: false, // Track if progress reset has been done this save file session + availableColors: [], + activeColorPalette: [], // User-selected colors for conversion + paintWhitePixels: true, // Default to ON + fullChargeData: null, + fullChargeInterval: null, + paintTransparentPixels: false, // Default to OFF + displayCharges: 0, + preciseCurrentCharges: 0, + maxCharges: 1, // Default max charges + cooldown: CONFIG.COOLDOWN_DEFAULT, + imageData: null, + stopFlag: false, + colorsChecked: false, + startPosition: null, + selectingPosition: false, + region: null, + minimized: false, + lastPosition: { x: 0, y: 0 }, + lastPaintedPosition: { x: 0, y: 0 }, // Track last successfully painted coordinate + estimatedTime: 0, + language: 'en', + paintingSpeed: CONFIG.PAINTING_SPEED.DEFAULT, // pixels batch size + batchMode: CONFIG.BATCH_MODE, // "normal" or "random" + paintingOrder: CONFIG.PAINTING_ORDER, // "sequential" or "color-by-color" + currentPaintingColor: null, // Track current color being painted in color-by-color mode + randomBatchMin: CONFIG.RANDOM_BATCH_RANGE.MIN, // Random range minimum + randomBatchMax: CONFIG.RANDOM_BATCH_RANGE.MAX, // Random range maximum + cooldownChargeThreshold: CONFIG.COOLDOWN_CHARGE_THRESHOLD, + chargesThresholdInterval: null, + tokenSource: CONFIG.TOKEN_SOURCE, // "generator" or "manual" + initialSetupComplete: false, // Track if initial startup setup is complete (only happens once) + overlayOpacity: CONFIG.OVERLAY.OPACITY_DEFAULT, + blueMarbleEnabled: CONFIG.OVERLAY.BLUE_MARBLE_DEFAULT, + ditheringEnabled: false, + // Advanced color matching settings + colorMatchingAlgorithm: 'lab', + enableChromaPenalty: true, + chromaPenaltyWeight: 0.15, + customTransparencyThreshold: CONFIG.TRANSPARENCY_THRESHOLD, + customWhiteThreshold: CONFIG.WHITE_THRESHOLD, + resizeSettings: null, + originalImage: null, + resizeIgnoreMask: null, + paintUnavailablePixels: CONFIG.PAINT_UNAVAILABLE, + // Coordinate generation settings + coordinateMode: CONFIG.COORDINATE_MODE, + coordinateDirection: CONFIG.COORDINATE_DIRECTION, + coordinateSnake: CONFIG.COORDINATE_SNAKE, + blockWidth: CONFIG.COORDINATE_BLOCK_WIDTH, + blockHeight: CONFIG.COORDINATE_BLOCK_HEIGHT, + notificationsEnabled: CONFIG.NOTIFICATIONS.ENABLED, + notifyOnChargesReached: CONFIG.NOTIFICATIONS.ON_CHARGES_REACHED, + notifyOnlyWhenUnfocused: CONFIG.NOTIFICATIONS.ONLY_WHEN_UNFOCUSED, + notificationIntervalMinutes: CONFIG.NOTIFICATIONS.REPEAT_MINUTES, + _lastChargesNotifyAt: 0, + _lastChargesBelow: true, + // Switch debouncing state + lastSwitchAt: 0, + paintedSinceSwitch: 0, + minMsBetweenSwitches: 3000, + // Smart save tracking + _lastSavePixelCount: 0, + _lastSaveTime: 0, + _saveInProgress: false, + paintedMap: null, + accountIndex: 0, // Keep for backward compatibility with existing logic + // Legacy state removed - now using accountManager instead + isFetchingAllAccounts: false, + paintingMode: 'auto', // 'auto' or 'assist' - default to auto + }; + + // Expose state globally for the utils manager and other modules + window.state = state; + + let _updateResizePreview = () => { }; + let _resizeDialogCleanup = null; + + // --- OVERLAY UPDATE: Optimized OverlayManager class with performance improvements --- + // OverlayManager class extracted to overlay-manager.js module + + // Overlay management is now handled by the OverlayManager module + // Check for overlay manager availability + if (!window.WPlaceOverlayManager) { + console.error('❌ WPlaceOverlayManager not available - please ensure overlay-manager.js is loaded first'); + throw new Error('OverlayManager dependency not found'); + } + + // Ensure we only have ONE overlay manager instance globally + let overlayManager; + if (!window.autoImageOverlayManager) { + overlayManager = new window.WPlaceOverlayManager(); + window.autoImageOverlayManager = overlayManager; + console.log('🎯 Created NEW overlay manager instance'); + } else { + overlayManager = window.autoImageOverlayManager; + console.log('🎯 Using EXISTING overlay manager instance'); + } + + // Token management is now handled by the TokenManager module + // Global references for backward compatibility + if (!window.WPlaceTokenManager) { + console.error('❌ WPlaceTokenManager not available - please ensure token-manager.js is loaded first'); + throw new Error('TokenManager dependency not found'); + } + + const tokenManager = window.WPlaceTokenManager; + const setTurnstileToken = (token) => tokenManager.setTurnstileToken(token); + const isTokenValid = () => tokenManager.isTokenValid(); + const invalidateToken = () => tokenManager.invalidateToken(); + const ensureToken = (forceRefresh = false) => tokenManager.ensureToken(forceRefresh); + + // Getter for the current token value + const getTurnstileToken = () => tokenManager.turnstileToken; + + // Token promise management + const createTokenPromise = () => { + tokenManager.tokenPromise = new Promise((resolve) => { + tokenManager._resolveToken = resolve; + }); + }; + + // Create global image processor instance for utility functions + if (!window.WPlaceImageProcessor) { + console.error('❌ WPlaceImageProcessor not available - please ensure image-processor.js is loaded first'); + throw new Error('ImageProcessor dependency not found'); + } + + const globalImageProcessor = new window.WPlaceImageProcessor(); + + // Keep these constants for compatibility with other parts of the script + let retryCount = 0; + const MAX_RETRIES = 10; + const MAX_BATCH_RETRIES = 10; // Maximum attempts for batch sending + + function inject(callback) { + const script = document.createElement('script'); + script.textContent = `(${callback})();`; + document.documentElement?.appendChild(script); + script.remove(); + } + + inject(() => { + const fetchedBlobQueue = new Map(); + + window.addEventListener('message', (event) => { + const { source, blobID, blobData } = event.data; + if (source === 'auto-image-overlay' && blobID && blobData) { + const callback = fetchedBlobQueue.get(blobID); + if (typeof callback === 'function') { + callback(blobData); + } + fetchedBlobQueue.delete(blobID); + } + }); + + // Helper function to find closest color ID for assist mode + function findClosestColorId(r, g, b) { + let minDistance = Infinity; + let closestColorId = null; + + for (const colorData of Object.values(CONFIG.COLOR_MAP)) { + if (!colorData.rgb) continue; + + const distance = Math.sqrt( + Math.pow(r - colorData.rgb.r, 2) + + Math.pow(g - colorData.rgb.g, 2) + + Math.pow(b - colorData.rgb.b, 2) + ); + + if (distance < minDistance) { + minDistance = distance; + closestColorId = colorData.id; + } + } + + return closestColorId; + } + + const originalFetch = window.fetch; + // Setup fetch interceptions + console.log('🚀 [Auto-Image] Fetch interception initialized'); + + // Expose state for debugging + window.__WPLACE_AUTOBOT_STATE__ = state; + + window.fetch = async function (...args) { + let url = args[0] instanceof Request ? args[0].url : args[0]; + + // Parse URL if it's a string + let urlObj = null; + if (typeof url === 'string') { + try { + urlObj = new URL(url); + } catch (e) { + // Invalid URL, proceed normally + } + } + + // ASSIST MODE: Intercept pixel placement requests + if (state.paintingMode === 'assist' && urlObj !== null && urlObj.pathname.startsWith('/s0/pixel')) { + console.log(`🎯 [Assist Mode] Intercepting pixel placement:`, urlObj.pathname); + console.log(`🔍 [Assist Mode] Check state - imageData:`, !!state.imageData, 'startPosition:', !!state.startPosition, 'body:', !!args[1]?.body); + + // Check if we have overlay data + if (state.imageData && state.startPosition && args[1]?.body) { + try { + // Parse region coordinates from URL path: /s0/pixel/{tileX}/{tileY} + const pathParts = urlObj.pathname.split('/'); + const regionX = parseInt(pathParts[3]); + const regionY = parseInt(pathParts[4]); + + console.log(`📦 [Assist Mode] Region coords: (${regionX}, ${regionY})`); + + // Parse request body + const payload = typeof args[1].body === 'string' ? JSON.parse(args[1].body) : args[1].body; + console.log(`📝 [Assist Mode] Original payload:`, JSON.stringify(payload)); + + // Debug: Check what's in state.region + console.log(`🔍 [Assist Mode] state.region:`, state.region); + console.log(`🔍 [Assist Mode] state.startPosition:`, state.startPosition); + + // CRITICAL FIX: The issue is that startPosition is in TILE-LOCAL coordinates (0-999) + // but we're clicking on a tile at (1732, 1014). We need to find which tile + // our image overlay is on by checking all loaded tiles. + + // For now, let's use the REQUEST's tile coordinates as a reference + // If the user is clicking within this tile, check if our LOCAL startPosition + // would overlap with the click position + let startX, startY; + + // COORDINATE RECONSTRUCTION + // state.startPosition = LOCAL coords within a 1000x1000 tile (0-999) + // state.region = TILE coordinates {x, y} (e.g., {x: 1732, y: 1014}) + // Absolute canvas coords = region.x * 1000 + startPosition.x + + if (state.region && state.region.x !== undefined && state.region.y !== undefined) { + // Use saved region to reconstruct absolute coordinates + startX = state.region.x * 1000 + state.startPosition.x; + startY = state.region.y * 1000 + state.startPosition.y; + console.log(`[Assist Mode] Using saved region: tile=(${state.region.x},${state.region.y}) + local=(${state.startPosition.x},${state.startPosition.y}) = absolute (${startX},${startY})`); + } else { + // Fallback: assume image is on the clicked tile (may be wrong!) + // Since startPosition appears to be LOCAL coords within a tile, + // we need to convert them to absolute by finding which tile they're on. + // The simplest approach: assume the image is on the tile being clicked! + startX = regionX * 1000 + state.startPosition.x; + startY = regionY * 1000 + state.startPosition.y; + console.log(`[Assist Mode] No saved region - assuming image on clicked tile (${regionX},${regionY}): absolute = (${startX},${startY})`); + } + console.log(`� [Assist Mode] Assuming image is on clicked tile: absolute coords = (${startX},${startY})`); + + const { width, height } = state.imageData; + + console.log(`🖼️ [Assist Mode] Image bounds: start=(${startX},${startY}), size=${width}x${height}`); + + // Calculate which tiles the image spans + // Note: startX/startY are ABSOLUTE canvas coordinates (e.g., 1732432 means tile 1732, pixel 432) + const imageStartTileX = Math.floor(startX / 1000); + const imageStartTileY = Math.floor(startY / 1000); + const imageEndTileX = Math.floor((startX + width - 1) / 1000); + const imageEndTileY = Math.floor((startY + height - 1) / 1000); + + console.log(`🗺️ [Assist Mode] Image tiles: X[${imageStartTileX}-${imageEndTileX}], Y[${imageStartTileY}-${imageEndTileY}]`); + console.log(`🎯 [Assist Mode] Checking if region (${regionX},${regionY}) overlaps...`); + + if (regionX >= imageStartTileX && regionX <= imageEndTileX && + regionY >= imageStartTileY && regionY <= imageEndTileY) { + + console.log(`✅ [Assist Mode] Region (${regionX},${regionY}) overlaps with image - modifying pixels`); + + // Modify the colors array based on overlay data + if (payload.coords && payload.colors) { + let modifiedCount = 0; + + for (let i = 0; i < payload.coords.length; i += 2) { + // Calculate absolute pixel position + const absoluteX = regionX * 1000 + payload.coords[i]; + const absoluteY = regionY * 1000 + payload.coords[i + 1]; + + // Calculate position relative to our image + const imgX = absoluteX - startX; + const imgY = absoluteY - startY; + + console.log(`🎨 [Assist Mode] Pixel ${i/2}: absolute=(${absoluteX},${absoluteY}), relative=(${imgX},${imgY})`); + + // Check if pixel is within our image bounds + if (imgX >= 0 && imgX < width && imgY >= 0 && imgY < height) { + // Get color from processed image data + // Note: state.imageData uses 'pixels' property, not 'data' + const pixelData = state.imageData.pixels || state.imageData.data; + if (!pixelData) { + console.error(`❌ [Assist Mode] No pixel data available in state.imageData`); + continue; + } + + const pixelIndex = (imgY * width + imgX) * 4; + const r = pixelData[pixelIndex]; + const g = pixelData[pixelIndex + 1]; + const b = pixelData[pixelIndex + 2]; + const a = pixelData[pixelIndex + 3]; + + console.log(`🎨 [Assist Mode] Color at (${imgX},${imgY}): rgba(${r},${g},${b},${a}), original colorId: ${payload.colors[i/2]}`); + + // Skip transparent pixels + if (a < CONFIG.TRANSPARENCY_THRESHOLD) { + console.log(`⏭️ [Assist Mode] Skipping transparent pixel`); + continue; + } + + // Find matching color from palette + const colorId = findClosestColorId(r, g, b); + console.log(`🔍 [Assist Mode] Found closest colorId: ${colorId}`); + if (colorId) { + const oldColorId = payload.colors[i / 2]; + payload.colors[i / 2] = colorId; + console.log(`✏️ [Assist Mode] Changed colorId from ${oldColorId} to ${colorId}`); + modifiedCount++; + } + } else { + console.log(`❌ [Assist Mode] Pixel out of bounds`); + } + } + + // Update request body with modified payload + args[1] = { + ...args[1], + body: JSON.stringify(payload) + }; + + console.log(`✅ [Assist Mode] Modified ${modifiedCount} pixel color(s)`); + console.log(`📝 [Assist Mode] Modified payload:`, JSON.stringify(payload)); + } else { + console.warn(`⚠️ [Assist Mode] Payload missing coords or colors`); + } + } else { + console.log(`⏭️ [Assist Mode] Region (${regionX},${regionY}) does NOT overlap with image`); + } + } catch (error) { + console.error('❌ [Assist Mode] Error intercepting pixel placement:', error); + console.error(error.stack); + } + } else { + console.warn('⚠️ [Assist Mode] No overlay data available - imageData:', !!state.imageData, 'startPosition:', !!state.startPosition); + } + } + + const response = await originalFetch.apply(this, args); + + // TILE REQUEST logging removed to reduce console spam + + if (typeof url === 'string') { + if (url.includes('https://backend.wplace.live/s0/pixel/')) { + try { + const payload = JSON.parse(args[1].body); + if (payload.t) { + console.log( + `🔍✅ Turnstile Token Captured - Type: ${typeof payload.t}, Value: ${payload.t + ? typeof payload.t === 'string' + ? payload.t.length > 50 + ? payload.t.substring(0, 50) + '...' + : payload.t + : JSON.stringify(payload.t) + : 'null/undefined' + }, Length: ${payload.t?.length || 0}` + ); + window.postMessage({ source: 'turnstile-capture', token: payload.t }, '*'); + } + } catch (_) { + /* ignore */ + } + } + + const contentType = response.headers.get('content-type') || ''; + if (contentType.includes('image/png') && url.includes('.png')) { + const cloned = response.clone(); + return new Promise(async (resolve) => { + const blobUUID = crypto.randomUUID(); + const originalBlob = await cloned.blob(); + + fetchedBlobQueue.set(blobUUID, (processedBlob) => { + resolve( + new Response(processedBlob, { + headers: cloned.headers, + status: cloned.status, + statusText: cloned.statusText, + }) + ); + }); + + window.postMessage( + { + source: 'auto-image-tile', + endpoint: url, + blobID: blobUUID, + blobData: originalBlob, + }, + '*' + ); + }); + } + } + + return response; + }; + }); + + window.addEventListener('message', (event) => { + const { source, endpoint, blobID, blobData } = event.data; + + if (source === 'auto-image-tile' && endpoint && blobID && blobData) { + overlayManager.processAndRespondToTileRequest(event.data); + } + + // Token capture is now handled by TokenManager module + // No need to handle 'turnstile-capture' events here + }); + + async function detectLanguage() { + try { + const response = await fetch('https://backend.wplace.live/me', { + credentials: 'include', + }); + const data = await response.json(); + state.language = data.language === 'pt' ? 'pt' : 'en'; + } catch { + state.language = navigator.language.startsWith('pt') ? 'pt' : 'en'; + } + } + + // UTILITY FUNCTIONS WRAPPER - Uses WPlaceUtilsManager for modular functionality + const Utils = { + // Basic utilities + sleep: (ms) => window.globalUtilsManager ? window.globalUtilsManager.sleep(ms) : new Promise(r => setTimeout(r, ms)), + dynamicSleep: (tickAndGetRemainingMs) => window.globalUtilsManager ? window.globalUtilsManager.dynamicSleep(tickAndGetRemainingMs) : Promise.resolve(), + waitForSelector: (selector, interval, timeout) => window.globalUtilsManager ? window.globalUtilsManager.waitForSelector(selector, interval, timeout) : Promise.resolve(null), + msToTimeText: (ms) => window.globalUtilsManager ? window.globalUtilsManager.msToTimeText(ms) : `${Math.ceil(ms / 1000)}s`, + createScrollToAdjust: (element, updateCallback, min, max, step) => window.globalUtilsManager ? window.globalUtilsManager.createScrollToAdjust(element, updateCallback, min, max, step) : () => { }, + + // Tile calculation + calculateTileRange: (startRegionX, startRegionY, startPixelX, startPixelY, width, height, tileSize) => + window.globalUtilsManager ? window.globalUtilsManager.calculateTileRange(startRegionX, startRegionY, startPixelX, startPixelY, width, height, tileSize) : {}, + + // Token management + loadTurnstile: () => window.globalUtilsManager ? window.globalUtilsManager.loadTurnstile() : Promise.resolve(), + ensureTurnstileContainer: () => window.globalUtilsManager ? window.globalUtilsManager.ensureTurnstileContainer() : Promise.resolve(), + ensureTurnstileOverlayContainer: () => window.globalUtilsManager ? window.globalUtilsManager.ensureTurnstileOverlayContainer() : Promise.resolve(), + executeTurnstile: (sitekey, action) => window.globalUtilsManager ? window.globalUtilsManager.executeTurnstile(sitekey, action) : Promise.resolve(null), + createTurnstileWidget: (sitekey, action) => window.globalUtilsManager ? window.globalUtilsManager.createTurnstileWidget(sitekey, action) : Promise.resolve(), + createTurnstileWidgetInteractive: (sitekey, action) => window.globalUtilsManager ? window.globalUtilsManager.createTurnstileWidgetInteractive(sitekey, action) : Promise.resolve(), + cleanupTurnstile: () => window.globalUtilsManager ? window.globalUtilsManager.cleanupTurnstile() : Promise.resolve(), + obtainSitekeyAndToken: (fallback) => window.globalUtilsManager ? window.globalUtilsManager.obtainSitekeyAndToken(fallback) : Promise.resolve(fallback), + + // DOM utilities + createElement: (tag, props, children) => window.globalUtilsManager ? window.globalUtilsManager.createElement(tag, props, children) : document.createElement(tag), + createButton: (id, text, icon, onClick, style) => { + if (window.globalUtilsManager) { + return window.globalUtilsManager.createButton(id, text, icon, onClick, style); + } + const btn = document.createElement('button'); + btn.id = id; + btn.innerHTML = `${icon ? `` : ''}${text}`; + if (onClick) btn.addEventListener('click', onClick); + return btn; + }, + + // Translation with fallback + t: (key, params) => { + if (window.globalUtilsManager) { + return window.globalUtilsManager.t(key, params); + } + return getText(key, params); + }, + + // Open website color palette if not already open + openColorPalette: () => { + try { + // Check if color palette modal is already open + const paletteModal = document.querySelector('dialog[open]'); + if (paletteModal) { + console.log('✅ Color palette already open'); + return true; + } + + // Search for Paint/Pintar button (like Auto-Farm does) + const allButtons = Array.from(document.querySelectorAll('button')); + const paletteButton = allButtons.find(btn => + /(Pintar|Paint)/i.test(btn.textContent.trim()) + ); + + if (paletteButton) { + console.log('🎨 Opening color palette automatically...'); + paletteButton.click(); + return true; + } + + console.warn('⚠️ Color palette button not found'); + return false; + } catch (error) { + console.error('❌ Error opening color palette:', error); + return false; + } + }, + + showAlert: (message, type) => { + if (window.globalUtilsManager) { + window.globalUtilsManager.showAlert(message, type); + } else { + console.log(`Alert [${type}]: ${message}`); + } + }, + + hideAlert: () => { + // Remove existing alerts immediately with safety checks + const alerts = document.querySelectorAll('.wplace-alert-base'); + alerts.forEach(alert => { + try { + if (alert && alert.parentNode) { + alert.parentNode.removeChild(alert); + } + } catch (error) { + // Ignore removeChild errors if element was already removed + console.debug('Alert already removed:', error); + } + }); + }, + + // Color utilities + colorDistance: (a, b) => window.globalUtilsManager ? window.globalUtilsManager.colorDistance(a, b) : Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2) + Math.pow(a[2] - b[2], 2)), + findClosestPaletteColor: (r, g, b, palette) => window.globalUtilsManager ? window.globalUtilsManager.findClosestPaletteColor(r, g, b, palette) : [r, g, b], + isWhitePixel: (r, g, b) => window.globalUtilsManager ? window.globalUtilsManager.isWhitePixel(r, g, b) : (r > 240 && g > 240 && b > 240), + resolveColor: (targetRgb, availableColors, exactMatch) => window.globalUtilsManager ? window.globalUtilsManager.resolveColor(targetRgb, availableColors, exactMatch) : targetRgb, + + // CRITICAL FUNCTIONS - Direct implementations to ensure they work + createImageUploader: () => { + return new Promise((resolve, reject) => { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = 'image/*'; + input.onchange = (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.onerror = () => reject(new Error('File reading error')); + reader.readAsDataURL(file); + } else { + reject(new Error('No file selected')); + } + }; + input.click(); + }); + }, + + createFileUploader: () => { + return new Promise((resolve, reject) => { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = '.json'; + input.onchange = (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = () => { + try { + const data = JSON.parse(reader.result); + resolve(data); + } catch (error) { + reject(new Error('Invalid JSON file')); + } + }; + reader.onerror = () => reject(new Error('File reading error')); + reader.readAsText(file); + } else { + reject(new Error('No file selected')); + } + }; + input.click(); + }); + }, + + createFileDownloader: (data, filename) => { + const blob = new Blob([data], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, + + loadProgress: () => { + try { + const saved = localStorage.getItem('wplace-bot-progress'); + if (!saved) return null; + return JSON.parse(saved); + } catch (error) { + console.error('Error loading progress:', error); + return null; + } + }, + + saveProgress: () => { + try { + // Use utils manager to build proper save structure like old version + const data = window.globalUtilsManager ? + window.globalUtilsManager.buildProgressData() : + { + timestamp: Date.now(), + version: '2.2', + state: { + totalPixels: window.state.totalPixels, + paintedPixels: window.state.paintedPixels, + lastPosition: window.state.lastPosition, + startPosition: window.state.startPosition, + region: window.state.region, + imageLoaded: window.state.imageLoaded, + colorsChecked: window.state.colorsChecked, + coordinateMode: window.state.coordinateMode, + coordinateDirection: window.state.coordinateDirection, + coordinateSnake: window.state.coordinateSnake, + blockWidth: window.state.blockWidth, + blockHeight: window.state.blockHeight, + availableColors: window.state.availableColors, + }, + imageData: window.state.imageData ? { + width: window.state.imageData.width, + height: window.state.imageData.height, + pixels: Array.from(window.state.imageData.pixels), + totalPixels: window.state.imageData.totalPixels, + } : null, + paintedMapPacked: window.globalUtilsManager ? + window.globalUtilsManager.buildPaintedMapPacked() : null + }; + + // Attempt to save; if payload is too large (QuotaExceeded), retry without heavy pixel data + try { + localStorage.setItem('wplace-bot-progress', JSON.stringify(data)); + return true; + } catch (e) { + // Fallback: strip image pixels to reduce size and retry + if (data && data.imageData && data.imageData.pixels) { + const slimData = { + ...data, + imageData: { + width: data.imageData.width, + height: data.imageData.height, + totalPixels: data.imageData.totalPixels, + pixelsStripped: true, + } + }; + try { + localStorage.setItem('wplace-bot-progress', JSON.stringify(slimData)); + console.warn('Saved progress without raw pixel data due to storage quota limits.'); + return true; + } catch (e2) { + try { + // Last resort: try sessionStorage + sessionStorage.setItem('wplace-bot-progress', JSON.stringify(slimData)); + console.warn('Saved progress to sessionStorage without pixel data due to storage quota limits.'); + return true; + } catch (e3) { + throw e2; // will be handled by outer catch + } + } + } + throw e; + } + } catch (error) { + console.error('Error saving progress:', error); + return false; + } + }, + + clearProgress: () => { + try { + localStorage.removeItem('wplace-bot-progress'); + if (window.state) { + window.state.paintedMap = null; + window.state._lastSavePixelCount = 0; + window.state._lastSaveTime = 0; + } + return true; + } catch (error) { + console.error('Error clearing progress:', error); + return false; + } + }, + + restoreProgress: (savedData) => { + try { + console.log('🔍 [DEBUG] RestoreProgress: Starting restoration...'); + console.log('🔍 [DEBUG] SavedData exists:', !!savedData); + console.log('🔍 [DEBUG] SavedData.state exists:', !!savedData?.state); + + if (!savedData || !savedData.state) { + console.error('❌ [DEBUG] RestoreProgress: Invalid savedData or missing state'); + return false; + } + + console.log('🔍 [DEBUG] Current window.state keys before restore:', Object.keys(window.state || {})); + console.log('🔍 [DEBUG] SavedData.state keys:', Object.keys(savedData.state)); + + console.log('🔍 [DEBUG] Performing Object.assign...'); + Object.assign(window.state, savedData.state); + + // Reset session-specific flags when loading a new save file + window.state.preFilteringDone = false; + window.state.progressResetDone = false; + console.log('🔄 Reset session flags for new save file load'); + + console.log('✅ [DEBUG] Object.assign completed successfully'); + + // Restore available colors from old save files (backward compatibility) + if (savedData.state.availableColors && Array.isArray(savedData.state.availableColors)) { + console.log('🔍 [DEBUG] Restoring availableColors, count:', savedData.state.availableColors.length); + window.state.availableColors = savedData.state.availableColors; + window.state.colorsChecked = true; // Mark colors as checked + console.log('✅ [DEBUG] AvailableColors restored successfully'); + } else { + console.log('⚠️ [DEBUG] No availableColors found in savedData or not an array'); + } + + // Track if we successfully restored image data + let imageDataRestored = false; + + if (savedData.imageData && Array.isArray(savedData.imageData.pixels)) { + console.log('🔍 [DEBUG] Restoring imageData...'); + console.log('🔍 [DEBUG] ImageData type check - pixels is array:', Array.isArray(savedData.imageData.pixels)); + console.log('🔍 [DEBUG] ImageData pixels length:', savedData.imageData.pixels?.length); + + window.state.imageData = { + ...savedData.imageData, + pixels: new Uint8ClampedArray(savedData.imageData.pixels), + }; + imageDataRestored = true; // ✅ Mark that we restored image data + console.log('✅ [DEBUG] ImageData restored successfully'); + console.log('🔍 [DEBUG] Converted pixels to Uint8ClampedArray, length:', window.state.imageData.pixels.length); + } else if (savedData.imageData && savedData.imageData.pixelsRef) { + console.warn('ℹ️ [DEBUG] Large image detected; loading pixels from IndexedDB via ref:', savedData.imageData.pixelsRef); + window.state.imageData = { + width: savedData.imageData.width, + height: savedData.imageData.height, + totalPixels: savedData.imageData.totalPixels, + pixels: null, + }; + window.state.imageLoaded = false; + + if (window.globalUtilsManager && typeof window.globalUtilsManager.loadPixelsFromIndexedDB === 'function') { + window.globalUtilsManager.loadPixelsFromIndexedDB(savedData.imageData.pixelsRef) + .then(payload => { + if (!payload || !payload.pixels) { + console.warn('⚠️ [DEBUG] Pixels not found in IDB. Ask user to reload image.'); + return; + } + window.state.imageData.pixels = new Uint8ClampedArray(payload.pixels); + window.state.imageLoaded = true; + console.log('✅ [DEBUG] Pixels loaded from IDB'); + + // ✅ CRITICAL FIX: Update data buttons after async IDB load completes + if (typeof window.updateDataButtons === 'function') { + window.updateDataButtons(); + } + + // Try to restore overlay immediately + if (typeof window.globalUtilsManager.restoreOverlayFromData === 'function') { + window.globalUtilsManager.restoreOverlayFromData().catch(() => {}); + } + }) + .catch(err => console.warn('❌ [DEBUG] Failed to load pixels from IDB:', err)); + } + } else if (savedData.imageData && savedData.imageData.pixelsStripped) { + console.warn('⚠️ [DEBUG] Saved progress did not include raw pixel data due to quota limits. Please reload the image file to resume.'); + // Preserve dimensions for UI, but mark image as not loaded + window.state.imageData = { + width: savedData.imageData.width, + height: savedData.imageData.height, + totalPixels: savedData.imageData.totalPixels, + pixels: null, + }; + window.state.imageLoaded = false; + } else { + console.log('⚠️ [DEBUG] No imageData found in savedData'); + } + + if (savedData.paintedMap) { + console.log('🔍 [DEBUG] Restoring paintedMap...'); + window.state.paintedMap = savedData.paintedMap.map((row) => Array.from(row)); + console.log('✅ [DEBUG] PaintedMap restored successfully'); + } else { + console.log('🔍 [DEBUG] No paintedMap found in savedData (this is normal for extracted data)'); + } + + // ✅ CRITICAL FIX: Set imageLoaded based on whether we actually have pixel data + // This must be done AFTER Object.assign to override any stale value from savedData.state + if (imageDataRestored) { + window.state.imageLoaded = true; + console.log('✅ [DEBUG] Set window.state.imageLoaded = true (image data was successfully restored)'); + } else if (window.state.imageData && window.state.imageData.pixels) { + window.state.imageLoaded = true; + console.log('✅ [DEBUG] Set window.state.imageLoaded = true (image data exists with pixels)'); + } else { + window.state.imageLoaded = false; + console.log('⚠️ [DEBUG] Set window.state.imageLoaded = false (no valid image data)'); + } + + console.log('✅ [DEBUG] RestoreProgress completed successfully'); + console.log('🔍 [DEBUG] Final window.state.imageLoaded:', window.state.imageLoaded); + console.log('🔍 [DEBUG] Final window.state.totalPixels:', window.state.totalPixels); + + return true; + } catch (error) { + console.error('❌ [DEBUG] Error in restoreProgress:', error); + console.error('❌ [DEBUG] Error stack:', error.stack); + console.error('❌ [DEBUG] SavedData structure at error:', JSON.stringify(savedData, null, 2)); + return false; + } + }, + + saveProgressToFile: () => { + try { + // ✅ CRITICAL: When saving to FILE, ALWAYS include pixels directly (not IndexedDB reference) + // Files are portable and don't have access to IndexedDB + const progressData = { + timestamp: Date.now(), + version: '2.2', + state: { + totalPixels: window.state.totalPixels, + paintedPixels: window.state.paintedPixels, + lastPosition: window.state.lastPosition, + startPosition: window.state.startPosition, + region: window.state.region, + imageLoaded: window.state.imageLoaded, + colorsChecked: window.state.colorsChecked, + coordinateMode: window.state.coordinateMode, + coordinateDirection: window.state.coordinateDirection, + coordinateSnake: window.state.coordinateSnake, + blockWidth: window.state.blockWidth, + blockHeight: window.state.blockHeight, + availableColors: window.state.availableColors, + }, + imageData: window.state.imageData && window.state.imageData.pixels ? { + width: window.state.imageData.width, + height: window.state.imageData.height, + pixels: Array.from(window.state.imageData.pixels), + totalPixels: window.state.imageData.totalPixels, + } : null, + paintedMapPacked: window.globalUtilsManager ? + window.globalUtilsManager.buildPaintedMapPacked() : null + }; + + const filename = `wplace-bot-progress-${new Date() + .toISOString() + .slice(0, 19) + .replace(/:/g, '-')}.json`; + Utils.createFileDownloader(JSON.stringify(progressData, null, 2), filename); + return true; + } catch (error) { + console.error('Error saving to file:', error); + return false; + } + }, + + loadProgressFromFile: async () => { + try { + console.log('🔍 [DEBUG] Starting file upload process...'); + const data = await Utils.createFileUploader(); + + console.log('🔍 [DEBUG] File upload completed. Data type:', typeof data); + console.log('🔍 [DEBUG] Data exists:', !!data); + + if (!data) { + console.error('❌ [DEBUG] No data received from file uploader'); + throw new Error('No data received from file'); + } + + console.log('🔍 [DEBUG] Data keys:', Object.keys(data)); + console.log('🔍 [DEBUG] Data.state exists:', !!data.state); + console.log('🔍 [DEBUG] Data.imageData exists:', !!data.imageData); + console.log('🔍 [DEBUG] Data.version:', data.version); + console.log('🔍 [DEBUG] Data.timestamp:', data.timestamp); + + if (!data.state) { + console.error('❌ [DEBUG] Missing state object in loaded data'); + console.log('🔍 [DEBUG] Available top-level keys:', Object.keys(data)); + throw new Error('Invalid file format - missing state object'); + } + + console.log('🔍 [DEBUG] State object keys:', Object.keys(data.state)); + console.log('🔍 [DEBUG] State.imageLoaded:', data.state.imageLoaded); + console.log('🔍 [DEBUG] State.totalPixels:', data.state.totalPixels); + console.log('🔍 [DEBUG] State.startPosition:', data.state.startPosition); + console.log('🔍 [DEBUG] State.region:', data.state.region); + + if (data.imageData) { + console.log('🔍 [DEBUG] ImageData width:', data.imageData.width); + console.log('🔍 [DEBUG] ImageData height:', data.imageData.height); + console.log('🔍 [DEBUG] ImageData pixels length:', data.imageData.pixels?.length); + console.log('🔍 [DEBUG] ImageData totalPixels:', data.imageData.totalPixels); + } + + console.log('🔍 [DEBUG] Calling restoreProgress...'); + const success = Utils.restoreProgress(data); + console.log('🔍 [DEBUG] RestoreProgress result:', success); + + return success; + } catch (error) { + console.error('❌ [DEBUG] Error in loadProgressFromFile:', error); + console.error('❌ [DEBUG] Error stack:', error.stack); + return false; + } + }, + + loadExtractedFileData: async () => { + try { + console.log('🔍 [DEBUG] Starting Art-Extractor file upload process...'); + const data = await Utils.createFileUploader(); + + console.log('🔍 [DEBUG] File upload completed. Data type:', typeof data); + console.log('🔍 [DEBUG] Data exists:', !!data); + console.log('📖 Raw loaded data:', data); + + if (!data) { + console.error('❌ [DEBUG] No data received from file uploader'); + return null; + } + + console.log('🔍 [DEBUG] Data keys:', Object.keys(data)); + console.log('🔍 [DEBUG] Data.state exists:', !!data.state); + console.log('🔍 [DEBUG] Data.imageData exists:', !!data.imageData); + console.log('🔍 [DEBUG] Data.version:', data.version); + console.log('🔍 [DEBUG] Data.timestamp:', data.timestamp); + + console.log('🔍 [DEBUG] Returning raw data object for Load Extracted feature'); + return data; + } catch (error) { + console.error('❌ [DEBUG] Error in loadExtractedFileData:', error); + return null; + } + }, + + // Other utilities - delegate to globalUtilsManager or provide simple fallbacks + extractAvailableColors: () => { + if (window.globalUtilsManager) { + return window.globalUtilsManager.extractAvailableColors(); + } else if (window.globalImageProcessor) { + return window.globalImageProcessor.extractAvailableColors(window.CONFIG.COLOR_MAP); + } else { + return []; + } + }, + formatTime: (ms) => window.globalUtilsManager ? window.globalUtilsManager.formatTime(ms) : `${Math.floor(ms / 1000)}s`, + calculateEstimatedTime: (remainingPixels, charges, cooldown) => window.globalUtilsManager ? window.globalUtilsManager.calculateEstimatedTime(remainingPixels, charges, cooldown) : 0, + initializePaintedMap: (width, height) => window.globalUtilsManager ? window.globalUtilsManager.initializePaintedMap(width, height) : console.log('Painted map not available'), + markPixelPainted: (x, y, regionX, regionY) => window.globalUtilsManager ? window.globalUtilsManager.markPixelPainted(x, y, regionX, regionY) : false, + isPixelPainted: (x, y, regionX, regionY) => window.globalUtilsManager ? window.globalUtilsManager.isPixelPainted(x, y, regionX, regionY) : false, + shouldAutoSave: () => window.globalUtilsManager ? window.globalUtilsManager.shouldAutoSave() : false, + performSmartSave: () => window.globalUtilsManager ? window.globalUtilsManager.performSmartSave() : false, + packPaintedMapToBase64: (paintedMap, width, height) => window.globalUtilsManager ? window.globalUtilsManager.packPaintedMapToBase64(paintedMap, width, height) : null, + unpackPaintedMapFromBase64: (base64, width, height) => window.globalUtilsManager ? window.globalUtilsManager.unpackPaintedMapFromBase64(base64, width, height) : null, + migrateProgressToV2: (saved) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgressToV2(saved) : saved, + migrateProgressToV21: (saved) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgressToV21(saved) : saved, + migrateProgressToV22: (data) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgressToV22(data) : data, + buildPaintedMapPacked: () => window.globalUtilsManager ? window.globalUtilsManager.buildPaintedMapPacked() : null, + buildProgressData: () => window.globalUtilsManager ? window.globalUtilsManager.buildProgressData() : {}, + migrateProgress: (saved) => window.globalUtilsManager ? window.globalUtilsManager.migrateProgress(saved) : saved, + restoreOverlayFromData: () => window.globalUtilsManager ? window.globalUtilsManager.restoreOverlayFromData() : Promise.resolve(false), + updateCoordinateUI: (config) => window.globalUtilsManager ? window.globalUtilsManager.updateCoordinateUI(config) : console.log('Coordinate UI update not available'), + }; + + // IMAGE PROCESSOR WRAPPER - Uses WPlaceImageProcessor for modular functionality + class ImageProcessor { + constructor(imageSrc) { + // Create instance of the modular ImageProcessor + this._processor = new window.WPlaceImageProcessor(imageSrc); + + // Legacy compatibility properties + this.imageSrc = imageSrc; + this.img = null; + this.canvas = null; + this.ctx = null; + } + + async load() { + await this._processor.load(); + + // Update legacy properties for compatibility + this.img = this._processor.img; + this.canvas = this._processor.canvas; + this.ctx = this._processor.ctx; + } + + getDimensions() { + return this._processor.getDimensions(); + } + + getPixelData() { + return this._processor.getPixelData(); + } + + resize(newWidth, newHeight) { + const result = this._processor.resize(newWidth, newHeight); + + // Update legacy properties + this.img = this._processor.img; + this.canvas = this._processor.canvas; + this.ctx = this._processor.ctx; + + return result; + } + + generatePreview(width, height) { + return this._processor.generatePreview(width, height); + } + + // Cleanup method + cleanup() { + if (this._processor) { + this._processor.cleanup(); + } + } + } + + // WPLACE API SERVICE + const WPlaceService = { + async paintPixelInRegion(regionX, regionY, pixelX, pixelY, color) { + try { + await ensureToken(); + if (!getTurnstileToken()) return 'token_error'; + const payload = { + coords: [pixelX, pixelY], + colors: [color], + t: getTurnstileToken(), + fp: fpStr32, + }; + var token = await createWasmToken(regionX, regionY, payload); + const res = await fetch(`https://backend.wplace.live/s0/pixel/${regionX}/${regionY}`, { + method: 'POST', + headers: { 'Content-Type': 'text/plain;charset=UTF-8', "x-pawtect-token": token }, + credentials: 'include', + body: JSON.stringify(payload), + }); + if (res.status === 403) { + console.error('❌ 403 Forbidden. Turnstile token might be invalid or expired.'); + setTurnstileToken(null); + createTokenPromise(); + return 'token_error'; + } + const data = await res.json(); + return data?.painted === 1; + } catch (e) { + console.error('Paint request failed:', e); + return false; + } + }, + + async getCharges() { + try { + const res = await fetch(`https://backend.wplace.live/me?_=${Date.now()}` , { + credentials: "include", + cache: 'no-store' + }) + const data = await res.json() + return { + id: data.id, + charges: data.charges?.count || 0, + max: data.charges?.max || 1, + cooldown: data.charges?.next || CONFIG.COOLDOWN_DEFAULT, + droplets: data.droplets || 0, + } + } catch (e) { + console.error("Failed to get charges:", e) + return { + id: null, + charges: 0, + max: 1, + cooldown: CONFIG.COOLDOWN_DEFAULT, + droplets: 0, + } + } + }, + + async fetchCheck() { + try { + const res = await fetch(`https://backend.wplace.live/me?_=${Date.now()}` , { + credentials: "include", + cache: 'no-store' + }) + const data = await res.json() + return { + ID: data.id, + Username: data.username || data.name || null, + Charges: data.charges.count, + Max: data.charges.max, + Droplets: data.droplets + } + } catch (e) { + console.error("Failed to get ID:", e) + return { + + } + } + } + }; + + // Desktop Notification Manager + const NotificationManager = { + pollTimer: null, + pollIntervalMs: 60_000, + icon() { + const link = document.querySelector("link[rel~='icon']"); + return link?.href || location.origin + '/favicon.ico'; + }, + async requestPermission() { + if (!('Notification' in window)) { + Utils.showAlert(Utils.t('notificationsNotSupported'), 'warning'); + return 'denied'; + } + if (Notification.permission === 'granted') return 'granted'; + try { + const perm = await Notification.requestPermission(); + return perm; + } catch { + return Notification.permission; + } + }, + canNotify() { + return ( + state.notificationsEnabled && + typeof Notification !== 'undefined' && + Notification.permission === 'granted' + ); + }, + notify(title, body, tag = 'wplace-charges', force = false) { + if (!this.canNotify()) return false; + if (!force && state.notifyOnlyWhenUnfocused && document.hasFocus()) return false; + try { + new Notification(title, { + body, + tag, + renotify: true, + icon: this.icon(), + badge: this.icon(), + silent: false, + }); + return true; + } catch { + // Graceful fallback + Utils.showAlert(body, 'info'); + return false; + } + }, + resetEdgeTracking() { + state._lastChargesBelow = state.displayCharges < state.cooldownChargeThreshold; + state._lastChargesNotifyAt = 0; + }, + maybeNotifyChargesReached(force = false) { + if (!state.notificationsEnabled || !state.notifyOnChargesReached) return; + const reached = state.displayCharges >= state.cooldownChargeThreshold; + const now = Date.now(); + const repeatMs = Math.max(1, Number(state.notificationIntervalMinutes || 5)) * 60_000; + if (reached) { + const shouldEdge = state._lastChargesBelow || force; + const shouldRepeat = now - (state._lastChargesNotifyAt || 0) >= repeatMs; + if (shouldEdge || shouldRepeat) { + const msg = Utils.t('chargesReadyMessage', { + current: state.displayCharges, + max: state.maxCharges, + threshold: state.cooldownChargeThreshold, + }); + this.notify(Utils.t('chargesReadyNotification'), msg, 'wplace-notify-charges'); + state._lastChargesNotifyAt = now; + } + state._lastChargesBelow = false; + } else { + state._lastChargesBelow = true; + } + }, + startPolling() { + this.stopPolling(); + if (!state.notificationsEnabled || !state.notifyOnChargesReached) return; + // lightweight background polling + this.pollTimer = setInterval(async () => { + try { + const { charges, cooldown, max } = await WPlaceService.getCharges(); + state.displayCharges = Math.floor(charges); + state.cooldown = cooldown; + state.maxCharges = Math.max(1, Math.floor(max)); + this.maybeNotifyChargesReached(); + } catch { + /* ignore */ + } + }, this.pollIntervalMs); + }, + stopPolling() { + if (this.pollTimer) { + clearInterval(this.pollTimer); + this.pollTimer = null; + } + }, + syncFromState() { + this.resetEdgeTracking(); + if (state.notificationsEnabled && state.notifyOnChargesReached) this.startPolling(); + else this.stopPolling(); + }, + }; + + // COLOR MATCHING FUNCTION - Optimized with caching + const colorCache = new Map(); + + // UI UPDATE FUNCTIONS (declared early to avoid reference errors) + let updateUI = () => { }; + let updateStats = async () => { }; + let updateDataButtons = () => { }; + + function updateActiveColorPalette() { + state.activeColorPalette = []; + const activeSwatches = document.querySelectorAll('.wplace-color-swatch.active'); + if (activeSwatches) { + activeSwatches.forEach((swatch) => { + const rgbStr = swatch.getAttribute('data-rgb'); + if (rgbStr) { + const rgb = rgbStr.split(',').map(Number); + state.activeColorPalette.push(rgb); + } + }); + } + if (document.querySelector('.resize-container')?.style.display === 'block') { + _updateResizePreview(); + } + } + + function toggleAllColors(select, showingUnavailable = false) { + const swatches = document.querySelectorAll('.wplace-color-swatch'); + if (swatches) { + swatches.forEach((swatch) => { + // Only toggle colors that are available or if we're showing unavailable colors + const isUnavailable = swatch.classList.contains('unavailable'); + if (!isUnavailable || showingUnavailable) { + // Don't try to select unavailable colors + if (!isUnavailable) { + swatch.classList.toggle('active', select); + } + } + }); + } + updateActiveColorPalette(); + } + + function unselectAllPaidColors() { + const swatches = document.querySelectorAll('.wplace-color-swatch'); + if (swatches) { + swatches.forEach((swatch) => { + const colorId = parseInt(swatch.getAttribute('data-color-id'), 10); + if (!isNaN(colorId) && colorId >= 32) { + swatch.classList.toggle('active', false); + } + }); + } + updateActiveColorPalette(); + } + + function initializeColorPalette(container) { + const colorsContainer = container.querySelector('#colors-container'); + const showAllToggle = container.querySelector('#showAllColorsToggle'); + if (!colorsContainer) return; + + // Use already captured colors from state (captured during upload) + // Don't re-fetch colors here, use what was captured when user clicked upload + if (!state.availableColors || state.availableColors.length === 0) { + // If no colors have been captured yet, show message + colorsContainer.innerHTML = `
    ${Utils.t( + 'uploadImageFirst' + )}
    `; + return; + } + + function populateColors(showUnavailable = false) { + colorsContainer.innerHTML = ''; + let availableCount = 0; + let totalCount = 0; + + // Convert COLOR_MAP to array and filter out transparent + const allColors = Object.values(CONFIG.COLOR_MAP).filter((color) => color.rgb !== null); + + allColors.forEach((colorData) => { + const { id, name, rgb } = colorData; + const rgbKey = `${rgb.r},${rgb.g},${rgb.b}`; + totalCount++; + + // Check if this color is available in the captured colors + const isAvailable = state.availableColors.some( + (c) => c.rgb[0] === rgb.r && c.rgb[1] === rgb.g && c.rgb[2] === rgb.b + ); + + // If not showing all colors and this color is not available, skip it + if (!showUnavailable && !isAvailable) { + return; + } + + if (isAvailable) availableCount++; + + const colorItem = Utils.createElement('div', { + className: 'wplace-color-item', + }); + const swatch = Utils.createElement('button', { + className: `wplace-color-swatch ${!isAvailable ? 'unavailable' : ''}`, + title: `${name} (ID: ${id})${!isAvailable ? ' (Unavailable)' : ''}`, + 'data-rgb': rgbKey, + 'data-color-id': id, + }); + swatch.style.backgroundColor = `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`; + + // Make unavailable colors visually distinct + if (!isAvailable) { + swatch.style.opacity = '0.4'; + swatch.style.filter = 'grayscale(50%)'; + swatch.disabled = true; + } else { + // Select available colors by default + swatch.classList.add('active'); + } + + const nameLabel = Utils.createElement( + 'span', + { + className: 'wplace-color-item-name', + style: !isAvailable ? 'color: #888; font-style: italic;' : '', + }, + name + (!isAvailable ? ' (N/A)' : '') + ); + + // Only add click listener for available colors + if (isAvailable) { + swatch.addEventListener('click', () => { + swatch.classList.toggle('active'); + updateActiveColorPalette(); + }); + } + + colorItem.appendChild(swatch); + colorItem.appendChild(nameLabel); + colorsContainer.appendChild(colorItem); + }); + + updateActiveColorPalette(); + } + + // Initialize with only available colors + populateColors(false); + + // Add toggle functionality + if (showAllToggle) { + showAllToggle.addEventListener('change', (e) => { + populateColors(e.target.checked); + }); + } + + container + .querySelector('#selectAllBtn') + ?.addEventListener('click', () => toggleAllColors(true, showAllToggle?.checked)); + container + .querySelector('#unselectAllBtn') + ?.addEventListener('click', () => toggleAllColors(false, showAllToggle?.checked)); + container + .querySelector('#unselectPaidBtn') + ?.addEventListener('click', () => unselectAllPaidColors()); + } + + async function handleCaptcha(allowGeneration = true) { + const startTime = performance.now(); + + // Check user's token source preference + if (state.tokenSource === 'manual') { + console.log('🎯 Manual token source selected - using pixel placement automation'); + if (!allowGeneration) { + console.log('❌ Token generation disabled during processing'); + return null; + } + return await tokenManager.handleCaptchaFallback(); + } + + // Generator mode (pure) or Hybrid mode - try generator first + try { + // Use optimized token generation with automatic sitekey detection + const { sitekey, token: preGeneratedToken } = await Utils.obtainSitekeyAndToken(); + + if (!sitekey) { + throw new Error('No valid sitekey found'); + } + + console.log('🔑 Generating Turnstile token for sitekey:', sitekey); + console.log( + '🧭 UA:', + navigator.userAgent.substring(0, 50) + '...', + 'Platform:', + navigator.platform + ); + + // Add additional checks before token generation + if (!window.turnstile) { + await Utils.loadTurnstile(); + } + + let token = null; + + // ✅ Reuse pre-generated token if available and valid + if ( + preGeneratedToken && + typeof preGeneratedToken === 'string' && + preGeneratedToken.length > 20 + ) { + console.log('♻️ Reusing pre-generated token from sitekey detection phase'); + token = preGeneratedToken; + } + // ✅ Or use globally cached token if still valid + else if (isTokenValid()) { + console.log('♻️ Using existing cached token (from previous operation)'); + token = getTurnstileToken(); + } + // ✅ Otherwise generate a new one (only if allowed) + else { + if (!allowGeneration) { + console.log('❌ Token expired/missing but generation disabled during processing'); + return null; + } + console.log('🔐 No valid pre-generated or cached token, creating new one...'); + token = await Utils.executeTurnstile(sitekey, 'paint'); + if (token) { + setTurnstileToken(token); + } + } + + console.log( + `🔍 Token received - Type: ${typeof token}, Value: ${token + ? typeof token === 'string' + ? token.length > 50 + ? token.substring(0, 50) + '...' + : token + : JSON.stringify(token) + : 'null/undefined' + }, Length: ${token?.length || 0}` + ); + + // ✅ Final validation + if (typeof token === 'string' && token.length > 20) { + const duration = Math.round(performance.now() - startTime); + console.log(`✅ Turnstile token generated successfully in ${duration}ms`); + return token; + } else { + throw new Error( + `Invalid or empty token received - Type: ${typeof token}, Value: ${JSON.stringify( + token + )}, Length: ${token?.length || 0}` + ); + } + } catch (error) { + const duration = Math.round(performance.now() - startTime); + console.error(`❌ Turnstile token generation failed after ${duration}ms:`, error); + + // Fallback to manual pixel placement for hybrid mode + if (state.tokenSource === 'hybrid') { + console.log( + '🔄 Hybrid mode: Generator failed, automatically switching to manual pixel placement...' + ); + const fbToken = await tokenManager.handleCaptchaFallback(); + return fbToken; + } else { + // Pure generator mode - don't fallback, just fail + throw error; + } + } + } + + async function createUI() { + await detectLanguage(); + + const existingContainer = document.getElementById('wplace-image-bot-container'); + const existingStats = document.getElementById('wplace-stats-container'); + const existingSettings = document.getElementById('wplace-settings-container'); + const existingResizeContainer = document.querySelector('.resize-container'); + const existingResizeOverlay = document.querySelector('.resize-overlay'); + + if (existingContainer) existingContainer.remove(); + if (existingStats) existingStats.remove(); + if (existingSettings) existingSettings.remove(); + if (existingResizeContainer) existingResizeContainer.remove(); + if (existingResizeOverlay) existingResizeOverlay.remove(); + + loadThemePreference(); + await initializeTranslations(); + + const theme = getCurrentTheme(); + applyTheme(); // <- new: set CSS vars and theme class before building UI + + function appendLinkOnce(href, attributes = {}) { + // Check if a link with the same href already exists in the document head + const exists = Array.from(document.head.querySelectorAll('link')).some( + (link) => link.href === href + ); + if (exists) return; + + // Create a new link element + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = href; + + // Add any additional attributes (e.g., data-* attributes) + for (const [key, value] of Object.entries(attributes)) { + link.setAttribute(key, value); + } + + // Append the link element to the document head + document.head.appendChild(link); + } + + appendLinkOnce('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'); + + if (theme.fontFamily.includes('Press Start 2P')) { + appendLinkOnce('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap'); + } + + // Load auto-image-styles.css - prioritize extension local resources + console.group('%c🎨 Loading Auto-Image Styles', 'color: #8b5cf6; font-weight: bold;'); + + let stylesLoaded = false; + + // First try: Check if extension has loaded local CSS resources + if (window.AUTOBOT_THEMES && window.AUTOBOT_THEMES['auto-image-styles.css']) { + console.log('%c🔍 Found auto-image-styles.css in extension local resources!', 'color: #10b981; font-weight: bold;'); + + // Check if it's already injected by the extension + const existingStyle = document.getElementById('autobot-auto-image-styles'); + if (existingStyle) { + console.log('%c✅ Styles already injected by extension - using local version', 'color: #10b981; font-weight: bold;'); + console.log(' 📍 Source: Extension local file (already in DOM)'); + console.log(' 🆔 Element ID: autobot-auto-image-styles'); + stylesLoaded = true; + } else { + // Inject it ourselves + const styleElement = document.createElement('style'); + styleElement.id = 'autobot-auto-image-styles-script'; + styleElement.setAttribute('data-wplace-theme', 'true'); + styleElement.textContent = window.AUTOBOT_THEMES['auto-image-styles.css']; + document.head.appendChild(styleElement); + + console.log('%c✅ Injected auto-image-styles.css from extension local resources', 'color: #10b981; font-weight: bold;'); + console.log(' 📍 Source: Extension local file'); + console.log(' 📏 Size: ' + window.AUTOBOT_THEMES['auto-image-styles.css'].length + ' characters'); + console.log(' 🆔 Element ID: autobot-auto-image-styles-script'); + stylesLoaded = true; + } + } else { + console.log('%c📝 auto-image-styles.css not found in extension resources', 'color: #f59e0b;'); + console.log(' 🔍 window.AUTOBOT_THEMES:', typeof window.AUTOBOT_THEMES); + if (window.AUTOBOT_THEMES) { + console.log(' 📋 Available themes:', Object.keys(window.AUTOBOT_THEMES)); + } + } + + // Fallback: Load from CDN if local resources not available + if (!stylesLoaded) { + console.log('%c🌐 Falling back to CDN loading...', 'color: #8b5cf6;'); + appendLinkOnce( + 'https://wplace-autobot.github.io/WPlace-AutoBOT/main/auto-image-styles.css', + { 'data-wplace-theme': 'true' } + ); + console.log('%c📚 Loaded auto-image-styles.css from CDN (fallback)', 'color: #f59e0b; font-weight: bold;'); + console.log(' 📍 Source: CDN (wplace-autobot.github.io)'); + console.log(' 🌐 URL: https://wplace-autobot.github.io/WPlace-AutoBOT/main/auto-image-styles.css'); + console.log(' ⚠️ Performance: Network request required'); + } + + console.groupEnd(); + + // Ensure default theme is loaded from extension resources + if (window.applyTheme && typeof window.applyTheme === 'function') { + console.group('%c🎨 Loading Default Theme from Extension', 'color: #8b5cf6; font-weight: bold;'); + + // Determine the current theme file name + let defaultTheme = 'classic'; // fallback + if (CONFIG.currentTheme === 'Neon Retro') { + defaultTheme = 'neon'; + } else if (CONFIG.currentTheme === 'Neon Retro Cyan') { + defaultTheme = 'neon-cyan'; + } else if (CONFIG.currentTheme === 'Neon Retro Light') { + defaultTheme = 'neon-light'; + } else if (CONFIG.currentTheme === 'Classic Light') { + defaultTheme = 'classic-light'; + } else if (CONFIG.currentTheme === 'Acrylic') { + defaultTheme = 'acrylic'; + } + + console.log(`%c🎯 Loading theme: ${defaultTheme} (${CONFIG.currentTheme})`, 'color: #8b5cf6;'); + const success = window.applyTheme(defaultTheme); + + if (success) { + console.log(`%c✅ Default theme loaded from extension local resources`, 'color: #10b981; font-weight: bold;'); + console.log(` 📍 Source: Extension local file (themes/${defaultTheme}.css)`); + console.log(` 🚀 Performance: Instant load (no CDN request)`); + console.log(` 🎨 Theme: ${CONFIG.currentTheme}`); + } else { + console.warn(`%c⚠️ Failed to load theme ${defaultTheme} from extension`, 'color: #f59e0b;'); + console.log(` 📝 Note: Theme CSS classes will still work`); + } + + console.groupEnd(); + } else { + console.warn(`%c⚠️ Extension applyTheme() function not available`, 'color: #f59e0b; font-weight: bold;'); + console.log(` 📝 Themes will be limited to CSS classes only`); + } + + const container = document.createElement('div'); + container.id = 'wplace-image-bot-container'; + container.innerHTML = ` +
    +
    + + ${Utils.t('title')} +
    +
    + + + + +
    +
    +
    + +
    +
    + ${Utils.t('initMessage')} +
    +
    +
    +
    +
    + + +
    +
    🖼️ Image Management
    +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    + + +
    +
    🎮 Painting Control
    +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    ⏱️ ${Utils.t('cooldownSettings')}
    +
    + +
    +
    + +
    +
    + + + + ${Utils.t('charges')} + +
    +
    +
    +
    + + +
    +
    💾 Data Management
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + `; + + const statsContainer = document.createElement('div'); + statsContainer.id = 'wplace-stats-container'; + statsContainer.style.display = 'none'; + statsContainer.innerHTML = ` +
    +
    + + ${Utils.t('paintingStats')} +
    +
    + + +
    +
    +
    +
    +
    +
    +
    ${Utils.t('initMessage')}
    +
    +
    +
    + +
    +
    +
    + + Account Swapper +
    + +
    +
    + +
    +
    +
    + + Auto Buy Charges +
    +
    +
    + + + +
    +
    +
    + +
    +
    + + All Accounts + +
    +
    +
    Click the icon to load accounts.
    +
    +
    +
    + `; + + function initPillSelector() { + const buttons = statsContainer.querySelectorAll(".pill-btn"); + const highlight = statsContainer.querySelector(".pill-highlight"); + + buttons.forEach((btn, index) => { + btn.addEventListener("click", () => { + highlight.style.transform = `translateX(${index * 100}%)`; + + buttons.forEach((b) => b.classList.remove("active")); + btn.classList.add("active"); + + CONFIG.autoBuy = btn.dataset.mode; + if (CONFIG.autoBuy === 'none') { + console.log("AutoBuy disabled"); + CONFIG.autoBuyToggle = false; + } + else { + CONFIG.autoBuyToggle = true; + console.log("AutoBuy enabled"); + } + console.log("AutoBuy mode set to:", CONFIG.autoBuy); + }); + }); + } + + initPillSelector(); + + // Modern Settings Container with Theme Support + // Use the theme variable already declared at the top of createUI function + const settingsContainer = document.createElement('div'); + settingsContainer.id = 'wplace-settings-container'; + + // Apply theme-based styling + const themeBackground = theme.primary + ? `linear-gradient(135deg, ${theme.primary} 0%, ${theme.secondary || theme.primary} 100%)` + : `linear-gradient(135deg, #667eea 0%, #764ba2 100%)`; + + settingsContainer.className = 'wplace-settings-container-base'; + // Apply theme-specific background + settingsContainer.style.background = themeBackground; + settingsContainer.style.cssText += ` + min-width: 420px; + max-width: 480px; + z-index: 99999; + color: ${theme.text || 'white'}; + font-family: ${theme.fontFamily || "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif"}; + box-shadow: ${theme.boxShadow || '0 20px 40px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.1)' + }; + backdrop-filter: ${theme.backdropFilter || 'blur(10px)'}; + overflow: hidden; + animation: settings-slide-in 0.4s ease-out; + ${theme.animations?.glow + ? ` + box-shadow: ${theme.boxShadow || '0 20px 40px rgba(0,0,0,0.3)'}, + 0 0 30px ${theme.highlight || theme.neon || '#00ffff'}; + ` + : '' + } + `; + + // noinspection CssInvalidFunction + settingsContainer.innerHTML = ` +
    +
    +

    + + ${Utils.t('settings')} +

    + +
    +
    + +
    + + +
    + +
    + +

    + Generator mode creates tokens automatically. Hybrid mode falls back to manual when generator fails. Manual mode only uses pixel placement. +

    +
    +
    + + +
    + + +
    + + +
    + +
    + +
    +
    + Overlay Opacity +
    ${Math.round(state.overlayOpacity * 100)}%
    +
    + +
    + + +
    +
    + + +
    + + +
    + + + + + + +
    +
    + + +
    + + + +
    + + +
    + + +
    + + +
    + + +
    +
    + ${Utils.t('batchSize')} +
    +
    +
    + +
    +
    +
    + + + + pixels +
    +
    +
    +
    + ${CONFIG.PAINTING_SPEED.MIN} + ${CONFIG.PAINTING_SPEED.MAX} +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    +

    + 🎲 Random batch size between min and max values +

    +
    + + + +
    + + +
    + + + +
    + + +
    + + +
    + + +
    + + +
    + +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    +

    + 🧱 Block dimensions for block-based generation modes +

    +
    +
    + + +
    + +
    + + + +
    + ${Utils.t('repeatEvery')} + + ${Utils.t('minutesPl')} +
    +
    + + +
    +
    +
    + + +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + + `; + + const resizeContainer = document.createElement('div'); + resizeContainer.className = 'resize-container'; + resizeContainer.innerHTML = ` +

    ${Utils.t('resizeImage')}

    +
    + + + + +
    + +
    + + + + +
    + + + + + + + 100% +
    + Drag to pan • Pinch to zoom • Double‑tap to zoom +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    + + 1 +
    +
    +
    + +
    + + 1 +
    +
    +
    +
    + +
    + + + +
    +
    + + + Shift = Row • Alt = Column +
    +
    + +
    +
    +  Color Palette +
    +
    +
    + +
    +
    + + + +
    +
    +
    +
    + +
    +
    +  Advanced Color Matching +
    +
    + + +
    +
    + ${Utils.t('chromaWeight')} + ${state.chromaPenaltyWeight} +
    + +
    + +
    + + +
    + +
    +
    + +
    + + + +
    + `; + + const resizeOverlay = document.createElement('div'); + resizeOverlay.className = 'resize-overlay'; + + document.body.appendChild(container); + document.body.appendChild(resizeOverlay); + document.body.appendChild(resizeContainer); + document.body.appendChild(statsContainer); + document.body.appendChild(settingsContainer); + + // Show the main container after all elements are appended + container.style.display = 'block'; + + const uploadBtn = container.querySelector('#uploadBtn'); + const resizeBtn = container.querySelector('#resizeBtn'); + const selectPosBtn = container.querySelector('#selectPosBtn'); + const startBtn = container.querySelector('#startBtn'); + const stopBtn = container.querySelector('#stopBtn'); + const saveBtn = container.querySelector('#saveBtn'); + const loadBtn = container.querySelector('#loadBtn'); + const saveToFileBtn = container.querySelector('#saveToFileBtn'); + const loadFromFileBtn = container.querySelector('#loadFromFileBtn'); + + container.querySelectorAll('.wplace-section-title').forEach((title) => { + // Add a right-side arrow if it doesn't exist + if (!title.querySelector('i.arrow')) { + const arrow = document.createElement('i'); + arrow.className = 'fas fa-chevron-down arrow'; // FontAwesome down arrow + title.appendChild(arrow); + } + + // Click event to toggle collapse/expand of the section + title.addEventListener('click', () => { + const section = title.parentElement; + section.classList.toggle('collapsed'); + }); + }); + + // Disable load/upload buttons until initial setup is complete (startup only) + if (loadBtn) { + loadBtn.disabled = !state.initialSetupComplete; + loadBtn.title = state.initialSetupComplete + ? '' + : '🔄 Waiting for initial setup to complete...'; + } + if (loadFromFileBtn) { + loadFromFileBtn.disabled = !state.initialSetupComplete; + loadFromFileBtn.title = state.initialSetupComplete + ? '' + : '🔄 Waiting for initial setup to complete...'; + } + if (uploadBtn) { + uploadBtn.disabled = !state.initialSetupComplete; + uploadBtn.title = state.initialSetupComplete + ? '' + : '🔄 Waiting for initial setup to complete...'; + } + + const minimizeBtn = container.querySelector('#minimizeBtn'); + const compactBtn = container.querySelector('#compactBtn'); + const statsBtn = container.querySelector('#statsBtn'); + const toggleOverlayBtn = container.querySelector('#toggleOverlayBtn'); + const statusText = container.querySelector('#statusText'); + const progressBar = container.querySelector('#progressBar'); + const statsArea = statsContainer.querySelector('#statsArea'); + const content = container.querySelector('.wplace-content'); + const closeStatsBtn = statsContainer.querySelector('#closeStatsBtn'); + const refreshChargesBtn = statsContainer.querySelector('#refreshChargesBtn'); + const cooldownSlider = container.querySelector('#cooldownSlider'); + const cooldownInput = container.querySelector('#cooldownInput'); + const cooldownDecrease = container.querySelector('#cooldownDecrease'); + const cooldownIncrease = container.querySelector('#cooldownIncrease'); + const cooldownValue = container.querySelector('#cooldownValue'); + + if (!uploadBtn || !selectPosBtn || !startBtn || !stopBtn) { + console.error('Some UI elements not found:', { + uploadBtn: !!uploadBtn, + selectPosBtn: !!selectPosBtn, + startBtn: !!startBtn, + stopBtn: !!stopBtn, + }); + } + + if (!statsContainer || !statsArea || !closeStatsBtn) { + // Note: base CSS now aligns with this layout: main panel at left:20px (width 280), stats at left:330px. + } + + const header = container.querySelector('.wplace-header'); + + makeDraggable(container); + + function makeDraggable(element) { + let pos1 = 0, + pos2 = 0, + pos3 = 0, + pos4 = 0; + let isDragging = false; + const header = + element.querySelector('.wplace-header') || element.querySelector('.wplace-settings-header'); + + if (!header) { + console.warn('No draggable header found for element:', element); + return; + } + + header.onmousedown = dragMouseDown; + + function dragMouseDown(e) { + if (e.target.closest('.wplace-header-btn') || e.target.closest('button')) return; + + e.preventDefault(); + isDragging = true; + + const rect = element.getBoundingClientRect(); + + element.style.transform = 'none'; + element.style.top = rect.top + 'px'; + element.style.left = rect.left + 'px'; + + pos3 = e.clientX; + pos4 = e.clientY; + element.classList.add('wplace-dragging'); + document.onmouseup = closeDragElement; + document.onmousemove = elementDrag; + + document.body.style.userSelect = 'none'; + } + + function elementDrag(e) { + if (!isDragging) return; + + e.preventDefault(); + pos1 = pos3 - e.clientX; + pos2 = pos4 - e.clientY; + pos3 = e.clientX; + pos4 = e.clientY; + + let newTop = element.offsetTop - pos2; + let newLeft = element.offsetLeft - pos1; + + const rect = element.getBoundingClientRect(); + const maxTop = window.innerHeight - rect.height; + const maxLeft = window.innerWidth - rect.width; + + newTop = Math.max(0, Math.min(newTop, maxTop)); + newLeft = Math.max(0, Math.min(newLeft, maxLeft)); + + element.style.top = newTop + 'px'; + element.style.left = newLeft + 'px'; + } + + function closeDragElement() { + isDragging = false; + element.classList.remove('wplace-dragging'); + document.onmouseup = null; + document.onmousemove = null; + document.body.style.userSelect = ''; + } + } + + makeDraggable(statsContainer); + makeDraggable(container); + + if (statsBtn && closeStatsBtn) { + statsBtn.addEventListener('click', () => { + const isVisible = statsContainer.style.display !== 'none'; + if (isVisible) { + statsContainer.style.display = 'none'; + statsBtn.innerHTML = ''; + statsBtn.title = Utils.t('showStats'); + } else { + statsContainer.style.display = 'block'; + statsBtn.innerHTML = ''; + statsBtn.title = Utils.t('hideStats'); + } + }); + + closeStatsBtn.addEventListener('click', () => { + statsContainer.style.display = 'none'; + statsBtn.innerHTML = ''; + statsBtn.title = Utils.t('showStats'); + }); + + if (refreshChargesBtn) { + refreshChargesBtn.addEventListener('click', async () => { + refreshChargesBtn.innerHTML = ''; + refreshChargesBtn.disabled = true; + + try { + await updateStats(); + await updateCurrentAccountInList(); + } catch (error) { + console.error('Error refreshing charges:', error); + } finally { + refreshChargesBtn.innerHTML = ''; + refreshChargesBtn.disabled = false; + } + }); + } + + // Account-related event handlers + const autoSwapToggle = statsContainer.querySelector('#autoSwapToggle'); + const refreshAllAccountsBtn = statsContainer.querySelector('#refreshAllAccountsBtn'); + + if (autoSwapToggle) { + autoSwapToggle.checked = CONFIG.autoSwap; + autoSwapToggle.addEventListener('change', (e) => { + CONFIG.autoSwap = e.target.checked; + console.log(`🔄 Auto-swap ${CONFIG.autoSwap ? 'enabled' : 'disabled'}`); + + // Handle autoBuy toggle dependency + const autoBuyToggle = statsContainer.querySelector('#autoBuyToggle'); + if (autoBuyToggle) { + if (!CONFIG.autoSwap) { + // If autoSwap is disabled, disable and uncheck autoBuy + autoBuyToggle.disabled = true; + autoBuyToggle.checked = false; + CONFIG.autoBuyToggle = false; + console.log(`💰 Auto-buy disabled (requires auto-swap)`); + } else { + // If autoSwap is enabled, enable autoBuy toggle + autoBuyToggle.disabled = false; + } + } + }); + } + + // Auto Buy toggle logic + const autoBuyToggle = statsContainer.querySelector('#autoBuyToggle'); + if (autoBuyToggle) { + autoBuyToggle.checked = CONFIG.autoBuyToggle; + autoBuyToggle.disabled = !CONFIG.autoSwap; // Disable if autoSwap is off + + autoBuyToggle.addEventListener('change', (e) => { + CONFIG.autoBuyToggle = e.target.checked; + console.log(`💰 Auto-buy ${CONFIG.autoBuyToggle ? 'enabled' : 'disabled'}`); + }); + } + + if (refreshAllAccountsBtn) { + refreshAllAccountsBtn.addEventListener('click', fetchAllAccountDetails); + } + } + if (statsContainer && statsBtn) { + // Stats container starts visible by default - user clicks button to hide + statsContainer.style.display = 'block'; + statsBtn.innerHTML = ''; + statsBtn.title = Utils.t('hideStats'); + } + + const settingsBtn = container.querySelector('#settingsBtn'); + const closeSettingsBtn = settingsContainer.querySelector('#closeSettingsBtn'); + const applySettingsBtn = settingsContainer.querySelector('#applySettingsBtn'); + + if (settingsBtn && closeSettingsBtn && applySettingsBtn) { + settingsBtn.addEventListener('click', () => { + const isVisible = settingsContainer.classList.contains('show'); + if (isVisible) { + settingsContainer.style.animation = 'settings-fade-out 0.3s ease-out forwards'; + settingsContainer.classList.remove('show'); + setTimeout(() => { + settingsContainer.style.animation = ''; + }, 300); + } else { + settingsContainer.style.top = '50%'; + settingsContainer.style.left = '50%'; + settingsContainer.style.transform = 'translate(-50%, -50%)'; + settingsContainer.classList.add('show'); + settingsContainer.style.animation = 'settings-slide-in 0.4s ease-out'; + } + }); + + closeSettingsBtn.addEventListener('click', () => { + settingsContainer.style.animation = 'settings-fade-out 0.3s ease-out forwards'; + settingsContainer.classList.remove('show'); + setTimeout(() => { + settingsContainer.style.animation = ''; + settingsContainer.style.top = '50%'; + settingsContainer.style.left = '50%'; + settingsContainer.style.transform = 'translate(-50%, -50%)'; + }, 300); + }); + + applySettingsBtn.addEventListener('click', () => { + // Sync advanced settings before save + const colorAlgorithmSelect = document.getElementById('colorAlgorithmSelect'); + if (colorAlgorithmSelect) state.colorMatchingAlgorithm = colorAlgorithmSelect.value; + const enableChromaPenaltyToggle = document.getElementById('enableChromaPenaltyToggle'); + if (enableChromaPenaltyToggle) + state.enableChromaPenalty = enableChromaPenaltyToggle.checked; + const chromaPenaltyWeightSlider = document.getElementById('chromaPenaltyWeightSlider'); + if (chromaPenaltyWeightSlider) + state.chromaPenaltyWeight = parseFloat(chromaPenaltyWeightSlider.value) || 0.15; + const transparencyThresholdInput = document.getElementById('transparencyThresholdInput'); + if (transparencyThresholdInput) { + const v = parseInt(transparencyThresholdInput.value, 10); + if (!isNaN(v) && v >= 0 && v <= 255) state.customTransparencyThreshold = v; + } + const whiteThresholdInput = document.getElementById('whiteThresholdInput'); + if (whiteThresholdInput) { + const v = parseInt(whiteThresholdInput.value, 10); + if (!isNaN(v) && v >= 200 && v <= 255) state.customWhiteThreshold = v; + } + // Update functional thresholds + CONFIG.TRANSPARENCY_THRESHOLD = state.customTransparencyThreshold; + CONFIG.WHITE_THRESHOLD = state.customWhiteThreshold; + // Notifications + const notifEnabledToggle = document.getElementById('notifEnabledToggle'); + const notifOnChargesToggle = document.getElementById('notifOnChargesToggle'); + const notifOnlyUnfocusedToggle = document.getElementById('notifOnlyUnfocusedToggle'); + const notifIntervalInput = document.getElementById('notifIntervalInput'); + if (notifEnabledToggle) state.notificationsEnabled = !!notifEnabledToggle.checked; + if (notifOnChargesToggle) state.notifyOnChargesReached = !!notifOnChargesToggle.checked; + if (notifOnlyUnfocusedToggle) + state.notifyOnlyWhenUnfocused = !!notifOnlyUnfocusedToggle.checked; + if (notifIntervalInput) { + const v = parseInt(notifIntervalInput.value, 10); + if (!isNaN(v) && v >= 1 && v <= 60) state.notificationIntervalMinutes = v; + } + saveBotSettings(); + Utils.showAlert(Utils.t('settingsSaved'), 'success'); + closeSettingsBtn.click(); + NotificationManager.syncFromState(); + }); + + makeDraggable(settingsContainer); + + const tokenSourceSelect = settingsContainer.querySelector('#tokenSourceSelect'); + if (tokenSourceSelect) { + tokenSourceSelect.addEventListener('change', (e) => { + state.tokenSource = e.target.value; + saveBotSettings(); + console.log(`🔑 Token source changed to: ${state.tokenSource}`); + const sourceNames = { + generator: 'Automatic Generator', + hybrid: 'Generator + Auto Fallback', + manual: 'Manual Pixel Placement', + }; + Utils.showAlert( + Utils.t('tokenSourceSet', { source: sourceNames[state.tokenSource] }), + 'success' + ); + }); + } + + // Painting order controls + const paintingOrderSelect = settingsContainer.querySelector('#paintingOrderSelect'); + if (paintingOrderSelect) { + paintingOrderSelect.addEventListener('change', (e) => { + state.paintingOrder = e.target.value; + saveBotSettings(); + console.log(`🎨 Painting order changed to: ${state.paintingOrder}`); + const orderNames = { + sequential: Utils.t('paintingOrderSequential'), + 'color-by-color': Utils.t('paintingOrderColorByColor'), + }; + Utils.showAlert( + `Painting order set to: ${orderNames[state.paintingOrder]}`, + 'success' + ); + }); + } + + // Batch mode controls + const batchModeSelect = settingsContainer.querySelector('#batchModeSelect'); + const normalBatchControls = settingsContainer.querySelector('#normalBatchControls'); + const randomBatchControls = settingsContainer.querySelector('#randomBatchControls'); + const randomBatchMin = settingsContainer.querySelector('#randomBatchMin'); + const randomBatchMax = settingsContainer.querySelector('#randomBatchMax'); + + if (batchModeSelect) { + batchModeSelect.addEventListener('change', (e) => { + state.batchMode = e.target.value; + + // Switch between normal and random controls + if (normalBatchControls && randomBatchControls) { + if (e.target.value === 'random') { + normalBatchControls.style.display = 'none'; + randomBatchControls.style.display = 'block'; + } else { + normalBatchControls.style.display = 'block'; + randomBatchControls.style.display = 'none'; + } + } + + saveBotSettings(); + console.log(`📦 Batch mode changed to: ${state.batchMode}`); + Utils.showAlert( + Utils.t('batchModeSet', { + mode: + state.batchMode === 'random' ? Utils.t('randomRange') : Utils.t('normalFixedSize'), + }), + 'success' + ); + }); + } + + if (randomBatchMin) { + randomBatchMin.addEventListener('input', (e) => { + const min = parseInt(e.target.value); + if (min >= 1 && min <= 1000) { + state.randomBatchMin = min; + // Ensure min doesn't exceed max + if (randomBatchMax && min > state.randomBatchMax) { + state.randomBatchMax = min; + randomBatchMax.value = min; + } + saveBotSettings(); + } + }); + } + + if (randomBatchMax) { + randomBatchMax.addEventListener('input', (e) => { + const max = parseInt(e.target.value); + if (max >= 1 && max <= 1000) { + state.randomBatchMax = max; + // Ensure max doesn't go below min + if (randomBatchMin && max < state.randomBatchMin) { + state.randomBatchMin = max; + randomBatchMin.value = max; + } + saveBotSettings(); + } + }); + } + + const languageSelect = settingsContainer.querySelector('#languageSelect'); + if (languageSelect) { + languageSelect.addEventListener('change', async (e) => { + const newLanguage = e.target.value; + state.language = newLanguage; + localStorage.setItem('wplace_language', newLanguage); + + // Load the new language translations + await loadTranslations(newLanguage); + + setTimeout(() => { + settingsContainer.style.display = 'none'; + createUI(); + }, 100); + }); + } + + const themeSelect = settingsContainer.querySelector('#themeSelect'); + if (themeSelect) { + themeSelect.addEventListener('change', (e) => { + const newTheme = e.target.value; + switchTheme(newTheme); + }); + } + + const overlayOpacitySlider = settingsContainer.querySelector('#overlayOpacitySlider'); + const overlayOpacityValue = settingsContainer.querySelector('#overlayOpacityValue'); + const enableBlueMarbleToggle = settingsContainer.querySelector('#enableBlueMarbleToggle'); + const settingsPaintWhiteToggle = settingsContainer.querySelector('#settingsPaintWhiteToggle'); + const settingsPaintTransparentToggle = settingsContainer.querySelector( + '#settingsPaintTransparentToggle' + ); + + if (overlayOpacitySlider && overlayOpacityValue) { + const updateOpacity = (newValue) => { + const opacity = parseFloat(newValue); + state.overlayOpacity = opacity; + overlayOpacitySlider.value = opacity; + overlayOpacityValue.textContent = `${Math.round(opacity * 100)}%`; + }; + + overlayOpacitySlider.addEventListener('input', (e) => { + updateOpacity(e.target.value); + }); + + // Add scroll-to-adjust for overlay opacity slider + Utils.createScrollToAdjust(overlayOpacitySlider, updateOpacity, 0, 1, 0.05); + } + + if (settingsPaintWhiteToggle) { + settingsPaintWhiteToggle.checked = state.paintWhitePixels; + settingsPaintWhiteToggle.addEventListener('change', (e) => { + state.paintWhitePixels = e.target.checked; + saveBotSettings(); + console.log(`🎨 Paint white pixels: ${state.paintWhitePixels ? 'ON' : 'OFF'}`); + const statusText = state.paintWhitePixels + ? 'White pixels in the template will be painted' + : 'White pixels will be skipped'; + Utils.showAlert(statusText, 'success'); + }); + } + + if (settingsPaintTransparentToggle) { + settingsPaintTransparentToggle.checked = state.paintTransparentPixels; + settingsPaintTransparentToggle.addEventListener('change', (e) => { + state.paintTransparentPixels = e.target.checked; + saveBotSettings(); + console.log( + `🎨 Paint transparent pixels: ${state.paintTransparentPixels ? 'ON' : 'OFF'}` + ); + const statusText = state.paintTransparentPixels + ? 'Transparent pixels in the template will be painted with the closest available color' + : 'Transparent pixels will be skipped'; + Utils.showAlert(statusText, 'success'); + }); + } + + // Speed controls - both slider and input + const speedSlider = settingsContainer.querySelector('#speedSlider'); + const speedInput = settingsContainer.querySelector('#speedInput'); + const speedDecrease = settingsContainer.querySelector('#speedDecrease'); + const speedIncrease = settingsContainer.querySelector('#speedIncrease'); + const speedValue = settingsContainer.querySelector('#speedValue'); + + if (speedSlider && speedInput && speedValue && speedDecrease && speedIncrease) { + const updateSpeed = (newValue) => { + const speed = Math.max(CONFIG.PAINTING_SPEED.MIN, Math.min(CONFIG.PAINTING_SPEED.MAX, parseInt(newValue))); + state.paintingSpeed = speed; + + // Update both controls (value shows in input, label shows unit only) + speedSlider.value = speed; + speedInput.value = speed; + speedValue.textContent = `pixels`; + + saveBotSettings(); + }; + + // Slider event listener + speedSlider.addEventListener('input', (e) => { + updateSpeed(e.target.value); + }); + + // Number input event listener + speedInput.addEventListener('input', (e) => { + updateSpeed(e.target.value); + }); + + // Decrease button + speedDecrease.addEventListener('click', () => { + updateSpeed(parseInt(speedInput.value) - 1); + }); + + // Increase button + speedIncrease.addEventListener('click', () => { + updateSpeed(parseInt(speedInput.value) + 1); + }); + + // Add scroll-to-adjust for speed slider + Utils.createScrollToAdjust(speedSlider, updateSpeed, CONFIG.PAINTING_SPEED.MIN, CONFIG.PAINTING_SPEED.MAX, 1); + } + + if (enableBlueMarbleToggle) { + enableBlueMarbleToggle.addEventListener('click', async () => { + state.blueMarbleEnabled = enableBlueMarbleToggle.checked; + if (state.imageLoaded && overlayManager.imageBitmap) { + Utils.showAlert(Utils.t('reprocessingOverlay'), 'info'); + await overlayManager.processImageIntoChunks(); + Utils.showAlert(Utils.t('overlayUpdated'), 'success'); + } + }); + } + + // Speed control toggle + const enableSpeedToggle = settingsContainer.querySelector('#enableSpeedToggle'); + if (enableSpeedToggle) { + enableSpeedToggle.addEventListener('change', (e) => { + CONFIG.PAINTING_SPEED_ENABLED = e.target.checked; + saveBotSettings(); + console.log(`⚡ Batch speed control: ${CONFIG.PAINTING_SPEED_ENABLED ? 'ON' : 'OFF'}`); + const statusText = CONFIG.PAINTING_SPEED_ENABLED + ? 'Batch speed control enabled - will use configured batch size' + : 'Batch speed control disabled - will use all available charges immediately'; + Utils.showAlert(statusText, 'success'); + }); + } + + // (Advanced color listeners moved outside to work with resize dialog) + // (Advanced color listeners moved outside to work with resize dialog) + // Notifications listeners + const notifPermBtn = settingsContainer.querySelector('#notifRequestPermBtn'); + const notifTestBtn = settingsContainer.querySelector('#notifTestBtn'); + if (notifPermBtn) { + notifPermBtn.addEventListener('click', async () => { + const perm = await NotificationManager.requestPermission(); + if (perm === 'granted') Utils.showAlert(Utils.t('notificationsEnabled'), 'success'); + else Utils.showAlert(Utils.t('notificationsPermissionDenied'), 'warning'); + }); + } + if (notifTestBtn) { + notifTestBtn.addEventListener('click', () => { + NotificationManager.notify( + Utils.t('testNotificationTitle'), + Utils.t('testNotificationMessage'), + 'wplace-notify-test', + true + ); + }); + } + } + + const widthSlider = resizeContainer.querySelector('#widthSlider'); + const heightSlider = resizeContainer.querySelector('#heightSlider'); + const widthValue = resizeContainer.querySelector('#widthValue'); + const heightValue = resizeContainer.querySelector('#heightValue'); + const keepAspect = resizeContainer.querySelector('#keepAspect'); + const paintWhiteToggle = resizeContainer.querySelector('#paintWhiteToggle'); + const paintTransparentToggle = resizeContainer.querySelector('#paintTransparentToggle'); + const zoomSlider = resizeContainer.querySelector('#zoomSlider'); + const zoomValue = resizeContainer.querySelector('#zoomValue'); + const zoomInBtn = resizeContainer.querySelector('#zoomInBtn'); + const zoomOutBtn = resizeContainer.querySelector('#zoomOutBtn'); + const zoomFitBtn = resizeContainer.querySelector('#zoomFitBtn'); + const zoomActualBtn = resizeContainer.querySelector('#zoomActualBtn'); + const panModeBtn = resizeContainer.querySelector('#panModeBtn'); + const panStage = resizeContainer.querySelector('#resizePanStage'); + const canvasStack = resizeContainer.querySelector('#resizeCanvasStack'); + const baseCanvas = resizeContainer.querySelector('#resizeCanvas'); + const maskCanvas = resizeContainer.querySelector('#maskCanvas'); + const baseCtx = baseCanvas.getContext('2d'); + const maskCtx = maskCanvas.getContext('2d'); + const confirmResize = resizeContainer.querySelector('#confirmResize'); + const cancelResize = resizeContainer.querySelector('#cancelResize'); + const editImageBtn = resizeContainer.querySelector('#editImageBtn'); + const downloadPreviewBtn = resizeContainer.querySelector('#downloadPreviewBtn'); + const clearIgnoredBtn = resizeContainer.querySelector('#clearIgnoredBtn'); + + // Coordinate generation controls with smart visibility + const coordinateModeSelect = settingsContainer.querySelector('#coordinateModeSelect'); + const coordinateDirectionSelect = settingsContainer.querySelector('#coordinateDirectionSelect'); + const coordinateSnakeToggle = settingsContainer.querySelector('#coordinateSnakeToggle'); + const directionControls = settingsContainer.querySelector('#directionControls'); + const snakeControls = settingsContainer.querySelector('#snakeControls'); + const blockControls = settingsContainer.querySelector('#blockControls'); + const blockWidthInput = settingsContainer.querySelector('#blockWidthInput'); + const blockHeightInput = settingsContainer.querySelector('#blockHeightInput'); + const paintUnavailablePixelsToggle = settingsContainer.querySelector( + '#paintUnavailablePixelsToggle' + ); + + if (paintUnavailablePixelsToggle) { + paintUnavailablePixelsToggle.checked = state.paintUnavailablePixels; + paintUnavailablePixelsToggle.addEventListener('change', (e) => { + state.paintUnavailablePixels = e.target.checked; + saveBotSettings(); + console.log(`🎨 Paint unavailable colors: ${state.paintUnavailablePixels ? 'ON' : 'OFF'}`); + const statusText = state.paintUnavailablePixels + ? 'Unavailable template colors will be painted with the closest available color' + : 'Unavailable template colors will be skipped'; + Utils.showAlert(statusText, 'success'); + }); + } + if (coordinateModeSelect) { + coordinateModeSelect.value = state.coordinateMode; + coordinateModeSelect.addEventListener('change', (e) => { + state.coordinateMode = e.target.value; + Utils.updateCoordinateUI({ + mode: state.coordinateMode, + directionControls, + snakeControls, + blockControls, + }); + saveBotSettings(); + console.log(`🔄 Coordinate mode changed to: ${state.coordinateMode}`); + Utils.showAlert(`Coordinate mode set to: ${state.coordinateMode}`, 'success'); + }); + } + + if (coordinateDirectionSelect) { + coordinateDirectionSelect.value = state.coordinateDirection; + coordinateDirectionSelect.addEventListener('change', (e) => { + state.coordinateDirection = e.target.value; + saveBotSettings(); + console.log(`🧭 Coordinate direction changed to: ${state.coordinateDirection}`); + Utils.showAlert(`Coordinate direction set to: ${state.coordinateDirection}`, 'success'); + }); + } + + if (coordinateSnakeToggle) { + coordinateSnakeToggle.checked = state.coordinateSnake; + coordinateSnakeToggle.addEventListener('change', (e) => { + state.coordinateSnake = e.target.checked; + saveBotSettings(); + console.log(`🐍 Snake pattern ${state.coordinateSnake ? 'enabled' : 'disabled'}`); + Utils.showAlert( + `Snake pattern ${state.coordinateSnake ? 'enabled' : 'disabled'}`, + 'success' + ); + }); + } + + if (blockWidthInput) { + blockWidthInput.value = state.blockWidth; + blockWidthInput.addEventListener('input', (e) => { + const width = parseInt(e.target.value); + if (width >= 1 && width <= 50) { + state.blockWidth = width; + saveBotSettings(); + } + }); + } + + if (blockHeightInput) { + blockHeightInput.value = state.blockHeight; + blockHeightInput.addEventListener('change', (e) => { + const height = parseInt(e.target.value); + if (height >= 1 && height <= 50) { + state.blockHeight = height; + saveBotSettings(); + } + }); + } + + if (compactBtn) { + compactBtn.addEventListener('click', () => { + container.classList.toggle('wplace-compact'); + const isCompact = container.classList.contains('wplace-compact'); + + if (isCompact) { + compactBtn.innerHTML = ''; + compactBtn.title = Utils.t('expandMode'); + } else { + compactBtn.innerHTML = ''; + compactBtn.title = Utils.t('compactMode'); + } + }); + } + + if (minimizeBtn) { + minimizeBtn.addEventListener('click', () => { + state.minimized = !state.minimized; + if (state.minimized) { + container.classList.add('wplace-minimized'); + content.classList.add('wplace-hidden'); + minimizeBtn.innerHTML = ''; + minimizeBtn.title = Utils.t('restore'); + } else { + container.classList.remove('wplace-minimized'); + content.classList.remove('wplace-hidden'); + minimizeBtn.innerHTML = ''; + minimizeBtn.title = Utils.t('minimize'); + } + saveBotSettings(); + }); + } + + if (toggleOverlayBtn) { + toggleOverlayBtn.addEventListener('click', () => { + const isEnabled = overlayManager.toggle(); + toggleOverlayBtn.classList.toggle('active', isEnabled); + toggleOverlayBtn.setAttribute('aria-pressed', isEnabled ? 'true' : 'false'); + Utils.showAlert(isEnabled ? Utils.t('overlayEnabled') : Utils.t('overlayDisabled'), 'info'); + }); + } + + if (state.minimized) { + container.classList.add('wplace-minimized'); + content.classList.add('wplace-hidden'); + if (minimizeBtn) { + minimizeBtn.innerHTML = ''; + minimizeBtn.title = Utils.t('restore'); + } + } else { + container.classList.remove('wplace-minimized'); + content.classList.remove('wplace-hidden'); + if (minimizeBtn) { + minimizeBtn.innerHTML = ''; + minimizeBtn.title = Utils.t('minimize'); + } + } + + if (saveBtn) { + saveBtn.addEventListener('click', () => { + if (!state.imageLoaded) { + Utils.showAlert(Utils.t('missingRequirements'), 'error'); + return; + } + + const success = Utils.saveProgress(); + if (success) { + updateUI('autoSaved', 'success'); + Utils.showAlert(Utils.t('autoSaved'), 'success'); + } else { + Utils.showAlert(Utils.t('errorSavingProgress'), 'error'); + } + }); + } + + if (loadBtn) { + loadBtn.addEventListener('click', async () => { + // Auto-open color palette if not already open + Utils.openColorPalette(); + + let savedData = Utils.loadProgress(); + if (!savedData) { + updateUI('noSavedData', 'warning'); + Utils.showAlert(Utils.t('noSavedData'), 'warning'); + return; + } + + // ✅ CRITICAL FIX: Migrate old save data before restoring + savedData = Utils.migrateProgress(savedData); + + // CRITICAL FIX: If save file contains complete data, bypass initial setup check + // This matches old version behavior where save files could be loaded immediately + const hasCompleteData = savedData.state && savedData.imageData && + savedData.state.availableColors && + savedData.state.availableColors.length > 0; + + if (!state.initialSetupComplete && !hasCompleteData) { + Utils.showAlert(Utils.t('pleaseWaitInitialSetup'), 'warning'); + return; + } + + const confirmLoad = confirm( + `${Utils.t('savedDataFound')}\n\n` + + `Saved: ${new Date(savedData.timestamp).toLocaleString()}\n` + + `Progress: ${savedData.state.paintedPixels}/${savedData.state.totalPixels} pixels` + ); + + if (confirmLoad) { + const success = Utils.restoreProgress(savedData); + if (success) { + // CRITICAL FIX: Set initial setup complete if save had complete data + if (hasCompleteData) { + state.initialSetupComplete = true; + } + + updateUI('dataLoaded', 'success'); + Utils.showAlert(Utils.t('dataLoaded'), 'success'); + updateDataButtons(); + + // CRITICAL FIX: Force immediate stats update after save loading + await updateStats(); + + // Force stats display refresh by updating the stats container + const statsContainer = document.getElementById('wplace-stats-container'); + if (statsContainer && typeof updateStats === 'function') { + // Trigger a forced visual refresh of the stats + setTimeout(async () => { + await updateStats(); + }, 100); + } + + // Restore overlay if image data was loaded from localStorage + Utils.restoreOverlayFromData().catch((error) => { + console.error('Failed to restore overlay from localStorage:', error); + }); + + if (!state.colorsChecked) { + uploadBtn.disabled = false; + const loadExtractedBtn = document.getElementById('loadExtractedBtn'); + if (loadExtractedBtn) loadExtractedBtn.disabled = false; + } else { + uploadBtn.disabled = false; + const loadExtractedBtn = document.getElementById('loadExtractedBtn'); + if (loadExtractedBtn) loadExtractedBtn.disabled = false; + selectPosBtn.disabled = false; + } + + if (state.imageLoaded && state.startPosition && state.region && state.colorsChecked) { + startBtn.disabled = false; + } + } else { + Utils.showAlert(Utils.t('errorLoadingProgress'), 'error'); + } + } + }); + } + + if (saveToFileBtn) { + saveToFileBtn.addEventListener('click', () => { + const success = Utils.saveProgressToFile(); + if (success) { + updateUI('fileSaved', 'success'); + Utils.showAlert(Utils.t('fileSaved'), 'success'); + } else { + Utils.showAlert(Utils.t('fileError'), 'error'); + } + }); + } + + if (loadFromFileBtn) { + loadFromFileBtn.addEventListener('click', async () => { + console.log('🔍 [DEBUG] Load from file button clicked'); + console.log('🔍 [DEBUG] Initial setup complete:', state.initialSetupComplete); + + try { + // First check if we can load the file - this will tell us if it has complete data + console.log('🔍 [DEBUG] Starting file upload...'); + const fileData = await Utils.createFileUploader(); + + console.log('🔍 [DEBUG] File data received:', !!fileData); + console.log('🔍 [DEBUG] File data keys:', fileData ? Object.keys(fileData) : 'N/A'); + + if (!fileData || !fileData.state) { + console.error('❌ [DEBUG] Invalid file data or missing state'); + console.log('🔍 [DEBUG] FileData:', fileData); + Utils.showAlert(Utils.t('invalidFileFormat'), 'error'); + return; + } + + // CRITICAL FIX: If file contains complete data, bypass initial setup check + const hasCompleteData = fileData.state && fileData.imageData && + fileData.state.availableColors && + fileData.state.availableColors.length > 0; + + console.log('🔍 [DEBUG] Has complete data check:'); + console.log(' - fileData.state:', !!fileData.state); + console.log(' - fileData.imageData:', !!fileData.imageData); + console.log(' - fileData.state.availableColors:', !!fileData.state.availableColors); + console.log(' - availableColors length:', fileData.state.availableColors?.length); + console.log(' - hasCompleteData result:', hasCompleteData); + + if (!state.initialSetupComplete && !hasCompleteData) { + console.log('⚠️ [DEBUG] Setup not complete and no complete data, showing warning'); + Utils.showAlert(Utils.t('pleaseWaitFileSetup'), 'warning'); + return; + } + + console.log('🔍 [DEBUG] Calling restoreProgress...'); + const success = Utils.restoreProgress(fileData); + console.log('🔍 [DEBUG] RestoreProgress result:', success); + + if (success) { + console.log('✅ [DEBUG] File loaded successfully'); + + // CRITICAL FIX: Set initial setup complete if file had complete data + if (hasCompleteData) { + console.log('🔍 [DEBUG] Setting initialSetupComplete to true due to complete data'); + state.initialSetupComplete = true; + } + + updateUI('fileLoaded', 'success'); + Utils.showAlert(Utils.t('fileLoaded'), 'success'); + updateDataButtons(); + + console.log('🔍 [DEBUG] Updating stats...'); + await updateStats(); + + // Restore overlay if image data was loaded from file + console.log('🔍 [DEBUG] Attempting to restore overlay...'); + await Utils.restoreOverlayFromData().catch((error) => { + console.error('❌ [DEBUG] Failed to restore overlay from file:', error); + }); + + console.log('🔍 [DEBUG] Updating button states after load...'); + console.log(' - state.colorsChecked:', state.colorsChecked); + console.log(' - state.imageLoaded:', state.imageLoaded); + console.log(' - state.startPosition:', !!state.startPosition); + console.log(' - state.region:', !!state.region); + + if (state.colorsChecked) { + console.log('🔍 [DEBUG] Enabling buttons due to colorsChecked'); + uploadBtn.disabled = false; + selectPosBtn.disabled = false; + resizeBtn.disabled = false; + } else { + console.log('🔍 [DEBUG] Only enabling upload button'); + uploadBtn.disabled = false; + } + + if (state.imageLoaded && state.startPosition && state.region && state.colorsChecked) { + console.log('🔍 [DEBUG] All conditions met, enabling start button'); + startBtn.disabled = false; + } else { + console.log('⚠️ [DEBUG] Start button requirements not met'); + } + } else { + console.error('❌ [DEBUG] RestoreProgress failed'); + Utils.showAlert('File loading failed - check console for details', 'error'); + } + } catch (error) { + console.error('❌ [DEBUG] Error in file load process:', error); + console.error('❌ [DEBUG] Error stack:', error.stack); + + if (error.message === 'Invalid JSON file') { + console.error('❌ [DEBUG] Invalid JSON file detected'); + Utils.showAlert(Utils.t('invalidFileFormat'), 'error'); + } else { + console.error('❌ [DEBUG] General file error:', error.message); + Utils.showAlert(`File error: ${error.message}`, 'error'); + } + } + }); + } + + updateUI = (messageKey, type = 'default', params = {}, silent = false) => { + const message = Utils.t(messageKey, params); + statusText.textContent = message; + statusText.className = `wplace-status status-${type}`; + + if (!silent) { + // Trigger animation only when silent = false + statusText.style.animation = 'none'; + void statusText.offsetWidth; // trick to restart the animation + statusText.style.animation = 'slide-in 0.3s ease-out'; + } + }; + + function updateChargeStatsDisplay(intervalMs) { + const currentChargesEl = document.getElementById('wplace-stat-charges-value'); + const fullChargeEl = document.getElementById('wplace-stat-fullcharge-value'); + if (!fullChargeEl && !currentChargesEl) return; + if (!state.fullChargeData) { + fullChargeEl.textContent = '--:--:--'; + return; + } + + const { current, max, cooldownMs, startTime, spentSinceShot } = state.fullChargeData; + const elapsed = Date.now() - startTime; + + // total charges including elapsed time and spent during painting since snapshot + const chargesGained = elapsed / cooldownMs; + const rawCharges = current + chargesGained - spentSinceShot; + const cappedCharges = Math.min(rawCharges, max); + + // rounding with 0.95 threshold + let displayCharges; + const fraction = cappedCharges - Math.floor(cappedCharges); + if (fraction >= 0.95) { + displayCharges = Math.ceil(cappedCharges); + } else { + displayCharges = Math.floor(cappedCharges); + } + + state.displayCharges = Math.max(0, displayCharges); + state.preciseCurrentCharges = cappedCharges; + + const remainingMs = getMsToTargetCharges(cappedCharges, max, state.cooldown, intervalMs); + const timeText = Utils.msToTimeText(remainingMs); + + if (currentChargesEl) { + currentChargesEl.innerHTML = `${state.displayCharges} / ${max}`; + } + + if ( + state.displayCharges < state.cooldownChargeThreshold && + !state.stopFlag && + state.running + ) { + updateChargesThresholdUI(intervalMs); + } + + if (fullChargeEl) { + if (state.displayCharges >= max) { + fullChargeEl.innerHTML = `FULL`; + } else { + fullChargeEl.innerHTML = ` + ${timeText} + `; + } + } + } + + updateStats = async (isManualRefresh = false) => { + const isFirstCheck = !state.fullChargeData?.startTime; + + const minUpdateInterval = 60_000; + const maxUpdateInterval = 90_000; + const randomUpdateThreshold = + minUpdateInterval + Math.random() * (maxUpdateInterval - minUpdateInterval); + const timeSinceLastUpdate = Date.now() - (state.fullChargeData?.startTime || 0); + const isTimeToUpdate = timeSinceLastUpdate >= randomUpdateThreshold; + + const shouldCallApi = isFirstCheck || isTimeToUpdate; + + const { charges, max, cooldown } = await WPlaceService.getCharges(); + state.displayCharges = Math.floor(charges); + state.preciseCurrentCharges = charges; + state.cooldown = cooldown; + state.maxCharges = Math.floor(max) > 1 ? Math.floor(max) : state.maxCharges; + + state.fullChargeData = { + current: charges, + max: max, + cooldownMs: cooldown, + startTime: Date.now(), + spentSinceShot: 0, + }; + // Evaluate notifications every time we refresh server-side charges + NotificationManager.maybeNotifyChargesReached(); + + if (state.fullChargeInterval) { + clearInterval(state.fullChargeInterval); + state.fullChargeInterval = null; + } + const intervalMs = 1000; + state.fullChargeInterval = setInterval( + () => updateChargeStatsDisplay(intervalMs), + intervalMs + ); + + if (cooldownSlider && cooldownSlider.max !== state.maxCharges) { + cooldownSlider.max = state.maxCharges; + } + if (cooldownInput && cooldownInput.max !== state.maxCharges) { + cooldownInput.max = state.maxCharges; + } + + // // Update current account charges in the account list + // await updateCurrentAccountInList(); + + let imageStatsHTML = ''; + if (state.imageLoaded) { + const progress = + state.totalPixels > 0 ? Math.round((state.paintedPixels / state.totalPixels) * 100) : 0; + const remainingPixels = state.totalPixels - state.paintedPixels; + + // Updated estimation calculation for new cooldown logic + // Now we wait for cooldownChargeThreshold before processing pixels + + // Calculate batch size (with fallback if function not yet defined) + let batchSize; + try { + batchSize = typeof calculateBatchSize === 'function' ? calculateBatchSize() : state.paintingSpeed || 5; + } catch (e) { + batchSize = state.paintingSpeed || 5; + } + + // Ensure batchSize is valid and not zero + batchSize = Math.max(1, Math.min(batchSize, remainingPixels)); + const batchesNeeded = Math.ceil(remainingPixels / batchSize); + + // Calculate time accounting for cooldown threshold behavior with safety checks + let estimatedMs = 0; + if (remainingPixels > 0 && Number.isFinite(state.cooldown) && state.cooldown > 0) { + // Current charges available check + const currentCharges = Math.max(0, state.displayCharges); + const thresholdCharges = Math.max(1, state.cooldownChargeThreshold || 1); + + if (currentCharges < thresholdCharges) { + // Need to wait for charges to reach threshold first + const chargesNeeded = thresholdCharges - currentCharges; + estimatedMs += chargesNeeded * state.cooldown; + } + + // Calculate painting time more accurately + // Each batch uses thresholdCharges, so calculate how many cycles we need + const pixelsPerCycle = Math.min(batchSize, thresholdCharges); + const cyclesNeeded = Math.ceil(remainingPixels / pixelsPerCycle); + + // Time between cycles (waiting for charges to regenerate) + if (cyclesNeeded > 1) { + const regenerationTime = (cyclesNeeded - 1) * thresholdCharges * state.cooldown; + estimatedMs += regenerationTime; + } + + // Add painting speed delay if enabled + if (CONFIG.PAINTING_SPEED_ENABLED && state.paintingSpeed > 0) { + const paintingDelay = remainingPixels * (1000 / state.paintingSpeed); + estimatedMs += paintingDelay; + } + } + + // Safety check to prevent infinity or invalid values + if (!Number.isFinite(estimatedMs) || estimatedMs < 0) { + estimatedMs = 0; + } + + state.estimatedTime = estimatedMs; + progressBar.style.width = `${progress}%`; + + imageStatsHTML = ` +
    +
    ${Utils.t('progress')}
    +
    ${progress}%
    +
    +
    +
    ${Utils.t( + 'pixels' + )}
    +
    ${state.paintedPixels}/${state.totalPixels}
    +
    + `; + } + + let colorSwatchesHTML = ''; + state.availableColors = state.availableColors.filter( + (c) => c.name !== 'Unknown CoIor NaN' && c.id !== null + ); + + const availableColors = Utils.extractAvailableColors(); + const newCount = Array.isArray(availableColors) ? availableColors.length : 0; + + if (newCount === 0 && isManualRefresh) { + Utils.showAlert(Utils.t('noColorsFound'), 'warning'); + } else if (newCount > 0 && state.availableColors.length < newCount) { + const oldCount = state.availableColors.length; + + Utils.showAlert( + Utils.t('colorsUpdated', { + oldCount, + newCount: newCount, + diffCount: newCount - oldCount, + }), + 'success' + ); + state.availableColors = availableColors; + } + if (state.colorsChecked) { + colorSwatchesHTML = state.availableColors + .map((color) => { + const rgbString = `rgb(${color.rgb.join(',')})`; + return `
    `; + }) + .join(''); + } + + // Calculate multi-account statistics + let totalAllCharges = 0; + let totalMaxCharges = 0; + const accounts = accountManager.getAllAccounts(); + if (accounts.length > 0) { + // Use ChargeModel (real-time) when available for consistent totals + totalAllCharges = accounts.reduce((sum, acc) => { + const node = ChargeModel.get(acc.token); + const charges = Number.isFinite(node?.charges) ? Math.floor(node.charges) : Math.floor(acc.Charges || 0); + const max = Number.isFinite(node?.max) ? Math.floor(node.max) : Math.floor(acc.Max || 0); + const safeCharges = Math.max(0, Math.min(charges, max)); + return sum + safeCharges; + }, 0); + totalMaxCharges = accounts.reduce((sum, acc) => { + const node = ChargeModel.get(acc.token); + const max = Number.isFinite(node?.max) ? Math.floor(node.max) : Math.floor(acc.Max || 0); + return sum + Math.max(0, max); + }, 0); + } + + statsArea.innerHTML = ` + ${imageStatsHTML} + ${accounts.length > 0 ? ` +
    +
    + Total All Accounts Charges +
    +
    + ${totalAllCharges}/${totalMaxCharges} +
    +
    + ` : ''} +
    +
    + ${Utils.t('charges')} +
    +
    + ${state.displayCharges} / ${state.fullChargeData?.max ?? state.maxCharges} +
    +
    +
    +
    + ${Utils.t('fullChargeIn')} +
    +
    --:--:--
    +
    + ${state.colorsChecked + ? ` +
    +
    ${Utils.t( + 'availableColors', + { count: state.availableColors.length } + )}
    +
    + ${colorSwatchesHTML} +
    +
    + ` + : '' + } + `; + + // should be after statsArea.innerHTML = '...'. todo make full stats ui update partial + updateChargeStatsDisplay(intervalMs); + }; + + updateDataButtons = () => { + const hasImageData = state.imageLoaded && state.imageData; + saveBtn.disabled = !hasImageData; + saveToFileBtn.disabled = !hasImageData; + }; + + // Expose globally for async callbacks (IDB pixel loading) + window.updateDataButtons = updateDataButtons; + + updateDataButtons(); + + function showMoveArtworkPanel() { + // Create move artwork control panel like status panels + const movePanel = document.createElement('div'); + movePanel.id = 'moveArtworkPanel'; + movePanel.className = 'wplace-move-panel'; + + movePanel.innerHTML = ` +
    +
    + + Move Artwork +
    +
    + +
    +
    +
    +
    + +
    + +
    1px
    + +
    + +
    +
    + `; + + // No overlay - append directly to body like other panels + document.body.appendChild(movePanel); + + // Make the panel draggable + makeDraggable(movePanel); + + // Add event listeners for movement + let currentMessageTimeout = null; + + function moveArtwork(deltaX, deltaY) { + if (state.startPosition && state.region) { + const newX = state.startPosition.x + deltaX; + const newY = state.startPosition.y + deltaY; + + console.log(`🔄 Moving artwork from (${state.startPosition.x}, ${state.startPosition.y}) to (${newX}, ${newY})`); + + state.startPosition.x = newX; + state.startPosition.y = newY; + + // Clear any existing message timeout and alerts immediately + if (currentMessageTimeout) { + clearTimeout(currentMessageTimeout); + currentMessageTimeout = null; + } + Utils.hideAlert(); // Hide current alert immediately + + // Update overlay position if available + if (overlayManager) { + overlayManager.setPosition(state.startPosition, state.region) + .then(() => { + console.log('✅ Overlay position updated'); + Utils.showAlert(`Moved to position (${newX}, ${newY})`, 'success'); + // Set new timeout for this message + currentMessageTimeout = setTimeout(() => { + Utils.hideAlert(); + currentMessageTimeout = null; + }, 1500); // Message disappears after 1.5 seconds + }) + .catch(err => { + console.error('❌ Failed to update overlay:', err); + Utils.showAlert('Failed to update overlay position', 'error'); + }); + } else { + Utils.showAlert(`Position updated to (${newX}, ${newY})`, 'success'); + // Set new timeout for this message + currentMessageTimeout = setTimeout(() => { + Utils.hideAlert(); + currentMessageTimeout = null; + }, 1500); + } + } else { + Utils.showAlert('Please select a position first before moving artwork', 'warning'); + } + } + + document.getElementById('moveUp').addEventListener('click', () => moveArtwork(0, -1)); + document.getElementById('moveDown').addEventListener('click', () => moveArtwork(0, 1)); + document.getElementById('moveLeft').addEventListener('click', () => moveArtwork(-1, 0)); + document.getElementById('moveRight').addEventListener('click', () => moveArtwork(1, 0)); + + // Close panel + function closeMovePanel() { + if (currentMessageTimeout) { + clearTimeout(currentMessageTimeout); + currentMessageTimeout = null; + } + Utils.hideAlert(); + document.body.removeChild(movePanel); + } + + document.getElementById('closeMovePanel').addEventListener('click', closeMovePanel); + } + + function showResizeDialog(processor) { + let baseProcessor = processor; + let width, height; + if (state.originalImage?.dataUrl) { + baseProcessor = new ImageProcessor(state.originalImage.dataUrl); + width = state.originalImage.width; + height = state.originalImage.height; + } else { + const dims = processor.getDimensions(); + width = dims.width; + height = dims.height; + } + const aspectRatio = width / height; + + const rs = state.resizeSettings; + widthSlider.max = width * 2; + heightSlider.max = height * 2; + let initialW = width; + let initialH = height; + if ( + rs && + Number.isFinite(rs.width) && + Number.isFinite(rs.height) && + rs.width > 0 && + rs.height > 0 + ) { + initialW = rs.width; + initialH = rs.height; + } + // Clamp to slider ranges + initialW = Math.max( + parseInt(widthSlider.min, 10) || 10, + Math.min(initialW, parseInt(widthSlider.max, 10)) + ); + initialH = Math.max( + parseInt(heightSlider.min, 10) || 10, + Math.min(initialH, parseInt(heightSlider.max, 10)) + ); + widthSlider.value = initialW; + heightSlider.value = initialH; + widthValue.textContent = initialW; + heightValue.textContent = initialH; + zoomSlider.value = 1; + if (zoomValue) zoomValue.textContent = '100%'; + paintWhiteToggle.checked = state.paintWhitePixels; + paintTransparentToggle.checked = state.paintTransparentPixels; + + let _previewTimer = null; + let _previewJobId = 0; + let _isDraggingSize = false; + let _zoomLevel = 1; + let _ditherWorkBuf = null; + let _ditherEligibleBuf = null; + const ensureDitherBuffers = (n) => { + if (!_ditherWorkBuf || _ditherWorkBuf.length !== n * 3) + _ditherWorkBuf = new Float32Array(n * 3); + if (!_ditherEligibleBuf || _ditherEligibleBuf.length !== n) + _ditherEligibleBuf = new Uint8Array(n); + return { work: _ditherWorkBuf, eligible: _ditherEligibleBuf }; + }; + let _maskImageData = null; + let _maskData = null; + let _dirty = null; + const _resetDirty = () => { + _dirty = { minX: Infinity, minY: Infinity, maxX: -1, maxY: -1 }; + }; + const _markDirty = (x, y) => { + if (!_dirty) _resetDirty(); + if (x < _dirty.minX) _dirty.minX = x; + if (y < _dirty.minY) _dirty.minY = y; + if (x > _dirty.maxX) _dirty.maxX = x; + if (y > _dirty.maxY) _dirty.maxY = y; + }; + const _flushDirty = () => { + if (!_dirty || _dirty.maxX < _dirty.minX || _dirty.maxY < _dirty.minY) return; + const x = Math.max(0, _dirty.minX); + const y = Math.max(0, _dirty.minY); + const w = Math.min(maskCanvas.width - x, _dirty.maxX - x + 1); + const h = Math.min(maskCanvas.height - y, _dirty.maxY - y + 1); + if (w > 0 && h > 0) maskCtx.putImageData(_maskImageData, 0, 0, x, y, w, h); + _resetDirty(); + }; + const _ensureMaskOverlayBuffers = (w, h, rebuildFromMask = false) => { + if (!_maskImageData || _maskImageData.width !== w || _maskImageData.height !== h) { + _maskImageData = maskCtx.createImageData(w, h); + _maskData = _maskImageData.data; + rebuildFromMask = true; + } + if (rebuildFromMask) { + const m = state.resizeIgnoreMask; + const md = _maskData; + md.fill(0); + if (m) { + for (let i = 0; i < m.length; i++) + if (m[i]) { + const p = i * 4; + md[p] = 255; + md[p + 1] = 0; + md[p + 2] = 0; + md[p + 3] = 150; + } + } + maskCtx.putImageData(_maskImageData, 0, 0); + _resetDirty(); + } + }; + const ensureMaskSize = (w, h) => { + if (!state.resizeIgnoreMask || state.resizeIgnoreMask.length !== w * h) { + state.resizeIgnoreMask = new Uint8Array(w * h); + } + baseCanvas.width = w; + baseCanvas.height = h; + maskCanvas.width = w; + maskCanvas.height = h; + maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); + // Ensure overlay buffers exist and rebuild from mask when dimensions change + _ensureMaskOverlayBuffers(w, h, true); + }; + _updateResizePreview = async () => { + const jobId = ++_previewJobId; + const newWidth = parseInt(widthSlider.value, 10); + const newHeight = parseInt(heightSlider.value, 10); + _zoomLevel = parseFloat(zoomSlider.value); + + widthValue.textContent = newWidth; + heightValue.textContent = newHeight; + + ensureMaskSize(newWidth, newHeight); + canvasStack.style.width = newWidth + 'px'; + canvasStack.style.height = newHeight + 'px'; + baseCtx.imageSmoothingEnabled = false; + + if (!state.availableColors || state.availableColors.length === 0) { + if (baseProcessor !== processor && (!baseProcessor.img || !baseProcessor.canvas)) { + await baseProcessor.load(); + } + baseCtx.clearRect(0, 0, newWidth, newHeight); + baseCtx.drawImage(baseProcessor.img, 0, 0, newWidth, newHeight); + // Draw existing mask overlay buffer + maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); + if (_maskImageData) maskCtx.putImageData(_maskImageData, 0, 0); + updateZoomLayout(); + return; + } + + if (baseProcessor !== processor && (!baseProcessor.img || !baseProcessor.canvas)) { + await baseProcessor.load(); + } + baseCtx.clearRect(0, 0, newWidth, newHeight); + baseCtx.drawImage(baseProcessor.img, 0, 0, newWidth, newHeight); + const imgData = baseCtx.getImageData(0, 0, newWidth, newHeight); + const data = imgData.data; + + const tThresh = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; + + const applyFSDither = () => { + const w = newWidth, + h = newHeight; + const n = w * h; + const { work, eligible } = ensureDitherBuffers(n); + for (let y = 0; y < h; y++) { + for (let x = 0; x < w; x++) { + const idx = y * w + x; + const i4 = idx * 4; + const r = data[i4], + g = data[i4 + 1], + b = data[i4 + 2], + a = data[i4 + 3]; + const isEligible = + (state.paintTransparentPixels || a >= tThresh) && + (state.paintWhitePixels || !Utils.isWhitePixel(r, g, b)); + eligible[idx] = isEligible ? 1 : 0; + work[idx * 3] = r; + work[idx * 3 + 1] = g; + work[idx * 3 + 2] = b; + if (!isEligible) { + data[i4 + 3] = 0; // transparent in preview overlay + } + } + } + + const diffuse = (nx, ny, er, eg, eb, factor) => { + if (nx < 0 || nx >= w || ny < 0 || ny >= h) return; + const nidx = ny * w + nx; + if (!eligible[nidx]) return; + const base = nidx * 3; + work[base] = Math.min(255, Math.max(0, work[base] + er * factor)); + work[base + 1] = Math.min(255, Math.max(0, work[base + 1] + eg * factor)); + work[base + 2] = Math.min(255, Math.max(0, work[base + 2] + eb * factor)); + }; + + for (let y = 0; y < h; y++) { + for (let x = 0; x < w; x++) { + const idx = y * w + x; + if (!eligible[idx]) continue; + const base = idx * 3; + const r0 = work[base], + g0 = work[base + 1], + b0 = work[base + 2]; + const [nr, ng, nb] = Utils.findClosestPaletteColor( + r0, + g0, + b0, + state.activeColorPalette + ); + const i4 = idx * 4; + data[i4] = nr; + data[i4 + 1] = ng; + data[i4 + 2] = nb; + data[i4 + 3] = 255; + + const er = r0 - nr; + const eg = g0 - ng; + const eb = b0 - nb; + + diffuse(x + 1, y, er, eg, eb, 7 / 16); + diffuse(x - 1, y + 1, er, eg, eb, 3 / 16); + diffuse(x, y + 1, er, eg, eb, 5 / 16); + diffuse(x + 1, y + 1, er, eg, eb, 1 / 16); + } + } + }; + + // Skip expensive dithering while user is dragging sliders + console.log(`🎨 Preview render - ditheringEnabled: ${state.ditheringEnabled}, _isDraggingSize: ${_isDraggingSize}`); + if (state.ditheringEnabled && !_isDraggingSize) { + console.log('✅ Applying dithering to preview'); + applyFSDither(); + } else { + console.log('⛔ Skipping dithering - applying direct color conversion'); + for (let i = 0; i < data.length; i += 4) { + const r = data[i], + g = data[i + 1], + b = data[i + 2], + a = data[i + 3]; + if ( + (!state.paintTransparentPixels && a < tThresh) || + (!state.paintWhitePixels && Utils.isWhitePixel(r, g, b)) + ) { + data[i + 3] = 0; + continue; + } + const [nr, ng, nb] = Utils.findClosestPaletteColor(r, g, b, state.activeColorPalette); + data[i] = nr; + data[i + 1] = ng; + data[i + 2] = nb; + data[i + 3] = 255; + } + } + + if (jobId !== _previewJobId) return; + baseCtx.putImageData(imgData, 0, 0); + maskCtx.clearRect(0, 0, maskCanvas.width, maskCanvas.height); + if (_maskImageData) maskCtx.putImageData(_maskImageData, 0, 0); + updateZoomLayout(); + }; + + const onWidthInput = () => { + if (keepAspect.checked) { + heightSlider.value = Math.round(parseInt(widthSlider.value, 10) / aspectRatio); + } + _updateResizePreview(); + const curW = parseInt(widthSlider.value, 10); + const curH = parseInt(heightSlider.value, 10); + state.resizeSettings = { + baseWidth: width, + baseHeight: height, + width: curW, + height: curH, + }; + saveBotSettings(); + // Auto-fit after size changes + const fit = typeof computeFitZoom === 'function' ? computeFitZoom() : 1; + if (!isNaN(fit) && isFinite(fit)) applyZoom(fit); + }; + + const onHeightInput = () => { + if (keepAspect.checked) { + widthSlider.value = Math.round(parseInt(heightSlider.value, 10) * aspectRatio); + } + _updateResizePreview(); + const curW = parseInt(widthSlider.value, 10); + const curH = parseInt(heightSlider.value, 10); + state.resizeSettings = { + baseWidth: width, + baseHeight: height, + width: curW, + height: curH, + }; + saveBotSettings(); + // Auto-fit after size changes + const fit = typeof computeFitZoom === 'function' ? computeFitZoom() : 1; + if (!isNaN(fit) && isFinite(fit)) applyZoom(fit); + }; + + paintWhiteToggle.onchange = (e) => { + state.paintWhitePixels = e.target.checked; + _updateResizePreview(); + saveBotSettings(); + }; + + paintTransparentToggle.onchange = (e) => { + state.paintTransparentPixels = e.target.checked; + _updateResizePreview(); + saveBotSettings(); + }; + + let panX = 0, + panY = 0; + const clampPan = () => { + const wrapRect = panStage?.getBoundingClientRect() || { + width: 0, + height: 0, + }; + const w = (baseCanvas.width || 1) * _zoomLevel; + const h = (baseCanvas.height || 1) * _zoomLevel; + if (w <= wrapRect.width) { + panX = Math.floor((wrapRect.width - w) / 2); + } else { + const minX = wrapRect.width - w; + panX = Math.min(0, Math.max(minX, panX)); + } + if (h <= wrapRect.height) { + panY = Math.floor((wrapRect.height - h) / 2); + } else { + const minY = wrapRect.height - h; + panY = Math.min(0, Math.max(minY, panY)); + } + }; + let _panRaf = 0; + const applyPan = () => { + if (_panRaf) return; + _panRaf = requestAnimationFrame(() => { + clampPan(); + canvasStack.style.transform = `translate3d(${Math.round( + panX + )}px, ${Math.round(panY)}px, 0) scale(${_zoomLevel})`; + _panRaf = 0; + }); + }; + + const updateZoomLayout = () => { + const w = baseCanvas.width || 1, + h = baseCanvas.height || 1; + baseCanvas.style.width = w + 'px'; + baseCanvas.style.height = h + 'px'; + maskCanvas.style.width = w + 'px'; + maskCanvas.style.height = h + 'px'; + canvasStack.style.width = w + 'px'; + canvasStack.style.height = h + 'px'; + applyPan(); + }; + const applyZoom = (z) => { + _zoomLevel = Math.max(0.05, Math.min(20, z || 1)); + zoomSlider.value = _zoomLevel; + updateZoomLayout(); + if (zoomValue) zoomValue.textContent = `${Math.round(_zoomLevel * 100)}%`; + }; + zoomSlider.addEventListener('input', () => { + applyZoom(parseFloat(zoomSlider.value)); + }); + if (zoomInBtn) + zoomInBtn.addEventListener('click', () => applyZoom(parseFloat(zoomSlider.value) + 0.1)); + if (zoomOutBtn) + zoomOutBtn.addEventListener('click', () => applyZoom(parseFloat(zoomSlider.value) - 0.1)); + const computeFitZoom = () => { + const wrapRect = panStage?.getBoundingClientRect(); + if (!wrapRect) return 1; + const w = baseCanvas.width || 1; + const h = baseCanvas.height || 1; + const margin = 10; + const scaleX = (wrapRect.width - margin) / w; + const scaleY = (wrapRect.height - margin) / h; + return Math.max(0.05, Math.min(20, Math.min(scaleX, scaleY))); + }; + if (zoomFitBtn) + zoomFitBtn.addEventListener('click', () => { + applyZoom(computeFitZoom()); + centerInView(); + }); + if (zoomActualBtn) + zoomActualBtn.addEventListener('click', () => { + applyZoom(1); + centerInView(); + }); + + const centerInView = () => { + if (!panStage) return; + const rect = panStage.getBoundingClientRect(); + const w = (baseCanvas.width || 1) * _zoomLevel; + const h = (baseCanvas.height || 1) * _zoomLevel; + panX = Math.floor((rect.width - w) / 2); + panY = Math.floor((rect.height - h) / 2); + applyPan(); + }; + + let isPanning = false; + let startX = 0, + startY = 0, + startPanX = 0, + startPanY = 0; + let allowPan = false; // Space key + let panMode = false; // Explicit pan mode toggle for touch/one-button mice + const isPanMouseButton = (e) => e.button === 1 || e.button === 2; + const setCursor = (val) => { + if (panStage) panStage.style.cursor = val; + }; + const isPanActive = (e) => panMode || allowPan || isPanMouseButton(e); + const updatePanModeBtn = () => { + if (!panModeBtn) return; + panModeBtn.classList.toggle('active', panMode); + panModeBtn.setAttribute('aria-pressed', panMode ? 'true' : 'false'); + }; + if (panModeBtn) { + updatePanModeBtn(); + panModeBtn.addEventListener('click', () => { + panMode = !panMode; + updatePanModeBtn(); + setCursor(panMode ? 'grab' : ''); + }); + } + if (panStage) { + panStage.addEventListener('contextmenu', (e) => { + if (allowPan) e.preventDefault(); + }); + window.addEventListener('keydown', (e) => { + if (e.code === 'Space') { + allowPan = true; + setCursor('grab'); + } + }); + window.addEventListener('keyup', (e) => { + if (e.code === 'Space') { + allowPan = false; + if (!isPanning) setCursor(''); + } + }); + panStage.addEventListener('mousedown', (e) => { + if (!isPanActive(e)) return; + e.preventDefault(); + isPanning = true; + startX = e.clientX; + startY = e.clientY; + startPanX = panX; + startPanY = panY; + setCursor('grabbing'); + }); + window.addEventListener('mousemove', (e) => { + if (!isPanning) return; + const dx = e.clientX - startX; + const dy = e.clientY - startY; + panX = startPanX + dx; + panY = startPanY + dy; + applyPan(); + }); + window.addEventListener('mouseup', () => { + if (isPanning) { + isPanning = false; + setCursor(allowPan ? 'grab' : ''); + } + }); + panStage.addEventListener( + 'wheel', + (e) => { + if (!e.ctrlKey && !e.metaKey) return; + e.preventDefault(); + const rect = panStage.getBoundingClientRect(); + const cx = e.clientX - rect.left - panX; + const cy = e.clientY - rect.top - panY; + const before = _zoomLevel; + const step = Math.max(0.05, Math.min(0.5, Math.abs(e.deltaY) > 20 ? 0.2 : 0.1)); + const next = Math.max(0.05, Math.min(20, before + (e.deltaY > 0 ? -step : step))); + if (next === before) return; + const scale = next / before; + panX = panX - cx * (scale - 1); + panY = panY - cy * (scale - 1); + applyZoom(next); + }, + { passive: false } + ); + let lastTouchDist = null; + let touchStartTime = 0; + let doubleTapTimer = null; + panStage.addEventListener( + 'touchstart', + (e) => { + if (e.touches.length === 1) { + const t = e.touches[0]; + isPanning = true; + startX = t.clientX; + startY = t.clientY; + startPanX = panX; + startPanY = panY; + setCursor('grabbing'); + const now = Date.now(); + if (now - touchStartTime < 300) { + // double tap -> toggle 100%/fit + const z = Math.abs(_zoomLevel - 1) < 0.01 ? computeFitZoom() : 1; + applyZoom(z); + centerInView(); + if (doubleTapTimer) clearTimeout(doubleTapTimer); + } else { + touchStartTime = now; + doubleTapTimer = setTimeout(() => { + doubleTapTimer = null; + }, 320); + } + } else if (e.touches.length === 2) { + // Pinch start + const [a, b] = e.touches; + lastTouchDist = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY); + } + }, + { passive: true } + ); + panStage.addEventListener( + 'touchmove', + (e) => { + if (e.touches.length === 1 && isPanning) { + const t = e.touches[0]; + const dx = t.clientX - startX; + const dy = t.clientY - startY; + panX = startPanX + dx; + panY = startPanY + dy; + applyPan(); + } else if (e.touches.length === 2 && lastTouchDist != null) { + e.preventDefault(); + const [a, b] = e.touches; + const dist = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY); + const rect = panStage.getBoundingClientRect(); + const centerX = (a.clientX + b.clientX) / 2 - rect.left - panX; + const centerY = (a.clientY + b.clientY) / 2 - rect.top - panY; + const before = _zoomLevel; + const scale = dist / (lastTouchDist || dist); + const next = Math.max(0.05, Math.min(20, before * scale)); + if (next !== before) { + panX = panX - centerX * (next / before - 1); + panY = panY - centerY * (next / before - 1); + applyZoom(next); + } + lastTouchDist = dist; + } + }, + { passive: false } + ); + panStage.addEventListener('touchend', () => { + isPanning = false; + lastTouchDist = null; + setCursor(panMode || allowPan ? 'grab' : ''); + }); + } + const schedulePreview = () => { + if (_previewTimer) clearTimeout(_previewTimer); + const run = () => { + _previewTimer = null; + _updateResizePreview(); + }; + if (window.requestIdleCallback) { + _previewTimer = setTimeout(() => requestIdleCallback(run, { timeout: 150 }), 50); + } else { + _previewTimer = setTimeout(() => requestAnimationFrame(run), 50); + } + }; + // Track dragging to reduce work and skip dithering during drag + const markDragStart = () => { + _isDraggingSize = true; + }; + const markDragEnd = () => { + _isDraggingSize = false; + schedulePreview(); + }; + widthSlider.addEventListener('pointerdown', markDragStart); + heightSlider.addEventListener('pointerdown', markDragStart); + widthSlider.addEventListener('pointerup', markDragEnd); + heightSlider.addEventListener('pointerup', markDragEnd); + widthSlider.addEventListener('input', () => { + onWidthInput(); + schedulePreview(); + }); + heightSlider.addEventListener('input', () => { + onHeightInput(); + schedulePreview(); + }); + + // Mask painting UX: brush size, modes, row/column fills, and precise coords + let draggingMask = false; + let lastPaintX = -1, + lastPaintY = -1; + let brushSize = 1; + let rowColSize = 1; + let maskMode = 'ignore'; // 'ignore' | 'unignore' | 'toggle' + const brushEl = resizeContainer.querySelector('#maskBrushSize'); + const brushValEl = resizeContainer.querySelector('#maskBrushSizeValue'); + const btnIgnore = resizeContainer.querySelector('#maskModeIgnore'); + const btnUnignore = resizeContainer.querySelector('#maskModeUnignore'); + const btnToggle = resizeContainer.querySelector('#maskModeToggle'); + const clearIgnoredBtnEl = resizeContainer.querySelector('#clearIgnoredBtn'); + const invertMaskBtn = resizeContainer.querySelector('#invertMaskBtn'); + const rowColSizeEl = resizeContainer.querySelector('#rowColSize'); + const rowColSizeValEl = resizeContainer.querySelector('#rowColSizeValue'); + + const updateModeButtons = () => { + const map = [ + [btnIgnore, 'ignore'], + [btnUnignore, 'unignore'], + [btnToggle, 'toggle'], + ]; + for (const [el, m] of map) { + if (!el) continue; + const active = maskMode === m; + el.classList.toggle('active', active); + el.setAttribute('aria-pressed', active ? 'true' : 'false'); + } + }; + const setMode = (mode) => { + maskMode = mode; + updateModeButtons(); + }; + if (brushEl && brushValEl) { + brushEl.addEventListener('input', () => { + brushSize = parseInt(brushEl.value, 10) || 1; + brushValEl.textContent = brushSize; + }); + brushValEl.textContent = brushEl.value; + brushSize = parseInt(brushEl.value, 10) || 1; + } + if (rowColSizeEl && rowColSizeValEl) { + rowColSizeEl.addEventListener('input', () => { + rowColSize = parseInt(rowColSizeEl.value, 10) || 1; + rowColSizeValEl.textContent = rowColSize; + }); + rowColSizeValEl.textContent = rowColSizeEl.value; + rowColSize = parseInt(rowColSizeEl.value, 10) || 1; + } + if (btnIgnore) btnIgnore.addEventListener('click', () => setMode('ignore')); + if (btnUnignore) btnUnignore.addEventListener('click', () => setMode('unignore')); + if (btnToggle) btnToggle.addEventListener('click', () => setMode('toggle')); + // Initialize button state (default to toggle mode) + updateModeButtons(); + + const mapClientToPixel = (clientX, clientY) => { + // Compute without rounding until final step to avoid drift at higher zoom + const rect = baseCanvas.getBoundingClientRect(); + const scaleX = rect.width / baseCanvas.width; + const scaleY = rect.height / baseCanvas.height; + const dx = (clientX - rect.left) / scaleX; + const dy = (clientY - rect.top) / scaleY; + const x = Math.floor(dx); + const y = Math.floor(dy); + return { x, y }; + }; + + const ensureMask = (w, h) => { + if (!state.resizeIgnoreMask || state.resizeIgnoreMask.length !== w * h) { + state.resizeIgnoreMask = new Uint8Array(w * h); + } + }; + + const paintCircle = (cx, cy, radius, value) => { + const w = baseCanvas.width, + h = baseCanvas.height; + ensureMask(w, h); + const r2 = radius * radius; + for (let yy = cy - radius; yy <= cy + radius; yy++) { + if (yy < 0 || yy >= h) continue; + for (let xx = cx - radius; xx <= cx + radius; xx++) { + if (xx < 0 || xx >= w) continue; + const dx = xx - cx, + dy = yy - cy; + if (dx * dx + dy * dy <= r2) { + const idx = yy * w + xx; + let val = state.resizeIgnoreMask[idx]; + if (maskMode === 'toggle') { + val = val ? 0 : 1; + } else if (maskMode === 'ignore') { + val = 1; + } else { + val = 0; + } + state.resizeIgnoreMask[idx] = val; + if (_maskData) { + const p = idx * 4; + if (val) { + _maskData[p] = 255; + _maskData[p + 1] = 0; + _maskData[p + 2] = 0; + _maskData[p + 3] = 150; + } else { + _maskData[p] = 0; + _maskData[p + 1] = 0; + _maskData[p + 2] = 0; + _maskData[p + 3] = 0; + } + _markDirty(xx, yy); + } + } + } + } + }; + + const paintRow = (y, value) => { + const w = baseCanvas.width, + h = baseCanvas.height; + ensureMask(w, h); + if (y < 0 || y >= h) return; + + // Paint multiple rows based on rowColSize + const halfSize = Math.floor(rowColSize / 2); + const startY = Math.max(0, y - halfSize); + const endY = Math.min(h - 1, y + halfSize); + + for (let rowY = startY; rowY <= endY; rowY++) { + for (let x = 0; x < w; x++) { + const idx = rowY * w + x; + let val = state.resizeIgnoreMask[idx]; + if (maskMode === 'toggle') { + val = val ? 0 : 1; + } else if (maskMode === 'ignore') { + val = 1; + } else { + val = 0; + } + state.resizeIgnoreMask[idx] = val; + if (_maskData) { + const p = idx * 4; + if (val) { + _maskData[p] = 255; + _maskData[p + 1] = 0; + _maskData[p + 2] = 0; + _maskData[p + 3] = 150; + } else { + _maskData[p] = 0; + _maskData[p + 1] = 0; + _maskData[p + 2] = 0; + _maskData[p + 3] = 0; + } + } + } + if (_maskData) { + _markDirty(0, rowY); + _markDirty(w - 1, rowY); + } + } + }; + + const paintColumn = (x, value) => { + const w = baseCanvas.width, + h = baseCanvas.height; + ensureMask(w, h); + if (x < 0 || x >= w) return; + + // Paint multiple columns based on rowColSize + const halfSize = Math.floor(rowColSize / 2); + const startX = Math.max(0, x - halfSize); + const endX = Math.min(w - 1, x + halfSize); + + for (let colX = startX; colX <= endX; colX++) { + for (let y = 0; y < h; y++) { + const idx = y * w + colX; + let val = state.resizeIgnoreMask[idx]; + if (maskMode === 'toggle') { + val = val ? 0 : 1; + } else if (maskMode === 'ignore') { + val = 1; + } else { + val = 0; + } + state.resizeIgnoreMask[idx] = val; + if (_maskData) { + const p = idx * 4; + if (val) { + _maskData[p] = 255; + _maskData[p + 1] = 0; + _maskData[p + 2] = 0; + _maskData[p + 3] = 150; + } else { + _maskData[p] = 0; + _maskData[p + 1] = 0; + _maskData[p + 2] = 0; + _maskData[p + 3] = 0; + } + } + } + if (_maskData) { + _markDirty(colX, 0); + _markDirty(colX, h - 1); + } + } + }; + + const redrawMaskOverlay = () => { + // Only flush the dirty region; full rebuild happens on size change + _flushDirty(); + }; + + const handlePaint = (e) => { + // Suppress painting while panning + if ((e.buttons & 4) === 4 || (e.buttons & 2) === 2 || allowPan) return; + const { x, y } = mapClientToPixel(e.clientX, e.clientY); + const w = baseCanvas.width, + h = baseCanvas.height; + if (x < 0 || y < 0 || x >= w || y >= h) return; + const radius = Math.max(1, Math.floor(brushSize / 2)); + if (e.shiftKey) { + paintRow(y); + } else if (e.altKey) { + paintColumn(x); + } else { + paintCircle(x, y, radius); + } + lastPaintX = x; + lastPaintY = y; + redrawMaskOverlay(); + }; + + maskCanvas.addEventListener('mousedown', (e) => { + if (e.button === 1 || e.button === 2 || allowPan) return; // let pan handler manage + draggingMask = true; + handlePaint(e); + }); + // Avoid hijacking touch gestures for panning/zooming + maskCanvas.addEventListener( + 'touchstart', + (e) => { + /* let panStage handle */ + }, + { passive: true } + ); + maskCanvas.addEventListener( + 'touchmove', + (e) => { + /* let panStage handle */ + }, + { passive: true } + ); + maskCanvas.addEventListener( + 'touchend', + (e) => { + /* let panStage handle */ + }, + { passive: true } + ); + window.addEventListener('mousemove', (e) => { + if (draggingMask) handlePaint(e); + }); + window.addEventListener('mouseup', () => { + if (draggingMask) { + draggingMask = false; + saveBotSettings(); + } + }); + + if (clearIgnoredBtnEl) + clearIgnoredBtnEl.addEventListener('click', () => { + const w = baseCanvas.width, + h = baseCanvas.height; + if (state.resizeIgnoreMask) state.resizeIgnoreMask.fill(0); + _ensureMaskOverlayBuffers(w, h, true); + _updateResizePreview(); + saveBotSettings(); + }); + + if (invertMaskBtn) + invertMaskBtn.addEventListener('click', () => { + if (!state.resizeIgnoreMask) return; + for (let i = 0; i < state.resizeIgnoreMask.length; i++) + state.resizeIgnoreMask[i] = state.resizeIgnoreMask[i] ? 0 : 1; + const w = baseCanvas.width, + h = baseCanvas.height; + _ensureMaskOverlayBuffers(w, h, true); + _updateResizePreview(); + saveBotSettings(); + }); + + confirmResize.onclick = async () => { + const newWidth = parseInt(widthSlider.value, 10); + const newHeight = parseInt(heightSlider.value, 10); + + // Generate the final paletted image data + const tempCanvas = document.createElement('canvas'); + const tempCtx = tempCanvas.getContext('2d'); + tempCanvas.width = newWidth; + tempCanvas.height = newHeight; + tempCtx.imageSmoothingEnabled = false; + if (baseProcessor !== processor && (!baseProcessor.img || !baseProcessor.canvas)) { + await baseProcessor.load(); + } + tempCtx.drawImage(baseProcessor.img, 0, 0, newWidth, newHeight); + const imgData = tempCtx.getImageData(0, 0, newWidth, newHeight); + const data = imgData.data; + const tThresh2 = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; + let totalValidPixels = 0; + const mask = + state.resizeIgnoreMask && state.resizeIgnoreMask.length === newWidth * newHeight + ? state.resizeIgnoreMask + : null; + + const applyFSDitherFinal = async () => { + const w = newWidth, + h = newHeight; + const n = w * h; + const { work, eligible } = ensureDitherBuffers(n); + for (let y = 0; y < h; y++) { + for (let x = 0; x < w; x++) { + const idx = y * w + x; + const i4 = idx * 4; + const r = data[i4], + g = data[i4 + 1], + b = data[i4 + 2], + a = data[i4 + 3]; + const masked = mask && mask[idx]; + const isEligible = + !masked && + (state.paintTransparentPixels || a >= tThresh2) && + (state.paintWhitePixels || !Utils.isWhitePixel(r, g, b)); + eligible[idx] = isEligible ? 1 : 0; + work[idx * 3] = r; + work[idx * 3 + 1] = g; + work[idx * 3 + 2] = b; + if (!isEligible) { + data[i4 + 3] = 0; + } + } + // Yield to keep UI responsive + if ((y & 15) === 0) await Promise.resolve(); + } + + const diffuse = (nx, ny, er, eg, eb, factor) => { + if (nx < 0 || nx >= w || ny < 0 || ny >= h) return; + const nidx = ny * w + nx; + if (!eligible[nidx]) return; + const base = nidx * 3; + work[base] = Math.min(255, Math.max(0, work[base] + er * factor)); + work[base + 1] = Math.min(255, Math.max(0, work[base + 1] + eg * factor)); + work[base + 2] = Math.min(255, Math.max(0, work[base + 2] + eb * factor)); + }; + + for (let y = 0; y < h; y++) { + for (let x = 0; x < w; x++) { + const idx = y * w + x; + if (!eligible[idx]) continue; + const base = idx * 3; + const r0 = work[base], + g0 = work[base + 1], + b0 = work[base + 2]; + const [nr, ng, nb] = Utils.findClosestPaletteColor( + r0, + g0, + b0, + state.activeColorPalette + ); + const i4 = idx * 4; + data[i4] = nr; + data[i4 + 1] = ng; + data[i4 + 2] = nb; + data[i4 + 3] = 255; + totalValidPixels++; + + const er = r0 - nr; + const eg = g0 - ng; + const eb = b0 - nb; + + diffuse(x + 1, y, er, eg, eb, 7 / 16); + diffuse(x - 1, y + 1, er, eg, eb, 3 / 16); + diffuse(x, y + 1, er, eg, eb, 5 / 16); + diffuse(x + 1, y + 1, er, eg, eb, 1 / 16); + } + // Yield every row to reduce jank + await Promise.resolve(); + } + }; + + if (state.ditheringEnabled) { + await applyFSDitherFinal(); + } else { + for (let i = 0; i < data.length; i += 4) { + const r = data[i], + g = data[i + 1], + b = data[i + 2], + a = data[i + 3]; + const masked = mask && mask[i >> 2]; + const isTransparent = (!state.paintTransparentPixels && a < tThresh2) || masked; + const isWhiteAndSkipped = !state.paintWhitePixels && Utils.isWhitePixel(r, g, b); + if (isTransparent || isWhiteAndSkipped) { + data[i + 3] = 0; // overlay transparency + continue; + } + totalValidPixels++; + const [nr, ng, nb] = Utils.findClosestPaletteColor(r, g, b, state.activeColorPalette); + data[i] = nr; + data[i + 1] = ng; + data[i + 2] = nb; + data[i + 3] = 255; + } + } + tempCtx.putImageData(imgData, 0, 0); + + // Save the final pixel data for painting + // Persist the paletted (and possibly dithered) pixels so painting uses the same output seen in overlay + const palettedPixels = new Uint8ClampedArray(imgData.data); + state.imageData.pixels = palettedPixels; + state.imageData.width = newWidth; + state.imageData.height = newHeight; + state.imageData.totalPixels = totalValidPixels; + state.totalPixels = totalValidPixels; + state.paintedPixels = 0; + + state.resizeSettings = { + baseWidth: width, + baseHeight: height, + width: newWidth, + height: newHeight, + }; + saveBotSettings(); + + const finalImageBitmap = await createImageBitmap(tempCanvas); + await overlayManager.setImage(finalImageBitmap); + overlayManager.enable(); + toggleOverlayBtn.classList.add('active'); + toggleOverlayBtn.setAttribute('aria-pressed', 'true'); + + // Keep state.imageData.processor as the original-based source; painting uses paletted pixels already stored + + await updateStats(); + updateUI('resizeSuccess', 'success', { + width: newWidth, + height: newHeight, + }); + + // ✅ Mark image as processed and enable position selection + state.imageProcessed = true; + selectPosBtn.disabled = false; + selectPosBtn.title = Utils.t('selectPosition') || 'Select starting position on canvas'; + + // Enable start button if position is already set + if (state.startPosition) { + startBtn.disabled = false; + } + + // Update data buttons (Save/Load/SaveToFile/LoadFromFile) after processing + updateDataButtons(); + + closeResizeDialog(); + }; + + downloadPreviewBtn.onclick = () => { + try { + const w = baseCanvas.width, + h = baseCanvas.height; + const out = document.createElement('canvas'); + out.width = w; + out.height = h; + const octx = out.getContext('2d'); + octx.imageSmoothingEnabled = false; + octx.drawImage(baseCanvas, 0, 0); + octx.drawImage(maskCanvas, 0, 0); + const link = document.createElement('a'); + link.download = 'wplace-preview.png'; + link.href = out.toDataURL(); + link.click(); + } catch (e) { + console.warn('Failed to download preview:', e); + } + }; + + cancelResize.onclick = closeResizeDialog; + + editImageBtn.onclick = () => { + showEditPanel(); + }; + + resizeOverlay.style.display = 'block'; + resizeContainer.style.display = 'block'; + + // Reinitialize color palette with current available colors + initializeColorPalette(resizeContainer); + + _updateResizePreview(); + _resizeDialogCleanup = () => { + try { + zoomSlider.replaceWith(zoomSlider.cloneNode(true)); + } catch { } + try { + if (zoomInBtn) zoomInBtn.replaceWith(zoomInBtn.cloneNode(true)); + } catch { } + try { + if (zoomOutBtn) zoomOutBtn.replaceWith(zoomOutBtn.cloneNode(true)); + } catch { } + }; + setTimeout(() => { + if (typeof computeFitZoom === 'function') { + const z = computeFitZoom(); + if (!isNaN(z) && isFinite(z)) { + applyZoom(z); + centerInView(); + } + } else { + centerInView(); + } + }, 0); + } + + function closeResizeDialog() { + try { + if (typeof _resizeDialogCleanup === 'function') { + _resizeDialogCleanup(); + } + } catch { } + resizeOverlay.style.display = 'none'; + resizeContainer.style.display = 'none'; + _updateResizePreview = () => { }; + try { + if (typeof cancelAnimationFrame === 'function' && _panRaf) { + cancelAnimationFrame(_panRaf); + } + } catch { } + try { + if (_previewTimer) { + clearTimeout(_previewTimer); + _previewTimer = null; + } + } catch { } + _maskImageData = null; + _maskData = null; + _dirty = null; + _ditherWorkBuf = null; + _ditherEligibleBuf = null; + _resizeDialogCleanup = null; + } + + function showEditPanel() { + try { + // Validate that we have a valid base canvas + if (!baseCanvas || !baseCanvas.width || !baseCanvas.height) { + Utils.showAlert('No image available for editing. Please upload an image first.', 'error'); + return; + } + + // Hide resize panel + resizeContainer.style.display = 'none'; + + // Create edit panel if it doesn't exist + let editOverlay = document.getElementById('editOverlay'); + if (!editOverlay) { + createEditPanel(); + editOverlay = document.getElementById('editOverlay'); + } + + // Get current image data from baseCanvas + const imageData = baseCanvas.toDataURL(); + + // Initialize edit panel with current image + initializeEditPanel(imageData); + + // Show edit panel + editOverlay.style.display = 'block'; + + console.log('✨ Pixel Art Editor opened successfully'); + } catch (error) { + console.error('Error opening pixel art editor:', error); + Utils.showAlert('Failed to open pixel art editor. Please try again.', 'error'); + } + } + + function createEditPanel() { + const editOverlay = document.createElement('div'); + editOverlay.id = 'editOverlay'; + editOverlay.className = 'edit-overlay'; + + editOverlay.innerHTML = ` +
    +
    +
    +

    Manual Pixel Art Editor

    +
    + 🖱️ Left click: Draw | Right click/Ctrl+drag: Pan | Mouse wheel: Zoom +
    +
    +
    +
    + + + + + +
    +
    + + +
    +
    +
    + +
    +
    +
    +
    + + + + + +
    + +
    + + + 1 + +
    + +
    + + + +
    +
    + +
    +
    +
    + +
    +
    +
    Navigator
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + Position: (0, 0) | Color: #000000 | Zoom: 100% +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + `; + + document.body.appendChild(editOverlay); + + // Set up event handlers + setupEditPanelEvents(); + } + + function setupEditPanelEvents() { + const editBackBtn = document.getElementById('editBackBtn'); + const editApplyBtn = document.getElementById('editApplyBtn'); + const paintBrush = document.getElementById('paintBrush'); + const eraseTool = document.getElementById('eraseTool'); + const eyedropperTool = document.getElementById('eyedropperTool'); + const fillTool = document.getElementById('fillTool'); + const brushSize = document.getElementById('brushSize'); + const brushSizeValue = document.getElementById('brushSizeValue'); + const showGrid = document.getElementById('showGrid'); + const undoBtn = document.getElementById('undoBtn'); + const redoBtn = document.getElementById('redoBtn'); + const resetViewBtn = document.getElementById('resetViewBtn'); + const editZoomIn = document.getElementById('editZoomIn'); + const editZoomOut = document.getElementById('editZoomOut'); + const zoomSelect = document.getElementById('zoomSelect'); + const zoomFit = document.getElementById('zoomFit'); + const zoom100 = document.getElementById('zoom100'); + const minimapCanvas = document.getElementById('minimapCanvas'); + + // Back to resize panel + editBackBtn.onclick = () => { + document.getElementById('editOverlay').style.display = 'none'; + resizeContainer.style.display = 'block'; + }; + + // Apply changes + editApplyBtn.onclick = () => { + applyEditChanges(); + document.getElementById('editOverlay').style.display = 'none'; + resizeContainer.style.display = 'block'; + }; + + // Tool selection + paintBrush.onclick = () => { + selectTool('paint'); + }; + + eraseTool.onclick = () => { + selectTool('erase'); + }; + + eyedropperTool.onclick = () => { + selectTool('eyedropper'); + }; + + fillTool.onclick = () => { + selectTool('fill'); + }; + + // Grid toggle + showGrid.onclick = () => { + editState.showGrid = !editState.showGrid; + showGrid.classList.toggle('active', editState.showGrid); + redrawCanvas(); + }; + + // Brush size + brushSize.oninput = () => { + brushSizeValue.textContent = brushSize.value; + updateBrushSize(parseInt(brushSize.value)); + }; + + // Undo/Redo + undoBtn.onclick = () => undoEdit(); + redoBtn.onclick = () => redoEdit(); + + // Reset view + resetViewBtn.onclick = () => resetEditView(); + + // Enhanced zoom controls + editZoomIn.onclick = () => zoomIn(); + editZoomOut.onclick = () => zoomOut(); + + zoomSelect.onchange = () => { + const newZoom = parseFloat(zoomSelect.value); + setZoom(newZoom); + }; + + zoomFit.onclick = () => fitToWindow(); + zoom100.onclick = () => setZoom(1); + + // Minimap navigation + if (minimapCanvas) { + minimapCanvas.onclick = (e) => navigateToMinimapPosition(e); + } + } + + const ZOOM_LEVELS = [0.1, 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6, 8, 12, 16, 24, 32]; + + let editState = { + currentTool: 'paint', + currentColor: '#000000', + currentColorId: null, + brushSize: 1, + zoom: 1, + panX: 0, + panY: 0, + undoStack: [], + redoStack: [], + isDrawing: false, + isPanning: false, + showGrid: false, + + mouseX: 0, + mouseY: 0, + canvasWidth: 0, + canvasHeight: 0, + updatePending: false, + lastPaintPos: null, + touchStart: null, + lastTouchDistance: 0, + lastTouchCenter: { x: 0, y: 0 } + }; + + function calculateOptimalPanelSize(imageWidth, imageHeight) { + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + + // Reserve minimal space for UI elements for almost fullscreen experience + const uiReserved = { + header: 80, + toolbar: 60, + bottomBar: 120, + padding: 40 + }; + + const maxCanvasWidth = viewportWidth - uiReserved.padding; + const maxCanvasHeight = viewportHeight - uiReserved.header - uiReserved.toolbar - uiReserved.bottomBar - uiReserved.padding; + + // Calculate optimal initial zoom to fit image + const scaleX = maxCanvasWidth / imageWidth; + const scaleY = maxCanvasHeight / imageHeight; + const initialZoom = Math.min(scaleX, scaleY, 1); // Don't zoom in initially + + return { + panelWidth: Math.min(viewportWidth * 0.95, imageWidth * initialZoom + uiReserved.colorPanel + uiReserved.padding), + panelHeight: Math.min(viewportHeight * 0.95, imageHeight * initialZoom + uiReserved.toolbar + uiReserved.statusBar + uiReserved.canvasToolbar + uiReserved.padding), + canvasWidth: Math.min(maxCanvasWidth, imageWidth * initialZoom), + canvasHeight: Math.min(maxCanvasHeight, imageHeight * initialZoom), + initialZoom: Math.max(0.1, initialZoom) + }; + } + + function initializeEditPanel(imageData) { + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + + // Reset edit state + editState.zoom = 1; + editState.panX = 0; + editState.panY = 0; + editState.undoStack = []; + editState.redoStack = []; + editState.currentTool = 'paint'; + editState.brushSize = 1; + editState.showGrid = false; + editState.isPanning = false; + editState.isDrawing = false; + editState.lastPaintPos = null; + + // Set canvas size to match baseCanvas + editCanvas.width = baseCanvas.width; + editCanvas.height = baseCanvas.height; + editState.canvasWidth = editCanvas.width; + editState.canvasHeight = editCanvas.height; + + // Configure canvas context for pixel art + ctx.imageSmoothingEnabled = false; + ctx.webkitImageSmoothingEnabled = false; + ctx.mozImageSmoothingEnabled = false; + ctx.msImageSmoothingEnabled = false; + + // Calculate optimal panel size + const panelSize = calculateOptimalPanelSize(editCanvas.width, editCanvas.height); + const editContainer = document.querySelector('.edit-container'); + if (editContainer) { + editContainer.style.width = panelSize.panelWidth + 'px'; + editContainer.style.height = panelSize.panelHeight + 'px'; + } + + // Setup canvas container + setupCanvasContainer(); + + // Add CSS checkerboard background to the wrapper element (not the canvas) + // This allows users to see transparency without saving it to the template + const canvasWrapper = document.getElementById('editCanvasWrapper'); + if (canvasWrapper) { + canvasWrapper.style.background = ` + repeating-conic-gradient(#f0f0f0 0% 25%, #e0e0e0 0% 50%) + 50% / 16px 16px + `; + } + + // Load image onto canvas + const img = new Image(); + img.onload = () => { + ctx.clearRect(0, 0, editCanvas.width, editCanvas.height); + // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template + ctx.drawImage(img, 0, 0); + + // Always fit artwork to the visible area on start and center + fitToWindow(); + centerCanvas(); + + // Setup minimap + setupMinimap(); + + // Save initial state for undo + saveEditState(); + + // Set up canvas drawing events + setupCanvasDrawing(); + + // Initialize color palette + initializeEditColorPalette(); + + // Setup keyboard shortcuts + setupKeyboardShortcuts(); + + // Setup touch support + setupTouchSupport(); + + // Set initial tool + selectTool('paint'); + + // Update status bar + updateStatusBar(0, 0); + + // Center canvas initially + centerCanvas(); + }; + img.src = imageData; + } + + // mapClientToCanvas function for coordinate mapping + function mapClientToCanvas(clientX, clientY) { + const canvas = document.getElementById('editCanvas'); + const wrapper = document.getElementById('editCanvasWrapper'); + const container = document.getElementById('editCanvasContainer'); + + if (!canvas || !wrapper || !container) return null; + + // Get the actual canvas element bounds (after CSS transform) + const canvasRect = canvas.getBoundingClientRect(); + + // Calculate relative position within the actual canvas bounds + const relativeX = (clientX - canvasRect.left) / canvasRect.width * canvas.width; + const relativeY = (clientY - canvasRect.top) / canvasRect.height * canvas.height; + + // Convert to canvas coordinates + const canvasX = Math.floor(relativeX); + const canvasY = Math.floor(relativeY); + + // Bounds checking + if (canvasX < 0 || canvasX >= canvas.width || canvasY < 0 || canvasY >= canvas.height) { + return null; + } + + return { x: canvasX, y: canvasY }; + } + + function setupCanvasDrawing() { + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + + let isDrawing = false; + let isPanning = false; + let lastX = 0; + let lastY = 0; + let panStartX = 0; + let panStartY = 0; + + const getMousePos = (e) => { + return mapClientToCanvas(e.clientX, e.clientY); + }; + + editCanvas.onmousedown = (e) => { + if (e.button === 2 || e.ctrlKey) { // Right click or Ctrl+click for panning + editState.isPanning = true; + panStartX = e.clientX - editState.panX; + panStartY = e.clientY - editState.panY; + editCanvas.style.cursor = 'move'; + e.preventDefault(); + return; + } + + const pos = getMousePos(e); + if (!pos) return; + + if (editState.currentTool === 'eyedropper') { + handleEyedropper(pos.x, pos.y); + return; + } + + if (editState.currentTool === 'fill') { + floodFill(pos.x, pos.y, editState.currentColor); + saveEditState(); + return; + } + + editState.isDrawing = true; + editState.lastPaintPos = { x: pos.x, y: pos.y }; + lastX = pos.x; + lastY = pos.y; + + paintAtPosition(pos.x, pos.y, true); + }; + + editCanvas.onmousemove = (e) => { + const pos = getMousePos(e); + + if (pos) { + editState.mouseX = pos.x; + editState.mouseY = pos.y; + updateStatusBar(pos.x, pos.y); + } + + if (editState.isPanning) { + editState.panX = e.clientX - panStartX; + editState.panY = e.clientY - panStartY; + constrainPan(); + updateCanvasTransform(); + updateMinimap(); + return; + } + + if (!editState.isDrawing) { + return; + } + + if (pos && editState.lastPaintPos) { + paintAtPosition(pos.x, pos.y, true); + editState.lastPaintPos = { x: pos.x, y: pos.y }; + } + }; + + editCanvas.onmouseup = (e) => { + if (editState.isPanning) { + editState.isPanning = false; + selectTool(editState.currentTool); // Restore cursor + return; + } + + if (editState.isDrawing) { + editState.isDrawing = false; + editState.lastPaintPos = null; + saveEditState(); + } + }; + + editCanvas.onmouseleave = () => { + if (editState.isPanning) { + editState.isPanning = false; + selectTool(editState.currentTool); // Restore cursor + } + + if (editState.isDrawing) { + editState.isDrawing = false; + editState.lastPaintPos = null; + saveEditState(); + } + }; + + // Prevent context menu on right click + editCanvas.oncontextmenu = (e) => { + e.preventDefault(); + return false; + }; + + // Enhanced zoom with mouse wheel (zoom to cursor) + editCanvas.onwheel = (e) => { + e.preventDefault(); + const zoomFactor = e.deltaY < 0 ? 1.2 : 1 / 1.2; + zoomToPoint(editState.zoom * zoomFactor, e.clientX, e.clientY); + }; + } + + function paintAtPosition(x, y, isMouseDown = true) { + if (!isMouseDown || !editState.currentColor) return; + + const canvas = document.getElementById('editCanvas'); + const ctx = canvas.getContext('2d'); + + if (editState.lastPaintPos && editState.currentTool === 'paint') { + // Draw line from last position to current position + drawLine(ctx, editState.lastPaintPos.x, editState.lastPaintPos.y, x, y, editState.currentTool); + } else { + // Single brush stroke + drawBrush(ctx, x, y, editState.currentTool); + } + + editState.lastPaintPos = { x, y }; + + // Update minimap thumbnail + if (!editState.updatePending) { + editState.updatePending = true; + requestAnimationFrame(() => { + setupMinimap(); + editState.updatePending = false; + }); + } + } + + function drawBrush(ctx, x, y, tool) { + const size = editState.brushSize; + const halfSize = Math.floor(size / 2); + + if (tool === 'paint') { + ctx.fillStyle = editState.currentColor; + for (let dx = 0; dx < size; dx++) { + for (let dy = 0; dy < size; dy++) { + // Center the brush at the cursor position + const px = x - halfSize + dx; + const py = y - halfSize + dy; + + if (px >= 0 && px < ctx.canvas.width && py >= 0 && py < ctx.canvas.height) { + ctx.fillRect(px, py, 1, 1); + } + } + } + } else if (tool === 'erase') { + for (let dx = 0; dx < size; dx++) { + for (let dy = 0; dy < size; dy++) { + // Center the brush at the cursor position + const px = x - halfSize + dx; + const py = y - halfSize + dy; + + if (px >= 0 && px < ctx.canvas.width && py >= 0 && py < ctx.canvas.height) { + ctx.clearRect(px, py, 1, 1); + } + } + } + } + } + + function drawPixel(x, y) { + drawBrush(document.getElementById('editCanvas').getContext('2d'), x, y, 'paint'); + } + + function erasePixel(x, y) { + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + + const size = editState.brushSize; + const halfSize = Math.floor(size / 2); + + for (let dx = 0; dx < size; dx++) { + for (let dy = 0; dy < size; dy++) { + // Center the brush at the cursor position (consistent with drawBrush) + const px = x - halfSize + dx; + const py = y - halfSize + dy; + + if (px >= 0 && px < editCanvas.width && py >= 0 && py < editCanvas.height) { + ctx.clearRect(px, py, 1, 1); + } + } + } + } + + function drawLine(ctx, x1, y1, x2, y2, tool) { + // Bresenham's line algorithm with tool support + const dx = Math.abs(x2 - x1); + const dy = Math.abs(y2 - y1); + const sx = x1 < x2 ? 1 : -1; + const sy = y1 < y2 ? 1 : -1; + let err = dx - dy; + + let x = x1; + let y = y1; + + while (true) { + drawBrush(ctx, x, y, tool); + + if (x === x2 && y === y2) break; + + const e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x += sx; + } + if (e2 < dx) { + err += dx; + y += sy; + } + } + } + + function eraseLine(x1, y1, x2, y2) { + // Same as drawLine but with erase + const dx = Math.abs(x2 - x1); + const dy = Math.abs(y2 - y1); + const sx = x1 < x2 ? 1 : -1; + const sy = y1 < y2 ? 1 : -1; + let err = dx - dy; + + let x = x1; + let y = y1; + + while (true) { + erasePixel(x, y); + + if (x === x2 && y === y2) break; + + const e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x += sx; + } + if (e2 < dx) { + err += dx; + y += sy; + } + } + } + + function selectTool(tool) { + editState.currentTool = tool; + + document.querySelectorAll('.edit-tool').forEach(btn => { + btn.classList.remove('active'); + }); + + const editCanvas = document.getElementById('editCanvas'); + + switch (tool) { + case 'paint': + document.getElementById('paintBrush').classList.add('active'); + editCanvas.style.cursor = 'crosshair'; + break; + case 'erase': + document.getElementById('eraseTool').classList.add('active'); + editCanvas.style.cursor = 'not-allowed'; + break; + case 'eyedropper': + document.getElementById('eyedropperTool').classList.add('active'); + editCanvas.style.cursor = 'copy'; + break; + case 'fill': + document.getElementById('fillTool').classList.add('active'); + editCanvas.style.cursor = 'pointer'; + break; + } + } + + function updateBrushSize(size) { + editState.brushSize = size; + } + + function initializeEditColorPalette() { + const colorGrid = document.getElementById('editColorGrid'); + const currentColorDisplay = document.getElementById('currentColorDisplay'); + + colorGrid.innerHTML = ''; + + let availableColors = []; + + // Try to get colors from state first + if (state && state.availableColors && state.availableColors.length > 0) { + availableColors = state.availableColors.map(color => ({ + id: color.id, + name: color.name, + rgb: color.rgb, + hex: `#${color.rgb[0].toString(16).padStart(2, '0')}${color.rgb[1].toString(16).padStart(2, '0')}${color.rgb[2].toString(16).padStart(2, '0')}` + })); + } else { + // Fallback to CONFIG.COLOR_MAP + availableColors = Object.values(CONFIG.COLOR_MAP) + .filter(color => color.rgb !== null) + .map(color => ({ + id: color.id, + name: color.name, + rgb: [color.rgb.r, color.rgb.g, color.rgb.b], + hex: `#${color.rgb.r.toString(16).padStart(2, '0')}${color.rgb.g.toString(16).padStart(2, '0')}${color.rgb.b.toString(16).padStart(2, '0')}` + })); + } + + // Fallback to basic colors if nothing available + if (availableColors.length === 0) { + availableColors = [ + { id: 0, name: 'Black', rgb: [0, 0, 0], hex: '#000000' }, + { id: 1, name: 'White', rgb: [255, 255, 255], hex: '#ffffff' }, + { id: 2, name: 'Red', rgb: [255, 0, 0], hex: '#ff0000' }, + { id: 3, name: 'Green', rgb: [0, 255, 0], hex: '#00ff00' }, + { id: 4, name: 'Blue', rgb: [0, 0, 255], hex: '#0000ff' } + ]; + } + + // Update color count + const colorCount = document.getElementById('editColorCount'); + if (colorCount) { + colorCount.textContent = availableColors.length; + } + + availableColors.forEach(color => { + const colorBtn = document.createElement('button'); + colorBtn.className = 'color-btn'; + colorBtn.style.backgroundColor = color.hex; + colorBtn.title = `${color.name} (${color.hex})`; + colorBtn.dataset.colorId = color.id; + colorBtn.dataset.colorHex = color.hex; + + colorBtn.onclick = () => { + editState.currentColor = color.hex; + editState.currentColorId = color.id; + currentColorDisplay.style.backgroundColor = color.hex; + + // Update active color + document.querySelectorAll('.color-btn').forEach(btn => { + btn.classList.remove('selected'); + }); + colorBtn.classList.add('selected'); + + updateStatusBar(editState.mouseX, editState.mouseY); + }; + + colorGrid.appendChild(colorBtn); + }); + + // Set first color as default + if (availableColors.length > 0) { + editState.currentColor = availableColors[0].hex; + editState.currentColorId = availableColors[0].id; + currentColorDisplay.style.backgroundColor = availableColors[0].hex; + colorGrid.firstChild.classList.add('selected'); + } + } + + function saveEditState() { + const editCanvas = document.getElementById('editCanvas'); + const imageData = editCanvas.toDataURL(); + + editState.undoStack.push(imageData); + + // Limit undo stack size + if (editState.undoStack.length > 50) { + editState.undoStack.shift(); + } + + // Clear redo stack when new action is performed + editState.redoStack = []; + + updateUndoRedoButtons(); + } + + function undoEdit() { + if (editState.undoStack.length <= 1) return; + + const currentState = editState.undoStack.pop(); + editState.redoStack.push(currentState); + + const previousState = editState.undoStack[editState.undoStack.length - 1]; + loadEditState(previousState); + + updateUndoRedoButtons(); + } + + function redoEdit() { + if (editState.redoStack.length === 0) return; + + const nextState = editState.redoStack.pop(); + editState.undoStack.push(nextState); + + loadEditState(nextState); + + updateUndoRedoButtons(); + } + + function loadEditState(imageData) { + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + + const img = new Image(); + img.onload = () => { + ctx.clearRect(0, 0, editCanvas.width, editCanvas.height); + // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template + ctx.drawImage(img, 0, 0); + }; + img.src = imageData; + } + + function updateUndoRedoButtons() { + const undoBtn = document.getElementById('undoBtn'); + const redoBtn = document.getElementById('redoBtn'); + + if (undoBtn) { + undoBtn.disabled = editState.undoStack.length <= 1; + } + + if (redoBtn) { + redoBtn.disabled = editState.redoStack.length === 0; + } + } + + function updateCanvasTransform() { + const wrapper = document.getElementById('editCanvasWrapper'); + if (wrapper) { + wrapper.style.transform = `translate(${editState.panX}px, ${editState.panY}px) scale(${editState.zoom})`; + } + + // Update zoom select + const zoomSelect = document.getElementById('zoomSelect'); + if (zoomSelect) { + // If exact value exists, use it, otherwise show nearest but update displayed text + const exact = ZOOM_LEVELS.find(z => z === editState.zoom); + zoomSelect.value = exact != null ? exact : ZOOM_LEVELS.reduce((prev, curr) => Math.abs(curr - editState.zoom) < Math.abs(prev - editState.zoom) ? curr : prev); + // Also update status bar zoom text + updateStatusBar(editState.mouseX || 0, editState.mouseY || 0); + } + } + + function setupCanvasContainer() { + const canvasContainer = document.getElementById('editCanvasContainer'); + const editCanvas = document.getElementById('editCanvas'); + const wrapper = document.getElementById('editCanvasWrapper'); + + if (!canvasContainer || !wrapper) return; + + // Setup container styles + canvasContainer.style.cssText = ` + position: relative; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + background: + linear-gradient(45deg, #f0f0f0 25%, transparent 25%), + linear-gradient(-45deg, #f0f0f0 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, #f0f0f0 75%), + linear-gradient(-45deg, transparent 75%, #f0f0f0 75%); + background-size: 20px 20px; + background-position: 0 0, 0 10px, 10px -10px, -10px 0px; + background-color: #ddd; + `; + + // Setup wrapper styles + wrapper.style.cssText = ` + position: relative; + transform-origin: center center; + display: inline-block; + box-shadow: 0 4px 20px rgba(0,0,0,0.3); + border: 2px solid #333; + background: white; + `; + } + + function zoomToPoint(newZoom, clientX, clientY) { + const container = document.getElementById('editCanvasContainer'); + const wrapper = document.getElementById('editCanvasWrapper'); + + if (!container || !wrapper) return; + + newZoom = Math.max(0.1, Math.min(32, newZoom)); + + if (clientX !== undefined && clientY !== undefined) { + // Get current transform values + const oldZoom = editState.zoom; + const rect = container.getBoundingClientRect(); + + // Calculate zoom center point relative to container + const containerCenterX = rect.left + rect.width / 2; + const containerCenterY = rect.top + rect.height / 2; + + // Calculate offset to keep zoom point centered + const offsetX = (clientX - containerCenterX) * (1 - newZoom / oldZoom); + const offsetY = (clientY - containerCenterY) * (1 - newZoom / oldZoom); + + editState.panX += offsetX; + editState.panY += offsetY; + } + + editState.zoom = newZoom; + constrainPan(); + updateCanvasTransform(); + updateMinimap(); + updateStatusBar(editState.mouseX || 0, editState.mouseY || 0); + } + + function constrainPan() { + const container = document.getElementById('editCanvasContainer'); + const canvas = document.getElementById('editCanvas'); + + if (!container || !canvas) return; + + const containerRect = container.getBoundingClientRect(); + const scaledWidth = canvas.width * editState.zoom; + const scaledHeight = canvas.height * editState.zoom; + + // Small padding around edges to avoid snapping against borders + const padding = 10; + + // Calculate limits to keep canvas somewhat visible + const maxPanX = Math.max(0, (scaledWidth - containerRect.width) / 2 + padding); + const maxPanY = Math.max(0, (scaledHeight - containerRect.height) / 2 + padding); + + editState.panX = Math.max(-maxPanX, Math.min(maxPanX, editState.panX)); + editState.panY = Math.max(-maxPanY, Math.min(maxPanY, editState.panY)); + } + + function setZoom(zoom) { + zoomToPoint(zoom); + } + + function zoomIn() { + const currentIndex = ZOOM_LEVELS.findIndex(z => z >= editState.zoom); + const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1); + setZoom(ZOOM_LEVELS[nextIndex]); + } + + function zoomOut() { + const currentIndex = ZOOM_LEVELS.findIndex(z => z >= editState.zoom); + const prevIndex = Math.max(currentIndex - 1, 0); + setZoom(ZOOM_LEVELS[prevIndex]); + } + + function fitToWindow() { + const container = document.getElementById('editCanvasContainer'); + const canvas = document.getElementById('editCanvas'); + + if (!container || !canvas) return; + + const containerRect = container.getBoundingClientRect(); + const padding = 40; + + const scaleX = (containerRect.width - padding) / canvas.width; + const scaleY = (containerRect.height - padding) / canvas.height; + const fitZoom = Math.max(0.1, Math.min(scaleX, scaleY)); + + // Center the canvas + editState.zoom = fitZoom; + editState.panX = 0; + editState.panY = 0; + updateCanvasTransform(); + updateMinimap(); + updateStatusBar(editState.mouseX || 0, editState.mouseY || 0); + } + + function centerCanvas() { + editState.panX = 0; + editState.panY = 0; + updateCanvasTransform(); + updateMinimap(); + } + + function resetEditView() { + editState.zoom = 1; + editState.panX = 0; + editState.panY = 0; + + updateCanvasTransform(); + updateMinimap(); + } + + function setupMinimap() { + const minimapCanvas = document.getElementById('minimapCanvas'); + const editCanvas = document.getElementById('editCanvas'); + const minimapContainer = document.getElementById('minimapContainer'); + + if (!minimapCanvas || !editCanvas) return; + + // Show minimap only for larger images + if (editCanvas.width < 100 || editCanvas.height < 100) { + if (minimapContainer) minimapContainer.style.display = 'none'; + return; + } + + // Calculate minimap size + const maxSize = 150; + const scale = Math.min(maxSize / editCanvas.width, maxSize / editCanvas.height); + + minimapCanvas.width = editCanvas.width * scale; + minimapCanvas.height = editCanvas.height * scale; + + // Draw thumbnail + const minimapCtx = minimapCanvas.getContext('2d'); + minimapCtx.imageSmoothingEnabled = false; + // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template + minimapCtx.drawImage(editCanvas, 0, 0, minimapCanvas.width, minimapCanvas.height); + + // Update viewport indicator + updateMinimap(); + } + + function updateMinimap() { + const viewport = document.getElementById('minimapViewport'); + const minimapCanvas = document.getElementById('minimapCanvas'); + const container = document.getElementById('editCanvasContainer'); + const editCanvas = document.getElementById('editCanvas'); + + if (!viewport || !minimapCanvas || !container || !editCanvas) return; + + const containerRect = container.getBoundingClientRect(); + const scale = minimapCanvas.width / editCanvas.width; + + // Calculate visible area in minimap coordinates + const visibleWidth = Math.min(containerRect.width / editState.zoom * scale, minimapCanvas.width); + const visibleHeight = Math.min(containerRect.height / editState.zoom * scale, minimapCanvas.height); + + const viewportX = (minimapCanvas.width / 2) - (editState.panX / editState.zoom * scale) - (visibleWidth / 2); + const viewportY = (minimapCanvas.height / 2) - (editState.panY / editState.zoom * scale) - (visibleHeight / 2); + + viewport.style.width = `${visibleWidth}px`; + viewport.style.height = `${visibleHeight}px`; + viewport.style.left = `${Math.max(0, Math.min(minimapCanvas.width - visibleWidth, viewportX))}px`; + viewport.style.top = `${Math.max(0, Math.min(minimapCanvas.height - visibleHeight, viewportY))}px`; + } + + function navigateToMinimapPosition(e) { + const minimapCanvas = document.getElementById('minimapCanvas'); + const editCanvas = document.getElementById('editCanvas'); + + if (!minimapCanvas || !editCanvas) return; + + const rect = minimapCanvas.getBoundingClientRect(); + const x = (e.clientX - rect.left) / minimapCanvas.width; + const y = (e.clientY - rect.top) / minimapCanvas.height; + + // Convert to canvas coordinates and center + const targetX = (x - 0.5) * editCanvas.width * editState.zoom; + const targetY = (y - 0.5) * editCanvas.height * editState.zoom; + + editState.panX = -targetX; + editState.panY = -targetY; + + constrainPan(); + updateCanvasTransform(); + updateMinimap(); + } + + function updateStatusBar(x, y) { + const statusBar = document.getElementById('editStatusBar'); + if (statusBar) { + const zoomPercent = Math.round(editState.zoom * 100); + statusBar.textContent = `Position: (${x}, ${y}) | Color: ${editState.currentColor || '#000000'} | Zoom: ${zoomPercent}%`; + } + } + + function handleEyedropper(x, y) { + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + + if (x >= 0 && x < editCanvas.width && y >= 0 && y < editCanvas.height) { + const imageData = ctx.getImageData(x, y, 1, 1); + const [r, g, b] = imageData.data; + const pickedColor = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`; + + editState.currentColor = pickedColor; + const currentColorDisplay = document.getElementById('currentColorDisplay'); + if (currentColorDisplay) { + currentColorDisplay.style.backgroundColor = pickedColor; + } + + // Try to find matching color in palette + document.querySelectorAll('.edit-color-btn').forEach(btn => { + btn.classList.remove('active'); + if (btn.dataset.colorHex === pickedColor) { + btn.classList.add('active'); + editState.currentColorId = parseInt(btn.dataset.colorId); + } + }); + + updateStatusBar(x, y); + } + } + + function floodFill(startX, startY, fillColor) { + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + const imageData = ctx.getImageData(0, 0, editCanvas.width, editCanvas.height); + const data = imageData.data; + + if (startX < 0 || startX >= editCanvas.width || startY < 0 || startY >= editCanvas.height) return; + + const startIndex = (startY * editCanvas.width + startX) * 4; + const startR = data[startIndex]; + const startG = data[startIndex + 1]; + const startB = data[startIndex + 2]; + const startA = data[startIndex + 3]; + + // Convert fill color to RGB + const fillR = parseInt(fillColor.slice(1, 3), 16); + const fillG = parseInt(fillColor.slice(3, 5), 16); + const fillB = parseInt(fillColor.slice(5, 7), 16); + + // Don't fill if the color is already the same + if (startR === fillR && startG === fillG && startB === fillB) return; + + const pixelsToCheck = [{ x: startX, y: startY }]; + const checkedPixels = new Set(); + + while (pixelsToCheck.length > 0) { + const { x, y } = pixelsToCheck.pop(); + const key = `${x},${y}`; + + if (checkedPixels.has(key)) continue; + checkedPixels.add(key); + + if (x < 0 || x >= editCanvas.width || y < 0 || y >= editCanvas.height) continue; + + const index = (y * editCanvas.width + x) * 4; + const r = data[index]; + const g = data[index + 1]; + const b = data[index + 2]; + const a = data[index + 3]; + + if (r === startR && g === startG && b === startB && a === startA) { + data[index] = fillR; + data[index + 1] = fillG; + data[index + 2] = fillB; + data[index + 3] = 255; + + pixelsToCheck.push({ x: x + 1, y }); + pixelsToCheck.push({ x: x - 1, y }); + pixelsToCheck.push({ x, y: y + 1 }); + pixelsToCheck.push({ x, y: y - 1 }); + } + } + + ctx.putImageData(imageData, 0, 0); + } + + // Brush preview removed per user request + function hideBrushPreview() { + // No-op - brush preview disabled + } + + function drawGrid(ctx, width, height) { + if (!editState.showGrid || editState.zoom < 4) return; + + ctx.save(); + ctx.strokeStyle = 'rgba(128, 128, 128, 0.3)'; + ctx.lineWidth = 1 / editState.zoom; + + for (let x = 0; x <= width; x++) { + ctx.beginPath(); + ctx.moveTo(x, 0); + ctx.lineTo(x, height); + ctx.stroke(); + } + + for (let y = 0; y <= height; y++) { + ctx.beginPath(); + ctx.moveTo(0, y); + ctx.lineTo(width, y); + ctx.stroke(); + } + + ctx.restore(); + } + + function drawCheckerboardBackground(ctx, width, height) { + const checkerSize = 8; // Size of each checker square + ctx.fillStyle = '#f0f0f0'; // Light gray + ctx.fillRect(0, 0, width, height); + + ctx.fillStyle = '#e0e0e0'; // Slightly darker gray + for (let x = 0; x < width; x += checkerSize) { + for (let y = 0; y < height; y += checkerSize) { + if ((Math.floor(x / checkerSize) + Math.floor(y / checkerSize)) % 2 === 1) { + ctx.fillRect(x, y, checkerSize, checkerSize); + } + } + } + } + + function redrawCanvas() { + if (editState.undoStack.length === 0) return; + + const currentState = editState.undoStack[editState.undoStack.length - 1]; + const editCanvas = document.getElementById('editCanvas'); + const ctx = editCanvas.getContext('2d'); + + const img = new Image(); + img.onload = () => { + ctx.clearRect(0, 0, editCanvas.width, editCanvas.height); + // REMOVED: drawCheckerboardBackground - prevents checkerboard from being saved with template + ctx.drawImage(img, 0, 0); + drawGrid(ctx, editCanvas.width, editCanvas.height); + }; + img.src = currentState; + } + + function setupTouchSupport() { + const canvas = document.getElementById('editCanvas'); + if (!canvas) return; + + let touchStartTime = 0; + + canvas.addEventListener('touchstart', handleTouchStart, { passive: false }); + canvas.addEventListener('touchmove', handleTouchMove, { passive: false }); + canvas.addEventListener('touchend', handleTouchEnd, { passive: false }); + + function handleTouchStart(e) { + e.preventDefault(); + touchStartTime = Date.now(); + + if (e.touches.length === 1) { + // Single touch - start painting + const touch = e.touches[0]; + const coords = mapClientToCanvas(touch.clientX, touch.clientY); + if (coords) { + editState.isDrawing = true; + editState.lastPaintPos = { x: coords.x, y: coords.y }; + paintAtPosition(coords.x, coords.y, true); + } + } else if (e.touches.length === 2) { + // Two finger - prepare for zoom/pan + const touch1 = e.touches[0]; + const touch2 = e.touches[1]; + + editState.lastTouchDistance = Math.hypot( + touch2.clientX - touch1.clientX, + touch2.clientY - touch1.clientY + ); + + editState.lastTouchCenter = { + x: (touch1.clientX + touch2.clientX) / 2, + y: (touch1.clientY + touch2.clientY) / 2 + }; + } + } + + function handleTouchMove(e) { + e.preventDefault(); + + if (e.touches.length === 1 && editState.isDrawing) { + // Continue painting + const touch = e.touches[0]; + const coords = mapClientToCanvas(touch.clientX, touch.clientY); + if (coords) { + paintAtPosition(coords.x, coords.y, true); + } + } else if (e.touches.length === 2) { + // Pinch zoom and pan + const touch1 = e.touches[0]; + const touch2 = e.touches[1]; + + const currentDistance = Math.hypot( + touch2.clientX - touch1.clientX, + touch2.clientY - touch1.clientY + ); + + const currentCenter = { + x: (touch1.clientX + touch2.clientX) / 2, + y: (touch1.clientY + touch2.clientY) / 2 + }; + + // Zoom based on distance change + if (editState.lastTouchDistance > 0) { + const zoomFactor = currentDistance / editState.lastTouchDistance; + const newZoom = Math.max(0.1, Math.min(32, editState.zoom * zoomFactor)); + zoomToPoint(newZoom, currentCenter.x, currentCenter.y); + } + + // Pan based on center movement + editState.panX += currentCenter.x - editState.lastTouchCenter.x; + editState.panY += currentCenter.y - editState.lastTouchCenter.y; + + editState.lastTouchDistance = currentDistance; + editState.lastTouchCenter = currentCenter; + + constrainPan(); + updateCanvasTransform(); + updateMinimap(); + } + } + + function handleTouchEnd(e) { + e.preventDefault(); + + if (editState.isDrawing) { + editState.isDrawing = false; + editState.lastPaintPos = null; + saveEditState(); + } + + if (e.touches.length === 0) { + editState.lastTouchDistance = 0; + } + } + } + + function setupKeyboardShortcuts() { + document.addEventListener('keydown', (e) => { + // Only handle shortcuts when edit panel is visible + const editOverlay = document.getElementById('editOverlay'); + if (!editOverlay || editOverlay.style.display === 'none') return; + + // Prevent default for handled keys + const handledKeys = ['b', 'e', 'i', 'f', 'g', 'z', '[', ']']; + if (handledKeys.includes(e.key.toLowerCase()) || (e.ctrlKey && e.key.toLowerCase() === 'z')) { + e.preventDefault(); + } + + switch (e.key.toLowerCase()) { + case 'b': // Brush + selectTool('paint'); + break; + case 'e': // Erase + selectTool('erase'); + break; + case 'i': // Eyedropper + selectTool('eyedropper'); + break; + case 'f': // Fill + selectTool('fill'); + break; + case 'g': // Grid + const showGrid = document.getElementById('showGrid'); + if (showGrid) showGrid.click(); + break; + case 'z': + if (e.ctrlKey || e.metaKey) { + if (e.shiftKey) { + redoEdit(); + } else { + undoEdit(); + } + } + break; + case '=': + case '+': + if (e.ctrlKey || e.metaKey) { + zoomIn(); + } + break; + case '-': + if (e.ctrlKey || e.metaKey) { + zoomOut(); + } + break; + case '0': + if (e.ctrlKey || e.metaKey) { + fitToWindow(); + } + break; + case '1': + if (e.ctrlKey || e.metaKey) { + setZoom(1); + } + break; + case '[': // Decrease brush size + const brushSize = document.getElementById('brushSize'); + const currentSize = parseInt(brushSize.value); + if (currentSize > 1) { + brushSize.value = currentSize - 1; + document.getElementById('brushSizeValue').textContent = currentSize - 1; + updateBrushSize(currentSize - 1); + } + break; + case ']': // Increase brush size + const brushSize2 = document.getElementById('brushSize'); + const currentSize2 = parseInt(brushSize2.value); + if (currentSize2 < 20) { + brushSize2.value = currentSize2 + 1; + document.getElementById('brushSizeValue').textContent = currentSize2 + 1; + updateBrushSize(currentSize2 + 1); + } + break; + } + }); + } + + function applyEditChanges() { + try { + const editCanvas = document.getElementById('editCanvas'); + if (!editCanvas) { + throw new Error('Edit canvas not found'); + } + + // Find the resize canvas in the resize panel + const resizeCanvas = document.getElementById('resizeCanvas'); + if (!resizeCanvas) { + throw new Error('Resize canvas not found'); + } + + const baseCtx = resizeCanvas.getContext('2d'); + if (!baseCtx) { + throw new Error('Resize canvas context not available'); + } + + // Make sure the resize canvas has the same dimensions as the edit canvas + if (resizeCanvas.width !== editCanvas.width || resizeCanvas.height !== editCanvas.height) { + resizeCanvas.width = editCanvas.width; + resizeCanvas.height = editCanvas.height; + } + + // Clear resize canvas + baseCtx.clearRect(0, 0, resizeCanvas.width, resizeCanvas.height); + + // Copy edited image to resize canvas (no checkerboard since we removed it entirely) + baseCtx.imageSmoothingEnabled = false; + baseCtx.drawImage(editCanvas, 0, 0); + + // CRITICAL: Completely replace the template system with edited artwork + const editedImageData = editCanvas.toDataURL(); + + // Create new processor with edited image as the template + if (window.WPlaceImageProcessor) { + const newProcessor = new window.WPlaceImageProcessor(editedImageData); + newProcessor.load().then(() => { + // Get the processed pixel data from the edited canvas + const editCtx = editCanvas.getContext('2d'); + const editImageData = editCtx.getImageData(0, 0, editCanvas.width, editCanvas.height); + const pixels = editImageData.data; + + // Count valid pixels in the edited image + let totalValidPixels = 0; + for (let i = 0; i < pixels.length; i += 4) { + const a = pixels[i + 3]; + const r = pixels[i]; + const g = pixels[i + 1]; + const b = pixels[i + 2]; + + const isTransparent = !state.paintTransparentPixels && a < state.customTransparencyThreshold; + const isWhiteAndSkipped = !state.paintWhitePixels && Utils.isWhitePixel(r, g, b); + + if (!isTransparent && !isWhiteAndSkipped) { + totalValidPixels++; + } + } + + // COMPLETELY REBUILD state.imageData with the edited artwork + state.imageData = { + width: editCanvas.width, + height: editCanvas.height, + pixels: pixels, + totalPixels: totalValidPixels, + processor: newProcessor, + }; + + // CRITICAL: Update state.originalImage so resize panel uses edited artwork as base template + state.originalImage = { + dataUrl: editedImageData, + width: editCanvas.width, + height: editCanvas.height + }; + + // Update state with new totals + state.totalPixels = totalValidPixels; + state.paintedPixels = 0; // Reset progress since this is a new template + state.currentPaintingColor = null; // Reset color tracking + state.imageLoaded = true; + + // Update local processors + if (typeof processor !== 'undefined') { + processor = newProcessor; + console.log('🔄 Updated local processor with edited artwork'); + } + if (typeof baseProcessor !== 'undefined') { + baseProcessor = newProcessor; + console.log('🔄 Updated baseProcessor with edited artwork'); + } + + // Force regeneration of overlays by clearing cached mask data + if (typeof window._maskImageData !== 'undefined') { + delete window._maskImageData; + } + + // Update UI to reflect the new template + if (typeof updateUI === 'function') { + updateUI(); + } + + // Show loading and properly reload resize panel with new template + Utils.showAlert('Updating template... Please wait.', 'info'); + + // Give more time for template to fully update and force resize panel reload + setTimeout(() => { + // Hide edit overlay first + document.getElementById('editOverlay').style.display = 'none'; + + // Completely reload resize dialog with updated processor + setTimeout(() => { + // Clean up existing dialog + if (typeof _resizeDialogCleanup === 'function') { + _resizeDialogCleanup(); + } + + // Force complete reload of resize dialog with new processor + setTimeout(() => { + showResizeDialog(newProcessor); + + console.log('✅ Template COMPLETELY replaced with edited artwork'); + console.log(`📊 New template stats: ${editCanvas.width}x${editCanvas.height}, ${totalValidPixels} pixels`); + Utils.showAlert('Template successfully replaced with your edited artwork!', 'success'); + }, 100); + }, 300); + }, 100); + }).catch((error) => { + console.error('Failed to load new processor:', error); + Utils.showAlert('Failed to update template. Please try again.', 'error'); + }); + } else { + console.error('WPlaceImageProcessor not available'); + Utils.showAlert('Image processor not available. Please reload the page.', 'error'); + } + + console.log('✅ Edit changes applied - template replacement in progress'); + } catch (error) { + console.error('Error applying edit changes:', error); + Utils.showAlert('Failed to apply changes. Please try again.', 'error'); + } + } + + if (uploadBtn) { + uploadBtn.addEventListener('click', async () => { + // Auto-open color palette if not already open + Utils.openColorPalette(); + + const availableColors = Utils.extractAvailableColors(); + if (availableColors === null || availableColors.length < 10) { + updateUI('noColorsFound', 'error'); + Utils.showAlert(Utils.t('noColorsFound'), 'error'); + return; + } + + if (!state.colorsChecked) { + state.availableColors = availableColors; + state.colorsChecked = true; + updateUI('colorsFound', 'success', { count: availableColors.length }); + await updateStats(); + selectPosBtn.disabled = false; + // Only enable resize button if image is also loaded + if (state.imageLoaded) { + resizeBtn.disabled = false; + } + } + + try { + updateUI('loadingImage', 'default'); + const imageSrc = await Utils.createImageUploader(); + if (!imageSrc) { + updateUI('colorsFound', 'success', { + count: state.availableColors.length, + }); + return; + } + + const processor = new ImageProcessor(imageSrc); + await processor.load(); + + const { width, height } = processor.getDimensions(); + const pixels = processor.getPixelData(); + + let totalValidPixels = 0; + for (let i = 0; i < pixels.length; i += 4) { + const isTransparent = + !state.paintTransparentPixels && + pixels[i + 3] < (state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD); + const isWhiteAndSkipped = + !state.paintWhitePixels && + Utils.isWhitePixel(pixels[i], pixels[i + 1], pixels[i + 2]); + if (!isTransparent && !isWhiteAndSkipped) { + totalValidPixels++; + } + } + + state.imageData = { + width, + height, + pixels, + totalPixels: totalValidPixels, + processor, + }; + + state.totalPixels = totalValidPixels; + state.paintedPixels = 0; + state.currentPaintingColor = null; // Reset color tracking + state.imageLoaded = true; + state.imageProcessed = false; // New upload - not processed yet + + // Reset session-specific flags when a new image is loaded + state.preFilteringDone = false; + state.progressResetDone = false; + console.log('🔄 Reset session flags for new image load'); + + // Keep existing lastPosition to continue from where we left off + // state.lastPosition = { x: 0, y: 0 }; // REMOVED: Don't reset position + + // Initialize painted map for tracking + Utils.initializePaintedMap(width, height); + + // New image: clear previous resize settings + state.resizeSettings = null; + // Also clear any previous ignore mask + state.resizeIgnoreMask = null; + // Save original image for this browser (dataUrl + dims) + state.originalImage = { dataUrl: imageSrc, width, height }; + saveBotSettings(); + + // ⚠️ Use the ORIGINAL image for the overlay initially (will be replaced after processing) + const imageBitmap = await createImageBitmap(processor.img); + await overlayManager.setImage(imageBitmap); + overlayManager.enable(); + toggleOverlayBtn.disabled = false; + toggleOverlayBtn.classList.add('active'); + toggleOverlayBtn.setAttribute('aria-pressed', 'true'); + + // Only enable resize button if colors have also been captured + if (state.colorsChecked) { + resizeBtn.disabled = false; + } + saveBtn.disabled = false; + + // ⚠️ IMPORTANT: Disable position selection until image is processed + selectPosBtn.disabled = true; + selectPosBtn.title = Utils.t('imageNeedsProcessing'); + + // Disable start button since position can't be set yet + if (state.startPosition) { + startBtn.disabled = true; // Disable even if position was set before + } + + await updateStats(); + updateDataButtons(); + + // Show warning alert to process image first + Utils.showAlert(Utils.t('processImageFirst'), 'warning'); + updateUI('imageLoaded', 'success', { count: totalValidPixels }); + } catch { + updateUI('imageError', 'error'); + } + }); + } + + // Load Extracted button event listener - for loading Art-Extractor JSON files + const loadExtractedBtn = document.getElementById('loadExtractedBtn'); + if (loadExtractedBtn) { + loadExtractedBtn.addEventListener('click', async () => { + try { + // Auto-open color palette if not already open + Utils.openColorPalette(); + + updateUI('loadingImage', 'default'); + const fileData = await Utils.loadExtractedFileData(); + + if (!fileData) { + updateUI('ready', 'default'); + return; + } + + console.log('📁 Loading extracted artwork from Art-Extractor...'); + console.log('🔍 [DEBUG] Loaded file data structure:', { + hasState: !!fileData.state, + hasImageData: !!fileData.imageData, + topLevelKeys: Object.keys(fileData), + stateKeys: fileData.state ? Object.keys(fileData.state) : 'N/A', + imageDataKeys: fileData.imageData ? Object.keys(fileData.imageData) : 'N/A', + fileDataType: typeof fileData, + stateType: typeof fileData.state, + imageDataType: typeof fileData.imageData + }); + + // Validate the data structure before restoring + if (!fileData || typeof fileData !== 'object') { + throw new Error('Invalid file format: File data is not a valid object'); + } + + if (!fileData.state || typeof fileData.state !== 'object') { + console.error('❌ State validation failed. FileData:', fileData); + throw new Error('Invalid file format: Missing or invalid state object. Please ensure you exported from Art-Extractor correctly.'); + } + + if (!fileData.imageData || typeof fileData.imageData !== 'object') { + console.error('❌ ImageData validation failed. FileData:', fileData); + throw new Error('Invalid file format: Missing or invalid imageData object. Please ensure you completed the area scan in Art-Extractor.'); + } + + if (!fileData.imageData.pixels || !Array.isArray(fileData.imageData.pixels) || fileData.imageData.pixels.length === 0) { + console.error('❌ Pixel data validation failed. ImageData:', fileData.imageData); + throw new Error('Invalid file format: No pixel data found. Please scan an area in Art-Extractor before exporting.'); + } + + // Ensure critical fields are present for Art-Extractor compatibility + if (!fileData.state.availableColors) { + console.warn('⚠️ No availableColors in file, using defaults'); + fileData.state.availableColors = []; + } + + // Reset session-specific flags when loading extracted file data + state.preFilteringDone = false; + state.progressResetDone = false; + console.log('🔄 Reset session flags for extracted file load'); + + // Use the existing restoreProgress function but with special handling + const restoreSuccess = await Utils.restoreProgress(fileData); + + if (!restoreSuccess) { + throw new Error('Failed to restore progress data'); + } + + // After loading, we need to enter position selection mode like when uploading images + if (state.imageLoaded) { + console.log('🎯 Extracted artwork loaded, entering position selection mode...'); + + // Clear position data since Art-Extractor exports may have null positions for manual placement + state.startPosition = null; + state.region = null; + state.selectingPosition = true; + + // For extracted files, force enable all necessary flags for full functionality + state.colorsChecked = true; + state.currentPaintingColor = null; // Reset color tracking + state.imageLoaded = true; + + // Ensure image processor is available for extracted files + if (state.imageData && !state.imageData.processor) { + try { + // Create a temporary canvas to generate a data URL for the processor + const canvas = document.createElement('canvas'); + canvas.width = state.imageData.width; + canvas.height = state.imageData.height; + const ctx = canvas.getContext('2d'); + + // Create image data from pixels + const imageData = new ImageData( + new Uint8ClampedArray(state.imageData.pixels), + state.imageData.width, + state.imageData.height + ); + ctx.putImageData(imageData, 0, 0); + + // Create processor with canvas data URL using the correct class + const dataUrl = canvas.toDataURL(); + state.imageData.processor = new window.WPlaceImageProcessor(dataUrl); + + // CRITICAL: Load the processor before using it + await state.imageData.processor.load(); + console.log('🔧 Created and loaded WPlaceImageProcessor for extracted artwork'); + } catch (error) { + console.error('❌ Failed to create image processor for extracted artwork:', error); + // Fallback: use global processor if available + if (window.globalImageProcessor) { + console.log('🔄 Using global image processor as fallback'); + state.imageData.processor = window.globalImageProcessor; + } + } + } + + console.log('🎨 Force-enabled all flags for extracted JSON to access resize panel'); + + // For extracted images, ensure overlay is enabled but don't set position yet + try { + if (overlayManager && state.imageData) { + console.log('🖼️ Creating overlay from loaded pixel data:', { + width: state.imageData.width, + height: state.imageData.height, + pixelCount: state.imageData.pixels?.length, + firstPixels: state.imageData.pixels?.slice(0, 12), // First 3 pixels (RGBA) + isUint8ClampedArray: state.imageData.pixels instanceof Uint8ClampedArray, + isArray: Array.isArray(state.imageData.pixels) + }); + + // Create image bitmap from the restored image data + const canvas = new OffscreenCanvas(state.imageData.width, state.imageData.height); + const ctx = canvas.getContext('2d'); + const imageData = new ImageData( + new Uint8ClampedArray(state.imageData.pixels), + state.imageData.width, + state.imageData.height + ); + ctx.putImageData(imageData, 0, 0); + const imageBitmap = await canvas.transferToImageBitmap(); + + await overlayManager.setImage(imageBitmap); + overlayManager.enable(); + console.log('✅ Overlay enabled for extracted artwork - should show PROCESSED pixels'); + + // ✅ Loaded files already contain processed pixels - no need to reprocess + // Mark as processed since the overlay is showing the correct processed data + state.imageProcessed = true; + + // Enable position selection immediately + selectPosBtn.disabled = false; + selectPosBtn.title = Utils.t('selectPosition') || 'Select starting position on canvas'; + + // Update data buttons (Save/Load/SaveToFile/LoadFromFile) after loading extracted artwork + updateDataButtons(); + } + } catch (overlayError) { + console.warn('⚠️ Could not set overlay for extracted artwork:', overlayError); + } + + // For extracted images, don't try to set overlay position until user selects one + // The overlay should already be enabled from the restoreProgress function + + // Update UI with custom message for extracted artwork + Utils.showAlert('🎨 Extracted artwork loaded! Please click on the canvas to select where to place it.', 'info'); + updateUI('ready', 'default'); // Use 'ready' instead of 'waitingPosition' to avoid translation issues + + // Enable relevant buttons + selectPosBtn.disabled = false; + // Always enable resize button for extracted files since they have image processor + resizeBtn.disabled = false; + console.log('🔧 Resize button enabled for extracted artwork'); + + // Enable move artwork button (will be fully enabled after position is set) + const moveArtworkBtn = document.getElementById('moveArtworkBtn'); + if (moveArtworkBtn) { + moveArtworkBtn.disabled = false; + } + + // Set up position selection like the regular selectPosBtn + const tempFetch = async (url, options) => { + if ( + typeof url === 'string' && + url.includes('/s0/pixel/') && + options && + options.method === 'POST' + ) { + let coords; + try { + const body = JSON.parse(options.body); + coords = body.coords; + } catch (e) { + return window.originalFetch(url, options); + } + + const tileMatches = url.match(/\/s0\/pixel\/(\-?\d+)\/(\-?\d+)/); + if (tileMatches && coords && coords.length >= 2) { + const tileX = parseInt(tileMatches[1]); + const tileY = parseInt(tileMatches[2]); + const pixelX = coords[0]; + const pixelY = coords[1]; + + state.startPosition = { x: pixelX, y: pixelY }; + state.region = { x: tileX, y: tileY }; + state.selectingPosition = false; + + console.log('🎯 Position selected for extracted artwork:', { + startPosition: state.startPosition, + region: state.region + }); + + // Restore original fetch + window.fetch = window.originalFetch; + + // Update overlay position with validation + try { + if (state.startPosition && state.region && overlayManager) { + await overlayManager.setPosition(state.startPosition, state.region); + console.log('✅ Overlay position updated successfully'); + } else { + console.warn('⚠️ Cannot set overlay position: missing startPosition or region'); + } + } catch (positionError) { + console.error('❌ Failed to set overlay position:', positionError); + } + + startBtn.disabled = false; + selectPosBtn.textContent = Utils.t('selectPosition'); + + // Enable Move Artwork button when position is set + const moveArtworkBtn = document.getElementById('moveArtworkBtn'); + if (moveArtworkBtn) { + moveArtworkBtn.disabled = false; + } + + updateUI('ready', 'success'); + Utils.showAlert('Position selected! Ready to start painting.', 'success'); + } + } + return window.originalFetch(url, options); + }; + + // Store original fetch and replace with position capture + if (!window.originalFetch) { + window.originalFetch = window.fetch; + } + window.fetch = tempFetch; + } + + } catch (error) { + console.error('❌ Failed to load extracted artwork:', error); + Utils.showAlert(`Failed to load extracted artwork: ${error.message}`, 'error'); + updateUI('ready', 'default'); + } + }); + } + + if (resizeBtn) { + resizeBtn.addEventListener('click', () => { + console.log('🔍 [DEBUG] Resize button clicked. State check:', { + imageLoaded: state.imageLoaded, + hasProcessor: !!(state.imageData && state.imageData.processor), + colorsChecked: state.colorsChecked, + hasAvailableColors: !!(state.availableColors && state.availableColors.length > 0) + }); + + if (state.imageLoaded && state.imageData && state.imageData.processor) { + showResizeDialog(state.imageData.processor); + } else { + let message = 'Please upload an image and check colors first.'; + if (!state.imageLoaded) message = 'Please upload an image first.'; + else if (!state.imageData || !state.imageData.processor) message = 'Image processor not available. Please reload the image.'; + Utils.showAlert(message, 'warning'); + } + }); + } + + // Move Artwork button event listener + const moveArtworkBtn = document.getElementById('moveArtworkBtn'); + if (moveArtworkBtn) { + moveArtworkBtn.addEventListener('click', () => { + if (state.imageLoaded && (state.startPosition || state.selectingPosition)) { + showMoveArtworkPanel(); + } else if (!state.imageLoaded) { + Utils.showAlert('Please upload or load an image first', 'warning'); + } else { + Utils.showAlert('Please select a position for the artwork first', 'warning'); + } + }); + } + + if (selectPosBtn) { + selectPosBtn.addEventListener('click', async () => { + if (state.selectingPosition) return; + + state.selectingPosition = true; + state.startPosition = null; + state.region = null; + startBtn.disabled = true; + + // Disable Move Artwork button when selecting new position + const moveArtworkBtn = document.getElementById('moveArtworkBtn'); + if (moveArtworkBtn) { + moveArtworkBtn.disabled = true; + } + + Utils.showAlert(Utils.t('selectPositionAlert'), 'info'); + updateUI('waitingPosition', 'default'); + + const tempFetch = async (url, options) => { + if ( + typeof url === 'string' && + url.includes('https://backend.wplace.live/s0/pixel/') && + options?.method?.toUpperCase() === 'POST' + ) { + try { + const response = await originalFetch(url, options); + const clonedResponse = response.clone(); + const data = await clonedResponse.json(); + + if (data?.painted === 1) { + const regionMatch = url.match(/\/pixel\/(\d+)\/(\d+)/); + if (regionMatch && regionMatch.length >= 3) { + state.region = { + x: Number.parseInt(regionMatch[1]), + y: Number.parseInt(regionMatch[2]), + }; + } + + const payload = JSON.parse(options.body); + if (payload?.coords && Array.isArray(payload.coords)) { + state.startPosition = { + x: payload.coords[0], + y: payload.coords[1], + }; + // Keep existing lastPosition to continue from where we left off + // state.lastPosition = { x: 0, y: 0 }; // REMOVED: Don't reset position + + // Update overlay position with validation + try { + if (state.startPosition && state.region && overlayManager) { + await overlayManager.setPosition(state.startPosition, state.region); + console.log('✅ Regular overlay position updated successfully'); + } else { + console.warn('⚠️ Cannot set regular overlay position: missing startPosition or region'); + } + } catch (positionError) { + console.error('❌ Failed to set regular overlay position:', positionError); + } + + if (state.imageLoaded) { + startBtn.disabled = false; + + // Enable Move Artwork button when position is set + const moveArtworkBtn = document.getElementById('moveArtworkBtn'); + if (moveArtworkBtn) { + moveArtworkBtn.disabled = false; + } + } + + window.fetch = originalFetch; + state.selectingPosition = false; + updateUI('positionSet', 'success'); + } + } + + return response; + } catch { + return originalFetch(url, options); + } + } + return originalFetch(url, options); + }; + + const originalFetch = window.fetch; + window.fetch = tempFetch; + + setTimeout(() => { + if (state.selectingPosition) { + window.fetch = originalFetch; + state.selectingPosition = false; + updateUI('positionTimeout', 'error'); + Utils.showAlert(Utils.t('positionTimeout'), 'error'); + } + }, 120000); + }); + } + + async function startPainting() { + if (!state.imageLoaded || !state.startPosition || !state.region) { + updateUI('missingRequirements', 'error'); + return; + } + await ensureToken(); + if (!getTurnstileToken()) return; + + // Only perform progressive pixel detection on first start of session + if (!state.preFilteringDone) { + // Perform progressive pixel detection from top-left to bottom-right + console.log('🔍 Starting progressive pixel detection from top-left to bottom-right...'); + await performProgressivePixelDetection(); + + // Mark pre-filtering as done to prevent duplicate scanning + state.preFilteringDone = true; + console.log('✅ Pre-filtering marked as complete - will not scan again this session'); + } else { + console.log('🔄 Continuing session - pre-filtering already done'); + } + + state.running = true; + state.stopFlag = false; + startBtn.disabled = true; + stopBtn.disabled = false; + uploadBtn.disabled = true; + selectPosBtn.disabled = true; + resizeBtn.disabled = true; + saveBtn.disabled = true; + toggleOverlayBtn.disabled = true; + + updateUI('startPaintingMsg', 'success'); + + try { + await getAccounts(); + await processImage(); + } catch (e) { + console.error('Unexpected error:', e); + updateUI('paintingError', 'error'); + } finally { + state.running = false; + stopBtn.disabled = true; + saveBtn.disabled = false; + + if (state.stopFlag) { + startBtn.disabled = false; + } else { + startBtn.disabled = true; + uploadBtn.disabled = false; + const loadExtractedBtn = document.getElementById('loadExtractedBtn'); + if (loadExtractedBtn) loadExtractedBtn.disabled = false; + selectPosBtn.disabled = false; + resizeBtn.disabled = false; + } + toggleOverlayBtn.disabled = false; + } + } + + // Helper function to update start button state + function updateStartButtonState() { + if (!startBtn) return; + + if (state.paintingMode === 'assist') { + startBtn.disabled = true; + startBtn.title = 'Start button is disabled in Assist mode. Manually place pixels with overlay guidance.'; + } else { + startBtn.disabled = !state.imageLoaded || state.running || !state.startPosition; + startBtn.title = ''; + } + } + + if (startBtn) { + startBtn.addEventListener('click', startPainting); + } + + // Painting Mode Toggle + const paintingModeToggle = container.querySelector('#paintingModeToggle'); + if (paintingModeToggle) { + // Initialize toggle state - MUST be unchecked for auto mode (default) + paintingModeToggle.checked = state.paintingMode === 'assist'; + console.log(`🎨 [Painting Mode] Initial state: ${state.paintingMode}, Toggle checked: ${paintingModeToggle.checked}`); + + paintingModeToggle.addEventListener('change', () => { + state.paintingMode = paintingModeToggle.checked ? 'assist' : 'auto'; + + // Update start button state + updateStartButtonState(); + + // NOTE: We don't save paintingMode - it always resets to 'auto' on page load + + // Show notification + const modeName = state.paintingMode === 'assist' ? 'Assist' : 'Auto'; + const modeDesc = state.paintingMode === 'assist' + ? 'Overlay will guide your manual pixel placement' + : 'Bot will automatically paint pixels'; + Utils.showAlert(`Painting Mode: ${modeName}\n${modeDesc}`, 'info'); + + console.log(`🎨 [Painting Mode] Switched to ${modeName.toUpperCase()} mode`); + }); + + // Initial state update + updateStartButtonState(); + } + + if (stopBtn) { + stopBtn.addEventListener('click', () => { + state.stopFlag = true; + state.running = false; + stopBtn.disabled = true; + updateUI('paintingStoppedByUser', 'warning'); + + if (state.imageLoaded && state.paintedPixels > 0) { + Utils.saveProgress(); + Utils.showAlert(Utils.t('autoSaved'), 'success'); + } + }); + } + + const checkSavedProgress = () => { + const savedData = Utils.loadProgress(); + if (savedData && savedData.state.paintedPixels > 0) { + const savedDate = new Date(savedData.timestamp).toLocaleString(); + const progress = Math.round( + (savedData.state.paintedPixels / savedData.state.totalPixels) * 100 + ); + + Utils.showAlert( + `${Utils.t('savedDataFound')}\n\n` + + `Saved: ${savedDate}\n` + + `Progress: ${savedData.state.paintedPixels}/${savedData.state.totalPixels} pixels (${progress}%)\n` + + `${Utils.t('clickLoadToContinue')}`, + 'info' + ); + } + }; + + setTimeout(checkSavedProgress, 1000); + + if (cooldownSlider && cooldownInput && cooldownValue && cooldownDecrease && cooldownIncrease) { + const updateCooldown = (newValue) => { + const threshold = Math.max(1, Math.min(state.maxCharges || 999, parseInt(newValue))); + state.cooldownChargeThreshold = threshold; + + // Update both controls (value shows in input, label shows unit only) + cooldownSlider.value = threshold; + cooldownInput.value = threshold; + cooldownValue.textContent = `${Utils.t('charges')}`; + + saveBotSettings(); + NotificationManager.resetEdgeTracking(); // prevent spurious notify after threshold change + }; + + // Slider event listener + cooldownSlider.addEventListener('input', (e) => { + updateCooldown(e.target.value); + }); + + // Number input event listener + cooldownInput.addEventListener('input', (e) => { + updateCooldown(e.target.value); + }); + + // Decrease button + cooldownDecrease.addEventListener('click', () => { + updateCooldown(parseInt(cooldownInput.value) - 1); + }); + + // Increase button + cooldownIncrease.addEventListener('click', () => { + updateCooldown(parseInt(cooldownInput.value) + 1); + }); + + // Add scroll-to-adjust for cooldown slider + Utils.createScrollToAdjust(cooldownSlider, updateCooldown, 1, state.maxCharges, 1); + + // Skip cooldown button event handler + const skipCooldownBtn = document.getElementById('skipCooldownBtn'); + if (skipCooldownBtn) { + skipCooldownBtn.addEventListener('click', () => { + if (state.preciseCurrentCharges < state.cooldownChargeThreshold) { + console.log(`[Auto-Image] Skip cooldown requested - resetting to account index 0`); + + // Reset to account index 0 (start new cycle) + state.currentActiveIndex = 0; + console.log(`🔄 Reset currentActiveIndex to 0 for new cycle`); + + // Reset charges to threshold to bypass cooldown + state.preciseCurrentCharges = state.cooldownChargeThreshold; + console.log(`[Auto-Image] Cooldown skipped! Charges set to threshold: ${state.cooldownChargeThreshold}`); + + // Switch to first account if we have multiple accounts + if (accountManager.getAccountCount() > 1) { + const firstAccountInfo = accountManager.getAccountByIndex(0); + if (firstAccountInfo && firstAccountInfo.token) { + console.log(`🔄 Switching to first account: index 0 (${firstAccountInfo.displayName})`); + // Get accounts array for the switch + const accounts = JSON.parse(localStorage.getItem("accounts")) || []; + if (accounts.length > 0) { + switchToSpecificAccount(firstAccountInfo.token, firstAccountInfo.displayName).then(() => { + console.log(`✅ Successfully switched to account index 0 after cooldown skip`); + // Update UI immediately + updateChargesThresholdUI(0); + // Trigger immediate check for painting + if (state.isEnabled && !state.stopFlag) { + setTimeout(() => { + checkAndPaint(); + }, 100); + } + }).catch(err => { + console.error(`❌ Failed to switch to account index 0:`, err); + }); + } else { + console.warn(`⚠️ No accounts available for switching`); + } + } else { + console.warn(`⚠️ First account info not found or missing token`); + } + } else { + console.log(`📝 Single account mode - no switching needed`); + // Update UI immediately + updateChargesThresholdUI(0); + // Trigger immediate check for painting + if (state.isEnabled && !state.stopFlag) { + setTimeout(() => { + checkAndPaint(); + }, 100); + } + } + } + }); + } + } + + loadBotSettings(); + // Ensure notification poller reflects current settings + NotificationManager.syncFromState(); + + // Sync painting mode toggle with loaded state + if (paintingModeToggle) { + paintingModeToggle.checked = state.paintingMode === 'assist'; + updateStartButtonState(); + console.log(`🔄 [Painting Mode] Synced after load: ${state.paintingMode}, Toggle checked: ${paintingModeToggle.checked}`); + } + } + + function getMsToTargetCharges(current, target, cooldown, intervalMs = 0) { + const remainingCharges = target - current; + return Math.max(0, remainingCharges * cooldown - intervalMs); + } + + function updateChargesThresholdUI(intervalMs) { + if (state.stopFlag) return; + + const threshold = state.cooldownChargeThreshold; + const remainingMs = getMsToTargetCharges( + state.preciseCurrentCharges, + threshold, + state.cooldown, + intervalMs + ); + const timeText = Utils.msToTimeText(remainingMs); + + updateUI( + 'noChargesThreshold', + 'warning', + { + threshold, + current: state.displayCharges, + time: timeText, + }, + true + ); + + // Update skip cooldown button state + const skipCooldownBtn = document.getElementById('skipCooldownBtn'); + if (skipCooldownBtn) { + const isInCooldown = state.preciseCurrentCharges < threshold && remainingMs > 0; + skipCooldownBtn.disabled = !isInCooldown; + skipCooldownBtn.title = isInCooldown + ? `Skip cooldown (${timeText} remaining)` + : 'Skip cooldown (only available during cooldown)'; + } + } + + // Fast tile-based pixel detection from top-left to bottom-right + async function performProgressivePixelDetection() { + if (!state.imageLoaded || !state.imageData) { + console.log('⚠️ No image loaded, skipping pixel detection'); + return; + } + + const startTime = performance.now(); + const { width, height } = state.imageData; + const startX = state.startPosition.x; + const startY = state.startPosition.y; + const regionX = state.region.x; + const regionY = state.region.y; + + let detectedPixels = 0; + let totalChecked = 0; + + console.log(`🚀 Fast scanning ${width}x${height} image from top-left (0,0) to bottom-right (${width - 1},${height - 1})...`); + + updateUI('pixelDetection', 'info', { message: 'Fast detecting already painted pixels...' }); + + // Calculate affected tiles + const worldX1 = startX; + const worldY1 = startY; + const worldX2 = startX + width - 1; + const worldY2 = startY + height - 1; + + const startTileX = Math.floor(worldX1 / 1000); + const startTileY = Math.floor(worldY1 / 1000); + const endTileX = Math.floor(worldX2 / 1000); + const endTileY = Math.floor(worldY2 / 1000); + + console.log(`📄 Processing tiles from (${startTileX},${startTileY}) to (${endTileX},${endTileY})`); + + // Cache for downloaded tile data + const tileDataCache = new Map(); + + // Download and cache all required tiles in parallel + const tilePromises = []; + for (let tileY = startTileY; tileY <= endTileY; tileY++) { + for (let tileX = startTileX; tileX <= endTileX; tileX++) { + const absoluteTileX = regionX + tileX; + const absoluteTileY = regionY + tileY; + const tileKey = `${absoluteTileX},${absoluteTileY}`; + + tilePromises.push( + downloadTileImageData(absoluteTileX, absoluteTileY).then(imageData => { + if (imageData) { + tileDataCache.set(tileKey, imageData); + } + }).catch(e => { + console.warn(`⚠️ Failed to download tile ${absoluteTileX},${absoluteTileY}:`, e.message); + }) + ); + } + } + + // Wait for all tiles to download + await Promise.all(tilePromises); + console.log(`📦 Downloaded ${tileDataCache.size} tiles for fast pixel checking`); + + // Fast pixel detection using cached tile data + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + totalChecked++; + + // Check if pixel is eligible for painting + const targetPixelInfo = checkPixelEligibility(x, y); + if (!targetPixelInfo.eligible) { + continue; // Skip non-eligible pixels + } + + // Calculate absolute world coordinates + const absX = startX + x; + const absY = startY + y; + const adderX = Math.floor(absX / 1000); + const adderY = Math.floor(absY / 1000); + const pixelX = absX % 1000; + const pixelY = absY % 1000; + const absoluteTileX = regionX + adderX; + const absoluteTileY = regionY + adderY; + + // Check if already marked as painted in local map + if (Utils.isPixelPainted(x, y, absoluteTileX, absoluteTileY)) { + detectedPixels++; + continue; + } + + // Fast pixel color check using cached tile data + const tileKey = `${absoluteTileX},${absoluteTileY}`; + const tileImageData = tileDataCache.get(tileKey); + + if (tileImageData) { + try { + // Direct array access - much faster than canvas operations + const tileWidth = tileImageData.width; + const tileHeight = tileImageData.height; + const data = tileImageData.data; + + // Ensure pixel coordinates are within tile bounds + if (pixelX >= 0 && pixelX < tileWidth && pixelY >= 0 && pixelY < tileHeight) { + const pixelIndex = (pixelY * tileWidth + pixelX) * 4; + const r = data[pixelIndex]; + const g = data[pixelIndex + 1]; + const b = data[pixelIndex + 2]; + const a = data[pixelIndex + 3]; + + // Check alpha threshold + const alphaThresh = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; + if (a >= alphaThresh) { + const existingMappedColor = Utils.resolveColor( + [r, g, b], + state.availableColors, + !state.paintUnavailablePixels + ); + const isAlreadyPainted = existingMappedColor.id === targetPixelInfo.mappedColorId; + + if (isAlreadyPainted) { + // Check if pixel is already marked as painted to avoid double counting + if (!Utils.isPixelPainted(x, y, absoluteTileX, absoluteTileY)) { + // Mark as painted in the map but DO NOT increment progress counter + // Progress counter should only reflect actual painting sequence position + Utils.markPixelPainted(x, y, absoluteTileX, absoluteTileY); + detectedPixels++; + } else { + // Pixel already tracked, just count it for detection stats + detectedPixels++; + } + } + } + } + } catch (e) { + // Skip pixels we can't check + console.warn(`⚠️ Could not check pixel (${x}, ${y}):`, e.message); + } + } + + // Update progress periodically + if (totalChecked % 2500 === 0) { + const progress = Math.round((totalChecked / (width * height)) * 100); + updateUI('pixelDetection', 'info', { + message: `Fast detecting... ${progress}% (Found: ${detectedPixels})` + }); + // Yield control briefly to prevent UI blocking + await new Promise(resolve => setTimeout(resolve, 0)); + } + } + } + + const processingTime = Math.round(performance.now() - startTime); + console.log(`🏁 Fast pixel detection complete in ${processingTime}ms:`); + console.log(` - Total pixels checked: ${totalChecked}`); + console.log(` - Already painted pixels found: ${detectedPixels}`); + console.log(` - Updated progress: ${state.paintedPixels}/${state.totalPixels}`); + console.log(` - Performance: ${Math.round(totalChecked / (processingTime / 1000))} pixels/second`); + + // Update progress display + await updateStats(); + updateUI('pixelDetectionComplete', 'success', { + message: `Found ${detectedPixels} already painted pixels in ${processingTime}ms` + }); + } + + // Fast tile download and ImageData extraction (similar to Art-Extractor approach) + async function downloadTileImageData(tileX, tileY) { + try { + const tileUrl = `https://backend.wplace.live/files/s0/tiles/${tileX}/${tileY}.png`; + const response = await fetch(tileUrl); + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const blob = await response.blob(); + return await processTileBlob(blob); + } catch (error) { + console.warn(`Failed to download tile ${tileX},${tileY}:`, error.message); + return null; + } + } + + // Process tile blob into ImageData (adapted from Art-Extractor) + async function processTileBlob(blob) { + try { + const img = new Image(); + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + + return new Promise((resolve, reject) => { + img.onload = () => { + canvas.width = img.width; + canvas.height = img.height; + ctx.imageSmoothingEnabled = false; + ctx.drawImage(img, 0, 0); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + resolve(imageData); + }; + img.onerror = () => reject(new Error('Failed to load image')); + img.src = URL.createObjectURL(blob); + }); + } catch (error) { + console.error('Error processing tile blob:', error); + return null; + } + } + + function generateCoordinates(width, height, mode, direction, snake, blockWidth, blockHeight, startFromX = 0, startFromY = 0) { + const coords = []; + console.log( + 'Generating coordinates with \n mode:', + mode, + '\n direction:', + direction, + '\n snake:', + snake, + '\n blockWidth:', + blockWidth, + '\n blockHeight:', + blockHeight, + '\n startFromX:', + startFromX, + '\n startFromY:', + startFromY + ); + // --------- Standard 4 corners traversal ---------- + let xStart, xEnd, xStep; + let yStart, yEnd, yStep; + switch (direction) { + case 'top-left': + xStart = 0; + xEnd = width; + xStep = 1; + yStart = 0; + yEnd = height; + yStep = 1; + break; + case 'top-right': + xStart = width - 1; + xEnd = -1; + xStep = -1; + yStart = 0; + yEnd = height; + yStep = 1; + break; + case 'bottom-left': + xStart = 0; + xEnd = width; + xStep = 1; + yStart = height - 1; + yEnd = -1; + yStep = -1; + break; + case 'bottom-right': + xStart = width - 1; + xEnd = -1; + xStep = -1; + yStart = height - 1; + yEnd = -1; + yStep = -1; + break; + default: + throw new Error(`Unknown direction: ${direction}`); + } + + // --------- Traversal modes ---------- + if (mode === 'rows') { + let rowIndex = 0; + for (let y = yStart; y !== yEnd; y += yStep) { + if (snake && rowIndex % 2 !== 0) { + for (let x = xEnd - xStep; x !== xStart - xStep; x -= xStep) { + coords.push([x, y]); + } + } else { + for (let x = xStart; x !== xEnd; x += xStep) { + coords.push([x, y]); + } + } + rowIndex++; + } + } else if (mode === 'columns') { + let colIndex = 0; + for (let x = xStart; x !== xEnd; x += xStep) { + if (snake && colIndex % 2 !== 0) { + for (let y = yEnd - yStep; y !== yStart - yStep; y -= yStep) { + coords.push([x, y]); + } + } else { + for (let y = yStart; y !== yEnd; y += yStep) { + coords.push([x, y]); + } + } + colIndex++; + } + } else if (mode === 'circle-out') { + const cx = Math.floor(width / 2); + const cy = Math.floor(height / 2); + const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); + + for (let r = 0; r <= maxRadius; r++) { + for (let y = cy - r; y <= cy + r; y++) { + for (let x = cx - r; x <= cx + r; x++) { + if (x >= 0 && x < width && y >= 0 && y < height) { + const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); + if (dist === r) coords.push([x, y]); + } + } + } + } + } else if (mode === 'circle-in') { + const cx = Math.floor(width / 2); + const cy = Math.floor(height / 2); + const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); + + for (let r = maxRadius; r >= 0; r--) { + for (let y = cy - r; y <= cy + r; y++) { + for (let x = cx - r; x <= cx + r; x++) { + if (x >= 0 && x < width && y >= 0 && y < height) { + const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); + if (dist === r) coords.push([x, y]); + } + } + } + } + } else if (mode === 'blocks' || mode === 'shuffle-blocks') { + const blocks = []; + for (let by = 0; by < height; by += blockHeight) { + for (let bx = 0; bx < width; bx += blockWidth) { + const block = []; + for (let y = by; y < Math.min(by + blockHeight, height); y++) { + for (let x = bx; x < Math.min(bx + blockWidth, width); x++) { + block.push([x, y]); + } + } + blocks.push(block); + } + } + + if (mode === 'shuffle-blocks') { + // Simple Fisher-Yates shuffle + for (let i = blocks.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [blocks[i], blocks[j]] = [blocks[j], blocks[i]]; + } + } + + // Append all blocks without spread/concat to avoid large allocations and argument explosion + for (const block of blocks) { + for (let i = 0; i < block.length; i++) { + coords.push(block[i]); + } + } + } else { + throw new Error(`Unknown mode: ${mode}`); + } + + // Filter coordinates to start from the specified position + if (startFromX > 0 || startFromY > 0) { + console.log(`🔄 Filtering coordinates to resume from position (${startFromX}, ${startFromY})`); + let startIndex = -1; + + // Find the starting position in the coordinate list + for (let i = 0; i < coords.length; i++) { + const [x, y] = coords[i]; + if (x === startFromX && y === startFromY) { + startIndex = i; + break; + } + } + + if (startIndex >= 0) { + // Resume from the found position (skip all previous coordinates) + const filteredCoords = coords.slice(startIndex); + console.log(`✂️ Resuming: skipped ${startIndex} coordinates, continuing with ${filteredCoords.length} remaining`); + return filteredCoords; + } else { + console.warn(`⚠️ Resume position (${startFromX}, ${startFromY}) not found in coordinate list, starting from beginning`); + } + } + + return coords; + } + + async function flushPixelBatch(pixelBatch) { + if (!pixelBatch || pixelBatch.pixels.length === 0) return true; + + const batchSize = pixelBatch.pixels.length; + console.log( + `📦 Sending batch with ${batchSize} pixels (region: ${pixelBatch.regionX},${pixelBatch.regionY})` + ); + const success = await sendBatchWithRetry( + pixelBatch.pixels, + pixelBatch.regionX, + pixelBatch.regionY + ); + if (success) { + // Only increment progress for actually painted pixels to prevent multiplication + const actuallyPaintedCount = pixelBatch.pixels.length; + state.paintedPixels += actuallyPaintedCount; + console.log(`📊 Added ${actuallyPaintedCount} painted pixels to progress (total: ${state.paintedPixels})`); + + pixelBatch.pixels.forEach((p) => { + Utils.markPixelPainted(p.x, p.y, pixelBatch.regionX, pixelBatch.regionY); + }); + + // Update last painted position to the last pixel in the successful batch + if (pixelBatch.pixels.length > 0) { + const lastPixel = pixelBatch.pixels[pixelBatch.pixels.length - 1]; + // FIXED: Use localX/localY (image-relative coordinates) instead of x/y (absolute canvas coordinates) + state.lastPaintedPosition = { x: lastPixel.localX, y: lastPixel.localY }; + } + + // Track painted pixels since last account switch to avoid flip-flop + state.paintedSinceSwitch = (state.paintedSinceSwitch || 0) + actuallyPaintedCount; + + // IMPORTANT: Decrement charges locally to match Acc-Switch.js behavior + state.displayCharges = Math.max(0, state.displayCharges - batchSize); + state.preciseCurrentCharges = Math.max(0, state.preciseCurrentCharges - batchSize); + // Also update the global local charge model per account with bonus logic + try { + const tok = accountManager.getCurrentAccount()?.token; + const after = ChargeModel.decrement(tok, batchSize); + state.displayCharges = Math.floor(after); + state.preciseCurrentCharges = after; + if (tok) accountManager.updateAccountData(tok, { Charges: state.displayCharges }); + } catch {} + + state.fullChargeData = { + ...state.fullChargeData, + spentSinceShot: state.fullChargeData.spentSinceShot + batchSize, + }; + await updateStats(); + // Update account list with new charges + await updateCurrentAccountInList(); + // Progress tracking removed from UI to reduce visual clutter + Utils.performSmartSave(); + + if (CONFIG.PAINTING_SPEED_ENABLED && state.paintingSpeed > 0 && batchSize > 0) { + const delayPerPixel = 1000 / state.paintingSpeed; + const totalDelay = Math.max(100, delayPerPixel * batchSize); + await Utils.sleep(totalDelay); + } + } else { + console.error(`❌ Batch failed permanently after retries. Stopping painting.`); + state.stopFlag = true; + updateUI('paintingBatchFailed', 'error'); + } + + pixelBatch.pixels = []; + return success; + } + + async function processImage() { + console.log('🚀 Starting auto-swap enabled painting workflow'); + + try { + // Main painting cycle - repeats until image complete or stopped + while (!state.stopFlag) { + console.log('📋 Phase 1: Starting painting session'); + const paintingResult = await executePaintingSession(); + + if (paintingResult === 'completed') { + console.log('🎉 Image painting completed!'); + state.currentPaintingColor = null; // Reset color tracking + break; + } + + if (paintingResult === 'stopped') { + console.log('⏹️ Painting stopped by user'); + break; + } + + if (paintingResult === 'charges_depleted') { + if (CONFIG.autoBuyToggle && CONFIG.autoBuy != 'none') { + console.log('Trying to buy more charges before swapping account...'); + const purchaseResult = await purchase(CONFIG.autoBuy); + if (purchaseResult == 2) { + console.log('✅ Purchase successful, continuing painting'); + await updateStats(); + await updateCurrentAccountInList(); + if (CONFIG.autoBuy == 'paint_charges') continue; + } + else if (purchaseResult == 1) { + console.log('😭 Not enough droplets to buy more charges, swapping account.'); + } + else { + console.log('🤔 Purchase failed.'); + } + } + else console.log('🤫 Auto buy is disabled, wait for cooldown or swapping account.'); + if (!CONFIG.autoSwap) { + // Original workflow: cooldown period + console.log('⏱️ Phase 2: Entering cooldown period (auto-swap disabled)'); + const cooldownResult = await executeCooldownPeriod(); + + if (cooldownResult === 'stopped') { + console.log('⏹️ Cooldown stopped by user'); + break; + } + + // Phase 3: Regenerate token for next painting session + console.log('🔑 Phase 3: Regenerating token for next session'); + const tokenResult = await regenerateTokenForNewSession(); + + if (!tokenResult) { + console.log('❌ Failed to regenerate token, stopping'); + state.stopFlag = true; + break; + } + } else { + // Auto-swap workflow: simplified logic + console.log('🔄 Auto-swap enabled: checking account switching options'); + + // Retrieve fresh accounts list each time to avoid stale data + const accounts = JSON.parse(localStorage.getItem("accounts")) || []; + console.log(`📊 Retrieved ${accounts.length} accounts from localStorage`); + + if (accounts.length <= 1) { + console.log('📋 Only one account available, using standard cooldown'); + const cooldownResult = await executeCooldownPeriod(); + if (cooldownResult === 'stopped') break; + + const tokenResult = await regenerateTokenForNewSession(); + if (!tokenResult) { + state.stopFlag = true; + break; + } + } else { + // Try to find an account with enough charges to continue painting + const minRequired = Math.max(1, state.cooldownChargeThreshold || 1); + console.log(`🔎 Searching for account with ≥${minRequired} charges...`); + const switched = await selectAndSwitchToAccountWithCharges(minRequired); + if (switched) { + console.log('✅ Switched to an account with sufficient charges, continuing painting immediately'); + continue; + } + // If none had enough charges, enter cooldown on the best available account + console.log('🕒 No accounts have enough charges. Entering cooldown on the account with the soonest recharge...'); + const cooldownResult = await executeCooldownPeriod(); + if (cooldownResult === 'stopped') break; + continue; + } + } + } + + console.log('🔄 Cycle complete, starting next painting session'); + } + } finally { + await finalizePaintingProcess(); + } + } + + // Phase 1: Execute a complete painting session using all available charges + async function executePaintingSession() { + console.log('🎨 Starting painting session - using all charges until 0'); + const { width, height, pixels } = state.imageData; + const { x: startX, y: startY } = state.startPosition; + const { x: regionX, y: regionY } = state.region; + + // Check if we're working with restored data by looking for existing availableColors + const isRestoredData = state.availableColors && state.availableColors.length > 0 && state.colorsChecked; + + if (!isRestoredData) { + // Wait for original tiles to load if needed + const tilesReady = await overlayManager.waitForTiles( + regionX, + regionY, + width, + height, + startX, + startY, + 10000 // timeout 10s + ); + + if (!tilesReady) { + updateUI('overlayTilesNotLoaded', 'error'); + state.stopFlag = true; + return 'stopped'; + } + } + + let pixelBatch = null; + let skippedPixels = { + transparent: 0, + white: 0, + alreadyPainted: 0, + colorUnavailable: 0, + }; + + // IMPORTANT: Check charges once at start, then paint until depleted + // Use local charge model to avoid extra API calls + console.log('🔋 Checking initial charges for painting session'); + const currentToken = accountManager.getCurrentAccount()?.token; + let node = ChargeModel.get(currentToken); + // One-time sync for current account if never synced + if (node && !node.lastSyncAt) { + try { + const sync = await WPlaceService.getCharges(); + ChargeModel.setFromServer(currentToken, sync.charges, sync.max); + node = ChargeModel.get(currentToken); + } catch {} + } + state.displayCharges = Math.floor(node?.charges || 0); + state.preciseCurrentCharges = node?.charges || 0; + state.cooldown = CONFIG.COOLDOWN_DEFAULT; + await updateStats(); + if (state.displayCharges <= 0) { + console.log('⚡ No charges available (local), skipping painting session'); + return 'charges_depleted'; + } + + // If current account has less than threshold charges but another account + // has reached the threshold, switch BEFORE painting anything on the under-threshold account + try { + const threshold = Math.max(1, state.cooldownChargeThreshold || 1); + if (CONFIG.autoSwap && state.displayCharges < threshold) { + console.log(`🛑 Current charges (${state.displayCharges}) < threshold (${threshold}). Checking other accounts before painting...`); + const switched = await selectAndSwitchToAccountWithCharges(threshold); + if (switched) { + console.log('🔀 Switched to an account that met the threshold before painting. Restarting cycle...'); + return 'charges_depleted'; + } + } + } catch (e) { + console.warn('⚠️ Pre-paint switch guard failed:', e); + } + + console.log(`🔋 Starting with ${state.displayCharges} charges - painting until depleted`); + + // Paint pixels until we run out of charges or complete the image + try { + + // Generate the actual filtered coordinates for painting (resuming from last position) + const coords = await generateCoordinatesAsync( + width, + height, + state.coordinateMode, + state.coordinateDirection, + state.coordinateSnake, + state.blockWidth, + state.blockHeight, + state.lastPosition.x, + state.lastPosition.y + ); + + // OPTIMIZATION: Pre-filter already painted pixels (happens only once per session) + let eligibleCoords = []; + let alreadyPaintedCount = 0; + + if (!state.preFilteringDone) { + console.log('🔍 Pre-filtering already painted pixels (one-time detection for this session)...'); + + for (const [x, y] of coords) { + const targetPixelInfo = checkPixelEligibility(x, y); + + if (!targetPixelInfo.eligible) { + if (targetPixelInfo.reason !== 'alreadyPainted') { + skippedPixels[targetPixelInfo.reason]++; + + } + continue; + } + + // Check if already painted (only once per session) + let absX = startX + x; + let absY = startY + y; + let adderX = Math.floor(absX / 1000); + let adderY = Math.floor(absY / 1000); + let pixelX = absX % 1000; + let pixelY = absY % 1000; + + try { + const tilePixelRGBA = await overlayManager.getTilePixelColor( + regionX + adderX, + regionY + adderY, + pixelX, + pixelY + ); + + if (tilePixelRGBA && Array.isArray(tilePixelRGBA)) { + const mappedCanvasColor = Utils.resolveColor( + tilePixelRGBA.slice(0, 3), + state.availableColors, + !state.paintUnavailablePixels // Use same parameter as target pixel + ); + const isMatch = mappedCanvasColor.id === targetPixelInfo.mappedColorId; + if (isMatch) { + alreadyPaintedCount++; + // Mark as painted in map but DO NOT increment progress counter + // Progress should only reflect actual painting sequence position + Utils.markPixelPainted(x, y, regionX + adderX, regionY + adderY); + continue; // Skip already painted pixels + } + } + } catch (e) { + // If we can't check, include the pixel (better to attempt than skip) + } + + // Add eligible unpainted pixel to list + eligibleCoords.push([x, y, targetPixelInfo]); + } + + // Mark pre-filtering as done for this session + state.preFilteringDone = true; + + // Log pre-filtering results + if (alreadyPaintedCount > 0) { + console.log(`✓ Pre-filter complete: ${alreadyPaintedCount} already painted pixels detected (not added to progress counter)`); + console.log('ℹ️ This detection will not happen again until a new image/save is loaded'); + console.log('📊 Progress counter only reflects actual painting sequence position'); + // No need to update stats since progress wasn't changed + } + skippedPixels.alreadyPainted = alreadyPaintedCount; + } else { + // Pre-filtering already done this session, just filter for basic eligibility + console.log('🔍 Using existing pre-filter results (already done this session)'); + for (const [x, y] of coords) { + const targetPixelInfo = checkPixelEligibility(x, y); + + if (!targetPixelInfo.eligible) { + if (targetPixelInfo.reason !== 'alreadyPainted') { + skippedPixels[targetPixelInfo.reason]++; + } + continue; + } + + // Only include pixels that haven't been marked as painted yet + let absX = startX + x; + let absY = startY + y; + let adderX = Math.floor(absX / 1000); + let adderY = Math.floor(absY / 1000); + + if (!Utils.isPixelPainted(x, y, regionX + adderX, regionY + adderY)) { + eligibleCoords.push([x, y, targetPixelInfo]); + } + } + } + + // Group pixels by color if color-by-color mode is enabled + let pixelsToProcess = eligibleCoords; + if (state.paintingOrder === 'color-by-color') { + console.log('🎨 Color-by-color mode enabled - grouping pixels by color'); + + // Group pixels by color ID + const colorGroups = new Map(); + for (const [x, y, targetPixelInfo] of eligibleCoords) { + const colorId = targetPixelInfo.mappedColorId; + if (!colorGroups.has(colorId)) { + colorGroups.set(colorId, []); + } + colorGroups.get(colorId).push([x, y, targetPixelInfo]); + } + + // Log color groups + console.log(`📊 Found ${colorGroups.size} different colors to paint:`); + for (const [colorId, pixels] of colorGroups.entries()) { + const colorInfo = Object.values(CONFIG.COLOR_MAP).find(c => c.id === colorId); + const colorName = colorInfo ? colorInfo.name : `Color ${colorId}`; + console.log(` 🎨 ${colorName} (ID: ${colorId}): ${pixels.length} pixels`); + } + + // Process colors one by one + const sortedColorGroups = Array.from(colorGroups.entries()).sort((a, b) => a[0] - b[0]); + + // If we have a current painting color, resume from that color + let startIndex = 0; + if (state.currentPaintingColor !== null) { + startIndex = sortedColorGroups.findIndex(([colorId]) => colorId === state.currentPaintingColor); + if (startIndex === -1) startIndex = 0; + console.log(`🔄 Resuming from color ID ${state.currentPaintingColor} (index ${startIndex})`); + } + + // Flatten the groups starting from the current color + pixelsToProcess = []; + for (let i = startIndex; i < sortedColorGroups.length; i++) { + const [colorId, pixels] = sortedColorGroups[i]; + // Avoid using spread or concat with very large arrays to prevent call stack/alloc overhead + for (let j = 0; j < pixels.length; j++) { + pixelsToProcess.push(pixels[j]); + } + } + + console.log(`✅ Prepared ${pixelsToProcess.length} pixels for color-by-color painting`); + } + + // Paint eligible pixels (already pre-filtered, no duplicate checks) + outerLoop: for (const [x, y, targetPixelInfo] of pixelsToProcess) { + // Track current color being painted in color-by-color mode + if (state.paintingOrder === 'color-by-color') { + if (state.currentPaintingColor !== targetPixelInfo.mappedColorId) { + state.currentPaintingColor = targetPixelInfo.mappedColorId; + const colorInfo = Object.values(CONFIG.COLOR_MAP).find(c => c.id === state.currentPaintingColor); + const colorName = colorInfo ? colorInfo.name : `Color ${state.currentPaintingColor}`; + console.log(`🎨 Now painting: ${colorName} (ID: ${state.currentPaintingColor})`); + + // Update UI to show current color + const statusDiv = document.getElementById('statusDiv'); + if (statusDiv) { + const colorMessage = Utils.t('currentlyPaintingColor', { colorName }); + const colorIndicator = document.getElementById('currentColorIndicator'); + if (colorIndicator) { + colorIndicator.textContent = colorMessage; + } else { + const indicator = document.createElement('div'); + indicator.id = 'currentColorIndicator'; + indicator.textContent = colorMessage; + indicator.style.cssText = 'margin-top: 8px; padding: 8px; background: rgba(255,255,255,0.1); border-radius: 6px; font-weight: bold;'; + statusDiv.appendChild(indicator); + } + } + } + } + + if (state.stopFlag) { + if (pixelBatch && pixelBatch.pixels.length > 0) { + console.log(`🎯 Sending last batch before stop with ${pixelBatch.pixels.length} pixels`); + await flushPixelBatch(pixelBatch); + } + state.lastPosition = { x, y }; + // Show paused coordinates in UI with proper translation template + // Use last painted position if available, otherwise use current position + const pausedX = state.lastPaintedPosition.x || x; + const pausedY = state.lastPaintedPosition.y || y; + updateUI('paintingPaused', 'warning', { x: pausedX, y: pausedY }); + console.log(`⏸️ Painting paused after last painted coordinates (${pausedX}, ${pausedY})`); + return 'stopped'; + } + + // Check if we have charges left (local count, no API call) + if (state.displayCharges <= 0) { + // console.log("Try to buy paint charges"); + // await purchase("paint_charges"); + await updateStats(); + if (state.displayCharges <= 0) { + console.log('⚡ No charges left (local count), ending painting session'); + if (pixelBatch && pixelBatch.pixels.length > 0) { + console.log(`🎯 Sending final batch with ${pixelBatch.pixels.length} pixels`); + await flushPixelBatch(pixelBatch); + } + state.lastPosition = { x, y }; + return 'charges_depleted'; + } + // else { + // console.log(`🔋 Charges after purchase: ${state.displayCharges}, continuing painting`); + // } + } + + let absX = startX + x; + let absY = startY + y; + + let adderX = Math.floor(absX / 1000); + let adderY = Math.floor(absY / 1000); + let pixelX = absX % 1000; + let pixelY = absY % 1000; + + // CRITICAL FIX: Always check if pixel is already painted (both locally and on canvas) + if (Utils.isPixelPainted(x, y, regionX + adderX, regionY + adderY)) { + console.log(`⏭️ Skipping already painted pixel at (${x}, ${y}) - marked in local map`); + continue; // Skip already painted pixels + } + + // REAL-TIME CANVAS CHECK: Verify against actual canvas state to prevent overpainting + try { + const existingColorRGBA = await overlayManager.getTilePixelColor( + regionX + adderX, + regionY + adderY, + pixelX, + pixelY + ).catch(() => null); + + if (existingColorRGBA && Array.isArray(existingColorRGBA)) { + const [er, eg, eb] = existingColorRGBA; + const existingMappedColor = Utils.resolveColor( + [er, eg, eb], + state.availableColors, + !state.paintUnavailablePixels + ); + const isAlreadyCorrect = existingMappedColor.id === targetPixelInfo.mappedColorId; + + if (isAlreadyCorrect) { + console.log(`✅ Pixel at (${x}, ${y}) already has correct color (${existingMappedColor.id}) - marking as painted`); + // Mark it as painted in local map but DO NOT increment progress counter + // Progress should only reflect actual painting sequence position + Utils.markPixelPainted(x, y, regionX + adderX, regionY + adderY); + continue; // Skip painting this pixel + } + } + } catch (e) { + // If we can't check the canvas, proceed with painting (better to attempt than skip) + console.warn(`⚠️ Could not verify canvas state for pixel (${x}, ${y}), proceeding with paint:`, e.message); + } + + const targetMappedColorId = targetPixelInfo.mappedColorId; + + // Set up pixel batch for new region if needed + if ( + !pixelBatch || + pixelBatch.regionX !== regionX + adderX || + pixelBatch.regionY !== regionY + adderY + ) { + if (pixelBatch && pixelBatch.pixels.length > 0) { + console.log(`🌍 Sending region-change batch with ${pixelBatch.pixels.length} pixels`); + const success = await flushPixelBatch(pixelBatch); + if (!success) { + console.error(`❌ Batch failed permanently after retries. Stopping painting.`); + state.stopFlag = true; + return 'stopped'; + } + await updateStats(); + } + + pixelBatch = { + regionX: regionX + adderX, + regionY: regionY + adderY, + pixels: [], + }; + } + + // Add pixel to batch (no need to check again - already pre-filtered) + pixelBatch.pixels.push({ + x: pixelX, + y: pixelY, + color: targetMappedColorId, + localX: x, + localY: y, + }); + + // Send batch if it's full + const maxBatchSize = calculateBatchSize(); + if (pixelBatch.pixels.length >= maxBatchSize) { + console.log(`📦 Sending batch with ${pixelBatch.pixels.length} pixels`); + const success = await flushPixelBatch(pixelBatch); + if (!success) { + console.error(`❌ Batch failed permanently after retries. Stopping painting.`); + state.stopFlag = true; + return 'stopped'; + } + pixelBatch.pixels = []; + await updateStats(); + } + } + + // Send final batch if any pixels remain + if (pixelBatch && pixelBatch.pixels.length > 0 && !state.stopFlag) { + console.log(`🏁 Sending final batch with ${pixelBatch.pixels.length} pixels`); + const success = await flushPixelBatch(pixelBatch); + if (!success) { + console.warn(`⚠️ Final batch failed with ${pixelBatch.pixels.length} pixels`); + } + } + + // If we completed the entire coordinate loop, image is complete + return state.stopFlag ? 'stopped' : 'completed'; + + } finally { + // Log skip statistics for this session + console.log(`📊 Session Statistics:`); + console.log(` New pixels painted: ${state.paintedPixels - (skippedPixels.alreadyPainted || 0)}`); + console.log(` Already painted detected: ${skippedPixels.alreadyPainted}`); + console.log(` Total progress: ${state.paintedPixels}`); + console.log(` Pre-filtered - Transparent: ${skippedPixels.transparent}`); + console.log(` Pre-filtered - White: ${skippedPixels.white}`); + console.log(` Pre-filtered - Color Unavailable: ${skippedPixels.colorUnavailable}`); + } + } + + // Phase 2: Execute cooldown period - wait for target charges (NO token regeneration) + async function executeCooldownPeriod() { + console.log('⏱️ Entering cooldown period - waiting for target charges'); + console.log('🚫 NO token regeneration during cooldown (even if expired/invalid)'); + + // Check initial charges to calculate wait time + let chargeCheckCount = 0; + // const maxChargeChecks = 10; // REMOVED: No limit on API calls during cooldown + + while (!state.stopFlag) { + const threshold = Math.max(1, state.cooldownChargeThreshold || 1); + const accounts = accountManager.getAllAccounts(); + let anyReady = false; + let bestMs = Infinity; + let currentCharges = ChargeModel.getForCurrent()?.charges || 0; + + for (const acc of accounts) { + const node = ChargeModel.get(acc.token); + if (!node) continue; + if (node.charges >= threshold) { + anyReady = true; + break; + } + const ms = ChargeModel.predictTimeToReach(acc.token, threshold); + if (ms < bestMs) bestMs = ms; + } + + if (anyReady) { + console.log(`✅ Cooldown target reached locally (≥${threshold})`); + NotificationManager.maybeNotifyChargesReached(true); + await updateStats(); + return 'target_reached'; + } + + const waitMs = Number.isFinite(bestMs) ? Math.max(1000, Math.min(bestMs, 10000)) : 10000; + updateUI('noChargesThreshold', 'warning', { + time: Utils.msToTimeText(waitMs), + threshold, + current: currentCharges, + }); + await updateStats(); + await Utils.sleep(waitMs); + } + + return 'stopped'; + } + + // Phase 3: Regenerate token for new painting session + async function regenerateTokenForNewSession() { + console.log('🔑 Regenerating token for new painting session'); + + try { + // Force regenerate token for new session + await ensureToken(true); // forceRefresh = true + + if (!getTurnstileToken()) { + console.error('❌ Failed to generate token for new session'); + return false; + } + + console.log('✅ Token regenerated successfully for new session'); + return true; + } catch (error) { + console.error('❌ Token regeneration failed:', error); + return false; + } + } + + // Finalize painting process cleanup + async function finalizePaintingProcess() { + console.log('🧹 Finalizing painting process'); + + if (window._chargesInterval) { + clearInterval(window._chargesInterval); + window._chargesInterval = null; + } + + if (state.stopFlag) { + // Save progress when stopped to preserve painted map + Utils.saveProgress(); + } else { + updateUI('paintingComplete', 'success', { count: state.paintedPixels }); + state.lastPosition = { x: 0, y: 0 }; // Only reset when truly complete + Utils.saveProgress(); // Save final complete state + overlayManager.clear(); + const toggleOverlayBtn = document.getElementById('toggleOverlayBtn'); + if (toggleOverlayBtn) { + toggleOverlayBtn.classList.remove('active'); + toggleOverlayBtn.disabled = true; + } + } + } + + // Helper function to check pixel eligibility (shared by painting functions) + function checkPixelEligibility(x, y) { + const { width, height, pixels } = state.imageData; + const transparencyThreshold = state.customTransparencyThreshold || CONFIG.TRANSPARENCY_THRESHOLD; + + // CRITICAL FIX: Check module availability before processing + if (!Utils || typeof Utils.isWhitePixel !== 'function') { + console.error('❌ Utils module not available for pixel eligibility check'); + return { + eligible: false, + reason: 'moduleUnavailable', + }; + } + + const idx = (y * width + x) * 4; + const r = pixels[idx], + g = pixels[idx + 1], + b = pixels[idx + 2], + a = pixels[idx + 3]; + + if (!state.paintTransparentPixels && a < transparencyThreshold) + return { + eligible: false, + reason: 'transparent', + }; + if (!state.paintWhitePixels && Utils.isWhitePixel(r, g, b)) + return { + eligible: false, + reason: 'white', + }; + + let targetRgb = Utils.isWhitePixel(r, g, b) + ? [255, 255, 255] + : Utils.findClosestPaletteColor(r, g, b, state.activeColorPalette); + + const mappedTargetColorId = Utils.resolveColor( + targetRgb, + state.availableColors, + !state.paintUnavailablePixels + ); + + if (!state.paintUnavailablePixels && !mappedTargetColorId.id) { + return { + eligible: false, + reason: 'colorUnavailable', + r, + g, + b, + a, + mappedColorId: mappedTargetColorId.id, + }; + } + return { eligible: true, r, g, b, a, mappedColorId: mappedTargetColorId.id }; + } + + // Helper function to skip pixel and log the reason (minimized logging) + function skipPixel(reason, id, rgb, x, y, skippedPixels) { + // Minimize logging to prevent console flooding - only log non-routine skips + if (reason !== 'transparent' && reason !== 'alreadyPainted') { + console.log(`Skipped pixel for ${reason} (id: ${id}, (${rgb.join(', ')})) at (${x}, ${y})`); + } + skippedPixels[reason]++; + } + function calculateBatchSize() { + let targetBatchSize; + + // If speed control is disabled, use all available charges + if (!CONFIG.PAINTING_SPEED_ENABLED) { + targetBatchSize = state.displayCharges; + console.log(`🚀 Speed control disabled: using all ${targetBatchSize} available charges`); + return Math.max(1, targetBatchSize); + } + + // CRITICAL FIX: When speed control is ENABLED, use actual available charges as the batch size + // This ensures bot sends exactly the number of pixels matching available charges + // Example: 75 charges → send 75 pixels, 14 charges → send 14 pixels + const availableCharges = state.displayCharges; + + if (state.batchMode === 'random') { + // Generate random batch size within the specified range + const min = Math.max(1, state.randomBatchMin); + const max = Math.max(min, state.randomBatchMax); + targetBatchSize = Math.floor(Math.random() * (max - min + 1)) + min; + console.log(`🎲 Random batch size generated: ${targetBatchSize} (range: ${min}-${max})`); + } else { + // Normal mode - use the fixed paintingSpeed value + targetBatchSize = state.paintingSpeed; + } + + // FIXED: Use actual available charges as the maximum batch size + // This matches the available pixels exactly (e.g., 75 charges = 75 pixel batch) + const finalBatchSize = Math.min(targetBatchSize, availableCharges); + + console.log(`📊 Batch size: ${finalBatchSize} (target: ${targetBatchSize}, available: ${availableCharges})`); + + return Math.max(1, finalBatchSize); + } + + // Helper function to retry batch until success with exponential backoff + async function sendBatchWithRetry(pixels, regionX, regionY, maxRetries = MAX_BATCH_RETRIES) { + let attempt = 0; + while (attempt < maxRetries && !state.stopFlag) { + attempt++; + console.log( + `🔄 Attempting to send batch (attempt ${attempt}/${maxRetries}) for region ${regionX},${regionY} with ${pixels.length} pixels` + ); + + const result = await sendPixelBatch(pixels, regionX, regionY); + + if (result === true) { + console.log(`✅ Batch succeeded on attempt ${attempt}`); + return true; + } else if (result === 'token_error') { + console.log(`🔑 Token error on attempt ${attempt} - no token available during processing`); + console.log(`❌ Stopping batch processing - tokens must be generated at startup/start button only`); + updateUI('captchaFailed', 'error'); + await Utils.sleep(2000); // Wait longer before retrying after token failure + continue; // Continue to retry until maxRetries reached + } else if (result === 'token_regenerated') { + console.log(`🔄 Token regenerated on attempt ${attempt} after 403 error - retrying batch`); + const pausedX = state.lastPaintedPosition.x; + const pausedY = state.lastPaintedPosition.y; + updateUI('paintingPaused', 'warning', { x: pausedX, y: pausedY }); + // Don't count token regeneration as a failed attempt, retry immediately + attempt--; + await Utils.sleep(500); // Brief pause before retry + continue; + } else if (result === 'token_regeneration_failed') { + console.log(`❌ Token regeneration failed on attempt ${attempt} after 403 error`); + updateUI('captchaFailed', 'error'); + return false; // Stop processing if we can't get a valid token + } else if (result === 'invalid_token_error') { + console.log(`🔑 Invalid token detected on attempt ${attempt}, regenerating...`); + updateUI('captchaSolving', 'warning'); + try { + await handleCaptcha(true); // Allow generation for invalid token cases + // Don't count token regeneration as a failed attempt + attempt--; + continue; + } catch (e) { + console.error(`❌ Token regeneration failed after invalid token on attempt ${attempt}:`, e); + updateUI('captchaFailed', 'error'); + // Wait longer before retrying after token failure + await Utils.sleep(5000); + } + } else { + console.warn(`⚠️ Batch failed on attempt ${attempt}, retrying...`); + // Exponential backoff with jitter + const baseDelay = Math.min(1000 * Math.pow(2, attempt - 1), 30000); // Max 30s + const jitter = Math.random() * 1000; // Add up to 1s random delay + await Utils.sleep(baseDelay + jitter); + } + } + + if (attempt >= maxRetries) { + console.error( + `❌ Batch failed after ${maxRetries} attempts (MAX_BATCH_RETRIES=${MAX_BATCH_RETRIES}). This will stop painting to prevent infinite loops.` + ); + updateUI('paintingError', 'error'); + return false; + } + + return false; + } + + async function sendPixelBatch(pixelBatch, regionX, regionY) { + let token = getTurnstileToken(); + + // Don't auto-generate tokens during processing - return error if no token available + if (!token) { + console.warn('⚠️ No token available and auto-generation disabled during processing'); + return 'token_error'; + } + + const coords = new Array(pixelBatch.length * 2); + const colors = new Array(pixelBatch.length); + for (let i = 0; i < pixelBatch.length; i++) { + const pixel = pixelBatch[i]; + coords[i * 2] = pixel.x; + coords[i * 2 + 1] = pixel.y; + colors[i] = pixel.color; + } + + try { + const payload = { coords, colors, t: token, fp: fpStr32 }; + var wasmtoken = await createWasmToken(regionX, regionY, payload); + const res = await fetch(`https://backend.wplace.live/s0/pixel/${regionX}/${regionY}`, { + method: 'POST', + headers: { 'Content-Type': 'text/plain;charset=UTF-8', "x-pawtect-token": wasmtoken }, + credentials: 'include', + body: JSON.stringify(payload), + }); + + if (res.status === 403) { + let data = null; + try { + data = await res.json(); + } catch (_) { } + console.error('❌ 403 Forbidden. Token invalid during painting - regeneration allowed.'); + + // 403 errors during painting allow token regeneration per workflow requirements + console.log('� Token invalid (403) during painting - regenerating token as allowed by workflow'); + setTurnstileToken(null); + createTokenPromise(); + + // Attempt to regenerate token immediately + const newToken = await ensureToken(true); + if (newToken) { + console.log('✅ Token regenerated after 403 error, returning regenerate signal'); + return 'token_regenerated'; + } else { + console.error('❌ Failed to regenerate token after 403 error'); + return 'token_regeneration_failed'; + } + } + + const data = await res.json(); + return data?.painted === pixelBatch.length; + } catch (e) { + console.error('Batch paint request failed:', e); + return false; + } + } + + function saveBotSettings() { + try { + const settings = { + paintingSpeed: state.paintingSpeed, + paintingSpeedEnabled: document.getElementById('enableSpeedToggle')?.checked, + batchMode: state.batchMode, // "normal" or "random" + paintingOrder: state.paintingOrder, // "sequential" or "color-by-color" + randomBatchMin: state.randomBatchMin, + randomBatchMax: state.randomBatchMax, + cooldownChargeThreshold: state.cooldownChargeThreshold, + tokenSource: state.tokenSource, // "generator", "hybrid", or "manual" + minimized: state.minimized, + overlayOpacity: state.overlayOpacity, + blueMarbleEnabled: document.getElementById('enableBlueMarbleToggle')?.checked, + ditheringEnabled: state.ditheringEnabled, + colorMatchingAlgorithm: state.colorMatchingAlgorithm, + enableChromaPenalty: state.enableChromaPenalty, + chromaPenaltyWeight: state.chromaPenaltyWeight, + customTransparencyThreshold: state.customTransparencyThreshold, + customWhiteThreshold: state.customWhiteThreshold, + paintWhitePixels: state.paintWhitePixels, + paintTransparentPixels: state.paintTransparentPixels, + resizeSettings: state.resizeSettings, + paintUnavailablePixels: state.paintUnavailablePixels, + coordinateMode: state.coordinateMode, + coordinateDirection: state.coordinateDirection, + coordinateSnake: state.coordinateSnake, + blockWidth: state.blockWidth, + blockHeight: state.blockHeight, // Save ignore mask (as base64) with its dimensions + resizeIgnoreMask: + state.resizeIgnoreMask && + state.resizeSettings && + state.resizeSettings.width * state.resizeSettings.height === state.resizeIgnoreMask.length + ? { + w: state.resizeSettings.width, + h: state.resizeSettings.height, + data: btoa(String.fromCharCode(...state.resizeIgnoreMask)), + } + : null, // Notifications + notificationsEnabled: state.notificationsEnabled, + notifyOnChargesReached: state.notifyOnChargesReached, + notifyOnlyWhenUnfocused: state.notifyOnlyWhenUnfocused, + notificationIntervalMinutes: state.notificationIntervalMinutes, + originalImage: state.originalImage, + ditheringMigrated: true, // Migration flag for dithering default change + blueMarbleMigrated: true, // Migration flag for blue marble default change + // NOTE: paintingMode is intentionally NOT saved - always defaults to 'auto' on page load + // Save region and startPosition for assist mode coordinate calculations + region: state.region, + startPosition: state.startPosition, + }; + CONFIG.PAINTING_SPEED_ENABLED = settings.paintingSpeedEnabled; + // AUTO_CAPTCHA_ENABLED is always true - no need to save/load + + localStorage.setItem('wplace-bot-settings', JSON.stringify(settings)); + } catch (e) { + console.warn('Could not save bot settings:', e); + } + } + + function loadBotSettings() { + try { + const saved = localStorage.getItem('wplace-bot-settings'); + if (!saved) return; + const settings = JSON.parse(saved); + + state.paintingSpeed = settings.paintingSpeed || CONFIG.PAINTING_SPEED.DEFAULT; + state.batchMode = settings.batchMode || CONFIG.BATCH_MODE; // Default to "normal" + state.paintingOrder = settings.paintingOrder || CONFIG.PAINTING_ORDER; // Default to "sequential" + state.randomBatchMin = settings.randomBatchMin || CONFIG.RANDOM_BATCH_RANGE.MIN; + state.randomBatchMax = settings.randomBatchMax || CONFIG.RANDOM_BATCH_RANGE.MAX; + state.cooldownChargeThreshold = + settings.cooldownChargeThreshold || CONFIG.COOLDOWN_CHARGE_THRESHOLD; + state.tokenSource = settings.tokenSource || CONFIG.TOKEN_SOURCE; // Default to "generator" + state.minimized = settings.minimized ?? false; + CONFIG.PAINTING_SPEED_ENABLED = settings.paintingSpeedEnabled ?? false; + CONFIG.AUTO_CAPTCHA_ENABLED = settings.autoCaptchaEnabled ?? false; + state.overlayOpacity = settings.overlayOpacity ?? CONFIG.OVERLAY.OPACITY_DEFAULT; + + // MIGRATION: Force enable blue marble for existing users if not explicitly set + // This ensures the new default (blue marble ON) is applied to existing users + if (settings.blueMarbleMigrated !== true) { + state.blueMarbleEnabled = true; + console.log('🔄 Migrated: Blue Marble enabled (new default)'); + // Save the migration flag + settings.blueMarbleMigrated = true; + localStorage.setItem('wplace-bot-settings', JSON.stringify(settings)); + } else { + state.blueMarbleEnabled = settings.blueMarbleEnabled ?? CONFIG.OVERLAY.BLUE_MARBLE_DEFAULT; + } + + // MIGRATION: Force reset dithering to false if not explicitly set in saved settings + // This ensures the new default (dithering OFF) is applied to existing users + if (settings.ditheringMigrated !== true) { + state.ditheringEnabled = false; + console.log('🔄 Migrated: Dithering reset to OFF (new default)'); + // Save the migration flag + settings.ditheringMigrated = true; + localStorage.setItem('wplace-bot-settings', JSON.stringify(settings)); + } else { + state.ditheringEnabled = settings.ditheringEnabled ?? false; + } + + state.colorMatchingAlgorithm = settings.colorMatchingAlgorithm || 'lab'; + state.enableChromaPenalty = settings.enableChromaPenalty ?? true; + state.chromaPenaltyWeight = settings.chromaPenaltyWeight ?? 0.15; + state.customTransparencyThreshold = + settings.customTransparencyThreshold ?? CONFIG.TRANSPARENCY_THRESHOLD; + state.customWhiteThreshold = settings.customWhiteThreshold ?? CONFIG.WHITE_THRESHOLD; + state.paintWhitePixels = settings.paintWhitePixels ?? true; + state.paintTransparentPixels = settings.paintTransparentPixels ?? false; + state.resizeSettings = settings.resizeSettings ?? null; + state.originalImage = settings.originalImage ?? null; + state.paintUnavailablePixels = settings.paintUnavailablePixels ?? CONFIG.PAINT_UNAVAILABLE; + state.coordinateMode = settings.coordinateMode ?? CONFIG.COORDINATE_MODE; + state.coordinateDirection = settings.coordinateDirection ?? CONFIG.COORDINATE_DIRECTION; + state.coordinateSnake = settings.coordinateSnake ?? CONFIG.COORDINATE_SNAKE; + state.blockWidth = settings.blockWidth ?? CONFIG.COORDINATE_BLOCK_WIDTH; + state.blockHeight = settings.blockHeight ?? CONFIG.COORDINATE_BLOCK_HEIGHT; + // Notifications + state.notificationsEnabled = settings.notificationsEnabled ?? CONFIG.NOTIFICATIONS.ENABLED; + state.notifyOnChargesReached = + settings.notifyOnChargesReached ?? CONFIG.NOTIFICATIONS.ON_CHARGES_REACHED; + state.notifyOnlyWhenUnfocused = + settings.notifyOnlyWhenUnfocused ?? CONFIG.NOTIFICATIONS.ONLY_WHEN_UNFOCUSED; + state.notificationIntervalMinutes = + settings.notificationIntervalMinutes ?? CONFIG.NOTIFICATIONS.REPEAT_MINUTES; + // NOTE: paintingMode is NOT restored - always defaults to 'auto' on page load + + // Restore region and startPosition for assist mode coordinate calculations + if (settings.region) { + state.region = settings.region; + console.log('✅ Restored region from save file:', state.region); + } + if (settings.startPosition) { + state.startPosition = settings.startPosition; + console.log('✅ Restored startPosition from save file:', state.startPosition); + } + + // Restore ignore mask if dims match current resizeSettings + if ( + settings.resizeIgnoreMask && + settings.resizeIgnoreMask.data && + state.resizeSettings && + settings.resizeIgnoreMask.w === state.resizeSettings.width && + settings.resizeIgnoreMask.h === state.resizeSettings.height + ) { + try { + const bin = atob(settings.resizeIgnoreMask.data); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i); + state.resizeIgnoreMask = arr; + } catch { + state.resizeIgnoreMask = null; + } + } else { + state.resizeIgnoreMask = null; + } + // Initialize coordinate generation UI + const coordinateModeSelect = document.getElementById('coordinateModeSelect'); + if (coordinateModeSelect) coordinateModeSelect.value = state.coordinateMode; + + const coordinateDirectionSelect = document.getElementById('coordinateDirectionSelect'); + if (coordinateDirectionSelect) coordinateDirectionSelect.value = state.coordinateDirection; + + const coordinateSnakeToggle = document.getElementById('coordinateSnakeToggle'); + if (coordinateSnakeToggle) coordinateSnakeToggle.checked = state.coordinateSnake; + + const settingsContainer = document.getElementById('wplace-settings-container'); + const directionControls = settingsContainer.querySelector('#directionControls'); + const snakeControls = settingsContainer.querySelector('#snakeControls'); + const blockControls = settingsContainer.querySelector('#blockControls'); + Utils.updateCoordinateUI({ + mode: state.coordinateMode, + directionControls, + snakeControls, + blockControls, + }); + + const paintUnavailablePixelsToggle = document.getElementById('paintUnavailablePixelsToggle'); + if (paintUnavailablePixelsToggle) { + paintUnavailablePixelsToggle.checked = state.paintUnavailablePixels; + } + + const settingsPaintWhiteToggle = settingsContainer.querySelector('#settingsPaintWhiteToggle'); + if (settingsPaintWhiteToggle) { + settingsPaintWhiteToggle.checked = state.paintWhitePixels; + } + + const settingsPaintTransparentToggle = settingsContainer.querySelector( + '#settingsPaintTransparentToggle' + ); + if (settingsPaintTransparentToggle) { + settingsPaintTransparentToggle.checked = state.paintTransparentPixels; + } + + const speedSlider = document.getElementById('speedSlider'); + const speedInput = document.getElementById('speedInput'); + const speedValue = document.getElementById('speedValue'); + if (speedSlider) speedSlider.value = state.paintingSpeed; + if (speedInput) speedInput.value = state.paintingSpeed; + if (speedValue) speedValue.textContent = `pixels`; + + const enableSpeedToggle = document.getElementById('enableSpeedToggle'); + if (enableSpeedToggle) enableSpeedToggle.checked = CONFIG.PAINTING_SPEED_ENABLED; + + // Painting order UI initialization + const paintingOrderSelect = document.getElementById('paintingOrderSelect'); + if (paintingOrderSelect) paintingOrderSelect.value = state.paintingOrder; + + // Batch mode UI initialization + const batchModeSelect = document.getElementById('batchModeSelect'); + if (batchModeSelect) batchModeSelect.value = state.batchMode; + + const normalBatchControls = document.getElementById('normalBatchControls'); + const randomBatchControls = document.getElementById('randomBatchControls'); + + // Show/hide appropriate controls based on batch mode + if (normalBatchControls && randomBatchControls) { + if (state.batchMode === 'random') { + normalBatchControls.style.display = 'none'; + randomBatchControls.style.display = 'block'; + } else { + normalBatchControls.style.display = 'block'; + randomBatchControls.style.display = 'none'; + } + } + + const randomBatchMin = document.getElementById('randomBatchMin'); + if (randomBatchMin) randomBatchMin.value = state.randomBatchMin; + + const randomBatchMax = document.getElementById('randomBatchMax'); + if (randomBatchMax) randomBatchMax.value = state.randomBatchMax; + + // AUTO_CAPTCHA_ENABLED is always true - no toggle to set + + const cooldownSlider = document.getElementById('cooldownSlider'); + const cooldownInput = document.getElementById('cooldownInput'); + const cooldownValue = document.getElementById('cooldownValue'); + if (cooldownSlider) cooldownSlider.value = state.cooldownChargeThreshold; + if (cooldownInput) cooldownInput.value = state.cooldownChargeThreshold; + if (cooldownValue) cooldownValue.textContent = `${Utils.t('charges')}`; + + const overlayOpacitySlider = document.getElementById('overlayOpacitySlider'); + if (overlayOpacitySlider) overlayOpacitySlider.value = state.overlayOpacity; + const overlayOpacityValue = document.getElementById('overlayOpacityValue'); + if (overlayOpacityValue) + overlayOpacityValue.textContent = `${Math.round(state.overlayOpacity * 100)}%`; + const enableBlueMarbleToggle = document.getElementById('enableBlueMarbleToggle'); + if (enableBlueMarbleToggle) enableBlueMarbleToggle.checked = state.blueMarbleEnabled; + + const tokenSourceSelect = document.getElementById('tokenSourceSelect'); + if (tokenSourceSelect) tokenSourceSelect.value = state.tokenSource; + + const colorAlgorithmSelect = document.getElementById('colorAlgorithmSelect'); + if (colorAlgorithmSelect) colorAlgorithmSelect.value = state.colorMatchingAlgorithm; + const enableChromaPenaltyToggle = document.getElementById('enableChromaPenaltyToggle'); + if (enableChromaPenaltyToggle) enableChromaPenaltyToggle.checked = state.enableChromaPenalty; + const chromaPenaltyWeightSlider = document.getElementById('chromaPenaltyWeightSlider'); + if (chromaPenaltyWeightSlider) chromaPenaltyWeightSlider.value = state.chromaPenaltyWeight; + const chromaWeightValue = document.getElementById('chromaWeightValue'); + if (chromaWeightValue) chromaWeightValue.textContent = state.chromaPenaltyWeight; + const transparencyThresholdInput = document.getElementById('transparencyThresholdInput'); + if (transparencyThresholdInput) + transparencyThresholdInput.value = state.customTransparencyThreshold; + const whiteThresholdInput = document.getElementById('whiteThresholdInput'); + if (whiteThresholdInput) whiteThresholdInput.value = state.customWhiteThreshold; + // Notifications UI + const notifEnabledToggle = document.getElementById('notifEnabledToggle'); + if (notifEnabledToggle) notifEnabledToggle.checked = state.notificationsEnabled; + const notifOnChargesToggle = document.getElementById('notifOnChargesToggle'); + if (notifOnChargesToggle) notifOnChargesToggle.checked = state.notifyOnChargesReached; + const notifOnlyUnfocusedToggle = document.getElementById('notifOnlyUnfocusedToggle'); + if (notifOnlyUnfocusedToggle) + notifOnlyUnfocusedToggle.checked = state.notifyOnlyWhenUnfocused; + const notifIntervalInput = document.getElementById('notifIntervalInput'); + if (notifIntervalInput) notifIntervalInput.value = state.notificationIntervalMinutes; + NotificationManager.resetEdgeTracking(); + } catch (e) { + console.warn('Could not load bot settings:', e); + } + } + + // Initialize Turnstile generator integration + console.log('🚀 WPlace Auto-Image with Turnstile Token Generator loaded'); + console.log('🔑 Turnstile token generator: ALWAYS ENABLED (Background mode)'); + console.log('🎯 Manual pixel captcha solving: Available as fallback/alternative'); + console.log('📱 Turnstile widgets: DISABLED - pure background token generation only!'); + + // Generate fingerprint string for requests + if (!window.WPlaceTokenManager) { + console.error('❌ WPlaceTokenManager not available - dependency loading issue'); + return; + } + const fpStr32 = tokenManager._randStr(32); + console.log('🔑 Generated fingerprint string for API requests'); + + // Function to enable file operations after initial startup setup is complete + function enableFileOperations() { + state.initialSetupComplete = true; + + const loadBtn = document.querySelector('#loadBtn'); + const loadFromFileBtn = document.querySelector('#loadFromFileBtn'); + const uploadBtn = document.querySelector('#uploadBtn'); + + if (loadBtn) { + loadBtn.disabled = false; + loadBtn.title = ''; + // Add a subtle animation to indicate the button is now available + loadBtn.style.animation = 'pulse 0.6s ease-in-out'; + setTimeout(() => { + if (loadBtn) loadBtn.style.animation = ''; + }, 600); + console.log('✅ Load Progress button enabled after initial setup'); + } + + if (loadFromFileBtn) { + loadFromFileBtn.disabled = false; + loadFromFileBtn.title = ''; + // Add a subtle animation to indicate the button is now available + loadFromFileBtn.style.animation = 'pulse 0.6s ease-in-out'; + setTimeout(() => { + if (loadFromFileBtn) loadFromFileBtn.style.animation = ''; + }, 600); + console.log('✅ Load from File button enabled after initial setup'); + } + + if (uploadBtn) { + uploadBtn.disabled = false; + uploadBtn.title = ''; + // Add a subtle animation to indicate the button is now available + uploadBtn.style.animation = 'pulse 0.6s ease-in-out'; + setTimeout(() => { + if (uploadBtn) uploadBtn.style.animation = ''; + }, 600); + console.log('✅ Upload Image button enabled after initial setup'); + } + + // Enable Load Extracted button at the same time as Upload button + const loadExtractedBtn = document.getElementById('loadExtractedBtn'); + if (loadExtractedBtn) { + loadExtractedBtn.disabled = false; + loadExtractedBtn.title = ''; + console.log('✅ Load Extracted button enabled after initial setup'); + } + + // Show a notification that file operations are now available + Utils.showAlert(Utils.t('fileOperationsAvailable'), 'success'); + } + + // Optimized token initialization with better timing and error handling + async function initializeTokenGenerator() { + // Skip if already have valid token + if (isTokenValid()) { + console.log('✅ Valid token already available, skipping initialization'); + updateUI('tokenReady', 'success'); + enableFileOperations(); // Enable file operations since initial setup is complete + return; + } + + try { + console.log('🔧 Initializing Turnstile token generator...'); + updateUI('initializingToken', 'default'); + + console.log('Attempting to load Turnstile script...'); + await Utils.loadTurnstile(); + console.log('Turnstile script loaded. Attempting to generate token...'); + + // Use TokenManager's handleCaptchaWithRetry method instead + const token = await tokenManager.handleCaptchaWithRetry(); + if (token) { + setTurnstileToken(token); + console.log('✅ Startup token generated successfully'); + updateUI('tokenReady', 'success'); + Utils.showAlert(Utils.t('tokenGeneratorReady'), 'success'); + enableFileOperations(); // Enable file operations since initial setup is complete + } else { + console.warn( + '⚠️ Startup token generation failed (no token received), will retry when needed' + ); + updateUI('tokenRetryLater', 'warning'); + // Still enable file operations even if initial token generation fails + // Users can load progress and use manual/hybrid modes + enableFileOperations(); + } + } catch (error) { + console.error('❌ Critical error during Turnstile initialization:', error); // More specific error + updateUI('tokenRetryLater', 'warning'); + // Still enable file operations even if initial setup fails + // Users can load progress and use manual/hybrid modes + enableFileOperations(); + // Don't show error alert for initialization failures, just log them + } + } + + // Load theme preference immediately on startup before creating UI + loadThemePreference(); + applyTheme(); + + var pawtect_chunk = null; + + //find module if pawtect_chunk is null + pawtect_chunk ??= await findTokenModule("pawtect_wasm_bg.wasm"); + + async function createWasmToken(regionX, regionY, payload) { + try { + // Load the Pawtect module and WASM + const mod = await import(new URL('/_app/immutable/chunks/' + pawtect_chunk, location.origin).href); + let wasm; + try { + wasm = await mod._(); + console.log('✅ WASM initialized successfully'); + } catch (wasmError) { + console.error('❌ WASM initialization failed:', wasmError); + return null; + } + try { + try { + const me = await fetch(`https://backend.wplace.live/me`, { credentials: 'include' }).then(r => r.ok ? r.json() : null); + if (me?.id) { + mod.i(me.id); + console.log('✅ user ID set:', me.id); + } + } catch { } + } catch (userIdError) { + console.log('⚠️ Error setting user ID:', userIdError.message); + } + try { + const testUrl = `https://backend.wplace.live/s0/pixel/${regionX}/${regionY}`; + if (mod.r) { + mod.r(testUrl); + console.log('✅ Request URL set:', testUrl); + } else { + console.log('⚠️ request_url function (mod.r) not available'); + } + } catch (urlError) { + console.log('⚠️ Error setting request URL:', urlError.message); + } + + // Create test payload + + console.log('📝 payload:', payload); + + // Encode payload + const enc = new TextEncoder(); + const dec = new TextDecoder(); + const bodyStr = JSON.stringify(payload); + const bytes = enc.encode(bodyStr); + console.log('📏 Payload size:', bytes.length, 'bytes'); + console.log('📄 Payload string:', bodyStr); + + // Allocate WASM memory with validation + let inPtr; + try { + if (!wasm.__wbindgen_malloc) { + console.error('❌ __wbindgen_malloc function not found'); + return null; + } + + inPtr = wasm.__wbindgen_malloc(bytes.length, 1); + console.log('✅ WASM memory allocated, pointer:', inPtr); + + // Copy data to WASM memory + const wasmBuffer = new Uint8Array(wasm.memory.buffer, inPtr, bytes.length); + wasmBuffer.set(bytes); + console.log('✅ Data copied to WASM memory'); + } catch (memError) { + console.error('❌ Memory allocation error:', memError); + return null; + } + + // Call the WASM function + console.log('🚀 Calling get_pawtected_endpoint_payload...'); + let outPtr, outLen, token; + try { + const result = wasm.get_pawtected_endpoint_payload(inPtr, bytes.length); + console.log('✅ Function called, result type:', typeof result, result); + + if (Array.isArray(result) && result.length === 2) { + [outPtr, outLen] = result; + console.log('✅ Got output pointer:', outPtr, 'length:', outLen); + + // Decode the result + const outputBuffer = new Uint8Array(wasm.memory.buffer, outPtr, outLen); + token = dec.decode(outputBuffer); + console.log('✅ Token decoded successfully'); + } else { + console.error('❌ Unexpected function result format:', result); + return null; + } + } catch (funcError) { + console.error('❌ Function call error:', funcError); + console.error('Stack trace:', funcError.stack); + return null; + } + + // Cleanup memory + try { + if (wasm.__wbindgen_free && outPtr && outLen) { + wasm.__wbindgen_free(outPtr, outLen, 1); + console.log('✅ Output memory freed'); + } + if (wasm.__wbindgen_free && inPtr) { + wasm.__wbindgen_free(inPtr, bytes.length, 1); + console.log('✅ Input memory freed'); + } + } catch (cleanupError) { + console.log('⚠️ Cleanup warning:', cleanupError.message); + } + + // Display results + console.log(''); + console.log('🎉 SUCCESS!'); + console.log('🔑 Full token:'); + console.log(token); + return token; + } catch (error) { + console.error('❌ Failed to generate fp parameter:', error); + return null; + } + } + + async function findTokenModule(str) { + console.log('🔎 Searching for wasm Module...'); + const links = Array.from(document.querySelectorAll('link[rel="modulepreload"][href$=".js"]')); + + for (const link of links) { + try { + const url = new URL(link.getAttribute("href"), location.origin).href; + const code = await fetch(url).then(r => r.text()); + if (code.includes(str)) { + console.log('✅ Found wasm Module...'); + return url.split('/').pop(); + } + } catch (e) { /* ignore individual fetch errors */ } + } + console.error('❌ Could not find Pawtect chunk among preloaded modules'); + return null; + } + + async function purchase(type) { + // loadThemePreference() + let id; + let chargeMultiplier; + if (type === "max_charges") { + id = 70; + chargeMultiplier = 5; + } else if (type === "paint_charges") { + id = 80; + chargeMultiplier = 30; + } else { + console.error("Error: Invalid purchase type provided."); + return; + } + const { droplets } = await WPlaceService.getCharges(); + console.log("There are currently : ", droplets, "droplets."); + try { + const amounts = Math.floor(droplets / 500); + if (amounts < 1) { + console.log("Not enough droplets to purchase."); + return; + } + const payload = { + "product": { + "id": id, + "amount": amounts + } + }; + const res = await fetch("https://backend.wplace.live/purchase", { + method: "POST", + headers: { + "Content-Type": "text/plain;charset=UTF-8" + }, + body: JSON.stringify(payload), + credentials: "include" + }); + // POST request completed + const { droplets: newDroplets } = await WPlaceService.getCharges(); + if (droplets != newDroplets) { + console.log("Successfully bought", amounts * chargeMultiplier, type.replace('_', ' '), "."); + return 2; + } else { + console.log("Failed to buy charges"); + return 1; + } + } catch (e) { + console.error("An error occurred during the purchase:", e); + return 0; + } + } + async function swapAccountTrigger(token) { + // STRICT GUARD: Only allow account switching during active painting sessions OR controlled refresh + if (!state.running && !state.isFetchingAllAccounts) { + console.warn('🔒 Account switching blocked - only allowed during active painting or controlled refresh'); + console.warn('🔒 Current state.running:', state.running, 'state.isFetchingAllAccounts:', state.isFetchingAllAccounts); + return false; + } + + localStorage.removeItem("lp"); + if (!token) { + console.error('❌ Cannot swap account: token is null or undefined'); + return false; + } + + console.log(`🔄 Triggering account swap with token: ${token.substring(0, 20)}...`); + console.log('📤 Sending setCookie message to extension...'); + + try { + window.postMessage({ + source: 'my-userscript', + type: 'setCookie', + value: token + }, '*'); + console.log('✅ setCookie message sent successfully'); + } catch (error) { + console.error('❌ Failed to send setCookie message:', error); + return false; + } + + // Wait for background confirmation that cookie was set + const confirmed = await new Promise((resolve) => { + let settled = false; + const timer = setTimeout(() => { + if (!settled) { + settled = true; + console.warn('⚠️ cookieSet confirmation timeout'); + resolve(false); + } + }, 10000); + function onMessage(event) { + if (event.source !== window) return; + const data = event.data || {}; + if (data.type === 'cookieSet') { + if (!settled) { + settled = true; + clearTimeout(timer); + window.removeEventListener('message', onMessage); + resolve(true); + } + } + } + window.addEventListener('message', onMessage); + }); + + if (confirmed) { + console.log('✅ Cookie set confirmed'); + } else { + console.warn('⚠️ Proceeding without cookie confirmation'); + } + return true; + } + async function getAccounts() { + return new Promise((resolve, reject) => { + console.log("Requesting accounts from extension..."); + + // Ask extension for accounts + window.postMessage({ + source: "my-userscript", + type: "getAccounts" + }, "*"); + + function handler(event) { + if (event.source !== window) return; + if (event.data.source !== "extension") return; + if (event.data.type === "accountsData") { + // Remove listener when we get the response + window.removeEventListener("message", handler); + + try { + localStorage.setItem("accounts", JSON.stringify(event.data.accounts)); + console.log("✅ Accounts saved to localStorage:", event.data.accounts); + } catch (e) { + console.error("❌ Failed to save accounts:", e); + } + resolve(event.data.accounts); + } + } + window.addEventListener("message", handler); + }); + } + + + async function fetchAllAccountDetails() { + if (state.isFetchingAllAccounts) { + Utils.showAlert("Already fetching account details.", "warning"); + return; + } + + state.isFetchingAllAccounts = true; + + const refreshBtn = document.getElementById('refreshAllAccountsBtn'); + if (refreshBtn) { + refreshBtn.innerHTML = ''; + refreshBtn.disabled = true; + } + + const accountsListArea = document.getElementById('accountsListArea'); + if (accountsListArea) { + accountsListArea.innerHTML = `
    Loading accounts...
    `; + } + + try { + // First, get accounts from the extension + console.log(`🔄 [FETCH] Requesting accounts from extension...`); + try { + await getAccounts(); + console.log(`✅ [FETCH] Successfully retrieved accounts from extension`); + } catch (error) { + console.warn(`⚠️ [FETCH] Failed to get accounts from extension:`, error); + // Continue anyway in case we have cached accounts + } + + // Load accounts using the new AccountManager + await accountManager.loadAccounts(); + + console.log(`✅ [FETCH] Loaded ${accountManager.getAccountCount()} accounts from storage`); + + // Debug: Check if we actually have accounts + if (accountManager.getAccountCount() === 0) { + console.warn(`⚠️ [FETCH] No accounts found in storage. Check localStorage 'accounts' and chrome.storage 'infoAccounts'`); + + // Check localStorage for accounts + const localStorageAccounts = JSON.parse(localStorage.getItem("accounts")) || []; + console.log(`📋 [DEBUG] localStorage accounts:`, localStorageAccounts); + + // Render empty state and return early + renderAccountsList(); + return; + } + + // Now fetch fresh data for each account + const accounts = accountManager.getAllAccounts(); + if (accounts.length > 0) { + console.log(`🔄 [FETCH] Fetching fresh data for ${accounts.length} accounts...`); + + // Remember the current account so we can switch back + const originalCurrentAccount = accounts.find(acc => acc.isCurrent); + + for (let i = 0; i < accounts.length; i++) { + const account = accounts[i]; + console.log(`📊 [FETCH] Fetching data for account ${i + 1}: ${account.displayName}`); + + try { + // Switch to this account temporarily to fetch its data + console.log(`🔄 [FETCH] Switching to ${account.displayName} to fetch fresh data...`); + await switchToSpecificAccount(account.token, account.displayName); + // await Utils.sleep(500); // Small delay to ensure switch takes effect + + // Fetch fresh account details + const accountData = await WPlaceService.getCharges(); + const accountInfo = await WPlaceService.fetchCheck(); + + // Update account with fresh data + accountManager.updateAccountData(account.token, { + ID: accountData.id || accountInfo.ID, + Charges: Math.floor(accountData.charges || 0), + Max: Math.floor(accountData.max || 0), + Droplets: Math.floor(accountData.droplets || 0), + displayName: accountInfo.Username || accountInfo.name || account.displayName + }); + + console.log(`✅ [FETCH] Updated ${account.displayName}: ⚡${Math.floor(accountData.charges)}/${Math.floor(accountData.max)} 💧${Math.floor(accountData.droplets)}`); + + } catch (error) { + console.warn(`⚠️ [FETCH] Failed to fetch data for ${account.displayName}:`, error); + } + } + + // Switch back to the original current account if there was one + if (originalCurrentAccount) { + console.log(`🔙 [FETCH] Switching back to original current account: ${originalCurrentAccount.displayName}`); + try { + await switchToSpecificAccount(originalCurrentAccount.token, originalCurrentAccount.displayName); + //await Utils.sleep(300); + + // Mark it as current again and sync index + accountManager.updateAccountData(originalCurrentAccount.token, { + isCurrent: true + }); + const list = accountManager.getAllAccounts(); + const idxOriginal = list.findIndex(acc => acc.token === originalCurrentAccount.token); + if (idxOriginal !== -1 && typeof accountManager.setCurrentIndex === 'function') { + accountManager.setCurrentIndex(idxOriginal); + state.accountIndex = idxOriginal; + } + } catch (error) { + console.warn(`⚠️ [FETCH] Failed to switch back to original account:`, error); + } + } + + console.log(`🎯 [FETCH] Completed fetching fresh data for all accounts`); + try { ChargeModel.seedFromAccounts(accountManager.getAllAccounts()); } catch {} + } + + // Render the accounts list with fresh data + renderAccountsList(); + + } catch (error) { + console.error('❌ [FETCH] Error fetching account details:', error); + if (accountsListArea) { + accountsListArea.innerHTML = `
    Error loading accounts.
    `; + } + } finally { + state.isFetchingAllAccounts = false; + if (refreshBtn) { + refreshBtn.innerHTML = ''; + refreshBtn.disabled = false; + } + } + } + + // Function to update current account charges in the account list + async function updateCurrentAccountInList() { + if (accountManager.getAccountCount() === 0) return; + try { + const current = accountManager.getCurrentAccount(); + const node = ChargeModel.get(current?.token); + if (!current || !node) return; + state.displayCharges = Math.floor(node.charges || 0); + state.preciseCurrentCharges = node.charges || 0; + await updateStats(); + // Refresh server-backed fields (droplets/max) to avoid stale/incorrect UI + try { + const live = await WPlaceService.getCharges(); + accountManager.updateAccountData(current.token, { + Charges: Math.floor(node.charges || 0), + Max: Math.floor(live.max || node.max || current.Max || 0), + Droplets: Math.floor(live.droplets || 0) + }); + } catch {} + renderAccountsList(); + } catch (e) { + console.warn('⚠️ updateCurrentAccountInList failed:', e); + } + } + + // Function to update current account spotlight when switching during painting + async function updateCurrentAccountSpotlight() { + if (accountManager.getAccountCount() === 0) return; + try { + const currentAccountData = await WPlaceService.getCharges(); + console.log("Current account after switch:", currentAccountData); + console.log(`🔍 Switched to account with ID: ${currentAccountData.id}`); + + const accounts = accountManager.getAllAccounts(); + const idx = accounts.findIndex(acc => acc.ID === currentAccountData.id); + + if (idx !== -1) { + const currentAccount = accounts[idx]; + const currentAccountInfo = await WPlaceService.fetchCheck(); + + // Sync manager index and flags to actual account + if (typeof accountManager.setCurrentIndex === 'function') { + accountManager.setCurrentIndex(idx); + } else { + accounts.forEach((acc, i) => (acc.isCurrent = i === idx)); + } + + accountManager.updateAccountData(currentAccount.token, { + isCurrent: true, + Charges: Math.floor(currentAccountData.charges), + Max: Math.floor(currentAccountData.max), + Droplets: Math.floor(currentAccountData.droplets), + displayName: currentAccountInfo.Username || currentAccountInfo.name || currentAccount.displayName + }); + + // Mirror to UI state for consistency + state.displayCharges = Math.floor(currentAccountData.charges); + state.preciseCurrentCharges = currentAccountData.charges; + state.cooldown = currentAccountData.cooldown; + state.accountIndex = idx; + + renderAccountsList(); + console.log(`🎯 Updated current account spotlight: ${currentAccount.displayName}`); + } else { + console.warn(`⚠️ Could not find switched account with ID ${currentAccountData.id} in account list`); + } + + // Re-render the account list to show new current account + renderAccountsList(); + + } catch (error) { + console.warn('⚠️ Failed to update account spotlight:', error); + } + } + + function renderAccountsList() { + const accountsListArea = document.getElementById('accountsListArea'); + if (!accountsListArea) return; + + accountsListArea.innerHTML = ''; + + const accounts = accountManager.getAllAccounts(); + console.log(`🔍 [RENDER] Rendering ${accounts.length} accounts`); + + // Debug: Log account data to see what we're working with + accounts.forEach((account, index) => { + console.log(`📊 [RENDER] Account ${index + 1}: ${account.displayName} - ⚡${account.Charges}/${account.Max} 💧${account.Droplets} ${account.isCurrent ? '(CURRENT)' : ''}`); + }); + + if (accounts.length === 0) { + // Don't show any placeholder - just leave empty + console.log(`📝 [RENDER] No accounts to display`); + return; + } + + accounts.forEach((account, index) => { + const item = createAccountItem(account, index); + accountsListArea.appendChild(item); + }); + + console.log(`✅ [RENDER] Successfully rendered ${accounts.length} accounts`); + } + + function createAccountItem(account, index) { + const item = document.createElement('div'); + + // Determine if this is the current account + const isCurrentAccount = account.isCurrent; + const isNextInSequence = accountManager.currentIndex !== -1 && + ((accountManager.currentIndex + 1) % accountManager.getAccountCount()) === index; + + let itemClasses = 'wplace-account-item'; + if (isCurrentAccount) { + itemClasses += ' current'; + } else if (isNextInSequence) { + itemClasses += ' next-in-sequence'; + } + + item.className = itemClasses; + + // Create ordering number element with 1-based index for user display + const orderNumber = document.createElement('div'); + orderNumber.className = 'wplace-account-number'; + orderNumber.textContent = index + 1; // Show 1-based index for user-friendly display + + // Add visual indicator for current position in sequence + if (isCurrentAccount) { + orderNumber.style.background = '#2ecc71'; // Green color + orderNumber.style.color = 'white'; + orderNumber.style.boxShadow = '0 0 10px rgba(46, 204, 113, 0.8)'; + } else if (isNextInSequence) { + orderNumber.style.background = '#f39c12'; // Orange color for next + orderNumber.style.color = 'white'; + orderNumber.style.boxShadow = '0 0 8px rgba(243, 156, 18, 0.6)'; + } + + // Create account details + const details = document.createElement('div'); + details.className = 'wplace-account-details'; + + const accountName = document.createElement('div'); + accountName.className = 'wplace-account-name'; + const displayName = account.displayName || account.name || `Account ${index + 1}`; + accountName.textContent = displayName; + accountName.title = displayName; + + const accountStats = document.createElement('div'); + accountStats.className = 'wplace-account-stats'; + + // Safely handle undefined values + const charges = account.Charges !== undefined ? Math.floor(account.Charges) : 0; + const max = account.Max !== undefined ? Math.floor(account.Max) : 0; + const droplets = account.Droplets !== undefined ? Math.floor(account.Droplets) : 0; + + accountStats.innerHTML = ` + ${charges}/${max} + ${droplets} + `; + + details.appendChild(accountName); + details.appendChild(accountStats); + + // Add status indicators + const status = document.createElement('div'); + status.className = 'wplace-account-status'; + if (isCurrentAccount) { + status.innerHTML = ''; + } else if (isNextInSequence) { + status.innerHTML = ''; + } + + item.appendChild(orderNumber); + item.appendChild(details); + item.appendChild(status); + + return item; + } + + // SIMPLIFIED ACCOUNT SWITCHING + async function switchToNextAccount(accounts) { + console.log(`🔄 [SWITCH] Starting account switch`); + + // Debounce rapid consecutive switches when no painting happened + try { + const now = Date.now(); + const last = state.lastSwitchAt || 0; + const minGap = state.minMsBetweenSwitches || 3000; + const painted = state.paintedSinceSwitch || 0; + if (now - last < minGap && painted === 0) { + console.log(`⏳ [SWITCH] Debounced rapid switch (Δ${now - last}ms < ${minGap}ms and paintedSinceSwitch=${painted}).`); + return false; + } + } catch {} + + // Validate we have accounts + if (accountManager.getAccountCount() === 0) { + console.error('❌ No accounts available for switching'); + return false; + } + + // Capture the pre-switch (current) account to detect stale reads + const preSwitchAccount = accountManager.getCurrentAccount(); + const previousKnownId = preSwitchAccount?.ID || null; + + // Get next account using simplified manager + const nextAccount = accountManager.switchToNext(); + if (!nextAccount) { + console.error('❌ Failed to get next account'); + return false; + } + + console.log(`🎯 [SWITCH] Switching to: ${nextAccount.displayName} (index ${accountManager.currentIndex})`); + + // Ensure token exists + if (!nextAccount.token) { + console.error(`❌ Missing token for account: ${nextAccount.displayName}`); + return false; + } + + console.log(`� [SWITCH] Using token: ${nextAccount.token.substring(0, 20)}...`); + + // Perform the account switch + try { + await swapAccountTrigger(nextAccount.token); + + // Update account index for backward compatibility + state.accountIndex = accountManager.currentIndex; + + console.log(`✅ [SWITCH] Successfully switched to ${nextAccount.displayName}`); + + // Verify backend reflects the new account to avoid stale reads + // Strategy: poll /me until we see an ID different from the pre-switch account's ID + // Only then accept and (if needed) assign the next account's ID. + let verifiedId = null; + for (let attempt = 1; attempt <= 8 && !verifiedId; attempt++) { + try { + const currentAccountData = await WPlaceService.getCharges(); + const curId = currentAccountData?.id; + if (!curId) { + await Utils.sleep(500); + continue; + } + + if (previousKnownId && curId === previousKnownId) { + console.log(`⏳ [SWITCH] Still seeing previous ID ${curId} (attempt ${attempt}/8), waiting...`); + await Utils.sleep(500); + continue; + } + + // If we had a stored ID for the target and it's different from what we see now, + // prefer the live value (curId) and update the stored ID. + if (nextAccount.ID && nextAccount.ID !== curId) { + console.log(`🔁 [SWITCH] Updating stored ID for ${nextAccount.displayName}: ${nextAccount.ID} → ${curId}`); + } + + verifiedId = curId; + break; + } catch (e) { + await Utils.sleep(500); + } + } + + if (!verifiedId) { + console.warn('⚠️ [SWITCH] Could not verify account change via /me after cookie set; skipping ID update but proceeding cautiously.'); + } else { + // Persist verified ID for the next account + if (nextAccount.ID !== verifiedId) { + accountManager.updateAccountData(nextAccount.token, { ID: verifiedId }); + } + } + + // Update the account status and UI after successful switch + await updateCurrentAccountInList(); + + // Record switch time and reset painted counter to prevent rapid bouncing + state.lastSwitchAt = Date.now(); + state.paintedSinceSwitch = 0; + + return true; + } catch (error) { + console.error('❌ [SWITCH] Account switch failed:', error); + return false; + } + } + + // SIMPLIFIED helper function for specific account switching + async function switchToSpecificAccount(token, accountName) { + console.log(`🔄 [SPECIFIC SWITCH] Attempting to switch to account: ${accountName}`); + + // Debounce rapid consecutive switches when no painting happened + try { + const now = Date.now(); + const last = state.lastSwitchAt || 0; + const minGap = state.minMsBetweenSwitches || 3000; + const painted = state.paintedSinceSwitch || 0; + if (now - last < minGap && painted === 0) { + console.log(`⏳ [SPECIFIC SWITCH] Debounced rapid switch (Δ${now - last}ms < ${minGap}ms and paintedSinceSwitch=${painted}).`); + return false; + } + } catch {} + + if (!token) { + console.error('❌ [SPECIFIC SWITCH] Missing token'); + return false; + } + console.log(`🔑 [SPECIFIC SWITCH] Using token: ${token.substring(0, 20)}...`); + + // Capture previous account ID to detect stale responses + let previousId = null; + try { + const prev = await WPlaceService.getCharges(); + previousId = prev?.id || null; + } catch {} + + const ok = await swapAccountTrigger(token); + if (!ok) { + console.error('❌ [SPECIFIC SWITCH] Cookie confirmation failed'); + return false; + } + + // Poll /me until it reflects a different ID than the previous account + let verifiedId = null; + for (let attempt = 1; attempt <= 8 && !verifiedId; attempt++) { + try { + const currentAccountData = await WPlaceService.getCharges(); + const curId = currentAccountData?.id; + if (!curId) { + await Utils.sleep(500); + continue; + } + if (previousId && curId === previousId) { + console.log(`⏳ [SPECIFIC SWITCH] Still seeing previous ID ${curId} (attempt ${attempt}/8), waiting...`); + await Utils.sleep(500); + continue; + } + verifiedId = curId; + break; + } catch { + await Utils.sleep(500); + } + } + + if (!verifiedId) { + console.warn('⚠️ [SPECIFIC SWITCH] Could not verify account change via /me; proceeding.'); + } else { + // Persist ID and mark as current in AccountManager + accountManager.updateAccountData(token, { ID: verifiedId, isCurrent: true }); + } + + // Sync manager index to the token we explicitly switched to + try { + const list = accountManager.getAllAccounts(); + const idxByToken = list.findIndex(acc => acc.token === token); + if (idxByToken !== -1 && typeof accountManager.setCurrentIndex === 'function') { + accountManager.setCurrentIndex(idxByToken); + state.accountIndex = idxByToken; + } + } catch {} + + // Fetch fresh stats for UI/state + const { charges, cooldown, droplets, max } = await WPlaceService.getCharges(); + try { ChargeModel.setFromServer(token, charges, max); } catch {} + state.displayCharges = Math.floor(charges); + state.preciseCurrentCharges = charges; + state.cooldown = cooldown; + Utils.performSmartSave(); + await updateStats(); + + // Update the account status and UI after successful switch + await updateCurrentAccountSpotlight(); + + console.log(`✅ [SPECIFIC SWITCH] Switched to ${accountName} with ${Math.floor(charges)} charges`); + return true; + } + + // Wait for dependencies before initializing UI + async function waitForDependenciesAndInitialize() { + // Wait for all global managers to be available + let attempts = 0; + const maxAttempts = 50; // 5 seconds max wait + + while (attempts < maxAttempts) { + const managers = { + utilsManager: window.globalUtilsManager, + imageProcessor: window.globalImageProcessor, + overlayManager: window.globalOverlayManager, + tokenManager: window.globalTokenManager + }; + + const missingManagers = Object.entries(managers) + .filter(([name, manager]) => !manager) + .map(([name]) => name); + + if (missingManagers.length === 0) { + console.log('✅ All global managers are available, initializing UI...'); + break; + } + + console.log(`⏳ Waiting for managers: ${missingManagers.join(', ')} (attempt ${attempts + 1}/${maxAttempts})`); + await new Promise(resolve => setTimeout(resolve, 100)); + attempts++; + } + + if (attempts >= maxAttempts) { + console.warn('⚠️ Some global managers not available after waiting, proceeding anyway...'); + console.log('Available managers:', { + utilsManager: !!window.globalUtilsManager, + imageProcessor: !!window.globalImageProcessor, + overlayManager: !!window.globalOverlayManager, + tokenManager: !!window.globalTokenManager + }); + } + + return createUI(); + } + + // Helper: iterate over accounts to find one with enough charges; otherwise pick best cooldown + async function selectAndSwitchToAccountWithCharges(minRequired = 1) { + try { + const total = accountManager.getAccountCount(); + if (total <= 1) return false; + const threshold = Math.max(1, minRequired || 1); + + const startIdx = accountManager.currentIndex; + let candidate = null; // {token,name,idx} + let bestWait = Infinity; // ms to reach threshold + + for (let step = 1; step <= total - 1; step++) { + const idx = (startIdx + step) % total; + const acc = accountManager.getAccountByIndex(idx); + if (!acc || !acc.token) continue; + const node = ChargeModel.get(acc.token); + const localCharges = Math.floor(node?.charges || 0); + + console.log(`🔍 [SEARCH] Checking locally ${acc.displayName}: ⚡${localCharges}/${node?.max ?? 0}`); + if (localCharges >= threshold) { + candidate = { token: acc.token, name: acc.displayName, idx }; + break; + } else { + const eta = ChargeModel.predictTimeToReach(acc.token, threshold); + if (eta < bestWait) { + bestWait = eta; + candidate = { token: acc.token, name: acc.displayName, idx }; + } + } + } + + if (candidate && ChargeModel.get(candidate.token)?.charges >= threshold) { + console.log(`✅ [SEARCH] Local model found eligible account: ${candidate.name}`); + const ok = await switchToSpecificAccount(candidate.token, candidate.name); + return !!ok; + } + + // None eligible yet – do not switch now. Caller may enter cooldown. + if (candidate) { + console.log(`🕒 [SEARCH] No accounts meet threshold. Best candidate: ${candidate.name} in ~${Utils.msToTimeText(bestWait)}`); + } else { + console.log('🕒 [SEARCH] No candidate accounts available.'); + } + return false; + } catch (e) { + console.warn('⚠️ selectAndSwitchToAccountWithCharges failed:', e); + return false; + } + } + + waitForDependenciesAndInitialize().then(() => { + // Generate token automatically after UI is ready + setTimeout(initializeTokenGenerator, 1000); + + // Quick initial account load from cache + setTimeout(async () => { + console.log('🔄 Initial account load from cache...'); + try { + await accountManager.loadAccounts(); + // Seed and start local charge model regardless of count + try { + state.chargeModel = ChargeModel; + ChargeModel.seedFromAccounts(accountManager.getAllAccounts()); + ChargeModel.start(); + console.log('⚡ Local ChargeModel started (tick +1 per 30s for all accounts)'); + } catch (e) { console.warn('ChargeModel init failed:', e); } + + if (accountManager.getAccountCount() > 0) { + console.log(`✅ Loaded ${accountManager.getAccountCount()} cached accounts`); + renderAccountsList(); + } else { + console.log('📭 No cached accounts found'); + } + } catch (error) { + console.warn('⚠️ Initial account load failed:', error); + } + }, 500); + + // Auto-refresh account list on startup (with extension communication) + setTimeout(() => { + console.log('🔄 Auto-refreshing account list on startup...'); + fetchAllAccountDetails(); + }, 2000); + + // Attach advanced color matching listeners (resize dialog) + const advancedInit = () => { + const chromaSlider = document.getElementById('chromaPenaltyWeightSlider'); + const chromaValue = document.getElementById('chromaWeightValue'); + const resetBtn = document.getElementById('resetAdvancedColorBtn'); + const algoSelect = document.getElementById('colorAlgorithmSelect'); + const chromaToggle = document.getElementById('enableChromaPenaltyToggle'); + const transInput = document.getElementById('transparencyThresholdInput'); + const whiteInput = document.getElementById('whiteThresholdInput'); + const ditherToggle = document.getElementById('enableDitheringToggle'); + + // Ensure dithering checkbox matches state (explicit sync on init) + if (ditherToggle) { + ditherToggle.checked = state.ditheringEnabled; + console.log(`🎨 Dithering initialized: ${state.ditheringEnabled ? 'ON' : 'OFF'}`); + } + + if (algoSelect) + algoSelect.addEventListener('change', (e) => { + state.colorMatchingAlgorithm = e.target.value; + saveBotSettings(); + _updateResizePreview(); + }); + if (chromaToggle) + chromaToggle.addEventListener('change', (e) => { + state.enableChromaPenalty = e.target.checked; + saveBotSettings(); + _updateResizePreview(); + }); + if (chromaSlider && chromaValue) + chromaSlider.addEventListener('input', (e) => { + state.chromaPenaltyWeight = parseFloat(e.target.value) || 0.15; + chromaValue.textContent = state.chromaPenaltyWeight.toFixed(2); + saveBotSettings(); + _updateResizePreview(); + }); + if (transInput) + transInput.addEventListener('change', (e) => { + const v = parseInt(e.target.value, 10); + if (!isNaN(v) && v >= 0 && v <= 255) { + state.customTransparencyThreshold = v; + CONFIG.TRANSPARENCY_THRESHOLD = v; + saveBotSettings(); + _updateResizePreview(); + } + }); + if (whiteInput) + whiteInput.addEventListener('change', (e) => { + const v = parseInt(e.target.value, 10); + if (!isNaN(v) && v >= 200 && v <= 255) { + state.customWhiteThreshold = v; + CONFIG.WHITE_THRESHOLD = v; + saveBotSettings(); + _updateResizePreview(); + } + }); + if (ditherToggle) + ditherToggle.addEventListener('change', (e) => { + state.ditheringEnabled = e.target.checked; + saveBotSettings(); + _updateResizePreview(); + }); + if (resetBtn) + resetBtn.addEventListener('click', () => { + state.colorMatchingAlgorithm = 'lab'; + state.enableChromaPenalty = true; + state.chromaPenaltyWeight = 0.15; + state.customTransparencyThreshold = CONFIG.TRANSPARENCY_THRESHOLD = 100; + state.customWhiteThreshold = CONFIG.WHITE_THRESHOLD = 250; + saveBotSettings(); + const a = document.getElementById('colorAlgorithmSelect'); + if (a) a.value = 'lab'; + const ct = document.getElementById('enableChromaPenaltyToggle'); + if (ct) ct.checked = true; + if (chromaSlider) chromaSlider.value = 0.15; + if (chromaValue) chromaValue.textContent = '0.15'; + if (transInput) transInput.value = 100; + if (whiteInput) whiteInput.value = 250; + _updateResizePreview(); + Utils.showAlert(Utils.t('advancedColorSettingsReset'), 'success'); + }); + }; + // Delay to ensure resize UI built + setTimeout(advancedInit, 500); + + // Add cleanup on page unload + window.addEventListener('beforeunload', () => { + Utils.cleanupTurnstile(); + }); + }); +})(); + +// === Async coordinate generation (off-main-thread) === +async function generateCoordinatesAsync( + width, + height, + mode, + direction, + snake, + blockWidth, + blockHeight, + startFromX = 0, + startFromY = 0 +) { + try { + if (typeof Worker === 'undefined') { + // Environment does not support Web Workers – fall back + return generateCoordinates( + width, + height, + mode, + direction, + snake, + blockWidth, + blockHeight, + startFromX, + startFromY + ); + } + + const workerCode = `self.onmessage = function(e) { + const { width, height, mode, direction, snake, blockWidth, blockHeight, startFromX, startFromY } = e.data || {}; + + function generate() { + let coords = []; + + // Determine traversal direction + let xStart, xEnd, xStep; + let yStart, yEnd, yStep; + switch (direction) { + case 'top-left': + xStart = 0; xEnd = width; xStep = 1; + yStart = 0; yEnd = height; yStep = 1; + break; + case 'top-right': + xStart = width - 1; xEnd = -1; xStep = -1; + yStart = 0; yEnd = height; yStep = 1; + break; + case 'bottom-left': + xStart = 0; xEnd = width; xStep = 1; + yStart = height - 1; yEnd = -1; yStep = -1; + break; + case 'bottom-right': + xStart = width - 1; xEnd = -1; xStep = -1; + yStart = height - 1; yEnd = -1; yStep = -1; + break; + default: + throw new Error('Unknown direction: ' + direction); + } + + if (mode === 'rows') { + let rowIndex = 0; + for (let y = yStart; y !== yEnd; y += yStep) { + if (snake && rowIndex % 2 !== 0) { + for (let x = xEnd - xStep; x !== xStart - xStep; x -= xStep) { + coords.push([x, y]); + } + } else { + for (let x = xStart; x !== xEnd; x += xStep) { + coords.push([x, y]); + } + } + rowIndex++; + } + } else if (mode === 'columns') { + let colIndex = 0; + for (let x = xStart; x !== xEnd; x += xStep) { + if (snake && colIndex % 2 !== 0) { + for (let y = yEnd - yStep; y !== yStart - yStep; y -= yStep) { + coords.push([x, y]); + } + } else { + for (let y = yStart; y !== yEnd; y += yStep) { + coords.push([x, y]); + } + } + colIndex++; + } + } else if (mode === 'circle-out') { + const cx = Math.floor(width / 2); + const cy = Math.floor(height / 2); + const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); + for (let r = 0; r <= maxRadius; r++) { + for (let y = cy - r; y <= cy + r; y++) { + for (let x = cx - r; x <= cx + r; x++) { + if (x >= 0 && x < width && y >= 0 && y < height) { + const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); + if (dist === r) coords.push([x, y]); + } + } + } + } + } else if (mode === 'circle-in') { + const cx = Math.floor(width / 2); + const cy = Math.floor(height / 2); + const maxRadius = Math.ceil(Math.sqrt(cx * cx + cy * cy)); + for (let r = maxRadius; r >= 0; r--) { + for (let y = cy - r; y <= cy + r; y++) { + for (let x = cx - r; x <= cx + r; x++) { + if (x >= 0 && x < width && y >= 0 && y < height) { + const dist = Math.max(Math.abs(x - cx), Math.abs(y - cy)); + if (dist === r) coords.push([x, y]); + } + } + } + } + } else if (mode === 'blocks' || mode === 'shuffle-blocks') { + const blocks = []; + for (let by = 0; by < height; by += blockHeight) { + for (let bx = 0; bx < width; bx += blockWidth) { + const block = []; + for (let y = by; y < Math.min(by + blockHeight, height); y++) { + for (let x = bx; x < Math.min(bx + blockWidth, width); x++) { + block.push([x, y]); + } + } + blocks.push(block); + } + } + if (mode === 'shuffle-blocks') { + for (let i = blocks.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const tmp = blocks[i]; + blocks[i] = blocks[j]; + blocks[j] = tmp; + } + } + for (const block of blocks) { + for (let i = 0; i < block.length; i++) { + coords.push(block[i]); + } + } + } else { + throw new Error('Unknown mode: ' + mode); + } + + // Resume from specified position if provided + if (startFromX > 0 || startFromY > 0) { + let startIndex = -1; + for (let i = 0; i < coords.length; i++) { + const c = coords[i]; + if (c[0] === startFromX && c[1] === startFromY) { + startIndex = i; + break; + } + } + if (startIndex >= 0) { + coords = coords.slice(startIndex); + } + } + + return coords; + } + + try { + const coords = generate(); + self.postMessage({ ok: true, coords }); + } catch (err) { + self.postMessage({ ok: false, error: err && (err.message || String(err)) }); + } +};`; + + const blob = new Blob([workerCode], { type: 'application/javascript' }); + const url = URL.createObjectURL(blob); + + return await new Promise((resolve) => { + const worker = new Worker(url); + const cleanup = () => { + URL.revokeObjectURL(url); + try { worker.terminate(); } catch (e) { } + }; + + worker.onmessage = (e) => { + const { ok, coords, error } = e.data || {}; + cleanup(); + if (ok && Array.isArray(coords)) { + resolve(coords); + } else { + console.warn('Coordinate worker failed, falling back to sync:', error); + resolve( + generateCoordinates( + width, + height, + mode, + direction, + snake, + blockWidth, + blockHeight, + startFromX, + startFromY + ) + ); + } + }; + + worker.onerror = (err) => { + console.warn('Coordinate worker error, falling back to sync:', err && (err.message || err)); + cleanup(); + resolve( + generateCoordinates( + width, + height, + mode, + direction, + snake, + blockWidth, + blockHeight, + startFromX, + startFromY + ) + ); + }; + + worker.postMessage({ + width, + height, + mode, + direction, + snake, + blockWidth, + blockHeight, + startFromX, + startFromY, + }); + }); + } catch (e) { + console.warn('Failed to start coordinate worker, using sync generation:', e); + return generateCoordinates( + width, + height, + mode, + direction, + snake, + blockWidth, + blockHeight, + startFromX, + startFromY + ); + } +}