From c57b2d0de3c3f58f355fd1d7a6e4de4470a04369 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 27 Jan 2024 00:36:18 +0300 Subject: [PATCH] Content menu, content-pack dependencies --- res/content/base/icon.png | Bin 0 -> 17192 bytes res/texts/en_US.txt | 1 + res/texts/ru_RU.txt | 2 + res/textures/gui/no_icon.png | Bin 0 -> 15396 bytes src/assets/AssetsLoader.cpp | 1 + src/content/ContentPack.cpp | 22 +++++- src/content/ContentPack.h | 7 ++ src/engine.cpp | 6 +- src/engine.h | 2 + src/files/WorldFiles.cpp | 19 ++++- src/files/WorldFiles.h | 2 + src/files/engine_paths.cpp | 4 + src/files/engine_paths.h | 3 +- src/frontend/WorldRenderer.cpp | 11 +-- src/frontend/gui/GUI.h | 1 + src/frontend/gui/UINode.h | 2 +- src/frontend/gui/controls.cpp | 8 ++ src/frontend/gui/controls.h | 4 + src/frontend/menu.cpp | 133 +++++++++++++++++++++++++++++++-- src/frontend/screens.cpp | 5 ++ src/frontend/screens.h | 2 + src/objects/Player.cpp | 5 +- src/objects/Player.h | 2 +- src/world/World.cpp | 8 ++ src/world/World.h | 1 + 25 files changed, 230 insertions(+), 21 deletions(-) create mode 100644 res/content/base/icon.png create mode 100644 res/textures/gui/no_icon.png diff --git a/res/content/base/icon.png b/res/content/base/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eadccdbc35b14d66ca0385e65c34d738916ca0db GIT binary patch literal 17192 zcmeIZWpErz(k?6}iYpR8~b*XHU42f)ol8Arb@x1d5EbxXRnF@ShU_?(Mr2?#{!jZIz1hYZcO$f-DdGr|GQQ z^}4ecncu4~1!s&ekFg7@mE2Iw5F<2HESdVvmo(9XR5zYxj%mWL|g?n>tgC*Ei+G*BY-sm-N>&XKqy|;vtO^Bg`f5I_oDBP1UD;PZI2c*U)=goRwOzA5xXE1i?T^Bzm5M%(o0USpo$h~N zs`BJqvIqSVt-~XdIW!_*O6Yh(;r!iX0!=)^l4N{Wk89U>;?nwSxpuWyfD9!o(p_x! z^>XC7m8?y(e&>0{=SPGytUB#?H~xbKG(kzpr{{n)#x5ZP-`AoxNwzPHqtPfa<}J6F z?2qdk5h?qF@a#hCrMJ$$c;wkYq7!yi?aU09Y2rJm;|mSx0O$MGXpnnp)KTK_r*2^M@Cr8mER zUrGs&`!zY^B$<`%OAOlmgF*8n+g{k#Yie8b(nq_^S57B|l1Fa#+gSHUbFJmARv>}r zh?0mm<=ntyQS@ZU(vi?h2H&V>+er0V=5YIy%;3!$!2pBFg7VDIql|J}%$oJ1{<6+1 z0a8r+R7{`3P&KJB1w5XkYxP(~>NQp4d8^DvU6($&`wBO^GWZz1@^!XsC(FHr`!a8@ z<_R;a4?$y|58E7Pqt0kG_6t$16WZg=EWa`zV{}!2=KNmUZ;Nia{BVn!*k`MGB(N%E z9^+1U0XTk~C+aO}oJ*Ioq+VsQy768F9{#dxvt7v&&QOGkT+o9-ULf?frCWs0uD;f2 z!ga(QS6nOW0{!59hV^@y1kZf5JsWHf_j*spD>@h-L99g=N|K`=?y= zdj*nfo`I8zap`!#L-hMcFV)Lv!*vengJG)md2#B#S_m!LcvD7kPj`9T!IP1WIVUHV z4qW=2uIbNMqoUoWwDYW6D$y&s4dF=zypJ2xnK=pCqFxg%aDj=B%}eUdwdF1Ju`PQS z?bf+<(=Qu*C>^cWSfP1+c@5Z$rze6aN~|uqVZzm1vo*q!c~#D?tG*~K5G|n*l${vP zi}NhKhBvf%>0N@w>wz%05@ZTN;e?hC)WGmDA>a8VSlipUF`TZt)AXM@RKW}1o?)Yd z9DWT&b4?Z|9O}pjpKv!s=ycumL8;X*x_H+$79)|Hj0h&l-x4^--xA*DWQ_PI9Pr+F zs~$sEgw~#*uaGt~IN$}^i5Cy8l(szHT4 zP0jt_ZM}sG(t{}BK*~NLWuo{5IRu9wx}EmOvo*{(w~sW-*z$$%K5OTK)w_b?rID zE)sq=J&iEyCG1Mw^wUJ>2(GCZO~g7mtwAU^EAP89crf_N9Z62V2vCT$Mz-wIf1JFr zH!59DHl9>`xCLD(0~IKhC)~;!z3{?fq1sIXSR`%DCpfj9PhxJ&D6xuPa=4G^!NbH0 zJa{xCWe57og$a|kg)=xqBi<&5p?Hf&KQA2AC^ZX0ymY{#aggrh0?pF7@$}k2AOh59 z?O=j;6t+@K5Q65oxxe_DGR^Qk^yIpf{J2q0MZG*zYH_9zuHG5nj)G@I8q7Wq{hsC1 zS<10X%|(#thB*;$p~eq4zRB&VGmrW{`-RJrkS5e|n6h%hbYSsHMj7tsgzb@!1F4*z z?I3b)jT8PmznAkE~==L-oDuFA9w%lH2=Iaq zJNolJWSB-N6I4pb?kH~vxOg{AE5lk&CSUQ|^LvcUokn#xt3_PK3nL8#2+8Oz3L~~s z)v+i!`LfO|r9$DK8#I*)YsKO`)o9#aKPIu+WZL5a94L{dtn-rq<1hgyb0*M%P;jm! z-9>X03!uJS5A_6rqRHT4uu@#9U6p@gzizNYDcG}`G9YYC^_S@G5*DUN_85$sWB1Te zd_7HpC}`Vv+h_WB+yt@ubLAOcVe?#F4j~6@?)Pul%6|RCU)pzD;>gD3EVs0Nj)r!Z zYNUZq6rQ~FtC)~K+tP%wz(2%&rgygZ@-YiWs!t?Z{?IXT4UtF$uAof)X!`m7`m^EA zw}yO~Uu1dfVM5qbK3WufxOSFe%^`3!Ig~)*~NrHw@Em?-tcY0GUy z?w_DJ3FlT9yL(&($xqJenNS;EFn=86-CrcEX%;C2rw#5tQV{$A7;GtCQ5j6`OS2#l zq@6rgSA05Gl(^889}bLIUa^UJ z+?=tVV0LmXc{@vflqyHERn@+rCIJS|j|LUUmVIS3*ONY%7r|YV5}x87$oX`EqsE@) z5*F_T3!f)nN=Scy@YB-O3#Utq9s2#9s|j>reuJ%~s-m9PabFg9d)cLM;6^~MxX^SI z1!fQ<8*3Z>2n{(USgOtxvY3!Bbryl^KFyRfuYxt3P9KH#=5hhM?0z__ zM6C;wi;#H1dMY!n1&Z_@qd=M2+PmN?^Dl9zwEAJ8nFG_=gPf%K{HRjnsCjcvQy$4; z*UE%pAtf#X;h6UYWGViec@4wg2RF*;e;3V6OD5lW)7YlK-if>$I}iF`@3N(Gk7R7e zttT%T5G~U+qY$Q)3d(~k#t}r=l-aYz#@rWAiT$Nt?a+3TYrcNjH?O}qelg@I_Dqb_ zK1G=yh8Z$3*D!u$WWOj0Y$p#5+Y(O3bA0fFYXhqheHSgFBh4r`#@#$fA*Ph1Hc6@W zMD3jbl%(yD;mU8rhx#8W)E^2O7PI->MupZ(f6Np1pUC)#fD-w^RZW@*h5OtE#eSQy z`imI?E#w9d2Y#M`L=?Ft+xPWp^?4h{jxuK&uj^K0KO=y%bXaUv>;smZb}`8T)oK40 z_v9rwboL=HrDjx11(_)qR>mT+uUrKpy)U+)Y1XfS?lMQ?j7Z+(%UGcXXiYz1qI#Kr_~|CFu2WQ-k(zVDqHRH#*j+|qc`S6MqNa*sV=VKz0lwl zjrf!q<(#~WW@xkYvzN5)69QaH6%t4GeKPK>=+xGGhKP(f5sy~aqbYLBshtqt{KAdE z^0W3%y~3kdDX2!4cf&J=N5x~c_tYgc0?)=7xMrGr1=^yydeebokap8nt>nk;8>(W-_LZ7Cxw^_9@v3DAwzcBNK2y-l~}E`UOAe^0UP;B z*;3TfN^v37XGd*?J*;IYBG7X5qF1a@z^ik!w{uIyFG2YU93TR?il&dhouvls$;kcp z3w^R}xbq5(#W?V~GR$VJ66KVm@3((qwkRwe`!M>sO6aQ|`f2ybR<_TgT_7e4NuBQp6<0pHHPV#Yx2TQ?)k5Y~giy?*SXhQ)TX53DE;Y zM8LUDB?a#+2a5~^Ecd>^>~XHg?*@XMRCXtq;tB?u9xs0@6rpphpH^WdXb|lFw7YiE z1Mc`X5$f3?i!`=`h@#ChVs=|-Q!Y=S0&b&xgqjc%x=@)RH@g^K zIhtFT;IuETKC*Oy%3pllFzc7DU@73P`aF;^ax6clc%Pm~C*kV+-E?5tHxAIeF#S3=3=oLTrJQ|p9+{h^@1eG3cW<9ABd{KqJ|SVY?C*1Y^VcXP_BW2cA~ z7+gxz2=A{@^IueyO9^kf3aWHR2->FMzRS~)4_1m*i-2RZ(FBMK-D8M+zw&%(p4h&qyu16JTu>0J02V%H(4M@~gDa2!G7 zbNxWNkx2=z^$rQ4l*PFx`D+nXINn$mKhcE>!_q*KK|=1$Ag1NF#>cE^4utJ^?y_lU zEe&XZOR+{lWqJ-fDqQ-bL^-E?;tHX=s7Y082nnHs8t8|gQL;&B|B5LnY%g*+bNVGZ z$rHqKipC&^yGtsBKf?6ERfj7LUy{j#K|8vdAzw?y-2?5KPI({#eGG$- z-4`w3Xq5xR*_*}yfzpE_#d+tkeWpL)u4;5%`{O#20mK#XTHl5?;>The1lS1DGl{5i zOQDsb$DnEU3VT|z`pTUPS1_6u#(i|Bc#&4{AW#k0V{t(q}m<2%q03fC-tn&yo8!i zm}$gcrI{jbj8Xx|LKM#$AXNa){=OQK{Z}yP5W4s~$7tjeQi$o?RMXHf9+G7nEC;>E zfeqnvla?fLX^tQTEQ$9)6iO@VFO>?6w;6e#P)D_e%6X`pYV11c^ZYDJo=m?IGz1E0 z{p$g-@$x=PFpJP#zUX%a%Ww1LGsJAdjyIVKkrdMx?E6KvpeRPEx^@GXgffMb+0s_h zA{mo4d@xi@@0w zejwl22Gcc$>r^=WJjMr+ZuRCztP}#Y#dIjuc34s<$t(zdKqbpI1zSH<)u_M0_Yoni zVC_!V*%tUV5~H~~`U^a-5lsnMeUg~@PuLCK;6AxdH6#T3(TC?fbv8m8n9SLI zWGo{{(UfeF&~mSk)4PRUZS8RtdE_*%``)@~-s)>K(>)<5M_?{{u~RPZ zvn%RsT4s=ORZ3P2x~JtJbu&uLP6cP_+YA8O`BvkzGBJ6PUu^D5wXaOl*g+eMy^NfH zLGrFbJ>4wkxrZs}Ndf{$o;XH>=H^EV$ z)?SV}E%S19<`oID(98Z8>Pym;YY`VgF1{c(igtAHM-u+d-?Sn>Xc%r|i-T$@Eco=Q zOtwoHLv>OlNt^8GahhG@Qw7m9Fxoee_QKp{Q0NV%I#C6rqXp@V1rmqq1GEnk60x!U zgT_k*l(=?kl+JHR@T+8g@mj2u;xppz4N;$JY7)-Q7Z*yZ&^vqUWBQA(m7{gyq^4!5 z!ElI38C1Z0*eaoHxYxTV;Pyh&7ncRvB%YU;$p>08+M#E4W}U{bANZh}vX)Az>I9?5 zO-H9y&5{;l9<2lAcH-&YSrquGuIYu7Qs;?=@AIfA8cUG$%iwE+*{~O<=;k@ni}(h; ziz*~r#yGoh@Zu;;5eTl!RFzZU{LAeNb=Mhdf77*n`M4xhQ=Ik@P=tP8Z)BQ~x(09U zM$Pw#1A{^mEY^33I&Hn$dn7eOz9Nvqo`7?m(dnTs-4pQcT%Y#WKH#>&x%8{20CyT# zxx_zZfUQJk`fzQ0CBb8g=)11^OEKMyMh9Q!ilrO9oiwyIVT^iuvfSg@cXp-TcgbXz z6JRcoh9XT%A%vLdy!S-ZrpruCUQ(TXtU5F;{`k0CR3_c}2b(=k?3ZnH`L8H5@rxbn zytYLikY3NT`PMwfyotaz;S(;lC2MU(gSJd@b9ydK=`@S@>r(%CR5y;c3IJkK1muEB zVm->}(VPxCzyXVu=EiwNv(6tTWn8^e&0MS5BKEGO<2rx>gBEzwl=*or^4G z5nVO{&CQC)+)y@tnKSN{3I&Zw&*R*9IbEAC-H+pV^!;*km&wVb-1S#oGplMu6U-@Op(kE z3wN{pIQ*s@WbAu z!6;ctYkm-k0v(xAoD~c>P*IUh0G%JL!P_>SgHqNN; z9ZaUcU4AV_ylD`RgzoIVqQ13n(Lkgrv@@Z1d_aNyb`g-kB!1v1eFd0y35-NxozGJ#eB2`&hyRv6@sFkl>+7?Z>6oQpR zx}4LCSz7^YwZZ)dMX2Fw@b!mPx3Sh+m=y}h(POG!$}fV^s*|l_GO8S9ufCqzL)zbE zlihrxw_~$U&zPSoeYW7@2ec8x4C@a~Gz)&)l=`M0&L>`y{unoxdZH6cgnf-qj_lV! zm^4BY=DyMWeB~xE%e0+0toR$bE-Rj;c=j?j((!feFr4A|*9%rmV59GTy~kTV6EX-S zCZ;4KCic%1=3C-2!#iF;x>pH1SW&fr5+~FpZYwSapoNa(Fw20QBU+53?abnSK*j-* zR?#JfT?hyiid2WkGuI>0g%vr6?_2DanUaugW2UbQyXe{W&TyUBY=4Bv(E_H;v7=hF z*qEuvu%;T|h*ctxhamJw500|!QqiNVKeQCtmbSu7T%JAF!p#Q!@bi=AA3>g>StHL{ zt3w%o>{HfAQQvafVohX{ej0TCvCTbBoeG;pz*+m%eT%O8^PzD;q}JkWSW(z^X`yOI z+|}n_Z9lZW&ucwqJq2$DbkvMGYxhbUVaUaii;9ros2RN%X;p{_M$V-5eqvoa^pu`FVLJYaPuw#<3Ve=y>QY)l3L_ODTVr{{%3xvtcqawKE1Xx!Ksi zrJNxk_=Vi;jZCb7U~*%iImlLk@~pL!k{o0zK&i4z)gViFI>Re^`By9O7g!%z*Yj3pXHUv#q1n`Fv#YBslPf!uoufH3D=#lEGYcCt z8yn-B1f!F?E!fD7(bnnxABev(#DPvGjv#w5$j+Ah52lf^oikW~lJc#d{GayO*vrfR z3*Of0A1u7_!R%&a&&FEHGjGD?}ogo{|om&r2pyrU&3!v^6~(2I}_(W=E;Z)Q2uEjU}|RqG6no~ z$Id9yBU|UsWBI$DGM7fBL_Q&38OL4#F&wrgWco}i<6rL$ntLxijJVSs5G+vcdPzD znZ7}>v74A0v6z}La&mI9F>>%488aGjaI-RUnsIS)ahsVKahq`b1!ZaikhF8OF?#Dx zkd2W!klEhW{I7~XgabsBWCSSLnEr0{uM#C|Be2<nF_xBL62K`kYwGH|4U~Xv9p+&vKqZn$_X@KmGu8n3j z4^J#?9E>cijBH$LY-|8_E&wa{2Nre!3kxOlKOAQMGphgTF+cPFhZFw41paLrc+>m4 z>}`5^o2{7tHC_FKvp+QcKRo`?7yl1ic!U0LBmXOY|4Y|@>H1$W@V^rNZ*={auKyJS z|107DM%VvubRqrEh6iZ-whD56+sw_kYVbrUqR>`@<6prY(B&v~*r057;wXQDjVx`Ex?1fx3iPQVTk7t}I<8iKeTAvKo zB2)0MMamF|>=Zo9pS8pIkRA9Eos&Jo8{AfYf%3VpwM+HmX#$|^)m|eAB8a2~T|csJYr(AU#HKwzzEKAbElG1EL*9DcbLEtaj zDsT`*@d@N(x-nP59k%okM#kkb>;Vzy7P@^^5oX87H})WWeyzqXFKcv#p1xw7w4;v~ zqe0VweBsU)%M^lzPhY!mA>iS8MZ3;FL3AA#-*+ZNlNJ$3gB<2_10nLi%^+TkbM^oR z-^r;HWZa0$$P$X6OK02=lZ+1T;!ag?|3syi4P-?<z1+2PX+pf zZfVUszzg3*KpsfF}2yaw9j}b&@@^Q_*v{ce6I09zey{x+Y8zgyEe~w!1fpr2jDhzT1tUAs{JIvX+ z`uN5u#F>b6_x=(w2}6>`mtmH4oS>ZCWw|as;sh`K#4*{7tLq0y71@S~W7f=1Unk7m z(3H!HWg|-%Rgku*BxT~=_w3i!Uyol&Z-2DD452+(AG6d;ZS5n!Pr?P?e%xb1jaPxn zy00_jYCsSMb)Vk*@tktGAbp~}niuCJRce7DKllML`xP2(-u<$N+-sFQ&`)2;l)u{T z2wi1zIedtgcfO?`cFQk!R+|2N?L7>SPEL=R%~{S2DCv8>IQf?ttKF|TwyO*=IGWjM z%Gjh<{LWf|8zm^P5a0&P;kJI>*tjf~girq?|P^st%bJG*fQ6xr%+=Y35g*6*7hK8+K-910q72utJZy>hMb)uD=TYN!&# zmO!msK9e$%c;Zp!Te85QUCB%#9bHIgT)}8l1i|x<1N1Fnvq;pU(Mje`3$%2z8eHF= zDfjaQyGHNCdLIv`a>RJBibxTv5@xXTnAp$fm_&C<EE2 zM#yWt88gHNA2d?FX*fB%@ONUnZleY0>byUM*-7ko&BvY%mPDX4qju2jC=)GRQT-%G zdfx|3h>;9USaTWup$Qvwu~kQW@PmDfrq1%IrpD`_c7m&iFKoJs^;ff%_p2H&WbCb> zTx26I0msA-#M!xBFG%U`8Hgob=H0{$1!haFcx(A{Y?8)MmTWgs7*V$*%g?JL$_%Q! zG5Tp&gS6RJTt=1w(hd_k;}<7FL?%`P`yPSwvRs&OIUe_7zgeE(H8UbBP zb7BmW;?-0Nuzny`KWo;UP7=qvlYqrK)_O4d#s>|i4MmIGXBG)qQH~c>gdzEEushPY z>TU>L2X70tD!W-S+&->igl^**Gxx4sL8=ZX?x$5c8A}Apa08Or35Y={A(vld1*_=h zFf~BK4haSd;SiSWIX6w{-5sbRwu2^U2fUuoSduM}jj2YfsKur7(e4z4A8X*uEi+0K zy?>jg?35Y$e5+C)o5@b(zaeOL!BrXg<VauNKeaBxCoNtld^j9J*wJ zEvDlWKe5+))AOZL=i0foqn>a1R0yK^DoIzw9}Tn_x_Vc{BJ51R2oe|;CY&?!0t89U zgZvcA+%Dr$5qNy<{HGs&$*+41f7L1`kvifc-0B8xG=xKr`}aX)*&5^p8lqGtta`W` ziXsHCeP6w-~kVeex1x`J{I> zyGNBu7T<`R*~pnTsmO+m?r#VvryrR~Z2J)|N3GC#wXFD68E@vtwjpMpd8RkH70EVWv2b4eUmXp4(lvY2#S0*=dy2COK1HepSP zNYU18SRHo1h`w6Xt6E;Y{$*&ifI3t;L(EI@#GN8sA}1_@+xboaP(8t=Rjr_}8Sca` zX>LBClqJYW8b5@&RR#toN0K&;d`_-P52C^qS0?y+4l|{!;796QhsFhRO|Ktb$7GIv zt~lR-*l%Mb(Kz#vq2irOa}%=#oe_|rAUFW2_d?_s22_EnZh8FX@MtL#jR6t4*u=O& zmLHlzvT}X6N?PHLd$n!9v4Abrs#)~GCK%D)0n@&gWs?M9TLu$R1Ufgb(y|XlO+*$E zGYJVX4`KSqjd>nbkxqnI;))aYV?q#JgmfY{0pTT)^_^p!f;jsBQWnYutl)u4k zHB~rb@9v>_e5 z-Bzd2%blie7sS0&Kp}tqPqS~(PgkDuYncI!?`%(TOJV3`Jcdfrb)r_^d7rx7#L zwQL;R$g9d$Jc*?8O!rlr{WkUE=DzSe3U6fv5x!2HwuDdG4-eY!S#jEcMpQDC0vS5m@O~hkF^}2YzWlN^m=y->=gt%%@m$ zA1)JR2;+;On@_?TlQW1xbUj4z)A@P!WI1~5D8A>sZoAH|>$4YaErfIP+7h`LD}bUO zmwE^ji-ADZu76g|+1NZ4y2Sysr=gV1Z6K^eHDj9&G7__#=UyIFf9v%AsMsS;(vBfS z@(3cdw%-MAP60_UM$%fMTHV(r2zFhb)oR6dSe#~h`LkhG%O46p(vTE^9|THssjv^= ze#Akb30=pXfm;_8DVwD~0>Y##J0VYUQBJ=KR7*@x(ai;A{m>M>H;cIaM2j=wE4Vw{ z>yTKzN-1wY&OWg_YEA&kz+_@eBP#Ys4`7K}bblXIqHQn}=mg~pj@h`>qsqjtToV5t z0r_$f@~%wbhcXUqMb!MgH?e;#xlD1y1GYwSm9GZ|Oz}7}`#e!$Su!l7b468wq=Xp( zTx3l+p@^14q6)GK!xo(gZ78`{FDxFDhRh@`4qbknH0&u%m}Vw)(utFcFWIKIOX)ke zvtOrQX@n-S`NdXSBNlxNDR3j}t%dR7$*D=hhi*JtHgY`o!pg}yWM`GFE?#y9v-Vl; z5B(S_OXOxO23wQecXSvR@OV@=J}D4as%=XykC{_^6_^1IJgYc?*>W2AA&6-ef`Bql;I^nag&EPqZro3jtGPt|gCB zclkZ*8@i$hJ>ppXtRmQ}ltTI-C0U7tprC3R=^rW=5RS|`>XB4C6QMg3!9|Pj=9_^u zrI!k|QPo9K{)u@r2ODh$xDa?YWeS}W7fyIpYktKkzl+}93cq5W6d)yU<4-iKq%1YlM#)Z?~Ctcj`#}NCiGboqnF4ijH8Ms${bW_4_v*XpQGTAxNyPRLxof% zF61Gu{YYe2T1w(+K0zu$t2iunw}r+!vCEy2^6jzz1NhYa0zCg6MpVT9rbm7ln7|Vg zp7>>|KH}}e0~+O9%r1Kx^1p^0s^^X$XT~i0F1;yNPxBP4d5f{_6fGPG_a6Nl>McS= z8)*sQH*i+viW+2Br435x^@BGQ2?utaw@lWaxUx8Yefl|O&Jv+FIgcyr>L6^J^8TKI z1ouf!a>of*SqxR?>K8g0gfT;Qq#gQ;7j+Mz%cl@}_p>1;Gy?DY;|Rh=6F??grb3o4 zFKpS$w*_ERYdc0wNUzQBv!<{?*LkS4xPUtp&E@9|73v7A(w1DV8%aGT=q)0Zl$G=rf<#n(QdM$-jKOX{uW2{dSFxc* z%SFP5Wiis0$klpt`v(T3r>^I4JJbypd%iF&w|e*29&v}ghX{5;4PWA+Xv<$eir?d1 zJxC{f7kO3h{!0}F7(J7;d5Q{Ln|&#yT{EtQm5m^le#97M8tPFuqgPQ1OL`MT38wec1^4=-abHnE9%2=K zQh+fH2kv$!ozZ@iAhjT)K?`t`19DHuY+=u=S+6z>dN8C6W=4Q zR;Qr?$jj={KU<{`zWvh^Mw^|Kj9Wl}{KRGd7NC}Fl*2+#UFm*ebZbqCH8hcgW~y=XKNOKN#VK_+p{ zZe<#Z^lt1?Fbe)iKwYZ>2Os_!a{Pf4Wx(N6(F_Q5S!xB|Jtp0|otQdt;lj^Bh3X%8 zUs_5v!d79>Dw&X992+YRqGOhF?$kT|T;+b2ms%11O`M(kBDI z_uS3MxZ!>Fs#8nLWrFR} z-A7DEj&)^mbAMwA?m<(1$exEhV(WLxpd}hmT}2%Sgvt42fRI3?-&?ePe*&M~%8Ae* z(VzsYR;Z0+QdYn)QXo?*5nJ(5XA&f7V>7cEz6FeE<+;DG2uezz3+JX3#+T@Gh?;I` z)^mh9&bS?|Jy01^CWee@aXA6f6_=JaYnv0#^9EU*wv5(Bm6q;<1Muwn`4@CIx?k@Q z_sWDIViS;#h#e+fqIH0uXt0KBwA1ogcg49Hdk%PH!nW&H&xf=3wEDq-AMOLq&)(zf z4)6}dc7~#zopVUFi+8$Z^*nVP2a{(gEd6!Vyc7EteQx}cR?$~4I*kQ>5|5<~W@CLl zBEd#9-TaeFx6ygBXo*jm`;5-Pc7I{^TkdfK|oLaW;quQU~=TAQ06CmWOz08 zW||;1NBRu-jCyQfb;vM;1NOG|3@Wq){$YP+-*ACPAZg&qCZQtTNWykrUP1VFPAQ6n zmg>$G@OGGQV5<9u+AJA3bYY6U+5qLZo^9@K6P;6P6=X3bgg|h590yK|Q(wT*;<91c z5a*Bv(DyHKM$uh9i9;XNy>#f@P}vrXGsEzHo&C~M_z~%o&gR7$7PW&3j{KS;agjVW zgJZ`XJerWpGLqXvWNa zAE=&H8cg(|bsqncUx%T~Q!%a3w3a}Eoz!-LK;0!8unv_W#Qu6J|TLyz|=QZ|~QX%Qi-g?K&k;QAZflY-5DN!#6FluJB#8B|JSV z8nj$bmOoB5;-`|jZRkM=J-Z5>YoVRlS8T#uApX|SR3|DT=~sghX_54)n^#j0PdL0z zE54mfsK8N9%SrD49C;h5FSfmHQE%p7dyw=taI8?bXa%o^8k z-Kn~X+t0(Zm=#Fezm_IPq+#h=N zXQ*pPtxhhlBlwFdWP8Z1b$%wWAS^BsHXtTwC8SFndV=jITha_@bV&UZ5{AGbDwqXS z+HkL1iLduU&m%%-)JbRiwCrd1%R+TbqtVOxQxbgz0Ou|NnPD=MM8$1QwE^oVtQzV!_i#-2sZvA<-$mf8sJ@|^` z)olOd%qZkfkcN?R&S~$sn20#ZC*sLX@k;GHIEJ>kJa#T|PNXoQsHO+w(Cy&m+%h*3_i=Yk24~Ry7Hk=`#vH+oA=PZAr*QaD-EgLgjty<%@yu zQ^(^AZ{>MhH;>f89BA*aRTA&>`5QtHA1^< z=z`m4Yc(fni*-Y4U|@S!MKwWX2i9|MqEVpt=?Ycw&VX63W%SnGOVJnbIDXsl7(I|T zw1DwVCuyC}_l4c<6^+bm!+-Bi5c%TS?I8ViY1u~>@#bCEgwMrhX!aI!zd_X5@|}>Q YFc7Y&c)R57IXZ-lgo1d5sA0hW0V%wI&j0`b literal 0 HcmV?d00001 diff --git a/res/texts/en_US.txt b/res/texts/en_US.txt index f26803bd..3a25444c 100644 --- a/res/texts/en_US.txt +++ b/res/texts/en_US.txt @@ -2,6 +2,7 @@ menu.missing-content=Missing Content! world.convert-request=Content indices have changed! Convert world files? error.pack-not-found=Could not to find pack +error.dependency-not-found=Dependency pack is not found world.delete-confirm=Do you want to delete world forever? # Bindings diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index 61a33233..65085d46 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -5,8 +5,10 @@ Ok=Ок Cancel=Отмена Back=Назад Continue=Продолжить +Add=Добавить error.pack-not-found=Не удалось найти пакет +error.dependency-not-found=Используемая зависимость не найдена # Меню menu.New World=Новый Мир diff --git a/res/textures/gui/no_icon.png b/res/textures/gui/no_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f2229a0ef16057b4ea97367b399c4fbb40f285bf GIT binary patch literal 15396 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 literal 0 HcmV?d00001 diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 0087389d..9ef4696d 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -60,6 +60,7 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, bool allAssets) { loader.add(ASSET_SHADER, SHADERS_FOLDER"/skybox_gen", "skybox_gen"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/menubg.png", "gui/menubg"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/delete_icon.png", "gui/delete_icon"); + loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/no_icon.png", "gui/no_icon"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/misc/moon.png", "misc/moon"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/misc/sun.png", "misc/sun"); loader.add(ASSET_FONT, FONTS_FOLDER"/font", "normal"); diff --git a/src/content/ContentPack.cpp b/src/content/ContentPack.cpp index 3053d697..087eb6cb 100644 --- a/src/content/ContentPack.cpp +++ b/src/content/ContentPack.cpp @@ -67,8 +67,17 @@ ContentPack ContentPack::read(fs::path folder) { root->str("id", pack.id); root->str("title", pack.title); root->str("version", pack.version); + root->str("creator", pack.creator); + root->str("description", pack.description); pack.folder = folder; + auto dependencies = root->list("dependencies"); + if (dependencies) { + for (size_t i = 0; i < dependencies->size(); i++) { + pack.dependencies.push_back(dependencies->str(i)); + } + } + if (pack.id == "none") throw contentpack_error(pack.id, folder, "content-pack id is not specified"); @@ -92,6 +101,12 @@ void ContentPack::scan(fs::path rootfolder, } } +void ContentPack::scan(EnginePaths* paths, + std::vector& packs) { + scan(paths->getResources()/fs::path("content"), packs); + scan(paths->getWorldFolder()/fs::path("content"), packs); +} + std::vector ContentPack::worldPacksList(fs::path folder) { fs::path listfile = folder / fs::path("packs.list"); if (!fs::is_regular_file(listfile)) { @@ -111,8 +126,7 @@ fs::path ContentPack::findPack(const EnginePaths* paths, fs::path worldDir, std: if (fs::is_directory(folder)) { return folder; } - throw contentpack_error(name, folder, - "could not to find pack '"+name+"'"); + return folder; } void ContentPack::readPacks(const EnginePaths* paths, @@ -121,6 +135,10 @@ void ContentPack::readPacks(const EnginePaths* paths, fs::path worldDir) { for (const auto& name : packnames) { fs::path packfolder = ContentPack::findPack(paths, worldDir, name); + if (!fs::is_directory(packfolder)) { + throw contentpack_error(name, packfolder, + "could not to find pack '"+name+"'"); + } packs.push_back(ContentPack::read(packfolder)); } } diff --git a/src/content/ContentPack.h b/src/content/ContentPack.h index c233532a..6f82519a 100644 --- a/src/content/ContentPack.h +++ b/src/content/ContentPack.h @@ -24,7 +24,10 @@ struct ContentPack { std::string id = "none"; std::string title = "untitled"; std::string version = "0.0"; + std::string creator = ""; + std::string description = "no description"; std::filesystem::path folder; + std::vector dependencies; std::filesystem::path getContentFile() const; @@ -36,8 +39,12 @@ struct ContentPack { static bool is_pack(std::filesystem::path folder); static ContentPack read(std::filesystem::path folder); + static void scan(std::filesystem::path folder, std::vector& packs); + static void scan(EnginePaths* paths, + std::vector& packs); + static std::vector worldPacksList(std::filesystem::path folder); static std::filesystem::path findPack( diff --git a/src/engine.cpp b/src/engine.cpp index 8b39b825..32673e11 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -176,7 +176,7 @@ void Engine::loadWorldContent(const fs::path& folder) { void Engine::loadAllPacks() { auto resdir = paths->getResources(); contentPacks.clear(); - ContentPack::scan(resdir/fs::path("content"), contentPacks); + ContentPack::scan(paths, contentPacks); } void Engine::setScreen(std::shared_ptr screen) { @@ -212,3 +212,7 @@ std::vector& Engine::getContentPacks() { EnginePaths* Engine::getPaths() { return paths; } + +std::shared_ptr Engine::getScreen() { + return screen; +} \ No newline at end of file diff --git a/src/engine.h b/src/engine.h index d4b98b91..595b80da 100644 --- a/src/engine.h +++ b/src/engine.h @@ -63,6 +63,8 @@ public: void loadContent(); void loadWorldContent(const fs::path& folder); void loadAllPacks(); + + std::shared_ptr getScreen(); }; #endif // SRC_ENGINE_H_ \ No newline at end of file diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index 95449b46..2de7829b 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -453,13 +453,18 @@ void WorldFiles::write(const World* world, const Content* content) { } void WorldFiles::writePacks(const World* world) { + auto packsFile = getPacksFile(); + if (fs::is_regular_file(packsFile)) { + return; + } + const auto& packs = world->getPacks(); std::stringstream ss; ss << "# autogenerated; do not modify\n"; for (const auto& pack : packs) { ss << pack.id << "\n"; } - files::write_string(getPacksFile(), ss.str()); + files::write_string(packsFile, ss.str()); } void WorldFiles::writeIndices(const ContentIndices* indices) { @@ -574,3 +579,15 @@ bool WorldFiles::readPlayer(Player* player) { } return true; } + +void WorldFiles::addPack(const std::string& id) { + auto packs = files::read_list(getPacksFile()); + packs.push_back(id); + + std::stringstream ss; + ss << "# autogenerated; do not modify\n"; + for (const auto& pack : packs) { + ss << pack << "\n"; + } + files::write_string(getPacksFile(), ss.str()); +} diff --git a/src/files/WorldFiles.h b/src/files/WorldFiles.h index 3b76bf7b..291604dc 100644 --- a/src/files/WorldFiles.h +++ b/src/files/WorldFiles.h @@ -146,6 +146,8 @@ public: void write(const World* world, const Content* content); void writePacks(const World* world); void writeIndices(const ContentIndices* indices); + /* Append pack to packs.list without duplicate check */ + void addPack(const std::string& id); static const char* WORLD_FILE; }; diff --git a/src/files/engine_paths.cpp b/src/files/engine_paths.cpp index 482ff029..a657a3ca 100644 --- a/src/files/engine_paths.cpp +++ b/src/files/engine_paths.cpp @@ -43,6 +43,10 @@ fs::path EnginePaths::getWorldsFolder() { return userfiles/fs::path("worlds"); } +fs::path EnginePaths::getWorldFolder() { + return worldFolder; +} + std::vector EnginePaths::scanForWorlds() { std::vector folders; diff --git a/src/files/engine_paths.h b/src/files/engine_paths.h index 29b3b2e7..760a1ba5 100644 --- a/src/files/engine_paths.h +++ b/src/files/engine_paths.h @@ -12,7 +12,7 @@ namespace fs = std::filesystem; class EnginePaths { fs::path userfiles {"."}; fs::path resources {"res"}; - fs::path worldFolder {""}; + fs::path worldFolder; std::vector* contentPacks = nullptr; public: fs::path getUserfiles() const; @@ -20,6 +20,7 @@ public: fs::path getScreenshotFile(std::string ext); fs::path getWorldsFolder(); + fs::path getWorldFolder(); bool isWorldNameUsed(std::string name); void setUserfiles(fs::path folder); diff --git a/src/frontend/WorldRenderer.cpp b/src/frontend/WorldRenderer.cpp index d61394b4..7cd2f0f2 100644 --- a/src/frontend/WorldRenderer.cpp +++ b/src/frontend/WorldRenderer.cpp @@ -37,8 +37,6 @@ using glm::vec3; using glm::vec4; using glm::mat4; -using std::string; -using std::shared_ptr; WorldRenderer::WorldRenderer(Engine* engine, LevelFrontend* frontend) : engine(engine), @@ -76,7 +74,7 @@ bool WorldRenderer::drawChunk(size_t index, if (!chunk->isLighted()) { return false; } - shared_ptr mesh = renderer->getOrRender(chunk.get()); + auto mesh = renderer->getOrRender(chunk.get()); if (mesh == nullptr) { return false; } @@ -102,16 +100,15 @@ void WorldRenderer::drawChunks(Chunks* chunks, Shader* shader) { std::vector indices; for (size_t i = 0; i < chunks->volume; i++){ - shared_ptr chunk = chunks->chunks[i]; - if (chunk == nullptr) + if (chunks->chunks[i] == nullptr) continue; indices.push_back(i); } float px = camera->position.x / (float)CHUNK_W; float pz = camera->position.z / (float)CHUNK_D; std::sort(indices.begin(), indices.end(), [this, chunks, px, pz](size_t i, size_t j) { - shared_ptr a = chunks->chunks[i]; - shared_ptr b = chunks->chunks[j]; + auto a = chunks->chunks[i]; + auto b = chunks->chunks[j]; return ((a->x + 0.5f - px)*(a->x + 0.5f - px) + (a->z + 0.5f - pz)*(a->z + 0.5f - pz) > diff --git a/src/frontend/gui/GUI.h b/src/frontend/gui/GUI.h index df3cdcff..3e159f4a 100644 --- a/src/frontend/gui/GUI.h +++ b/src/frontend/gui/GUI.h @@ -45,6 +45,7 @@ class Camera; namespace gui { typedef std::function runnable; + typedef std::function stringconsumer; class UINode; class Container; diff --git a/src/frontend/gui/UINode.h b/src/frontend/gui/UINode.h index 668e4d97..6f909ba5 100644 --- a/src/frontend/gui/UINode.h +++ b/src/frontend/gui/UINode.h @@ -81,7 +81,7 @@ namespace gui { virtual glm::vec2 contentOffset() {return glm::vec2(0.0f);}; glm::vec2 calcCoord() const; virtual void setCoord(glm::vec2 coord); - glm::vec2 size() const; + virtual glm::vec2 size() const; virtual void size(glm::vec2 size); void _size(glm::vec2 size); virtual void refresh() {}; diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index 626c47de..54188b43 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -22,6 +22,13 @@ const uint KEY_BACKSPACE = 259; using namespace gui; +Label::Label(string text, string fontName) + : UINode(vec2(), vec2(text.length() * 8, 15)), + text_(util::str2wstr_utf8(text)), + fontName_(fontName) { +} + + Label::Label(wstring text, string fontName) : UINode(vec2(), vec2(text.length() * 8, 15)), text_(text), @@ -64,6 +71,7 @@ void Label::size(vec2 sizenew) { // ================================= Image ==================================== Image::Image(string texture, vec2 size) : UINode(vec2(), size), texture(texture) { + setInteractive(false); } void Image::draw(Batch2D* batch, Assets* assets) { diff --git a/src/frontend/gui/controls.h b/src/frontend/gui/controls.h index 60587248..af77863a 100644 --- a/src/frontend/gui/controls.h +++ b/src/frontend/gui/controls.h @@ -32,6 +32,7 @@ namespace gui { std::string fontName_; wstringsupplier supplier = nullptr; public: + Label(std::string text, std::string fontName="normal"); Label(std::wstring text, std::string fontName="normal"); virtual Label& text(std::wstring text); @@ -40,6 +41,9 @@ namespace gui { virtual void draw(Batch2D* batch, Assets* assets) override; virtual Label* textSupplier(wstringsupplier supplier); + virtual glm::vec2 size() const override { + return UINode::size(); + } virtual void size(glm::vec2 size) override; }; diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index a7701e9a..6f8957af 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -11,6 +12,8 @@ #include "gui/panels.h" #include "gui/controls.h" #include "screens.h" + +#include "../coders/png.h" #include "../util/stringutil.h" #include "../files/engine_paths.h" #include "../files/WorldConverter.h" @@ -98,6 +101,25 @@ void show_content_missing(Engine* engine, const Content* content, subpanel->add(hpanel); } } + + for (size_t i = 0; i < lut->countItems(); i++) { + // missing block + if (lut->getItemId(i) == ITEM_VOID) { + auto name = lut->getItemName(i); + Panel* hpanel = new Panel(vec2(500, 30)); + hpanel->color(vec4(0.0f)); + hpanel->orientation(Orientation::horizontal); + + Label* namelabel = new Label(util::str2wstr_utf8(name)); + namelabel->color(vec4(1.0f, 0.2f, 0.2f, 0.5f)); + + Label* typelabel = new Label(L"[item]"); + typelabel->color(vec4(0.5f)); + hpanel->add(typelabel); + hpanel->add(namelabel); + subpanel->add(hpanel); + } + } subpanel->maxLength(400); panel->add(subpanel); @@ -248,10 +270,109 @@ void create_main_menu_panel(Engine* engine, PagesControl* menu) { })); } +typedef std::function packconsumer; + +std::shared_ptr create_packs_panel(const std::vector& packs, Engine* engine, bool backbutton, packconsumer callback) { + auto assets = engine->getAssets(); + auto panel = std::make_shared(vec2(400, 200), vec4(5.0f)); + panel->color(vec4(1.0f, 1.0f, 1.0f, 0.07f)); + panel->maxLength(400); + panel->scrollable(true); + + for (auto& pack : packs) { + auto packpanel = std::make_shared(vec2(390, 80)); + if (callback) { + packpanel->listenAction([=](GUI*) { + callback(pack); + }); + } + auto idlabel = std::make_shared