diff --git a/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator-bottom.png b/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator-bottom.png index 39be7e12d8..6799ee0e87 100644 Binary files a/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator-bottom.png and b/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator.png b/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator.png index 7cd2243279..a63c5c351a 100644 Binary files a/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator.png and b/core/assets-raw/sprites/blocks/drills/cliff-crusher-rotator.png differ diff --git a/core/assets-raw/sprites/blocks/drills/cliff-crusher-top.png b/core/assets-raw/sprites/blocks/drills/cliff-crusher-top.png index 051e61abfb..a5554ae6e1 100644 Binary files a/core/assets-raw/sprites/blocks/drills/cliff-crusher-top.png and b/core/assets-raw/sprites/blocks/drills/cliff-crusher-top.png differ diff --git a/core/assets-raw/sprites/blocks/drills/cliff-crusher.png b/core/assets-raw/sprites/blocks/drills/cliff-crusher.png index a98246695c..ba6e5f2a2e 100644 Binary files a/core/assets-raw/sprites/blocks/drills/cliff-crusher.png and b/core/assets-raw/sprites/blocks/drills/cliff-crusher.png differ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 4ab3d42d6d..c40c2da806 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4,7 +4,6 @@ import arc.graphics.*; import arc.math.*; import arc.struct.*; import mindustry.*; -import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.entities.effect.*; @@ -59,11 +58,12 @@ public class Blocks{ wallOreBeryl, graphiticWall, //crafting - siliconSmelter, siliconCrucible, siliconArcFurnace, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, + siliconSmelter, siliconCrucible, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge, //erekir - electrolyzer, oxidationChamber, atmosphericConcentrator, slagHeater, slagIncinerator, heatReactor, carbideCrucible, slagCentrifuge, surgeCrucible, cyanogenSynthesizer, phaseSynthesizer, + siliconArcFurnace, electrolyzer, oxidationChamber, atmosphericConcentrator, slagHeater, slagIncinerator, heatReactor, + carbideCrucible, slagCentrifuge, surgeCrucible, cyanogenSynthesizer, phaseSynthesizer, cellSynthesisChamber, //sandbox @@ -726,9 +726,8 @@ public class Blocks{ consumes.power(4f); }}; - //TODO siliconArcFurnace = new GenericCrafter("silicon-arc-furnace"){{ - requirements(Category.crafting, with(Items.thorium, 200, Items.beryllium, 40, Items.tungsten, 80)); + requirements(Category.crafting, with(Items.beryllium, 60, Items.graphite, 80)); craftEffect = Fx.none; outputItem = new ItemStack(Items.silicon, 5); craftTime = 40f; @@ -952,7 +951,7 @@ public class Blocks{ //TODO better name electrolyzer = new GenericCrafter("electrolyzer"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 30)); + requirements(Category.crafting, with(Items.silicon, 50, Items.graphite, 40, Items.beryllium, 40)); size = 3; craftTime = 10f; @@ -989,7 +988,7 @@ public class Blocks{ }}; atmosphericConcentrator = new HeatCrafter("atmospheric-concentrator"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 30)); + requirements(Category.crafting, with(Items.oxide, 50, Items.beryllium, 30, Items.silicon, 40)); size = 3; craftTime = 10f; hasLiquids = true; @@ -1013,7 +1012,7 @@ public class Blocks{ }}; oxidationChamber = new HeatProducer("oxidation-chamber"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 30)); + requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 40, Items.silicon, 50)); size = 3; outputItem = new ItemStack(Items.oxide, 1); @@ -1053,7 +1052,7 @@ public class Blocks{ heatReactor = new HeatProducer("heat-reactor"){{ //TODO gas/liquid requirement? - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 30)); + requirements(Category.crafting, with(Items.oxide, 70, Items.graphite, 20, Items.carbide, 10, Items.thorium, 80)); size = 3; craftTime = 60f * 10f; @@ -1065,7 +1064,7 @@ public class Blocks{ }}; carbideCrucible = new HeatCrafter("carbide-crucible"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 30)); + requirements(Category.crafting, with(Items.tungsten, 90, Items.thorium, 70, Items.oxide, 50)); craftEffect = Fx.none; outputItem = new ItemStack(Items.carbide, 1); craftTime = 60f * 3f; @@ -1115,9 +1114,8 @@ public class Blocks{ }}; //TODO should have a useful turret ammo byproduct? scrap? - //original: consumes.items(with(Items.copper, 3, Items.lead, 4, Items.titanium, 2, Items.silicon, 3)); surgeCrucible = new HeatCrafter("surge-crucible"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 60, Items.carbide, 30)); + requirements(Category.crafting, with(Items.silicon, 100, Items.graphite, 80, Items.carbide, 60, Items.thorium, 90)); size = 3; @@ -1156,7 +1154,7 @@ public class Blocks{ cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{ //TODO requirements - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 60, Items.carbide, 30)); + requirements(Category.crafting, with(Items.carbide, 50, Items.silicon, 80, Items.beryllium, 80)); heatRequirement = 5f; @@ -1185,9 +1183,9 @@ public class Blocks{ consumes.power(2f); }}; - //TODO bad name + //TODO bad name, and there's no use for phase yet... phaseSynthesizer = new HeatCrafter("phase-synthesizer"){{ - requirements(Category.crafting, with(Items.tungsten, 60, Items.graphite, 60, Items.carbide, 30)); + requirements(Category.crafting, with(Items.surgeAlloy, 60, Items.carbide, 40, Items.silicon, 80, Items.thorium, 80)); size = 3; @@ -1446,7 +1444,7 @@ public class Blocks{ }}; buildTower = new BuildTurret("build-tower"){{ - requirements(Category.effect, with(Items.graphite, 40, Items.beryllium, 50)); + requirements(Category.effect, with(Items.silicon, 60, Items.tungsten, 60, Items.oxide, 40)); outlineColor = Pal.darkOutline; consumes.power(3f); range = 120f; @@ -1574,17 +1572,17 @@ public class Blocks{ }}; ductBridge = new DuctBridge("duct-bridge"){{ - requirements(Category.distribution, with(Items.graphite, 15)); + requirements(Category.distribution, with(Items.graphite, 15, Items.tungsten, 5)); speed = 4f; }}; ductUnloader = new DirectionalUnloader("duct-unloader"){{ - requirements(Category.distribution, with(Items.graphite, 20, Items.silicon, 20)); + requirements(Category.distribution, with(Items.graphite, 20, Items.silicon, 20, Items.tungsten, 10)); speed = 4f; }}; surgeConveyor = new StackConveyor("surge-conveyor"){{ - requirements(Category.distribution, with(Items.surgeAlloy, 3, Items.graphite, 5)); + requirements(Category.distribution, with(Items.surgeAlloy, 3, Items.oxide, 5)); health = 90; //TODO different base speed/item capacity? speed = 5f / 60f; @@ -1599,7 +1597,7 @@ public class Blocks{ }}; surgeRouter = new StackRouter("surge-router"){{ - requirements(Category.distribution, with(Items.graphite, 10, Items.surgeAlloy, 10)); + requirements(Category.distribution, with(Items.oxide, 10, Items.surgeAlloy, 10)); speed = 6f; @@ -1703,7 +1701,7 @@ public class Blocks{ //TODO different name reinforcedPump = new Pump("reinforced-pump"){{ - requirements(Category.liquid, with(Items.beryllium, 70, Items.tungsten, 20, Items.silicon, 20)); + requirements(Category.liquid, with(Items.beryllium, 40, Items.tungsten, 30, Items.silicon, 20)); //TODO CUSTOM DRAW ANIMATION - pistons - repurpose DrawBlock? consumes.liquid(Liquids.hydrogen, 1.5f / 60f); @@ -1713,7 +1711,7 @@ public class Blocks{ }}; reinforcedConduit = new ArmoredConduit("reinforced-conduit"){{ - requirements(Category.liquid, with(Items.beryllium, 2, Items.graphite, 1)); + requirements(Category.liquid, with(Items.beryllium, 2)); botColor = Pal.darkestMetal; leaks = true; liquidCapacity = 20f; @@ -1722,14 +1720,16 @@ public class Blocks{ }}; //TODO is this necessary? junctions are not good design + //TODO make it leak reinforcedLiquidJunction = new LiquidJunction("reinforced-liquid-junction"){{ - requirements(Category.liquid, with(Items.graphite, 3, Items.beryllium, 3)); + requirements(Category.liquid, with(Items.tungsten, 4, Items.beryllium, 8)); + buildCostMultiplier = 3f; health = 260; ((Conduit)reinforcedConduit).junctionReplacement = this; }}; reinforcedBridgeConduit = new DirectionLiquidBridge("reinforced-bridge-conduit"){{ - requirements(Category.liquid, with(Items.graphite, 4, Items.beryllium, 8)); + requirements(Category.liquid, with(Items.tungsten, 6, Items.beryllium, 10)); range = 4; hasPower = false; @@ -1737,14 +1737,15 @@ public class Blocks{ }}; reinforcedLiquidRouter = new LiquidRouter("reinforced-liquid-router"){{ - requirements(Category.liquid, with(Items.graphite, 4, Items.beryllium, 2)); + requirements(Category.liquid, with(Items.tungsten, 4, Items.beryllium, 4)); liquidCapacity = 30f; newDrawing = true; liquidPadding = 3f/4f; }}; + //TODO is there a need for a container if unloaders can unload 3x3s? reinforcedLiquidContainer = new LiquidRouter("reinforced-liquid-container"){{ - requirements(Category.liquid, with(Items.graphite, 10, Items.beryllium, 15)); + requirements(Category.liquid, with(Items.tungsten, 10, Items.beryllium, 16)); liquidCapacity = 1000f; size = 2; newDrawing = true; @@ -1752,7 +1753,7 @@ public class Blocks{ }}; reinforcedLiquidTank = new LiquidRouter("reinforced-liquid-tank"){{ - requirements(Category.liquid, with(Items.tungsten, 30, Items.beryllium, 40)); + requirements(Category.liquid, with(Items.tungsten, 40, Items.beryllium, 50)); size = 3; liquidCapacity = 2700f; newDrawing = true; @@ -1794,14 +1795,14 @@ public class Blocks{ }}; batteryLarge = new Battery("battery-large"){{ - requirements(Category.power, with(Items.titanium, 20, Items.lead, 40, Items.silicon, 20)); + requirements(Category.power, with(Items.titanium, 20, Items.lead, 50, Items.silicon, 30)); size = 3; consumes.powerBuffered(50000f); baseExplosiveness = 5f; }}; beamNode = new BeamNode("beam-node"){{ - requirements(Category.power, with(Items.graphite, 1, Items.beryllium, 3)); + requirements(Category.power, with(Items.graphite, 5, Items.beryllium, 3)); consumesPower = outputsPower = true; consumes.powerBuffered(1000f); range = 10; @@ -1809,7 +1810,7 @@ public class Blocks{ //TODO requirements beamTower = new BeamNode("beam-tower"){{ - requirements(Category.power, with(Items.graphite, 10, Items.beryllium, 30)); + requirements(Category.power, with(Items.beryllium, 30, Items.oxide, 20, Items.silicon, 10)); size = 3; consumesPower = outputsPower = true; consumes.powerBuffered(40000f); @@ -1909,7 +1910,7 @@ public class Blocks{ //TODO work on sprite, green bits? turbineCondenser = new ThermalGenerator("turbine-condenser"){{ - requirements(Category.power, with(Items.graphite, 35, Items.beryllium, 25)); + requirements(Category.power, with(Items.graphite, 40, Items.beryllium, 40)); attribute = Attribute.vent; displayEfficiencyScale = 1f / 9f; minEfficiency = 9f - 0.0001f; @@ -2052,7 +2053,8 @@ public class Blocks{ }}; cliffCrusher = new WallCrafter("cliff-crusher"){{ - requirements(Category.production, with(Items.copper, 10)); + requirements(Category.production, with(Items.graphite, 20, Items.beryllium, 20)); + consumes.power(0.9f); drillTime = 110f; @@ -2062,7 +2064,7 @@ public class Blocks{ }}; plasmaBore = new BeamDrill("plasma-bore"){{ - requirements(Category.production, with(Items.graphite, 20, Items.beryllium, 10)); + requirements(Category.production, with(Items.graphite, 20, Items.beryllium, 30)); consumes.power(0.2f); drillTime = 200f; tier = 4; @@ -2658,8 +2660,9 @@ public class Blocks{ consumes.add(new ConsumeCoolant(0.5f)).update(false); }}; + //TODO tungsten? breach = new ItemTurret("breach"){{ - requirements(Category.turret, with(Items.beryllium, 35), true); + requirements(Category.turret, with(Items.beryllium, 35, Items.silicon, 20), true); ammo( Items.beryllium, new BasicBulletType(7f, 30){{ width = 8f; diff --git a/core/src/mindustry/content/ErekirTechTree.java b/core/src/mindustry/content/ErekirTechTree.java index 31cee77c04..ae1d707669 100644 --- a/core/src/mindustry/content/ErekirTechTree.java +++ b/core/src/mindustry/content/ErekirTechTree.java @@ -16,7 +16,9 @@ public class ErekirTechTree{ }); node(overflowDuct, () -> { + node(ductUnloader, () -> { + }); }); node(reinforcedContainer, () -> { @@ -25,7 +27,154 @@ public class ErekirTechTree{ }); }); }); + + node(constructor, () -> { + node(payloadLoader, () -> { + node(payloadUnloader, () -> { + node(payloadPropulsionTower, () -> { + + }); + }); + }); + + node(deconstructor, () -> { + node(largeConstructor, () -> { + + }); + }); + }); }); + + node(turbineCondenser, () -> { + node(beamNode, () -> { + node(beamTower, () -> { + + }); + + //TODO more tiers of build tower or "support" structures like overdrive projectors + //TODO method of repairing blocks of damage + node(buildTower, () -> { + + }); + }); + }); + + //TODO where in the tech tree is the arc furnace placed? is it essential? + node(siliconArcFurnace, () -> { + node(electrolyzer, () -> { + node(oxidationChamber, () -> { + node(atmosphericConcentrator, () -> { + node(cyanogenSynthesizer, () -> { + + }); + }); + + node(carbideCrucible, () -> { + node(surgeCrucible, () -> { + node(phaseSynthesizer, () -> { + + }); + }); + }); + }); + + node(slagIncinerator, () -> { + //when is this actually needed? + node(slagHeater, () -> { + //TODO + node(slagCentrifuge, () -> { + + }); + + node(heatReactor, () -> { + + }); + }); + }); + }); + }); + + //TODO move into turbine condenser? + node(plasmaBore, () -> { + node(cliffCrusher, () -> { + //TODO req + node(largePlasmaBore, () -> { + + }); + + //TODO req + node(impactDrill, () -> { + + }); + }); + }); + + node(reinforcedConduit, () -> { + node(reinforcedPump, () -> { + //TODO T2 pump + }); + + node(reinforcedLiquidJunction, () -> { + node(reinforcedBridgeConduit, () -> { + + }); + + node(reinforcedLiquidRouter, () -> { + node(reinforcedLiquidContainer, () -> { + node(reinforcedLiquidTank, () -> { + + }); + }); + }); + }); + }); + + node(breach, () -> { + //fracture turret is broken and thus not listed + + //TODO big tech jump here; incomplete turret + node(sublimate, () -> { + + }); + }); + + //TODO requirements for these + node(coreCitadel, () -> { + node(coreAcropolis, () -> { + + }); + }); + + nodeProduce(Items.beryllium, () -> { + nodeProduce(Items.oxide, () -> { + nodeProduce(Items.fissileMatter, () -> { + + }); + }); + + nodeProduce(Liquids.ozone, () -> { + nodeProduce(Liquids.hydrogen, () -> { + //TODO how will nitrogen be gated behind the electrolyzer? + nodeProduce(Liquids.nitrogen, () -> { + nodeProduce(Liquids.cyanogen, () -> { + + }); + }); + }); + }); + + nodeProduce(Items.tungsten, () -> { + nodeProduce(Items.carbide, () -> { + + }); + + //TODO does it require carbide? + nodeProduce(Liquids.gallium, () -> { + + }); + }); + }); + }); } } diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index b0b89ef00c..32329a1460 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2603,21 +2603,15 @@ public class UnitTypes{ //endregion //region internal - block = new UnitType("block"){ - { - speed = 0f; - hitSize = 0f; - health = 1; - rotateSpeed = 360f; - itemCapacity = 0; - commandLimit = 0; - } - - @Override - public boolean isHidden(){ - return true; - } - }; + block = new UnitType("block"){{ + speed = 0f; + hitSize = 0f; + health = 1; + rotateSpeed = 360f; + itemCapacity = 0; + commandLimit = 0; + hidden = true; + }}; //endregion //region neoplasm diff --git a/core/src/mindustry/ctype/ContentList.java b/core/src/mindustry/ctype/ContentList.java index 43d84ebadd..27d7104216 100644 --- a/core/src/mindustry/ctype/ContentList.java +++ b/core/src/mindustry/ctype/ContentList.java @@ -1,6 +1,6 @@ package mindustry.ctype; -/** @deprecated single-method interfaces don't need to exist for content loading; just call YouList.load() directly in the order necessary. */ +/** @deprecated single-method interfaces don't need to exist for content loading; just call YourList.load() as a static method directly in the order necessary. */ @Deprecated public interface ContentList{ /** This method should create all the content. */ diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index fa1c163d1b..d7d0ffaebe 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -3,6 +3,7 @@ package mindustry.maps.planet; import arc.graphics.*; import arc.math.*; import arc.math.geom.*; +import arc.struct.*; import arc.util.*; import arc.util.noise.*; import mindustry.ai.*; @@ -231,5 +232,8 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ state.rules.attributes.set(Attribute.heat, 0.8f); state.rules.environment = Env.scorching | Env.terrestrial | Env.groundWater; Schematics.placeLaunchLoadout(spawnX, spawnY); + + //TODO this is only for testing + state.rules.defaultTeam.items().add(Seq.with(ItemStack.with(Items.beryllium, 200, Items.graphite, 200))); } } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 16904b774a..8922b99499 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -137,6 +137,7 @@ public class UnitType extends UnlockableContent{ /** If true, all weapons will attack the same target. */ public boolean singleTarget = false; public boolean forceMultiTarget = false; + public boolean hidden = false; //for crawlers public int segments = 0; @@ -283,6 +284,11 @@ public class UnitType extends UnlockableContent{ } } + @Override + public boolean isHidden(){ + return hidden; + } + @Override public void setStats(){ Unit inst = constructor.get(); diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index bd343988fa..cbb210d018 100644 --- a/core/src/mindustry/ui/dialogs/ResearchDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -34,7 +34,8 @@ import static mindustry.Vars.*; public class ResearchDialog extends BaseDialog{ public final float nodeSize = Scl.scl(60f); public ObjectSet nodes = new ObjectSet<>(); - public TechTreeNode root = new TechTreeNode(TechTree.root, null); + //TODO switch root system + public TechTreeNode root = new TechTreeNode(TechTree.rootErekir, null); public Rect bounds = new Rect(); public ItemsDisplay itemDisplay; public View view; diff --git a/core/src/mindustry/world/blocks/defense/BuildTurret.java b/core/src/mindustry/world/blocks/defense/BuildTurret.java index 07fbe5249a..53a208df74 100644 --- a/core/src/mindustry/world/blocks/defense/BuildTurret.java +++ b/core/src/mindustry/world/blocks/defense/BuildTurret.java @@ -46,6 +46,7 @@ public class BuildTurret extends BaseTurret{ //this is super hacky, but since blocks are initialized before units it does not run into init/concurrent modification issues unitType = new UnitType("turret-unit-" + name){{ + hidden = true; speed = 0f; hitSize = 0f; health = 1;