From 9ef35a2b1cac8ebdfc5e5624f22863b785f77e0a Mon Sep 17 00:00:00 2001 From: DJ1TJOO Date: Sat, 13 Mar 2021 14:02:53 +0100 Subject: [PATCH] Added reset all and fixed double notifications --- res/ui/achievements/reset.png | Bin 0 -> 31909 bytes src/css/ingame_hud/achievements.scss | 23 +++++++ src/css/resources.scss | 2 +- src/js/game/hud/parts/achievements.js | 81 +++++++++++++++++++++--- src/js/platform/achievement_provider.js | 2 +- translations/base-en.yaml | 7 ++ 6 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 res/ui/achievements/reset.png diff --git a/res/ui/achievements/reset.png b/res/ui/achievements/reset.png new file mode 100644 index 0000000000000000000000000000000000000000..510875efbda68e06de8e66bd7a7af5f105f630af GIT binary patch literal 31909 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%0DJ0r1` zMWqTfWxtN`73kU|-&C` z0EyqMB#k5EW&g%`%hYZBt`zeq-JBIQeByB(hIqtLlyY?t?Xc5jmiww@{3w46Jx5$o zz`~oO&aTScbQ_066*dR&t(01AS<467LQYD17Mc}^RTRpsOgr|0kA%%rbMvFM5v~j! zFGdj`-D*NgZG{#c#WBQvvHkPy(`U1@wc^^`fw)cyI2%o|clF1~x)dIwOg-qf1`-ZG zX2Rn8XpiaOGD-R?xS3_XCk%^4K^peH1NUj9`NADBWI@{KScQd$c3m?rCy6PZm2Xyk)R+A)bAOV; zj+2|&gs(qJr_*+nMMtLJP)L2$Ty&7(AmQ?Dxa}%4#o5%I)BX&hKjlQ=9JunPOKZ9F zwykFSsM0*__kJD!{7_Gf5IwVo9@Xx>go+y6-`Uo03=cDS5zS{>PIJX`OR$CY7phMk z55p@j;IogEImdT;B0>W9QGZVM4D$j1#HlcZ&`9Iys+-&9sLO^9AbX6^L!!{_o#9S# zVNM)F&ch=#@J#5X*AVl?cRc5Q;0NCz!(kdXCR@cRacrRn$`0ddh$+vsew~N43xn%RBu6 zbcs*@Ah2{tz&g^P(#csJKlI6iHgwEgSmU?bMSWOWG)Hy+{=6Dxs_B#W$6xKsa{rN} zwFZEqf>oSuX}ADkmOBxnoy~=L*m~sv7)(!->4$R9k%Z&dQ0)JY>k|Bz>a6H8TQi+8 z=GTC|AyA!l%u!h!sn9f3W%n6NBOgBnUdc9R=GV5^m=|0pDy3uMtY@+OOQPo@odtLM7M`tGd(pm1$1Z z03uZ^W%^eeXe8y3EaB+KFqt{ACG_B5 z3tGYgkrM=8oC!~FAk+!Cn>a}l35Xx}7)Ks^o!)={aJ)|V6q?}M+8IB;>7Iu1|5UaT z%K_gh+|hrx;;|Gu1-*t|x%WD!VM;_Tx{;~CvzI!AcMH_S3`C!JmzDcFLy^w`Pa+*X z4qkr;nt%>ZEegp0a-}T)s}l;6jMzo^Fcu{?nTr>)!rlijNOYbaRA-@*((OPW^$PTTjcz}Rl0U@JjV^`?$FVN8={2$4^vAMv z9LwDg)Uq#jbDrY=VM2U02WliE`X~g-TbkthehPK>Be@5k%BQPY-kRflLm4*RWYb#4 z;+=GBE%baE!+7f^}yX=GN_FtHNYP zY01WqqoT@Kh2aH_6<29OM->OwU$$#BBq+3h@8nYVc&c)0m@kY)2pM|bFM{3E+DU?xTnQCow!zI~hf}syoSD34RX}c zx|QM_OX&pn>Lx5q3Y&{%ztFP`t6U;CB#-0lxpjBT>MrVjPM0*+P`FnaUI6227Y?s` zokO)AFB389CMwS-TPiT5DJxAK{4r*Li*U32{^#4AmVipTBzYQ&e$1-aeTUw3M!rKsnVti4Jsr={I5{XesdCCtKZt>r(3YE<%27BZuaH{1dD zIFrw%W%Q}3JA=3H`(uh648GBOG?>dDMGRep5B_%$a);D6dwoQN;Fs)MwauhtaNT_ z1FNx~{mqsUyJc1s;2IfzCq-o9ys*y)qG5g^`aZzE$dD_9Ng+;GeedUTOqUTfj zOiC*86~9svIh~1Dp^9xuDmNz;PmZE=#{3 zIXp>`a!=yh=0U@nL}E1LVomyO$kKENGj(S^+;(BU=V7A%y#M}Px>~6Ohsuh<#diok z9#Je|2=xi=92X{eBkOQ7?_vF!fS1r`&$BPw;h5rk!-+wj42V7DR_jey0XOaz1xReP zmYF0;cVQBBiAlzd`@nsKg6hP0?=pqg*S_ULw=9u=*WsNZs6$Njo~W^YK-K5O&vFPR z76quS<7q~75^dzJe@eFQ{9OZVr8_W1u>`ON7OVMe*Sq!aPM25~^zZql6C3AQ?xpja zDRh$zrE&NR+8-lE8WgDN`eh3=7)CQy#In5M*5+19JJikYs6`PgK2JU7c7J z#Hm$RipUDBGd(0IDqFhaB1xz3-n-{$`wldB6)zUjGvXC#(E6jso> zJObLMyG%MW!J99BI9V^Yf1h#hciq5u&9qAVd;bn9eal z4vLq*lToiU&<$9JlS1z~v8zge(SHRlX8Kl46dzcmtsBxN2rXgGuKanKb99OXuAi5F7 z$C*jtPDQx(==$_w;!&-iXL*4cA-z9VuMH|QoX<&I?|`ypYGD&WqtKvH;)sqA#Rj-d z`L&A`;gQ}Ck6H93JF^_W|EcDuZbMJkm*^{%4zgEk)u)#&rKmOIY^zfzjT3=NL228O z01bx8zTNd=4y1fNckWGE7(i=8>GK^$ZpVo@P(r7p6z{ zUL$;n&StY2QY-k;iRyMqE@%aE=-ji4tIW6`Nm;oc?|so95mR{iGP9RX6+w7{=XeZN z(nCitNOx4GPI+xur#L}nBcf5Hl#umaIoQhas?>aWlgh3Ewb+Fna<&*G>3NUi4<;l` zZY7M_KY6*ULN%0tWt~|!`Fhq0Hsttod1S*y_Nm|=UMQOLf~_;&wrBAK*UHwPYABcO(-bWiOsTJhXrKh@ZT2cZ`gLyc6c#} zmO$B zlaN*B7xYj5zm-ins-g_QZaHNy@vUV|ES&L6DTqz+%zCM+O!;xBs>af&||8 zR{+b=x@R}jt}bn@oxO_rOiiL~s|Ynq+M46^lfBB@j0vey3+>-hF1#1asDA@47~6;V zJ3;g9ju5r2HJuaTQXQQdZ`JarkWpt*tPj#4{RkSrWc~N_NN9ra5(NyyS4NS~3`^Vj zKml+(5@TNYy`uqmf$2!X=1r3WnR37tH>n^^nz%fB5@z|!2gW4TO0*F%bYV8?k@Fs1 z3B(Hk$@8_bQYm-T^IwZ;b!HiIZ8oSwB`8{pPs^&;K)x+^>AmzT{kb|$C21>@LEKbv zoLF!KS;5kMlFbKhE5SDvjaOVb(~MTPg6@GqWw(w{VWVnuWq8II=dO9-XTF`h@x7=N zy;n6)X&UAV{e;*401Z6*GcT-1AK&pc&-3H!CIriu&h}Tzc1R%s?EZ?wcOB_O-EXhg zHh=u(i2h#YW6FH&N2~h3ZS1CL{O(F7>DmFFpQ@o*7sR=f2x7&#Y(#JWI)NK7Lby?8 zU@xGxFpV1Dlx3`NaDex?S=7QTH_~FGQ||IGgkpED00?$(QQVrly$@#mIy2|FqN zrf%M-h#68PoRCc}V9z7@OiuklY*@0W5hqn$SkE)OS8*qs+DWPMowRzLq_4*i-_@36 zc9e_uOp|E(DCNuni1qE{4S7U)(3`wXJT|j_Rv?g)+yZs>h%9*mTBIgg+UZ29Fu2@_ zrA{^Gh?=a@8I%2M&uFxR@$?Q8CUGizk8*Zi29-)81*3XGU4>emUTgj3B@J(ASy`(6 z-ZFLayRUtw9Ar=Az_a-t4=}B($vAv-E0tST)z}5@@Rom^l|TAEZ*73_w6^34vYbZ2 z{a_wp)pY?}V4QR&sFU!o#4M3G>(Rb2?SFU|xV7Eu#&_lCz0iHX-L02`qpn986#y5n zvXE9e?pSCD(&V;jr<x0RZ_PwD zrywuZ?U=EK!7SL9gvEe4)8rxZC_G3A`#1Rt38)rifaqws>IsVi>TIS_AUofYF;L(R zkujM`_pisaq`ucj4T_2xVOl&UeM6LB0m!NRYI(VNuQNud@$`49pj7`t^xBij{VR(J zI0ejYZ#NqXc@Whdwi(W=p2MWOH~POA1__np(3$3?U)iL>UO!&l8*=czU#o|b-YPixqs_B1pkD@T0p}J zT-ZO0I~E`oUr2fED18^%!lk{vFr!zrrKvR#39uIIY_+5n0LnwNcbJK{?JCW!%cKBG>;r}^><>ss6Z?g3IcE7!uT~JT*ZKOp#CW=+ zKMks5l#bTSRqd^Mg2v7rxh$rWWk`oboxwjF5JLIheO^kev5bD+~TZ{`3 zB(?zxzPzZ=V}kTfCGs2tsjLX3)gNs{RE4sWoa>nd)6$>!y3F_LJGJ`HN!JqWIqxK4 zGjCRhQ4m*V-V)CLDq(L1It*Rgf6=r$H^(%}X1W5dvq{!lRjXd3 z8Xn)a*f{ZzHY>K&DAFrP#pPME8m(l%=JHMpWW|iB3q4dvrPOu~z3UitWwrQC?}zhL z^e6_OV?%^HKmKU)m#L-STlSZ~4}NI4`tM*+5cR@^?uZJWmHeU#UMs~1w8}ZzB?Ft@ zhWSM6sod-r@2x-Kdoi$({yxXi4wo;<kmr0o9%_q&bQ4qn7l5G^nYUalFs_GuJ^d)@Ays5O@0}2p}$o27Uf#eg1|l0^CHJ`Boxh{?al6G?pV#n!GNE z&0r`Ui+zt}8U^wyEZ0evu?V=iHQU`P2Ai1zcS*EfFyDqUgf(c2gxMT1NT%I+BtIlN zY)*4`LS9p%H{0tDNtWjvc%32ZDPfF%O=yK zlgR+^nTbpdLd6zl;AXV7Xq_y+A4|*X|GGU@o>}5?`Pe(5Qt*Vga@ZB^-9KW7&!i6P ze~X>g%c~2Qb4t=Bg!3iAt5YhOSn3@5dj{+cs8W5SYzZplw!bmdCM4@ffJAIf@f# z0aU9B_aa4gl?{AWHZ3{d!gxznX#JBox6g}YLXOS;6lQJetu|Xr4lqb)3 z`c=I!xm5O>@QDGg7CRA$AELjWLlsLLkC&>|u$1>irW>8p^eJJ4^btHmkbBl~2?`P^ zH&?dZmv^jl{|xcpY)Dubmj6H>C|P|`n5G8ZtgIR`Dl@uPHGPo9N}w9<65iP?Cv5*MPb8fULNLF|5` z6r-v#O`R@z^DIu~TH4gJcf@9ewM&wJ?1mp~3+jXFSd$>F*o>uP&@0`-NvEpcm{tNy zUc~yF6euzZ7un5z`Wu0L)#zVmSl3C42>(q&x5R!MI*@vYCS`7`F`AhqUSA5%@6P4& z>q<`X&>G+Hxc8~E0YmZSoE?-!K(uGMA3F!jf)PA!Q5SEU$`g}}$eC`Z3ML3rmuJ5h zL+>*Qi6QF}FqIcLtI@M71al`T$TI84WzTc2(iiPsIk6i%Fli6#V zD6L2Srg_~}Wtya#L6GQm=C`=&t^bFzY@!$&@{|Zz0PcW+pNNpLgiP6leTJ?*v6O7y zNq^E!vDS>TwqHtROGcrLH{W;=o&9-kby&Mkvg>!TMY9VLwFObvT_c5lJ( zf%C=-sMVMlK5s&%g=;xcbzzqi4GNO}^NOVlb zSVSgYR)-RHNp#KVhNSZJNoE3Fkwr!WMKZSaLA>s;}7%YA^PoXUf|$m$Un zrlh`NyvsgjNc(xGWOQXxfs?&RINUA8CogJk;5g7q`l!UTu%6YVQI9$)d1CrT_velj zoB2`cOx!dEWA<~z=3BTi~pt=9_o<3eb)hx<-5lno6Jq2nH( z{*&~{z=8Jvt;kOa{kK*jQkoH%dg&bP`&g~o#IQ=+sIHC+|Cmp81h%$*nJ-x=UssT%Bk$B22bPzb7v_F* zt0W(`Tt6s-X%ew$>!xeoaLV?s)xK66eBb9pB|NHqm3_6V*HTeT`S1Jt?uUQ67dW8W znkI7tf`{rsp=GRHrcF?g@@t~yqV}?Dl9WzQw)Pw#yncNiNth4uC)djC{t{)^-Ih%c zjR-h}+RqE=fVoTFXug*PSugl5xo)B?d6L;{^K?Gdu6kde+mLpe6n1W}owS}FqTHBQFl&MB zZyjDZGEVRA(t0?idNuVZ?`XfVpmr_hEOic&d2N@(Q=OVcgY*MV+yjKrElv2<1J70) z7n%n9u-#v?t4F9)bSUKkf0h?u8JUoVOs z`)#aOPjWRbI^Pi7@tqxiKko_n0M5@oO%X)sO7!7ha`Nr=?l7+w06!9HdW&j(Fjb9)Ue!sW%f-6&sb zZ@tc66;#(ZCA*wVa8{^HHP7y~%)jVeJ#M{|^_^=gJoZ$Vy0x!=+Ke}3HkIA)<`E_8 z))e4f+@;uSDoFm5&bFs|iG_3tQdCzi6>Pkytgp4`uDd4)4KsN@D++@bqrLB@LVyJ- znq+&+-Vk1RqNkI%%-m-NaTWvMd*o#l{!GmTD4vSu#KRb&yM|NGr&omRXs-P)FF^5a z>L`adoi>`2=`%n#q$$=k?t^>yKGGttK0RuM?q-IQeaz&itE10HdY+b41lj?si0!9p z1LzDlwj;RMQ|;dTS>N_G*y zeTM38)AmPp_n-2NS4kn2=61&DiLBh#nnzf zz(SV=Qhg*$ZI-fsw2|9R%aV#FW)JEHc(EaXctf1cH4Hi{l@B;jcZ|E4J6B2NyR9jD zO*aYPT^`Wq$@Oq=JDfag!dM9aMBBclpDR#u5HWY+?H9>2MgB(g_@6#;(mg2RFo3nE zUnqpK+^ZqqefDe85ggt~ z4`gMx^bYyT`P@qEfv0YrH3@n+SK$1f({K=n@c690(7{w*-TtO&S6LYy8b!~%F?3di zFQ8P9vvny|K2|axdx=*B=BRfDpCR{WVaGEU+O*p)6FkcBta5mtoUHF>*lT z!?y^f5hWGqB%f$!F_VcuLb)UQadAE7aq>~VNZB|eLFvgWs1zxnuj9Rs9q!TQ>+=`c zy*I3aUB^rG-{o?TE-;D}BX#v!p&L1w!qCB-^N$rwi)&7YGYc1z_l?9`@J9B7syz7S zA(GJ?{}*{e4AEcq>F+`)9((FMBTuAfN~X&N;OjV@x@RqAHmNC?#i-zrhW%;L2=i71 z0a!9I0SUJm81|p}=DQ}nXuz;@E)1Y;Fy$Y@U+nL;$`vsxeGlmfj@?Tm7|M_&V8 z#87t2tn6ad=Q}L4<7RQ8K|WTFgf|_Tf-Jnn0$Suf2~jmnFbWAP9bWzR7+>Fy$sdvK zE>3$v7^6s;f!hB?p0W<1^pIyEWC~kCE!J3Mbi58d?U!Y`k5%6UqYvI27`Vr+i`j&5 z8D^5oFajyD?P2=GZzinZSa}oi-N`|XL^~#ZA=p;wFQC=@_VG5t+sw}AUKFtB-0Hq1 zI42HuAw9i`a)GI{Feh1IUrA=bU=zy*Zml&i0RAf>o<(ZDPwx=-A?9y`0m>0tP};pe z;HE5PQv?%v zu{E9X)C(cTlb3Jkc)v8eGRD{LW*5b4bW|3C9n?$_Knd%~B*<7`+X>=G@DEKNf*akb zf!_SFOTjD54%PD^H{d)^wwgWg2?c#h-?Cd$KA_AY2KY^2lSMRS6FvlKSP;kx>=+Hi zjuG7gF++RLhab$g`#+s82qd^|b@H0q26U5xez0~x*b1x8*EWvNNZqkoSuV(rg|fQt z+~5L*&f>m2YOS4eDOR7f&yq`d@eLKQrm0Lnn0KuKU)8Hj4prH5%9(A}T#oz9|5#1O z=18vjabtgRMkZ8yj}xq;=SXlXvdFD7DlAZ^!rb!UNK`9{C>Ddbg{p^YB%wvd2a^3H z1#?dp5X2e60H|6cDdG?iw4G(PPo%!z%yPnr#(?fY|3RKmy<~1b>H!z}Ka*hG0l4sj z(7H$)0T*k+Yfp#xqotR8SvL{&d+G;oJgZkV=B^t;P0#0}$4E@=RdPj+z94dszn9%3 zp`<=$5?ipS=810~#^@lQ#4#MUZ_4P8IQ=MCtXRDseCRfeqrRKv1h-4Ky)}2qb+`I; z?eG3oKIiH>?}m*PrSg!#o|d`F|yg*0n4K1&7j%LJ82^-VNn*|nbE zd{w9bXF|1ppRgMa>qpImgmWCcRofCg_2IT#uoWPj{x&fZPlyCVZ;}@gQQ?ymx<${0 zhyK0Eb0^;c$2#dl>jA>Xb&Y@B#nUX#Zg6o1r^DAQgX=}1j%(yvmBP>VwTwEB;hBD0 z^sTQ$8$_X-N~zlaFp_D%hOiw$*PN}z?9GgGeN|1OFoTkf5mr^x@d%0oLm!7bx{c~*`A9$( zxX-Sqi*!$1A)$xbH!r+xKhpq*{F+f!6isfxT*m?(Ht%&oMtEQ67Bu@^x4vw7^;o^J z$=Tpag*eRC(q0&5jgT`?F{LBjF?lx6~;DcA9st8|<@Uitf6HrLID$qRv<&P8eFF;B&oegF4 z(G%Q7F&)TRPsE{8Vza$x$Aa0(+K9o-Uqf7>bUn_4KdLnpr4SXAh+wDvyRYphEFsDp z)E;An&ZAb<_Pb>}Ge9h}zf{clJ1)V$oE&>7|Jj6XsE(H@$@%UWFH+9GQ6pD43(=hd z1qf7qbAMCJb*aQqqMPmgf6RUr>9cJCxe_^|fE?)fJkdnm2#~`)9X|*`#@FqUC4Vml z;2j<(ch1f06Ix5ggtjIka?3c70xnJmnhqgdr&ptloOdA6|K7ldm^b`?K&{QF=Ji=H zily&swi8w#Br|xtknRsquV@>L{@H`0zD8yKd~Br5=Eq!%Mp5HEXt~tklF~Z(rYmDl ziENrsF%5pup+xm1p_FL%NAslKJJrx*(QTV z<3PPRSsf({A$<2H`CFkxy#bZqA{-uZ&^0BtKhJ_s4w%P?1t&Hw0F`HHyt?BG*9#Obv?o?=*rvqT+Quu=f%D#XiD55`bYOp{t_s|6ymj zL-7t=``bw}0b0mAP{DZ5Q$I^n%kkLIC?VxGdlo4S+jnFzA(CG)wh8Z{-D6Og_2`H; zHmuW*#A%$?uxlP|ix20*da-2)6oUly?$TQYU=Q;QiS>?97kJ3N<^zbNu>$rM#96FZ$h?v- zRh?VS^B?`|a$^U+bO2lNbUxZuuY4y!ChK-Xn@q$pG?KG32#R#^e^@MP2QQwq-DXr! z^d~zFhJ4r>?zv!Z-G5xEPz$9r6mtJ^RKNq-aO|n18V}8uPQ&-eis)Eg)Bs}1JONc* zYB0U|_pdiU%E1yG^D{d4z_rMC)BHJ~v{%pd<0o~tuvwLlO+ zwD-^#Q9V*x{Hw47aj3%pIPkRiP?(}mnNry?)$*BggB(`RKLRSdpS=AY5&*(=Qx*lR zYk_k+QFT3g(OGIz3Rz}7p*Ue#sb{?c@+|tQS|=0V-G^8S)lW=kfPQ0NLy%qQIS_0+c;V z*)+r`1xv)SnYx+fUUcnU?dY%e?pO#yW!0K1^$+%<{hI^G2fw1FrrW^Mf8y7Bny!G~ ztbng@QT{5?pZP`K;|=%28O%T~<~tOk<;{qA6b!*tR4sHmAGf9A7ynx50Xex;vgk)h zu4w@kUG31&AMW_%{~WMQWh3Fifzjp;_jw`$OLID;!uz~FC006_rOl@EK!^ky58ulX8zakfJ( zn)~LjnbtP6R0F`E3(xvTFZAc(kgO0dxIW$BTEIXmt%&zu6m7~I=NSJ*QlbIeT4{RP z{R{IexjkKjrU*31a1ATGl79v853wgB*!}~;?r4PGOv7wIf~~@oJflQq{Mp0Lq~RQI z%Bo8j8Qf*P$A$Y&QKYK`{s3b`hl5%;7?*hjpDp^mt=Rf>=r2QUAq&)hMzY2x8hpE} z1qPmxv!>HKlEF|rLkL|O0|+yvfCNS61W4O<_?_xi(Cx5AUH+F~B6<6Rg{El-049W% zY?Tf9M_+DE2Y(1Op?(gV5iwE?OCMk)M!psAViXcs>U!a82MvDOvgV^}51OsLb`}jc z)jBl0?I3c$`uxiW#)uAj$gcU6mn!7^(1D_^m5d%uEQnanh4qeBWal! z-wO|k_gH%10H!WEF`=tUt!o6WF|<*w+40vxA>`pj<}=}@Ncm8tn6-9RZ^+Bh4b_zqShcIOt>8v-2%qgMb%#7s5h z9nvC&b^B2+j(2=`GV-ULzlE*2e={rBYLmh-Hd7m$G^r&WD&KS6$R6yL_CO7;Hu>i?FWQr5r0T^_`b}#6;RF>EVnfi zL&P0|Uym-7oSmQw=G^Q32l@Nc6A3p z$SZ%{ZlsFxDl*#bBw;I=KGP{(pEXf=#@ka5^@YWO5Uf+`SGt^gbNMMN^e zrT~DVp<>vo&jzJ28nEF3g5eg)#{McazWvC$)OmN1wQ}~&unt0T#Y-+exw<4HYLOluJ|TtU4s{FrUXxsSe*M|r#+(+7(JAa;Y=^d3X;$KC)A zGcemG59&WM!fpmeR1@nKx;qyqE&Jo_LU7>?fiCwDb-w9)HZyc<(U^D=FA>C+=Bx0z z`N_~z*fnpI3L`^Py|&z=Gn53s4xbR4yArk)I6z?g3DAYtiSM8*2A?zKZ&`+1VcO3C z#A)?$f3#@pFE8s)+4z^3Ffm}G2|W>S2s{%=R>x4)F$ACDAuQa{lT0S8_wml<^wuqP zGWc}*6sz6s;XpEY6c_N-J}Kz8+~?;Bwe=gKI&6zSG0~C@09r#D5r8jZ2i!b7iiH_D zyz?ZZo@ZO(XsDH=_=T5pLB zXnGy#X#0tr6^a+qKGLi9Vozx6wJgPQAnbr;55?;TYP@{}hHkhFu%(goY;DRAtLbz= z3m`O6X*;g63}HoJ#tMx@f19ow=eq~J%Wkc0*}Cv!E8-z*N})MOtY3jD*!0zS|IEMm zj(bpyY%Bj`X+htg`})3c*kv@3Ft`+bBH z3w{X3PTL2+nY2gW&+a=G)YyFo%vf1`-rPd^5a^3yNFtMD_1xOSi&L}?CA?6L^%7Ed z12?rbqIO?V4HJ#u;@L+WY_d21i5MUrHlX|S&;tl!C{pdvFDXd?-5>!_G-E-{LQ=HG zgZgMzgGdP{17-^1Wd%e+@0rJ8&V02IVcI0JNb5h>6S*MB z>z<}Zr3BvwWW+ETD%GQG2v{kXD>wG$4fE9WcG48*6ep6qNx&TyuOd(vWy={!7|nodzZM(6Gb zEw9%7Xh)E^2;NKCV3qJ~=CVfh+Rj>8E-(s&1$>o6_Qwv$hrv6H;z92|jm=*p0R%&J z4BZEAb7(25>o^<=F8cYW_oDcIe+|Q>gzF?JI574w?>C2^IuZ?I^QnDZn>6mhf!CWy z!OddFB{b;&5e~IfL;2IK5u(q3WB7+L7ozxJK1)z&_1E3Ba4_YwMne4AYMo||4%mu>Ym}oC z*_uwcefp#iV3Yipp_#y4>ZDDg?QxibeMMSG5Rj}p9wc?+Zf@4wC+N=;q%QUe-2o@d zwpKCpp}QhUuSG14V}28;n=Y z&E|yOgJ$~D-it_IWh|#}(EimM54yVJ=jGb9X*@c|b5;ALtJO=l38+!cP<%;+0V=er z^VO}+eW`T6F*&jLMvaY(t_B#B6k(11dWp}oMStXD^(#b(NQkYrq&@=!E&pZU_4r8L zG88t4FQ=-#4W}W5hC_86bx5fD0(u8Zh@JfhM+^eL;ltmorz{nAID#d7#Ark$na9aa zpcZcz~CLbIA5i?jX0T8y@hf@hz^&e4q*#2sqYmCiU?uPE`d^Iq77+n)io zl??Y<>N|c>9~s1tGZZzig;e!6e})t|4@{l~BH?zbMt(?m+;R#%%@_ zg3C|(j~S5dJ9zFGMj{%764Q)ehVtTgJI7-o@r~a%=eTat7Xz;!CkdgeX^lV--^*s{HohdYxI!J!Xo-e1cno46)DFgAzFOUR zgrsFt(G1Y_$nB%?YpxUw`cEZTW0Ai0GKq(`G7sF^$29bOv7Qri7J!-=dr>XFoT_~? zRkDSJS+|_bwTsX0e*FkT6)5;1Aolnqxw~|*F)jC`;m2EY`4V8Vn_=fyw!6d(@kx{p zYtZAkc9b?{$gh=|-ozkYL70KQ3}PA%(m+QK{UZK)7n3rHApj#yG+a|Vkh-1&(cF*W zJGP)*6Wr@P9B5hf_kAQoYNWo4SW~I+AzQA}LLfX1?3F#znd60j^8>w>32$&;mZG`O zf>_<5zGGI~LWCC}w=~W8!2fImwHbqu%X)@2XW7qiIX_~)R| zuaanGz_`qW>{yaFC|#+ggD8Rj^@?YNloK)Tqlj4>MoVoA`Cw{R4(f2ITVm}(tcoqL zvu6G;@yZ31I3OeJpQrk}YN&n7wEF?rEI$poASZqo{&(~>fx;oO36H*9;}FlDOF= z9Xc5DzOSn=J*S(!&y)lX8$k+M5}0;50`n~wXKFrVm&2hFulGWW7A!+uJAB>%Kb)n9CpiA{Kmmw3mAuTPK{@kkowj=137_{}u2P-zxJgHMMZ zPBy(2f%VPBFqd~=?DJ%0t_Y>#XF?!^fgEI(>{h&KIW6;AIyfGXj>SXjSd9Uv@)OmT z27_wz{0#nLC<9*{L3Jw|+JnGA>Yq^Oq74X(g=ZN$8L3 z*6NPlwA!AI0M&PUmm>%B#i@ZGm!H3oM7rS@KDvQ_Qz};ROqzZ#LH3-8v;spsI%WQn zWo>^BegD0@6E+JfJFYhXFyM0pIq9Hn#`2uO<>CC;FhnP2z9Lxtk#CPP)u+pgnzF^Y zN>T{A2dh3E!JAl`)KFm^e_rT^SZ0>8T-3G^67BWJxWx#$N3>DWzTZXffZE2^q5$8H zwHyEAI~oV`ze*Wry?tMJk$ARfbsig*ioNhZcwMW{nIzqR=vQ=b%xl?BcbytZHBYlUYL6El$L|CK^L;aKQVVkHU$Ee z4Wl6rY6$=S9F(M_1RuY!#=^xD;cM4R#7WGOxNXfVXU7vG&9u)0nB=Ee4(U;11LT*MnK^28H!1xU*{LP_N4CCI8WKTuJy=A}SA79=+d0u37n~PXS zx5OdIdv%M8offq^?^UU@LyEdxY!;`R{a-mV6=yW!rv$ps@KBl3e zPKc10^`BU<{t5E1CbiY8qGw!(LRORxu`sg#CU75d;f`EkFq)`i`02HRLIn*da_(sKO| z@n%lB4j9aR(k-BTqG#Vj()OYpP9c-UIhq!;JKas3=i}8q2wmXbJKqPuIu?Fn@VHIR z_7l^X8#*P6S%B0Bk%pH&E4%AuwdurlPCd=s_*=Qg&>Va8^4Ay-#pEJFnJNtPTjDQ5dk{DU&WB@?^ Nq`!O>uM#x~{C}HGxZnT) literal 0 HcmV?d00001 diff --git a/src/css/ingame_hud/achievements.scss b/src/css/ingame_hud/achievements.scss index 5d2c6b99..3979d0a0 100644 --- a/src/css/ingame_hud/achievements.scss +++ b/src/css/ingame_hud/achievements.scss @@ -39,6 +39,9 @@ } .info { + display: flex; + flex-direction: column; + justify-content: center; grid-column: 2; grid-row: 2 / 3; .title { @@ -74,6 +77,26 @@ } } + &.reset { + button.reset { + background-color: $colorRedBright; + + &:hover { + background-color: darken($colorRedBright, 10); + } + } + + .info { + .title { + font-weight: bold; + color: $colorRedBright; + } + .description { + color: lighten($colorRedBright, 10); + } + } + } + &:not(.unlocked) { button.reset { background-color: #aaa; diff --git a/src/css/resources.scss b/src/css/resources.scss index 37842c80..7a636a6e 100644 --- a/src/css/resources.scss +++ b/src/css/resources.scss @@ -66,7 +66,7 @@ $icons: notification_saved, notification_success, notification_upgrade, notifica } } -$achievements: hidden, belt500Tiles, blueprint100k, blueprint1m, completeLvl26, cutShape, darkMode, +$achievements: reset, hidden, belt500Tiles, blueprint100k, blueprint1m, completeLvl26, cutShape, darkMode, destroy1000, irrelevantShape, level100, level50, logoBefore18, mam, mapMarkers15, noBeltUpgradesUntilBp, noInverseRotater, oldLevel17, openWires, paintShape, place5000Wires, placeBlueprint, placeBp1000, play1h, play10h, play20h, produceLogo, produceMsLogo, produceRocket, rotateShape, speedrunBp30, speedrunBp60, diff --git a/src/js/game/hud/parts/achievements.js b/src/js/game/hud/parts/achievements.js index 9d7506ee..91ed5b39 100644 --- a/src/js/game/hud/parts/achievements.js +++ b/src/js/game/hud/parts/achievements.js @@ -65,38 +65,95 @@ export class HUDAchievements extends BaseHUDPart { this.achievementToElements[achievementKey] = handle; } - const handle = {}; + this.hiddenElement = {}; // Wrapper - handle.hidden = makeDiv(this.contentDiv, null, ["achievement"]); + this.hiddenElement.hidden = makeDiv(this.contentDiv, null, ["achievement"]); // Icon - handle.icon = makeDiv(handle.hidden, null, ["icon"]); - handle.icon.setAttribute("data-icon", "achievements/hidden.png"); + this.hiddenElement.icon = makeDiv(this.hiddenElement.hidden, null, ["icon"]); + this.hiddenElement.icon.setAttribute("data-icon", "achievements/hidden.png"); // Info - handle.info = makeDiv(handle.hidden, null, ["info"]); + this.hiddenElement.info = makeDiv(this.hiddenElement.hidden, null, ["info"]); // Title - handle.title = makeDiv(handle.info, null, ["title"], T.achievements.hidden.title); + this.hiddenElement.title = makeDiv( + this.hiddenElement.info, + null, + ["title"], + T.achievements.hidden.title + ); // Description - handle.description = makeDiv( - handle.info, + this.hiddenElement.description = makeDiv( + this.hiddenElement.info, null, ["description"], T.achievements.hidden.description.replace("", HIDDEN_ACHIEVEMENTS.length + "") ); - this.hiddenElement = handle; + + this.resetElement = {}; + + // Wrapper + this.resetElement.elem = makeDiv(this.contentDiv, null, ["achievement", "reset", "unlocked"]); + + // Icon + this.resetElement.icon = makeDiv(this.resetElement.elem, null, ["icon"]); + this.resetElement.icon.setAttribute("data-icon", "achievements/reset.png"); + + // Info + this.resetElement.info = makeDiv(this.resetElement.elem, null, ["info"]); + + // Title + this.resetElement.title = makeDiv( + this.resetElement.info, + null, + ["title"], + T.achievements.reset.title + ); + + // Description + this.resetElement.description = makeDiv( + this.resetElement.info, + null, + ["description"], + T.achievements.reset.description + ); + + // Reset button + this.resetElement.resetButton = document.createElement("button"); + this.resetElement.resetButton.classList.add("reset", "styledButton"); + this.resetElement.resetButton.innerText = T.ingame.achievements.buttonReset; + this.resetElement.elem.appendChild(this.resetElement.resetButton); + this.trackClicks(this.resetElement.resetButton, () => { + const signals = this.root.hud.parts.dialogs.showWarning( + T.dialogs.resetAchievements.title, + T.dialogs.resetAchievements.description, + ["cancel:bad:escape", "ok:good:enter"] + ); + signals.ok.add(() => { + for (const achievementKey in ACHIEVEMENTS) { + if (!this.root.achievementProxy.provider.collection.map.has(achievementKey)) + this.root.achievementProxy.provider.collection.lock( + achievementKey, + enum_achievement_mappings[ACHIEVEMENTS[achievementKey]] + ); + } + }); + }); } renderStatus() { + let unlocked = 0; let hidden = 0; for (const achievementKey in this.achievementToElements) { const handle = this.achievementToElements[achievementKey]; + //Check if user has achievement if (!this.root.achievementProxy.provider.collection.map.get(ACHIEVEMENTS[achievementKey])) { if (!handle.elem.classList.contains("unlocked")) handle.elem.classList.add("unlocked"); if (handle.elem.classList.contains("hidden")) handle.elem.classList.remove("hidden"); + unlocked++; } else { if (handle.elem.classList.contains("unlocked")) handle.elem.classList.remove("unlocked"); @@ -111,6 +168,12 @@ export class HUDAchievements extends BaseHUDPart { "", hidden + "" ); + + if (unlocked > 0) { + if (!this.resetElement.elem.classList.contains("unlocked")) + this.resetElement.elem.classList.add("unlocked"); + } else if (this.resetElement.elem.classList.contains("unlocked")) + this.resetElement.elem.classList.remove("unlocked"); } initialize() { diff --git a/src/js/platform/achievement_provider.js b/src/js/platform/achievement_provider.js index d9b7d67d..01151995 100644 --- a/src/js/platform/achievement_provider.js +++ b/src/js/platform/achievement_provider.js @@ -472,8 +472,8 @@ export class AchievementCollection { achievement .unlock() .then(() => { + if (this.map.has(key)) this.root.signals.achievementCompleted.dispatch(key, data); this.onActivate(null, key); - this.root.signals.achievementCompleted.dispatch(key, data); }) .catch(err => { this.onActivate(err, key); diff --git a/translations/base-en.yaml b/translations/base-en.yaml index 99508410..e3842cdb 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -253,6 +253,10 @@ dialogs: title: Tutorial Available desc: There is a tutorial video available for this level, but it is only available in English. Would you like to watch it? + resetAchievements: + title: Reset Achievements + description: Are you sure you want to reset all your achievements? + ingame: # This is shown in the top left corner and displays useful keybindings in # every situation @@ -499,6 +503,9 @@ shopUpgrades: # All achievements achievements: + reset: + title: Reset achievements + description: Resets all your achievements! hidden: title: Hidden achievements description: You have hidden achievement(s)