From 8e4fdc92ec9de5f204e04706c13ee84f5ac7a2dd Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 3 Dec 2021 20:45:19 -0500 Subject: [PATCH] WIP terrible-looking regen projector --- .../blocks/defense/regen-projector-bottom.png | Bin 0 -> 515 bytes .../blocks/defense/regen-projector-glow.png | Bin 0 -> 8370 bytes .../defense/regen-projector-side-glow.png | Bin 0 -> 7155 bytes .../blocks/defense/regen-projector-top1.png | Bin 0 -> 760 bytes .../blocks/defense/regen-projector-top2.png | Bin 0 -> 756 bytes .../blocks/defense/regen-projector.png | Bin 0 -> 1445 bytes .../sprites/blocks/environment/tungsten1.png | Bin 399 -> 310 bytes .../sprites/blocks/environment/tungsten2.png | Bin 327 -> 275 bytes .../sprites/blocks/environment/tungsten3.png | Bin 331 -> 296 bytes .../blocks/environment/wall-tungsten1.png | Bin 0 -> 399 bytes .../blocks/environment/wall-tungsten2.png | Bin 0 -> 327 bytes .../blocks/environment/wall-tungsten3.png | Bin 0 -> 331 bytes core/assets/icons/icons.properties | 2 + core/assets/logicids.dat | Bin 3657 -> 3674 bytes core/src/mindustry/content/Blocks.java | 61 +++-- core/src/mindustry/content/Fx.java | 6 + .../maps/planet/ErekirPlanetGenerator.java | 4 + .../world/blocks/defense/MendProjector.java | 5 +- .../world/blocks/defense/RegenProjector.java | 215 ++++++++++++++++++ .../world/blocks/defense/turrets/Turret.java | 2 +- .../world/blocks/power/PowerGenerator.java | 10 +- .../blocks/production/GenericCrafter.java | 12 +- .../world/blocks/production/Pump.java | 2 +- core/src/mindustry/world/draw/DrawBlock.java | 15 ++ .../mindustry/world/draw/DrawGlowRegion.java | 7 +- .../mindustry/world/draw/DrawSideRegion.java | 45 ++++ tools/build.gradle | 2 +- 27 files changed, 342 insertions(+), 46 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-bottom.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-glow.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-side-glow.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-top1.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-top2.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector.png create mode 100644 core/assets-raw/sprites/blocks/environment/wall-tungsten1.png create mode 100644 core/assets-raw/sprites/blocks/environment/wall-tungsten2.png create mode 100644 core/assets-raw/sprites/blocks/environment/wall-tungsten3.png create mode 100644 core/src/mindustry/world/blocks/defense/RegenProjector.java create mode 100644 core/src/mindustry/world/draw/DrawSideRegion.java diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-bottom.png b/core/assets-raw/sprites/blocks/defense/regen-projector-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..71e64780bf1d2287a16fae43c6e3a180973d4f98 GIT binary patch literal 515 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 Qz`(%Z>FVdQ&MBb@0B=kchyVZp literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-side-glow.png b/core/assets-raw/sprites/blocks/defense/regen-projector-side-glow.png new file mode 100644 index 0000000000000000000000000000000000000000..b8288fe7c461c3d439856af0c68a59089195396f GIT binary patch literal 7155 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^TM{#AuUlmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNPuSGjp1><+|4Y#iDy#9xyb;@EtF%V$c8iw^2|tb=m3AZLdAU zjE*D}>|oH-OWFSK{r=m3+rvfTV}x{fKCAiYWqS3(4vp)7S3O_9|I*LuxSu->}b=yTV$O|j?C&t77G=dYcu@YSz5 zJH`I)x%$t?WL{&s_IdTa+e*#9-K~8Y5HRbIlVOW!?VfY@i{2~TI)40^`iJjbhIjT} zn=H$_KHZ4nXVISiZ@cW6zpy^(*Zwa1_xe@y56;!U9-HgPXItw1`_wi)|L@1GK0o#p z)V$TG+1n_3od0;GUG@1*-*@?64`RFcr{W6Z?RuZX2l$?Rw3$|^E&nj;{O(VB;k((? z=IdOq9!O zM$OxB&$mbCcYR%BUX%FrrKFV26Gb?w-(>MBy z4La`k-+jXH=VRTO`r1$OF{0e38g~{PDEnI7rT6b`^v4^PMt&LZ1wQ#bH)a&rxNU=^ z{Kf-QZA~WsU8=a^`-2FBfaK?j%Pwqe5a*oi+a{9C=jY71&FuUN`{d>pnKjaRhXjO* zLvn(X4@YQn{#(5AfwS)-6~U8>g64!|T0Wbi`h3kzk9C<>mMn@4?GDRToffj>$)crG zqM~?B4>blAUyaIIyO#BO#0takPuZq2kTX)Hdrtk`|prMolc z$M8Km8_sLCssFP_k&WW#t{o8{c0J#9&c%7#*{#=R<$BHgp;mS&L7I7{jhOVDc_Q6! zJfauxn8PdHCttU^_jUC2YP};0>s~Hcy-@b3LZ-+ZKK0Dl+DVlL+z!l(7QJTDIULx# z_m1O6@58+BYSqtLU$^?uaO_*>+ez1Nw7q|_V^VVMzLh_wH427be)#QG@naj~hl)NI zp0JhgKlpX$46ju#A8r*siu!A_;n`N^C;8lg|F|I=n6+ z^*oo?TbUUA=O%e9Fy= zDjBJ8pWVj;Kd-B`zS$d^dhW(CzIFz+Kz*BtvxV0?KbC)(yzC}dkLGXg@Evo7IBiVd zJHHY9ex6fU-h+F2(?sL5U$$;odSLIlgs{JUE%xar;xo;&4=$PW(#8JL^f^Xp3a^$< z$*hYGt7+f!;m*NT0?)ao99!Qp{qgE7&m^6swX7$+&pwNty|mLjNFqzwvf1?^_nvJA z6J(ld+P5v}Kd{dKapYc4;U{IQgbyoa+?JYgVse=G9dpL(%-LrHgw}f$DSgZ>gF*+<{*x2#7n(d83%eRAVT zRc_Uj*{9#hm0uJuU*$15^!q~hM>lLY&a{g2+M+)}>h|OQBl+KWZqGlo_w=XgUwtw^ zgbwYPuKal$>qe8$RUXHl3qIqzdEN2fP3Gw{_6zNPXWslr_VSTj8OePUuI-(#VJ6AS zS^Q}WgIwGCHpP~u)20>8UwiZK-DcMxc6<$XiAo7qO%t~7y?d8e{i2TwPyb}~Ta#@* zR59{0Z8??TGqc%US>)F8e&uzpj#XB3B6oeYFPRsAPRSy8*M)dir6B!1~%DNp4Q_*_>w-yVKvgeA$G<{ND{e znP)Yrt*>m6ZuYwu!17Y!Wb*;WvvqS;tk7mUKlwfDisZX9@)eSzN~%RPp2Qbiy1Z+@ z@><0V!6jNPtUkw1Xhc1DDZS6=8t*gxviPHtRkp$`DisVSQ$(7=iv@pZ-ASA_kvA;r zOyQr5)_bSFEPMUCZ^L_@b&sV5-~K35a6ND+ZoQ%ef0pvyrzO1^6*dJ=+$;iT1GMm9C0n2@`LfVs+ii;EgKCNt@ig=_VMT*j<2)S1sgwp<*2KgcrSdG%M|0MQ>|x4 zo#no6bV_yiLH_(xS9^iI_ckHZh`gCZkV!v|2>gm_qoX&FW__X%+ zj5e1Sml=B-t0$bkCuHw(XrX+?S_ctl=Z<3@Ydb#h+^(3}B)E{H)A+aB)u>PR%s#FX zPQ976U1)J#f*W5?FH7f_37TJ{CMKP*xsvyjBjzvL&4sE3m-SZYdM

V4zkJY%Mu` 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 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-top1.png b/core/assets-raw/sprites/blocks/defense/regen-projector-top1.png new file mode 100644 index 0000000000000000000000000000000000000000..3d09b25c2d730f7087128445756cfd9f7dbbcab6 GIT binary patch literal 760 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z_iKJ z#WAE}&f7V6b8j1nxY>)#Dn>7fRLidDaBwc^)d^1Te)GUi#3?0IMPD;0rR01i57X@* zeHA~oy%->1-i|N-7~^*QuiTygSC)}ofGgg~p*ZQGH%Eq-Rt+a(=mr+qNA73kA5FYn zqRSV*i1kg9(+?*7kUBk(!Hccq2O<(cAncQ9XvfK3y1&#a5);xUvDC&UBzk9w@ zP37OufA+srJ3+QepHq*u<Q6}e`$hZ{n05!YK8$|7KXu7dw}vkguLK_M_Yn_gT2lY8PiWthHLOck2<}T+ z@w=P-!I!xoGS)=PGg&n^oKsj}%waL3)cw7m!QIo2 zyVvP+ffX__sxWy!JG`q$2v+wnVT&rK_ShlYt^LK==U3kqK|6qJ5sD5(6-P*D4q;m)$x zwdW7UvV8khW{T^p7*MM#mYzLfrLC={an^L HB{Ts5TVqFR literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-top2.png b/core/assets-raw/sprites/blocks/defense/regen-projector-top2.png new file mode 100644 index 0000000000000000000000000000000000000000..6993d3239a56795dceda4a13637449e43b889759 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z_iZO z#WAE}&f7V+bMF`kxV~r8JQ#Z;^H}bZj@Ir1>AbYZdUu*X3Fhc%3t7rcR9bBL{IbE8 zL$;4Ts0K1IfI-KRrQdm79$r6vKJ)E+4vU7hA5>XP)J6BTG%R~^Xu3cEtM`TIn$?xc zf;02N%YO*zCWwFjaR0tt%yox`$y?R$D>E|k1*I+zVPfLic;(O1mgTQsr=8=_Sg_>q zUT=?9eM2sz$C7WK9GafNsAlspzHZNqO|A}Yw;t-N=W=*lu&Uu?oGl}`Po-A>ui%d( zQO_g$$|hy8njV@iFd@~~3FMR+GrU(w?rUK%zWmneDqnn(T8`Y?h{O7-TNZKZ|ZAjhjf7pk}M@`jO?4=yg1D1(OVL9`0}jN*FRTtnDV45T@#$9Wc5hb+TFvV zR(?YC#V@BeP7*GyVib$=_9(1koW>wOUw%^cE?w1@7tBlEF0YAHipn|FeouJc=5HeF zucm*$&Ffc~$l?*NIz>l6`lAO&aMQCZKRz9;`upMV1=DR#>;7`>N>vgIYWR|W!}id0 zChiG#&hJI{iNrLd@bCY&`gMK%{-dtv+2miAwww>KKGc3ocH@HEbeA+IJ}#^;qhzsgk7=AZS~(7 zaosw3@2pIegR?{%AH(U3%m<3TFl@2=!VFGm3=jT4Fn`UrNm<+M|0|G)r>mdKI;Vst E0P;yjH~;_u literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector.png b/core/assets-raw/sprites/blocks/defense/regen-projector.png new file mode 100644 index 0000000000000000000000000000000000000000..412c3e3039b03c7bbe53750775aee55afdc65296 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^SBb39!fLn`LHz3ba2Y$(9` zz*1hvl1=Cl+W}p-H9H0GqzCjDJh9NbzIs*ow%H{r?{8iG_IuL5!bRs!pMLQ5*XQuN z_tw09``vtNIv`;uRzxTrJ za?T6Q0pH(Vjg$EIS3ObWpAJjr{?ZPymTmJx>JxvMvzXRsH(iN$l6bqBSIF_jSIM`| zT=H|>w;W{PXu5WPSFOH}e{z4eaL-m9GX{c+2^ zebX5ig!9eo^y0W=Ui2n3Jk#gWzjTHz-R=AgLQW}%Jbth$2rs-M->WFRV0+bV))$H{ z>g!tLnNt+5Y~5Oz!r*cGxe|l4*Ye4g!u(}q7)hgk}?eF#^a!Qi$0zv-V? z!Mw_=b0b!F?`}Qsl=1wf>yGNf+vY}i@7~=i?|R``w~~#Fq0aPBv4+K&lfN>#e3VG; zikaufyg}j0ZTCaT$`Q|Z%Q7@wxNWCwqV{YhgB!=R5)pFPy!U0}zke0}3I#)S{J zbIdFDWI6b$&H3H@2a`XnSlpIS=^io5yhgie>%xcMi{3CTn7eda@{gGu_de`4Pr9cx zlVi;XV}V5vuXDUNm+VRMVJZ9J!xHx6{cDG>+2Sp0K1gz8K3vQ(Ep(sk;eLe$50x!> z#pmcX#55%S5I?|Lz!<~8&A4vzheMMMUVl0z{VzDa?VZrS;Cmgi!uK@)=&-o`$Z1)8 zZL7p~j)hltPFp;e*RsgN@>=P(e@<#$0l%^mt1fI&Zl97Ioql`0%3_Y(c#|5DgP%0z zuHO9Q{Zpgqia4*lqXn;niiug8Y}OZ@-!Va@PYh-1jy+1&ad_tw9q zh1HC1;ST%^mm=?U8N?Jsbv)qR@A{$5eh<%8y`=#xxk9T27CoFEZt|yH+VHg2{Yb$w z?*DnVCzuLE?4=LA`Ov>}Il~s~nXMBzCkWPMhBRF4+a$P&;l{)7MGF~R4y7xkFr>7+ zcfIi|koDpR)s{6MY&nAEt~Dy1*~N49SYeN;6`P3S-$GNdmPqrYs2@vRk6oH=&61#b z!tDglem93h{YoCi^$ZhK;y)Oy{^!T9 z*u(RCAFOrU`}CgfpGc00{~l()PiMC<>QGo>v*b%8!z-RW94q@@$?{g2GrYH1#1SkP zq03t(-tfXkiQ}@|?R$CcH5c!5U;bSD;iBD|)9*dl#8_UOx4FstcWbL@&6DR3_I}tp zHNl@*@XP+qXZh+|9&qk&Z)n-i@bKUNmUM-P`tm2d`&}Il&+qu~hFU;)#dX8GKqK9aFERKD}W3CPmpmO)K|)-|SFxW=6jGwH8Uf0o?IU zGfeGNYOZT{9hfsmtgd@QQqPqS*$nzj)kQCMg!gUajc5MB{Wffg(AV=nSs54@7(8A5 KT-G@yGywop#F9h+ literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/tungsten1.png b/core/assets-raw/sprites/blocks/environment/tungsten1.png index faa96fc02e20bdbded2f79e1887b587c8b6d3789..b923450effb456350c51f3e7f659ca7783b11afc 100644 GIT binary patch delta 271 zcmeBY-o`Y+pq}A_r;B4qMC;qB8wC#;@VK%b56IwlTj1?GRdPkpWkaUu8Ec)U3%gBv z>ai=}N%+o~N8fdB8y%R}TYN(1&(Es!Uw6NL`sb*R@Ph|)ju?77a8LCXypYDv5a1O# z?=WlCgNICqEzX)cG`Dl{Jl=9<4zp*{at%gp0fq;K`*W+gGMs+bGsLoKmVA52q}wTV zPc{b*}55i$$9&AFgU}J;H6y>0u=J f!M1)P|Afebiu+PK@)#Hx7&ts#{an^LB{Ts5vg~<& delta 360 zcmdnS)XzM@pq|mw)5S3)qV?{yy@JgKJgu&J&PStDT1u{joN;jVJJZ_utwNZ!a#bziw5ztL{$ztKYL33qrF6d>MWf)~WL=?oe38 zczsqD?{UE$M~hYmL~dGC zVQXwCBs5RUYty{#@;A+-rKEn9zrAwc`D@$f&p*G^Sntd}?by-~4y_ew`&gOyGG?w8 zsD85iWmWr`vjqWM2hNAc{Xki+ULJv&(h982uEC+J#CkG17BKi{ys s{=1z(Xye=MECI|f6YWgC2>)V`-4_saw4ZAl0|Nttr>mdKI;Vst09-$0YXATM delta 288 zcmbQtbew5|K|Ld*r;B4qMC;pWhEj(Vcv=_FZ#UZhfg|sn-@Jn-Z=O}I;NCOU?+dp{ zBb(f-3)>x|@5u`Vb%gzmn0@K+@y}nUJ${@RUn9>oVRnDhjjYMbPy3pxZ#o#Yb@Lf# zj>|H}%C^F))(Nh9i5F&l(mb1bGNwG(tzxsUT#Z`&)fGsb!ycdnLc@yZ#OBIO-UTLlJYsmmm;>+L+Csj%sH z=aeg$hphfcMs{I$(r!BACQhVTeC<6lngQu&X%Q~loCIGqggJl2! diff --git a/core/assets-raw/sprites/blocks/environment/tungsten3.png b/core/assets-raw/sprites/blocks/environment/tungsten3.png index da8b2321171f496a3e5f91443865d830d922d282..3cfa8d1aa464d3a1c52a161b14728c5b77abb129 100644 GIT binary patch delta 256 zcmX@jw1R1ZK|RAGPZ!6Kh}O5EI|UCJ2-rw;ImHGr%}iFh?(k$rkI;)pFHX74YyA9I zD6Q>cTAknS?U&{;SXo)s^~5fF@vq|Cm%BepeAbHUJvx!?(!yo(X-&u8@5dA8q`CC0 zdE4au*1#|8`O+!<&pWu6F^gF;IP@B~XE44kQ*=La)tooHX9uWp^0;w82TilG%r{!Z|)YJHII4P(@R&DC|$aidcsoBHz=U_gTkf* zcO`E%WW8!AN!a?sOgLewtI)=mk`6~gxy(clxNgtn*_wNz?^WObbP0l+XkKNwIf^ delta 292 zcmZ3%bed^`K|Ld@r;B4qMC;qooxFz)cv6~pL~|z!UfSvRR5EC%-*dq|t$U^h2@0eH zSp|8C$}e!cFDpN{!*5PO!rgCM@~Wi@uOIc&IcqOpe%V%!ac#$5r3KCzyKI$av9H;> zt!qc0%J&D$bbUTgO6n1DQczkX@i>ux{Z|K{>n8dIPj+(n^M}-XD@^>D;4yRKg9Q=Y zabD$q|0?&#oEJFN5SBgf`=rB6SuYgZSu;xAX07|0f57&@gDu-ns0O|4`6;QSx!yIV zD?op;%a=*sN>}7GP6`y2`FER_looi#MPHW*{>$w)N%*CHW(NarN9zAIEVD|d@4fQ2 zg=dN9Qrp8UTU;`ZnXX~6l-(h-B75GC{2Ioz@Y;P=t#-E<7#J8lUHx3vIVCg!07q|t Ao&W#< diff --git a/core/assets-raw/sprites/blocks/environment/wall-tungsten1.png b/core/assets-raw/sprites/blocks/environment/wall-tungsten1.png new file mode 100644 index 0000000000000000000000000000000000000000..faa96fc02e20bdbded2f79e1887b587c8b6d3789 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>VD$8K zaSVxQy*q8MV6y>FtE-;#(dd+xk}Dx+99(^mbL1#)E9#QzO#YJnTdzFu`GW=ipB|rN z_%HT)+ws!di%aXTTUG9=yOaOw_iV<3&};!;hF^ts>imj36jm`_dZH>YJ&Hj~;NqU` zQVBEJHW|5?G|uQduqf}9hKhr6gZo{}mT57pFOFLVHBD03Q+U;E$#ac^Q`n*z%a^fx zbiZPp!B=pssAO?yk&r{tR)MD1((FIP3|ZfOW9;6v^2u?l|8H3)sGV5-bxYi(0Io!_ zh0BX_Eg1K7MK4>JZ13#vq$%)`Wnx*_S4J(9#6W?V9jmuQZC=9I;NKq0a4WXIc|qR+ z-UEAmnlD&A`^I>-L&yA)$R(BydDTmFZVFYpf7<%nZh^1+`#A#E3t}y@=UifOP<=RW zx}V2nwxAA~jG1lg(ri}OPvKeG8Y}LFVdQ&MBb@ E0K+M#WdHyG literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/wall-tungsten2.png b/core/assets-raw/sprites/blocks/environment/wall-tungsten2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d939d7b215c23d7d2c5332d543472c8d04130d GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U}W@k zaSVxQeLKxi>W~6Y>*D$CM%zDd2cx!bKI6=BS;kn|R#??K!BsEu z!mLl4XH$>-^sC5T5O!j-)QRoUebr~T?qoS|%GCJs->R~i`npe84xHL*UbJ?Ct}6F& z{_1UeMRvwmuj9_uGA&*?<5Hx&!)dF)z$|r{#C5%$2Q(En{qCHyM%%)HS4sbsB7;~< z*`hlPFRY!)v){Hx{7HN(cY$l;3yCTz9+?A|ueUSwOyg$wx;=;Og2KKcp0!F};(}%| inh3P~T($oK`?TeiTWSwH4`pCrVDNPHb6Mw<&;$Uxe2Int literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/wall-tungsten3.png b/core/assets-raw/sprites/blocks/environment/wall-tungsten3.png new file mode 100644 index 0000000000000000000000000000000000000000..da8b2321171f496a3e5f91443865d830d922d282 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U}W`l zaSVxQeH*%y_pkv^N)wN0?nJ>$JN=$Y2JQ5FF1V+4&(t76fs`PtATLq*1#b6c<>z+z z%_&H@`)x~JwN&Btqh2~^?d8ia+v+i{?bxfdz&T@=tfm$TM8Dw4P7Z(m5O0Nv9}_%gZhWvHqC3v3-0xrI{+ROury9bt z=Y5}am?`UpVmoU_soSh|U-J*x9(b^2`w7*cmpwlvl{DA8#&iYfPj>k-$y@1)oW@Ck zqB8$(^ODj6&$#I8GQoej-6jdY)X(f-;O$8LzlLR2>GZu<-nQ^8@my+qm}QGg#xc`1 kES5WDR%Flnkzd1@7GAs0s@3im0|Nttr>mdKI;Vst08ZS7q5uE@ literal 0 HcmV?d00001 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 58f2e2dcf2..149661ff3c 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -471,3 +471,5 @@ 63235=arkyic-stone|block-arkyic-stone-ui 63234=yellow-stone-boulder|block-yellow-stone-boulder-ui 63233=pyrolysis-generator|block-pyrolysis-generator-ui +63232=wall-ore-tungsten|block-wall-ore-tungsten-ui +63231=regen-projector|block-regen-projector-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index cf2427f6568a37111b4045cf2938ebac4d22cb4c..4a6e6d215c0376c3fa27169429a7caa17610a569 100644 GIT binary patch delta 30 mcmX>pb4!Ma;lxI!!`!_5MXBkjdAbEf`B|ySn-6k#FaZFm^a~9D delta 16 Ycmca5b5e$h;rK?T!`z#%aknr505^UHKmY&$ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 30370bf2b5..2326634dc3 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -56,7 +56,7 @@ public class Blocks{ oreTungsten, //wall ores - wallOreBeryl, graphiticWall, + wallOreBeryl, graphiticWall, wallOreTungsten, //crafting siliconSmelter, siliconCrucible, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, @@ -72,10 +72,15 @@ public class Blocks{ //defense copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, - phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, overdriveDome, forceProjector, shockMine, - buildTower, + phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, + mender, mendProjector, overdriveProjector, overdriveDome, forceProjector, shockMine, scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet + //defense - erekir + buildTower, + //TODO name + regenProjector, + //transport conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, underflowGate, massDriver, @@ -689,6 +694,8 @@ public class Blocks{ variants = 3; }}; + wallOreTungsten = new WallOreBlock(Items.tungsten); + //endregion //region crafting @@ -1011,7 +1018,7 @@ public class Blocks{ }} ); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; outputLiquids = LiquidStack.with(Liquids.ozone, 2f * craftTime / 60, Liquids.hydrogen, 3f * craftTime / 60); liquidOutputDirections = new int[]{1, 3}; }}; @@ -1052,9 +1059,8 @@ public class Blocks{ rotateDraw = false; - //TODO vent? - iconOverride = new String[]{"-bottom", "", "-top1"}; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidRegion(), new DrawBlock(), new DrawHeatOutput()); + drawer.iconOverride = new String[]{"-bottom", "", "-top1"}; craftTime = 60f * 3f; liquidCapacity = 30f; @@ -1065,7 +1071,7 @@ public class Blocks{ requirements(Category.crafting, with(Items.tungsten, 30, Items.graphite, 30)); drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.slag, 9f), new DrawHeatOutput(true)); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; size = 2; craftTime = 60f * 1f; heatOutput = 2f; @@ -1101,7 +1107,7 @@ public class Blocks{ itemCapacity = 20; hasPower = hasItems = true; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawCrucible(), new DrawBlock(), new DrawHeatInput()); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; ambientSound = Sounds.smelter; ambientSoundVolume = 0.07f; @@ -1134,7 +1140,7 @@ public class Blocks{ } drawer = new DrawMulti(drawers.and(new DrawBlock())); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; craftTime = 60f * 2f; @@ -1172,7 +1178,7 @@ public class Blocks{ new DrawHeatRegion("-vents"){{ color.a = 1f; }}); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; consumes.item(Items.silicon, 3); //TODO must consume from 2 pumps, 1, or 1.5? @@ -1199,7 +1205,7 @@ public class Blocks{ particleSizeInterp = Interp.one; }}, new DrawBlock(), new DrawHeatInput(), new DrawHeatRegion("-heat-top")); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; size = 3; @@ -1240,7 +1246,7 @@ public class Blocks{ }}, new DrawBlock(), new DrawHeatInput(), new DrawHeatRegion("-vents"){{ color = new Color(1f, 0.4f, 0.3f, 1f); }}); - iconOverride = new String[]{"-bottom", "-weave", ""}; + drawer.iconOverride = new String[]{"-bottom", "-weave", ""}; consumes.items(with(Items.thorium, 2, Items.sand, 6)); consumes.liquid(Liquids.ozone, 2f / 60f); @@ -1479,10 +1485,29 @@ public class Blocks{ consumes.power(3f); range = 120f; size = 3; - health = 80; buildSpeed = 1.5f; }}; + //TODO green looks bad switch to orange + regenProjector = new RegenProjector("regen-projector"){{ + requirements(Category.effect, with(Items.silicon, 60, Items.tungsten, 60, Items.oxide, 40)); + size = 3; + consumes.power(1f); + rangeWidth = 4; + rangeLength = 20; + + consumes.liquid(Liquids.hydrogen, 1f / 60f); + + healPercent = 4f / 60f; + + drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.hydrogen, 9f / 4f), new DrawSideRegion(true), new DrawGlowRegion(){{ + //color = Color.valueOf("1eff21"); + }}, new DrawGlowRegion(true){{ + suffix = "-side-glow"; + alpha = 1f; + }}); + }}; + //endregion //region distribution @@ -1892,7 +1917,7 @@ public class Blocks{ consumes.liquid(Liquids.water, 0.1f); hasLiquids = true; size = 2; - iconOverride = new String[]{"", "-turbine0", "-turbine1"}; + drawer.iconOverride = new String[]{"", "-turbine0", "-turbine1"}; ambientSound = Sounds.smelter; ambientSoundVolume = 0.06f; @@ -1994,7 +2019,7 @@ public class Blocks{ glowScale = 5f; color = Color.valueOf("c967b099"); }}); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; generateEffect = Fx.none; liquidCapacity = 20f * 5; @@ -2028,7 +2053,7 @@ public class Blocks{ liquidOutput = new LiquidStack(Liquids.water, 5f / 60f); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; generateEffect = Fx.none; ambientSound = Sounds.smelter; @@ -2785,13 +2810,13 @@ public class Blocks{ trailLength = 10; hitEffect = despawnEffect = Fx.hitBulletColor; }}, - Items.tungsten, new BasicBulletType(6.6f, 46){{ + Items.tungsten, new BasicBulletType(6.6f, 47){{ width = 9f; height = 14f; shootEffect = Fx.tungstenSpark; smokeEffect = Fx.shootBigSmoke; ammoMultiplier = 1; - reloadMultiplier = 1.4f; + reloadMultiplier = 0.7f; pierce = true; pierceBuilding = true; hitColor = backColor = trailColor = Pal.tungstenShot; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index bb59c62839..37cadd68d8 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1353,6 +1353,12 @@ public class Fx{ }); }), + regenParticle = new Effect(100f, e -> { + color(Pal.accent); + + Fill.square(e.x, e.y, e.fslope() * 1.5f + 0.14f, 45f); + }), + surgeCruciSmoke = new Effect(160f, e -> { color(Pal.slagOrange); alpha(0.6f); diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index 9e31b0f80f..22f1c0cee2 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -189,6 +189,10 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ }else if(block != Blocks.carbonWall && noise(x + 782, y, 4, 0.8f, 37f, 1f) > 0.68f){ ore = Blocks.wallOreBeryl; } + //TODO generate tungsten, or not? + //else if(block == Blocks.yellowStoneWall && noise(x, y + 942, 4, 0.7f, 38f, 1f) > 0.71f){ + // ore = Blocks.wallOreTungsten; + //} } }else if(!nearWall(x, y)){ diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 911375fcb1..a42d6cecb9 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -66,10 +66,7 @@ public class MendProjector extends Block{ } public class MendBuild extends Building implements Ranged{ - float heat; - float charge = Mathf.random(reload); - float phaseHeat; - float smoothEfficiency; + public float heat, charge = Mathf.random(reload), phaseHeat, smoothEfficiency; @Override public float range(){ diff --git a/core/src/mindustry/world/blocks/defense/RegenProjector.java b/core/src/mindustry/world/blocks/defense/RegenProjector.java new file mode 100644 index 0000000000..28064eb393 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/RegenProjector.java @@ -0,0 +1,215 @@ +package mindustry.world.blocks.defense; + +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.draw.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class RegenProjector extends Block{ + private static final IntSet taken = new IntSet(); + //map ID to mend amount + private static final IntFloatMap mendMap = new IntFloatMap(); + private static long lastUpdateFrame = -1; + + //cached points per-block for drawing convenience + protected @Nullable Vec2[] drawPoints; + + public int rangeLength = 14, rangeWidth = 5; + //per frame + public float healPercent = 12f / 60f; + + public DrawBlock drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawSideRegion(true)); + + public float effectChance = 0.011f; + public Effect effect = Fx.regenParticle; + + public float beamSpacing = 60f * 7f, beamWidening = 5f, beamLenScl = 1.2f, beamStroke = 2f; + public Interp beamInterp = Interp.pow2Out; + public int beams = 6; + + public RegenProjector(String name){ + super(name); + solid = true; + update = true; + rotate = true; + group = BlockGroup.projectors; + hasPower = true; + hasItems = true; + emitLight = true; + envEnabled |= Env.space; + rotateDraw = false; + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + super.drawPlace(x, y, rotation, valid); + + drawBounds(x * tilesize + offset, y * tilesize + offset, rotation); + } + + public void drawBounds(float x, float y, int rotation){ + if(drawPoints == null){ + drawPoints = new Vec2[]{ + new Vec2(1f, -rangeWidth), + new Vec2(1f + rangeLength, -rangeWidth), + new Vec2(1f + rangeLength, rangeWidth), + new Vec2(1f + 0f, rangeWidth), + }; + for(var v : drawPoints){ + v.scl(tilesize); + } + } + + for(int i = 0; i < 4; i++){ + Tmp.v1.set(drawPoints[i]).rotate(rotation * 90).add(x, y); + Tmp.v2.set(drawPoints[(i + 1) % 4]).rotate(rotation * 90).add(x, y); + + Drawf.dashLine(Pal.accent, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); + } + } + + @Override + public void drawRequestRegion(BuildPlan plan, Eachable list){ + drawer.drawPlan(this, plan, list); + } + + @Override + public boolean outputsItems(){ + return false; + } + + @Override + public TextureRegion[] icons(){ + return drawer.finalIcons(this); + } + + @Override + public void load(){ + super.load(); + drawer.load(this); + } + + public class RegenProjectorBuild extends Building{ + public Seq targets = new Seq<>(); + public int lastChange = -2; + public float warmup, totalTime; + + public void updateTargets(){ + targets.clear(); + taken.clear(); + float rot = rotation * 90; + + for(int cy = -rangeWidth; cy <= rangeWidth; cy++){ + for(int cx = 1; cx <= rangeLength + 1; cx++){ + + //TODO handle offset + float wx = x/tilesize + Angles.trnsx(rot, cx, cy), wy = y/tilesize + Angles.trnsy(rot, cx, cy); + + Building build = world.build((int)wx, (int)wy); + + if(build != null && build.team == team && taken.add(build.id)){ + targets.add(build); + } + } + } + } + + @Override + public void updateTile(){ + if(lastChange != world.tileChanges){ + lastChange = world.tileChanges; + updateTargets(); + } + + warmup = Mathf.approachDelta(warmup, consValid() ? 1f : 0f, 1f / 70f); + totalTime += warmup * Time.delta; + + if(consValid()){ + //use Math.max to prevent stacking + for(Building build : targets){ + if(!build.damaged()) continue; + + int pos = build.pos(); + //TODO periodic effect + float value = mendMap.get(pos); + mendMap.put(pos, Math.min(Math.max(value, healPercent * edelta() * build.block.health / 100f), build.block.health - build.health)); + + if(Mathf.chanceDelta(effectChance)){ + effect.at(build.x + Mathf.range(build.block.size * tilesize/2f - 1f), build.y + Mathf.range(build.block.size * tilesize/2f - 1f)); + } + } + } + + if(lastUpdateFrame != Core.graphics.getFrameId()){ + lastUpdateFrame = Core.graphics.getFrameId(); + + for(var entry : mendMap.entries()){ + var build = world.build(entry.key); + if(build != null){ + build.heal(entry.value); + } + } + mendMap.clear(); + } + } + + @Override + public void drawSelect(){ + super.drawSelect(); + drawBounds(x, y, rotation); + } + + @Override + public float warmup(){ + return warmup; + } + + @Override + public float totalProgress(){ + return totalTime; + } + + @Override + public void draw(){ + drawer.drawBase(this); + + for(int i = 0; i < beams; i++){ + float life = beamInterp.apply((totalTime / beamSpacing + i / (float)beams) % 1f); + float len = life * rangeLength*beamLenScl * tilesize + size * tilesize/2f; + float width = Math.min(life * rangeWidth * 2f * tilesize * beamWidening, rangeWidth * 2f * tilesize); + float stroke = (0.5f + beamStroke * life) * warmup; + Draw.z(Layer.effect); + + Lines.stroke(stroke, Pal.accent); + Draw.alpha(1f - Mathf.curve(life, 0.5f)); + Lines.lineAngleCenter( + x + Angles.trnsx(rotdeg(), len), + y + Angles.trnsy(rotdeg(), len), + rotdeg() + 90f, + width + ); + + Draw.reset(); + } + + } + + @Override + public void drawLight(){ + super.drawLight(); + drawer.drawLights(this); + } + } +} diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 3e152ccd6d..0db60ba4ef 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -148,7 +148,7 @@ public class Turret extends ReloadTurret{ @Override public TextureRegion[] icons(){ - return draw.icons(this); + return draw.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index 0926d0edc7..41127d3742 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -18,7 +18,6 @@ public class PowerGenerator extends PowerDistributor{ public float powerProduction; public Stat generationType = Stat.basePowerGeneration; public DrawBlock drawer = new DrawBlock(); - public @Nullable String[] iconOverride; public PowerGenerator(String name){ super(name); @@ -29,14 +28,7 @@ public class PowerGenerator extends PowerDistributor{ @Override public TextureRegion[] icons(){ - if(iconOverride != null){ - var out = new TextureRegion[iconOverride.length]; - for(int i = 0; i < out.length; i++){ - out[i] = Core.atlas.find(name + iconOverride[i]); - } - return out; - } - return drawer.icons(this); + return drawer.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index a04f04cd98..91599aa142 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.production; -import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.struct.*; @@ -40,8 +39,6 @@ public class GenericCrafter extends Block{ public boolean legacyReadWarmup = false; public DrawBlock drawer = new DrawBlock(); - /** If set, the icon is overridden to be these strings, in order. Each string is a suffix. */ - public @Nullable String[] iconOverride = null; public GenericCrafter(String name){ super(name); @@ -129,14 +126,7 @@ public class GenericCrafter extends Block{ @Override public TextureRegion[] icons(){ - if(iconOverride != null){ - var out = new TextureRegion[iconOverride.length]; - for(int i = 0; i < out.length; i++){ - out[i] = Core.atlas.find(name + iconOverride[i]); - } - return out; - } - return drawer.icons(this); + return drawer.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index 6477714679..fd3a6224cf 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -73,7 +73,7 @@ public class Pump extends LiquidBlock{ @Override public TextureRegion[] icons(){ - return draw.icons(this); + return draw.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/draw/DrawBlock.java b/core/src/mindustry/world/draw/DrawBlock.java index c500c3a309..987e05c4a5 100644 --- a/core/src/mindustry/world/draw/DrawBlock.java +++ b/core/src/mindustry/world/draw/DrawBlock.java @@ -1,5 +1,6 @@ package mindustry.world.draw; +import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.struct.*; @@ -15,6 +16,9 @@ import mindustry.world.blocks.production.GenericCrafter.*; public class DrawBlock{ protected static final Rand rand = new Rand(); + /** If set, the icon is overridden to be these strings, in order. Each string is a suffix. */ + public @Nullable String[] iconOverride = null; + /** @deprecated no longer called! not specific to generic crafters! */ @Deprecated public void draw(GenericCrafterBuild build){} @@ -52,6 +56,17 @@ public class DrawBlock{ return new TextureRegion[]{block.region}; } + public final TextureRegion[] finalIcons(Block block){ + if(iconOverride != null){ + var out = new TextureRegion[iconOverride.length]; + for(int i = 0; i < out.length; i++){ + out[i] = Core.atlas.find(block.name + iconOverride[i]); + } + return out; + } + return icons(block); + } + public GenericCrafter expectCrafter(Block block){ if(!(block instanceof GenericCrafter crafter)) throw new ClassCastException("This drawer requires the block to be a GenericCrafter. Use a different drawer."); return crafter; diff --git a/core/src/mindustry/world/draw/DrawGlowRegion.java b/core/src/mindustry/world/draw/DrawGlowRegion.java index dd60d48cab..3bcf71cf02 100644 --- a/core/src/mindustry/world/draw/DrawGlowRegion.java +++ b/core/src/mindustry/world/draw/DrawGlowRegion.java @@ -17,6 +17,7 @@ public class DrawGlowRegion extends DrawBlock{ public float alpha = 0.9f, glowScale = 10f, glowIntensity = 0.5f; public float rotateSpeed = 0f; public float layer = Layer.blockAdditive; + public boolean rotate = false; public Color color = Color.red.cpy(); public TextureRegion region; @@ -27,6 +28,10 @@ public class DrawGlowRegion extends DrawBlock{ this.layer = layer; } + public DrawGlowRegion(boolean rotate){ + this.rotate = rotate; + } + @Override public void drawBase(Building build){ if(build.warmup() <= 0.001f) return; @@ -36,7 +41,7 @@ public class DrawGlowRegion extends DrawBlock{ Draw.blend(blending); Draw.color(color); Draw.alpha((Mathf.absin(build.totalProgress(), glowScale, alpha) * glowIntensity + 1f - glowIntensity) * build.warmup() * alpha); - Draw.rect(region, build.x, build.y, build.totalProgress() * rotateSpeed); + Draw.rect(region, build.x, build.y, build.totalProgress() * rotateSpeed + (rotate ? build.rotdeg() : 0f)); Draw.reset(); Draw.blend(); Draw.z(z); diff --git a/core/src/mindustry/world/draw/DrawSideRegion.java b/core/src/mindustry/world/draw/DrawSideRegion.java new file mode 100644 index 0000000000..c3ba1fc2f9 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawSideRegion.java @@ -0,0 +1,45 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.*; + +public class DrawSideRegion extends DrawBlock{ + public boolean drawRegion = false; + public TextureRegion top1, top2; + + public DrawSideRegion(){ + } + + public DrawSideRegion(boolean drawRegion){ + this.drawRegion = drawRegion; + } + + @Override + public void drawBase(Building build){ + if(drawRegion) Draw.rect(build.block.region, build.x, build.y); + + Draw.rect(build.rotation > 1 ? top2 : top1, build.x, build.y, build.rotdeg()); + } + + @Override + public void drawPlan(Block block, BuildPlan plan, Eachable list){ + if(drawRegion) Draw.rect(block.region, plan.drawx(), plan.drawy()); + Draw.rect(plan.rotation > 1 ? top2 : top1, plan.drawx(), plan.drawy(), plan.rotation * 90); + } + + @Override + public void load(Block block){ + top1 = Core.atlas.find(block.name + "-top1"); + top2 = Core.atlas.find(block.name + "-top2"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{block.region, top1}; + } + +} diff --git a/tools/build.gradle b/tools/build.gradle index 623a471f97..b9713feb8f 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -48,7 +48,7 @@ def transformColors = { List> list -> transformColors([["4a4b53", "6e7080", "989aa4"], ["3a5651", "3a8f64", "92dd7e"], ["bf92f9", "8a73c6", "665c9f"], /*["6e7080", "989aa4", "b0bac0"],*/ ["bc5452", "ea8878", "feb380"], ["de9458", "f8c266", "ffe18f"], ["feb380", "ea8878", "bc5452"], ["d4816b", "eab678", "ffd37f"], ["d57c65", "e3ae6f", "f7e97e"], ["ffffff", "dcc6c6", "9d7f7f"], ["df7646", "b23a4d", "752249"], ["3c3837", "515151", "646567"], - ["5757c1", "6f80e8", "88a4ff"], ["8f665b", "b28768", "c9a58f"], ["4c5878", "768a9a", "a0b0c8"]]) + ["5757c1", "6f80e8", "88a4ff"], ["8f665b", "b28768", "c9a58f"], ["4c5878", "768a9a", "a0b0c8"], ["62ae7f", "62ae7f", "84f491"]]) def antialias = { File file -> if(!doAntialias) return