From 6026beb397acdcf1fee7207202d6dacb8dfb401f Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 17 Nov 2021 18:02:19 -0500 Subject: [PATCH] Emanate impl / Rotation lock --- .../assets-raw/sprites/units/emanate-cell.png | Bin 0 -> 1083 bytes core/assets-raw/sprites/units/emanate.png | Bin 0 -> 4216 bytes core/assets/icons/icons.properties | 1 + core/assets/logicids.dat | Bin 3329 -> 3338 bytes core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/content/UnitTypes.java | 76 +++++++++++++++++- core/src/mindustry/type/Weapon.java | 14 ++++ 7 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 core/assets-raw/sprites/units/emanate-cell.png create mode 100644 core/assets-raw/sprites/units/emanate.png diff --git a/core/assets-raw/sprites/units/emanate-cell.png b/core/assets-raw/sprites/units/emanate-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..77e5a9aaf361da3c3b645bdc225b086b6d39587c GIT binary patch literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iuz4M-mPBqj}{7>k44ofy`glX=O&!2H$I#WAE} z&f7bIMT;#&ST8)kdFqRr)o=Z3;geBD_RdG&vMD<(P`7x#ezmajx^)v5ym0}VfENT@ z{{DYm(Vd>Wwd@yeWeetQzpXfPi&b9Obi1D`S6{rhG^6y+nSYtK4Pkcgzn6F?9W#`D zI?45n&BK|;w=F*{y0N|UU1HDH*i{{>!h1^QZ+mub`xA+9?Z>HR$JY!0e*gY{{ogaQ zgs%Ph+tIQ9_~ZWi|G$3hI3g4KNTpvR@$B`TNs^cK&Tf_aA{TjR=YMJAvNzWauSG30 zwzu*B=~vB{b9(dE#oiIWOS9u7vr~6XFJYFNJ;C(gRvn<$^?}EtX1>$BddbH0V)XPW zVyZEptyNE#tTjxDUKT8BxLSAewA@3RcjX9ra|bQBm4K?-(R=A zB^BR){LS2aPtNmyB%W_^?YR+l?D?Y{&BveL`%V4$O0~zM?E0TPr)_thp7s6mI@@0~ z?Pc%bkj8lLttBDDEX0Gd~e%F7GH7@GVthoM-DK)04wxuHWq~PNklJUAg31w5=M-dF}QwsAYeb;$>CwqEN{_2fA z(bG5Hykt`T=)5`G+G!Uy8cw^np~tsuwe|hydmr49-g{MIw*J}RwgXY`9v@R%`lM^_ z$`(O;$#;8i3?jDg7y(~>eJH%~1Hn3Q_D&}^^LKI@M>lfR#fcxV(~s8sa)ZcU~f z_kvQ5rSrO{?`>&bQ)#ZBbY#9`3P)<^`s0gd3-K8}o0}wXGq-lj#MDj3-i59#@2@yz zukTvdmfEuAz$GKCL`z5AkSI6R7`F)RGgAXOrwiZk3Qi3nhg|A8lT<-t_G`P>++21$=6Cn+(yx=!Pia4z zvF81gGgYV7%vN%n!an=2URn30;@3d0%@s9#^qjBY)J$)SAA9aUPkN!({I2VVU%q_6 z-A6gkt7a+9%T4l{^Ky=V;1Ofr6G7>g-%DI$q;jsU&wrQtwtVgOKYs)-i5f1lS+RO* z!G@(hlHL*%w{!@;X4>t<$)0`AG@DadNZc?fvLIaRVZuqvbiG8EPe2#2RvZ=L^Ezi+ z&8cjqk#yv@!ups)2Y2&SX(YO+yY~FBzOeqdGw1w2z?9sZdZjzBOX8z&jz6RP+Uq^L zw31xv8Mj|Zc6-^CvGZ>Hv7XDk84q?Je*I-u^eIQ)n(~Uda>d@(8yes9tykVI`{l#k jhdoa~Ssf2J@bMor$K1{L5>HGP0x9!!^>bP0l+XkKmudYd literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/emanate.png b/core/assets-raw/sprites/units/emanate.png new file mode 100644 index 0000000000000000000000000000000000000000..95fa1a83d8bc8615759c507ee804002e06b8b1be GIT binary patch literal 4216 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 delta 19 acmeB@YLwcrmWxqy^Exhb#?9}zWf%cM@diBr diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index ba04795c5b..a271ef0b55 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1988,7 +1988,7 @@ public class Blocks implements ContentList{ //TODO cost requirements(Category.effect, with(Items.beryllium, 11000, Items.graphite, 11000, Items.tungsten, 9000, Items.carbide, 10000)); - unitType = UnitTypes.evoke; + unitType = UnitTypes.emanate; health = 22000; itemCapacity = 16000; size = 6; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index c5c7a4e14f..b109816d9b 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -3,6 +3,7 @@ package mindustry.content; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; @@ -2417,6 +2418,7 @@ public class UnitTypes implements ContentList{ isCounted = false; envDisabled = 0; + outlineColor = Pal.darkOutline; lowAltitude = false; flying = true; targetAir = false; @@ -2475,6 +2477,7 @@ public class UnitTypes implements ContentList{ isCounted = false; envDisabled = 0; + outlineColor = Pal.darkOutline; lowAltitude = false; flying = true; targetAir = false; @@ -2483,7 +2486,7 @@ public class UnitTypes implements ContentList{ buildSpeed = 1.4f; drag = 0.06f; speed = 2.6f; - rotateSpeed = 6f; + rotateSpeed = 5f; accel = 0.11f; itemCapacity = 70; health = 600f; @@ -2526,6 +2529,77 @@ public class UnitTypes implements ContentList{ }}); }}; + emanate = new UnitType("emanate"){{ + defaultController = BuilderAI::new; + isCounted = false; + envDisabled = 0; + + outlineColor = Pal.darkOutline; + lowAltitude = false; + flying = true; + targetAir = false; + mineSpeed = 8f; + mineTier = 3; + buildSpeed = 1.4f; + drag = 0.06f; + speed = 2.6f; + rotateSpeed = 3f; + accel = 0.11f; + itemCapacity = 140; + health = 1500f; + armor = 3f; + hitSize = 36f; + commandLimit = 9; + buildBeamOffset = 72f / 4f; + engineSize = 0; + payloadCapacity = Mathf.sqr(3f) * tilePayload; + + float es = 3.8f; + + setEnginesMirror( + new UnitEngine(49 / 4f, 51 / 4f, es, 45f), + new UnitEngine(67 / 4f, -30 / 4f, es, 315f), + new UnitEngine(49 / 4f, -62 / 4f, es, 315f) + ); + + Vec2[] positions = {new Vec2(30f, 50f), new Vec2(60f, -15f)}; + int i = 0; + + for(var pos : positions){ + int fi = i; + weapons.add(new Weapon("incite-weapon"){{ + rotate = true; + reload = fi == 0 ? 25f : 35f; + rotateSpeed = 4f; + x = pos.x/4f; + y = pos.y/4f; + shootY = 5.75f; + recoil = 2f; + rotationLimit = 90f; + layerOffset = -0.01f; + + bullet = new BasicBulletType(5f, 17){{ + width = 7f; + height = 12f; + shootEffect = Fx.sparkShoot; + smokeEffect = Fx.shootBigSmoke; + pierceCap = 2; + pierce = true; + pierceBuilding = true; + hitColor = backColor = trailColor = Pal.bulletYellowBack; + frontColor = Color.white; + trailWidth = 1.5f; + trailLength = 7; + hitEffect = despawnEffect = Fx.hitBulletColor; + }}; + }}); + i ++; + } + + + }}; + + //TODO emanate (+ better names) //endregion diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 5d7ca4fcc4..72766cd983 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -85,6 +85,8 @@ public class Weapon implements Cloneable{ public float shotDelay = 0; /** The half-radius of the cone in which shooting will start. */ public float shootCone = 5f; + /** Cone in which the weapon can rotate relative to its mount. */ + public float rotationLimit = 361f; /** ticks to cool down the heat region */ public float cooldownTime = 20f; /** random sound pitch range */ @@ -147,6 +149,10 @@ public class Weapon implements Cloneable{ //TODO copy-pasted code public void drawOutline(Unit unit, WeaponMount mount){ + //apply layer offset, roll it back at the end + float z = Draw.z(); + Draw.z(z + layerOffset); + float rotation = unit.rotation - 90, weaponRotation = rotation + (rotate ? mount.rotation : 0), @@ -160,6 +166,8 @@ public class Weapon implements Cloneable{ outlineRegion.height * Draw.scl, weaponRotation); } + + Draw.z(z); } public void draw(Unit unit, WeaponMount mount){ @@ -215,6 +223,12 @@ public class Weapon implements Cloneable{ mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - unit.rotation; mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, rotateSpeed * Time.delta); + if(rotationLimit < 360){ + float dst = Angles.angleDist(mount.rotation, 0f); + if(dst > rotationLimit/2f){ + mount.rotation = Angles.moveToward(mount.rotation, 0, dst - rotationLimit/2f); + } + } }else if(!rotate){ mount.rotation = 0; mount.targetRotation = unit.angleTo(mount.aimX, mount.aimY);