From 8023ea1d34316d445628a1c51d3880a571905c05 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 18 Dec 2021 23:23:35 -0500 Subject: [PATCH] aaaaaaaAAAAAAAAAAAAAAAAAA --- .../main/resources/revisions/manifold/0.json | 2 +- .../sprites/blocks/payload/factory-in-5.png | Bin 1206 -> 1184 bytes .../sprites/blocks/units/tank-assembler.png | Bin 1374 -> 3979 bytes core/assets-raw/sprites/units/vanquish.png | Bin 4412 -> 4361 bytes core/src/mindustry/ai/types/AssemblerAI.java | 14 ++- core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/content/Fx.java | 12 ++ core/src/mindustry/content/UnitTypes.java | 12 +- core/src/mindustry/graphics/Drawf.java | 6 + .../maps/planet/ErekirPlanetGenerator.java | 6 +- .../world/blocks/payloads/BuildPayload.java | 6 +- .../world/blocks/units/UnitAssembler.java | 107 ++++++++---------- .../blocks/units/UnitAssemblerModule.java | 9 +- .../world/consumers/ConsumePayloadFilter.java | 7 +- 14 files changed, 103 insertions(+), 80 deletions(-) diff --git a/annotations/src/main/resources/revisions/manifold/0.json b/annotations/src/main/resources/revisions/manifold/0.json index 13a7219ebf..b478f74a95 100644 --- a/annotations/src/main/resources/revisions/manifold/0.json +++ b/annotations/src/main/resources/revisions/manifold/0.json @@ -1 +1 @@ -{fields:[{name:ammo,type:float},{name:building,type:Building},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file +{fields:[{name:ammo,type:float},{name:building,type:Building},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/core/assets-raw/sprites/blocks/payload/factory-in-5.png b/core/assets-raw/sprites/blocks/payload/factory-in-5.png index 785faba9cff4574cf18f4265d47f3cb7b97040ae..df9e5a45b32117a8e07266b5f79a7eebc161a92f 100644 GIT binary patch delta 1164 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 diff --git a/core/assets-raw/sprites/units/vanquish.png b/core/assets-raw/sprites/units/vanquish.png index 3f6317a3d4fe71c883a0d834679eab67a044056d..c867e2f81d2020490121069052f7d4e3430ecaa9 100644 GIT binary patch delta 4352 zcmdm^)TuPVu>P>8i(^Q|oVRlwyJLGH%({Wzzi4tHZJKVzdFXB=ne8#$LX{2QBgX6Ui8K2=$q+S@m~d7IhZ zy?3vMUcGwveeXT_mc7RLyH>BRTfZxQf8AdOHeM-{j0+1Ko7w8&ED$3=-6Siw!7clB z`L`X%rwOlo3t`=|MLC5@%p-+_o>`h9(lV}ayMPO^=q!JXPUOCwpZE$ z-3>byd|y=0ovkYT+#;PrQsivKA+5!pukYng-tumu3Gl0eH`4hOd_4qu?)}P8)6J3<3U30NyLjBDxr_N^VZR8Pc(%rnf zNAp(iv4;1|IZ>rWa%)9WG|Vrw8h@VXGvU-K*>>Nx=NiMLjHZZx(3;s`?HA*6V^#CE z&6}nFt`kdH@%O-Wj#KkKBrVa%3E}Zt`JyHFL}Z@w-jCj)Cm0yiCKvimeY9(d*}1gO zI?~@0t!Km^{%O$DnD6gdUoUbx!)bY1y6DQuSx(E=UOwTrE#KR3v&hMeDF>~scQ2cH zM$|leOT(G9yBm9}84R5E2Y-E@c5%iTiV`@{}2kxd^DT#w`F zTj7!xeE;>I)A83I9O>MCV{+eCW|>V(xhL#=)zmv_#@jb<`u=_R{d!f^8KYYa^)q7> zXJ_5-Tl6O>v%9Ki+vd&O{`3EtSKeWeTzg^0+A9{GNzK{Zua0zXzf!uwSSnp_8TW*< z^KI5;HM=QF@1Alq!18nc(PidY>@%9)9Q<1ynmdsr_cc?FYH}FMmRpR^Qa0%wdUpGY zkQrA6_sr&NtqjNKTvff1v~A0aSC$8!pAy+pAI4aATwGKA=?$aVXZinL)=F)@-FE5m zou~t|8{H(!9&SFrc2#GVk>uvN!o_;54jejMX1=oPp83m#@0_tHDVcM&l*#v?awAE1 z-fb;8e?I8-$lvR&(_eX--{PMvlVa&#^`YWJ)TF5ATiu{sAN#?W9KHU4g z&baFH+3@Y_m-xG_G`_X{ehlxjGLr!2NSzf6H*XI~E4H8Bb2x2tWm!3=LbJ{{$y>^z zqPtI~@Z7H}4vkUsV!ib>d-}=NQp*WH`4%;7YSNAPb}~4$uKuwXSLB=BGxUpdZ`3Qr z#i%uWTDI$J(8C+K%I_>(ZuQ=?kTd&#?R5CN1q}yv{8$CqFRrYL$yBrsd4F7d^_`~6 zHf!#@IawH@lOR4Xulv-)Lt@VEFotSKvI{9T)v{j0!BCqO%$ z@mvh2^_w$OFCTnwaW{jj-l)MsVWGp(rsI~L7sNDEHhz0tuAP23b!(l+PR)#k4mdpxoxThuzwhpM-mo?9;H5u>*4G&o*%vZ9C+wVWTk(C% zi&dtoEN#LHHg31>GG7Sq%`^AdYX4>K>(kdJFqSZwG=%qcEUjU%s-C;E=vRG!gG%_? zm77!_1RP(sDgVtX!3S44r)1UpXs7RHlyqRdu;V+MedOi4?;`#g{*x6q$~4yz+|G9@ zY*p`+AiJ$Q@=u2bUU1TOcRsY*Ni#=m!qI=*CT!vJzHwpt#*;~TIcq}x?)3X#d|xo; zhK^!)tzYl&n4ga|J!SXlBz&%Y@q31}biKDIqps;p&$|cMJPx~A+L*5MVwKvz{8;U} zKOd(o>6@{_Y)L}*&vRcbw`wgG$qAkRx#wr$YlZDISb9x|KR zllV7s$KRF0SH4!}-tcjJ>~w7EdyDG_Fa6ZkOS#p!eHo8tPTuU=8z$nxrirVK_Dy_#!d5Hn4Ztb zNXR`AaLMyV%n6I*UWwf|MybtL>(Awc8L_YZvbZ#?Z(Cc> z=jhely_Ysj?O6Dd>-MDye_vPK3(5@9JP{LknR(^vlyy3KEE-3zoeGUi?EaLv`m0EV zUXH1P^VF8LCMg>7W^aExZjQ5R+i>+>mIHUR?}-4_gw?E)T#2VEIdi|=etT~2{wpc| z)tWiF3eJ&-!laF^TzgjUCZ_$UyHPBEIk)Gd57Q1~WxL(}IcWb;Zc z*W=5nZR1f`{QA$M)9WA1|No(a#51O+f4Ukle__O;ahKI+;IrT+h$NH?3c< zH}ksg%X%sAvc+rP{`mDuXpVI~=d@|dpS-DiS$R&a|F&YvYVF_~x9&82xBqeBi`!nc zgoXD#%Ae|`wufcEE`RWs->zltS>A})nQn=%?>;Uw+{x>B!b>yV-sJoCNpsga9}g;f zlJjMfw){3fdxtfWYtGNNvCDYy>eT9-G~LyIFQ`OYd2X-YRDVO?SNr<=)!LUQvKhT? zot5_R@w{bDSqwWjZ=U`2QXs?ZzZdfM%5-ikS=7gy`!R24yp+4vEV3|-@#*6+hZHMM=o>W>!%vk`%O+3 z&sq1rX8*A%U4c5sgl)IT2IX&OXPT&(c3{=`DfVE&WYz{OkWo@A>;}{oluo4_>IOlXrfXHA&=2ireIG zhdIJuyy-|a<1%U}VAe6KcxYF9gt6myjP`QBvu^q;6^_@)ba9G0dufI(V)Ih)j=dB; zM>M1V=sw}R13Rbx*m&kx>lxlTN2hVjxM@*u=Y3MEZi?+(BO!$xjeF5sZ&WK!3H9=i zYTMMznsei8JKN_=_g0i_Inltd(h*>)fA8%}l(@lV&(X>!iy+A?XvLXGyw zJ&CPVzV+K%lh${CTUx8^3NLIDxARl`SZ*9?f8z8@ zx3vnZmrlqHiC%I4X-C&WSDDQY#k?PSHNS4zQF3M(Z^tv9>uIc9X74_VElQdp?QfcK z<=2{ZIi3l;lJo9fiOl1S<_S*uu5=A2()6!c0e=hAzPPRG|=9#gU$ zru|y?ena3TgMj+l$zSb(%C{Fg>3O}^9 zisG!EO$&WA)vC5xmn-VsyrtJ3mAOu0Xkl0ocVw2(*F{mBId{yi?2$boc$8=6#a&FZ zuPmJ75ZHJ=QrqqCH0IeR!KJL*M6`7#+}X{tRi7=!JxVv=iQa;qwe{!wJ7;fQ^KC_` zc*wRMZgs_t$1>I$MR#ugdhFv~Xa0tONhRfXlI8E-Ym+|yHva4dt<8lu6XJQE959=G z_Gq65tE3nA?dIR#`%3bKPB?9g@O=DO#@>5|z~RZe#pX_awDMT??(-1|JM*>U>dow! zZnU1a3wL~`wWXBF{YtQxlzg;J{cXpUFTS*;?B{y-eO7PX$~O})_dauCTW~r@Q$C|6 zX4h+7wpl6ca_916JQKWGC(XWCG-Z`Dll1ntQu5PV)^cP_vOTJ@zwl^bg}B1wYeyS> zXPq^*(_@|eQ@g6D+;dCNbcN#AKBbFq8Akiudg^!Wvg$L*wcO@+cXLQ?e9g8kY%N%y@ zdth`Zq-3W_hn9Wh{$9Scdf_5|0s9^G{W(jnmM>L^{x`9FskvRH*WSI2syUYT zJ@cMr>lqxGZc))}Tgn!(cKRpgSYe}8aZ~c=m(@RY&w6xYzm)G!*VR`RdAImfd2c$Q zra!IwQw;mICLV=3H=X8hJ&`l*c3$Ad(=+>m(oLq!znQi6&l=8|Zd;9_HGj@L+wL># z;wJT+zk9QHFLK|${pf~B$F@|@#K-r_*D9JPM(pv}7Ji;*$D=tn>mICdh;lln8Jr}& zD$GoK;k_m{h5F{R|JSb;nh=;;ob%~w`U!?AJ}HN~H0y7fKd&CnlU*OJ=KNL8gdtWz z?(RK1h6PW8N_BqUSblk88qYS435+@%84RBq?o?S?eQ6fj@H6#S>9Q>v6BtdHa?1#a2XIf4V=-fZgo>_Ko2Z$8s(@ zxYerJUYmYYMylc9T*mM#N7g=#6sh{};PLJ*bKdl)Uc2_LV!KfP|Jx%+S<4BTu0JO= zt+}<=uX9cCR+G({3d|EMgJ-kWU)&}(VXB7yvPTQ1W^rtf(M*|@H|2Khu_IeIZq+Xi z5!rHycLGnt&O_60SI>7n%~>n1rMy%qcjFrSaBk!NXW7}s$tCapsBZqG;)u}HzcDwps^E!DeZNH88f3K@6d%~FdVpxymxGPNVJDF9l z@#OThf4S2xM$L;ADl`i3d^2tJx}Vo|78i=y*L{2%9(I*?mBMM(wMiG8m>&db=j^^Q zwJbC!zR>?yK#r-n1>rwemiwrRnN9vMzV$Zth}%GKl7JM z_uZe;d-0gMzwVno=NBA4)m!@Q=mCb?k4`Hci>$mXT@hLT?$1&|h8g9HC8xhQ*xDN_ zc5C(5)Pvvpbe84&EHmF`X1=TB_mc7nJ8x~@E4=Sc{KV{_X)ot89_vj!{i^BfcS)m= uUSad6%lTCM9Gej%3%t-FhB)cJ{KnSJA97sosxmMzFnGH9xvX41xax#TghF7>k44ofy`glX=O&An?u8 z#WAE}&fB@?yJe3H9)H~#lOoM3@5{4q&t98|xjFwCCw)vzJslzarrRMwN0CD(+tTI9 zH@`mNrU)^n({fBqu|j)x)C_Evp;b#*l=W2;m1GTsXr*}u>A?0)|>d%AVtao07I zSD%yA;pABLwlVUE)z4Q`HqL5Ta7${2>zZJXxrQd{3M;m;rU||lxx8{2?}HOc3f-&L z{dg80rhe|DdDCdZY!YgpcC&eL@#>tSsaM@^-`aP$?TqcRZEBM>tK*mZ zNin3&^Pe>7Mw)74t??au^Sm%~=CyApBq?0Kc3eoh_|;)MvD_>svqqn!)oi}APEJWp znR}Z*foofj&$H}lrx^C>?%W`{FVpH=PSn%1E$1BCxDHOc8FNe|*Dd)#IiuOyD9gSu zE~6>ZFAmMD)DvE^DeH7%@aob9Q`>l+vhMLxd+<$ITyWc~1+p?SZriUm@sx`EkaC>K zneWzh$nEHYDP4Rw+U7hByYza0NGlIRf{D~K5lubstj8%vXE%N1*!K9NsSN*Ni67sl zd~x5{qgIkt7BH@PwVI<_V8^7}#Ev zuljRGM{07Vo44i1UUR?Q^|QYB2l-_Q8Li`O&9V8mRlM19>WQ3J>2vFUz80Hf`B|*` z!p5=&=WSaUjly#`1PX0#Za#cazOFttv@g=_wc=#$l;F3=1E<96YdFm^5&zyo>$GMiDr|se?b$i@%bPMCAmy?f&=3dZ9NuF&at(E>~?Trs^ zZyACo*zTxbze-nVVQy~2+LSY04Pn*?=J;H5yHPWHR!c9_J*Q_2wkjSlOyA16ZHBI| z$yb>N#i?9T!Hi|U#WmHR-Y}Z!vO@9_&y3Tm5VzKGpA3-JY znGVjs7r(uuCiGXpdb(=LIt_ad*Q0qxGY?h2|C{#V+3fXl@t*g4g3`C-@82oq^EP7v z+op&B=kWZMXP*7jd)e-*cKOXSAqTd|H|AU1wY16>UliE)_t~l+b2LOVuCI?(Q@{4q z;hA*@(f5O|d|J5cYskYJ$;x^5F1LE_S;(6G zzjiwO-GYXLI)1Ez))!Y6#bhd42fjN#eU(kqs#X51$N41dpVTYGVOa8lzf3;u$4UN;h-ubac0_t<2y<_U&J4J}Nf z+;Y#A9HW;^IQpvpw%NJ%^H;xkpXzNA?0*B7`?d2-Bt(5dBO=W};zaYbc3%kZcO*JwS< zwCTouu}RYsIi-IYnMIuG?VY-6|Mi#u-&r?t&sI&@czF~I0)&1wE-uru=>gZhM%(ZRC`w>lgiwE(gtdQC;v+0@j-V)Yzdy9?s zX1D8XnNaxc;-P2%-(J5ORkvmhd(~NEDX9o)qbVfKRAvzgcsqE?%qnSSGu4bD-2VAw!e7iP2J<>SNE(*6P(_ovEEw zp-?*g%+#a33`=js?9?*O3AD@EdXMRR>sq#y6_YlAio?Up{@P_+b3ZPy?UpxhM&fEt z$yF>lTNRuYb1dZ-p8dD$?y1(RZr8RHMZ^0>mUG*!+jmbUxz-q8ICA}^(#&|V0eR@K+l#ySg%#B??KE*EM$cPy6-7XKnj7yPVt>9@WORVks-PzcDvIR{A?*#n!Ke+57LL zGVLg0zLa(%$ZW^9?W{&3=Fb#G|B8uZ?bs5dx;Zf+>tL*x>FiTc`&ND16?>93ATHc= zl-7Y9PdxmJpSn0gIl@&-+jZqu4MiA zkXP{P=SS)HXRMC>^P6_x;kuIamY0){tN(l45gqulXz9QAdO3Lsvs=#U-rkz|PPXIB zF89;vzv6_$y&@O19=ot6Ve_t4?u!!*s!bT9SDfkg|Nc0?RC9CXmKw&CeMQH;uO=(6 zY%10YEqZ%<=O^Cl4Y}R23qAQPKNc*leYVo7!+U$0z=fiP_T8e&yR+OgmbG4eu#0Wm zB6H>`4`)k1K6vYwM3~;1L)XKvpE*6vq*rzJ#bs}Q{CXv|CMKeF>sLd|UGY_OHc!0% zR$$ZFUc)zU-yQfZUz71`L7ec03x=0McY5Dkc=g&h*^2+o{E7MH>}KZ20&iG--xceV z=PIx%=u{;CS=+Epn@Tg{PxZ}djVpS3_}VM+4%4|`Urs)LT=dSJim7MUq;8d)mEx)X z@{_;V>!q1bf7KQz+gxy1wm0yyPtBZ6t|e9z*xB17|$SpJ@x0dJp{QV8j&&M+~owHT2=3XUC(sq@}mq=nURasP*Y@x%tE2@AKsT>o)3sPkmGze(qeV z{K-!YD^nHn_R6HJpRQKffBEa&_t$3x8Fn3wV3OwEa)mRwjc59_$;sx1g$ailp6GlK znmtK5Qchtj4@>$j|5bc4H@4(!u3g)ozR~b}h|uFe0~=U~K=jVFMH}(AT z+1~o+yle0_k0-wl&402$^10Vht#aRJ(+pJw=Y@-%HoNHT-%ym4l)`x9PI1&Bu}_S@ zw9>zMd)^3HFtvrp)$+_EZtW}SyL3f<$86DmD<0^yX+}~gmziOP>Hgmytn;{Ut4Dth zo~W4~b--<|vdIDMmEFsHvNI(F8jtB75IQDviDD30q{owU#k>=#pL59ob zIg0ro779Gfv2gdrfP^KC6W9GtE3C_l-I5x#$wOe{$*Hc6%o%KE+$R{G^j*JV${Iag zfw`l3n(fCzldk&NCx5xd`59-iM(VcaEPmxAJ6&0;O|0+?(^=C4=F6_!essxhwwb~# z?U>o38aH%sYf6F*-x{2rrfxAL;-jYSKdu8Yjl%?noHbl_lk<-A5SP=3|a z1IN}npFQ3v6L@BV%zhX%}w2XJKpok%>dqv-tSk?-$?J?kK$V z?=p{Xs+pejo7s&rH`FGtydk($!8tRry5Rr4n9pjBIw{>#P3+En+}y%xXtT5UqNV1% zReQGm>|veud+VdO>4z;3=+%AO$z>G2aH+7xqI*G?e%yF;m(R2;qkPijlQ$an%e2H&i<)hRTS>IC1|!n@o68^#kcIDeQv$b9T>YyY3v zeOX#hclC7h4K2Fqv!5jHd&cHm)7{K}BRIU_YK^A-1yjYvr(A!2%S^9Z!q)e9_r)pk zTfBUCxtv(iuhOmaDalgvd}%`P1jZKQ=oj17jAlRG6dm%WsBQ5TN#3XF+oFu^vz?X& zu00dxRhRZzadO(0H;mEsZ*OgTaq(@fVNTeDhdY;SD4f6h+JxB#I(90zSC+HI6t2s$ zF9=c4ReU@rI7xa{n3?v%b4_dt&1e7bUoA8t@cFYFPgb9vz*r(<((va@*{jQ+Hn-n3 zirenf_R1!MVV8r=uD$g<4kuT>s(2SXzmI*E-3=uNwhamk7*8-4y?*-O2%~Dk=kqV8 z&%CtAf$f4o#^I%@-{$tD#OEd0{d)K=A-_ERUAgxSr{}kB-)-!#+i_Z}IeL1~zAa&; z7w&W|)6%^uK9ws#>w?&ZrROGYa%75paewFUX%jdzCTVw7uStoI-{^33mfnBkX3Gsf zj~}y3l-TUbEctbIN&MS7%~X5I0$1KUQE{$!7?ZxgWZZtTNHsPtl=;Q}`s$ZEdSp&) zxpZvJt zk(Fz6r6j|J$W6XQ2RyEwU1h(0o87$9yo%<@C-?pMq&<0)*xtuJCpWz_HJ&Z8WkR85 z^Okc9XI;83XtwIyrGK(%nyM;X`iU!ZpSEyVksZbFV9qxv%<5`HaHdw{1T(y?VEG+CGz7qX|uG wO&F&2Wd@n*-I+2!YKjGxL58nYxnJy$6-`-Ye|uLG0|Nttr>mdKI;Vst0C}l*fB*mh diff --git a/core/src/mindustry/ai/types/AssemblerAI.java b/core/src/mindustry/ai/types/AssemblerAI.java index 9e3f9fb16b..3a0a6f358e 100644 --- a/core/src/mindustry/ai/types/AssemblerAI.java +++ b/core/src/mindustry/ai/types/AssemblerAI.java @@ -1,22 +1,26 @@ package mindustry.ai.types; +import arc.math.*; import arc.math.geom.*; import mindustry.entities.units.*; -import mindustry.gen.*; -import mindustry.world.blocks.units.UnitAssembler.*; public class AssemblerAI extends AIController{ public Vec2 targetPos = new Vec2(); + public float targetAngle; @Override public void updateMovement(){ //TODO if(!targetPos.isZero()){ - moveTo(targetPos, 8f, 11f); + moveTo(targetPos, 1f, 3f); } - if(unit instanceof BuildingTetherc tether && tether.building() instanceof UnitAssemblerBuild assembler){ - unit.lookAt(assembler.getUnitSpawn()); + if(unit.within(targetPos, 5f)){ + unit.lookAt(targetAngle); } } + + public boolean inPosition(){ + return unit.within(targetPos, 10f) && Angles.within(unit.rotation, targetAngle, 15f); + } } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 1a6b1b627b..179359cf38 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3319,7 +3319,7 @@ public class Blocks{ //TODO completely unfinished tankAssembler = new UnitAssembler("tank-assembler"){{ requirements(Category.units, with(Items.graphite, 10)); - size = 3; + size = 5; droneType = UnitTypes.manifold; plans.add(new AssemblerUnitPlan(UnitTypes.vanquish, 60f * 5f, BlockStack.list(Blocks.thoriumWallLarge, 4, Blocks.duct, 2))); consumes.power(1f); diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index ae84c353ee..c044c43915 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -13,6 +13,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.units.UnitAssembler.*; import static arc.graphics.g2d.Draw.rect; import static arc.graphics.g2d.Draw.*; @@ -226,6 +227,17 @@ public class Fx{ }); }), + payloadDeposit = new Effect(30f, e -> { + if(!(e.data instanceof YeetData data)) return; + Tmp.v1.set(e.x, e.y).lerp(data.target, e.finpow()); + float x = Tmp.v1.x, y = Tmp.v1.y; + + scl(e.fout(Interp.pow3Out) * 1.05f); + Drawf.squareShadow(x, y, data.block.size * tilesize * 1.85f, 1f); + mixcol(Pal.accent, e.fin()); + rect(data.block.fullIcon, x, y); + }).layer(Layer.flyingUnitLow - 5f), + select = new Effect(23, e -> { color(Pal.accent); stroke(e.fout() * 3f); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 81509d59d0..dd2cbbbe43 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -68,8 +68,8 @@ public class UnitTypes{ //special block unit type public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block; - //special tethered - public static @EntityDef({Unitc.class, BuildingTetherc.class}) UnitType manifold, assemblyDrone; + //special tethered (has payload capability, because it's necessary sometimes) + public static @EntityDef({Unitc.class, BuildingTetherc.class, Payloadc.class}) UnitType manifold, assemblyDrone, payloadDrone; //tank //TODO tank comp @@ -2431,7 +2431,7 @@ public class UnitTypes{ hitSize = 28f; treadPullOffset = 4; speed = 0.6f; - health = 10000; + health = 9000; armor = 20f; treadRect = new Rect(22f, 16f, 28f, 130f); @@ -2448,7 +2448,7 @@ public class UnitTypes{ y = 0; shadow = 28f; - bullet = new BasicBulletType(7f, 50){{ + bullet = new BasicBulletType(7f, 90){{ sprite = "missile-large"; width = 9f; height = 15f; @@ -2744,6 +2744,10 @@ public class UnitTypes{ envDisabled = Env.none; }}; + //payloadDrone = new UnitType("payload-drone"){{ + + //}}; + //endregion //region neoplasm diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index ca2af39629..25dc008953 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -224,6 +224,12 @@ public class Drawf{ shadow(x, y, rad, 1f); } + public static void squareShadow(float x, float y, float rad, float alpha){ + Draw.color(0, 0, 0, 0.4f * alpha); + Draw.rect("square-shadow", x, y, rad * Draw.xscl, rad * Draw.yscl); + Draw.color(); + } + public static void shadow(float x, float y, float rad, float alpha){ Draw.color(0, 0, 0, 0.4f * alpha); Draw.rect("circle-shadow", x, y, rad * Draw.xscl, rad * Draw.yscl); diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index 9077e86cac..ec30788a27 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -252,12 +252,12 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ state.rules.defaultTeam.items().add(Seq.with(ItemStack.with(Items.beryllium, 300, Items.graphite, 300))); //TODO proper waves - state.rules.waves = false; + state.rules.waves = true; state.rules.showSpawns = true; state.rules.waveTimer = true; - state.rules.waveSpacing = 60f * 60f * 10f; + state.rules.waveSpacing = 60f * 60f * 15f; state.rules.spawns = Seq.with(new SpawnGroup(){{ - type = UnitTypes.fortress; + type = UnitTypes.vanquish; spacing = 1; shieldScaling = 60; unitScaling = 2f; diff --git a/core/src/mindustry/world/blocks/payloads/BuildPayload.java b/core/src/mindustry/world/blocks/payloads/BuildPayload.java index cf6370ccf7..15476fe888 100644 --- a/core/src/mindustry/world/blocks/payloads/BuildPayload.java +++ b/core/src/mindustry/world/blocks/payloads/BuildPayload.java @@ -85,13 +85,15 @@ public class BuildPayload implements Payload{ @Override public void drawShadow(float alpha){ - Drawf.shadow(build.x, build.y, build.block.size * tilesize * 2f, alpha); + Drawf.squareShadow(build.x, build.y, build.block.size * tilesize * 1.85f, alpha); } @Override public void draw(){ - drawShadow(1f); float prevZ = Draw.z(); + Draw.z(prevZ - 0.0001f); + drawShadow(1f); + Draw.z(prevZ); Draw.zTransform(z -> z >= Layer.flyingUnitLow ? z : 0.0011f + Mathf.clamp(z, prevZ - 0.001f, prevZ + 0.9f)); build.tile = emptyTile; build.payloadDraw(); diff --git a/core/src/mindustry/world/blocks/units/UnitAssembler.java b/core/src/mindustry/world/blocks/units/UnitAssembler.java index bb7b7280fa..9739c8becf 100644 --- a/core/src/mindustry/world/blocks/units/UnitAssembler.java +++ b/core/src/mindustry/world/blocks/units/UnitAssembler.java @@ -92,12 +92,12 @@ public class UnitAssembler extends PayloadBlock{ @Override public void init(){ + clipSize = Math.max(clipSize, (areaSize + size) * tilesize * 2); consumes.add(new ConsumePayloadDynamic((UnitAssemblerBuild build) -> build.plan().requirements)); super.init(); } - @Override public void setStats(){ super.setStats(); @@ -137,6 +137,16 @@ public class UnitAssembler extends PayloadBlock{ AssemblerUnitPlan(){} } + public static class YeetData{ + public Vec2 target; + public Block block; + + public YeetData(Vec2 target, Block block){ + this.target = target; + this.block = block; + } + } + public class UnitAssemblerBuild extends PayloadBlockBuild{ protected IntSeq readUnits = new IntSeq(); @@ -146,7 +156,6 @@ public class UnitAssembler extends PayloadBlock{ public float progress, warmup; public float invalidWarmup = 0f; public int currentTier = 0; - public boolean wasOccupied = false; public Vec2 getUnitSpawn(){ @@ -173,7 +182,6 @@ public class UnitAssembler extends PayloadBlock{ public void updateModules(UnitAssemblerModuleBuild build){ modules.addUnique(build); checkTier(); - //TODO tier check } public void removeModule(UnitAssemblerModuleBuild build){ @@ -211,7 +219,7 @@ public class UnitAssembler extends PayloadBlock{ Drawf.selected(module, Pal.accent); } - //TODO draw area + //TODO draw area when no power } //is this necessary? wastes a lot of space @@ -265,10 +273,10 @@ public class UnitAssembler extends PayloadBlock{ readUnits.clear(); } - units.removeAll(u -> !u.isAdded() || u.dead); + units.removeAll(u -> !u.isAdded() || u.dead || !(u.controller() instanceof AssemblerAI)); + //TODO build up units, don't spawn immediately in batches if(efficiency() > 0 && units.size < dronesCreated){ - //TODO build animation? distribute spawning? var unit = droneType.create(team); if(unit instanceof BuildingTetherc bt){ bt.building(this); @@ -281,20 +289,26 @@ public class UnitAssembler extends PayloadBlock{ units.add(unit); } - //TODO units should move stuff into position + //TODO units should pick up and move payloads into position Vec2 spawn = getUnitSpawn(); + if(moveInPayload() && !wasOccupied){ + yeetPayload(payload); + payload = null; + } + //arrange units around perimeter for(int i = 0; i < units.size; i++){ var unit = units.get(i); - if(unit.controller() instanceof AssemblerAI ai){ - ai.targetPos.trns(i * 90f + 45f, areaSize / 2f * Mathf.sqrt2 * tilesize).add(spawn); - } + var ai = (AssemblerAI)unit.controller(); + + ai.targetPos.trns(i * 90f + 45f, areaSize / 2f * Mathf.sqrt2 * tilesize).add(spawn); + ai.targetAngle = i * 90f + 45f + 180f; } wasOccupied = checkSolid(spawn); - float eff = (units.size / (float)dronesCreated); + float eff = (units.count(u -> ((AssemblerAI)u.controller()).inPosition()) / (float)dronesCreated); invalidWarmup = Mathf.lerpDelta(invalidWarmup, wasOccupied ? 1f : 0f, 0.1f); @@ -312,7 +326,8 @@ public class UnitAssembler extends PayloadBlock{ var unit = plan.unit.create(team); unit.set(spawn.x + Mathf.range(0.001f), spawn.y + Mathf.range(0.001f)); unit.rotation = 90f; - unit.add(); + //TODO annoying so nothing is created yet + //unit.add(); progress = 0f; Fx.spawn.at(unit); @@ -329,7 +344,6 @@ public class UnitAssembler extends PayloadBlock{ @Override public void draw(){ Draw.rect(region, x, y); - //Draw.rect(outRegion, x, y, rotdeg()); //draw input conveyors for(int i = 0; i < 4; i++){ @@ -340,12 +354,13 @@ public class UnitAssembler extends PayloadBlock{ Draw.z(Layer.blockOver); - //payRotation = rotdeg(); - //drawPayload(); + payRotation = rotdeg(); + drawPayload(); Draw.z(Layer.blockOver + 0.1f); - Draw.rect(topRegion, x, y); + //TODO top? + //Draw.rect(topRegion, x, y); Vec2 spawn = getUnitSpawn(); @@ -355,7 +370,6 @@ public class UnitAssembler extends PayloadBlock{ Draw.rect(plan.unit.fullIcon, spawn.x, spawn.y); - //TODO which layer? Draw.z(Layer.buildBeam); //draw unit outline @@ -364,16 +378,16 @@ public class UnitAssembler extends PayloadBlock{ Draw.rect(plan.unit.fullIcon, spawn.x, spawn.y); Draw.alpha(warmup * Draw.getColor().a); - int c = 0; + + //draw build beams for(var unit : units){ - if(!Angles.within(unit.rotation, c * 90f + 45f + 180f, 15f)) continue; + if(!((AssemblerAI)unit.controller()).inPosition()) continue; float px = unit.x + Angles.trnsx(unit.rotation, unit.type.buildBeamOffset), py = unit.y + Angles.trnsy(unit.rotation, unit.type.buildBeamOffset); Drawf.buildBeam(px, py, spawn.x, spawn.y, plan.unit.hitSize/2f); - c ++; } Draw.reset(); @@ -389,37 +403,30 @@ public class UnitAssembler extends PayloadBlock{ Draw.reset(); float outSize = plan.unit.hitSize + 9f; - float hs = size * tilesize/2f, ha = outSize/2f; - - Lines.stroke(2f, Tmp.c3.set(Pal.accent).lerp(Pal.remove, invalidWarmup).a(efficiency())); //draw small square for area - //TODO dash rect for output, fades in/out + Lines.stroke(2f, Tmp.c3.set(Pal.accent).lerp(Pal.remove, invalidWarmup).a(efficiency())); Drawf.dashSquareBasic(spawn.x, spawn.y, outSize); - /* - for(int i : Mathf.signs){ - Tmp.v1.trns(rotation * 90, hs, hs * i).add(x, y); - - Tmp.v2.trns(rotation * 90, -ha, ha * i).add(spawn); - Draw.color(); - - Drawf.dashLine(color, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); - }*/ - - Draw.reset(); - - Draw.z(Layer.overlayUI - 1); - - //TODO dashes bad - - Draw.reset(); } public boolean checkSolid(Vec2 v){ var output = unit(); - return !output.flying && (collisions.overlapsTile(Tmp.r1.setCentered(v.x, v.y, output.hitSize), EntityCollisions::solid) || Units.anyEntities(v.x, v.y, output.hitSize)); + return !output.flying && (collisions.overlapsTile(Tmp.r1.setCentered(v.x, v.y, output.hitSize), EntityCollisions::solid) || Units.anyEntities(v.x, v.y, output.hitSize * 1.4f)); + } + + /** @return true if this block is ready to produce units, e.g. requirements met */ + public boolean ready(){ + return consValid() && !wasOccupied; + } + + public void yeetPayload(BuildPayload payload){ + var spawn = getUnitSpawn(); + blocks.add(payload.block(), 1); + float rot = payload.angleTo(spawn); + Fx.shootPayloadDriver.at(payload.x(), payload.y(), rot); + Fx.payloadDeposit.at(payload.x(), payload.y(), rot, new YeetData(spawn.cpy(), payload.block())); } @Override @@ -427,19 +434,10 @@ public class UnitAssembler extends PayloadBlock{ return blocks; } - @Override - public void handlePayload(Building source, Payload payload){ - //super.handlePayload(source, payload); - - blocks.add(((BuildPayload)payload).block()); - - //payloads.add((BuildPayload)payload); - } - @Override public boolean acceptPayload(Building source, Payload payload){ var plan = plan(); - return payload instanceof BuildPayload bp && plan.requirements.contains(b -> b.block == bp.block() && blocks.get(bp.block()) < b.amount); + return this.payload == null && payload instanceof BuildPayload bp && plan.requirements.contains(b -> b.block == bp.block() && blocks.get(bp.block()) < b.amount); } @Override @@ -453,11 +451,6 @@ public class UnitAssembler extends PayloadBlock{ } blocks.write(write); - - //TODO save: - //- unit IDs - //- progress - //- payloads in position (should they have positions?) } @Override diff --git a/core/src/mindustry/world/blocks/units/UnitAssemblerModule.java b/core/src/mindustry/world/blocks/units/UnitAssemblerModule.java index c1216c068e..201e4514a6 100644 --- a/core/src/mindustry/world/blocks/units/UnitAssemblerModule.java +++ b/core/src/mindustry/world/blocks/units/UnitAssemblerModule.java @@ -81,7 +81,7 @@ public class UnitAssemblerModule extends PayloadBlock{ @Override public boolean acceptPayload(Building source, Payload payload){ - return link != null && payload == null && link.acceptPayload(source, payload); + return link != null && this.payload == null && link.acceptPayload(source, payload); } @Override @@ -108,10 +108,9 @@ public class UnitAssemblerModule extends PayloadBlock{ findLink(); } - if(moveInPayload()){ - if(link != null && link.moduleFits(block, x, y, rotation) && link.acceptPayload(this, payload)){ - link.handlePayload(this, payload); - } + if(moveInPayload() && link != null && link.moduleFits(block, x, y, rotation) && link.acceptPayload(this, payload)){ + link.yeetPayload(payload); + payload = null; } } diff --git a/core/src/mindustry/world/consumers/ConsumePayloadFilter.java b/core/src/mindustry/world/consumers/ConsumePayloadFilter.java index 5138532d97..d40099b345 100644 --- a/core/src/mindustry/world/consumers/ConsumePayloadFilter.java +++ b/core/src/mindustry/world/consumers/ConsumePayloadFilter.java @@ -53,8 +53,11 @@ public class ConsumePayloadFilter extends Consume{ var inv = build.getBlockPayloads(); MultiReqImage image = new MultiReqImage(); - content.blocks().each(i -> filter.get(i) && i.unlockedNow(), block -> image.add(new ReqImage(new ItemImage(block.uiIcon, 1), - () -> inv.contains(block, 1)))); + + content.blocks().each(i -> filter.get(i) && i.unlockedNow(), + block -> image.add(new ReqImage(new ItemImage(block.uiIcon, 1), + () -> inv.contains(block, 1))) + ); table.add(image).size(8 * 4); }