Merge branch 'master' of https://github.com/Anuken/Mindustry into tileable-logic-displays

# Conflicts:
#	core/assets/icons/icons.properties
#	core/assets/logicids.dat
This commit is contained in:
Anuken
2025-04-14 22:50:47 -04:00
494 changed files with 17743 additions and 9826 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

@@ -160,7 +160,9 @@ public class ErekirTechTree{
});
node(beamTower, Seq.with(new OnSector(peaks)), () -> {
node(beamLink, Seq.with(new OnSector(crossroads)), () -> {
});
});

View File

@@ -499,6 +499,14 @@ public class Fx{
}
}),
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;
@@ -519,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;
@@ -557,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;
@@ -564,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){
@@ -1121,7 +1174,7 @@ public class Fx{
artilleryTrail = new Effect(50, e -> {
color(e.color);
Fill.circle(e.x, e.y, e.rotation * e.fout());
}),
}).layer(Layer.bullet - 0.01f),
incendTrail = new Effect(50, e -> {
color(Pal.lightOrange);
@@ -1421,6 +1474,12 @@ public class Fx{
Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f));
}),
podLandShockwave = new Effect(12f, 80f, e -> {
color(Pal.accent);
stroke(e.fout() * 2f + 0.2f);
Lines.circle(e.x, e.y, e.fin() * 26f);
}),
explosion = new Effect(30, e -> {
e.scaled(7, i -> {
stroke(3f * i.fout());
@@ -1571,6 +1630,15 @@ public class Fx{
});
}),
steamCoolSmoke = new Effect(35f, e -> {
color(Pal.water, Color.lightGray, e.fin(Interp.pow2Out));
alpha(e.fout(Interp.pow3Out));
randLenVectors(e.id, 4, e.finpow() * 7f, e.rotation, 30f, (x, y) -> {
Fill.circle(e.x + x, e.y + y, Math.max(e.fout(), Math.min(1f, e.fin() * 8f)) * 2.8f);
});
}),
smokePuff = new Effect(30, e -> {
color(e.color);
@@ -1737,6 +1805,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);
@@ -2399,6 +2479,12 @@ public class Fx{
});
}),
launchAccelerator = new Effect(22, e -> {
color(Pal.accent);
stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 4f + e.finpow() * 160f);
}),
launch = new Effect(28, e -> {
color(Pal.command);
stroke(e.fout() * 2f);
@@ -2503,6 +2589,13 @@ public class Fx{
Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 8f * rand.random(0.6f, 1f) * e.fout(0.2f));
}).layer(Layer.groundUnit + 1f),
podLandDust = new Effect(70f, e -> {
color(e.color, e.fout(0.1f));
rand.setSeed(e.id);
Tmp.v1.trns(e.rotation, e.finpow() * 35f * rand.random(0.2f, 1f));
Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 5f * rand.random(0.6f, 1f) * e.fout(0.2f));
}).layer(Layer.groundUnit + 1f),
unitShieldBreak = new Effect(35, e -> {
if(!(e.data instanceof Unit unit)) return;

View File

@@ -87,12 +87,13 @@ public class Planets{
};
campaignRuleDefaults.fog = true;
campaignRuleDefaults.showSpawns = true;
campaignRuleDefaults.rtsAI = true;
unlockedOnLand.add(Blocks.coreBastion);
}};
//TODO names
gier = makeAsteroid("gier", erekir, Blocks.ferricStoneWall, Blocks.carbonWall, 0.4f, 7, 1f, gen -> {
gier = makeAsteroid("gier", erekir, Blocks.ferricStoneWall, Blocks.carbonWall, -5, 0.4f, 7, 1f, gen -> {
gen.min = 25;
gen.max = 35;
gen.carbonChance = 0.6f;
@@ -100,7 +101,7 @@ public class Planets{
gen.berylChance = 0.1f;
});
notva = makeAsteroid("notva", sun, Blocks.ferricStoneWall, Blocks.beryllicStoneWall, 0.55f, 9, 1.3f, gen -> {
notva = makeAsteroid("notva", sun, Blocks.ferricStoneWall, Blocks.beryllicStoneWall, -4, 0.55f, 9, 1.3f, gen -> {
gen.berylChance = 0.8f;
gen.iceChance = 0f;
gen.carbonChance = 0.01f;
@@ -134,6 +135,7 @@ public class Planets{
launchCapacityMultiplier = 0.5f;
sectorSeed = 2;
allowWaves = true;
allowLegacyLaunchPads = true;
allowWaveSimulation = true;
allowSectorInvasion = true;
allowLaunchSchematics = true;
@@ -147,16 +149,18 @@ public class Planets{
r.showSpawns = false;
r.coreDestroyClear = true;
};
showRtsAIRule = true;
iconColor = Color.valueOf("7d4dff");
atmosphereColor = Color.valueOf("3c1b8f");
atmosphereRadIn = 0.02f;
atmosphereRadOut = 0.3f;
startSector = 15;
alwaysUnlocked = true;
allowSelfSectorLaunch = true;
landCloudColor = Pal.spore.cpy().a(0.5f);
}};
verilus = makeAsteroid("verlius", sun, Blocks.stoneWall, Blocks.iceWall, 0.5f, 12, 2f, gen -> {
verilus = makeAsteroid("verlius", sun, Blocks.stoneWall, Blocks.iceWall, -1, 0.5f, 12, 2f, gen -> {
gen.berylChance = 0f;
gen.iceChance = 0.6f;
gen.carbonChance = 0.1f;
@@ -164,7 +168,7 @@ public class Planets{
});
}
private static Planet makeAsteroid(String name, Planet parent, Block base, Block tint, float tintThresh, int pieces, float scale, Cons<AsteroidGenerator> cgen){
private static Planet makeAsteroid(String name, Planet parent, Block base, Block tint, int seed, float tintThresh, int pieces, float scale, Cons<AsteroidGenerator> cgen){
return new Planet(name, parent, 0.12f){{
hasAtmosphere = false;
updateLighting = false;
@@ -187,13 +191,13 @@ public class Planets{
Rand rand = new Rand(id + 2);
meshes.add(new NoiseMesh(
this, 0, 2, radius, 2, 0.55f, 0.45f, 14f,
this, seed, 2, radius, 2, 0.55f, 0.45f, 14f,
color, tinted, 3, 0.6f, 0.38f, tintThresh
));
for(int j = 0; j < pieces; j++){
meshes.add(new MatMesh(
new NoiseMesh(this, j + 1, 1, 0.022f + rand.random(0.039f) * scale, 2, 0.6f, 0.38f, 20f,
new NoiseMesh(this, seed + j + 1, 1, 0.022f + rand.random(0.039f) * scale, 2, 0.6f, 0.38f, 20f,
color, tinted, 3, 0.6f, 0.38f, tintThresh),
new Mat3D().setToTranslation(Tmp.v31.setToRandomDirection(rand).setLength(rand.random(0.44f, 1.4f) * scale)))
);

View File

@@ -106,7 +106,7 @@ public class SectorPresets{
difficulty = 8;
}};
frontier = new SectorPreset("frontier", serpulo, 203){{
frontier = new SectorPreset("frontier", serpulo, 50){{
difficulty = 4;
}};

View File

@@ -19,11 +19,12 @@ public class SerpuloTechTree{
node(junction, () -> {
node(router, () -> {
node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> {
//no longer necessary to beat the campaign
//node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> {
node(advancedLaunchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> {
node(landingPad, () -> {
node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> {
//});
});
});
});
node(distributor);
@@ -146,7 +147,7 @@ public class SerpuloTechTree{
});
});
node(kiln, Seq.with(new SectorComplete(craters)), () -> {
node(kiln, Seq.with(new OnSector(craters)), () -> {
node(pulverizer, () -> {
node(incinerator, () -> {
node(melter, () -> {
@@ -435,8 +436,8 @@ public class SerpuloTechTree{
});
});
node(additiveReconstructor, Seq.with(new SectorComplete(biomassFacility)), () -> {
node(multiplicativeReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> {
node(additiveReconstructor, Seq.with(new SectorComplete(craters)), () -> {
node(multiplicativeReconstructor, Seq.with(new SectorComplete(frontier)), () -> {
node(exponentialReconstructor, () -> {
node(tetrativeReconstructor, () -> {
@@ -457,14 +458,58 @@ public class SerpuloTechTree{
new Research(mender),
new Research(combustionGenerator)
), () -> {
node(frontier, Seq.with(
node(fungalPass, Seq.with(
new SectorComplete(craters),
new Research(groundFactory),
new Research(airFactory),
new Research(thermalGenerator),
new Research(dagger),
new Research(mono)
new Research(dagger)
), () -> {
node(frontier, Seq.with(
new SectorComplete(biomassFacility),
new SectorComplete(fungalPass),
new Research(groundFactory),
new Research(airFactory),
new Research(additiveReconstructor),
new Research(mace),
new Research(mono)
), () -> {
node(overgrowth, Seq.with(
new SectorComplete(frontier),
new SectorComplete(windsweptIslands),
new Research(multiplicativeReconstructor),
new Research(fortress),
new Research(ripple),
new Research(salvo),
new Research(cultivator),
new Research(sporePress)
), () -> {
node(mycelialBastion, Seq.with(
new Research(atrax),
new Research(spiroct),
new Research(arkyid),
new Research(multiplicativeReconstructor),
new Research(exponentialReconstructor)
), () -> {
});
node(atolls, Seq.with(
new SectorComplete(windsweptIslands),
new Research(multiplicativeReconstructor),
new Research(mega)
), () -> {
});
});
});
node(taintedWoods, Seq.with(
new SectorComplete(biomassFacility),
new SectorComplete(fungalPass),
new Research(Items.sporePod),
new Research(wave)
), () -> {
});
});
node(ruinousShores, Seq.with(
@@ -482,6 +527,8 @@ public class SerpuloTechTree{
), () -> {
node(seaPort, Seq.with(
new SectorComplete(biomassFacility),
new SectorComplete(frontier),
new SectorComplete(fungalPass),
new Research(navalFactory),
new Research(risso),
new Research(retusa),
@@ -523,7 +570,7 @@ public class SerpuloTechTree{
new Research(sei),
new Research(omura),
new Research(spectre),
new Research(launchPad),
new Research(advancedLaunchPad),
new Research(massDriver),
new Research(impactReactor),
new Research(additiveReconstructor),
@@ -564,6 +611,7 @@ public class SerpuloTechTree{
), () -> {
node(extractionOutpost, Seq.with(
new SectorComplete(windsweptIslands),
new SectorComplete(fungalPass),
new SectorComplete(facility32m),
new Research(groundFactory),
new Research(nova),
@@ -591,6 +639,8 @@ public class SerpuloTechTree{
node(saltFlats, Seq.with(
new SectorComplete(windsweptIslands),
new SectorComplete(fungalPass),
new SectorComplete(frontier),
new Research(groundFactory),
new Research(additiveReconstructor),
new Research(airFactory),
@@ -636,33 +686,6 @@ public class SerpuloTechTree{
});
});
});
node(overgrowth, Seq.with(
new SectorComplete(craters),
new SectorComplete(fungalPass),
new Research(cultivator),
new Research(sporePress),
new Research(additiveReconstructor),
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)
), () -> {
});
});
});
node(biomassFacility, Seq.with(
@@ -672,34 +695,23 @@ 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),
new Research(siliconSmelter)
), () -> {
node(fungalPass, Seq.with(
new SectorComplete(stainedMountains),
new Research(groundFactory),
new Research(door)
//TODO bad order
node(infestedCanyons, Seq.with(
new SectorComplete(fungalPass),
new SectorComplete(frontier),
new Research(navalFactory),
new Research(risso),
new Research(minke),
new Research(additiveReconstructor)
), () -> {
node(infestedCanyons, Seq.with(
new SectorComplete(fungalPass),
new Research(navalFactory),
new Research(risso),
new Research(minke),
new Research(additiveReconstructor)
), () -> {
});
//TODO difficulty jump!
node(nuclearComplex, Seq.with(
new SectorComplete(fungalPass),
new Research(thermalGenerator),
@@ -710,6 +722,8 @@ public class SerpuloTechTree{
});
});
});
});
});

View File

@@ -99,6 +99,7 @@ public class TechTree{
public TechNode(@Nullable TechNode parent, UnlockableContent content, ItemStack[] requirements){
if(parent != null){
parent.children.add(this);
planet = parent.planet;
researchCostMultipliers = parent.researchCostMultipliers;
}else if(researchCostMultipliers == null){
researchCostMultipliers = new ObjectFloatMap<>();

View File

@@ -98,6 +98,7 @@ public class UnitTypes{
//region ground attack
dagger = new UnitType("dagger"){{
researchCostMultiplier = 0.5f;
speed = 0.5f;
hitSize = 8f;
health = 150;
@@ -606,11 +607,12 @@ public class UnitTypes{
//region ground legs
crawler = new UnitType("crawler"){{
researchCostMultiplier = 0.5f;
aiController = SuicideAI::new;
speed = 1f;
hitSize = 8f;
health = 200;
health = 150;
mechSideSway = 0.25f;
range = 40f;
ammoType = new ItemAmmoType(Items.coal);
@@ -629,12 +631,12 @@ public class UnitTypes{
collides = false;
hitSound = Sounds.explosion;
rangeOverride = 30f;
rangeOverride = 25f;
hitEffect = Fx.pulverize;
speed = 0f;
splashDamageRadius = 55f;
splashDamageRadius = 44f;
instantDisappear = true;
splashDamage = 90f;
splashDamage = 80f;
killShooter = true;
hittable = false;
collidesAir = true;
@@ -977,6 +979,7 @@ public class UnitTypes{
//region air attack
flare = new UnitType("flare"){{
researchCostMultiplier = 0.5f;
speed = 2.7f;
accel = 0.08f;
drag = 0.04f;
@@ -1017,6 +1020,7 @@ public class UnitTypes{
engineOffset = 7.8f;
range = 140f;
faceTarget = false;
autoDropBombs = true;
armor = 3f;
itemCapacity = 0;
targetFlags = new BlockFlag[]{BlockFlag.factory, null};
@@ -1390,6 +1394,7 @@ public class UnitTypes{
drag = 0.017f;
lowAltitude = false;
flying = true;
autoDropBombs = true;
circleTarget = true;
engineOffset = 13f;
engineSize = 7f;
@@ -1908,6 +1913,7 @@ public class UnitTypes{
mixColorTo = Color.white;
hitSound = Sounds.plasmaboom;
underwater = true;
ejectEffect = Fx.none;
hitSize = 22f;
@@ -3280,6 +3286,7 @@ public class UnitTypes{
}});
weapons.add(new Weapon(){{
shootSound = Sounds.none;
shootCone = 360f;
mirror = false;
reload = 1f;
@@ -3301,7 +3308,7 @@ public class UnitTypes{
tecta = new ErekirUnitType("tecta"){{
drag = 0.1f;
speed = 0.6f;
hitSize = 23f;
hitSize = 30f;
health = 7300;
armor = 5f;
@@ -3576,6 +3583,7 @@ public class UnitTypes{
elude = new ErekirUnitType("elude"){{
hovering = true;
canDrown = false;
shadowElevation = 0.1f;
drag = 0.07f;
@@ -3862,6 +3870,7 @@ public class UnitTypes{
loopSoundVolume = 0.1f;
weapons.add(new Weapon(){{
shootSound = Sounds.none;
shootCone = 360f;
mirror = false;
reload = 1f;