Erekir rebalance v5 (#11511)

* werwe

* phase scathe + minor tweak to surge scathe

* bs changes

* yay

* scathe bs

* 45t

* applied correctly now

* 343rfe

* whatever

* a

* Idk what I m doing

* idk

* bs

* tecta + titan balance changes

* tiny fix

* some reverts + cyanosub nerf

* oop

* better

* boring vanq buffs

* no, stop

* now

* -100% build mult

* revert tecta nerf

* better tecta bvb but -15% dps

* armor rend effect

* some reverts

* more

* more

* more

* avert changes

* avert shenanigans

* more balance ig

* PLEASE FREE ME

* more vanq changes

* more stuff

* flux buff

* conquer buff and stuff

* I m starting to like this

* finally fragOnLastHit fixed

* more tecta shield buffs

* done

* shieldarc json support just in case

* revert reflect convex spread

* fixes, dont override bullet.type

* cleanup + more tecta shield changes

* screw it, 0.5

* fix chance to deflect db entry
This commit is contained in:
EggleEgg
2026-02-07 20:57:51 -05:00
committed by GitHub
parent 47d28c0d20
commit 88f1e0c4af
8 changed files with 144 additions and 74 deletions
+4 -4
View File
@@ -1108,7 +1108,7 @@ ability.armorplate.description = Reduces damage taken while shooting
ability.shieldarc = Shield Arc ability.shieldarc = Shield Arc
ability.shieldarc.description = Projects a force shield in an arc that absorbs or deflects bullets, missiles and units ability.shieldarc.description = Projects a force shield in an arc that absorbs or deflects bullets, missiles and units
ability.suppressionfield = Repair Suppression ability.suppressionfield = Repair Suppression
ability.suppressionfield.description = Stops nearby repair buildings ability.suppressionfield.description = Stops nearby repair buildings and build towers
ability.energyfield = Energy Field ability.energyfield = Energy Field
ability.energyfield.description = Zaps nearby enemies ability.energyfield.description = Zaps nearby enemies
ability.energyfield.healdescription = Zaps nearby enemies and heals allies ability.energyfield.healdescription = Zaps nearby enemies and heals allies
@@ -2544,9 +2544,9 @@ unit.navanax.description = Fires explosive EMP projectiles, dealing significant
#Erekir #Erekir
unit.stell.description = Fires standard bullets at enemy targets. unit.stell.description = Fires standard bullets at enemy targets.
unit.locus.description = Fires alternating bullets at enemy targets. unit.locus.description = Fires alternating bullets at enemy targets.
unit.precept.description = Fires piercing cluster bullets at enemy targets. Less affected by harmful terrain. unit.precept.description = Fires piercing cluster bullets at enemy targets. Less affected by liquid drag
unit.vanquish.description = Fires large piercing splitting bullets at enemy targets. Less affected by harmful terrain. unit.vanquish.description = Fires large piercing splitting bullets at enemy targets. Less affected by liquid drag.
unit.conquer.description = Fires large piercing cascades of bullets at enemy targets. Less affected by harmful terrain. unit.conquer.description = Fires large piercing cascades of bullets at enemy targets. Significantly less affected by liquid drag.
unit.merui.description = Fires long-range artillery at enemy ground targets. Can step over most terrain. unit.merui.description = Fires long-range artillery at enemy ground targets. Can step over most terrain.
unit.cleroi.description = Fires dual shells at enemy targets. Targets enemy projectiles with point defense turrets. Can step over most terrain. unit.cleroi.description = Fires dual shells at enemy targets. Targets enemy projectiles with point defense turrets. Can step over most terrain.
unit.anthicus.description = Fires long-range homing missiles at enemy targets. Can step over most terrain. unit.anthicus.description = Fires long-range homing missiles at enemy targets. Can step over most terrain.
+43 -24
View File
@@ -1617,7 +1617,7 @@ public class Blocks{
}}; }};
cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{ cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{
requirements(Category.crafting, with(Items.carbide, 50, Items.silicon, 80, Items.beryllium, 90)); requirements(Category.crafting, with(Items.carbide, 80, Items.silicon, 120, Items.beryllium, 140, Items.oxide, 40));
heatRequirement = 20f; heatRequirement = 20f;
maxEfficiency = 1f; maxEfficiency = 1f;
@@ -2770,8 +2770,8 @@ public class Blocks{
}}; }};
fluxReactor = new VariableReactor("flux-reactor"){{ fluxReactor = new VariableReactor("flux-reactor"){{
requirements(Category.power, with(Items.graphite, 300, Items.carbide, 100, Items.oxide, 100, Items.silicon, 600, Items.surgeAlloy, 200)); requirements(Category.power, with(Items.graphite, 240, Items.carbide, 60, Items.oxide, 80, Items.silicon, 480, Items.surgeAlloy, 120));
powerProduction = 265f; powerProduction = 18000f / 60f;
maxHeat = 150f; maxHeat = 150f;
consumeLiquid(Liquids.cyanogen, 9f / 60f); consumeLiquid(Liquids.cyanogen, 9f / 60f);
@@ -4510,8 +4510,8 @@ public class Blocks{
shootEffect = Fx.shootBigColor; shootEffect = Fx.shootBigColor;
smokeEffect = Fx.shootSmokeSquareSparse; smokeEffect = Fx.shootSmokeSquareSparse;
ammoMultiplier = 1; ammoMultiplier = 1;
hitColor = backColor = trailColor = Pal.graphiteAmmoBack; hitColor = backColor = trailColor = Pal.siliconAmmoBack;
frontColor = Pal.graphiteAmmoFront; frontColor = Color.valueOf("dae1ee");
trailWidth = 6f; trailWidth = 6f;
trailLength = 6; trailLength = 6;
hitEffect = despawnEffect = Fx.hitSquaresColor; hitEffect = despawnEffect = Fx.hitSquaresColor;
@@ -4597,7 +4597,7 @@ public class Blocks{
outlineColor = Pal.darkOutline; outlineColor = Pal.darkOutline;
liquidCapacity = 50f; liquidCapacity = 50f;
liquidConsumed = 15f / 60f; liquidConsumed = 18f / 60f;
targetInterval = 5f; targetInterval = 5f;
newTargetInterval = 30f; newTargetInterval = 30f;
targetUnderBlocks = false; targetUnderBlocks = false;
@@ -4613,6 +4613,7 @@ public class Blocks{
Liquids.ozone, new ContinuousFlameBulletType(){{ Liquids.ozone, new ContinuousFlameBulletType(){{
damage = 60f; damage = 60f;
length = r; length = r;
ammoMultiplier = 1.2f;
knockback = 1f; knockback = 1f;
pierceCap = 2; pierceCap = 2;
buildingDamageMultiplier = 0.3f; buildingDamageMultiplier = 0.3f;
@@ -4623,7 +4624,6 @@ public class Blocks{
Liquids.cyanogen, new ContinuousFlameBulletType(){{ Liquids.cyanogen, new ContinuousFlameBulletType(){{
damage = 130f; damage = 130f;
rangeChange = 70f; rangeChange = 70f;
ammoMultiplier = 1.5f;
length = r + rangeChange; length = r + rangeChange;
knockback = 2f; knockback = 2f;
pierceCap = 3; pierceCap = 3;
@@ -4746,10 +4746,10 @@ public class Blocks{
lifetime = 190f; lifetime = 190f;
height = 19f; height = 19f;
width = 17f; width = 17f;
reloadMultiplier = 0.65f; reloadMultiplier = 0.7f;
splashDamageRadius = 110f; splashDamageRadius = 110f;
rangeChange = 8f; rangeChange = 8f;
splashDamage = 150f; splashDamage = 180f;
scaledSplashDamage = true; scaledSplashDamage = true;
hitColor = backColor = trailColor = Color.valueOf("a0b380"); hitColor = backColor = trailColor = Color.valueOf("a0b380");
frontColor = Color.valueOf("e4ffd6"); frontColor = Color.valueOf("e4ffd6");
@@ -4772,7 +4772,26 @@ public class Blocks{
shrinkY = 0.1f; shrinkY = 0.1f;
buildingDamageMultiplier = 0.25f; buildingDamageMultiplier = 0.25f;
status = StatusEffects.corroded; status = StatusEffects.corroded;
statusDuration = 300f; statusDuration = 60f * 8f;
fragBullets = 1;
fragBullet = new EmptyBulletType(){{
damage = 0f;
lifetime = 60f * 2.5f;
bulletInterval = 20f;
hitEffect = despawnEffect = Fx.none;
intervalBullet = new EmptyBulletType(){{
splashDamage = 15f;
collidesGround = true;
collidesAir = false;
collides = false;
hitEffect = despawnEffect = Fx.none;
pierce = true;
instantDisappear = true;
splashDamageRadius = 90f;
buildingDamageMultiplier = 0f;
}};
}};
}} }}
); );
@@ -4894,8 +4913,8 @@ public class Blocks{
collidesTiles = false; collidesTiles = false;
shootEffect = Fx.shootBig2; shootEffect = Fx.shootBig2;
smokeEffect = Fx.shootSmokeDisperse; smokeEffect = Fx.shootSmokeDisperse;
frontColor = Pal.graphiteAmmoFront; frontColor = Color.valueOf("dae1ee");
backColor = trailColor = hitColor = Pal.graphiteAmmoBack; backColor = trailColor = hitColor = Pal.siliconAmmoBack;
ammoMultiplier = 4f; ammoMultiplier = 4f;
lifetime = 34f; lifetime = 34f;
@@ -5213,6 +5232,7 @@ public class Blocks{
speed = 4.6f; speed = 4.6f;
maxRange = 6f; maxRange = 6f;
lifetime = 60f * 5.5f; lifetime = 60f * 5.5f;
hitSize = 10f;
outlineColor = Pal.darkOutline; outlineColor = Pal.darkOutline;
engineColor = trailColor = Pal.redLight; engineColor = trailColor = Pal.redLight;
engineLayer = Layer.effect; engineLayer = Layer.effect;
@@ -5293,13 +5313,14 @@ public class Blocks{
shootEffect = Fx.shootBig; shootEffect = Fx.shootBig;
smokeEffect = Fx.shootSmokeMissileColor; smokeEffect = Fx.shootSmokeMissileColor;
hitColor = Color.valueOf("ffd37f"); hitColor = Color.valueOf("ffd37f");
ammoMultiplier = 3f; ammoMultiplier = 5f;
reloadMultiplier = 0.8f; reloadMultiplier = 0.8f;
spawnUnit = new MissileUnitType("scathe-missile-phase"){{ spawnUnit = new MissileUnitType("scathe-missile-phase"){{
speed = 4f; speed = 2.5f;
maxRange = 6f; maxRange = 6f;
lifetime = 60f * 6.1f; lifetime = 60f * 9.77f;
hitSize = 10f;
outlineColor = Pal.darkOutline; outlineColor = Pal.darkOutline;
engineColor = trailColor = Color.valueOf("ffd37f"); engineColor = trailColor = Color.valueOf("ffd37f");
engineLayer = Layer.effect; engineLayer = Layer.effect;
@@ -5337,10 +5358,9 @@ public class Blocks{
deathExplosionEffect = Fx.massiveExplosion; deathExplosionEffect = Fx.massiveExplosion;
shootOnDeath = true; shootOnDeath = true;
shake = 10f; shake = 10f;
bullet = new ExplosionBulletType(400f, 120f){{ bullet = new ExplosionBulletType(320f, 120f){{
//stats must be mirrored to the bullet that the unit uses
reloadMultiplier = 0.8f; reloadMultiplier = 0.8f;
ammoMultiplier = 3f; ammoMultiplier = 5f;
hitColor = engineColor; hitColor = engineColor;
shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{ shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{
@@ -5364,7 +5384,7 @@ public class Blocks{
width = height = 18f; width = height = 18f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 56f; splashDamageRadius = 56f;
splashDamage = 164f; splashDamage = 120f;
backColor = trailColor = hitColor = engineColor; backColor = trailColor = hitColor = engineColor;
frontColor = Color.white; frontColor = Color.white;
smokeEffect = Fx.shootBigSmoke2; smokeEffect = Fx.shootBigSmoke2;
@@ -5385,10 +5405,10 @@ public class Blocks{
rotation = 180f; rotation = 180f;
y = -9f; y = -9f;
color = Color.grays(0.6f).lerp(Pal.redLight, 0.5f).a(0.4f); color = Color.grays(0.6f).lerp(Pal.redLight, 0.5f).a(0.4f);
interval = 7f; interval = 15f;
}}); }});
abilities.add(new ForceFieldAbility(90f, 0f, 2000f, 999999999f)); abilities.add(new ForceFieldAbility(120f, 0f, 3000f, 999999999f));
}}; }};
}}, }},
@@ -5399,13 +5419,13 @@ public class Blocks{
hitColor = Color.valueOf("f7e97e"); hitColor = Color.valueOf("f7e97e");
ammoMultiplier = 1f; ammoMultiplier = 1f;
rangeChange = -8f*9f;
reloadMultiplier = 0.9f; reloadMultiplier = 0.9f;
spawnUnit = new MissileUnitType("scathe-missile-surge"){{ spawnUnit = new MissileUnitType("scathe-missile-surge"){{
speed = 4.4f; speed = 4.4f;
maxRange = 6f; maxRange = 6f;
lifetime = 60f * 1.4f; lifetime = 60f * 1.4f;
hitSize = 10f;
outlineColor = Pal.darkOutline; outlineColor = Pal.darkOutline;
engineColor = trailColor = Color.valueOf("f7e97e"); engineColor = trailColor = Color.valueOf("f7e97e");
engineLayer = Layer.effect; engineLayer = Layer.effect;
@@ -5436,7 +5456,6 @@ public class Blocks{
bullet = new ExplosionBulletType(1800f, 40f){{ bullet = new ExplosionBulletType(1800f, 40f){{
//mirror stats //mirror stats
ammoMultiplier = 1f; ammoMultiplier = 1f;
rangeChange = -8f*9f;
reloadMultiplier = 0.9f; reloadMultiplier = 0.9f;
lightning = 10; lightning = 10;
lightningDamage = 45f; lightningDamage = 45f;
@@ -5461,7 +5480,7 @@ public class Blocks{
spawnUnit = new MissileUnitType("scathe-missile-surge-split"){{ spawnUnit = new MissileUnitType("scathe-missile-surge-split"){{
speed = 4.8f; speed = 4.8f;
maxRange = 6f; maxRange = 6f;
lifetime = 60f * 3.5f; lifetime = 60f * 3.7f;
outlineColor = Pal.darkOutline; outlineColor = Pal.darkOutline;
engineColor = trailColor = Color.valueOf("f7e97e"); engineColor = trailColor = Color.valueOf("f7e97e");
engineLayer = Layer.effect; engineLayer = Layer.effect;
+10
View File
@@ -905,6 +905,16 @@ public class Fx{
Drawf.light(e.x, e.y, 20f, e.color, 0.6f * e.fout()); Drawf.light(e.x, e.y, 20f, e.color, 0.6f * e.fout());
}), }),
squareWaveEffect = new Effect(14, 40f, e -> {
rand.setSeed(e.id);
color(Color.white, e.color, rand.random(0.8f, 1.5f) * e.fin());
stroke(rand.random(0.4f, 0.8f) + e.fout() * 2);
float rot = rand.random(45f, 180f) * e.fin();
float rotation = rand.random(0, 1) > 0.5f ? rot : -rot;
Lines.square(e.x, e.y, e.fin() * rand.random(4f, 11f) + 4f, e.rotation + rand.random(360f) + rotation);
Drawf.light(e.x, e.y, 23f, e.color, e.fout() * 0.7f);
}),
hitFuse = new Effect(14, e -> { hitFuse = new Effect(14, e -> {
color(Color.white, Pal.surge, e.fin()); color(Color.white, Pal.surge, e.fin());
@@ -192,8 +192,8 @@ public class StatusEffects{
corroded = new StatusEffect("corroded"){{ corroded = new StatusEffect("corroded"){{
color = Color.valueOf("e4ffd6"); color = Color.valueOf("e4ffd6");
intervalDamage = 25f; intervalDamage = 20f;
intervalDamageTime = 30f; intervalDamageTime = 15f;
effectChance = 0.1f; effectChance = 0.1f;
effect = Fx.corrosionVapor; effect = Fx.corrosionVapor;
+49 -23
View File
@@ -2826,7 +2826,7 @@ public class UnitTypes{
y = -1f; y = -1f;
heatColor = Color.valueOf("f9350f"); heatColor = Color.valueOf("f9350f");
cooldownTime = 30f; cooldownTime = 30f;
bullet = new BasicBulletType(7f, 120){{ bullet = new BasicBulletType(7f, 10){{
sprite = "missile-large"; sprite = "missile-large";
width = 7.5f; width = 7.5f;
height = 13f; height = 13f;
@@ -2891,7 +2891,7 @@ public class UnitTypes{
weapons.add(new Weapon("vanquish-weapon"){{ weapons.add(new Weapon("vanquish-weapon"){{
shootSound = Sounds.shootTank; shootSound = Sounds.shootTank;
layerOffset = 0.0001f; layerOffset = 0.0001f;
reload = 70f; reload = 80f;
shootY = 71f / 4f; shootY = 71f / 4f;
shake = 5f; shake = 5f;
recoil = 4f; recoil = 4f;
@@ -2904,17 +2904,18 @@ public class UnitTypes{
heatColor = Color.valueOf("f9350f"); heatColor = Color.valueOf("f9350f");
cooldownTime = 80f; cooldownTime = 80f;
bullet = new BasicBulletType(8f, 190){{ bullet = new BasicBulletType(8f, 150f){{
sprite = "missile-large"; sprite = "missile-large";
width = 9.5f; width = 9.5f;
height = 13f; height = 18f;
lifetime = 18f; lifetime = 16f;
hitSize = 6f; hitSize = 6f;
shootEffect = Fx.shootTitan; shootEffect = Fx.shootTitan;
smokeEffect = Fx.shootSmokeTitan; smokeEffect = Fx.shootSmokeTitan;
pierceCap = 2; pierceCap = 2;
pierce = true; pierce = true;
pierceBuilding = true; pierceBuilding = true;
hitColor = backColor = trailColor = Color.valueOf("feb380"); hitColor = backColor = trailColor = Color.valueOf("feb380");
frontColor = Color.white; frontColor = Color.white;
trailWidth = 3.1f; trailWidth = 3.1f;
@@ -2922,19 +2923,21 @@ public class UnitTypes{
hitEffect = despawnEffect = Fx.blastExplosion; hitEffect = despawnEffect = Fx.blastExplosion;
splashDamageRadius = 20f; splashDamageRadius = 20f;
splashDamage = 50f; splashDamage = 50f;
maxRange = 190f;
fragOnHit = false; fragOnHit = false;
pierceFragCap = 1;
fragRandomSpread = 0f; fragRandomSpread = 0f;
fragSpread = 10f; fragSpread = 10f;
fragBullets = 5; fragBullets = 5;
fragVelocityMin = 1f; fragVelocityMin = 1f;
despawnSound = Sounds.explosionDull; despawnSound = Sounds.explosionDull;
fragBullet = new BasicBulletType(8f, 35){{ fragBullet = new BasicBulletType(8f, 35f){{
sprite = "missile-large"; sprite = "missile-large";
width = 8f; width = 8f;
height = 12f; height = 16f;
lifetime = 15f; lifetime = 10f;
hitSize = 4f; hitSize = 4f;
hitColor = backColor = trailColor = Color.valueOf("feb380"); hitColor = backColor = trailColor = Color.valueOf("feb380");
frontColor = Color.white; frontColor = Color.white;
@@ -2951,7 +2954,7 @@ public class UnitTypes{
for(float f : new float[]{34f / 4f, -36f / 4f}){ for(float f : new float[]{34f / 4f, -36f / 4f}){
int fi = i ++; int fi = i ++;
weapons.add(new Weapon("vanquish-point-weapon"){{ weapons.add(new Weapon("vanquish-point-weapon"){{
reload = 35f + fi * 5; reload = 22 + fi * 5;
x = 48f / 4f; x = 48f / 4f;
y = f; y = f;
shootY = 5.5f; shootY = 5.5f;
@@ -2960,16 +2963,21 @@ public class UnitTypes{
rotateSpeed = 2f; rotateSpeed = 2f;
shootSound = Sounds.shootStell; shootSound = Sounds.shootStell;
bullet = new BasicBulletType(4.5f, 25){{ bullet = new BasicBulletType(12f, 50f){{
sprite = "missile-large";
width = 6.5f; width = 6.5f;
height = 11f; height = 11f;
shrinkY = 0f;
shrinkX = 0.2f;
lifetime = 15f;
shootEffect = Fx.sparkShoot; shootEffect = Fx.sparkShoot;
smokeEffect = Fx.shootBigSmoke; smokeEffect = Fx.shootBigSmoke;
hitColor = backColor = trailColor = Color.valueOf("feb380"); hitColor = backColor = trailColor = Color.valueOf("feb380");
frontColor = Color.white; frontColor = Color.white;
trailWidth = 1.5f; trailWidth = 2.5f;
trailLength = 4; trailLength = 5;
hitEffect = despawnEffect = Fx.hitBulletColor; hitEffect = Fx.blastExplosion;
despawnEffect = Fx.hitBulletColor;
}}; }};
}}); }});
} }
@@ -3358,7 +3366,7 @@ public class UnitTypes{
drag = 0.1f; drag = 0.1f;
hitSize = 21f; hitSize = 21f;
rotateSpeed = 3f; rotateSpeed = 3f;
health = 2900; health = 2700;
armor = 7f; armor = 7f;
fogRadius = 40f; fogRadius = 40f;
stepShake = 0f; stepShake = 0f;
@@ -3473,9 +3481,9 @@ public class UnitTypes{
trailColor = engineColor = Pal.techBlue; trailColor = engineColor = Pal.techBlue;
engineSize = 1.75f; engineSize = 1.75f;
engineLayer = Layer.effect; engineLayer = Layer.effect;
speed = 3.7f; speed = 3.35f;
maxRange = 6f; maxRange = 6f;
lifetime = 60f * 1.5f; lifetime = 60f * 1.66f;
outlineColor = Pal.darkOutline; outlineColor = Pal.darkOutline;
health = 55; health = 55;
lowAltitude = true; lowAltitude = true;
@@ -3533,9 +3541,9 @@ public class UnitTypes{
region = "tecta-shield"; region = "tecta-shield";
radius = 45f; radius = 45f;
angle = 82f; angle = 82f;
regen = 40f / 60f; regen = 45f / 60f;
cooldown = 60f * 8f; cooldown = 60f * 8f;
max = 2200f; max = 2500f;
y = -20f; y = -20f;
width = 8f; width = 8f;
whenShooting = false; whenShooting = false;
@@ -3581,14 +3589,14 @@ public class UnitTypes{
velocityRnd = 0.33f; velocityRnd = 0.33f;
heatColor = Color.red; heatColor = Color.red;
bullet = new MissileBulletType(4.2f, 60){{ bullet = new MissileBulletType(4.2f, 51){{
homingPower = 0.2f; homingPower = 0.2f;
weaveMag = 4; weaveMag = 4;
weaveScale = 4; weaveScale = 4;
lifetime = 55f; lifetime = 55f;
shootEffect = Fx.shootBig2; shootEffect = Fx.shootBig2;
smokeEffect = Fx.shootSmokeTitan; smokeEffect = Fx.shootSmokeTitan;
splashDamage = 70f; splashDamage = 60f;
splashDamageRadius = 30f; splashDamageRadius = 30f;
frontColor = Color.white; frontColor = Color.white;
hitSound = Sounds.none; hitSound = Sounds.none;
@@ -3679,7 +3687,7 @@ public class UnitTypes{
shadow = 10f; shadow = 10f;
shootStatus = StatusEffects.slow; shootStatus = StatusEffects.slow;
shootStatusDuration = reload + 1f; shootStatusDuration = reload + 170f;
shoot.shots = 1; shoot.shots = 1;
heatColor = Color.red; heatColor = Color.red;
@@ -3901,13 +3909,31 @@ public class UnitTypes{
width = 7f; width = 7f;
height = 12f; height = 12f;
lifetime = 18f; lifetime = 18f;
//floating point inaccuracy makes 0.6f show as -39%
buildingDamageMultiplier = 0.599999f;
shootEffect = Fx.sparkShoot; shootEffect = Fx.sparkShoot;
smokeEffect = Fx.shootBigSmoke; smokeEffect = Fx.shootBigSmoke;
hitColor = backColor = trailColor = Pal.suppress; hitColor = backColor = trailColor = Pal.suppress;
frontColor = Color.white; frontColor = Color.white;
trailWidth = 1.5f; trailWidth = 1.5f;
trailLength = 5; trailLength = 5;
hitEffect = despawnEffect = Fx.hitBulletColor; hitEffect = despawnEffect = new MultiEffect(Fx.hitSquaresColor, Fx.squareWaveEffect);
fragOnDespawn = false;
fragBullets = 2;
fragBullet = new BasicBulletType(3f, 15){{
width = 5f;
height = 8f;
lifetime = 14f;
fragVelocityMax = 1f;
fragVelocityMin = 0.7f;
buildingDamageMultiplier = 0.5f;
hitColor = backColor = trailColor = Pal.suppress;
frontColor = Color.white;
trailWidth = 1.2f;
trailLength = 4;
hitEffect = despawnEffect = Fx.hitBulletColor;
}};
}}; }};
}}); }});
}}; }};
@@ -4046,7 +4072,7 @@ public class UnitTypes{
health = 6000f; health = 6000f;
armor = 4f; armor = 4f;
hitSize = 36f; hitSize = 36f;
payloadCapacity = Mathf.sqr(3f) * tilePayload; payloadCapacity = Mathf.sqr(4f) * tilePayload;
researchCostMultiplier = 0f; researchCostMultiplier = 0f;
targetAir = false; targetAir = false;
@@ -38,13 +38,18 @@ public class ShieldArcAbility extends Ability{
if(penX > penY){ if(penX > penY){
b.vel.x *= -1; b.vel.x *= -1;
b.vel.y *= paramField.reflectVel;
}else{ }else{
b.vel.y *= -1; b.vel.y *= -1;
b.vel.x *= paramField.reflectVel;
} }
b.owner = paramUnit; b.owner = paramUnit;
b.team = paramUnit.team; b.team = paramUnit.team;
b.time += 1f; b.time = b.lifetime * paramField.reflectTime;
if(paramField.reflectBuildingDamage > 0f){
b.buildingDamageMultiplier = paramField.reflectBuildingDamage;
}
}else{ }else{
b.absorb(); b.absorb();
@@ -124,6 +129,12 @@ public class ShieldArcAbility extends Ability{
public float width = 6f; public float width = 6f;
/** Bullet deflection chance. -1 to disable */ /** Bullet deflection chance. -1 to disable */
public float chanceDeflect = -1f; public float chanceDeflect = -1f;
/** Multiplier for reflected bullet building damage. -1 to disable */
public float reflectBuildingDamage = 1f;
/** Velocity multiplier for reflected bullets on the opposite axis. Negative values = concave, positive values = convex */
public float reflectVel = 1f;
/** Time multiplier for reflected bullets. */
public float reflectTime = 1f - 0.5f;
/** Deflection sound. */ /** Deflection sound. */
public Sound deflectSound = Sounds.none; public Sound deflectSound = Sounds.none;
public Sound breakSound = Sounds.shieldBreakSmall; public Sound breakSound = Sounds.shieldBreakSmall;
@@ -154,8 +165,10 @@ public class ShieldArcAbility extends Ability{
t.add(abilityStat("repairspeed", Strings.autoFixed(regen * 60f, 2))); t.add(abilityStat("repairspeed", Strings.autoFixed(regen * 60f, 2)));
t.row(); t.row();
t.add(abilityStat("cooldown", Strings.autoFixed(cooldown / 60f, 2))); t.add(abilityStat("cooldown", Strings.autoFixed(cooldown / 60f, 2)));
t.row(); if(chanceDeflect > 0f){
t.add(abilityStat("deflectchance", Strings.autoFixed(chanceDeflect *100f, 2))); t.row();
t.add(abilityStat("deflectchance", Strings.autoFixed(chanceDeflect *100f, 2)));
}
} }
@Override @Override
@@ -157,7 +157,7 @@ public class BulletType extends Content implements Cloneable{
public float extraRangeMargin = 0f; public float extraRangeMargin = 0f;
/** Range initialized in init(). */ /** Range initialized in init(). */
public float range = 0f; public float range = 0f;
/** When used in a turret with multiple ammoo types, this can be set to a non-zero value to influence minRange */ /** When used in a turret with multiple ammo types, this can be set to a non-zero value to influence minRange */
public float minRangeChange = 0f; public float minRangeChange = 0f;
/** % of block health healed **/ /** % of block health healed **/
public float healPercent = 0f; public float healPercent = 0f;
@@ -173,11 +173,13 @@ public class BulletType extends Content implements Cloneable{
public boolean makeFire = false; public boolean makeFire = false;
/** Whether this bullet will always hit blocks under it. */ /** Whether this bullet will always hit blocks under it. */
public boolean hitUnder = false; public boolean hitUnder = false;
/** Whether to create hit effects on despawn. Forced to true if this bullet has any special effects like splash damage. */ /** Whether to create hit effects on despawn. Forced to true if this bullet has any special effects like splash damage. Disable setDefaults to avoid override */
public boolean despawnHit = false; public boolean despawnHit = false;
/** If true, this bullet will create bullets when it hits anything, not just when it despawns. */ /** If true, this bullet will create bullets when it hits anything */
public boolean fragOnHit = true; public boolean fragOnHit = true;
/** If false, this bullet will not create fraags when absorbed by a shield. */ /** If true, this bullet will create bullets when it despawns */
public boolean fragOnDespawn = true;
/** If false, this bullet will not create frags when absorbed by a shield. */
public boolean fragOnAbsorb = true; public boolean fragOnAbsorb = true;
/** If true, unit armor is ignored in damage calculations. */ /** If true, unit armor is ignored in damage calculations. */
public boolean pierceArmor = false; public boolean pierceArmor = false;
@@ -269,7 +271,7 @@ public class BulletType extends Content implements Cloneable{
/** Random offset of trail effect. */ /** Random offset of trail effect. */
public float trailSpread = 0f; public float trailSpread = 0f;
/** Rotation/size parameter that is passed to trail. Usually, this controls size. */ /** Rotation/size parameter that is passed to trail. Usually, this controls size. */
public float trailParam = 2f; public float trailParam = 2f;
/** Whether the parameter passed to the trail is the bullet rotation, instead of a flat value. */ /** Whether the parameter passed to the trail is the bullet rotation, instead of a flat value. */
public boolean trailRotation = false; public boolean trailRotation = false;
/** Interpolation for trail width as function of bullet lifetime */ /** Interpolation for trail width as function of bullet lifetime */
@@ -527,16 +529,20 @@ public class BulletType extends Content implements Cloneable{
} }
public void hit(Bullet b){ public void hit(Bullet b){
hit(b, b.x, b.y); hit(b, b.x, b.y, true);
} }
public void hit(Bullet b, float x, float y){ public void hit(Bullet b, float x, float y){
hit(b, b.x, b.y, true);
}
public void hit(Bullet b, float x, float y, boolean createFrags){
hitEffect.at(x, y, b.rotation(), hitColor); hitEffect.at(x, y, b.rotation(), hitColor);
hitSound.at(x, y, hitSoundPitch + Mathf.range(hitSoundPitchRange), hitSoundVolume); hitSound.at(x, y, hitSoundPitch + Mathf.range(hitSoundPitchRange), hitSoundVolume);
Effect.shake(hitShake, hitShake, b); Effect.shake(hitShake, hitShake, b);
if(fragOnHit){ if(createFrags && fragOnHit){
if(delayFrags && fragBullet != null && fragBullet.delayFrags){ if(delayFrags && fragBullet != null && fragBullet.delayFrags){
Time.run(0f, () -> createFrags(b, x, y)); Time.run(0f, () -> createFrags(b, x, y));
}else{ }else{
@@ -596,7 +602,7 @@ public class BulletType extends Content implements Cloneable{
} }
public void createFrags(Bullet b, float x, float y){ public void createFrags(Bullet b, float x, float y){
if(fragBullet != null && (fragOnAbsorb || !b.absorbed) && !(b.frags >= pierceFragCap && pierceFragCap > 0)){ if(fragBullet != null && (fragOnAbsorb || !b.absorbed) && (pierceFragCap < 0 || b.frags < pierceFragCap)){
for(int i = 0; i < fragBullets; i++){ for(int i = 0; i < fragBullets; i++){
float len = Mathf.random(fragOffsetMin, fragOffsetMax); float len = Mathf.random(fragOffsetMin, fragOffsetMax);
float a = b.rotation() + Mathf.range(fragRandomSpread / 2) + fragAngle + fragSpread * i - (fragBullets - 1) * fragSpread / 2f; float a = b.rotation() + Mathf.range(fragRandomSpread / 2) + fragAngle + fragSpread * i - (fragBullets - 1) * fragSpread / 2f;
@@ -620,15 +626,11 @@ public class BulletType extends Content implements Cloneable{
/** Called when the bullet reaches the end of its lifetime or is destroyed by something external. */ /** Called when the bullet reaches the end of its lifetime or is destroyed by something external. */
public void despawned(Bullet b){ public void despawned(Bullet b){
if(despawnHit){ if(despawnHit){
hit(b); hit(b, b.x, b.y, false);
}else{ }else{
createUnits(b, b.x, b.y); createUnits(b, b.x, b.y);
} }
if(!fragOnHit){
createFrags(b, b.x, b.y);
}
despawnEffect.at(b.x, b.y, b.rotation(), hitColor); despawnEffect.at(b.x, b.y, b.rotation(), hitColor);
despawnSound.at(b, 1f + Mathf.range(hitSoundPitchRange)); despawnSound.at(b, 1f + Mathf.range(hitSoundPitchRange));
@@ -641,15 +643,13 @@ public class BulletType extends Content implements Cloneable{
Fx.trailFade.at(b.x, b.y, trailWidth, trailColor, b.trail.copy()); Fx.trailFade.at(b.x, b.y, trailWidth, trailColor, b.trail.copy());
} }
//if the bullet never created any frags and is removed (probably by hitting something), it needs to spawn those if(b.frags == 0 && fragOnDespawn && fragBullet != null){
//TODO: disabled for now as this makes vanquish significantly more powerful createFrags(b, b.x, b.y);
if(b.frags == 0 && !fragOnHit && fragBullet != null){
// createFrags(b, b.x, b.y);
} }
} }
public float buildingDamage(Bullet b){ public float buildingDamage(Bullet b){
return b.damage() * buildingDamageMultiplier; return b.damage() * b.buildingDamageMultiplier;
} }
public float shieldDamage(Bullet b){ public float shieldDamage(Bullet b){
@@ -960,6 +960,7 @@ public class BulletType extends Content implements Cloneable{
bullet.hitSize = hitSize; bullet.hitSize = hitSize;
bullet.mover = mover; bullet.mover = mover;
bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier(); bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier();
bullet.buildingDamageMultiplier = buildingDamageMultiplier;
//reset trail //reset trail
if(bullet.trail != null){ if(bullet.trail != null){
bullet.trail.clear(); bullet.trail.clear();
@@ -45,6 +45,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
transient @Nullable Tile aimTile; transient @Nullable Tile aimTile;
transient float aimX, aimY; transient float aimX, aimY;
transient float originX, originY; transient float originX, originY;
transient float buildingDamageMultiplier;
transient @Nullable Mover mover; transient @Nullable Mover mover;
transient boolean absorbed, hit; transient boolean absorbed, hit;
transient @Nullable Trail trail; transient @Nullable Trail trail;