From 59be28b5eb0d277cf8adc2634e2f3fb14f1a1b75 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 Apr 2022 18:08:40 -0400 Subject: [PATCH] Time to begin adding the new units --- .../blocks/units/basic-reconstructor-top.png | Bin 0 -> 1691 bytes .../blocks/units/basic-reconstructor.png | Bin 0 -> 1433 bytes .../blocks/units/mech-fabricator-top.png | Bin 0 -> 1539 bytes .../sprites/blocks/units/mech-fabricator.png | Bin 0 -> 1633 bytes .../blocks/units/ship-fabricator-top.png | Bin 0 -> 1535 bytes .../sprites/blocks/units/ship-fabricator.png | Bin 0 -> 1575 bytes ...icator-top.png => tank-fabricator-top.png} | Bin .../{fabricator.png => tank-fabricator.png} | Bin .../sprites/units/merui-leg-base.png | Bin 0 -> 294 bytes core/assets-raw/sprites/units/merui-leg.png | Bin 0 -> 269 bytes core/assets-raw/sprites/units/merui.png | Bin 0 -> 812 bytes core/assets-raw/sprites/units/osc-cell.png | Bin 0 -> 362 bytes core/assets-raw/sprites/units/osc.png | Bin 0 -> 976 bytes core/assets/icons/icons.properties | 6 ++ core/assets/logicids.dat | Bin 4327 -> 4358 bytes core/src/mindustry/content/Blocks.java | 53 ++++++++++++++++-- .../src/mindustry/content/ErekirTechTree.java | 45 +++++++-------- core/src/mindustry/content/SectorPresets.java | 2 +- core/src/mindustry/content/UnitTypes.java | 53 +++++++++++++++++- .../mindustry/entities/bullet/BulletType.java | 12 ++++ core/src/mindustry/io/SaveFileReader.java | 3 +- core/src/mindustry/type/UnitType.java | 35 ++++-------- 22 files changed, 151 insertions(+), 58 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/units/basic-reconstructor-top.png create mode 100644 core/assets-raw/sprites/blocks/units/basic-reconstructor.png create mode 100644 core/assets-raw/sprites/blocks/units/mech-fabricator-top.png create mode 100644 core/assets-raw/sprites/blocks/units/mech-fabricator.png create mode 100644 core/assets-raw/sprites/blocks/units/ship-fabricator-top.png create mode 100644 core/assets-raw/sprites/blocks/units/ship-fabricator.png rename core/assets-raw/sprites/blocks/units/{fabricator-top.png => tank-fabricator-top.png} (100%) rename core/assets-raw/sprites/blocks/units/{fabricator.png => tank-fabricator.png} (100%) create mode 100644 core/assets-raw/sprites/units/merui-leg-base.png create mode 100644 core/assets-raw/sprites/units/merui-leg.png create mode 100644 core/assets-raw/sprites/units/merui.png create mode 100644 core/assets-raw/sprites/units/osc-cell.png create mode 100644 core/assets-raw/sprites/units/osc.png diff --git a/core/assets-raw/sprites/blocks/units/basic-reconstructor-top.png b/core/assets-raw/sprites/blocks/units/basic-reconstructor-top.png new file mode 100644 index 0000000000000000000000000000000000000000..f092d8f80e8230f6e9a8774b5b8c126a0797d36b GIT binary patch literal 1691 zcmV;M24wk(P)Px*RY^oaRCt{2oxg4rF%ZUQ?+qxBc!0YmA}tcH03|IQQb0liD%ymW3XqThiH?>M zUIB^r5KZy`NEAH6QNVCuyu-NC^cwDsWV?xbF5 zN4g;q2-@l)!7i<-94_UTl1pu%>NXxnnEBs-Ba9JL)ujoG(2>;|2^D6ws z0>L-dO8@}=ZwTHoMgai)pAdS)Hr={?CtK-ya|pS40)5_>G+?xOLT&7=(2{omDt9M@ zCQ3{l=}u_*;`_yd7k(dZB? z#;Y0#A^@L1eH2wNDg?`i1?lx{08;Z&qe1X^Qj>g+1)$b^lq8@>Pfpkd?Y76e-S(J$ zy`=2cryK6)ivU{9M{xqeL7rn2HJ$?j%j8ThwdN?CaztZ5t8xK_#^fNx49`Ib%gRCU zo*=pc0Ejm*Wk?J{&gj_RQXpe>_L!X)0hE?1YD61a>Jq4doUVpmQ|iiS-4^C^2K?e$ z5K3z-ppp!VFYn2|2an(L!+rJQq>K3gf-cD7PT)3NYQE$%J z#}O$6?fnGx{Q$}Gg5+8>G-W>hn`97|7;3Sfpt>Wr-W&n|FVI`J@9d<>Upez7*M#Cg zu-Z=$2b=1S(0r=YGj~`*{-5kbS z6KD0K7#f)~AB7NV(jYw_7sEO^T`9&}8)sAFB!kk~>6UdJh0tTdgp!O+Ez28CTaw(0 zkFNY=mx%+j<_=X&Szh}IDviwD3Do?jUw^R5vsmN$coaP;D%Qkn46*5UkBd)vP;N?I)P5=X3h}5Q3NasG5~mi~R)kydds?`~1eW^Pj!V z2e>#ebCHi}dm{_WXAafH{8U%Q)6CCM#C)hu@;%hD=nj^?9!LQpAW&gP?fL1->u zAIwMffY9{eeKH^A4Z%G-deKEKT@caix**g(K$z_yjG8lq**}J&<_KYLCSoWF1Y8g5 zu@nLDZ#_tofv0IcfWcGHyI)sX*U`l|iyYIE=wcikfm^mD4U$68%;Z)*ssIOC z&Y)D&t#Fn(BugQZG)Qa{XAl=3RZx=UD@xq5X&Osv0gsw*HRsTNMX7j!$4h#pI;i=m z5JK#mZ#C<7dr8mpHPuvIG4oLfA=m9#tvi{&rrP60?Xb?A`4U;BL7Kg&-SfN%tXs=` zl-1rtD}+l=LA?*_SZ@y1%?J1clrw9Ws`Xsd>RGDwaW#^+YB-`BMI)V~ARuu{wL?C%FR1H834d--CSSDxO z(Q5NBhj;gW)a?<=Fo$=KWWKbH+BTca0|4X!jb?sLUD7s7kH!%X!rXvHHNU1#Nt>nr z0czD#P${6%&9AAO+h*xOgw>CssetBUeoYMAHcKEh%>%-U=Vm^t1wyLLTnM7oP%VvQ zK9z+RrCe0^rHE0@2e65)bSJn17} literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/units/basic-reconstructor.png b/core/assets-raw/sprites/blocks/units/basic-reconstructor.png new file mode 100644 index 0000000000000000000000000000000000000000..101119dbf4694c39709f593e63b3fa5f39bf8fea GIT binary patch literal 1433 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 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/units/mech-fabricator.png b/core/assets-raw/sprites/blocks/units/mech-fabricator.png new file mode 100644 index 0000000000000000000000000000000000000000..96592251aeff3d2a99aee8ac0059bd10bdc85411 GIT binary patch literal 1633 zcmV-n2A=teP)Px*8%ab#RCt{2ojY$EM-a!yXLkVv_oAhSYGlYwU<2yn)=m=ys$8d$fIyXM)vnUm z-#`@$!-o5~F=)UDQV?K6HWsK4Af+@6yU7r%(>`W)XXf@O{r~|YdAB<||JaQyh|pK(BVCDb=h^e$zqh{}?(6}lVwQHkbe)7y(q#Q0HNG!3DrSIg zolgzhI(K>n0MHX5hDChVX-aV~_Tzju0f2DUolfU4pH1MOe|JccU7Wv({yyB>-`#%LIAvxh|a&i6=Hn&bl*QSc=5TqQCOOEqvLpvvs1;EN?cXvptELXw#h^7c6 z0opZvN`zH%KB6T;Qh-o1D#xAz2B>Di!=~KD%z%V(}#zag4!WyXgK95_WM# zNL9*S0o~g{4XqBChl%&x& z(05IM9Ook+{(hf*Z{LsJw*>wHi}xcl?tKTbmd{CD{g ze){$`8o=kzpMt+}6R@#yAFi%0qt{$rUBbr3eeZ9Q&ZpWGvIPK^{##5Z@ZjMi?={|` z2#Eo;+^1(S*iJe!w_?_`DaCknmhK4ytoCST*CfY+*3Q?bEy7X&Y3Ju=SCTEkv|2SK)M8UqfZ@)b*j&m`g1UT( zqiqw#e?bA<7w%dj)bIvP%O-eNlZH8(X9t+btJ_*$O0g?%zgk>FHDJC5;iG*;%u#T?; z69E9q5|neVb$q#)2>{R!M_M!n70SlZM^O#tf&Ry9uOqM-6d zti}me67gvaYl!E7+S}bFXr#?MD+1u=oBhy?2<|Kh_bIAHtP-0-xq|Ay=%#(Co4H6X zh?7FgCaV9UMG$4P2`U;3;!4rBiQ>O1UP*Q#LM=9BE!5^n_9=HBv4@F3dpyhndy^@RcavCpL3$;r{z`qn$b3-{cg~;7| zFMF#36yfmbn0+sWJ}k7ra7#8mT)vXz99DqrAH0C^=nM{zjzyQJYKbaoqlEJT1h=cv za$1f2^7Pm2dxP86AZrog93CB$53y+D+psCQW!ZT28!Hm&;;1Iv2Q0L8f18y5f-mI} z$~jqXtEk3vA|+|3HFlyD#dq1~h*1n&HGF9c6-U$q-m=aSORPx)xk*GpRCt{2oxf{bM-a#7E=5!Y41qKPgE%1&s0#T5(xkB67?bXrG>0pp)}1<6 zf#AxhQKQZTH%W>#Ngq-PM1&53!A&3#NaYmaQYfSB?d{Ia%+9_a)_khdN!oq;{l3{B z^Y*D)9?p3p$?5U)A$QFL5Eh84Fdq&1SvIIBn<#?6S&lBkTn3nO(?aFG(N}c&q6H0Zm4v1?)N_>QCLaMLTnov^~)$MRi;M7H~gb~h|@Ym%I zSq7&c%?)�kEd5(y>w}8p1VNbY|ruVf)@A005YMvIn2t|CB5v7YQ6;xQ(hQOETc* zB0&@e!#BeJ1n5 zy0ufy&;-p`rJi9d=BM<)%;=6@Uq3G{=t3;JAmrj=36FQ4v5z5#cDgN&0OaKCD|%oq zM8fOq=Kui31zk(9Zafw(HESKU0RVav;s*C&LR_cTgxZCs$tqRS9Z?OXx+7`-N_9h& z;gasiVwG=}Cg7Ox_Mab%<)looT!?X^jbnmUip4ZfLz%Gk@f&tIp$V3$2uW8*nP8dU zGEbDHOpu6=?C;OaQra(1&Q_XnCS`(kaG-Q zr4|3hH^)tm>+tAUwb**R^Q>7~-8=%2p^0BpcI`TWqDf;hX*b(F5dB|E@k6AMfRln2 zms!mVj5DTO6S@)~;hGRni>*yCEi9L=E}77^_(;iw+``b(1haxTSItuNB|effp{rdV zCWVy5M`9ED79WXC;AUtoOsFn^D?WlI3`KkdO^~F=0qRX?HVw_OygDD8_y9L2gj9SB zIyaznfxl1s*v;4J7%*hiRwVa~X+@jQqCa#8eN)F{#B@6Le+$Uxp0r73B+DNcmF>A|;&-@k-A{^w6+RLl+ z+t0PRqfmUwq@b%Cwap@+^r!-EB!uDv)I~!4zj4_)wmu{5GoQVfuxZ@ z8An9|o+vesUz1Q>fJA&GWdi5yVnv@A~ly+f4RTrcYA7Hbg+^)frxXx4;seJ~X z1hoNL@eyorAL1ieH#I)BHbG^;gNIL6Z~y#GTPFbAJk+D_Oenz3dZYI7YnNNEY+vF- z5%#ZI6T$}fd5JQtTWdo2>`;@}SW%<~H>nA!hW24Xs!pj1sRy@8O<*^?G_y!OLo}w; zK&lSQX=te|&g0iU+Pfy}=Vne>5x|+&l_H@eK0sa=O@!2xRXWz6fBV|(?NY^qk*-8j zk-!l@SEpqvLRwZT62cSB;!PszE`cI6K`Q>x2u(;ud94ZAU({wJx9>d~z4*vteo9We zYfMOfX^{#Z`VKfLtzK-j@r8?@r-cb?Ke+g1tWCK6;NtVKG-1Liki%UOAF(oF;^OPE zFroUA1@I^;a~pm&mSZ_$mak6002ovPDHLkV1mnm&@li2 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/units/ship-fabricator.png b/core/assets-raw/sprites/blocks/units/ship-fabricator.png new file mode 100644 index 0000000000000000000000000000000000000000..c48284e98b940ce479e5d9ce09355de7c1430c58 GIT binary patch literal 1575 zcmV+?2H5$DP)Px);Ymb6RCt{2T{~(VK@cquGALC(pk#$$L3glITbc1CBrrOHkKn|~vMXH~pQi?pL3#KL1; zb)ITCC|%rcZUG=)bnouAu-)83fAkk+Z1;FmyuLa)L#5M-pFh4AuT%0vt**z&mVkg< zNeJX)Q6oRt(gwx`#@9H#mQqy}AZ0{@{MeQjG=1iZP^^N+MpFORK*;5q$MHmF&kROWF zx36E=4yB+`lBClN>2W$8u?QW2FY*H<3Dc??B}C|2$mgK%kB7e+B#6VLLGdYThbaPi zDx#JA(&rRfM8J|y^(kwQAp%JNN%Cvo$KZ&-A)n$?)-F*5v;Z39W3L0yL}($O;#1Z> zK?IZln&eY{hapyieCqF#ejr82PDO+S?hjwHouFo*?~khlrbeUjwJChcVfT15@RyrW zND3e^p~iiBup)5N=HA!ZBfCGmu8)KPmOYy}HL7z#d-C-$7GV%TntXP>sW_qM#iv+= z4nXh8r#fyio9e}OA%bWl9WzkPF0t>0M>yPa|rB+p}SRqaj4N8LYu}=6To_bmB$5L7^u7v z^SHoD!k)&ohIk3^-tTUKM&6REA^@Jh+0U(rpss?5pCT_}wfK}P65fIn9HqB$;SXa5YrSvdXEPQ z5iH0DAdZAJM9|n^1AC7~kRG)YL!OF|6hVu8%Ds|7dYm5Q0cDH!fYU!8*?S04GAOk+ z)FLLByZ0V@tAbDxE-tUg_hK-IK#P!W%f^SpIH08@TwGp>hNo(YD(RyH`2d33)o79C z5pUk|XA831)dcKCDC6St3Vn#h7^!x%x@8%4&p7Go$P?lREVp(47&ZQ~FXaO;=VaBk zXkQY>c`cnNh2f5Uju^(lr6HBKTy=y!;Ei>TSPe@Qp_Hew2$a+H$mfV*6K)x-c?0Hw z8Xt0m1!*ecC6)y3JdoFhT9kw-&l8S8A%EN$V{Nh41!p;vLPJN!R#0oneEP)Px#;7LS5R7i>Kl}!r5Fc5`b#iP_s!HXy;;?}jeDm_AuAg)T+-HIsaMTFUyyTnzX zO(sTTvMGJ5VVL1#-sA@uHFRZWqHbCMPyledUYw1O``POKMH42cbg)`)oQ-8AR9T6r z;GQ^mKAY<>7|vO(xI!%=Y31bW$<}^ahj(HVR1~>Y({Z4u#d7N$!U7Y?tP>}LvsTni z3nFPXn81H*_gbAwEcmeBB?r5#RzTm%m^QOu^Ewg9=uqH`9jAZ-z|;o@>^Hl6bxubS s^k#b}<~|BNVJH;v9IlkV)2QL=4UcbYh7_`kGynhq07*qoM6N<$f(rC}G5`Po literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/merui-leg.png b/core/assets-raw/sprites/units/merui-leg.png new file mode 100644 index 0000000000000000000000000000000000000000..020566c4936cc313b78b4a5fb56a3bd608dcc024 GIT binary patch literal 269 zcmV+o0rLKdP)P000>X1^@s6#OZ}&00001b5ch_0Itp) z=>Px#$4Nv%R7i>Kl)(wZFbqY%MMrTihAh$^yGQ8=T_}_ml0^c(#Ji-Y1QScD8VWts zA9RS2_4JJ#pz1H>F4xipQKr{z?L9CN+>o<`6O19g@Z5yDkH4BkI zdjSAI(qYX}n#MIOB5g`;o8B~*U%VA00NfHo-?2Ro`A3Y2ojwH5{)M&1RaJNa@)ugH TEij`000000NkvXXu0mjf?9FKj literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/merui.png b/core/assets-raw/sprites/units/merui.png new file mode 100644 index 0000000000000000000000000000000000000000..270c8efc539d2e7f72663231c09919b2178fcbdd GIT binary patch literal 812 zcmV+{1JnG8P)Px%=1D|BRA_Gbp6)6<#fTv1U`QPB!% zbUs;*&L_*J{9;y1~Peza&Ytcg0%nldW((4jd8Iw+tsAVKtio{r*i%6 z=kHNpYy&Yk$W)nEQAkh%2LfCC16in+$3zNTj*mpU3 zVsK~OeRtN~58C)KEbhZBz*IQuGi7TDsRj&99D?Jng|>1IqzVvExVXP#Z7Dd(7>=oh zOa{c=1SB#Y_elFMlOJp>ZVX~!$VNID=bZcYb+ASykOCQl1Hl|HXR6fqAU7cgDG}$Z zg>x>mivIoclbrZsI3(>`?GD?ma6a4|Qq|U~;e>rK3<)sw!jl{nGkle-UzA1OX0 zz=13wlZ(vB>0n81LF#l4iBp{pT*Gi&toeN5PEH5So#=f?Na*(F@tIwyjibgOh7Z|z zFB+Pdf|QE#eX-L-C;>?HVmJ&w+gk0;(|uY8oO1?%i~BpW#qtXb1?gX-D(-aL3vO?z zvH<-Ae8`8{C^?qzuN*JXkj*?`9(Ft~Jz-@$)PsxNfDET6WBgUO^W;N`sgUS&B7o!U%5%}{W_|JwT9$FzB` zF}`l)JA7g4VXL^eiIQhtYgRrp$Ub1?`|fD<6Qj%qy%)CU#U9QwX%7|NB^{uDWHV=J zPPf{OcZ^=*SsN2GdDb5*Gk;*(H`_Jp-L>kC--_b9?n*mMUBCF~p-n|4mY;pM^=&kE zpYt_S_}0-)2YzkM`}<5&=i;@?SDm8wS5~{J+!QV>ws};<^G{exVCsugu4<3G);is9 zFm81f)1UN#a|>6GUYtrM{|zmZ#T65e_-@d#SY0vkNwq`TL#;1bHQ(gqEnl?whq(K8 z%=;ANc51I$O3#i=126oEP)Px&ib+I4RCt{2T02NwK@>fP2)05>ArRK)fsI8<+dv`-k}4r}NF_EY(ruR_O-Loy zqJ_w!sE{_LMH*p2TmpinU>itbie)ylH}kpo&c{IJfUv&z=H7G8o1M?y0U8<_8X6iJ zYGHG0`*w3{`<8pXG-hfhqXOT(eKQlfUIWzrKQPEU(N?-KQvJLXn^$@c{7i z`k}Mk+=I)>=UOII83b+dCEI9F+yE+MbaCc=mfovj!hLN+?(((kdJ`d3;H$^40RX$F zJCkdpi!<~VmnLmf^T(j-0lv+Q@AC`R*Ma45t34f?d~W zo0R+^h`Nm?flJ8yCp(TOflpumHs<+@HEBxG*MZ#wa_!X@=2unsB#>}r8<1l}<_OGT zf`qGR3`j9SA}qxODM#@js4+n!NYh5cO|=df4o6edls(YVK`Z5Ly4w13X?v%7C1?`T zQQkLw8MvlE&b?5sl&_{}8eHG#PmQjjWvzKT_O34`(7;|9nyqrkShI38`0}}*e;TBL zL*fD6;>QQ>qR7QXA|6m~ho3%s$)0By=2u1HZS0=z;Ogdx{rt)CzF3cH4DcnQT@eVs z`SZCwoX_of@4MQ%a)da=kZn6`i1`Ro*uq05q~zcrivg5SjG#+!%mir;E|LxK5y|x22~!hXg6TEdhQ@Rmf9C~};c(=ATflf)8~pef%(3?9gSXcJQLcFDv#F?JfJRU)6N(#N_coMnC#wS;yKq0OsuP$Bj?sQ#3_cPf(Y?i=Nbm$tJ_kctNq4oIwT^lzo2N};#7q!JG#o)D3g z#!5n44FWP8kTNn&2MZdzheQD$;tNq!Lne{O1W28uv&MrHxBfN)Y`ac1)5 zmAoDzf~9$xCAvka1&NtOx+VGLsYMKyn?LbxV&rDcO)V { node(siliconArcFurnace, () -> { node(electrolyzer, Seq.with(new OnSector(three)), () -> { - node(oxidationChamber, Seq.with(new Research(mechReconstructor), new OnSector(four)), () -> { + node(oxidationChamber, Seq.with(new Research(basicReconstructor), new OnSector(four)), () -> { node(electricHeater, Seq.with(new OnSector(four)), () -> { node(heatRedirector, () -> { @@ -228,7 +228,7 @@ public class ErekirTechTree{ }); - node(breach, Seq.with(new Research(siliconArcFurnace), new Research(fabricator)), () -> { + node(breach, Seq.with(new Research(siliconArcFurnace), new Research(tankFabricator)), () -> { node(berylliumWall, () -> { node(berylliumWallLarge, () -> { @@ -261,7 +261,7 @@ public class ErekirTechTree{ }); }); - node(radar, Seq.with(new Research(beamNode), new Research(turbineCondenser), new Research(fabricator), new OnSector(SectorPresets.two)), () -> { + node(radar, Seq.with(new Research(beamNode), new Research(turbineCondenser), new Research(tankFabricator), new OnSector(SectorPresets.two)), () -> { }); }); @@ -272,44 +272,39 @@ public class ErekirTechTree{ }); }); - node(fabricator, Seq.with(new Research(siliconArcFurnace), new Research(plasmaBore), new Research(turbineCondenser)), () -> { + node(tankFabricator, Seq.with(new Research(siliconArcFurnace), new Research(plasmaBore), new Research(turbineCondenser)), () -> { node(UnitTypes.stell, () -> { }); - node(mechReconstructor, Seq.with(new OnSector(three)), () -> { + node(basicReconstructor, Seq.with(new OnSector(three)), () -> { node(UnitTypes.latum); + node(UnitTypes.avert); + node(UnitTypes.locus); - node(shipReconstructor, Seq.with(new OnSector(three)), () -> { - node(UnitTypes.avert); + node(tankAssembler, Seq.with(new OnSector(three), new Research(constructor), new Research(atmosphericConcentrator)), () -> { + node(UnitTypes.vanquish, () -> { + node(UnitTypes.conquer, Seq.with(tmpNever), () -> { - node(tankReconstructor, () -> { - node(UnitTypes.locus); + }); + }); - node(tankAssembler, Seq.with(new OnSector(three), new Research(constructor), new Research(atmosphericConcentrator)), () -> { - node(UnitTypes.vanquish, () -> { - node(UnitTypes.conquer, Seq.with(tmpNever), () -> { + node(shipAssembler, Seq.with(new OnSector(five)), () -> { + node(UnitTypes.quell, () -> { + node(UnitTypes.disrupt, Seq.with(tmpNever), () -> { - }); }); + }); - node(shipAssembler, Seq.with(new OnSector(five)), () -> { - node(UnitTypes.quell, () -> { - node(UnitTypes.disrupt, Seq.with(tmpNever), () -> { + node(mechAssembler, Seq.with(tmpNever), () -> { + node(UnitTypes.bulwark, () -> { + node(UnitTypes.krepost, Seq.with(tmpNever), () -> { - }); - }); - - node(mechAssembler, Seq.with(tmpNever), () -> { - node(UnitTypes.bulwark, () -> { - node(UnitTypes.krepost, Seq.with(tmpNever), () -> { - - }); - }); }); }); }); }); + }); }); }); diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 73d154062a..a5ee4b5227 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -151,7 +151,7 @@ public class SectorPresets{ new TextMarker("The arc furnace needs [accent]sand[] and [accent]graphite[] to create [accent]silicon[].\n[accent]Power[] is also required.", 268f * 8f, 101f * 8f), new TextMarker("Use [accent]cliff crushers[] to mine sand.", 262f * 8f, 88f * 8f) ), - new BuildCountObjective(Blocks.fabricator, 1).withMarkers( + new BuildCountObjective(Blocks.tankFabricator, 1).withMarkers( new TextMarker("Use [accent]units[] to explore the map, defend buildings, and go on the offensive.\n Research and place a [accent]fabricator[]", 258f * 8f, 116f * 8f) ), new UnitCountObjective(UnitTypes.stell, 1).withMarkers( diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index fe692a9f85..31f50ffb43 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -38,7 +38,7 @@ public class UnitTypes{ //legs public static @EntityDef({Unitc.class, Legsc.class}) UnitType corvus, atrax, - latum, anthicus, + merui, latum, anthicus, bulwark, krepost; //legs, legacy @@ -46,7 +46,8 @@ public class UnitTypes{ //air public static @EntityDef({Unitc.class}) UnitType flare, eclipse, horizon, zenith, antumbra, - evoke, avert, obviate; + evoke, avert, obviate, + osc; //air, legacy public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType mono; @@ -2829,6 +2830,35 @@ public class UnitTypes{ //endregion //region erekir - mech + merui = new ErekirUnitType("merui"){{ + speed = 0.75f; + drag = 0.1f; + hitSize = 9f; + rotateSpeed = 3.5f; + health = 700; + armor = 5f; + + legCount = 6; + legLength = 8f; + lockLegBase = true; + legContinuousMove = true; + legExtension = -2f; + legBaseOffset = 3f; + maxStretch = 1.1f; + maxCompress = 0.2f; + legLengthScl = 0.96f; + legTrns = 1.1f; + legGroupSize = 3; + rippleScale = 0.2f; + + legMoveSpace = 1f; + hovering = true; + + visualElevation = 0.1f; + groundLayer = Layer.legUnit - 1f; + + }}; + latum = new ErekirUnitType("latum"){{ speed = 0.7f; drag = 0.1f; @@ -3300,6 +3330,25 @@ public class UnitTypes{ //endregion //region erekir - flying + osc = new ErekirUnitType("osc"){{ + //TODO needs hover passability like legs - move into UnitType? + hovering = true; + visualElevation = 0.1f; + + drag = 0.08f; + speed = 2f; + rotateSpeed = 6f; + + accel = 0.09f; + health = 600f; + armor = 3f; + hitSize = 7f; + engineOffset = 7f; + engineSize = 2f; + itemCapacity = 0; + useEngineElevation = false; + }}; + avert = new ErekirUnitType("avert"){{ lowAltitude = false; flying = true; diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 41555fefc0..ee7d5e918c 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -150,6 +150,9 @@ public class BulletType extends Content implements Cloneable{ public int fragBullets = 9; public float fragVelocityMin = 0.2f, fragVelocityMax = 1f, fragLifeMin = 1f, fragLifeMax = 1f; public @Nullable BulletType fragBullet = null; + public float bulletInterval = 20f; + public int intervalBulletCount = 1; + public @Nullable BulletType intervalBullet; public Color hitColor = Color.white; public Color healColor = Pal.heal; public Effect healEffect = Fx.healBlockFull; @@ -423,6 +426,15 @@ public class BulletType extends Content implements Cloneable{ updateHoming(b); updateWeaving(b); updateTrailEffects(b); + updateBulletInterval(b); + } + + public void updateBulletInterval(Bullet b){ + if(intervalBullet != null && b.timer.get(2, bulletInterval)){ + for(int i = 0; i < intervalBulletCount; i++){ + intervalBullet.create(b, b.x, b.y, Mathf.random(360f)); + } + } } public void updateHoming(Bullet b){ diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index 5d450f0e89..d7c16d0931 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -62,7 +62,8 @@ public abstract class SaveFileReader{ "block-loader", "payload-loader", "thermal-pump", "impulse-pump", "alloy-smelter", "surge-smelter", - "steam-vent", "rhyolite-vent" + "steam-vent", "rhyolite-vent", + "fabricator", "tank-fabricator" ); public static final ObjectMap modContentNameMap = ObjectMap.of( diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index c4fc7f0627..2e3aed7657 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -165,6 +165,7 @@ public class UnitType extends UnlockableContent{ public boolean canDrown = true, naval = false; public float drownTimeMultiplier = 1f; public float engineOffset = 5f, engineSize = 2.5f; + public boolean useEngineElevation = true; public @Nullable Color engineColor = null; public @Nullable Color trailColor; public Color engineColorInner = Color.white; @@ -505,6 +506,10 @@ public class UnitType extends UnlockableContent{ mechStepParticles = hitSize > 15f; } + if(engineSize > 0){ + engines.add(new UnitEngine(0f, -engineOffset, engineSize, -90f)); + } + if(treadEffect == null){ treadEffect = new Effect(50, e -> { color(Tmp.c1.set(e.color).mul(1.5f)); @@ -871,7 +876,6 @@ public class UnitType extends UnlockableContent{ if(trailLength > 0 && !naval && unit.isFlying()){ drawTrail(unit); } - if(engineSize > 0) drawEngine(unit); if(engines.size > 0) drawEngines(unit); Draw.z(z); if(drawBody) drawBody(unit); @@ -1010,27 +1014,6 @@ public class UnitType extends UnlockableContent{ } } - public void drawEngine(Unit unit){ - if(!unit.isFlying()) return; - - float scale = unit.elevation; - float offset = engineOffset/2f + engineOffset/2f*scale; - - Draw.color(engineColor == null ? unit.team.color : engineColor); - Fill.circle( - unit.x + Angles.trnsx(unit.rotation + 180, offset), - unit.y + Angles.trnsy(unit.rotation + 180, offset), - (engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f)) * scale - ); - Draw.color(engineColorInner); - Fill.circle( - unit.x + Angles.trnsx(unit.rotation + 180, offset - 1f), - unit.y + Angles.trnsy(unit.rotation + 180, offset - 1f), - (engineSize + Mathf.absin(Time.time, 2f, engineSize / 4f)) / 2f * scale - ); - Draw.color(); - } - public void drawTrail(Unit unit){ if(unit.trail == null){ unit.trail = new Trail(trailLength); @@ -1040,16 +1023,18 @@ public class UnitType extends UnlockableContent{ } public void drawEngines(Unit unit){ - if(!unit.isFlying()) return; + float scale = useEngineElevation ? unit.elevation : 1f; + + if(scale <= 0.0001f) return; - float scale = unit.elevation; float rot = unit.rotation - 90; + Color color = engineColor == null ? unit.team.color : engineColor; for(var engine : engines){ Tmp.v1.set(engine.x, engine.y).rotate(rot); float ex = Tmp.v1.x, ey = Tmp.v1.y; - Draw.color(unit.team.color); + Draw.color(color); Fill.circle( unit.x + ex, unit.y + ey,