From 512fbe019921a7679204f15bd845324f807c7b7b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 Apr 2022 21:11:17 -0400 Subject: [PATCH] T1 walker thing done --- core/assets-raw/sprites/units/merui-cell.png | Bin 0 -> 254 bytes .../sprites/units/merui-leg-base.png | Bin 294 -> 295 bytes core/assets-raw/sprites/units/merui-leg.png | Bin 269 -> 289 bytes .../sprites/units/merui-weapon-heat.png | Bin 0 -> 499 bytes .../assets-raw/sprites/units/merui-weapon.png | Bin 0 -> 81 bytes core/src/mindustry/content/Fx.java | 25 ++++++++ core/src/mindustry/content/UnitTypes.java | 60 ++++++++++++++++-- core/src/mindustry/game/FogControl.java | 6 +- core/src/mindustry/game/Team.java | 7 +- 9 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 core/assets-raw/sprites/units/merui-cell.png create mode 100644 core/assets-raw/sprites/units/merui-weapon-heat.png create mode 100644 core/assets-raw/sprites/units/merui-weapon.png diff --git a/core/assets-raw/sprites/units/merui-cell.png b/core/assets-raw/sprites/units/merui-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..9548b30a9afa9ef51305358c5cb5dfd9182f79b3 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0y~yV6b3dU@+rgV_;yI)DxA*z`(#*9OUlAu|i`n&btOyi|2HkW$6 zO9O6|KUh;RDe**(@7Xtrldm1jpD6divafyJ+@qHc`a8-zRC%m^i@m6I@{-+aC+#^n zYreeEwAzAP?~{N2n{G?3mb)Z)E>CM|+S@q{3=jDCGCYv?`5wEx{|LxQp00i_>zopr E0Ey9PT>t<8 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/merui-leg-base.png b/core/assets-raw/sprites/units/merui-leg-base.png index 8592979a68c79b41b850adee68b1584afa39587f..efcda8729118bd5d68301834a4c4f6e776fc160c 100644 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0y~yV322EU=ZhEV_;zT{C7$S0|NtNage(c!@6@aFBupZ z9(uYshIn+ooodU~>>$uOU(r2M`e3(8YE6yZ>LLGtmNNha?vi#kwL)K=T`SjfzqA#)=aEZ$p zmLIk}=(~4rxo(8SVx3P%4?o?%Y*xmB?>6>Zy4eCFJ7i8Cj(o_#z`)??>gTe~DWM4f DN&kE` literal 294 zcmeAS@N?(olHy`uVBq!ia0y~yV31>AU=ZhEV_;yAvHzdNz`(#*9OUlAujjYrqE?$EMz>Qh+fb^UIa#tYY$n=^JF30>f; z=9aukvvzgjjEBkhp0G=pmZYXF%8OzMU?|ufH>bD%_sv&-U4_+_mu!g2pVOPF8WP#L z;=w$N3cJ~_4J6J*uHE6JtCacl$?KEX>Z01qlY~P=c7|RqT(JCT(QBDQOu{GE2&*@5 z4!h#Zt(0jx<3N4R_o%sEIzKktS7qP5Cd}dfsTpRQ6FyrBo_rDTpj&o%1Ji*k>}+q$ zcUPDCxeI8S3G>p+n=A^CbFs9gn@y9!PC{xWt~$(695YI Bd@=w4 diff --git a/core/assets-raw/sprites/units/merui-leg.png b/core/assets-raw/sprites/units/merui-leg.png index 020566c4936cc313b78b4a5fb56a3bd608dcc024..aad88b1de67a51b50420bc6f978edf682644e9f8 100644 GIT binary patch delta 248 zcmeBWTF5lPu>Q8Ei(`mK=i8}{T!#zT=l?6Y#jtvsTIs%+`5%{UeU|%o$Nfpov9~oeUCuKyB-C4|Ro}j= zsp-eEkb&XBoc5Kkk}h0XC!;V$zRFDUy3=1y28NdzBF}xi89o*oFI%;If=1;>nFeh) zCNBj`_N5A!POkqd?{Q;N#jX{Z%%75doh$-085m5;EuNp?|0^Q&GG^)(ld~$%_E%_j zFs?A%wN0@&=TK|$yfyctod3Nm?u_JM|Mkr-a;wc=hQjt#tw?pQ4-5QEGi(`mK=i4a|U~* zMc8|l6qoH4`I3$aU%&LqEO@2=RPXxjIqFUyavpvz)GuJq{ohtAwgDm(wvE`8`ggG-QDJTMAfpvq=z*&#KDBU+HuX~{MY6a z{&;P>eKc2k!Fp5fi4N6_3=WqP&j!vqW~!r<>yE6>h l*N)}sDHeyVeGl9!vP$a>E5 z_@(ypk$#Ez!kHdcr|!HAoi=faa{_-x!}bG>OE&YCq#tn1kV??s6Xe0E@$#-$Cd(ei zW6~#%8(LQ#`W(4r?gJ^eE5emsZBq+orm((gR5f6K*YJDA{(BDAXYRC@$;H(kONwNi zen9sElktMZdUrf#*{F5J32%Vys;mi;7rcH6e4TdR{0;91)*l|cmaMyiyiQrqD66&=D)QqsTHLmy>lgnkYqKxs zZaP_b?3;JJWzW)i4|qR_?&$mVeTD5CUr#>v0Hd>PDsKbo_q5lmb7$SqbG!C!)8T{D xm=3L { + color(Color.white, e.color, e.fin()); + + e.scaled(7f, s -> { + stroke(0.5f + s.fout()); + Lines.circle(e.x, e.y, s.fin() * 5f); + }); + + stroke(0.5f + e.fout()); + + randLenVectors(e.id, 5, e.fin() * 17f, (x, y) -> { + float ang = Mathf.angle(x, y); + Fill.square(e.x + x, e.y + y, e.fout() * 3.2f, ang); + }); + + Drawf.light(e.x, e.y, 20f, e.color, 0.6f * e.fout()); + }), + hitFuse = new Effect(14, e -> { color(Color.white, Pal.surge, e.fin()); @@ -1412,6 +1430,13 @@ public class Fx{ Drawf.tri(e.x, e.y, w, 3f * e.fout(), e.rotation + 180f); }), + shootSmallColor = new Effect(8, e -> { + color(e.color, Color.gray, e.fin()); + float w = 1f + 5 * e.fout(); + Drawf.tri(e.x, e.y, w, 15f * e.fout(), e.rotation); + Drawf.tri(e.x, e.y, w, 3f * e.fout(), e.rotation + 180f); + }), + shootHeal = new Effect(8, e -> { color(Pal.heal); float w = 1f + 5 * e.fout(); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 31f50ffb43..e9dd6d8c18 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2831,12 +2831,13 @@ public class UnitTypes{ //region erekir - mech merui = new ErekirUnitType("merui"){{ - speed = 0.75f; - drag = 0.1f; + speed = 0.7f; + drag = 0.11f; hitSize = 9f; - rotateSpeed = 3.5f; - health = 700; - armor = 5f; + rotateSpeed = 3f; + health = 680; + armor = 4f; + legStraightness = 0.3f; legCount = 6; legLength = 8f; @@ -2856,6 +2857,55 @@ public class UnitTypes{ visualElevation = 0.1f; groundLayer = Layer.legUnit - 1f; + targetAir = false; + + weapons.add(new Weapon("merui-weapon"){{ + mirror = false; + x = 0f; + y = 1f; + shootY = 4f; + reload = 60f; + cooldownTime = 42f; + heatColor = Pal.turretHeat; + + bullet = new ArtilleryBulletType(3f, 40){{ + shootEffect = new MultiEffect(Fx.shootSmallColor, new Effect(9, e -> { + color(Color.white, e.color, e.fin()); + stroke(0.7f + e.fout()); + Lines.square(e.x, e.y, e.fin() * 5f, e.rotation + 45f); + + Drawf.light(e.x, e.y, 23f, e.color, e.fout() * 0.7f); + })); + + collidesTiles = true; + recoil = 0.5f; + backColor = hitColor = Pal.techBlue; + frontColor = Color.white; + + knockback = 0.8f; + lifetime = 50f; + width = height = 9f; + splashDamageRadius = 19f; + splashDamage = 30f; + + trailLength = 27; + trailWidth = 2.5f; + trailEffect = Fx.none; + trailColor = backColor; + + trailInterp = Interp.slope; + + shrinkX = 0.6f; + shrinkY = 0.2f; + + hitEffect = despawnEffect = new MultiEffect(Fx.hitSquaresColor, new WaveEffect(){{ + colorFrom = colorTo = Pal.techBlue; + sizeTo = splashDamageRadius + 2f; + lifetime = 9f; + strokeFrom = 2f; + }}); + }}; + }}); }}; diff --git a/core/src/mindustry/game/FogControl.java b/core/src/mindustry/game/FogControl.java index 0e446ea5af..2f13cf4d80 100644 --- a/core/src/mindustry/game/FogControl.java +++ b/core/src/mindustry/game/FogControl.java @@ -61,7 +61,7 @@ public final class FogControl implements CustomChunk{ }); Events.on(TileChangeEvent.class, event -> { - if(state.rules.fog && event.tile.build != null && event.tile.isCenter() && !event.tile.build.team.isAI() && event.tile.block().flags.contains(BlockFlag.hasFogRadius)){ + if(state.rules.fog && event.tile.build != null && event.tile.isCenter() && !event.tile.build.team.isOnlyAI() && event.tile.block().flags.contains(BlockFlag.hasFogRadius)){ var data = data(event.tile.team()); if(data != null){ data.dynamicUpdated = true; @@ -78,7 +78,7 @@ public final class FogControl implements CustomChunk{ //on tile removed, dynamic fog goes away Events.on(TilePreChangeEvent.class, e -> { - if(state.rules.fog && e.tile.build != null && !e.tile.build.team.isAI() && e.tile.block().flags.contains(BlockFlag.hasFogRadius)){ + if(state.rules.fog && e.tile.build != null && !e.tile.build.team.isOnlyAI() && e.tile.block().flags.contains(BlockFlag.hasFogRadius)){ var data = data(e.tile.team()); if(data != null){ data.dynamicUpdated = true; @@ -210,7 +210,7 @@ public final class FogControl implements CustomChunk{ for(var team : state.teams.present){ //AI teams do not have fog - if(!team.team.isAI()){ + if(!team.team.isOnlyAI()){ //separate for each team unitEventQueue.clear(); diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index 6b4b305fa4..6844bc7661 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -103,11 +103,16 @@ public class Team implements Comparable{ return state.teams.isActive(this); } - /** @return whether this team is solely comprised of AI, with no players. */ + /** @return whether this team is supposed to be AI-controlled. */ public boolean isAI(){ return (state.rules.waves || state.rules.attackMode) && this == state.rules.waveTeam; } + /** @return whether this team is solely comprised of AI (with no players possible). */ + public boolean isOnlyAI(){ + return isAI() && data().players.size == 0; + } + /** @return whether this team needs a flow field for "dumb" wave pathfinding. */ public boolean needsFlowField(){ return isAI() && !rules().rtsAi;