From 97da66cd44eac394f8b5a64171b257524d1ea530 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 22 Jan 2022 13:33:16 -0500 Subject: [PATCH] New environment blocks --- .../blocks/environment/dense-red-stone1.png | Bin 0 -> 342 bytes .../blocks/environment/dense-red-stone2.png | Bin 0 -> 339 bytes .../blocks/environment/dense-red-stone3.png | Bin 0 -> 348 bytes .../blocks/environment/dense-red-stone4.png | Bin 0 -> 255 bytes .../blocks/environment/red-diamond-wall1.png | Bin 0 -> 722 bytes .../blocks/environment/red-diamond-wall2.png | Bin 0 -> 699 bytes .../blocks/environment/red-diamond-wall3.png | Bin 0 -> 708 bytes .../environment/red-stone-wall-large.png | Bin 0 -> 955 bytes .../blocks/environment/red-stone-wall1.png | Bin 0 -> 373 bytes .../blocks/environment/red-stone-wall2.png | Bin 0 -> 345 bytes .../blocks/environment/red-stone-wall3.png | Bin 0 -> 349 bytes .../sprites/blocks/environment/red-stone1.png | Bin 0 -> 298 bytes .../sprites/blocks/environment/red-stone2.png | Bin 0 -> 261 bytes .../sprites/blocks/environment/red-stone3.png | Bin 0 -> 218 bytes .../sprites/blocks/environment/red-stone4.png | Bin 0 -> 251 bytes .../blocks/props/red-stone-boulder1.png | Bin 0 -> 544 bytes .../blocks/props/red-stone-boulder2.png | Bin 0 -> 559 bytes .../blocks/props/red-stone-boulder3.png | Bin 0 -> 543 bytes .../blocks/props/red-stone-boulder4.png | Bin 0 -> 621 bytes core/assets/bundles/bundle.properties | 2 + core/assets/icons/icons.properties | 6 +++ core/src/mindustry/content/Blocks.java | 38 ++++++++++++-- core/src/mindustry/editor/EditorTile.java | 2 +- core/src/mindustry/editor/EditorTool.java | 7 ++- core/src/mindustry/editor/MapEditor.java | 12 +++-- core/src/mindustry/editor/MapRenderer.java | 3 ++ .../maps/filters/GenerateFilter.java | 5 +- .../maps/generators/BasicGenerator.java | 4 +- .../maps/planet/ErekirPlanetGenerator.java | 8 +++ .../world/blocks/environment/Floor.java | 49 ++++++++++++++---- .../world/blocks/environment/StaticTree.java | 7 ++- .../blocks/payloads/PayloadDeconstructor.java | 2 +- 32 files changed, 119 insertions(+), 26 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/environment/dense-red-stone1.png create mode 100644 core/assets-raw/sprites/blocks/environment/dense-red-stone2.png create mode 100644 core/assets-raw/sprites/blocks/environment/dense-red-stone3.png create mode 100644 core/assets-raw/sprites/blocks/environment/dense-red-stone4.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-diamond-wall1.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-diamond-wall2.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-diamond-wall3.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone-wall-large.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone-wall1.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone-wall2.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone-wall3.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone1.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone2.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone3.png create mode 100644 core/assets-raw/sprites/blocks/environment/red-stone4.png create mode 100644 core/assets-raw/sprites/blocks/props/red-stone-boulder1.png create mode 100644 core/assets-raw/sprites/blocks/props/red-stone-boulder2.png create mode 100644 core/assets-raw/sprites/blocks/props/red-stone-boulder3.png create mode 100644 core/assets-raw/sprites/blocks/props/red-stone-boulder4.png diff --git a/core/assets-raw/sprites/blocks/environment/dense-red-stone1.png b/core/assets-raw/sprites/blocks/environment/dense-red-stone1.png new file mode 100644 index 0000000000000000000000000000000000000000..d45750c6a481b31121787008d41ba20f655431f4 GIT binary patch literal 342 zcmV-c0jd6pP)Px$5J^NqR9J<@m&p;sAPhxg#y5(f0s2S*DKyQv0TAov?TA>nVDbMODQwI8 z`T9Km6s6|NSn3n7B(GVowQtAe_tGjLC0ot4S_zv#jd{!^t;BtdY6lldO0Ys$T32e8 z0U{tUsHVA^lm{TF7y`g5V_iL}7H}ohj#HWkG=0YpK-fNuu%D)2(|^WYv(YUZ!yqY#{V3-V#YiE2PJ<|lwBEH|m4 o<5+^wyaBjaJ(DmH={r@0FA_43ff~rMP5=M^07*qoM6N<$f<&l{y#N3J literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/dense-red-stone2.png b/core/assets-raw/sprites/blocks/environment/dense-red-stone2.png new file mode 100644 index 0000000000000000000000000000000000000000..acb47bc1fcc8759a0de2b445c69b4b88e3427925 GIT binary patch literal 339 zcmV-Z0j&OsP)Px$4M{{nR9J<*m)#YEFbIWPPTw5D1>C~{I%t=10f+FpeTpX~`~(8IPZ}}zQ-Q?i zXMcYmleBJ2GX^+-3X0NsT+R8bHm{Fya25n$a|$R^AQ{bo04*RBV%-)UAPb_**#$6a zBt1YX0In=IfTtw2$|`fJ08!=~1V{$a=2Q%DMtH0wQ&it*s-QNc%)LgM{&L_vF4a65 zLQF!<1Yfu0j9LY~Pw0WDV@Lq&>$O0T%khZ01%euDc0?nRAh@@314Lyt1tEQs^wm&P zIDoZ%lbvv;noc+(&;89O@IqMbs~0sg2dofQ^ZJPx$7D+@wR9J<@m(dY}APk0E&Nqf&0ruzs9kk1^07LNHK4C#g_ya-zJMXFn{!da9 ze12Z<@8cplZ%@}YE+B@a3J^o8JYq;CjmxV>(MNR1gB@~hu}g@^Mk~Y>J^yHr^Gz}K5ffq@+mRTYJQlY ut$Egb2WTmqt~6%>w9I>Aw`5x4=Kle=PpsU*^&})t!gA{J1M_6PTRgTb%rEdgW1PaMpn77LpyENHw@mkhwuVh-P>N-` zCwoz~AgTe~DWM4f D?7L$X literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/red-diamond-wall1.png b/core/assets-raw/sprites/blocks/environment/red-diamond-wall1.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4225fb7682993ab88e264e82bd634133dd324e GIT binary patch literal 722 zcmV;@0xkWCP)Px%j7da6RCt{2nlVlTF%U&(5d{(*7k~rM0Ed7Q1Qi7(7vLIj0XitCK%s;~genI} zEu28jVJyvAuMfo&CPu8~gd-_F1*>KGX)` zicg_wj%Y_YqC;pHA=W{uco#_{*c;{)?jmKv4rgOh;w51f~qz*M5 zvi=kkZ;6?Zij30QK`{aS2aI@2s4!yDHUahH9Pt2n1FTriRIp%;5GjI~nZXt53+5=I z*y5NpAouBG2t8p56EF7pg#Rr4M^oT_bM`Ff@%a{#pO($r3@+s`j9k1 z)d0;UG8T3NQfmN=38CMVm=~)9RZ^f&%zV0v3YCbUYBj(YixtOh!Y*rTuwDh`ybIK> z3!|6?BpICn+zX}A89*WSW*9Z#>idJV%TjZnFc+~1kT5}Fw^=j=h7bvvk^NjC7e6&(24N3ga<;}< zPlhx|9ma~B3-}Dx1j@-!Rt>NhBQC$*t6p*pr3tkzkc(h#6MRk{U*r!*`)*;l_XV_Y z)4+S{r8+&j0`b07*qoM6N<$ Eg7R@O2LJ#7 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/red-diamond-wall2.png b/core/assets-raw/sprites/blocks/environment/red-diamond-wall2.png new file mode 100644 index 0000000000000000000000000000000000000000..f9020a83c589012f754ff94aa77c12ba37364011 GIT binary patch literal 699 zcmV;s0!00ZP)Px%bxA})RCt{2nlVyBF%UraI~L5)c>y>84RQ!=8Lcd|;{tjNynr1Rbd0tf0&O?| zT!4-lx>z`2V)*$#+3arOkT+xD@cCgMyPM<_fI^{AC=||?N^-E>e4^T}xq5gL{Y>nG z`2_7kLI&FaF@f7~iXgu+W#A@U5-uoj#uYp#Bv!wk9~A&Vf7GG4ofA6?l=}5uRroNX z1?b>4sU!g4M4(DQDfMSyNp|yzGD|Jy+Xp~qfDZoq<>|x%cLvz#j8ICUWS|9n-rg$! zfZm{c@_H%>7*Hjkg9iZEuJ_on$%vVKf(3ls+?@>epCyp31562<)q(1^L0}{V)lS{F zZ)5fZ-(Fw}qv#(YJ;D1zpWrni66&%=Qi9h-A;D{WBs7(Zl!Vp`Fu`kF5`24vgap#f zP!pTg;rJ&>TVre#5cBQFBDI(j%YYChSCVW3>Xyi>N=RVKfbDvp#WuMO_7aGdz?}t70psOD^f$UDI3=)W0M(QjBcW+S#43P# zJ%EuAwHwT-3^4dS4`|JRoFs5;l2}WiOoKoxA*2WRJ`?m3kW(2@Pl?_c5F>%Q6euMG z2PLshHih*D-Q)lE`&~_u<#z!M)pJ5S7~d>$N$ih0uvs18`t?01CRAFdd{_$5oJpYq zP_sZzP0=JYc!0Px%en~_@RCt{2nlVlTF%U&3hysa@3%~(rfI~nDf{KEY3vdm%038%mpisggLX`s~ z7odxj&QwO0*ItjuGh;{b?|`u0|90lvu@|7LtE;PPdo`&w@bBBbaeqFzeXepZs)PEb zL(&EzJ{ZQdFHH!d15wPo(g49eK&k1FBtfuVSi-z7ZWudU7y5a)6E_bKhinXOcoqQG z{9?A|xLi`4l|}+!jQJ<7_2hkVK`5$#TIQ`>2$Kmd8c6?TjDgRK8v_7vc)UOO`_b7R z>1Ikq4M$Q1Sn~h?%lV3OiDr}yV0wO?EPJgmbVbbsmRVpqUkxf@Qy^sZ4d&_lnb3M3 zpg)K)Z`DFDVj-YDlw%$s3;-Yw!EYBXSQrRwOJP^BnZY-@n5~0Z5&OM_c2gh7eflZY z2*)vvRsgs8T$RGY%nH#SDK#IN;F|!g7 zVj2LbZ9XM#2vu4DV_s|F#0nrM_%PCdP^AJ|S_@R01xg@r0vrIi`uB_VLPx&bxA})RCt`_nmukKF${$nBb}@C0fIDJrO6f2Y!zUEz0Y20kK)F?krTK|oh`Bo z7@0qhq%<}>4=`YlrIGYWq$tkZ{Qdd+gZ}H`X-jL<&kIe!L^1&s8wWDM~BqQXKBhpC2zD{lx}>DBsbD8O>+|z2`={ z$ju=#khlH&*Jq}XHqbtZ0EprcvV)G!esn@SsQ`#@2${h@JZ(dRpS7|~07N!~Y^P?< zdQ`W5k<;CwqDvY)5wHTTT`+)ZptL(2X?Hk^GkVU*bCDIm;q?&OcMZbqfN44aY2`Es zl2et0K#+D7q+SU?YgB6}V>THG{J-|S6bT~oXj_Blp|+%|IYi6`2EaS5IkR&daCl!b z&J>CRw1%4^1NUa%Qa`}fhdx*vz5@E$kJjPJZl~Jdk+POt0R2FE7}gTZLWr7@)K2*{ z7->-R36^>Y4W@K2@7|RlO-zV1dG^X1w#sHYi1>>BzL`Xh3ZUYwBrOGj*PR{+MHB^! zmeM);lRZZy;f zL`=epFZjJO;dLZcXPN*{g+)SN)Fe;`7BR7?Tpu6>EL@gJj7*r$f>1Vr5l?5Dyohqf zX>*7V7%?;aWVa-QFaXVN5eVAOBAJ=>m<>&lAqoSCY>&M2(%D_RUk^D7VM<1b3yJHc z!AI(6H7pSF#Aj4Xb@OsseaWPvfSWS@q2vUme1FCvdJvF&L)JMCjRX;U)~;(1q}^d; zJOJke+s7-1T+f~btd)?3lFA869Yx_}AtH4%5KI7-&Q$7T05?S;ES3_>$l579p-xde z49&_1&Pt0(LLZQvn83_rD6+q2a{!XcFG*FUJsQ^}J>{LP6987^#`k4URypZEX~0WB za9@-}etY%3GNTSQnYw0D)SB_=^=jE!8g>?texn-w5@tl{_X9>t+P08K;?}N(Y=uL2 zfy@@Fy@`sx4-j$8l1cz7AuCr8A@VYWSH?4;G=Qa^9?y2F!vmqpavb4Qr8?FsFkg^B zBt1F01W7AYa){*>P<2AHgsz0Eep_6coF2ke189;UG!Ux*K%|?*Y5)+)5LN|%=oG^0 d01$nL@DC&=mKBrphFSms002ovPDHLkV1mm(rvm^0 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/red-stone-wall1.png b/core/assets-raw/sprites/blocks/environment/red-stone-wall1.png new file mode 100644 index 0000000000000000000000000000000000000000..a64e9f29b4d6d43c7c405e914afc8c5960701f06 GIT binary patch literal 373 zcmV-*0gC>KP)Px$FG)l}R9J<@mOT!_FbsuF)vXgJKR53 zL6pLhz^cvyN(g&rO-J)4%pp7nmA`dCbAUWCxmZ@82Q=aogd`=^0Mx9|#IgxMGN>ra zo1F(dRYItS(b0MmC-OF>zBf%n3`7!K7>H{eYX=k-UR{D{2{G-3CI=EL1OUJrP}Q)z T!t5|(00000NkvXXu0mjf@oJMk literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/red-stone-wall2.png b/core/assets-raw/sprites/blocks/environment/red-stone-wall2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1befd21e01d568cae17cab9fd4370655eee3c1 GIT binary patch literal 345 zcmV-f0jBPx$6G=otR9J=0mpu-GKoEsTLTBX(jJ=Jg@BkjvqtMV3PC!Mi)so4w!@L>y$CsEO ztjounx3hA3KVKgrqU-%kE!2gBd0g874AZiGX#vp_5e?HqkK09sC{d=Z1l$Qp^SExG z>;Nc4Zgueq1Oh1q>eddRgpMGR07ovML5#;q5GDt#s{nz30ZMhsDj6^Xgr>w*s!N(2 zutLP+Q)S!%q@LabfsS)!K$|>uT?(-~gc5|cOs-Ze-OLlz-uw#%!m9u512wm0R|zPx$7fD1xR9J<@mOT!_FbsuF)s2Z0Aa)i`!2viZN9oeN$_YAkhRG;0cJh+Asi*u@ z^4IrbC#U!G^&uj<-p_PI3_J+)b_~F@tiQ<-5F-)Mw5;^FT}+5Q?HPFxL&%U&oBbQEClbEAf0jn>dH)az+Yw{)l zkL1+=UdgKfyzc_I3XsIe{VxMjpyaPpj}vVV0w`^{+B41CgDqePRE^!Px#McWLf$Y%%I%t>a0v&=goRCr!$Nw8!LHGzE|0US| zetcfAMPs2?M1%mA8z zhqwwL39;gP4{7Dh6WQR*X^*10q`&<_lTfOX`gs_DR-*g+FaY$onE?=ULaN9Fz?hR( zMKpk9PCbxX@Cf9Z0~$o@HYk7ygQ6y)h_&=YPx#zez+vR9J=WmQ4~sFbqb^*g1p?^d1i2pf2MA4q?sC1W6ig!gMBC`T6R-32im= zIPKxb>Z~3-#Qr>9myOJ|)^P0HRDgm}*G)P=6(*r7z_psns0m2mSXM>g4g5Z)SRe-u z>(h_WM1WglB;#0tA@-sc=Sr{w5Uec$v#0PYY zeado}3!0Y-$|;CwbXG7VIRR^zP|U)3Vyl~^?#7`aZw&S@0md%(9Pz~Q6=H}e#}EdmFoTYi*} yo$#yl__suLht?$p7qlzdpYoVKacOZ{a*frE+p_Polw%pt0}P(7elF{r5}E)qXJ14B literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/props/red-stone-boulder1.png b/core/assets-raw/sprites/blocks/props/red-stone-boulder1.png new file mode 100644 index 0000000000000000000000000000000000000000..27fdd14a351d3faa0586cc9e9dae5d9a26ad8f18 GIT binary patch literal 544 zcmV+*0^j|KP)Px$+DSw~RA_}b-GR~C+ z0SPLZ=R$*ogIUZMAt4S?fh_Vs_Y_)*s1Zaa+yRiQ7ylJ}{UsTrBKln>H;tCUhp2)**HQfg)ZvHJUJbh8Yg zN+(l16KN&nJ^QWN0gz6ex6iF9xE7*rd={BAfQE>6Y*z_+AX?_M*J^b)@!iLZdbqPf z5XD!UXxhV%u}q~k z2rn}$|LUxGlFTuS}+ATst# i>IUQ>f4$ikW$6b!eCF&kT^^AD0000Px$=}AOERA_s!h-3iQQg@P$kfw1sPd zOR_{z7VQNuVG9W_W(mH)6mh{?$bv_7i;#eiho?y(husN>-Kl#nON2X>GWhG;O8}Sz zUViTpDJj>9>*ZB^Dv-9;gN1A`(1c>yJXGaZvECnBO+}M$bjW>w7kZso5h-i78U`TW>#llv)@h@`~EqqgR!FB ziNYmh5s@+2C_SJNku{ZRO*|(e(^8lO)cQbD6T#kf#-!S5_Ks5{Wae7P?NuWp;znH= z=#`ShGl4D8OQ<&7dLAh9aN`nSai)?C5$4*P3*KTa=6WM-ka_QX4OTX24>TTQHwX23 zAOqHbqgshfciMuU0j-GMe9$&>_^m_>ZBNun$+8QjSc!sXTeaE>w+HcxC?!@C_xSmq zYo{ff{dS@8M6xGZ#}O#6xg!IvWWsaz0pb^$hzN_j9Yg=@V-*q!9!Qu2(SWR^UaXf5 xhS>DG)e^zVRJxh_>yk=ky<82Px$*-1n}RA_sGbi~EOR_Zc!UH%}S`kv3?} zbWPbHDT8UvlQJQ~16j>;Wq^bRh?pluA>5ra%#$Jzu8x`JxjY~T1wgWZ9D8o?`S$JU zrj{i@E&yN$L7x%QLYM(=&n_1O|0RT}2DtgndbMajJwFlq6KL;urKFm0KSHk`UyEx} zCU~1QV^Sv60JTR)3!%N{kqV$@UXnK27Km0Bx-}q~uhoG^mYOK*LCkh)mtO7R&XG(2Fj?nOlr*Y*{Jt= zsgADaQ38I0StEb-^w{<1exZ@%-DdE98uNhTR3ZzaRp^`bN^Kr+9;-wlq*=;3X}C|s zMr^e`GhX;`H4DUJ9!NS~k3x9O1Bridcp)O@fdPLpSwRjCfTRJ5ng<2~05U{|d0;RA hu!P7mJ~cJ9(-v*+`*hySsgD2v002ovPDHLkV1fnA=@|e3 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/props/red-stone-boulder4.png b/core/assets-raw/sprites/blocks/props/red-stone-boulder4.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf450c2ebaf52d34d8b829193ad48f8cdc0e4e4 GIT binary patch literal 621 zcmV-z0+RiSP)Px%CrLy>RA_2!Y1{VOHeqc(Iqz2BUB=g#axG-{NK&O8VIew=K=_098(>u0nfLTBTJgNt%g4-tHbY z{m@nKS&px1 zJHdezz|t8ONDL9wf=Pq*f`LJD5J4pvw0}ZEagsf({UgDNo{m_Y)*p_3WhB*ECf;xYiVljYazo>0dnvQT`a)EQ*k<<~CS}05_ zSdBZa-S5%Q?5I1jE6Cvr20>jxg~GU;5Nj~GC3rbs!$;oPVs)@++<(5plgCc2987@V zbn>8n==K1@H3x!7@$eySma!xK(6OJOynp=et|e(KF81`t;#rkAQyLeQ7$moSk?g%< zX%-aq;~*<(SH(Z+BdIK2D~Ld9vxlUYhg35mc|=6C@5;%%v67zc`=K*^k7za!_YlTy zcrBR~yY%d0CG*$Qh%?q3P$I{F7^ngLE0CZR$OB^3C`WAp`1=N+XkHJB00000NkvXX Hu0mjf)K?H4 literal 0 HcmV?d00001 diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a95a45ffc6..deadde3775 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -483,6 +483,8 @@ toolmode.fillteams = Fill Teams toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Draw Teams toolmode.drawteams.description = Draw teams instead of blocks. +toolmode.underliquid = Under Liquids +toolmode.underliquid.description = Draw floors under liquid tiles. filters.empty = [lightgray]No filters! Add one with the button below. diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 9af5d1a3c7..c26f50834b 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -511,3 +511,9 @@ 63193=yellow-stone-plates|block-yellow-stone-plates-ui 63192=rough-rhyolite|block-rough-rhyolite-ui 63191=rhyolite-boulder|block-rhyolite-boulder-ui +63190=red-stone|block-red-stone-ui +63189=dense-red-stone|block-dense-red-stone-ui +63188=red-stone-wall|block-red-stone-wall-ui +63187=red-dimaond-wall|block-red-dimaond-wall-ui +63186=red-stone-boulder|block-red-stone-boulder-ui +63185=red-diamond-wall|block-red-diamond-wall-ui diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 2cbe1e24be..06501850ee 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -40,17 +40,17 @@ public class Blocks{ //environment air, spawn, cliff, deepwater, water, taintedWater, deepTaintedWater, tar, slag, cryofluid, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space, empty, - dacite, rhyolite, rhyoliteCrater, roughRhyolite, regolith, yellowStone, redIce, + dacite, rhyolite, rhyoliteCrater, roughRhyolite, regolith, yellowStone, redIce, redStone, denseRedStone, arkyciteFloor, arkyicStone, redmat, bluemat, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, redweed, purbush, coralChunk, yellowCoral, - regolithWall, yellowStoneWall, rhyoliteWall, steamVent, carbonWall, redIceWall, ferricStoneWall, beryllicStoneWall, arkyicWall, crystallineStoneWall, + regolithWall, yellowStoneWall, rhyoliteWall, steamVent, carbonWall, redIceWall, ferricStoneWall, beryllicStoneWall, arkyicWall, crystallineStoneWall, redStoneWall, redDiamondWall, ferricStone, ferricCraters, carbonStone, beryllicStone, crystallineStone, crystalFloor, yellowStonePlates, iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, grass, salt, //boulders shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, carbonBoulder, ferricBoulder, beryllicBoulder, yellowStoneBoulder, - arkyicBoulder, crystalCluster, vibrantCrystalCluster, crystalBlocks, crystallineBoulder, redIceBoulder, rhyoliteBoulder, + arkyicBoulder, crystalCluster, vibrantCrystalCluster, crystalBlocks, crystallineBoulder, redIceBoulder, rhyoliteBoulder, redStoneBoulder, metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, pebbles, tendrils, @@ -180,6 +180,7 @@ public class Blocks{ drownTime = 200f; cacheLayer = CacheLayer.water; albedo = 0.9f; + supportsOverlay = true; }}; water = new Floor("shallow-water"){{ @@ -191,6 +192,7 @@ public class Blocks{ isLiquid = true; cacheLayer = CacheLayer.water; albedo = 0.9f; + supportsOverlay = true; }}; taintedWater = new Floor("tainted-water"){{ @@ -203,6 +205,7 @@ public class Blocks{ cacheLayer = CacheLayer.water; albedo = 0.9f; attributes.set(Attribute.spores, 0.15f); + supportsOverlay = true; }}; deepTaintedWater = new Floor("deep-tainted-water"){{ @@ -216,6 +219,7 @@ public class Blocks{ cacheLayer = CacheLayer.water; albedo = 0.9f; attributes.set(Attribute.spores, 0.15f); + supportsOverlay = true; }}; darksandTaintedWater = new ShallowLiquid("darksand-tainted-water"){{ @@ -223,18 +227,21 @@ public class Blocks{ statusDuration = 60f; albedo = 0.9f; attributes.set(Attribute.spores, 0.1f); + supportsOverlay = true; }}; sandWater = new ShallowLiquid("sand-water"){{ speedMultiplier = 0.8f; statusDuration = 50f; albedo = 0.9f; + supportsOverlay = true; }}; darksandWater = new ShallowLiquid("darksand-water"){{ speedMultiplier = 0.8f; statusDuration = 50f; albedo = 0.9f; + supportsOverlay = true; }}; tar = new Floor("tar"){{ @@ -416,6 +423,16 @@ public class Blocks{ variants = 3; }}; + redStone = new Floor("red-stone"){{ + attributes.set(Attribute.water, -1f); + variants = 4; + }}; + + denseRedStone = new Floor("dense-red-stone"){{ + attributes.set(Attribute.water, -1f); + variants = 4; + }}; + redIce = new Floor("red-ice"){{ //TODO red ice boulder dragMultiplier = 0.4f; @@ -557,6 +574,15 @@ public class Blocks{ redIce.asFloor().wall = this; }}; + redStoneWall = new StaticWall("red-stone-wall"){{ + redStone.asFloor().wall = denseRedStone.asFloor().wall = this; + attributes.set(Attribute.sand, 1.5f); + }}; + + redDiamondWall = new StaticTree("red-diamond-wall"){{ + variants = 3; + }}; + sandWall = new StaticWall("sand-wall"){{ sandWater.asFloor().wall = water.asFloor().wall = deepwater.asFloor().wall = this; attributes.set(Attribute.sand, 2f); @@ -698,6 +724,12 @@ public class Blocks{ rhyolite.asFloor().decoration = roughRhyolite.asFloor().decoration = this; }}; + redStoneBoulder = new Prop("red-stone-boulder"){{ + variants = 4; + denseRedStone.asFloor().decoration = redStone.asFloor().decoration = this; + }}; + + metalFloor = new Floor("metal-floor", 0); metalFloorDamaged = new Floor("metal-floor-damaged", 3); diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 146f1427f5..04cf329ff8 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -87,7 +87,7 @@ public class EditorTile extends Tile{ return; } - if(!floor.hasSurface() && overlay.asFloor().needsSurface) return; + if(!floor.hasSurface() && overlay.asFloor().needsSurface && (overlay instanceof OreBlock || !floor.supportsOverlay)) return; if(overlay() == overlay) return; op(OpType.overlay, this.overlay.id); super.setOverlay(overlay); diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index b560d56e5b..23d2c00c29 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -45,7 +45,8 @@ public enum EditorTool{ }); } }, - pencil(KeyCode.b, "replace", "square", "drawteams"){ + //the "under liquid" rendering is too buggy to make public + pencil(KeyCode.b, "replace", "square", "drawteams"/*, "underliquid"*/){ { edit = true; draggable = true; @@ -61,10 +62,12 @@ public enum EditorTool{ editor.drawBlocksReplace(x, y); }else if(mode == 1){ //square mode - editor.drawBlocks(x, y, true, tile -> true); + editor.drawBlocks(x, y, true, false, tile -> true); }else if(mode == 2){ //draw teams editor.drawCircle(x, y, tile -> tile.setTeam(editor.drawTeam)); + }else if(mode == 3){ + editor.drawBlocks(x, y, false, true, tile -> tile.floor().isLiquid); } } diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index 79609b22fb..497f70aa41 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -116,14 +116,14 @@ public class MapEditor{ } public void drawBlocks(int x, int y){ - drawBlocks(x, y, false, tile -> true); + drawBlocks(x, y, false, false, tile -> true); } public void drawBlocks(int x, int y, Boolf tester){ - drawBlocks(x, y, false, tester); + drawBlocks(x, y, false, false, tester); } - public void drawBlocks(int x, int y, boolean square, Boolf tester){ + public void drawBlocks(int x, int y, boolean square, boolean forceOverlay, Boolf tester){ if(drawBlock.isMultiblock()){ x = Mathf.clamp(x, (drawBlock.size - 1) / 2, width() - drawBlock.size / 2 - 1); y = Mathf.clamp(y, (drawBlock.size - 1) / 2, height() - drawBlock.size / 2 - 1); @@ -137,7 +137,11 @@ public class MapEditor{ if(!tester.get(tile)) return; if(isFloor){ - tile.setFloor(drawBlock.asFloor()); + if(forceOverlay){ + tile.setOverlay(drawBlock.asFloor()); + }else{ + tile.setFloor(drawBlock.asFloor()); + } }else if(!(tile.block().isMultiblock() && !drawBlock.isMultiblock())){ if(drawBlock.rotate && tile.build != null && tile.build.rotation != rotation){ addTileOp(TileOp.get(tile.x, tile.y, (byte)OpType.rotation.ordinal(), (byte)rotation)); diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index 17bf9f4213..73eae4e683 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -149,6 +149,9 @@ public class MapRenderer implements Disposable{ offsetX = tilesize / 2f - region.width / 2f * Draw.scl; offsetY = tilesize / 2f - region.height / 2f * Draw.scl; }else if((wall == Blocks.air || overlay.wallOre) && !overlay.isAir()){ + if(floor.isLiquid){ + mesh.setColor(Tmp.c1.set(1f, 1f, 1f, floor.overlayAlpha)); + } region = overlay.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.overlay().editorVariantRegions().length - 1)]; }else{ region = clearEditor; diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index c8ecdd39bb..b2bc430bf4 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -10,6 +10,7 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; public abstract class GenerateFilter{ public int seed = 0; @@ -37,7 +38,7 @@ public abstract class GenerateFilter{ Block block = Vars.content.block(PackTile.block(b)), floor = Vars.content.block(PackTile.floor(b)), overlay = Vars.content.block(PackTile.overlay(b)); tile.setFloor(floor.asFloor()); - tile.setOverlay(!floor.asFloor().hasSurface() && overlay.asFloor().needsSurface ? Blocks.air : overlay); + tile.setOverlay(!floor.asFloor().hasSurface() && overlay.asFloor().needsSurface && overlay instanceof OreBlock ? Blocks.air : overlay); if(!tile.block().synthetic() && !block.synthetic()){ tile.setBlock(block); @@ -49,7 +50,7 @@ public abstract class GenerateFilter{ apply(in); tile.setFloor(in.floor.asFloor()); - tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface ? Blocks.air : in.overlay); + tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface && in.overlay instanceof OreBlock ? Blocks.air : in.overlay); if(!tile.block().synthetic() && !in.block.synthetic()){ tile.setBlock(in.block); diff --git a/core/src/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java index a3a1754dba..4fcbbacb5b 100644 --- a/core/src/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -402,13 +402,13 @@ public abstract class BasicGenerator implements WorldGenerator{ for(int i = 0; i < max; i++){ Tile tile = tiles.geti(i); - if(tile.floor() == floor){ + if(tile.floor() == floor || tile.block() == floor){ for(int cx = -cap; cx <= cap; cx++){ for(int cy = -cap; cy <= cap; cy++){ if(cx*cx + cy*cy <= r2){ Tile other = tiles.get(tile.x + cx, tile.y + cy); - if(other != null && other.floor() != floor){ + if(other != null){ other.setFloor(dest); } } diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index 040dd3704e..7d0aeaa6d3 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -25,6 +25,7 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ Block[][] arr = { {Blocks.regolith, Blocks.regolith, Blocks.yellowStone, Blocks.rhyolite, Blocks.carbonStone} + //{Blocks.redStone, Blocks.redStone, Blocks.redStone, Blocks.rhyolite, Blocks.carbonStone} //TODO basalt bad //{Blocks.regolith, Blocks.regolith, Blocks.yellowStone, Blocks.crystallineStone, Blocks.carbonStone} }; @@ -193,10 +194,17 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ if(floor == Blocks.yellowStonePlates && noise(x + 78 + y, y, 3, 0.8f, 6f, 1f) > 0.44f){ floor = Blocks.yellowStone; } + + if(floor == Blocks.redStone && noise(x + 78 - y, y, 4, 0.73f, 20f, 1f) > 0.65f){ + floor = Blocks.denseRedStone; + } }); inverseFloodFill(tiles.getn(spawnX, spawnY)); + //TODO veins, blend after inverse flood fill? + blend(Blocks.redStoneWall, Blocks.denseRedStone, 4); + //make sure enemies have room erase(endX, endY, 6); diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index 87f6e45812..edf2e8759f 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -16,6 +16,8 @@ import mindustry.graphics.MultiPacker.*; import mindustry.type.*; import mindustry.world.*; +import java.util.*; + import static mindustry.Vars.*; public class Floor extends Block{ @@ -47,6 +49,10 @@ public class Floor extends Block{ public float liquidMultiplier = 1f; /** whether this block is liquid. */ public boolean isLiquid; + /** for liquid floors, this is the opacity of the overlay drawn on top. */ + public float overlayAlpha = 0.65f; + /** whether this floor supports an overlay floor */ + public boolean supportsOverlay = false; /** shallow water flag used for generation */ public boolean shallow = false; /** if true, this block cannot be mined by players. useful for annoying things like sand. */ @@ -67,10 +73,13 @@ public class Floor extends Block{ public boolean needsSurface = true; /** If true, this ore is allowed on walls. */ public boolean wallOre = false; + /** Actual ID used for blend groups. Internal. */ + public int blendId = -1; protected TextureRegion[][] edges; protected Seq blenders = new Seq<>(); protected Bits blended = new Bits(256); + protected int[] dirs = new int[8]; protected TextureRegion edgeRegion; public Floor(String name){ @@ -109,6 +118,8 @@ public class Floor extends Block{ public void init(){ super.init(); + blendId = blendGroup.id; + if(wall == Blocks.air){ wall = content.block(name + "-wall"); if(wall == null) wall = content.block(name.replace("darksand", "dune") + "-wall"); @@ -168,14 +179,21 @@ public class Floor extends Block{ Mathf.rand.setSeed(tile.pos()); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); + Draw.alpha(1f); drawEdges(tile); drawOverlay(tile); } public void drawOverlay(Tile tile){ Floor floor = tile.overlay(); - if(floor != Blocks.air && floor != this){ //ore should never have itself on top, but it's possible, so prevent a crash in that case + if(floor != Blocks.air && floor != this){ + if(isLiquid){ + Draw.alpha(overlayAlpha); + } floor.drawBase(tile); + if(isLiquid){ + Draw.alpha(1f); + } } } @@ -206,6 +224,7 @@ public class Floor extends Block{ public void drawNonLayer(Tile tile, CacheLayer layer){ Mathf.rand.setSeed(tile.pos()); + Arrays.fill(dirs, 0); blenders.clear(); blended.clear(); @@ -215,38 +234,44 @@ public class Floor extends Block{ if(other != null && other.floor().cacheLayer == layer && other.floor().edges() != null){ if(!blended.getAndSet(other.floor().id)){ blenders.add(other.floor()); + dirs[i] = other.floorID(); } } } - drawBlended(tile); + drawBlended(tile, false); } protected void drawEdges(Tile tile){ blenders.clear(); blended.clear(); + Arrays.fill(dirs, 0); + CacheLayer realCache = tile.floor().cacheLayer; for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; Tile other = tile.nearby(point); - if(other != null && doEdge(other.floor()) && other.floor().cacheLayer == cacheLayer && other.floor().edges() != null){ + + if(other != null && doEdge(tile, other, other.floor()) && other.floor().cacheLayer == realCache && other.floor().edges() != null){ + if(!blended.getAndSet(other.floor().id)){ blenders.add(other.floor()); } + dirs[i] = other.floorID(); } } - drawBlended(tile); + drawBlended(tile, true); } - protected void drawBlended(Tile tile){ + protected void drawBlended(Tile tile, boolean checkId){ blenders.sort(a -> a.id); for(Block block : blenders){ for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; Tile other = tile.nearby(point); - if(other != null && other.floor() == block){ + if(other != null && other.floor() == block && (!checkId || dirs[i] == block.id)){ TextureRegion region = edge((Floor)block, 1 - point.x, 1 - point.y); Draw.rect(region, tile.worldx(), tile.worldy()); } @@ -258,7 +283,7 @@ public class Floor extends Block{ protected void drawEdgesFlat(Tile tile, boolean sameLayer){ for(int i = 0; i < 4; i++){ Tile other = tile.nearby(i); - if(other != null && doEdge(other.floor())){ + if(other != null && doEdge(tile, other, other.floor())){ Color color = other.floor().mapColor; Draw.color(color.r, color.g, color.b, 1f); Draw.rect(edgeRegion, tile.worldx(), tile.worldy(), i*90); @@ -267,13 +292,19 @@ public class Floor extends Block{ Draw.color(); } + public int realBlendId(Tile tile){ + if(tile.floor().isLiquid && !tile.overlay().isAir() && !(tile.overlay() instanceof OreBlock)){ + return -((tile.overlay().blendId) | (tile.floor().blendId << 15)); + } + return blendId; + } protected TextureRegion[][] edges(){ return ((Floor)blendGroup).edges; } - protected boolean doEdge(Floor other){ - return other.blendGroup.id > blendGroup.id || edges() == null; + protected boolean doEdge(Tile tile, Tile otherTile, Floor other){ + return other.realBlendId(otherTile) > realBlendId(tile) || edges() == null; } TextureRegion edge(Floor block, int x, int y){ diff --git a/core/src/mindustry/world/blocks/environment/StaticTree.java b/core/src/mindustry/world/blocks/environment/StaticTree.java index 0cea162c2c..7ec5984513 100644 --- a/core/src/mindustry/world/blocks/environment/StaticTree.java +++ b/core/src/mindustry/world/blocks/environment/StaticTree.java @@ -1,6 +1,7 @@ package mindustry.world.blocks.environment; import arc.graphics.g2d.*; +import arc.math.*; import arc.util.*; import mindustry.world.*; @@ -15,9 +16,11 @@ public class StaticTree extends StaticWall{ @Override public void drawBase(Tile tile){ + TextureRegion reg = variants > 0 ? variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))] : region; + TextureRegion r = Tmp.tr1; - r.set(region); - int crop = (region.width - tilesize*4) / 2; + r.set(reg); + int crop = (r.width - tilesize*4) / 2; float ox = 0; float oy = 0; diff --git a/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java b/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java index 00db606106..29c25120a6 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadDeconstructor.java @@ -144,7 +144,7 @@ public class PayloadDeconstructor extends PayloadBlock{ time += edelta(); for(int i = 0; i < reqs.length; i++){ - accum[i] += reqs[i].amount * realShift; + accum[i] += reqs[i].amount * state.rules.deconstructRefundMultiplier * realShift; } }