From 99e23b9a539fdce2e7acf1c2dd85b036e44db93b Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Mon, 28 Sep 2026 08:58:31 +0000 Subject: [PATCH] fix(frontend): use act1/pal.pl2 and BIGMENU/radiobutton.dc6 for Battle.net Lobby per D2WinPalette.cpp & D2Multi.dll --- public/ui/frontend/bg-waiting-room.png | Bin 110738 -> 110738 bytes public/ui/frontend/btn-chatleft.png | Bin 2599 -> 2599 bytes public/ui/frontend/btn-chatright.png | Bin 0 -> 2482 bytes public/ui/frontend/btn-chatrighttop.png | Bin 0 -> 3477 bytes public/ui/frontend/btn-create-cancel.png | Bin 4965 -> 4965 bytes public/ui/frontend/btn-create-game.png | Bin 7764 -> 7764 bytes public/ui/frontend/btn-game.png | Bin 6633 -> 6633 bytes public/ui/frontend/clickbox.png | Bin 1239 -> 1239 bytes public/ui/frontend/create-game-bg.png | Bin 53401 -> 53401 bytes public/ui/frontend/gembutton.png | Bin 1131 -> 1131 bytes public/ui/frontend/grey-level-box.png | Bin 1166 -> 1166 bytes public/ui/frontend/joingameclickbox.png | Bin 1210 -> 1210 bytes public/ui/frontend/manifest.json | 2 +- public/ui/frontend/radiobutton.png | Bin 1346 -> 1312 bytes public/ui/frontend/textbox.png | Bin 1741 -> 1757 bytes scripts/pack-frontend-ui.ts | 41 ++++++++++++++--------- src/frontend/frontend-renderer.ts | 34 ++++++++++++------- 17 files changed, 48 insertions(+), 29 deletions(-) create mode 100644 public/ui/frontend/btn-chatright.png create mode 100644 public/ui/frontend/btn-chatrighttop.png diff --git a/public/ui/frontend/bg-waiting-room.png b/public/ui/frontend/bg-waiting-room.png index 5ebbee675910a0bf7be0f7bf6ce10ce65fefded3..0a1a8363cb50da919d3d86179a73676c2b7b8126 100644 GIT binary patch delta 116 zcmV-)0E_>U;Rcf72C&QmVf+Aq5EKX$90(L32pA*`AS?_ZG#D^A8~`9h7yxJp2m}-q z5EvK~92^uJAP^)V7$hhZC@3H-C?p^(Ffc46G%zSQG%PSYKtMb+NJKbLOhjB*OkiA8 WXk=Lb|Noc!%gci;1Gg;$0cEYo%NP5*Zi-7#Ktt7$g`NWEfZ!ICvBo7&I7IG#D6k7&vrT1aue}40uEg z7&t5hBuqF&ELa3=SVSB|WNbJjTqIN+L=;>EWIRMvd=zv%Bs2nKbOIC%LNrVQbSy&t U|Np;YpX2#UD07>T-ZvX%Q diff --git a/public/ui/frontend/btn-chatleft.png b/public/ui/frontend/btn-chatleft.png index 854bd6e461f953e22915e5d15e5d9c26c1b82b25..1be4ac210fa072485c0626a8c426762e6d903ab0 100644 GIT binary patch delta 110 zcmZ23vRq`t8K%TP3=IMz93nCtA_^Q5Dm)50JPIZf1{N|53N8{185|reA|e735+X7( zA~FgBDhd)R8X_7R3OX7p3OWV`Iw~dx8Wtux1~v{3HYOe}76CpkF%doqF(DZ#5&!@H OpZ@#w>CL*#zt{k?1{)3l delta 110 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 kOnsOfN-KHq)$ literal 0 HcmV?d00001 diff --git a/public/ui/frontend/btn-chatrighttop.png b/public/ui/frontend/btn-chatrighttop.png new file mode 100644 index 0000000000000000000000000000000000000000..1adb12a0dfa3d5d049fe5b3eb4b32f24bf610207 GIT binary patch literal 3477 zcmV;G4QldwkN^OTND#aL0MLXW^u%n8d{C^MWDE=l6c7*`92_Vl z94ss>JUB2oI5&fI6kH?-R5%z^I3#Qs5NIqATtp;rBp7HsBz!CkWK1k@NCL^QNaAeeAi zpm;#MU>ux;NW@fB$ZR02d|0rENXUFt;BX+goK*ZQ0KklJ%$QK*gfQT6aL|}|_=r60 zpg7pLWZiroE&h3I7py0SddIayeNd2NMN{382kWq++2*%e4zY@3=Ak37)SsBSU40! z5F}_QJY*;+cuWw0I81~vFqBAOj5u7NP*AK)Y^+pxyd+@QWO&eIkl=uz+@v7kc4!sh;WdQkerl+fRwnPprEj*v!oQ#pj0_1^ow>g`?qzWu`9Pp`c`mw%JK8*S_zF1?pds>g4=eDlRqAK&^}@1u8K{>t8i z`L};Q|GO7%DWxu|rTJexI&vdl?EMy3%6|BlAKva=ynL~z)UVHf?J+wY-%`^rYU9Yai@EYE^?(1oc}c0>)mKlA-@owigf|} z>a}aHul{i5-#=NpkmpbS^U#f#ZhmJpP-?QI76ms}4^u1c~SC1SiPZg8*)ed@xV`NSXl zO(RmW?=a(1-tS~; z9Bg7<^`x7(uC^XiK|B&z#{6p#4pY>!A4H`Kse(E59X7SFEwsT z!y4s8wPs>>hlv_vg%Ax!#r3-*z@4^{Yd6fp2nexYNh%!Nov~<(;SrXI zQ_m!v0tg4ggr2z&kr-tW$fF@(xj{Y^I#gWPl#U;p8vsDU#Jo*D1lNI%k?^f{m}QKb zlO}W>Fx}udM*5s2Q!(0!t;MO-})wm3qoLueg-fD+8Z6dHgj2=1^iVNwWc@Js`o}v{4WFYk zX55C>gJ8fUzhKe>m9&nuMxO{E@>K7K2_*7HfV3WqVSPYqF zwy?a01ALqU?)Km&rj~|egOkm*>6FR*L(;7=AUTOE!6+PJJUE3h3}#L%itN#&7J1te ze2zJHCXNsiQ)Nz7%8{85Je2kRGNw+}fQ0}lOe+%xX*eV57Rd>hKu^+M;#`PXxV6Uf z%x4pL6$5BbE5ounta6RCWIYVpvLl{00NlA_x~5NAeLx5&N)>}55=r&NXy`XnBNB0^ zH8~)q*+3D9&|4A(=$6hE{Kt-=apJKhPcDBMQxT8yMYGlmQfNlrUA4rF(* z6)>qG$g73SI!b=BWE1Y=tWA{q!$VKb!6^_DPOfWaCltTVm0fWv6kh_JkuqTo;y_?k z(l;;{HyUjxR2`qdiU%Q1L<%NdN2u2hELw+hf=FvMDQd=6w+&E6xE>yjIci)btq`+w zEu_!mL`spPsbWgP>9%$4Q@DC#2-8WD?b52v;#JJDO5#-}3oixSh?Aq#W8P$87Kox6 z770|61Hd#D!7)(Bz`l|C;~B%)*pp2Aqb5Nf;0`+tNZPcLpBjqT1nLujp-|8Zf_G>= zs1XelFYHvJMXF2U%E$}=vrnDhA)Ssg5w}6`ty>F{&08HOfV;Jgoe!7Z$OLIZBbkS( zl=+%rn81)&8)}q}2<~xxhC?hqOUb-H(yDiZWyXS!aSMGbsexRZ3QN}ZM-x~Ab7ztT z!$?!(Af~jInFpA(+tI5#R3|BfWyhjQUTU4w%xjz%7bwX_MMJU7)FG@PJte1+U7{a2 zlst@$#Kp`!nJ|enwUnVq7aRsL9FamL|O+)@$J9bnE*AW8ntn8G*CuH|a+&_vFK@u${Lre|!@ zgmLa&kk{Z>UL|$n$RdSH+L&c!xQ&vcTvu2VtWQ1MtSYD)4!J%W4L}i73)BtBguCjA zJx0n|atv(O?K6M?zWZPi9> z#^q+dqcC-MEoF_U(aZ^AjUxFRVyo)zRi_<|q(VY8lBp7~Vs91nY||(&4lXuG)T^C! zk*cihm4Z*J=rqPXes*uyY9d|}%y6;v7h_vn<3W7qnh3jp${}+@7sc^3GTZ^o10mWMwkwyYh@z9%V=BfPqX zad3$>CL*#76JhEh#K|) delta 110 zcmaE=_Ec@d8Ky)A1_1^J5e5bc1_l`h76lF-1qKEU1{Mtl1|0?t9Tou{1_lEj5d#Je z3jqle4iO6$0UH((2N4+?4ha_t6$cRo7XcX$5fvW=9S;eO02!SC1%nU`lK>rykpKVx OuUIG;yIGgnLI41gI1~{8 diff --git a/public/ui/frontend/btn-create-game.png b/public/ui/frontend/btn-create-game.png index 9a0a0b7516bf555778c91a1b414670a3db43c671..59928a88ab0a36a2cad18a180708b7023fda86bb 100644 GIT binary patch delta 110 zcmca&bH!%E8K%TP3=IMz93nCtA_^Q5Dm)50JPIZf1{N|53N8{185|reA|e735+X7( zA~FgBDhd)R8X_7R3OX7p3OWV`Iw~dx8Wtux1~v{3HYOe}76CpkF%doqF(DZ#5&!@H OpZ@#w>CL*#>e2xDhZ_0- delta 110 zcmca&bH!%E8Ky)A1_1^J5e5bc1_l`h76lF-1qKEU1{Mtl1|0?t9Tou{1_lEj5d#Je z3jqle4iO6$0UH((2N4+?4ha_t6$cRo7XcX$5fvW=9S;eO02!SC1%nU`lK>rykpKVx OuUIG;yIGf6T^azEHxv~B diff --git a/public/ui/frontend/btn-game.png b/public/ui/frontend/btn-game.png index 76d7fab78268ddda5e4ff71fed94aadf0a0795c2..52d2433fed5ba8d9178bedb9100759060d49e940 100644 GIT binary patch delta 110 zcmaE9{L*;C8K%TP3=IMz93nCtA_^Q5Dm)50JPIZf1{N|53N8{185|reA|e735+X7( zA~FgBDhd)R8X_7R3OX7p3OWV`Iw~dx8Wtux1~v{3HYOe}76CpkF%doqF(DZ#5&!@H OpZ@#w>CL*#d&B?*1skFO delta 110 zcmaE9{L*;C8Ky)A1_1^J5e5bc1_l`h76lF-1qKEU1{Mtl1|0?t9Tou{1_lEj5d#Je z3jqle4iO6$0UH((2N4+?4ha_t6$cRo7XcX$5fvW=9S;eO02!SC1%nU`lK>rykpKVx OuUIG;yIGfcj~D=`f41_lNO1}d$fpkQFI;Gm^l`t*JO`yYSrckg%0#S93c0F3rf0l*m* zJ)9x~9I9b#=af!kI!W~0lM5lL!c4MY zrBpM3HZ^q-b&R!xa8Y{q1>gF1HA;5_`Yh#oVjqUMsri%dpD2B3{BDvzP4Fel4lUo$ z%d0Vt&gi+u=e2!Vg~zRQaeP_Yw_S8yYFCzSCC`W4Z9F%fx}9~0*d4Vy#%{ZH=fb@; z1PBNQN`R3NdgOLfLK$J45F}iHKtc?lCSXAsjy`A$A_6a9GNCq_p-yO+1uR!Kr*T2k zp~*^COa{DRqt;Fqe7X_EzQ&HXk7c_P>(`+9s5Wo7`%E6sTjQp?PkeEs*Q@<-4~Nt8 z=yK-{Z`YM``ww@zy8YhYclB}Cz8+Sm=f?eu+;!|OYv<-}=C;tk0NjSs9?BTwy^M2y zQ`}MraT5i{ehHMw5&INM_Mld%lrjpn)}B$?c)q8swShHpXyYghqBMaZmsK_VkyYbSIc}P2P}g-;FYeoMv)FW9ci%l-E|;&buV23b|Ni{`=i7f6OV)7! delta 690 zcmWNPp^n=y06;y>z$Y1al7T^hfi)Rql0kq$K!8C&KtMo1CItip1Ox;GL~21mK|nx3 zK|v-JoTh+EI}mW7pkSb&;G`=!P*5;1aNxi|q}#m@czWPH-#y>;-2y>KAYceGf-Fh| zhMZx}s7;Wth~!u!s4Su+^(fYo_!w$w1sofjdNz*<@*Qp*8A&U#Xd+OgS)@h5NN$tF zh*GfJ6^)Ivz%G5Xl&lKnN{J%$ItP~vp4YMIJg-gE))70&c0TPguPb$zhkN5Z1bkD* zL+w4L*0%MJQS`guV-xRJ{_iHbmVDYqvkeYidD?`xR$a^Tys7`K+`ogqOxbnUzCM_@ zL-4xq=BH%d@1Y=6FzzzuV_+7FWk@7Kf0P$SHq@(}xK_^ADqHOjPTU9PQMMaDodPz4 z>LuyU%`mSpmLCEDVoePZxpXrr>wqkE&?>d|(@rNt7>+?PM)jjeFIj!g`s;Fd+3~q; zUx#7tr#bHWMLz7>!*O$dx5108OL#&rqk(kxm-@C`F6Vj zKmecsFaRt7Il>$O37`bP2FQlQ20&q|0Mdjxh-ye&__34aBKFlV;Zbgg%G+h;Pg Z?2xNSI-#wj_xJbvA78%z`u6$fr~jl|?C1ah diff --git a/public/ui/frontend/create-game-bg.png b/public/ui/frontend/create-game-bg.png index 32679a4cb7f5b17c282551d42518f5f2cb7263b2..6f8f8e1a910b8f1106535eed746aab772ff8787b 100644 GIT binary patch delta 112 zcmV-$0FVEfp#zzr1F*~jVf+Aq5EKX$90(L32pA*`AS?_ZG#D^A8~`9h7yxJp2m}-q z5EvK~92^uJAP^)V7$hhZC@3H-C?p^(Ffc46G%zSQG%PSYKtMb+NJKbLOhjB*OkiA8 SXk=Lb|Noc!%geJZ18mJC2OLWP delta 112 zcmbQaka^}p<_%|<5*Zi-7#Ktt7$g`NWEfZ!ICvBo7&I7IG#D6k7&vrT1aue}40uEg z7&t5hBuqF&ELa3=SVSB|WNbJjTqIN+L=;>EWIRMvd=zv%Bs2nKbOIC%LNrVQbSy&t Q|Np;YpCL*#c8mbwQ5wAf delta 110 zcmaFO@tR}98Ky)A1_1^J5e5bc1_l`h76lF-1qKEU1{Mtl1|0?t9Tou{1_lEj5d#Je z3jqle4iO6$0UH((2N4+?4ha_t6$cRo7XcX$5fvW=9S;eO02!SC1%nU`lK>rykpKVx OuUIG;yIGgnju8NU0Tb8& diff --git a/public/ui/frontend/grey-level-box.png b/public/ui/frontend/grey-level-box.png index 927a032c5bf25bd516fa0272dae3af4a08bd9bf9..a0bc0ec7be8487d56de7c7c323381c2ade9bde26 100644 GIT binary patch delta 110 zcmeCUhAHt6LxX?_hlmV^hysU%3Xg&gkAjJWfrSi%f{O%01_uX=h=_oMgouoc zh>U`Oih_iShKPoSf{uoYf{uZKj*5wahJ}fafsKQMjfsbgMSzb>OoUHDOh`sb#Q*>Q Or~f{Edb2KbA|n8kJsKzg delta 110 zcmeCUhAEMOL4bilgn>bVfkB3WMS+7yfq_ATfklIXL5G1uhebe#fx&=B#DIar zLO{ZVL&Snbz=lP{K}5!eL&8Nu#X&^DML@&?Gr-) diff --git a/public/ui/frontend/joingameclickbox.png b/public/ui/frontend/joingameclickbox.png index 3d220569712b8d3bfbb5b5215344281eb6ced3aa..761431e29d21deef836dedd551aa1443c5c9dbf8 100644 GIT binary patch delta 110 zcmdnRxr=kd8K%TP3=IMz93nCtA_^Q5Dm)50JPIZf1{N|53N8{185|reA|e735+X7( zA~FgBDhd)R8X_7R3OX7p3OWV`Iw~dx8Wtux1~v{3HYOe}76CpkF%doqF(DZ#5&!@H OpZ@#w>CL*#y^H|44H~Qf delta 110 zcmdnRxr=kd8Ky)A1_1^J5e5bc1_l`h76lF-1qKEU1{Mtl1|0?t9Tou{1_lEj5d#Je z3jqle4iO6$0UH((2N4+?4ha_t6$cRo7XcX$5fvW=9S;eO02!SC1%nU`lK>rykpKVx OuUIG;yIGgHmk|I}y%Wa( diff --git a/public/ui/frontend/manifest.json b/public/ui/frontend/manifest.json index f6c14e9..c6b457b 100644 --- a/public/ui/frontend/manifest.json +++ b/public/ui/frontend/manifest.json @@ -1,6 +1,6 @@ { "version": "1.13c", - "decodedDc6Count": 90, + "decodedDc6Count": 92, "animStrips": { "logoMainBlack": { "file": "logo-main-black.png", diff --git a/public/ui/frontend/radiobutton.png b/public/ui/frontend/radiobutton.png index fe2f8b951983718ce62c0b2066534a6a516abae9..aeecb4c35b4224d98e0223e17a478ab23cee79a5 100644 GIT binary patch delta 608 zcmV-m0-ycD3ZM$G%mRP>0Duq_2oxL$6d(u~Bn%)d3?MWZFgP3lAVe4dXb1=d6ci8` z7!({F6dWKBBp?_hC=@6tAS@^(AS^I2EF?5AC^$4MFg!p&JTyo|I8aPPTv$wCTvTXe zSpWb3m;1}h00001bW%=J06^y0W&i*I&PhZ;RCt_Ck^RAhp&af>3G+QV79Aa_OP}K`-9DL=Z(ta%i34K^sL#!NZmadnm5<;5iU$ zm#xJnB%2@W>_)*i3^SkkK4#wc4S)zUuj<4w^eS{hFg2*5GqFcvGUXaU3N%P87hRqC zM5fCb)90~4^y7d2UHcKq(gT-uN}Bz<`*k&&JOT`+0()bx*BjsLuOmzE7zB4@>vCYd zQB${`g-ZZ}Ue_J`cV(SK60JGY2Y5&U&W=-{-XAKU*?5&f;T zS_|PXmoPb*VJH{feDGp;!>e9W9-k;t+1#6YDkwElk{5pg@xF`sLbGG9E8c+3fl{#k zUUAV$$5#^=-e`L4)<58s1Fztv^js65*?=|SVj}EMV^2o0{RDxD#LubEGa_TA94kWr z!#Pa%#NB>j`M3PN2IqlkpY&_lUpxJA!7^#YBjZ*0V;3CM9bn-=&q`$O44H?`$WfQP zu=XSlz^_1;lQmBF^FBMw`r1CTwKkq0uf@88bendK2QlAqV8{TuQ(pe uhYDikgSXtv1cgEsmyvgJXY*}mxz9J(C9dkOF=96W0000 delta 642 zcmV-|0)73U3c?Do%mRM^01yBG6aWAi000~S1Rw|uAOHX;00bxi04x9qECdiN001xy z6fgh?I1m^#2oyL35Ih7FKolH22pB{dBtR4(L=YTE6eLU_EJzqAP#i2!ATU%YG*B!! zRR90~sG$*E00001bW%=J06^y0W&i*I@JU2LRCt_YY++zv=vjZ3w8ill!_PNo7{CC? z|8~^+=ufvI1_nl;ftpCy&%S&0ui3wU1TB!ae$vOd zhAV=Bb6y`xN;|-In8kTEc-h4eLqZZ z@wl=v|48Nf!Pm3eb;)AJhx#1f7}ys5`p?M9BV^6Py+>c;D&ywQf0E|2um{eNO=enr zaTXWDepz~cPRYn8m;TS$v-si%?f*iN{7bmRgJLt%_As=xJk;3B%eQoC7T;y5O%Gc@ z{2da!d{TUTm(K`2YymoN@y_6tS`w3kwH|-dU(5jFhyT)EFQ=vT*ya3UaBMQfGC;v% c2!+fC09y3AOiLJi7ytkO07*qoM6N<$g55Nkl?9#&-+JbP-Z-fE<4+jMM*f(H=<1tXN1Q$Yv;VgCcgB-JozJI>5L z@1#ln1)bZ_Zzs+3KJW8B?{|{Sq@Ri*Cx^7306d?tF>|8t{!f3IoStxp^(D?J-fyFT zFvdIuNB1Js5^xjV#hqtaJeb7ej3`1D4zxvJ*MUoTF>V2`y$!R-Ew(f2eKY_Um+zo} z7a4(I;9Y92Q1mZXGY`++DJ%jYMQ+$J;#(#R6Ga8H+yGJ{ncVJE;mE^*`tJ7|KYu=+ zM!l2aqxFmbB%^;exe|Mk))e7tt?57d=fAN!S{j-n7{MzDtpz?1V6fSZJvxH7vR63P z(2@%kE)lW?23zP_=otyy^8nNa?9poGt{8g$=Ik1#%tSZ`&y~wzJd}eh%ue<^KUUD! zi>6m0^6N%fmY^hGjI586AJ*n+T|W7r#UJI)>g)<7WJP~P4$iGiSF+sJK*^wTwq$_H z_%sCyb0&PF6!1ArbC!FXoHESwt5fY&k=%T9-_%n=wRHY4ArBC9k+{UQb?=E z?IDWF4qy8R<9@1w)PwOIh1rAh9pzZ$#O)!P)EcRAdx$E+Y}^(iNnZO_+$JJPUi-Cd z+%ERloCgv^3xBTX_>b!Er?blpfc*+S<(3n9nW%sCB1SRfL!SExnJD2EQ}CYkaWUHj#zl&`>@{8tRz^%=oobr2rz zFkUltzZ{#jYLE=>DK0o|tySMQdeMcQXZO z-#}YU{DM-LDuFX?^eGI8_~pp~w*WJ~dv=wLyxkkGB3%=H49T+pNNxKLdT{A3iwESLS=CBlWuvcH?e;@!Bq!dPnOddRGX-}RIH!W zUA~gG?y;z~H_dP&?%e$4(Z4Mp`9;-#_wZK40WY{DEfvXoF zY!ZQBnmm7&3!6kB7$xq8%^?_U!9S5>N|)R;!zK|75pI;i<`4vRoA$m4n?)e#;QFU= zN@12G5;liGu$$Ztn?o?@8(a^YLr`$chD{+5)ZTA~O(GD~-rq=`oEJ8pBq7+y58u=# zf!cq=O8o6-P~T6jpH8WPR|8AslR*mZBhutmp!I(hBT2ZLl7RHAP)@ZwOkWot4i0eh z`Hhz8Em4Mm66%z22B(~ z3Wr7Dh_4$T{v247rNkzQV?m2K>({*;Vy>;few>8^vGzd8;{pvf#;sM?12XZ(rq=N? z@g0Bd9F~z|@Jw2*oaptd8e!NebGPo1At74jo2~s4RD@Bw-3XA z8aS%I{lIH>VPM%~Zh}O4FYdr7f0pp2y+2zbL86|%((0YhwU`Cdxk##A{f)5Dh~pi` zcB1skwHrxW&);_GoOA#$VfBuo-YSRnsj(Lo{0*#IauCpBw^aZD002ovPDHLkV1kc% B)L{Ss diff --git a/scripts/pack-frontend-ui.ts b/scripts/pack-frontend-ui.ts index 4faf9d6..0ef2dd0 100644 --- a/scripts/pack-frontend-ui.ts +++ b/scripts/pack-frontend-ui.ts @@ -344,6 +344,7 @@ async function main(): Promise { const skyPl2 = decodePl2(await archives.read('data\\global\\palette\\sky\\pal.pl2')) const fecharPl2 = decodePl2(await archives.read('data\\global\\palette\\fechar\\pal.pl2')) + const act1Pl2 = decodePl2(await archives.read('data\\global\\palette\\act1\\pal.pl2')) const loadingPl2Bytes = await archives.read('data\\global\\palette\\loading\\pal.pl2') const loadingRgb = new Uint8Array(256 * 3) for (let i = 0; i < 256; i++) { @@ -411,7 +412,7 @@ async function main(): Promise { const waitingRoomBgDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\waitingroombkgd.dc6') const waitingRoomBgPixels = stitch800x600Background(waitingRoomBgDc6) - savePng('bg-waiting-room.png', 800, 600, waitingRoomBgPixels, skyPl2.rgb, false) + savePng('bg-waiting-room.png', 800, 600, waitingRoomBgPixels, act1Pl2.rgb, false) // ============================================================================ // 2. Dialogs, Popups & Selection Boxes @@ -433,7 +434,7 @@ async function main(): Promise { { frame: cgf[2]!, x: 0, y: 256 }, { frame: cgf[3]!, x: 256, y: 256 }, ], false) - savePng('create-game-bg.png', 373, 373, createGameBgPixels, skyPl2.rgb, false) + savePng('create-game-bg.png', 373, 373, createGameBgPixels, act1Pl2.rgb, false) const charSelectBoxDc6 = await decodeUiDc6('data\\global\\ui\\CharSelect\\charselectbox.dc6') const csbf = charSelectBoxDc6.groups[0]!.frames @@ -486,45 +487,53 @@ async function main(): Promise { ], false) savePng('popup-okcancel.png', 264, 176, popupOkCancelPixels, skyPl2.rgb, false) - const textboxDc6 = await decodeUiDc6('data\\global\\ui\\FrontEnd\\textbox.dc6') + const textboxDc6 = await decodeUiDc6('data\\global\\ui\\FrontEnd\\textbox2.dc6') const tbFrame = textboxDc6.groups[0]!.frames[0]! savePng('textbox.png', tbFrame.width, tbFrame.height, tbFrame.indices, skyPl2.rgb, true) const clickboxDc6 = await decodeUiDc6('data\\global\\ui\\FrontEnd\\clickbox.dc6') const clickboxStrip = stitchButtonStates(clickboxDc6, 1) // 15x16 x 2 states = 30x16 - savePng('clickbox.png', clickboxStrip.width, clickboxStrip.height, clickboxStrip.pixels, skyPl2.rgb, true) + savePng('clickbox.png', clickboxStrip.width, clickboxStrip.height, clickboxStrip.pixels, fecharPl2.rgb, true) const joinClickboxDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\joingameclickbox.dc6') const joinClickboxStrip = stitchButtonStates(joinClickboxDc6, 1) - savePng('joingameclickbox.png', joinClickboxStrip.width, joinClickboxStrip.height, joinClickboxStrip.pixels, skyPl2.rgb, true) + savePng('joingameclickbox.png', joinClickboxStrip.width, joinClickboxStrip.height, joinClickboxStrip.pixels, act1Pl2.rgb, true) - const radioDc6 = await decodeUiDc6('data\\global\\ui\\FrontEnd\\radiobutton.dc6') + const radioDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\radiobutton.dc6') const radioStrip = stitchButtonStates(radioDc6, 1) // 16x16 x 2 states = 32x16 - savePng('radiobutton.png', radioStrip.width, radioStrip.height, radioStrip.pixels, skyPl2.rgb, true) + savePng('radiobutton.png', radioStrip.width, radioStrip.height, radioStrip.pixels, act1Pl2.rgb, true) const gemBtnDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\gembutton.dc6') const gemBtnStrip = stitchButtonStates(gemBtnDc6, 1) // 2 states - savePng('gembutton.png', gemBtnStrip.width, gemBtnStrip.height, gemBtnStrip.pixels, skyPl2.rgb, true) + savePng('gembutton.png', gemBtnStrip.width, gemBtnStrip.height, gemBtnStrip.pixels, act1Pl2.rgb, true) const chatLeftBtnsDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\chatleftbuttons.dc6') - const chatLeftBtnsStrip = stitchButtonStates(chatLeftBtnsDc6, 1) // 78x20 x 2 states - savePng('btn-chatleft.png', chatLeftBtnsStrip.width, chatLeftBtnsStrip.height, chatLeftBtnsStrip.pixels, skyPl2.rgb, true) + const chatLeftBtnsStrip = stitchButtonStates(chatLeftBtnsDc6, 1) // 80x20 x 2 states + savePng('btn-chatleft.png', chatLeftBtnsStrip.width, chatLeftBtnsStrip.height, chatLeftBtnsStrip.pixels, act1Pl2.rgb, true) + + const chatRightTopBtnsDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\chatrighttopbuttons.dc6') + const chatRightTopBtnsStrip = stitchButtonStates(chatRightTopBtnsDc6, 1) // 119x20 x 2 states + savePng('btn-chatrighttop.png', chatRightTopBtnsStrip.width, chatRightTopBtnsStrip.height, chatRightTopBtnsStrip.pixels, act1Pl2.rgb, true) + + const chatRightBtnsDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\chatrightbuttons.dc6') + const chatRightBtnsStrip = stitchButtonStates(chatRightBtnsDc6, 1) // 79x20 x 2 states + savePng('btn-chatright.png', chatRightBtnsStrip.width, chatRightBtnsStrip.height, chatRightBtnsStrip.pixels, act1Pl2.rgb, true) const gameBtnDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\GameButtonBlank.dc6') - const gameBtnStrip = stitchButtonStates(gameBtnDc6, 1) // 118x32 x 2 states - savePng('btn-game.png', gameBtnStrip.width, gameBtnStrip.height, gameBtnStrip.pixels, skyPl2.rgb, true) + const gameBtnStrip = stitchButtonStates(gameBtnDc6, 1) // 172x32 x 2 states + savePng('btn-game.png', gameBtnStrip.width, gameBtnStrip.height, gameBtnStrip.pixels, act1Pl2.rgb, true) const btnCancelDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\CancelButtonBlank.dc6') const btnCancelStrip = stitchButtonStates(btnCancelDc6, 1) // 96x32 x 2 states - savePng('btn-create-cancel.png', btnCancelStrip.width, btnCancelStrip.height, btnCancelStrip.pixels, skyPl2.rgb, true) + savePng('btn-create-cancel.png', btnCancelStrip.width, btnCancelStrip.height, btnCancelStrip.pixels, act1Pl2.rgb, true) const btnCreateGameDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\creategamebutton.dc6') - const btnCreateGameStrip = stitchButtonStates(btnCreateGameDc6, 1) // 172x32 x 2 states - savePng('btn-create-game.png', btnCreateGameStrip.width, btnCreateGameStrip.height, btnCreateGameStrip.pixels, skyPl2.rgb, true) + const btnCreateGameStrip = stitchButtonStates(btnCreateGameDc6, 1) // 144x36 x 2 states + savePng('btn-create-game.png', btnCreateGameStrip.width, btnCreateGameStrip.height, btnCreateGameStrip.pixels, act1Pl2.rgb, true) const greyLevelBoxDc6 = await decodeUiDc6('data\\global\\ui\\BIGMENU\\GreyLevelBox.dc6') const glbFrame = greyLevelBoxDc6.groups[0]!.frames[0]! - savePng('grey-level-box.png', glbFrame.width, glbFrame.height, glbFrame.indices, skyPl2.rgb, true) + savePng('grey-level-box.png', glbFrame.width, glbFrame.height, glbFrame.indices, act1Pl2.rgb, true) // ============================================================================ // 4. Burning Diablo II Logos (Main Menu & Battle.net Lobby) + Campfire Flames diff --git a/src/frontend/frontend-renderer.ts b/src/frontend/frontend-renderer.ts index d3cf1b9..25a1715 100644 --- a/src/frontend/frontend-renderer.ts +++ b/src/frontend/frontend-renderer.ts @@ -171,6 +171,8 @@ const STATIC_UI_IMAGES = [ 'radiobutton.png', 'gembutton.png', 'btn-chatleft.png', + 'btn-chatrighttop.png', + 'btn-chatright.png', 'btn-game.png', 'btn-create-cancel.png', 'btn-create-game.png', @@ -904,9 +906,9 @@ export class FrontendRenderer { id: 'lobby_tab_create', x: 533, y: 449, - w: 118, + w: 119, h: 20, - sprite: 'btn-game.png', + sprite: 'btn-chatrighttop.png', label: L.create, onClick: () => { this.state.lobbySubPanel = 'create' @@ -917,9 +919,9 @@ export class FrontendRenderer { id: 'lobby_tab_join', x: 653, y: 449, - w: 118, + w: 119, h: 20, - sprite: 'btn-game.png', + sprite: 'btn-chatrighttop.png', label: L.join, onClick: () => { this.state.lobbySubPanel = 'create' @@ -929,9 +931,9 @@ export class FrontendRenderer { id: 'lobby_tab_channel', x: 535, y: 470, - w: 78, + w: 79, h: 20, - sprite: 'btn-chatleft.png', + sprite: 'btn-chatright.png', label: L.channel, onClick: () => {}, }, @@ -939,9 +941,9 @@ export class FrontendRenderer { id: 'lobby_tab_ladder', x: 614, y: 470, - w: 78, + w: 79, h: 20, - sprite: 'btn-chatleft.png', + sprite: 'btn-chatright.png', label: L.ladder, onClick: () => {}, }, @@ -949,9 +951,9 @@ export class FrontendRenderer { id: 'lobby_tab_quit', x: 693, y: 470, - w: 78, + w: 79, h: 20, - sprite: 'btn-chatleft.png', + sprite: 'btn-chatright.png', label: L.quit, onClick: () => { this.state.stage = 'char_select' @@ -1248,8 +1250,9 @@ export class FrontendRenderer { checked: boolean, label: string, labelColor: FrontendColorIndex = 4, + sprite = 'clickbox.png', ): void { - const cbImg = this.images.get('clickbox.png') + const cbImg = this.images.get(sprite) if (cbImg) { const w = Math.floor(cbImg.width / 2) const h = cbImg.height @@ -1447,7 +1450,14 @@ export class FrontendRenderer { }) // 5. Character Difference (`x = 655, y = 315, w = 42, h = 29` per create-game-bg.png box & D2Multi.dll 0x6f9eaa50) - this.drawCheckbox(431, 323, this.state.charDifferenceEnabled, L.charDifference, 4) + this.drawCheckbox( + 431, + 323, + this.state.charDifferenceEnabled, + L.charDifference, + 4, + 'joingameclickbox.png', + ) this.drawBitmapText(this.state.charDifference, 676, 329, { font: 'fontformal12', color: this.state.charDifferenceEnabled ? 0 : 5,