From 438661e23961d1fbac4d40e8545577e4ae3a6e68 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Dec 2021 16:43:22 -0500 Subject: [PATCH] Regen projector 'done' --- .../blocks/defense/regen-projector-mid.png | Bin 0 -> 791 bytes .../defense/regen-projector-side-glow.png | Bin 7155 -> 0 bytes .../blocks/defense/regen-projector-top1.png | Bin 760 -> 0 bytes .../blocks/defense/regen-projector-top2.png | Bin 756 -> 0 bytes .../blocks/defense/regen-projector.png | Bin 2052 -> 2989 bytes core/src/mindustry/ai/BlockIndexer.java | 23 +++++ core/src/mindustry/content/Blocks.java | 22 +++-- .../src/mindustry/content/ErekirTechTree.java | 8 +- core/src/mindustry/game/SpawnGroup.java | 5 + .../maps/planet/ErekirPlanetGenerator.java | 3 +- core/src/mindustry/type/Liquid.java | 2 +- .../world/blocks/defense/RegenProjector.java | 90 ++++-------------- .../mindustry/world/draw/DrawGlowRegion.java | 5 + .../src/mindustry/world/draw/DrawPartial.java | 11 +++ .../mindustry/world/draw/DrawPulseShape.java | 55 +++++++++++ core/src/mindustry/world/draw/DrawShape.java | 25 +++++ 16 files changed, 165 insertions(+), 84 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-mid.png delete mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-side-glow.png delete mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-top1.png delete mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-top2.png create mode 100644 core/src/mindustry/world/draw/DrawPartial.java create mode 100644 core/src/mindustry/world/draw/DrawPulseShape.java create mode 100644 core/src/mindustry/world/draw/DrawShape.java diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-mid.png b/core/assets-raw/sprites/blocks/defense/regen-projector-mid.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f5c37581b61d9b1c83d29181b145af79ba71da GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z;w~m z#WAE}&f8nr{=$I*$3Fg_7Ns3f5oo$#QbXPU{uC9*DKkDTGS}Jr=Ht;bh112H6fT~d z^n7}b#v4_2TN{y@Zn*{;Z((Kg2?A$46oBWNhufK1&7auP^ zCHuIpnJ=$u4AZr$|BPl2<|XX?$HV>4dd>IpKijHadPXb|zcIzc-*>v^(t_-k0+314 zvy-0Ps_(h_M|sWj?|*9Y>T4ahG1MieX1+MiGJjUk)TIK8)E2aUeWho1)#l6M_NjCE z%EJ%k{=dC0e)9VJ%cC|ty&0&n_PGAUdd)}D6WA~8*=w*+OEq~F<964p|5U@C=ikt= zHLefy-0+FHP%<^0 z?VJlTiMP3Bbv}Hptn)PG-FvXHWVn#Cj_G3&Yv73&kVOpWkZ#XIse)mIHe|PZ%$;6#Mdf+v4>rtLk1naQ?t@z)fhu zt?QDXnD$NJ+-_9Uv2PNOL;NZBkCXoCy1L*5vtIMx+RuMr>D{n}3=9kmp00i_>zopr E00=N@1^@s6 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 deleted file mode 100644 index b8288fe7c461c3d439856af0c68a59089195396f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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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 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-top1.png b/core/assets-raw/sprites/blocks/defense/regen-projector-top1.png deleted file mode 100644 index 3d09b25c2d730f7087128445756cfd9f7dbbcab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-top2.png b/core/assets-raw/sprites/blocks/defense/regen-projector-top2.png deleted file mode 100644 index 6993d3239a56795dceda4a13637449e43b889759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector.png b/core/assets-raw/sprites/blocks/defense/regen-projector.png index 46230dd1687f9b7a7d857d2bb8dfd1d99c48f2c5..3d610ed2aec33e27418c31e927d4760cad1f7205 100644 GIT binary patch delta 2984 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 delta 2039 zcmZ20-XbtTxt@WsILO_JVcj{ImkbQ-`#fD7Ln`LHjkV2JHW#Qh`Xd}gs&a7ST_G<2nldlcL6 ze05#_DQdU(yXrZLmUCkJ1P+#%ZRa=NSnOO;yRGZrzw3t!ziqA8@jBHJJNv+iKZUiW zk~S|J_C$*P{9ha}hn00h)c<*ZYH}K6{VyF{_?w@1yYj);n?pNiici1GAkCnBc=hW( zE3pf+YMR|#zC=Eo=6zjik6y;knAH={Z+kbbWkafF^s?!f*D|=x+-d+CYlhgIKQ%tiWUr&3@e87L7 zBe!5u3qz&Sl64=a-nx(zvqbj z)J?qZ`b%c%jhURwH^kX8z1YU&**fj?*Kcyphwi>*di+@U*Po|FYm+#YxD7VwI^L3M z^Vrw8B~NPF1XYF!=2lWhKiSs03X~o)Q+dYqfxrG)S;upK{zXMGfBt@rd_LoC^^)_` zU-xa&Ss?oJfL^1}k9A+CK6KXh7T~@xsis**FzGsvC(A^J+6nmzf{m8t8cG+Kt|uQlfrI;L_QofaG1@+NQs8xQ04@abAg9w*FGuL(7_YKR><(8CratarcJKmD`X z>H@oi*&in~)vsc`(dwu6I3d+}tzU7Mywi%FeL4>>h=1^6U0?G-Gw)w|xYgGMQNe#M z>`kty|3B>$$Lp($clfjX;SP%9p5UgK+;Vf;fo+?lrX9Gqd75fV7<04U2~oumh09Uu zlQ(8;VSdr2us3`q$HJ}r@{4L6yjZS%NXd=o4f8B4NJH1-}3M?e}L+ zYdeD@tI zFe&YiQrhsMr#kttf7vX1l~1`#tRCC{uW-IPd#>T}N&DaM^z^Z|s3qw9EZ@$(s%h=X z^mivC4wabQ-w>xTCGYXF{q=8lD1@_c{$w*0{G~8|Z~2AeEb))ROJ1E76Zuqa zdAaoL6aAN8FIjE;XLl^Q&_FMY^JGcw-l`>HzmoTFKH{}Tr%dm*L-LA!atAsR<}aT4 zN0eFGX=Se(w~?V>&HkS*6V&PrJy->!6TUp$F5g_sFqvoeshn*Ozj125HrTnMe&@$I zckCRU>?WHDKQ`2Ic$LK5$r1FVMbf696> zqK#t2jl6q~t9@>esMOhb ziHE!XyM;>$hi=?-CMk{s0&6s#UdV*ET${g?b74e7L|)I4+>DM1LMJ*FOif()@vL%w z+MKydW>22Q(XzQScxC6-^uwA9ojrHG)83-<^V_Wsebd6@Om}!P%M=f7Yl+Y**W%v! zY>|)NPY3hY*6lS1{@**0aQX69-GwbR(zjl|Jh?|f`h0z8i{ixhPFFZLFFRgWw4l{G z%Xgni;&ibCJ{D2k0m55POs`>>CUju#+l_~JD0VOK-ItxYhQpIF=991E`N)>2C%fku zD7mn5Ow3=P+r-`LXYpNbr*6EKQ$T~r&xK6R6S@{y@=U##Z8baJ%Sl5>a1WD*efVNs zr{0?e)&9Z9Z+!2oXZXpXtKwuLqsu6LXzsaZvv1feOw&*jy;dgO@xI#K;opZDT&`0V zToH;&acw!parNX@mbU?&zsw&u?CG!c*!MtsR;E|j^EVZukEOQ8<(3Af+B#%$N(xtdUg>E!;bGG+ z0mbL7{WnaV73DQ<9B^zB67-6z{1j`g@~N@uFLT4M`#178&fmbl_5?eZyJKz6&p>I* z-Az+$!ao{(@fK1n_nsys81jtq(vp>mxrwO-<-1o*`ZKlZmW$6U6H^tzH@h;_>J0_n zD~mbn+;|%H>)98MiYkG 0; } + /** Does not work with null teams. */ + public boolean eachBlock(Team team, Rect rect, Boolf pred, Cons cons){ + breturnArray.clear(); + + var buildings = team.data().buildings; + if(buildings == null) return false; + buildings.intersect(rect, b -> { + if(pred.get(b)){ + breturnArray.add(b); + } + }); + + int size = breturnArray.size; + var items = breturnArray.items; + for(int i = 0; i < size; i++){ + cons.get(items[i]); + items[i] = null; + } + breturnArray.size = 0; + + return size > 0; + } + /** Get all enemy blocks with a flag. */ public Seq getEnemy(Team team, BlockFlag type){ breturnArray.clear(); diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 7ec6f65382..aab855be8c 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1527,7 +1527,7 @@ public class Blocks{ }}; buildTower = new BuildTurret("build-tower"){{ - requirements(Category.effect, with(Items.silicon, 60, Items.tungsten, 60, Items.oxide, 40)); + requirements(Category.effect, with(Items.silicon, 80, Items.carbide, 30, Items.oxide, 40, Items.thorium, 30)); outlineColor = Pal.darkOutline; consumes.power(3f); range = 150f; @@ -1538,21 +1538,25 @@ public class Blocks{ //TODO green looks bad switch to orange //TODO orange also looks bad hhhh regenProjector = new RegenProjector("regen-projector"){{ - requirements(Category.effect, with(Items.silicon, 60, Items.tungsten, 60, Items.oxide, 40)); + requirements(Category.effect, with(Items.silicon, 60, Items.tungsten, 60, Items.oxide, 30)); size = 3; consumes.power(1f); - rangeWidth = 6; - rangeLength = 22; + range = 28; 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; + drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.hydrogen, 9f / 4f), new DrawBlock(), new DrawGlowRegion(){{ + color = Color.orange;//Color.valueOf("1eff21"); + }}, new DrawPulseShape(false){{ + //radiusScl = 0.95f; + layer = Layer.effect; + }}, new DrawShape(){{ + layer = Layer.effect; + radius = 3.5f; + useWarmupRadius = true; + timeScl = 2f; }}); }}; diff --git a/core/src/mindustry/content/ErekirTechTree.java b/core/src/mindustry/content/ErekirTechTree.java index 7caac5a5b9..40f7702036 100644 --- a/core/src/mindustry/content/ErekirTechTree.java +++ b/core/src/mindustry/content/ErekirTechTree.java @@ -69,10 +69,12 @@ public class ErekirTechTree{ }); - //TODO more tiers of build tower or "support" structures like overdrive projectors - //TODO method of repairing blocks of damage - node(buildTower, () -> { + node(regenProjector, () -> { + //TODO more tiers of build tower or "support" structures like overdrive projectors + node(buildTower, () -> { + + }); }); }); }); diff --git a/core/src/mindustry/game/SpawnGroup.java b/core/src/mindustry/game/SpawnGroup.java index 1d70384a47..cc5879ca13 100644 --- a/core/src/mindustry/game/SpawnGroup.java +++ b/core/src/mindustry/game/SpawnGroup.java @@ -42,6 +42,8 @@ public class SpawnGroup implements JsonSerializable, Cloneable{ public int unitAmount = 1; /** If not -1, the unit will only spawn in spawnpoints with these packed coordinates. */ public int spawn = -1; + /** Fraction of health that unit is spawned with. */ + public float healthFraction = 1f; /** Seq of payloads that this unit will spawn with. */ public @Nullable Seq payloads; /** Status effect applied to the spawned unit. Null to disable. */ @@ -91,6 +93,7 @@ public class SpawnGroup implements JsonSerializable, Cloneable{ } unit.shield = getShield(wave); + unit.health = unit.maxHealth * healthFraction; //load up spawn payloads if(payloads != null && unit instanceof Payloadc pay){ @@ -118,6 +121,7 @@ public class SpawnGroup implements JsonSerializable, Cloneable{ if(unitAmount != 1) json.writeValue("amount", unitAmount); if(effect != null) json.writeValue("effect", effect.name); if(spawn != -1) json.writeValue("spawn", spawn); + if(healthFraction != 1f) json.writeValue("healthFraction", healthFraction); if(payloads != null && payloads.size > 0){ json.writeValue("payloads", payloads.map(u -> u.name).toArray(String.class)); } @@ -138,6 +142,7 @@ public class SpawnGroup implements JsonSerializable, Cloneable{ shieldScaling = data.getFloat("shieldScaling", 0); unitAmount = data.getInt("amount", 1); spawn = data.getInt("spawn", -1); + healthFraction = data.getFloat("healthFraction", 1f); if(data.has("payloads")){ payloads = Seq.with(json.readValue(String[].class, data.get("payloads"))).map(s -> content.getByName(ContentType.unit, s)); } diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index ec30788a27..261ed2b7b5 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -255,12 +255,13 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ state.rules.waves = true; state.rules.showSpawns = true; state.rules.waveTimer = true; - state.rules.waveSpacing = 60f * 60f * 15f; + state.rules.waveSpacing = 60f * 60f * 7.5f; state.rules.spawns = Seq.with(new SpawnGroup(){{ type = UnitTypes.vanquish; spacing = 1; shieldScaling = 60; unitScaling = 2f; + healthFraction = 0.2f; }}); } } diff --git a/core/src/mindustry/type/Liquid.java b/core/src/mindustry/type/Liquid.java index d6a4e2a380..15e6a81be4 100644 --- a/core/src/mindustry/type/Liquid.java +++ b/core/src/mindustry/type/Liquid.java @@ -22,7 +22,7 @@ public class Liquid extends UnlockableContent{ protected static final Rand rand = new Rand(); - /** TODO If true, this fluid is treated as a gas (and does not create puddles) */ + /** If true, this fluid is treated as a gas (and does not create puddles) */ public boolean gas = false; /** Color used in pipes and on the ground. */ public Color color; diff --git a/core/src/mindustry/world/blocks/defense/RegenProjector.java b/core/src/mindustry/world/blocks/defense/RegenProjector.java index 28064eb393..5292c6d104 100644 --- a/core/src/mindustry/world/blocks/defense/RegenProjector.java +++ b/core/src/mindustry/world/blocks/defense/RegenProjector.java @@ -3,7 +3,6 @@ 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.*; @@ -23,27 +22,19 @@ public class RegenProjector extends Block{ 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; + public int range = 14; //per frame public float healPercent = 12f / 60f; public DrawBlock drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawSideRegion(true)); - public float effectChance = 0.011f; + public float effectChance = 0.013f; 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; @@ -56,28 +47,7 @@ public class RegenProjector extends Block{ 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); - } + Drawf.dashSquare(Pal.accent, x, y, range * tilesize); } @Override @@ -105,25 +75,12 @@ public class RegenProjector extends Block{ public Seq targets = new Seq<>(); public int lastChange = -2; public float warmup, totalTime; + public boolean didRegen = false; 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); - } - } - } + indexer.eachBlock(team, Tmp.r1.setCentered(x, y, range * tilesize), b -> true, targets::add); } @Override @@ -133,14 +90,18 @@ public class RegenProjector extends Block{ updateTargets(); } - warmup = Mathf.approachDelta(warmup, consValid() ? 1f : 0f, 1f / 70f); + //TODO should warmup depend on didRegen? + warmup = Mathf.approachDelta(warmup, consValid() && didRegen ? 1f : 0f, 1f / 70f); totalTime += warmup * Time.delta; + didRegen = false; if(consValid()){ //use Math.max to prevent stacking for(Building build : targets){ if(!build.damaged()) continue; + didRegen = true; + int pos = build.pos(); //TODO periodic effect float value = mendMap.get(pos); @@ -165,10 +126,19 @@ public class RegenProjector extends Block{ } } + @Override + public boolean productionValid(){ + return didRegen; + } + @Override public void drawSelect(){ super.drawSelect(); - drawBounds(x, y, rotation); + + Drawf.dashSquare(Pal.accent, x, y, range * tilesize); + for(var target : targets){ + Drawf.selected(target, Pal.accent); + } } @Override @@ -184,26 +154,6 @@ public class RegenProjector extends Block{ @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 diff --git a/core/src/mindustry/world/draw/DrawGlowRegion.java b/core/src/mindustry/world/draw/DrawGlowRegion.java index 3bcf71cf02..445183b4d1 100644 --- a/core/src/mindustry/world/draw/DrawGlowRegion.java +++ b/core/src/mindustry/world/draw/DrawGlowRegion.java @@ -32,6 +32,11 @@ public class DrawGlowRegion extends DrawBlock{ this.rotate = rotate; } + + public DrawGlowRegion(String suffix){ + this.suffix = suffix; + } + @Override public void drawBase(Building build){ if(build.warmup() <= 0.001f) return; diff --git a/core/src/mindustry/world/draw/DrawPartial.java b/core/src/mindustry/world/draw/DrawPartial.java new file mode 100644 index 0000000000..96ef7fccc7 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawPartial.java @@ -0,0 +1,11 @@ +package mindustry.world.draw; + +import arc.util.*; +import mindustry.entities.units.*; +import mindustry.world.*; + +public abstract class DrawPartial extends DrawBlock{ + + @Override + public void drawPlan(Block block, BuildPlan plan, Eachable list){} +} diff --git a/core/src/mindustry/world/draw/DrawPulseShape.java b/core/src/mindustry/world/draw/DrawPulseShape.java new file mode 100644 index 0000000000..2535e7ef31 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawPulseShape.java @@ -0,0 +1,55 @@ +package mindustry.world.draw; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.graphics.*; + +import static mindustry.Vars.*; + +public class DrawPulseShape extends DrawPartial{ + public Color color = Pal.accent.cpy(); + public float stroke = 2f, timeScl = 100f, minStroke = 0.2f; + public float radiusScl = 1f; + public float layer = -1f; + public boolean square = true; + + public DrawPulseShape(boolean square){ + this.square = square; + } + + public DrawPulseShape(){ + } + + @Override + public void drawBase(Building build){ + float pz = Draw.z(); + if(layer > 0) Draw.z(layer); + + float f = 1f - (Time.time / timeScl) % 1f; + float rad = build.block.size * tilesize / 2f * radiusScl; + + Draw.color(color); + Lines.stroke((stroke * f + minStroke) * build.warmup()); + + if(square){ + Lines.square(build.x, build.y, Math.min(1f + (1f - f) * rad, rad)); + }else{ + float r = Math.max(0f, Mathf.clamp(2f - f * 2f) * rad - f - 0.2f), w = Mathf.clamp(0.5f - f) * rad * 2f; + Lines.beginLine(); + for(int i = 0; i < 4; i++){ + Lines.linePoint(build.x + Geometry.d4(i).x * r + Geometry.d4(i).y * w, build.y + Geometry.d4(i).y * r - Geometry.d4(i).x * w); + if(f < 0.5f) Lines.linePoint(build.x + Geometry.d4(i).x * r - Geometry.d4(i).y * w, build.y + Geometry.d4(i).y * r + Geometry.d4(i).x * w); + } + Lines.endLine(true); + } + + + + Draw.reset(); + Draw.z(pz); + } +} diff --git a/core/src/mindustry/world/draw/DrawShape.java b/core/src/mindustry/world/draw/DrawShape.java new file mode 100644 index 0000000000..f7a5299116 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawShape.java @@ -0,0 +1,25 @@ +package mindustry.world.draw; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.gen.*; +import mindustry.graphics.*; + +public class DrawShape extends DrawPartial{ + public Color color = Pal.accent.cpy(); + public int sides = 4; + public float radius = 2f, timeScl = 1f, layer = -1f, x, y; + public boolean useWarmupRadius = false; + + @Override + public void drawBase(Building build){ + float pz = Draw.z(); + if(layer > 0) Draw.z(layer); + + Draw.color(color); + Fill.poly(build.x + x, build.y + y, sides, useWarmupRadius ? radius * build.warmup() : radius, build.totalProgress() * timeScl); + + Draw.reset(); + Draw.z(pz); + } +}