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 zcmVPx)u}MThRA_8-3mDhU_s~Pxf7!21n0pd5lScx39dEvIf~*1ZU@Iep@K~U41lS|uK2x5NmgQT6n>YxyMGI03)d%Ted~3CEul4 z@=RH6oq!{Vxb|E;V7`;);d1z;%^yf{_dtv_4Q*}ANSU-hi;gJbGGAMk=Jk+DC_Zj| zxBmn9ZpT~u{NDaXkgXH#Ld4}cuXQC8oR7~XF)L0D<{G%N@r~I1-x8C~<0cht9&~WZ zTwcU|v)U%&I%h88WN^6z=(xznoamk3M6X=}7dE~c@J|DLl!&fMMj7+KE?NoYl+|YS z6YC;g+T)Zdlfo*nzXo5CNDijJFXD2%HmD2WoajY)a7tRDjxlmZ;yyJT|Cf%FXIf5f_|HnNuD)cyn0Y9l89@LT*R*oPJogE zzbvca)&QHP2_XbcuAb|s0V$!ZwIrFfdD3UtJ`r!LQhH;q6VOb*^dDBY^8D@QzD-#V znTz;>;UX?67z9@YEO@bD9jaz)&kOlZM7+j|GT|U+4A??1oLe%m6A`byh@v%3vkW0% z6AZOL+8*@H>Zl@KW1T|pAcvUO(U;zGc#ZW|G6NyC9F-|2_FlK9OUYzo5wEeT zQmqow$C_k7_uh4DS}`|@h}T$kEjj>F5_8Aut!bZB&KW_(Yiv-l-2<6t%3IbSF8D_D z+!Z5;c#RG2CORPf@|+TZN{@$J+i`0Vud$8Vr2=Fge|L00;N!RYHWu+3+xY&VgY-Mj zdHl6KqBUhCo$Ir$?(k;CKpulTeaNo*8pk-v-*`;2)<%1r@~Izmt+mmg7k#Qnm7nd| dp6%bT{{d|$fM?EvN_YSO002ovPDHLkV1g&8;ava# 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 zcmV-+0g3*JP)FV00001b5ch_0Itp) z=>Px$FiAu~RA_?vaq&|Kaa);LTjZ`sl=)u zd+*2I6}dJ=5=Os`Z_k&jhg5*GtL}kF1Gw8VR)`b;biZ35!U5P}Wg#A1JMp4{qZ;{^ z<(7&56Uz+oNC<=+;M3@+cm#wL05K^wgbaW&DJ6siz+zG=2sePoq!bV?A7C07t@S?0 zwU%sTUWln%=&lj#!(Pe|4+|3zvfF5eNwF_HFhHhBU0tZZc%;ZIlY(OJ7R)p$DDLXV z*(QbP)CX2DDMT_Oi!doDj%~`)NYsf$Yl0yjCKZ_!R0~-&%cP(>=)xH$1=U~{XPXq1 zpAA?I!jyO=2$K(FnG_;dBaw%;sKVdKmK)-cqD%@=*umCHa{^2G@vc-Vl}agk1KB(2 UYg*wGWdHyG07*qoM6N<$g0P;GrT_o{ literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/weapons/conquer-weapon.png b/core/assets-raw/sprites/units/weapons/conquer-weapon.png index 32aad4fecdeb0f68aedf4772eb4077340c750acf..79cc1bdcecf2075cb84f8281d5899a534741a6a0 100644 GIT binary patch delta 4152 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 auKW)|IuJ*CEq1X00000 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){