From 1388d0a4ca8466abe8dfe3ddb7fa53ff4e535d67 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 2 Feb 2022 23:36:21 -0500 Subject: [PATCH] WIP unit stuff --- .../weapons/conquer-weapon-sinks-heat.png | Bin 0 -> 1527 bytes .../units/weapons/conquer-weapon-sinks.png | Bin 0 -> 374 bytes .../sprites/units/weapons/conquer-weapon.png | Bin 4291 -> 4284 bytes core/src/mindustry/content/Blocks.java | 4 + core/src/mindustry/content/UnitTypes.java | 20 ++++- .../mindustry/entities/part/RegionPart.java | 26 +++--- .../mindustry/entities/units/WeaponMount.java | 2 + core/src/mindustry/io/TypeIO.java | 79 +++++++++++++----- core/src/mindustry/type/Weapon.java | 5 +- 9 files changed, 98 insertions(+), 38 deletions(-) create mode 100644 core/assets-raw/sprites/units/weapons/conquer-weapon-sinks-heat.png create mode 100644 core/assets-raw/sprites/units/weapons/conquer-weapon-sinks.png diff --git a/core/assets-raw/sprites/units/weapons/conquer-weapon-sinks-heat.png b/core/assets-raw/sprites/units/weapons/conquer-weapon-sinks-heat.png new file mode 100644 index 0000000000000000000000000000000000000000..55a717060db5c121fff7557ee8cfa0cc828bcaca GIT binary patch literal 1527 zcmeAS@N?(olHy`uVBq!ia0y~yV6b3dV6fs~V_;x->NiW2fq{XsILO_JVcj{ImkbQ7 z8$DedLoyoQ&dLtHZ6(kqAMEv_H7Lrf`rrTg%}xt-bsL{8`t107QLobNqDL2A@>nk} z)JynzGVA-@sl4aEA@`g24wHT7 zywEdwEIWf8#Ea$LNmwx2-T2t?BDCY)F4nv^^-~(8%Fj7Yux2*dA-?8tEsI~HadmCZ zedm~Y_8s0gn4djg*LH_9fz4d;*e&Zt*XD2CiVtrHg+W#?>4 z<$Px^wBY-L=D&N5veT!nZe-tX8D4|v zY4?iNUHog6nC9Jl&F@l>da+GK(ysd2nY&z;TnUcPpX?M~^ql4SK@~wS4PMT5rr)gA zE#%l~3YPi4rpmA2xXK3R-}b6gdLLX`y2d$=^@h?TFO8kgrx@PfG*8vEO4$4M(i<~c z1;V(#^fFqz#N6B@lJD+vo|A7)_J-?CYZyNzXe+mTh**%%azpu%UGTh#)1F2*&$i&$ z>dGC&eU<%XVomneg7shj795Zhv{!yLr)}C(=}Vi=?A>0l{QK!`EH4jU2|Js!;`0n< zZ{4eo4Wdf_W~w|%UlL^;Kh21L#f|LdF9}S$*q1GN_jullrNzH*R~=wf`qz5ZDtKz= z_gQRfssf%VUUl}9xzo&eS13Dttw5+l^*ocbFAAe5oBZry(T}BP=38oytkU%!r4;OBd9mZf zu{kg1-gj9a%Oq~LPwIm|bIp{FbzW|gpAYCoaXy`LHSMeLYo)kbkEdu(KBTo_KU@4n z558pw^dA-NFAK2&(WlIZ!|-SMg?CUs=@#T;4BRkdg=@B|%-mXeDgB0>VE*c$s^oRT7ku`Akq_Jc>Cf9| z`+Ot$XLkQ+dZ?tQDZvuXqEoRkQFc{Y_Id7~elB~Cbs0TWNawlXq(3LxXoIle`n?^C zOno==C?*K=Y<0LL_vP%X6-sf*bDiERw9mMHar(D==BpQXR`h-iGh$ZUDl=76{af7j zW!@)Kk_FdqTotrd=+g07DGuN7m1aj7ns;?vk0{l(Vh9o{KK^QL=KPRzl8#5Ra{@Nr zWuBRSD*Bqd-Ve7gcSMytDtdX}saYxf{WM3Y(W}2b=5}GW;QEcdx0W)c$kmsZ*gtr@ z{g;{8N2%LC{w-+!Vtuai&sN(-rl~4(UvFOf?nBy92f1eJ+7s)3NgcO1dB4JE(>1s1 yIiFU_m#p1-alUx%D)*`L-`F1ifDi|0T7(8A5T-G@yGywo7sNr1z literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/weapons/conquer-weapon-sinks.png b/core/assets-raw/sprites/units/weapons/conquer-weapon-sinks.png new file mode 100644 index 0000000000000000000000000000000000000000..a41a37c05a93edc8c2ff985b4eeeefe4802cd12a GIT binary patch literal 374 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 E02db+-T(jq delta 4176 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 0){ - Draw.z(layer); - } - float prevZ = layer > 0 ? layer : z; + if(layer > 0) Draw.z(layer); + if(under) Draw.z(z - 0.0001f); + + float prevZ = Draw.z(); float progress = useReload ? 1f - params.reload : params.warmup; if(oscMag > 0) progress += oscAbs ? Mathf.absin(oscScl, oscMag) : Mathf.sin(oscScl, oscMag); @@ -75,12 +75,16 @@ public class RegionPart extends WeaponPart{ if(outline && drawRegion){ Draw.z(prevZ + outlineLayerOffset); - Draw.rect(outlines[i], rx, ry, rot); + Draw.rect(outlines[Math.min(i, regions.length - 1)], rx, ry, rot); Draw.z(prevZ); } if(drawRegion && region.found()){ - if(color != null) Draw.color(color); + if(color != null && colorTo != null){ + Draw.color(color, colorTo, progress); + }else if(color != null){ + Draw.color(color); + } Draw.blend(blending); Draw.rect(region, rx, ry, rot); Draw.blend(); @@ -88,7 +92,7 @@ public class RegionPart extends WeaponPart{ } if(heat.found()){ - Drawf.additive(heat, heatColor.write(Tmp.c1).a((useProgressHeat ? params.warmup : params.heat) * heatColor.a), rx, ry, rot, Layer.turretHeat); + Drawf.additive(heat, heatColor.write(Tmp.c1).a((useProgressHeat ? params.warmup : params.heat) * heatColor.a), rx, ry, rot, turretShading ? Layer.turretHeat : z + 1f); } Draw.xscl = 1f; @@ -99,8 +103,6 @@ public class RegionPart extends WeaponPart{ @Override public void load(String name){ - if(under) layer = Layer.turret - 0.0001f; - if(drawRegion){ //TODO l/r if(mirror && turretShading){ diff --git a/core/src/mindustry/entities/units/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index bd8b5d73e4..a0e5219bcf 100644 --- a/core/src/mindustry/entities/units/WeaponMount.java +++ b/core/src/mindustry/entities/units/WeaponMount.java @@ -18,6 +18,8 @@ public class WeaponMount{ public float targetRotation; /** current heat, 0 to 1*/ public float heat; + /** lerps to 1 when shooting, 0 when not */ + public float warmup; /** aiming position in world coordinates */ public float aimX, aimY; /** whether to shoot right now */ diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index d886dce04c..5d85325d1d 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -107,6 +107,17 @@ public class TypeIO{ }else if(object instanceof UnitBox u){ write.b(17); write.i(u.id); + }else if(object instanceof Vec2[] vecs){ + write.b(18); + write.s(vecs.length); + for(Vec2 v : vecs){ + write.f(v.x); + write.f(v.y); + } + }else if(object instanceof Vec2 v){ + write.b((byte)19); + write.f(v.x); + write.f(v.y); }else{ throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } @@ -121,27 +132,53 @@ public class TypeIO{ @Nullable public static Object readObjectBoxed(Reads read, boolean box){ byte type = read.b(); - switch(type){ - case 0: return null; - case 1: return read.i(); - case 2: return read.l(); - case 3: return read.f(); - case 4: return readString(read); - case 5: return content.getByID(ContentType.all[read.b()], read.s()); - case 6: short length = read.s(); IntSeq arr = new IntSeq(); for(int i = 0; i < length; i ++) arr.add(read.i()); return arr; - case 7: return new Point2(read.i(), read.i()); - case 8: byte len = read.b(); Point2[] out = new Point2[len]; for(int i = 0; i < len; i ++) out[i] = Point2.unpack(read.i()); return out; - case 9: return content.getByID(ContentType.all[read.b()], read.s()).techNode; - case 10: return read.bool(); - case 11: return read.d(); - case 12: return !box ? world.build(read.i()) : new BuildingBox(read.i()); - case 13: return LAccess.all[read.s()]; - case 14: int blen = read.i(); byte[] bytes = new byte[blen]; read.b(bytes); return bytes; - case 15: return UnitCommand.all[read.b()]; - case 16: int boollen = read.i(); boolean[] bools = new boolean[boollen]; for(int i = 0; i < boollen; i ++) bools[i] = read.bool(); return bools; - case 17: return !box ? Groups.unit.getByID(read.i()) : new UnitBox(read.i()); - default: throw new IllegalArgumentException("Unknown object type: " + type); - } + return switch(type){ + case 0 -> null; + case 1 -> read.i(); + case 2 -> read.l(); + case 3 -> read.f(); + case 4 -> readString(read); + case 5 -> content.getByID(ContentType.all[read.b()], read.s()); + case 6 -> { + short length = read.s(); + IntSeq arr = new IntSeq(); for(int i = 0; i < length; i ++) arr.add(read.i()); + yield arr; + } + case 7 -> new Point2(read.i(), read.i()); + case 8 -> { + byte len = read.b(); + Point2[] out = new Point2[len]; + for(int i = 0; i < len; i ++) out[i] = Point2.unpack(read.i()); + yield out; + } + case 9 -> content.getByID(ContentType.all[read.b()], read.s()).techNode; + case 10 -> read.bool(); + case 11 -> read.d(); + case 12 -> !box ? world.build(read.i()) : new BuildingBox(read.i()); + case 13 -> LAccess.all[read.s()]; + case 14 -> { + int blen = read.i(); + byte[] bytes = new byte[blen]; + read.b(bytes); + yield bytes; + } + case 15 -> UnitCommand.all[read.b()]; + case 16 -> { + int boollen = read.i(); + boolean[] bools = new boolean[boollen]; + for(int i = 0; i < boollen; i ++) bools[i] = read.bool(); + yield bools; + } + case 17 -> !box ? Groups.unit.getByID(read.i()) : new UnitBox(read.i()); + case 18 -> { + int len = read.s(); + Vec2[] out = new Vec2[len]; + for(int i = 0; i < len; i ++) out[i] = new Vec2(read.f(), read.f()); + yield out; + } + case 19 -> new Vec2(read.f(), read.f()); + default -> throw new IllegalArgumentException("Unknown object type: " + type); + }; } public static void writePayload(Writes writes, Payload payload){ diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index c5cd032830..c0e74370fb 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -92,6 +92,8 @@ public class Weapon implements Cloneable{ public float rotationLimit = 361f; /** ticks to cool down the heat region */ public float cooldownTime = 20f; + /** lerp speed for shoot warmup, only used for parts */ + public float shootWarmupSpeed = 0.1f; /** random sound pitch range */ public float soundPitchMin = 0.8f, soundPitchMax = 1f; /** whether shooter rotation is ignored when shooting. */ @@ -216,7 +218,7 @@ public class Weapon implements Cloneable{ Draw.z(Layer.turret); }*/ - var params = WeaponPart.params.set(0f, Mathf.clamp(mount.reload / reload), mount.heat, wx, wy, weaponRotation + 90); + var params = WeaponPart.params.set(mount.warmup, 1f - Mathf.clamp(mount.reload / reload), mount.heat, wx, wy, weaponRotation + 90); for(var part : parts){ part.draw(params); @@ -237,6 +239,7 @@ public class Weapon implements Cloneable{ float lastReload = mount.reload; mount.reload = Math.max(mount.reload - Time.delta * unit.reloadMultiplier, 0); mount.recoil = Mathf.approachDelta(mount.recoil, 0, (Math.abs(recoil) * unit.reloadMultiplier) / recoilTime); + mount.warmup = Mathf.lerpDelta(mount.warmup, can && mount.shoot ? 1f : 0f, shootWarmupSpeed); //rotate if applicable if(rotate && (mount.rotate || mount.shoot) && can){