* Fix armor plate multiplier + change Math.round to Strings.autoFixed * Missing ability name bundles * Center ability name * SuppressionFieldAbility stats * Is two per row is acceptable? I can revert this commit if not. * LiquidExplodeAbility stat display * MoveLightningAbility stat display * Better SpawnDeathAbility display * Fix multiplier coloring inconsistencies Some had [lightgray] before %/x, some had it after * Consistent content name display Match with bullet status effects * Consistent stat formatting Convert from some being "stat: #" and some being "# stat" to all being "# stat" * Re-order stats * Optimize Imports * Add ability descriptions * Apparently I forgot LiquidRegenAbility * Mention healing allies if displayHeal = true
112 lines
3.8 KiB
Java
112 lines
3.8 KiB
Java
package mindustry.entities.abilities;
|
|
|
|
import arc.*;
|
|
import arc.audio.*;
|
|
import arc.graphics.*;
|
|
import arc.graphics.g2d.*;
|
|
import arc.math.*;
|
|
import arc.scene.ui.layout.*;
|
|
import arc.util.*;
|
|
import mindustry.content.*;
|
|
import mindustry.entities.*;
|
|
import mindustry.entities.bullet.*;
|
|
import mindustry.gen.*;
|
|
|
|
import static mindustry.Vars.*;
|
|
|
|
public class MoveLightningAbility extends Ability{
|
|
/** Lightning damage */
|
|
public float damage = 35f;
|
|
/** Chance of firing every tick. Set >= 1 to always fire lightning every tick at max speed */
|
|
public float chance = 0.15f;
|
|
/** Length of the lightning. <= 0 to disable */
|
|
public int length = 12;
|
|
/** Speeds for when to start lightninging and when to stop getting faster */
|
|
public float minSpeed = 0.8f, maxSpeed = 1.2f;
|
|
/** Lightning color */
|
|
public Color color = Color.valueOf("a9d8ff");
|
|
/** Shifts where the lightning spawns along the Y axis */
|
|
public float y = 0f;
|
|
/** Offset along the X axis */
|
|
public float x = 0f;
|
|
/** Whether the spawn side alternates */
|
|
public boolean alternate = true;
|
|
/** Jittering heat sprite like the shield on v5 Javelin */
|
|
public String heatRegion = "error";
|
|
/** Bullet type that is fired. Can be null */
|
|
public @Nullable BulletType bullet;
|
|
/** Bullet angle parameters */
|
|
public float bulletAngle = 0f, bulletSpread = 0f;
|
|
|
|
public Effect shootEffect = Fx.sparkShoot;
|
|
public boolean parentizeEffects;
|
|
public Sound shootSound = Sounds.spark;
|
|
|
|
protected float side = 1f;
|
|
|
|
MoveLightningAbility(){}
|
|
|
|
public MoveLightningAbility(float damage, int length, float chance, float y, float minSpeed, float maxSpeed, Color color, String heatRegion){
|
|
this.damage = damage;
|
|
this.length = length;
|
|
this.chance = chance;
|
|
this.y = y;
|
|
this.minSpeed = minSpeed;
|
|
this.maxSpeed = maxSpeed;
|
|
this.color = color;
|
|
this.heatRegion = heatRegion;
|
|
}
|
|
|
|
public MoveLightningAbility(float damage, int length, float chance, float y, float minSpeed, float maxSpeed, Color color){
|
|
this.damage = damage;
|
|
this.length = length;
|
|
this.chance = chance;
|
|
this.y = y;
|
|
this.minSpeed = minSpeed;
|
|
this.maxSpeed = maxSpeed;
|
|
this.color = color;
|
|
}
|
|
|
|
@Override
|
|
public void addStats(Table t){
|
|
super.addStats(t);
|
|
t.add(abilityStat("minspeed", Strings.autoFixed(minSpeed * 60f / tilesize, 2)));
|
|
t.row();
|
|
t.add(Core.bundle.format("bullet.damage", damage));
|
|
}
|
|
|
|
@Override
|
|
public void update(Unit unit){
|
|
float scl = Mathf.clamp((unit.vel().len() - minSpeed) / (maxSpeed - minSpeed));
|
|
if(Mathf.chance(Time.delta * chance * scl)){
|
|
float x = unit.x + Angles.trnsx(unit.rotation, this.y, this.x * side), y = unit.y + Angles.trnsy(unit.rotation, this.y, this.x * side);
|
|
|
|
shootEffect.at(x, y, unit.rotation, color, parentizeEffects ? unit : null);
|
|
shootSound.at(x, y);
|
|
|
|
if(length > 0){
|
|
Lightning.create(unit.team, color, damage, x + unit.vel.x, y + unit.vel.y, unit.rotation, length);
|
|
}
|
|
|
|
if(bullet != null){
|
|
bullet.create(unit, unit.team, x, y, unit.rotation + bulletAngle + Mathf.range(bulletSpread));
|
|
}
|
|
|
|
if(alternate) side *= -1f;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void draw(Unit unit){
|
|
float scl = Mathf.clamp((unit.vel().len() - minSpeed) / (maxSpeed - minSpeed));
|
|
TextureRegion region = Core.atlas.find(heatRegion);
|
|
if(Core.atlas.isFound(region) && scl > 0.00001f){
|
|
Draw.color(color);
|
|
Draw.alpha(scl / 2f);
|
|
Draw.blend(Blending.additive);
|
|
Draw.rect(region, unit.x + Mathf.range(scl / 2f), unit.y + Mathf.range(scl / 2f), unit.rotation - 90);
|
|
Draw.blend();
|
|
}
|
|
}
|
|
}
|