Initial Erekir tech tree

This commit is contained in:
Anuken
2021-11-28 20:51:26 -05:00
parent 30e2d52341
commit 68e0b0e27e
12 changed files with 209 additions and 51 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 B

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -4,7 +4,6 @@ import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.struct.*; import arc.struct.*;
import mindustry.*; import mindustry.*;
import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.entities.effect.*; import mindustry.entities.effect.*;
@@ -59,11 +58,12 @@ public class Blocks{
wallOreBeryl, graphiticWall, wallOreBeryl, graphiticWall,
//crafting //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, melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge,
//erekir //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, cellSynthesisChamber,
//sandbox //sandbox
@@ -726,9 +726,8 @@ public class Blocks{
consumes.power(4f); consumes.power(4f);
}}; }};
//TODO
siliconArcFurnace = new GenericCrafter("silicon-arc-furnace"){{ 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; craftEffect = Fx.none;
outputItem = new ItemStack(Items.silicon, 5); outputItem = new ItemStack(Items.silicon, 5);
craftTime = 40f; craftTime = 40f;
@@ -952,7 +951,7 @@ public class Blocks{
//TODO better name //TODO better name
electrolyzer = new GenericCrafter("electrolyzer"){{ 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; size = 3;
craftTime = 10f; craftTime = 10f;
@@ -989,7 +988,7 @@ public class Blocks{
}}; }};
atmosphericConcentrator = new HeatCrafter("atmospheric-concentrator"){{ 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; size = 3;
craftTime = 10f; craftTime = 10f;
hasLiquids = true; hasLiquids = true;
@@ -1013,7 +1012,7 @@ public class Blocks{
}}; }};
oxidationChamber = new HeatProducer("oxidation-chamber"){{ 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; size = 3;
outputItem = new ItemStack(Items.oxide, 1); outputItem = new ItemStack(Items.oxide, 1);
@@ -1053,7 +1052,7 @@ public class Blocks{
heatReactor = new HeatProducer("heat-reactor"){{ heatReactor = new HeatProducer("heat-reactor"){{
//TODO gas/liquid requirement? //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; size = 3;
craftTime = 60f * 10f; craftTime = 60f * 10f;
@@ -1065,7 +1064,7 @@ public class Blocks{
}}; }};
carbideCrucible = new HeatCrafter("carbide-crucible"){{ 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; craftEffect = Fx.none;
outputItem = new ItemStack(Items.carbide, 1); outputItem = new ItemStack(Items.carbide, 1);
craftTime = 60f * 3f; craftTime = 60f * 3f;
@@ -1115,9 +1114,8 @@ public class Blocks{
}}; }};
//TODO should have a useful turret ammo byproduct? scrap? //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"){{ 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; size = 3;
@@ -1156,7 +1154,7 @@ public class Blocks{
cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{ cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{
//TODO requirements //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; heatRequirement = 5f;
@@ -1185,9 +1183,9 @@ public class Blocks{
consumes.power(2f); consumes.power(2f);
}}; }};
//TODO bad name //TODO bad name, and there's no use for phase yet...
phaseSynthesizer = new HeatCrafter("phase-synthesizer"){{ 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; size = 3;
@@ -1446,7 +1444,7 @@ public class Blocks{
}}; }};
buildTower = new BuildTurret("build-tower"){{ 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; outlineColor = Pal.darkOutline;
consumes.power(3f); consumes.power(3f);
range = 120f; range = 120f;
@@ -1574,17 +1572,17 @@ public class Blocks{
}}; }};
ductBridge = new DuctBridge("duct-bridge"){{ ductBridge = new DuctBridge("duct-bridge"){{
requirements(Category.distribution, with(Items.graphite, 15)); requirements(Category.distribution, with(Items.graphite, 15, Items.tungsten, 5));
speed = 4f; speed = 4f;
}}; }};
ductUnloader = new DirectionalUnloader("duct-unloader"){{ 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; speed = 4f;
}}; }};
surgeConveyor = new StackConveyor("surge-conveyor"){{ 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; health = 90;
//TODO different base speed/item capacity? //TODO different base speed/item capacity?
speed = 5f / 60f; speed = 5f / 60f;
@@ -1599,7 +1597,7 @@ public class Blocks{
}}; }};
surgeRouter = new StackRouter("surge-router"){{ 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; speed = 6f;
@@ -1703,7 +1701,7 @@ public class Blocks{
//TODO different name //TODO different name
reinforcedPump = new Pump("reinforced-pump"){{ 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? //TODO CUSTOM DRAW ANIMATION - pistons - repurpose DrawBlock?
consumes.liquid(Liquids.hydrogen, 1.5f / 60f); consumes.liquid(Liquids.hydrogen, 1.5f / 60f);
@@ -1713,7 +1711,7 @@ public class Blocks{
}}; }};
reinforcedConduit = new ArmoredConduit("reinforced-conduit"){{ 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; botColor = Pal.darkestMetal;
leaks = true; leaks = true;
liquidCapacity = 20f; liquidCapacity = 20f;
@@ -1722,14 +1720,16 @@ public class Blocks{
}}; }};
//TODO is this necessary? junctions are not good design //TODO is this necessary? junctions are not good design
//TODO make it leak
reinforcedLiquidJunction = new LiquidJunction("reinforced-liquid-junction"){{ 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; health = 260;
((Conduit)reinforcedConduit).junctionReplacement = this; ((Conduit)reinforcedConduit).junctionReplacement = this;
}}; }};
reinforcedBridgeConduit = new DirectionLiquidBridge("reinforced-bridge-conduit"){{ 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; range = 4;
hasPower = false; hasPower = false;
@@ -1737,14 +1737,15 @@ public class Blocks{
}}; }};
reinforcedLiquidRouter = new LiquidRouter("reinforced-liquid-router"){{ 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; liquidCapacity = 30f;
newDrawing = true; newDrawing = true;
liquidPadding = 3f/4f; liquidPadding = 3f/4f;
}}; }};
//TODO is there a need for a container if unloaders can unload 3x3s?
reinforcedLiquidContainer = new LiquidRouter("reinforced-liquid-container"){{ 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; liquidCapacity = 1000f;
size = 2; size = 2;
newDrawing = true; newDrawing = true;
@@ -1752,7 +1753,7 @@ public class Blocks{
}}; }};
reinforcedLiquidTank = new LiquidRouter("reinforced-liquid-tank"){{ 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; size = 3;
liquidCapacity = 2700f; liquidCapacity = 2700f;
newDrawing = true; newDrawing = true;
@@ -1794,14 +1795,14 @@ public class Blocks{
}}; }};
batteryLarge = new Battery("battery-large"){{ 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; size = 3;
consumes.powerBuffered(50000f); consumes.powerBuffered(50000f);
baseExplosiveness = 5f; baseExplosiveness = 5f;
}}; }};
beamNode = new BeamNode("beam-node"){{ 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; consumesPower = outputsPower = true;
consumes.powerBuffered(1000f); consumes.powerBuffered(1000f);
range = 10; range = 10;
@@ -1809,7 +1810,7 @@ public class Blocks{
//TODO requirements //TODO requirements
beamTower = new BeamNode("beam-tower"){{ 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; size = 3;
consumesPower = outputsPower = true; consumesPower = outputsPower = true;
consumes.powerBuffered(40000f); consumes.powerBuffered(40000f);
@@ -1909,7 +1910,7 @@ public class Blocks{
//TODO work on sprite, green bits? //TODO work on sprite, green bits?
turbineCondenser = new ThermalGenerator("turbine-condenser"){{ 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; attribute = Attribute.vent;
displayEfficiencyScale = 1f / 9f; displayEfficiencyScale = 1f / 9f;
minEfficiency = 9f - 0.0001f; minEfficiency = 9f - 0.0001f;
@@ -2052,7 +2053,8 @@ public class Blocks{
}}; }};
cliffCrusher = new WallCrafter("cliff-crusher"){{ 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); consumes.power(0.9f);
drillTime = 110f; drillTime = 110f;
@@ -2062,7 +2064,7 @@ public class Blocks{
}}; }};
plasmaBore = new BeamDrill("plasma-bore"){{ 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); consumes.power(0.2f);
drillTime = 200f; drillTime = 200f;
tier = 4; tier = 4;
@@ -2658,8 +2660,9 @@ public class Blocks{
consumes.add(new ConsumeCoolant(0.5f)).update(false); consumes.add(new ConsumeCoolant(0.5f)).update(false);
}}; }};
//TODO tungsten?
breach = new ItemTurret("breach"){{ breach = new ItemTurret("breach"){{
requirements(Category.turret, with(Items.beryllium, 35), true); requirements(Category.turret, with(Items.beryllium, 35, Items.silicon, 20), true);
ammo( ammo(
Items.beryllium, new BasicBulletType(7f, 30){{ Items.beryllium, new BasicBulletType(7f, 30){{
width = 8f; width = 8f;

View File

@@ -16,7 +16,9 @@ public class ErekirTechTree{
}); });
node(overflowDuct, () -> { node(overflowDuct, () -> {
node(ductUnloader, () -> {
});
}); });
node(reinforcedContainer, () -> { 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, () -> {
});
});
});
}); });
} }
} }

View File

@@ -2603,21 +2603,15 @@ public class UnitTypes{
//endregion //endregion
//region internal //region internal
block = new UnitType("block"){ block = new UnitType("block"){{
{ speed = 0f;
speed = 0f; hitSize = 0f;
hitSize = 0f; health = 1;
health = 1; rotateSpeed = 360f;
rotateSpeed = 360f; itemCapacity = 0;
itemCapacity = 0; commandLimit = 0;
commandLimit = 0; hidden = true;
} }};
@Override
public boolean isHidden(){
return true;
}
};
//endregion //endregion
//region neoplasm //region neoplasm

View File

@@ -1,6 +1,6 @@
package mindustry.ctype; 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 @Deprecated
public interface ContentList{ public interface ContentList{
/** This method should create all the content. */ /** This method should create all the content. */

View File

@@ -3,6 +3,7 @@ package mindustry.maps.planet;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.noise.*; import arc.util.noise.*;
import mindustry.ai.*; import mindustry.ai.*;
@@ -231,5 +232,8 @@ public class ErekirPlanetGenerator extends PlanetGenerator{
state.rules.attributes.set(Attribute.heat, 0.8f); state.rules.attributes.set(Attribute.heat, 0.8f);
state.rules.environment = Env.scorching | Env.terrestrial | Env.groundWater; state.rules.environment = Env.scorching | Env.terrestrial | Env.groundWater;
Schematics.placeLaunchLoadout(spawnX, spawnY); 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)));
} }
} }

View File

@@ -137,6 +137,7 @@ public class UnitType extends UnlockableContent{
/** If true, all weapons will attack the same target. */ /** If true, all weapons will attack the same target. */
public boolean singleTarget = false; public boolean singleTarget = false;
public boolean forceMultiTarget = false; public boolean forceMultiTarget = false;
public boolean hidden = false;
//for crawlers //for crawlers
public int segments = 0; public int segments = 0;
@@ -283,6 +284,11 @@ public class UnitType extends UnlockableContent{
} }
} }
@Override
public boolean isHidden(){
return hidden;
}
@Override @Override
public void setStats(){ public void setStats(){
Unit inst = constructor.get(); Unit inst = constructor.get();

View File

@@ -34,7 +34,8 @@ import static mindustry.Vars.*;
public class ResearchDialog extends BaseDialog{ public class ResearchDialog extends BaseDialog{
public final float nodeSize = Scl.scl(60f); public final float nodeSize = Scl.scl(60f);
public ObjectSet<TechTreeNode> nodes = new ObjectSet<>(); public ObjectSet<TechTreeNode> 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 Rect bounds = new Rect();
public ItemsDisplay itemDisplay; public ItemsDisplay itemDisplay;
public View view; public View view;

View File

@@ -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 //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){{ unitType = new UnitType("turret-unit-" + name){{
hidden = true;
speed = 0f; speed = 0f;
hitSize = 0f; hitSize = 0f;
health = 1; health = 1;