From f229f1e9fe165815954895f48a2d6681cc49991b Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 13 Sep 2018 22:33:03 -0400 Subject: [PATCH] Added LaserTurret class / Updated bundles --- core/assets/bundles/bundle.properties | 2 + core/assets/bundles/bundle_de.properties | 2 + core/assets/bundles/bundle_es.properties | 2 + core/assets/bundles/bundle_fr.properties | 2 + core/assets/bundles/bundle_in_ID.properties | 2 + core/assets/bundles/bundle_ita.properties | 2 + core/assets/bundles/bundle_ko.properties | 2 + core/assets/bundles/bundle_pl.properties | 2 + core/assets/bundles/bundle_pt_BR.properties | 2 + core/assets/bundles/bundle_ru.properties | 2 + core/assets/bundles/bundle_tk.properties | 2 + core/assets/bundles/bundle_tr.properties | 2 + core/assets/bundles/bundle_uk_UA.properties | 2 + core/assets/bundles/bundle_zh_CN.properties | 2 + core/assets/bundles/bundle_zh_TW.properties | 2 + .../io/anuke/mindustry/content/AmmoTypes.java | 2 +- .../content/blocks/TurretBlocks.java | 14 +++- .../content/bullets/TurretBullets.java | 37 +++++++++- .../mindustry/entities/bullet/Bullet.java | 27 +++---- .../mindustry/entities/units/UnitDrops.java | 9 +-- .../blocks/defense/turrets/ChargeTurret.java | 70 ++++++++++++++++++ .../blocks/defense/turrets/CooledTurret.java | 16 +--- .../blocks/defense/turrets/LaserTurret.java | 74 ++++++++++--------- .../world/blocks/defense/turrets/Turret.java | 8 +- 24 files changed, 212 insertions(+), 75 deletions(-) create mode 100644 core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 447bdb7cf3..13bdfdae8c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -628,6 +628,8 @@ block.overdrive-projector.name=Overdrive Projector block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown unit.alpha-drone.name=Alpha Drone unit.drone.name=Drone diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index dca630643e..a9a09bff8b 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index a3df62fc54..d120ac53b6 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index becf9c6f55..5c372885f0 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 0d2c8b2191..c57c861c43 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_ita.properties b/core/assets/bundles/bundle_ita.properties index b6257392bd..152318747e 100644 --- a/core/assets/bundles/bundle_ita.properties +++ b/core/assets/bundles/bundle_ita.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 37c3cbf3fb..207f5ebdcd 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 1c2a111bd7..8e325dd992 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 293467a764..211c39583f 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 74bf83ea14..2bdfb15b71 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -640,3 +640,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index a00af8b6f0..158c2debdb 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 1b4f2887a4..c493ffd431 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index cca94cc81b..d9f71cfa91 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -640,3 +640,5 @@ unit.interceptor.name=Винищувач-перехполювач unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком mode.custom.warning=Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. content.unit.name=Units +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 6de2f10c86..7508f54e8f 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index b4cd3c7779..cadd7c497b 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -610,3 +610,5 @@ content.unit.name=Units block.force-projector.name=Force Projector block.arc.name=Arc block.rtg-generator.name=RTG Generator +block.spectre.name=Spectre +block.meltdown.name=Meltdown diff --git a/core/src/io/anuke/mindustry/content/AmmoTypes.java b/core/src/io/anuke/mindustry/content/AmmoTypes.java index e3c4f6baa5..719d71c014 100644 --- a/core/src/io/anuke/mindustry/content/AmmoTypes.java +++ b/core/src/io/anuke/mindustry/content/AmmoTypes.java @@ -217,7 +217,7 @@ public class AmmoTypes implements ContentList{ spectreLaser = new AmmoType(TurretBullets.lancerLaser); - meltdownLaser = new AmmoType(TurretBullets.lancerLaser); + meltdownLaser = new AmmoType(TurretBullets.meltdownLaser); fuseShotgun = new AmmoType(Items.densealloy, TurretBullets.fuseShot, 1f){{ shootEffect = Fx.none; diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index 294aacc049..522a0c17d4 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -82,7 +82,7 @@ public class TurretBlocks extends BlockList implements ContentList{ }; }}; - lancer = new LaserTurret("lancer"){{ + lancer = new ChargeTurret("lancer"){{ range = 90f; chargeTime = 60f; chargeMaxDelay = 30f; @@ -105,7 +105,7 @@ public class TurretBlocks extends BlockList implements ContentList{ arc = new PowerTurret("arc"){{ shootType = AmmoTypes.arc; - reload = 30f; + reload = 40f; shootShake = 1f; powerUsed = 5f; powerCapacity = 30f; @@ -218,7 +218,7 @@ public class TurretBlocks extends BlockList implements ContentList{ ammoTypes = new AmmoType[]{AmmoTypes.bulletDenseBig, AmmoTypes.bulletPyratiteBig, AmmoTypes.bulletThoriumBig}; reload = 4f; restitution = 0.1f; - ammoUseEffect = ShootFx.shellEjectMedium; + ammoUseEffect = ShootFx.shellEjectBig; range = 200f; inaccuracy = 4f; recoil = 3f; @@ -232,9 +232,15 @@ public class TurretBlocks extends BlockList implements ContentList{ health = 155 * size * size; }}; - meltdown = new PowerTurret("meltdown"){{ + meltdown = new LaserTurret("meltdown"){{ shootType = AmmoTypes.meltdownLaser; + shootCone = 40f; size = 4; + powerUsed = 10f; + range = 140f; + reload = 60f; + shootDuration = 60f; + powerCapacity = 50f; }}; } } diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index 4c04f62e30..dd72ed33aa 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -31,7 +31,7 @@ import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.world; public class TurretBullets extends BulletList implements ContentList{ - public static BulletType fireball, basicFlame, lancerLaser, fuseShot, waterShot, cryoShot, lavaShot, oilShot, lightning, driverBolt, healBullet, arc; + public static BulletType fireball, basicFlame, lancerLaser, meltdownLaser, fuseShot, waterShot, cryoShot, lavaShot, oilShot, lightning, driverBolt, healBullet, arc; @Override public void load(){ @@ -161,6 +161,41 @@ public class TurretBullets extends BulletList implements ContentList{ } }; + meltdownLaser = new BulletType(0.001f, 140){ + Color[] colors = {Palette.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Palette.lancerLaser, Color.WHITE}; + float[] tscales = {1f, 0.7f, 0.5f, 0.2f}; + float[] lenscales = {1f, 1.1f, 1.13f, 1.14f}; + float length = 100f; + + { + hiteffect = BulletFx.hitLancer; + despawneffect = Fx.none; + hitsize = 4; + lifetime = 16f; + pierce = true; + } + + @Override + public void update(Bullet b){ + Damage.collideLine(b, b.getTeam(), hiteffect, b.x, b.y, b.angle(), length); + } + + @Override + public void draw(Bullet b){ + float baseLen = length * b.fout(); + + Lines.lineAngle(b.x, b.y, b.angle(), baseLen); + for(int s = 0; s < 3; s++){ + Draw.color(colors[s]); + for(int i = 0; i < tscales.length; i++){ + Lines.stroke(7f * b.fout() * (s == 0 ? 1.5f : s == 1 ? 1f : 0.3f) * tscales[i]); + Lines.lineAngle(b.x, b.y, b.angle(), baseLen * lenscales[i]); + } + } + Draw.reset(); + } + }; + fuseShot = new BulletType(0.01f, 70){ int rays = 3; float raySpace = 2f; diff --git a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java index 96989cd5d1..d7142d6e8a 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/bullet/Bullet.java @@ -37,23 +37,23 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT public Bullet(){ } - public static void create(BulletType type, TeamTrait owner, float x, float y, float angle){ - create(type, owner, owner.getTeam(), x, y, angle); + public static Bullet create(BulletType type, TeamTrait owner, float x, float y, float angle){ + return create(type, owner, owner.getTeam(), x, y, angle); } - public static void create(BulletType type, Entity owner, Team team, float x, float y, float angle){ - create(type, owner, team, x, y, angle, 1f); + public static Bullet create(BulletType type, Entity owner, Team team, float x, float y, float angle){ + return create(type, owner, team, x, y, angle, 1f); } - public static void create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl){ - create(type, owner, team, x, y, angle, velocityScl, 1f, null); + public static Bullet create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl){ + return create(type, owner, team, x, y, angle, velocityScl, 1f, null); } - public static void create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl){ - create(type, owner, team, x, y, angle, velocityScl, lifetimeScl, null); + public static Bullet create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl){ + return create(type, owner, team, x, y, angle, velocityScl, lifetimeScl, null); } - public static void create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl, Object data){ + public static Bullet create(BulletType type, Entity owner, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl, Object data){ Bullet bullet = Pooling.obtain(Bullet.class, Bullet::new); bullet.type = type; bullet.owner = owner; @@ -78,14 +78,15 @@ public class Bullet extends BulletEntity implements TeamTrait, SyncT bullet.set(x, y); bullet.add(); + return bullet; } - public static void create(BulletType type, Bullet parent, float x, float y, float angle){ - create(type, parent.owner, parent.team, x, y, angle); + public static Bullet create(BulletType type, Bullet parent, float x, float y, float angle){ + return create(type, parent.owner, parent.team, x, y, angle); } - public static void create(BulletType type, Bullet parent, float x, float y, float angle, float velocityScl){ - create(type, parent.owner, parent.team, x, y, angle, velocityScl); + public static Bullet create(BulletType type, Bullet parent, float x, float y, float angle, float velocityScl){ + return create(type, parent.owner, parent.team, x, y, angle, velocityScl); } @Remote(called = Loc.server) diff --git a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java b/core/src/io/anuke/mindustry/entities/units/UnitDrops.java index f5ee1996de..4965979f8e 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java +++ b/core/src/io/anuke/mindustry/entities/units/UnitDrops.java @@ -1,17 +1,14 @@ package io.anuke.mindustry.entities.units; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.entities.effect.ItemDrop; -import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.Item; -import io.anuke.ucore.util.Mathf; public class UnitDrops{ private static final int maxItems = 200; private static Item[] dropTable; public static void dropItems(BaseUnit unit){ + //just don't drop anything for now + /* if(Vars.itemGroup.size() > maxItems || unit.getTeam() != Team.red){ return; } @@ -28,6 +25,6 @@ public class UnitDrops{ unit.getVelocity().x + Mathf.range(3f), unit.getVelocity().y + Mathf.range(3f)); } } - } + }*/ } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java new file mode 100644 index 0000000000..9b6a6a4563 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java @@ -0,0 +1,70 @@ +package io.anuke.mindustry.world.blocks.defense.turrets; + +import io.anuke.mindustry.content.fx.Fx; +import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.type.AmmoType; +import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Effects.Effect; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.util.Mathf; + +import static io.anuke.mindustry.Vars.tilesize; + +public class ChargeTurret extends PowerTurret{ + + protected float chargeTime = 30f; + protected int chargeEffects = 5; + protected float chargeMaxDelay = 10f; + protected Effect chargeEffect = Fx.none; + protected Effect chargeBeginEffect = Fx.none; + + public ChargeTurret(String name){ + super(name); + } + + @Override + public void shoot(Tile tile, AmmoType ammo){ + LaserTurretEntity entity = tile.entity(); + + useAmmo(tile); + + tr.trns(entity.rotation, size * tilesize / 2); + Effects.effect(chargeBeginEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); + + for(int i = 0; i < chargeEffects; i++){ + Timers.run(Mathf.random(chargeMaxDelay), () -> { + if(!isTurret(tile)) return; + tr.trns(entity.rotation, size * tilesize / 2); + Effects.effect(chargeEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); + }); + } + + entity.shooting = true; + + Timers.run(chargeTime, () -> { + if(!isTurret(tile)) return; + tr.trns(entity.rotation, size * tilesize / 2); + entity.recoil = recoil; + entity.heat = 1f; + bullet(tile, ammo.bullet, entity.rotation + Mathf.range(inaccuracy)); + effects(tile); + entity.shooting = false; + }); + } + + @Override + public boolean shouldTurn(Tile tile){ + LaserTurretEntity entity = tile.entity(); + return !entity.shooting; + } + + @Override + public TileEntity getEntity(){ + return new LaserTurretEntity(); + } + + public class LaserTurretEntity extends TurretEntity{ + public boolean shooting; + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java index 62c832f6ac..4cd49b9747 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.mindustry.content.fx.BlockFx; -import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; @@ -13,13 +12,9 @@ import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.tilesize; public class CooledTurret extends Turret{ - /** - * How much reload is lowered by for each unit of liquid of heat capacity 1. - */ + /**How much reload is lowered by for each unit of liquid of heat capacity 1.*/ protected float coolantMultiplier = 1f; - /** - * Max coolant used per tick. - */ + /**Max coolant used per tick.*/ protected float maxUsed = 1f; protected Effect coolEffect = BlockFx.fuelburn; @@ -28,7 +23,7 @@ public class CooledTurret extends Turret{ hasLiquids = true; liquidCapacity = 20f; - consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f, 0.01f)).update(false).optional(true); + consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.01f)).update(false).optional(true); } @Override @@ -45,11 +40,6 @@ public class CooledTurret extends Turret{ if(Mathf.chance(0.04 * used)){ Effects.effect(coolEffect, tile.drawx() + Mathf.range(size * tilesize / 2f), tile.drawy() + Mathf.range(size * tilesize / 2f)); } - - //don't use oil as coolant, thanks - if(Mathf.chance(liquid.flammability / 10f * used)){ - Fire.create(tile); - } } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 36e2dcebfe..80157b7e0c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -1,62 +1,63 @@ package io.anuke.mindustry.world.blocks.defense.turrets; -import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.entities.bullet.Bullet; +import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.core.Effects; -import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Angles; import static io.anuke.mindustry.Vars.tilesize; public class LaserTurret extends PowerTurret{ - - protected float chargeTime = 30f; - protected int chargeEffects = 5; - protected float chargeMaxDelay = 10f; - protected Effect chargeEffect = Fx.none; - protected Effect chargeBeginEffect = Fx.none; + protected float firingMoveFract = 0.25f; + protected float shootDuration = 100f; public LaserTurret(String name){ super(name); } @Override - public void shoot(Tile tile, AmmoType ammo){ + protected void updateShooting(Tile tile){ LaserTurretEntity entity = tile.entity(); - useAmmo(tile); - - tr.trns(entity.rotation, size * tilesize / 2); - Effects.effect(chargeBeginEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); - - for(int i = 0; i < chargeEffects; i++){ - Timers.run(Mathf.random(chargeMaxDelay), () -> { - if(!isTurret(tile)) return; - tr.trns(entity.rotation, size * tilesize / 2); - Effects.effect(chargeEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); - }); + if(entity.bulletLife > 0 && entity.bullet != null){ + tr.trns(entity.rotation, size * tilesize / 2, 0f); + entity.bullet.setRotation(entity.rotation); + entity.bullet.set(tile.drawx() + tr.x, tile.drawy() + tr.y); + entity.bullet.time(0f); + entity.bulletLife -= Timers.delta(); + if(entity.bulletLife <= 0f){ + entity.bullet = null; + } + return; } - entity.shooting = true; + if(entity.reload >= reload){ + AmmoType type = peekAmmo(tile); - Timers.run(chargeTime, () -> { - if(!isTurret(tile)) return; - tr.trns(entity.rotation, size * tilesize / 2); - entity.recoil = recoil; - entity.heat = 1f; - bullet(tile, ammo.bullet, entity.rotation + Mathf.range(inaccuracy)); - effects(tile); - entity.shooting = false; - }); + shoot(tile, type); + + entity.reload = 0f; + }else{ + entity.reload += tile.entity.delta() * peekAmmo(tile).reloadMultiplier; + } } @Override - public boolean shouldTurn(Tile tile){ + protected void turnToTarget(Tile tile, float targetRot){ LaserTurretEntity entity = tile.entity(); - return !entity.shooting; + + entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta() * (entity.bulletLife <= 0f ? firingMoveFract : 1f)); + } + + @Override + protected void bullet(Tile tile, BulletType type, float angle){ + LaserTurretEntity entity = tile.entity(); + + entity.bullet = Bullet.create(type, tile.entity, tile.getTeam(), tile.drawx() + tr.x, tile.drawy() + tr.y, angle); + entity.bulletLife = shootDuration; } @Override @@ -64,7 +65,8 @@ public class LaserTurret extends PowerTurret{ return new LaserTurretEntity(); } - public class LaserTurretEntity extends TurretEntity{ - public boolean shooting; + class LaserTurretEntity extends TurretEntity{ + Bullet bullet; + float bulletLife; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 6b85975397..528cbf6a74 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -213,7 +213,7 @@ public abstract class Turret extends Block{ } if(shouldTurn(tile)){ - entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta()); + turnToTarget(tile, targetRot); } if(Angles.angleDist(entity.rotation, targetRot) < shootCone){ @@ -235,6 +235,12 @@ public abstract class Turret extends Block{ tile.drawx(), tile.drawy(), range, e -> !e.isDead() && (!e.isFlying() || targetAir)); } + protected void turnToTarget(Tile tile, float targetRot){ + TurretEntity entity = tile.entity(); + + entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta()); + } + public boolean shouldTurn(Tile tile){ return true; }