mirror of
https://github.com/Anuken/Mindustry.git
synced 2026-01-26 22:42:41 -08:00
Surge Alloy can be first obtained on the "Ravine" map. Thorium can be first obtained on the "Caldera" map. The "Ravine" map must be unlocked and completed before the "Caldera" map can be accessed. Since Surge Alloy isn't required to produce Thorium (and vice versa), they should appear at the same level of the tech tree, under Tungsten. Signed-off-by: Gerald Elder-Vass <geraldev@hotmail.co.uk>
462 lines
19 KiB
Java
462 lines
19 KiB
Java
package mindustry.content;
|
|
|
|
import arc.struct.*;
|
|
import arc.util.*;
|
|
import mindustry.entities.bullet.*;
|
|
import mindustry.game.Objectives.*;
|
|
import mindustry.type.*;
|
|
import mindustry.type.unit.*;
|
|
import mindustry.world.blocks.defense.turrets.*;
|
|
|
|
import static mindustry.Vars.*;
|
|
import static mindustry.content.Blocks.*;
|
|
import static mindustry.content.SectorPresets.*;
|
|
import static mindustry.content.TechTree.*;
|
|
|
|
public class ErekirTechTree{
|
|
static IntSet balanced = new IntSet();
|
|
|
|
static void rebalanceBullet(BulletType bullet){
|
|
if(balanced.add(bullet.id)){
|
|
bullet.damage *= 0.75f;
|
|
}
|
|
}
|
|
|
|
//TODO remove this
|
|
public static void rebalance(){
|
|
for(var unit : content.units().select(u -> u instanceof ErekirUnitType)){
|
|
for(var weapon : unit.weapons){
|
|
rebalanceBullet(weapon.bullet);
|
|
}
|
|
}
|
|
|
|
for(var block : content.blocks()){
|
|
if(block instanceof Turret turret && Structs.contains(block.requirements, i -> !Items.serpuloItems.contains(i.item))){
|
|
if(turret instanceof ItemTurret item){
|
|
for(var bullet : item.ammoTypes.values()){
|
|
rebalanceBullet(bullet);
|
|
}
|
|
}else if(turret instanceof ContinuousLiquidTurret cont){
|
|
for(var bullet : cont.ammoTypes.values()){
|
|
rebalanceBullet(bullet);
|
|
}
|
|
}else if(turret instanceof ContinuousTurret cont){
|
|
rebalanceBullet(cont.shootType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void load(){
|
|
rebalance();
|
|
|
|
//TODO might be unnecessary with no asteroids
|
|
Seq<Objective> erekirSector = Seq.with(new OnPlanet(Planets.erekir));
|
|
|
|
var costMultipliers = new ObjectFloatMap<Item>();
|
|
for(var item : content.items()) costMultipliers.put(item, 0.9f);
|
|
|
|
//these are hard to make
|
|
costMultipliers.put(Items.oxide, 0.5f);
|
|
costMultipliers.put(Items.surgeAlloy, 0.7f);
|
|
costMultipliers.put(Items.carbide, 0.3f);
|
|
costMultipliers.put(Items.phaseFabric, 0.2f);
|
|
|
|
Planets.erekir.techTree = nodeRoot("erekir", coreBastion, true, () -> {
|
|
context().researchCostMultipliers = costMultipliers;
|
|
|
|
node(duct, erekirSector, () -> {
|
|
node(ductRouter, () -> {
|
|
node(ductBridge, () -> {
|
|
node(armoredDuct, () -> {
|
|
node(surgeConveyor, () -> {
|
|
node(surgeRouter);
|
|
});
|
|
});
|
|
|
|
node(unitCargoLoader, () -> {
|
|
node(unitCargoUnloadPoint, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(overflowDuct, Seq.with(new OnSector(aegis)), () -> {
|
|
node(underflowDuct);
|
|
node(reinforcedContainer, () -> {
|
|
node(ductUnloader, () -> {
|
|
|
|
});
|
|
|
|
node(reinforcedVault, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(reinforcedMessage, Seq.with(new OnSector(aegis)), () -> {
|
|
node(canvas);
|
|
});
|
|
});
|
|
|
|
node(reinforcedPayloadConveyor, Seq.with(new OnSector(atlas)), () -> {
|
|
//TODO should only be unlocked in unit sector
|
|
node(payloadMassDriver, Seq.with(new Research(siliconArcFurnace), new OnSector(split)), () -> {
|
|
//TODO further limitations
|
|
node(payloadLoader, () -> {
|
|
node(payloadUnloader, () -> {
|
|
node(largePayloadMassDriver, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(constructor, Seq.with(new OnSector(split)), () -> {
|
|
node(smallDeconstructor, Seq.with(new OnSector(peaks)), () -> {
|
|
node(largeConstructor, Seq.with(new OnSector(siege)), () -> {
|
|
|
|
});
|
|
|
|
node(deconstructor, Seq.with(new OnSector(siege)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(reinforcedPayloadRouter, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
//TODO move into turbine condenser?
|
|
node(plasmaBore, () -> {
|
|
node(impactDrill, Seq.with(new OnSector(aegis)), () -> {
|
|
node(largePlasmaBore, Seq.with(new OnSector(caldera)), () -> {
|
|
node(eruptionDrill, Seq.with(new OnSector(stronghold)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(turbineCondenser, () -> {
|
|
node(beamNode, () -> {
|
|
node(ventCondenser, Seq.with(new OnSector(aegis)), () -> {
|
|
node(chemicalCombustionChamber, Seq.with(new OnSector(basin)), () -> {
|
|
node(pyrolysisGenerator, Seq.with(new OnSector(crevice)), () -> {
|
|
node(fluxReactor, Seq.with(new OnSector(crossroads), new Research(cyanogenSynthesizer)), () -> {
|
|
node(neoplasiaReactor, Seq.with(new OnSector(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(beamTower, Seq.with(new OnSector(peaks)), () -> {
|
|
|
|
});
|
|
|
|
|
|
node(regenProjector, Seq.with(new OnSector(peaks)), () -> {
|
|
//TODO more tiers of build tower or "support" structures like overdrive projectors
|
|
node(buildTower, Seq.with(new OnSector(stronghold)), () -> {
|
|
node(shockwaveTower, Seq.with(new OnSector(siege)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(reinforcedConduit, Seq.with(new OnSector(aegis)), () -> {
|
|
//TODO maybe should be even later
|
|
node(reinforcedPump, Seq.with(new OnSector(basin)), () -> {
|
|
//TODO T2 pump, consume cyanogen or similar
|
|
});
|
|
|
|
node(reinforcedLiquidJunction, () -> {
|
|
node(reinforcedBridgeConduit, () -> {
|
|
|
|
});
|
|
|
|
node(reinforcedLiquidRouter, () -> {
|
|
node(reinforcedLiquidContainer, () -> {
|
|
node(reinforcedLiquidTank, Seq.with(new SectorComplete(intersect)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(cliffCrusher, () -> {
|
|
node(siliconArcFurnace, () -> {
|
|
node(electrolyzer, Seq.with(new OnSector(atlas)), () -> {
|
|
node(oxidationChamber, Seq.with(new Research(tankRefabricator), new OnSector(marsh)), () -> {
|
|
|
|
node(surgeCrucible, Seq.with(new OnSector(ravine)), () -> {
|
|
|
|
});
|
|
node(heatRedirector, Seq.with(new OnSector(ravine)), () -> {
|
|
node(electricHeater, Seq.with(new OnSector(ravine), new Research(afflict)), () -> {
|
|
node(slagHeater, Seq.with(new OnSector(caldera)), () -> {
|
|
|
|
});
|
|
|
|
node(atmosphericConcentrator, Seq.with(new OnSector(caldera)), () -> {
|
|
node(cyanogenSynthesizer, Seq.with(new OnSector(siege)), () -> {
|
|
|
|
});
|
|
});
|
|
|
|
node(carbideCrucible, Seq.with(new OnSector(crevice)), () -> {
|
|
node(phaseSynthesizer, Seq.with(new OnSector(karst)), () -> {
|
|
node(phaseHeater, Seq.with(new Research(phaseSynthesizer)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(heatRouter, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(slagIncinerator, Seq.with(new OnSector(basin)), () -> {
|
|
|
|
//TODO these are unused.
|
|
//node(slagCentrifuge, () -> {});
|
|
//node(heatReactor, () -> {});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
node(breach, Seq.with(new Research(siliconArcFurnace), new Research(tankFabricator)), () -> {
|
|
node(berylliumWall, () -> {
|
|
node(berylliumWallLarge, () -> {
|
|
|
|
});
|
|
|
|
node(tungstenWall, () -> {
|
|
node(tungstenWallLarge, () -> {
|
|
node(blastDoor, () -> {
|
|
|
|
});
|
|
});
|
|
|
|
node(reinforcedSurgeWall, () -> {
|
|
node(reinforcedSurgeWallLarge, () -> {
|
|
node(shieldedWall, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(carbideWall, () -> {
|
|
node(carbideWallLarge, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(diffuse, Seq.with(new OnSector(lake)), () -> {
|
|
node(sublimate, Seq.with(new OnSector(marsh)), () -> {
|
|
node(afflict, Seq.with(new OnSector(ravine)), () -> {
|
|
node(titan, Seq.with(new OnSector(stronghold)), () -> {
|
|
node(lustre, Seq.with(new OnSector(crevice)), () -> {
|
|
node(smite, Seq.with(new OnSector(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(disperse, Seq.with(new OnSector(stronghold)), () -> {
|
|
node(scathe, Seq.with(new OnSector(siege)), () -> {
|
|
node(malign, Seq.with(new SectorComplete(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
node(radar, Seq.with(new Research(beamNode), new Research(turbineCondenser), new Research(tankFabricator), new OnSector(SectorPresets.aegis)), () -> {
|
|
|
|
});
|
|
});
|
|
|
|
node(coreCitadel, Seq.with(new SectorComplete(peaks)), () -> {
|
|
node(coreAcropolis, Seq.with(new SectorComplete(siege)), () -> {
|
|
|
|
});
|
|
});
|
|
|
|
node(tankFabricator, Seq.with(new Research(siliconArcFurnace), new Research(plasmaBore), new Research(turbineCondenser)), () -> {
|
|
node(UnitTypes.stell);
|
|
|
|
node(unitRepairTower, Seq.with(new OnSector(ravine), new Research(mechRefabricator)), () -> {
|
|
|
|
});
|
|
|
|
node(shipFabricator, Seq.with(new OnSector(lake)), () -> {
|
|
node(UnitTypes.elude);
|
|
|
|
node(mechFabricator, Seq.with(new OnSector(intersect)), () -> {
|
|
node(UnitTypes.merui);
|
|
|
|
node(tankRefabricator, Seq.with(new OnSector(atlas)), () -> {
|
|
node(UnitTypes.locus);
|
|
|
|
node(mechRefabricator, Seq.with(new OnSector(basin)), () -> {
|
|
node(UnitTypes.cleroi);
|
|
|
|
node(shipRefabricator, Seq.with(new OnSector(peaks)), () -> {
|
|
node(UnitTypes.avert);
|
|
|
|
//TODO
|
|
node(primeRefabricator, Seq.with(new OnSector(stronghold)), () -> {
|
|
node(UnitTypes.precept);
|
|
node(UnitTypes.anthicus);
|
|
node(UnitTypes.obviate);
|
|
});
|
|
|
|
node(tankAssembler, Seq.with(new OnSector(siege), new Research(constructor), new Research(atmosphericConcentrator)), () -> {
|
|
|
|
node(UnitTypes.vanquish, () -> {
|
|
node(UnitTypes.conquer, Seq.with(new OnSector(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
|
|
node(shipAssembler, Seq.with(new OnSector(crossroads)), () -> {
|
|
node(UnitTypes.quell, () -> {
|
|
node(UnitTypes.disrupt, Seq.with(new OnSector(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(mechAssembler, Seq.with(new OnSector(crossroads)), () -> {
|
|
node(UnitTypes.tecta, () -> {
|
|
node(UnitTypes.collaris, Seq.with(new OnSector(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
node(basicAssemblerModule, Seq.with(new SectorComplete(karst)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(onset, () -> {
|
|
node(aegis, Seq.with(new SectorComplete(onset), new Research(ductRouter), new Research(ductBridge)), () -> {
|
|
node(lake, Seq.with(new SectorComplete(aegis)), () -> {
|
|
|
|
});
|
|
|
|
node(intersect, Seq.with(new SectorComplete(aegis), new SectorComplete(lake), new Research(ventCondenser), new Research(shipFabricator)), () -> {
|
|
node(atlas, Seq.with(new SectorComplete(intersect), new Research(mechFabricator)), () -> {
|
|
node(split, Seq.with(new SectorComplete(atlas), new Research(reinforcedPayloadConveyor), new Research(reinforcedContainer)), () -> {
|
|
|
|
});
|
|
|
|
node(basin, Seq.with(new SectorComplete(atlas)), () -> {
|
|
node(marsh, Seq.with(new SectorComplete(basin)), () -> {
|
|
node(ravine, Seq.with(new SectorComplete(marsh), new Research(Liquids.slag)), () -> {
|
|
node(caldera, Seq.with(new SectorComplete(peaks), new Research(heatRedirector)), () -> {
|
|
node(stronghold, Seq.with(new SectorComplete(caldera), new Research(coreCitadel)), () -> {
|
|
node(crevice, Seq.with(new SectorComplete(stronghold)), () -> {
|
|
node(siege, Seq.with(new SectorComplete(crevice)), () -> {
|
|
node(crossroads, Seq.with(new SectorComplete(siege)), () -> {
|
|
node(karst, Seq.with(new SectorComplete(crossroads), new Research(coreAcropolis)), () -> {
|
|
node(origin, Seq.with(new SectorComplete(karst), new Research(coreAcropolis), new Research(UnitTypes.vanquish), new Research(UnitTypes.disrupt), new Research(UnitTypes.collaris), new Research(malign), new Research(basicAssemblerModule), new Research(neoplasiaReactor)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
node(peaks, Seq.with(new SectorComplete(marsh), new SectorComplete(split)), () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
nodeProduce(Items.beryllium, () -> {
|
|
nodeProduce(Items.sand, () -> {
|
|
nodeProduce(Items.silicon, () -> {
|
|
nodeProduce(Items.oxide, () -> {
|
|
//nodeProduce(Items.fissileMatter, () -> {});
|
|
});
|
|
});
|
|
});
|
|
|
|
nodeProduce(Liquids.water, () -> {
|
|
nodeProduce(Liquids.ozone, () -> {
|
|
nodeProduce(Liquids.hydrogen, () -> {
|
|
nodeProduce(Liquids.nitrogen, () -> {
|
|
|
|
});
|
|
|
|
nodeProduce(Liquids.cyanogen, () -> {
|
|
nodeProduce(Liquids.neoplasm, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
nodeProduce(Items.graphite, () -> {
|
|
nodeProduce(Items.tungsten, () -> {
|
|
nodeProduce(Liquids.slag, () -> {
|
|
|
|
});
|
|
|
|
nodeProduce(Liquids.arkycite, () -> {
|
|
|
|
});
|
|
|
|
nodeProduce(Items.thorium, () -> {
|
|
nodeProduce(Items.carbide, () -> {
|
|
|
|
//nodeProduce(Liquids.gallium, () -> {});
|
|
});
|
|
});
|
|
|
|
nodeProduce(Items.surgeAlloy, () -> {
|
|
nodeProduce(Items.phaseFabric, () -> {
|
|
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|