From 968651d9edef17fdcea4447a9fcaceca3006fd88 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Wed, 8 Jun 2022 06:13:11 -0700 Subject: [PATCH] Charge Progress (#6947) --- core/src/mindustry/entities/part/DrawPart.java | 7 +++++-- core/src/mindustry/entities/part/RegionPart.java | 4 ++-- core/src/mindustry/entities/units/WeaponMount.java | 4 ++++ core/src/mindustry/type/UnitType.java | 4 ++-- core/src/mindustry/type/Weapon.java | 11 ++++++----- .../world/blocks/defense/turrets/Turret.java | 7 ++++--- core/src/mindustry/world/draw/DrawTurret.java | 2 +- 7 files changed, 24 insertions(+), 15 deletions(-) diff --git a/core/src/mindustry/entities/part/DrawPart.java b/core/src/mindustry/entities/part/DrawPart.java index 3576a8ff2f..f974be0bf4 100644 --- a/core/src/mindustry/entities/part/DrawPart.java +++ b/core/src/mindustry/entities/part/DrawPart.java @@ -22,16 +22,17 @@ public abstract class DrawPart{ /** Parameters for drawing a part in draw(). */ public static class PartParams{ //TODO document - public float warmup, reload, smoothReload, heat, recoil, life; + public float warmup, reload, smoothReload, heat, recoil, life, charge; public float x, y, rotation; public int sideOverride = -1, sideMultiplier = 1; - public PartParams set(float warmup, float reload, float smoothReload, float heat, float recoil, float x, float y, float rotation){ + public PartParams set(float warmup, float reload, float smoothReload, float heat, float recoil, float charge, float x, float y, float rotation){ this.warmup = warmup; this.reload = reload; this.heat = heat; this.recoil = recoil; this.smoothReload = smoothReload; + this.charge = charge; this.x = x; this.y = y; this.rotation = rotation; @@ -65,6 +66,8 @@ public abstract class DrawPart{ smoothReload = p -> p.smoothReload, /** Weapon warmup, 0 when not firing, 1 when actively shooting. Not equivalent to heat. */ warmup = p -> p.warmup, + /** Weapon charge, 0 when beginning to charge, 1 when finished */ + charge = p -> p.charge, /** Weapon recoil with no curve applied. */ recoil = p -> p.recoil, /** Weapon heat, 1 when just fired, 0, when it has cooled down (duration depends on weapon) */ diff --git a/core/src/mindustry/entities/part/RegionPart.java b/core/src/mindustry/entities/part/RegionPart.java index 8aa9b31f3c..2bfe2c3148 100644 --- a/core/src/mindustry/entities/part/RegionPart.java +++ b/core/src/mindustry/entities/part/RegionPart.java @@ -127,7 +127,7 @@ public class RegionPart extends DrawPart{ float sign = (i == 1 ? -1 : 1) * params.sideMultiplier; Tmp.v1.set((x + mx) * sign, y + my).rotate(params.rotation - 90); - childParam.set(params.warmup, params.reload, params.smoothReload, params.heat, params.recoil, params.x + Tmp.v1.x, params.y + Tmp.v1.y, i * sign + mr * sign + params.rotation); + childParam.set(params.warmup, params.reload, params.smoothReload, params.heat, params.recoil, params.charge, params.x + Tmp.v1.x, params.y + Tmp.v1.y, i * sign + mr * sign + params.rotation); childParam.sideMultiplier = params.sideMultiplier; childParam.life = params.life; childParam.sideOverride = i; @@ -174,4 +174,4 @@ public class RegionPart extends DrawPart{ child.getOutlines(out); } } -} \ No newline at end of file +} diff --git a/core/src/mindustry/entities/units/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index 31cf3b4246..3bdd92f9a4 100644 --- a/core/src/mindustry/entities/units/WeaponMount.java +++ b/core/src/mindustry/entities/units/WeaponMount.java @@ -20,6 +20,10 @@ public class WeaponMount{ public float heat; /** lerps to 1 when shooting, 0 when not */ public float warmup; + /** is the weapon actively charging */ + public boolean charging; + /** counts up to 1 when charging, 0 when not */ + public float charge; /** lerps to reload time */ public float smoothReload; /** aiming position in world coordinates */ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index e02f57a079..17a333f122 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -1104,9 +1104,9 @@ public class UnitType extends UnlockableContent{ WeaponMount first = unit.mounts.length > part.weaponIndex ? unit.mounts[part.weaponIndex] : null; if(first != null){ - DrawPart.params.set(first.warmup, first.reload / weapons.first().reload, first.smoothReload, first.heat, first.recoil, unit.x, unit.y, unit.rotation); + DrawPart.params.set(first.warmup, first.reload / weapons.first().reload, first.smoothReload, first.heat, first.recoil, first.charge, unit.x, unit.y, unit.rotation); }else{ - DrawPart.params.set(0f, 0f, 0f, 0f, 0f, unit.x, unit.y, unit.rotation); + DrawPart.params.set(0f, 0f, 0f, 0f, 0f, 0f, unit.x, unit.y, unit.rotation); } if(unit instanceof Scaled s){ diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 781b5a6818..949d54fa1e 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -178,8 +178,6 @@ public class Weapon implements Cloneable{ } public void draw(Unit unit, WeaponMount mount){ - if(!region.found()) return; - //apply layer offset, roll it back at the end float z = Draw.z(); Draw.z(z + layerOffset); @@ -200,7 +198,7 @@ public class Weapon implements Cloneable{ } if(parts.size > 0){ - DrawPart.params.set(mount.warmup, mount.reload / reload, mount.smoothReload, mount.heat, mount.recoil, wx, wy, weaponRotation + 90); + DrawPart.params.set(mount.warmup, mount.reload / reload, mount.smoothReload, mount.heat, mount.recoil, mount.charge, wx, wy, weaponRotation + 90); DrawPart.params.sideMultiplier = flipSprite ? -1 : 1; for(int i = 0; i < parts.size; i++){ @@ -213,7 +211,7 @@ public class Weapon implements Cloneable{ Draw.xscl = -Mathf.sign(flipSprite); - Draw.rect(region, wx, wy, weaponRotation); + if(region.found()) Draw.rect(region, wx, wy, weaponRotation); if(cellRegion.found()){ Draw.color(unit.type.cellColor(unit)); @@ -255,6 +253,7 @@ public class Weapon implements Cloneable{ mount.recoil = Mathf.approachDelta(mount.recoil, 0, unit.reloadMultiplier / recoilTime); mount.warmup = Mathf.lerpDelta(mount.warmup, (can && mount.shoot) || (continuous && mount.bullet != null) ? 1f : 0f, shootWarmupSpeed); mount.smoothReload = Mathf.lerpDelta(mount.smoothReload, mount.reload / reload, smoothReloadSpeed); + mount.charge = mount.charging && shoot.firstShotDelay > 0 ? Mathf.approachDelta(mount.charge, 1, 1 / shoot.firstShotDelay) : 0; //rotate if applicable if(rotate && (mount.rotate || mount.shoot) && can){ @@ -388,6 +387,7 @@ public class Weapon implements Cloneable{ unit.apply(shootStatus, shootStatusDuration); if(shoot.firstShotDelay > 0){ + mount.charging = true; chargeSound.at(shootX, shootY, Mathf.random(soundPitchMin, soundPitchMax)); bullet.chargeEffect.at(shootX, shootY, rotation, bullet.keepVelocity || parentizeEffects ? unit : null); } @@ -398,13 +398,14 @@ public class Weapon implements Cloneable{ }else{ bullet(unit, mount, xOffset, yOffset, angle, mover); } - mount.totalShots ++; + mount.totalShots++; }); } protected void bullet(Unit unit, WeaponMount mount, float xOffset, float yOffset, float angleOffset, Mover mover){ if(!unit.isAdded()) return; + mount.charging = false; float xSpread = Mathf.range(xRand), weaponRotation = unit.rotation - 90 + (rotate ? mount.rotation : baseRotation), diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index b584f1d2b7..4ba5c85064 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -200,7 +200,7 @@ public class Turret extends ReloadTurret{ public Seq ammo = new Seq<>(); public int totalAmmo; public float curRecoil, heat, logicControlTime = -1; - public float shootWarmup; + public float shootWarmup, charge; public int totalShots; //turrets need to shoot once for 'visual reload' to be valid, otherwise they seem stuck at reload 0 when placed. public boolean visualReloadValid; @@ -348,8 +348,9 @@ public class Turret extends ReloadTurret{ wasShooting = false; - curRecoil = Math.max(curRecoil - Time.delta / recoilTime , 0); - heat = Math.max(heat - Time.delta / cooldownTime, 0); + curRecoil = Mathf.approachDelta(curRecoil, 0, 1 / recoilTime); + heat = Mathf.approachDelta(heat, 0, 1 / cooldownTime); + charge = charging() ? Mathf.approachDelta(charge, 1, 1 / shoot.firstShotDelay) : 0; unit.tile(this); unit.rotation(rotation); diff --git a/core/src/mindustry/world/draw/DrawTurret.java b/core/src/mindustry/world/draw/DrawTurret.java index 99cef02189..160e7b1c53 100644 --- a/core/src/mindustry/world/draw/DrawTurret.java +++ b/core/src/mindustry/world/draw/DrawTurret.java @@ -70,7 +70,7 @@ public class DrawTurret extends DrawBlock{ float progress = tb.visualReloadValid ? tb.progress() : 1f; //TODO no smooth reload - var params = DrawPart.params.set(build.warmup(), 1f - progress, 1f - progress, tb.heat, tb.curRecoil, tb.x + tb.recoilOffset.x, tb.y + tb.recoilOffset.y, tb.rotation); + var params = DrawPart.params.set(build.warmup(), 1f - progress, 1f - progress, tb.heat, tb.curRecoil, tb.charge, tb.x + tb.recoilOffset.x, tb.y + tb.recoilOffset.y, tb.rotation); for(var part : parts){ part.draw(params);