Merge branch 'master' into balancing_burst-drill-optional-multiplier

This commit is contained in:
SomeonesShade
2025-01-22 17:46:10 +08:00
committed by GitHub
329 changed files with 9170 additions and 3995 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ import mindustry.entities.bullet.*;
public class Bullets{
public static BulletType
placeholder, spaceLiquid, damageLightning, damageLightningGround, fireball;
placeholder, spaceLiquid, damageLightning, damageLightningGround, damageLightningAir, fireball;
public static void load(){
@@ -37,6 +37,10 @@ public class Bullets{
damageLightningGround = damageLightning.copy();
damageLightningGround.collidesAir = false;
damageLightningAir = damageLightning.copy();
damageLightningAir.collidesGround = false;
damageLightningAir.collidesTiles = false;
fireball = new FireBulletType(1f, 4){{
hittable = false;
}};

View File

@@ -137,6 +137,10 @@ public class ErekirTechTree{
node(eruptionDrill, Seq.with(new OnSector(stronghold)), () -> {
});
node(largeCliffCrusher, Seq.with(new OnSector(stronghold)), () -> {
});
});
});
});
@@ -220,7 +224,9 @@ public class ErekirTechTree{
});
node(heatRouter, () -> {
node(smallHeatRedirector, () -> {
});
});
});
});

View File

@@ -28,7 +28,7 @@ public class Fx{
public static final Effect
none = new Effect(0, 0f, e -> {}),
blockCrash = new Effect(90f, e -> {
if(!(e.data instanceof Block block)) return;
@@ -445,6 +445,20 @@ public class Fx{
}
}),
titanExplosionLarge = new Effect(45f, 220f, e -> {
color(e.color);
stroke(e.fout() * 3f);
float circleRad = 6f + e.finpow() * 110f;
Lines.circle(e.x, e.y, circleRad);
rand.setSeed(e.id);
for(int i = 0; i < 21; i++){
float angle = rand.random(360f);
float lenRand = rand.random(0.5f, 1f);
Lines.lineAngle(e.x, e.y, angle, e.foutpow() * 50f * rand.random(1f, 0.6f) + 2f, e.finpow() * 100f * lenRand + 6f);
}
}),
titanSmoke = new Effect(300f, 300f, b -> {
float intensity = 3f;
@@ -465,6 +479,34 @@ public class Fx{
}
}),
titanSmokeLarge = new Effect(400f, 400f, b -> {
float intensity = 4f;
color(b.color, 0.65f);
for(int i = 0; i < 4; i++){
rand.setSeed(b.id*2 + i);
float lenScl = rand.random(0.5f, 1f);
int fi = i;
b.scaled(b.lifetime * lenScl, e -> {
randLenVectors(e.id + fi - 1, e.fin(Interp.pow10Out), (int)(2.9f * intensity), 26f * intensity, (x, y, in, out) -> {
float fout = e.fout(Interp.pow5Out) * rand.random(0.5f, 1f);
float rad = fout * ((2f + intensity) * 2.35f);
Fill.circle(e.x + x, e.y + y, rad);
Drawf.light(e.x + x, e.y + y, rad * 2.5f, b.color, 0.5f);
});
});
}
}),
smokeAoeCloud = new Effect(60f * 3f, 250f, e -> {
color(e.color, 0.65f);
randLenVectors(e.id, 80, 90f, (x, y) -> {
Fill.circle(e.x + x, e.y + y, 6f * Mathf.clamp(e.fin() / 0.1f) * Mathf.clamp(e.fout() / 0.1f));
});
}),
missileTrailSmoke = new Effect(180f, 300f, b -> {
float intensity = 2f;
@@ -485,6 +527,26 @@ public class Fx{
}
}).layer(Layer.bullet - 1f),
missileTrailSmokeSmall = new Effect(120f, 200f, b -> {
float intensity = 1.3f;
color(b.color, 0.7f);
for(int i = 0; i < 3; i++){
rand.setSeed(b.id*2 + i);
float lenScl = rand.random(0.5f, 1f);
int fi = i;
b.scaled(b.lifetime * lenScl, e -> {
randLenVectors(e.id + fi - 1, e.fin(Interp.pow10Out), (int)(2.9f * intensity), 13f * intensity, (x, y, in, out) -> {
float fout = e.fout(Interp.pow5Out) * rand.random(0.5f, 1f);
float rad = fout * ((2f + intensity) * 2.35f);
Fill.circle(e.x + x, e.y + y, rad);
Drawf.light(e.x + x, e.y + y, rad * 2.5f, b.color, 0.5f);
});
});
}
}).layer(Layer.bullet - 1f),
neoplasmSplat = new Effect(400f, 300f, b -> {
float intensity = 3f;
@@ -523,6 +585,24 @@ public class Fx{
}
}),
scatheExplosionSmall = new Effect(40f, 160f, e -> {
color(e.color);
stroke(e.fout() * 4f);
float circleRad = 6f + e.finpow() * 40f;
Lines.circle(e.x, e.y, circleRad);
rand.setSeed(e.id);
for(int i = 0; i < 16; i++){
float angle = rand.random(360f);
float lenRand = rand.random(0.5f, 1f);
Tmp.v1.trns(angle, circleRad);
for(int s : Mathf.signs){
Drawf.tri(e.x + Tmp.v1.x, e.y + Tmp.v1.y, e.foutpow() * 30f, e.fout() * 25f * lenRand + 6f, angle + 90f + s * 90f);
}
}
}),
scatheLight = new Effect(60f, 160f, e -> {
float circleRad = 6f + e.finpow() * 60f;
@@ -530,6 +610,13 @@ public class Fx{
Fill.circle(e.x, e.y, circleRad);
}).layer(Layer.bullet + 2f),
scatheLightSmall = new Effect(60f, 160f, e -> {
float circleRad = 6f + e.finpow() * 40f;
color(e.color, e.foutpow());
Fill.circle(e.x, e.y, circleRad);
}).layer(Layer.bullet + 2f),
scatheSlash = new Effect(40f, 160f, e -> {
Draw.color(e.color);
for(int s : Mathf.signs){
@@ -761,7 +848,7 @@ public class Fx{
Fill.circle(e.x + x, e.y + y, e.fout() * 2f);
});
}),
hitLaserBlast = new Effect(12, e -> {
color(e.color);
stroke(e.fout() * 1.5f);
@@ -1114,7 +1201,7 @@ public class Fx{
stroke(2f * e.fout());
Lines.circle(e.x, e.y, 5f * e.fout());
}),
forceShrink = new Effect(20, e -> {
color(e.color, e.fout());
if(renderer.animateShields){
@@ -1703,6 +1790,18 @@ public class Fx{
}
}),
shootSmokeMissileColor = new Effect(130f, 300f, e -> {
color(e.color);
alpha(0.5f);
rand.setSeed(e.id);
for(int i = 0; i < 35; i++){
v.trns(e.rotation + 180f + rand.range(21f), rand.random(e.finpow() * 90f)).add(rand.range(3f), rand.range(3f));
e.scaled(e.lifetime * rand.random(0.2f, 1f), b -> {
Fill.circle(e.x + v.x, e.y + v.y, b.fout() * 9f + 0.3f);
});
}
}),
regenParticle = new Effect(100f, e -> {
color(Pal.regen);

View File

@@ -60,7 +60,7 @@ public class Items{
}};
scrap = new Item("scrap", Color.valueOf("777777")){{
cost = 0.5f;
}};
silicon = new Item("silicon", Color.valueOf("53565c")){{

View File

@@ -65,7 +65,6 @@ public class Planets{
clearSectorOnLose = true;
defaultCore = Blocks.coreBastion;
iconColor = Color.valueOf("ff9266");
hiddenItems.addAll(Items.serpuloItems).removeAll(Items.erekirItems);
enemyBuildSpeedMultiplier = 0.4f;
//TODO disallowed for now
@@ -86,6 +85,8 @@ public class Planets{
r.coreDestroyClear = true;
r.onlyDepositCore = true;
};
campaignRuleDefaults.fog = true;
campaignRuleDefaults.showSpawns = true;
unlockedOnLand.add(Blocks.coreBastion);
}};
@@ -144,6 +145,7 @@ public class Planets{
r.waveTeam = Team.crux;
r.placeRangeCheck = false;
r.showSpawns = false;
r.coreDestroyClear = true;
};
iconColor = Color.valueOf("7d4dff");
atmosphereColor = Color.valueOf("3c1b8f");
@@ -152,7 +154,6 @@ public class Planets{
startSector = 15;
alwaysUnlocked = true;
landCloudColor = Pal.spore.cpy().a(0.5f);
hiddenItems.addAll(Items.erekirItems).removeAll(Items.serpuloItems);
}};
verilus = makeAsteroid("verlius", sun, Blocks.stoneWall, Blocks.iceWall, 0.5f, 12, 2f, gen -> {

View File

@@ -7,10 +7,12 @@ import static mindustry.content.Planets.*;
public class SectorPresets{
public static SectorPreset
groundZero,
craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields,
fungalPass, extractionOutpost, saltFlats, overgrowth,
craters, biomassFacility, taintedWoods, frozenForest, ruinousShores, facility32m, windsweptIslands, stainedMountains, tarFields,
frontier, fungalPass, infestedCanyons, atolls, mycelialBastion, extractionOutpost, saltFlats, testingGrounds, overgrowth, //polarAerodrome,
impact0078, desolateRift, nuclearComplex, planetaryTerminal,
coastline, navalFortress,
coastline, navalFortress, weatheredChannels, seaPort,
geothermalStronghold, cruxscape,
onset, aegis, lake, intersect, basin, atlas, split, marsh, peaks, ravine, caldera,
stronghold, crevice, siege, crossroads, karst, origin;
@@ -32,6 +34,11 @@ public class SectorPresets{
difficulty = 5;
}};
testingGrounds = new SectorPreset("testingGrounds", serpulo, 3){{
difficulty = 7;
captureWave = 33;
}};
frozenForest = new SectorPreset("frozenForest", serpulo, 86){{
captureWave = 15;
difficulty = 2;
@@ -42,6 +49,11 @@ public class SectorPresets{
difficulty = 3;
}};
taintedWoods = new SectorPreset("taintedWoods", serpulo, 221){{
captureWave = 33;
difficulty = 5;
}};
craters = new SectorPreset("craters", serpulo, 18){{
captureWave = 20;
difficulty = 2;
@@ -52,6 +64,15 @@ public class SectorPresets{
difficulty = 3;
}};
seaPort = new SectorPreset("seaPort", serpulo, 47){{
difficulty = 4;
}};
facility32m = new SectorPreset("facility32m", serpulo, 64){{
captureWave = 25;
difficulty = 4;
}};
windsweptIslands = new SectorPreset("windsweptIslands", serpulo, 246){{
captureWave = 30;
difficulty = 4;
@@ -66,19 +87,45 @@ public class SectorPresets{
difficulty = 5;
}};
//TODO: removed for now
//polarAerodrome = new SectorPreset("polarAerodrome", serpulo, 68){{
// difficulty = 7;
//}};
coastline = new SectorPreset("coastline", serpulo, 108){{
captureWave = 30;
difficulty = 5;
}};
navalFortress = new SectorPreset("navalFortress", serpulo, 216){{
weatheredChannels = new SectorPreset("weatheredChannels", serpulo, 39){{
captureWave = 40;
difficulty = 9;
}};
navalFortress = new SectorPreset("navalFortress", serpulo, 216){{
difficulty = 8;
}};
frontier = new SectorPreset("frontier", serpulo, 203){{
difficulty = 4;
}};
fungalPass = new SectorPreset("fungalPass", serpulo, 21){{
difficulty = 4;
}};
infestedCanyons = new SectorPreset("infestedCanyons", serpulo, 210){{
difficulty = 4;
}};
atolls = new SectorPreset("atolls", serpulo, 1){{
difficulty = 7;
}};
mycelialBastion = new SectorPreset("mycelialBastion", serpulo, 260){{
difficulty = 8;
}};
overgrowth = new SectorPreset("overgrowth", serpulo, 134){{
difficulty = 5;
}};
@@ -108,6 +155,14 @@ public class SectorPresets{
isLastSector = true;
}};
geothermalStronghold = new SectorPreset("geothermalStronghold", serpulo, 264){{
difficulty = 10;
}};
cruxscape = new SectorPreset("cruxscape", serpulo, 54){{
difficulty = 10;
}};
//endregion
//region erekir

View File

@@ -2,6 +2,7 @@ package mindustry.content;
import arc.struct.*;
import mindustry.game.Objectives.*;
import mindustry.type.*;
import static mindustry.content.Blocks.*;
import static mindustry.content.SectorPresets.craters;
@@ -122,7 +123,7 @@ public class SerpuloTechTree{
});
node(pyratiteMixer, () -> {
node(blastMixer, () -> {
node(blastMixer, Seq.with(new SectorComplete(facility32m)), () -> {
});
});
@@ -138,7 +139,7 @@ public class SerpuloTechTree{
});
});
node(plastaniumCompressor, Seq.with(new SectorComplete(windsweptIslands)), () -> {
node(plastaniumCompressor, Seq.with(new SectorComplete(windsweptIslands), new OnSector(tarFields)), () -> {
node(phaseWeaver, Seq.with(new SectorComplete(tarFields)), () -> {
});
@@ -261,12 +262,21 @@ public class SerpuloTechTree{
node(duo, () -> {
node(copperWall, () -> {
node(copperWallLarge, () -> {
node(scrapWall, () -> {
node(scrapWallLarge, () -> {
node(scrapWallHuge, () -> {
node(scrapWallGigantic);
});
});
});
node(titaniumWall, () -> {
node(titaniumWallLarge);
node(door, () -> {
node(doorLarge);
});
node(plastaniumWall, () -> {
node(plastaniumWallLarge, () -> {
@@ -359,11 +369,12 @@ public class SerpuloTechTree{
});
});
node(crawler, () -> {
//override research requirements to have graphite, not coal
node(crawler, ItemStack.with(Items.silicon, 400, Items.graphite, 400), () -> {
node(atrax, () -> {
node(spiroct, () -> {
node(arkyid, () -> {
node(toxopid, () -> {
node(toxopid, Seq.with(new SectorComplete(mycelialBastion)), () -> {
});
});
@@ -397,7 +408,7 @@ public class SerpuloTechTree{
});
});
node(navalFactory, Seq.with(new SectorComplete(ruinousShores)), () -> {
node(navalFactory, Seq.with(new OnSector(windsweptIslands)), () -> {
node(risso, () -> {
node(minke, () -> {
node(bryde, () -> {
@@ -425,8 +436,8 @@ public class SerpuloTechTree{
});
node(additiveReconstructor, Seq.with(new SectorComplete(biomassFacility)), () -> {
node(multiplicativeReconstructor, () -> {
node(exponentialReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> {
node(multiplicativeReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> {
node(exponentialReconstructor, () -> {
node(tetrativeReconstructor, () -> {
});
@@ -446,6 +457,16 @@ public class SerpuloTechTree{
new Research(mender),
new Research(combustionGenerator)
), () -> {
node(frontier, Seq.with(
new Research(groundFactory),
new Research(airFactory),
new Research(thermalGenerator),
new Research(dagger),
new Research(mono)
), () -> {
});
node(ruinousShores, Seq.with(
new SectorComplete(craters),
new Research(graphitePress),
@@ -459,6 +480,18 @@ public class SerpuloTechTree{
new Research(siliconSmelter),
new Research(steamGenerator)
), () -> {
node(seaPort, Seq.with(
new SectorComplete(biomassFacility),
new Research(navalFactory),
new Research(risso),
new Research(retusa),
new Research(steamGenerator),
new Research(cultivator),
new Research(coalCentrifuge)
), () -> {
});
node(tarFields, Seq.with(
new SectorComplete(windsweptIslands),
new Research(coalCentrifuge),
@@ -487,28 +520,73 @@ public class SerpuloTechTree{
new Research(risso),
new Research(minke),
new Research(bryde),
new Research(sei),
new Research(omura),
new Research(spectre),
new Research(launchPad),
new Research(massDriver),
new Research(impactReactor),
new Research(additiveReconstructor),
new Research(exponentialReconstructor)
new Research(exponentialReconstructor),
new Research(tetrativeReconstructor)
), () -> {
node(geothermalStronghold, Seq.with(
new Research(omura),
new Research(navanax),
new Research(eclipse),
new Research(oct),
new Research(reign),
new Research(corvus),
new Research(toxopid)
), () -> {
});
node(cruxscape, Seq.with(
new Research(omura),
new Research(navanax),
new Research(eclipse),
new Research(oct),
new Research(reign),
new Research(corvus),
new Research(toxopid)
), () -> {
});
});
});
});
});
node(extractionOutpost, Seq.with(
new SectorComplete(stainedMountains),
new SectorComplete(windsweptIslands),
new Research(groundFactory),
new Research(nova),
new Research(airFactory),
new Research(mono)
node(facility32m, Seq.with(
new Research(pneumaticDrill),
new SectorComplete(stainedMountains)
), () -> {
node(extractionOutpost, Seq.with(
new SectorComplete(windsweptIslands),
new SectorComplete(facility32m),
new Research(groundFactory),
new Research(nova),
new Research(airFactory),
new Research(mono)
), () -> {
//TODO: removed for now
/*node(polarAerodrome, Seq.with(
new SectorComplete(fungalPass),
new SectorComplete(desolateRift),
new SectorComplete(overgrowth),
new Research(multiplicativeReconstructor),
new Research(zenith),
new Research(swarmer),
new Research(cyclone),
new Research(blastDrill),
new Research(blastDrill),
new Research(massDriver)
), () -> {
});
*/
});
});
node(saltFlats, Seq.with(
@@ -518,21 +596,41 @@ public class SerpuloTechTree{
new Research(airFactory),
new Research(door)
), () -> {
node(testingGrounds, Seq.with(
new Research(cryofluidMixer),
new Research(Liquids.cryofluid),
new Research(waterExtractor),
new Research(ripple)
), () -> {
});
node(coastline, Seq.with(
new SectorComplete(windsweptIslands),
new SectorComplete(saltFlats),
new Research(navalFactory),
new Research(payloadConveyor)
), () -> {
node(navalFortress, Seq.with(
new SectorComplete(coastline),
new SectorComplete(extractionOutpost),
new Research(coreNucleus),
new Research(massDriver),
new Research(oxynoe),
new Research(minke),
new Research(bryde),
new Research(cyclone),
new Research(ripple)
), () -> {
node(weatheredChannels, Seq.with(
new SectorComplete(impact0078),
new Research(bryde),
new Research(surgeSmelter),
new Research(overdriveProjector)
), () -> {
});
});
});
});
@@ -548,7 +646,22 @@ public class SerpuloTechTree{
new Research(UnitTypes.mace),
new Research(UnitTypes.flare)
), () -> {
node(mycelialBastion, Seq.with(
new Research(atrax),
new Research(spiroct),
new Research(multiplicativeReconstructor),
new Research(exponentialReconstructor)
), () -> {
});
node(atolls, Seq.with(
new SectorComplete(windsweptIslands),
new Research(multiplicativeReconstructor),
new Research(mega)
), () -> {
});
});
});
@@ -559,6 +672,14 @@ public class SerpuloTechTree{
new Research(scatter),
new Research(graphitePress)
), () -> {
node(taintedWoods, Seq.with(
new SectorComplete(biomassFacility),
new Research(Items.sporePod),
new Research(wave)
), () -> {
});
node(stainedMountains, Seq.with(
new SectorComplete(biomassFacility),
new Research(pneumaticDrill),
@@ -569,6 +690,16 @@ public class SerpuloTechTree{
new Research(groundFactory),
new Research(door)
), () -> {
node(infestedCanyons, Seq.with(
new SectorComplete(fungalPass),
new Research(navalFactory),
new Research(risso),
new Research(minke),
new Research(additiveReconstructor)
), () -> {
});
node(nuclearComplex, Seq.with(
new SectorComplete(fungalPass),
new Research(thermalGenerator),

View File

@@ -61,12 +61,12 @@ public class StatusEffects{
color = Pal.lightishGray;
speedMultiplier = 0.4f;
init(() -> opposite(fast));
init(() -> opposite(fast));
}};
fast = new StatusEffect("fast"){{
color = Pal.boostTo;
speedMultiplier = 1.6f;
color = Pal.boostTo;
speedMultiplier = 1.6f;
init(() -> opposite(slow));
}};
@@ -89,7 +89,7 @@ public class StatusEffects{
opposite(burning, melting);
});
}};
muddy = new StatusEffect("muddy"){{
color = Color.valueOf("46382a");
speedMultiplier = 0.94f;

View File

@@ -139,6 +139,16 @@ public class TechTree{
}
}
/** Adds the specified database tab to all the content in this tree. */
public void addDatabaseTab(UnlockableContent tab){
each(node -> node.content.databaseTabs.add(tab));
}
/** Adds the specified planet to the shownPlanets of all the content in this tree. */
public void addPlanet(Planet planet){
each(node -> node.content.shownPlanets.add(planet));
}
public Drawable icon(){
return icon == null ? new TextureRegionDrawable(content.uiIcon) : icon;
}

View File

@@ -255,7 +255,7 @@ public class UnitTypes{
reign = new UnitType("reign"){{
speed = 0.4f;
hitSize = 26f;
hitSize = 30f;
rotateSpeed = 1.65f;
health = 24000;
armor = 18f;
@@ -322,7 +322,7 @@ public class UnitTypes{
speed = 0.55f;
hitSize = 8f;
health = 120f;
buildSpeed = 0.35f;
buildSpeed = 0.3f;
armor = 1f;
abilities.add(new RepairFieldAbility(10f, 60f * 4, 60f));
@@ -617,6 +617,7 @@ public class UnitTypes{
weapons.add(new Weapon(){{
shootOnDeath = true;
targetUnderBlocks = false;
reload = 24f;
shootCone = 180f;
ejectEffect = Fx.none;
@@ -1011,7 +1012,7 @@ public class UnitTypes{
accel = 0.08f;
drag = 0.016f;
flying = true;
hitSize = 10f;
hitSize = 11f;
targetAir = false;
engineOffset = 7.8f;
range = 140f;
@@ -1041,6 +1042,7 @@ public class UnitTypes{
status = StatusEffects.blasted;
statusDuration = 60f;
damage = splashDamage * 0.5f;
}};
}});
}};
@@ -1254,6 +1256,7 @@ public class UnitTypes{
controller = u -> new MinerAI();
defaultCommand = UnitCommand.mineCommand;
allowChangeCommands = false;
flying = true;
drag = 0.06f;
@@ -1445,6 +1448,7 @@ public class UnitTypes{
healPercent = 15f;
splashDamage = 220f;
splashDamageRadius = 80f;
damage = splashDamage * 0.7f;
}};
}});
}};
@@ -1831,7 +1835,6 @@ public class UnitTypes{
//region naval support
retusa = new UnitType("retusa"){{
speed = 0.9f;
targetAir = false;
drag = 0.14f;
hitSize = 11f;
health = 270;
@@ -1861,6 +1864,23 @@ public class UnitTypes{
}};
}});
weapons.add(new Weapon("retusa-weapon"){{
shootSound = Sounds.lasershoot;
reload = 22f;
x = 4.5f;
y = -3.5f;
rotateSpeed = 5f;
mirror = true;
rotate = true;
bullet = new LaserBoltBulletType(5.2f, 12){{
lifetime = 30f;
healPercent = 5.5f;
collidesTeam = true;
backColor = Pal.heal;
frontColor = Color.white;
}};
}});
weapons.add(new Weapon(){{
mirror = false;
rotate = true;
@@ -1912,7 +1932,7 @@ public class UnitTypes{
trailWidth = 3f;
trailLength = 8;
splashDamage = 33f;
splashDamage = 40f;
splashDamageRadius = 32f;
}};
}});
@@ -2346,7 +2366,8 @@ public class UnitTypes{
//region core
alpha = new UnitType("alpha"){{
aiController = BuilderAI::new;
aiController = () -> new BuilderAI(true, 400f);
controller = u -> u.team.isAI() ? aiController.get() : new CommandAI();
isEnemy = false;
lowAltitude = true;
@@ -2384,7 +2405,8 @@ public class UnitTypes{
}};
beta = new UnitType("beta"){{
aiController = BuilderAI::new;
aiController = () -> new BuilderAI(true, 400f);
controller = u -> u.team.isAI() ? aiController.get() : new CommandAI();
isEnemy = false;
flying = true;
@@ -2425,7 +2447,8 @@ public class UnitTypes{
}};
gamma = new UnitType("gamma"){{
aiController = BuilderAI::new;
aiController = () -> new BuilderAI(true, 400f);
controller = u -> u.team.isAI() ? aiController.get() : new CommandAI();
isEnemy = false;
lowAltitude = true;
@@ -2646,7 +2669,7 @@ public class UnitTypes{
width = 5f;
height = 7f;
lifetime = 15f;
hitSize = 4f;
hitSize = 4f;
pierceCap = 3;
pierce = true;
pierceBuilding = true;
@@ -3524,7 +3547,7 @@ public class UnitTypes{
trailWidth = 2.2f;
trailLength = 7;
trailChance = -1f;
collidesAir = false;
despawnEffect = Fx.none;