Added thermal generator / Enemy bases with spawning

This commit is contained in:
Anuken
2018-08-05 17:00:26 -04:00
parent 07c19ce085
commit 66fab1b3df
35 changed files with 980 additions and 812 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 B

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 B

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 B

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 B

View File

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 195 B

View File

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 177 B

View File

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

View File

@@ -526,6 +526,9 @@ block.command-center.name=Command Center
block.mass-driver.name=Mass Driver block.mass-driver.name=Mass Driver
block.blast-drill.name=Blast Drill block.blast-drill.name=Blast Drill
block.thermal-pump.name=Thermal Pump block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
unit.drone.name=Drone unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 138 KiB

View File

@@ -95,6 +95,7 @@ public class Recipes implements ContentList{
//generators - combustion //generators - combustion
new Recipe(power, PowerBlocks.combustionGenerator, new ItemStack(Items.tungsten, 50), new ItemStack(Items.lead, 30)); new Recipe(power, PowerBlocks.combustionGenerator, new ItemStack(Items.tungsten, 50), new ItemStack(Items.lead, 30));
new Recipe(power, PowerBlocks.turbineGenerator, new ItemStack(Items.tungsten, 70), new ItemStack(Items.carbide, 50), new ItemStack(Items.lead, 80), new ItemStack(Items.silicon, 60)); new Recipe(power, PowerBlocks.turbineGenerator, new ItemStack(Items.tungsten, 70), new ItemStack(Items.carbide, 50), new ItemStack(Items.lead, 80), new ItemStack(Items.silicon, 60));
new Recipe(power, PowerBlocks.thermalGenerator, new ItemStack(Items.tungsten, 80), new ItemStack(Items.carbide, 70), new ItemStack(Items.lead, 100), new ItemStack(Items.silicon, 70), new ItemStack(Items.thorium, 70));
//generators - solar //generators - solar
new Recipe(power, PowerBlocks.solarPanel, new ItemStack(Items.lead, 20), new ItemStack(Items.silicon, 30)); new Recipe(power, PowerBlocks.solarPanel, new ItemStack(Items.lead, 20), new ItemStack(Items.silicon, 30));
@@ -132,9 +133,13 @@ public class Recipes implements ContentList{
//actual unit related stuff //actual unit related stuff
new Recipe(units, UnitBlocks.dronePad, new ItemStack(Items.tungsten, 50), new ItemStack(Items.lead, 90), new ItemStack(Items.silicon, 130)); new Recipe(units, UnitBlocks.dronePad, new ItemStack(Items.tungsten, 50), new ItemStack(Items.lead, 90), new ItemStack(Items.silicon, 130));
new Recipe(units, UnitBlocks.fabricatorPad, new ItemStack(Items.carbide, 70), new ItemStack(Items.thorium, 100), new ItemStack(Items.lead, 150), new ItemStack(Items.silicon, 300)); new Recipe(units, UnitBlocks.fabricatorPad, new ItemStack(Items.carbide, 70), new ItemStack(Items.thorium, 60), new ItemStack(Items.lead, 130), new ItemStack(Items.silicon, 200));
new Recipe(units, UnitBlocks.interceptorPad, new ItemStack(Items.carbide, 70), new ItemStack(Items.thorium, 100), new ItemStack(Items.lead, 150), new ItemStack(Items.silicon, 300));
new Recipe(units, UnitBlocks.monsoonPad, new ItemStack(Items.carbide, 70), new ItemStack(Items.thorium, 100), new ItemStack(Items.lead, 150), new ItemStack(Items.silicon, 300)); new Recipe(units, UnitBlocks.daggerPad, new ItemStack(Items.lead, 80), new ItemStack(Items.silicon, 70));
new Recipe(units, UnitBlocks.titanPad, new ItemStack(Items.thorium, 90), new ItemStack(Items.lead, 140), new ItemStack(Items.silicon, 180));
new Recipe(units, UnitBlocks.interceptorPad, new ItemStack(Items.titanium, 40), new ItemStack(Items.lead, 80), new ItemStack(Items.silicon, 90));
new Recipe(units, UnitBlocks.monsoonPad, new ItemStack(Items.plastanium, 70), new ItemStack(Items.titanium, 100), new ItemStack(Items.lead, 130), new ItemStack(Items.silicon, 220));
new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30)); new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));
new Recipe(units, UnitBlocks.resupplyPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30)); new Recipe(units, UnitBlocks.resupplyPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));

View File

@@ -8,7 +8,7 @@ import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
public class UnitTypes implements ContentList{ public class UnitTypes implements ContentList{
public static UnitType drone, scout, interceptor, monsoon, titan, fabricator; public static UnitType drone, dagger, interceptor, monsoon, titan, fabricator;
@Override @Override
public void load(){ public void load(){
@@ -23,7 +23,7 @@ public class UnitTypes implements ContentList{
health = 45; health = 45;
}}; }};
scout = new UnitType("scout", Scout.class, Scout::new){{ dagger = new UnitType("dagger", Dagger.class, Dagger::new){{
maxVelocity = 1.1f; maxVelocity = 1.1f;
speed = 0.2f; speed = 0.2f;
drag = 0.4f; drag = 0.4f;
@@ -55,6 +55,7 @@ public class UnitTypes implements ContentList{
drag = 0.01f; drag = 0.01f;
isFlying = true; isFlying = true;
weapon = Weapons.bomber; weapon = Weapons.bomber;
ammoCapacity = 50;
}}; }};
fabricator = new UnitType("fabricator", Fabricator.class, Fabricator::new){{ fabricator = new UnitType("fabricator", Fabricator.class, Fabricator::new){{

View File

@@ -22,6 +22,7 @@ public class LiquidBlocks extends BlockList implements ContentList{
pumpAmount = 0.25f; pumpAmount = 0.25f;
consumes.power(0.015f); consumes.power(0.015f);
liquidCapacity = 30f; liquidCapacity = 30f;
powerCapacity = 20f;
hasPower = true; hasPower = true;
size = 2; size = 2;
tier = 1; tier = 1;
@@ -32,6 +33,8 @@ public class LiquidBlocks extends BlockList implements ContentList{
pumpAmount = 0.55f; pumpAmount = 0.55f;
consumes.power(0.03f); consumes.power(0.03f);
liquidCapacity = 40f; liquidCapacity = 40f;
hasPower = true;
powerCapacity = 20f;
size = 2; size = 2;
tier = 2; tier = 2;
}}; }};

View File

@@ -21,9 +21,8 @@ public class PowerBlocks extends BlockList implements ContentList{
thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{ thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{
maxLiquidGenerate = 0.5f; maxLiquidGenerate = 0.5f;
powerPerLiquid = 0.08f;
powerCapacity = 40f; powerCapacity = 40f;
powerPerLiquid = 0.25f; powerPerLiquid = 0.55f;
generateEffect = BlockFx.redgeneratespark; generateEffect = BlockFx.redgeneratespark;
size = 2; size = 2;
}}; }};

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.world.blocks.units.*;
public class UnitBlocks extends BlockList implements ContentList{ public class UnitBlocks extends BlockList implements ContentList{
public static Block resupplyPoint, repairPoint, dronePad, public static Block resupplyPoint, repairPoint, dronePad,
fabricatorPad, interceptorPad, monsoonPad, scoutPad, titanPad, fabricatorPad, interceptorPad, monsoonPad, daggerPad, titanPad,
dropPoint, reconstructor, overdriveProjector, shieldProjector, commandCenter; dropPoint, reconstructor, overdriveProjector, shieldProjector, commandCenter;
@Override @Override
@@ -24,7 +24,7 @@ public class UnitBlocks extends BlockList implements ContentList{
fabricatorPad = new UnitPad("fabricator-pad"){{ fabricatorPad = new UnitPad("fabricator-pad"){{
type = UnitTypes.fabricator; type = UnitTypes.fabricator;
produceTime = 1600; produceTime = 1400;
size = 2; size = 2;
consumes.power(0.2f); consumes.power(0.2f);
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 70), new ItemStack(Items.lead, 80), new ItemStack(Items.titanium, 80)}); consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 70), new ItemStack(Items.lead, 80), new ItemStack(Items.titanium, 80)});
@@ -32,10 +32,10 @@ public class UnitBlocks extends BlockList implements ContentList{
interceptorPad = new UnitPad("interceptor-pad"){{ interceptorPad = new UnitPad("interceptor-pad"){{
type = UnitTypes.interceptor; type = UnitTypes.interceptor;
produceTime = 1300; produceTime = 800;
size = 2; size = 2;
consumes.power(0.1f); consumes.power(0.08f);
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 30), new ItemStack(Items.titanium, 40)}); consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.titanium, 10)});
}}; }};
monsoonPad = new UnitPad("monsoon-pad"){{ monsoonPad = new UnitPad("monsoon-pad"){{
@@ -44,7 +44,24 @@ public class UnitBlocks extends BlockList implements ContentList{
size = 3; size = 3;
consumes.power(0.14f); consumes.power(0.14f);
shadow = "shadow-round-3"; shadow = "shadow-round-3";
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 40), new ItemStack(Items.titanium, 50), new ItemStack(Items.plastanium, 50)}); consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 30), new ItemStack(Items.titanium, 30), new ItemStack(Items.plastanium, 20)});
}};
daggerPad = new UnitPad("dagger-pad"){{
type = UnitTypes.dagger;
produceTime = 600;
size = 2;
consumes.power(0.06f);
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 10), new ItemStack(Items.tungsten, 20)});
}};
titanPad = new UnitPad("titan-pad"){{
type = UnitTypes.titan;
produceTime = 1300;
size = 3;
consumes.power(0.15f);
shadow = "shadow-round-3";
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.tungsten, 30), new ItemStack(Items.thorium, 30)});
}}; }};
resupplyPoint = new ResupplyPoint("resupply-point"){{ resupplyPoint = new ResupplyPoint("resupply-point"){{

View File

@@ -43,7 +43,7 @@ public class UnitType implements UnlockableContent{
public float retreatPercent = 0.2f; public float retreatPercent = 0.2f;
public float armor = 0f; public float armor = 0f;
public float carryWeight = 1f; public float carryWeight = 1f;
public int ammoCapacity = 100; public int ammoCapacity = 220;
public int itemCapacity = 30; public int itemCapacity = 30;
public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.tungsten); public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.tungsten);
public float buildPower = 0.3f, minePower = 0.7f, healSpeed = 0.1f; public float buildPower = 0.3f, minePower = 0.7f, healSpeed = 0.1f;

View File

@@ -2,6 +2,6 @@ package io.anuke.mindustry.entities.units.types;
import io.anuke.mindustry.entities.units.GroundUnit; import io.anuke.mindustry.entities.units.GroundUnit;
public class Scout extends GroundUnit{ public class Dagger extends GroundUnit{
} }

View File

@@ -1,5 +1,6 @@
package io.anuke.mindustry.game; package io.anuke.mindustry.game;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -130,7 +131,7 @@ public class TeamInfo{
} }
public class TeamData{ public class TeamData{
public final ThreadArray<Tile> cores = new ThreadArray<>(); public final Array<Tile> cores = new ThreadArray<>();
public final Team team; public final Team team;
public final boolean ally; public final boolean ally;

View File

@@ -11,7 +11,7 @@ public class Waves{
public static Array<SpawnGroup> getSpawns(){ public static Array<SpawnGroup> getSpawns(){
return Array.with( return Array.with(
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
end = 8; end = 8;
unitScaling = 2; unitScaling = 2;
}}, }},
@@ -21,7 +21,7 @@ public class Waves{
end = 14; end = 14;
}}, }},
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
begin = 11; begin = 11;
unitScaling = 2; unitScaling = 2;
spacing = 2; spacing = 2;
@@ -36,7 +36,7 @@ public class Waves{
end = 30; end = 30;
}}, }},
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
begin = 10; begin = 10;
unitScaling = 2; unitScaling = 2;
unitAmount = 1; unitAmount = 1;
@@ -79,7 +79,7 @@ public class Waves{
max = 7; max = 7;
}}, }},
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
begin = 82; begin = 82;
spacing = 3; spacing = 3;
unitAmount = 4; unitAmount = 4;
@@ -89,7 +89,7 @@ public class Waves{
ammoItem = Items.silicon; ammoItem = Items.silicon;
}}, }},
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
begin = 41; begin = 41;
spacing = 5; spacing = 5;
unitAmount = 1; unitAmount = 1;
@@ -99,7 +99,7 @@ public class Waves{
max = 10; max = 10;
}}, }},
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
begin = 35; begin = 35;
spacing = 3; spacing = 3;
unitAmount = 4; unitAmount = 4;
@@ -109,7 +109,7 @@ public class Waves{
end = 60; end = 60;
}}, }},
new SpawnGroup(UnitTypes.scout){{ new SpawnGroup(UnitTypes.dagger){{
begin = 42; begin = 42;
spacing = 3; spacing = 3;
unitAmount = 4; unitAmount = 4;

View File

@@ -13,13 +13,16 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret; import io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret;
import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret; import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret;
import io.anuke.mindustry.world.blocks.defense.turrets.Turret; import io.anuke.mindustry.world.blocks.units.ResupplyPoint;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
public class FortressGenerator{ public class FortressGenerator{
private final static int minCoreDst = 60; private final static int minCoreDst = 60;
private static Structure[] structures; private static Structure[] structures;
private static Structure[] bases;
private int enemyX, enemyY, coreX, coreY; private int enemyX, enemyY, coreX, coreY;
private Team team; private Team team;
@@ -40,9 +43,15 @@ public class FortressGenerator{
//more advanced duo outpost //more advanced duo outpost
new Structure(0.04f, Items.lead, "BwYADnR1bmdzdGVuLWRyaWxsAwADZHVvBAAIc3BsaXR0ZXIBAA10dW5nc3Rlbi13YWxsAgATdHVuZ3N0ZW4td2FsbC1sYXJnZQAAA2FpcgUACGNvbnZleW9yCQkAAAAAAQEBAQEBAQEBAgAAAAAAAAICAAEDAAQDAwACAgAAAAABAgACAAABAgUCAQEAAAAAAQABAgMAAQIBAgUCAQEBAQMAAQABAgQCBQMFAwYCBQEFAQQDAQABAgMAAQEBAQUAAQMBAwMAAQABAwICAAMBAQUAAQMCAgADAQMAAAAAAAIDAAQDAwAAAwADAAAAAAAAAQIBAwEDAQMBAwAAAAA="), new Structure(0.04f, Items.lead, "BwYADnR1bmdzdGVuLWRyaWxsAwADZHVvBAAIc3BsaXR0ZXIBAA10dW5nc3Rlbi13YWxsAgATdHVuZ3N0ZW4td2FsbC1sYXJnZQAAA2FpcgUACGNvbnZleW9yCQkAAAAAAQEBAQEBAQEBAgAAAAAAAAICAAEDAAQDAwACAgAAAAABAgACAAABAgUCAQEAAAAAAQABAgMAAQIBAgUCAQEBAQMAAQABAgQCBQMFAwYCBQEFAQQDAQABAgMAAQEBAQUAAQMBAwMAAQABAwICAAMBAQUAAQMCAgADAQMAAAAAAAIDAAQDAwAAAwADAAAAAAAAAQIBAwEDAQMBAwAAAAA="),
//tungsten duo and drone outpost
new Structure(0.02f, Items.tungsten, "BgEADXR1bmdzdGVuLXdhbGwEAA1jYXJiaWRlLWRyaWxsAwADZHVvAgATdHVuZ3N0ZW4td2FsbC1sYXJnZQAAA2FpcgUACWRyb25lLXBhZAUHAAAAAAEDAQMCAgAAAAAAAAAAAQADAAADAAMBAgAAAAABAAQBBQAAAAECAAAAAAEAAwAAAAAAAQIAAAAAAQABAQEBAQEBAg=="),
//lead storage //lead storage
new Structure(0.02f, Items.lead, vaults), new Structure(0.02f, Items.lead, vaults),
//mini dagger outpost
new Structure(0.02f, Items.lead, "CwIADXR1bmdzdGVuLXdhbGwGAAhjb252ZXlvcgUAA2R1bwgACmRhZ2dlci1wYWQBABN0dW5nc3Rlbi13YWxsLWxhcmdlBwAIc3BsaXR0ZXIDAA5yZXN1cHBseS1wb2ludAoADHJlcGFpci1wb2ludAkADnR1bmdzdGVuLWRyaWxsAAADYWlyBAALc29sYXItcGFuZWwHCQAAAAABAAABAgECAQIBAAAAAAEAAAMAAwADAwEEAAIBAgICAgAAAAAFAwYDBwMCAQIBBQECAgAAAAAIAAAACQMGAQYBBwMCAgAAAAAAAAAAAQMAAAIDBQECAgEAAAAKAQQBAAAAAAIBAgECAgAAAAACAQIBAgEAAAAAAAAAAA=="),
//salvo outpost //salvo outpost
new Structure(0.02f, Items.tungsten, "BAIABXNhbHZvAwANY2FyYmlkZS1kcmlsbAAAA2FpcgEADGNhcmJpZGUtd2FsbAcHAAAAAAEDAQMBAwEDAAABAwEDAQMCAAAAAQMAAAEAAgAAAAAAAAABAwEDAQAAAAAAAwACAAAAAQIBAAEBAgAAAAAAAAABAgAAAQEAAAAAAQEBAQEBAAABAQEBAQEBAQAAAAA="), new Structure(0.02f, Items.tungsten, "BAIABXNhbHZvAwANY2FyYmlkZS1kcmlsbAAAA2FpcgEADGNhcmJpZGUtd2FsbAcHAAAAAAEDAQMBAwEDAAABAwEDAQMCAAAAAQMAAAEAAgAAAAAAAAABAwEDAQAAAAAAAwACAAAAAQIBAAEBAgAAAAAAAAABAgAAAQEAAAAAAQEBAQEBAAABAQEBAQEBAQAAAAA="),
@@ -52,15 +61,50 @@ public class FortressGenerator{
//titanium storage //titanium storage
new Structure(0.02f, Items.titanium, vaults), new Structure(0.02f, Items.titanium, vaults),
//2x interceptor outpost
new Structure(0.02f, Items.lead, "CgMAEXNvbGFyLXBhbmVsLWxhcmdlBgADZHVvAgAPaW50ZXJjZXB0b3ItcGFkBAASY2FyYmlkZS13YWxsLWxhcmdlBwAOcmVzdXBwbHktcG9pbnQAAANhaXIFAAtzb2xhci1wYW5lbAEADGNhcmJpZGUtd2FsbAkAC2Rpc3RyaWJ1dG9yCAALbGFzZXItZHJpbGwKCAEAAQMBAwEDAQMBAwECAAABAAIDAAAAAAAAAAABAgAAAQAAAAAAAAADAQAAAQIBAgQDAAAFAAAAAAAAAAYCAQMAAAAABwAIAAAACQAAAAECBAMAAAEAAAAAAAABAAABAgAAAAAFAAAAAAAAAAYCAQIBAAIDAAAAAAMBAAABAgECAQAAAAAAAAAAAAAAAQIAAAEAAQEBAQEBAQEBAQEBAAA="),
//coal laser outpost //coal laser outpost
new Structure(0.03f, null, "BgEADHRob3JpdW0td2FsbAMABmxhbmNlcgUAFGNvbWJ1c3Rpb24tZ2VuZXJhdG9yBAANY2FyYmlkZS1kcmlsbAAAA2FpcgIAC3NvbGFyLXBhbmVsBwcAAAEAAQABAQEBAQEBAAAAAQACAgMAAAACAAEAAAABAAICAAAAAAIAAQAAAAEAAQAEAQUAAQABAAAAAQACAAMBAAMCAAEAAAABAAIAAAMAAwIAAQAAAAEAAQABAwEDAQABAA=="), new Structure(0.03f, null, "BgEADHRob3JpdW0td2FsbAMABmxhbmNlcgUAFGNvbWJ1c3Rpb24tZ2VuZXJhdG9yBAANY2FyYmlkZS1kcmlsbAAAA2FpcgIAC3NvbGFyLXBhbmVsBwcAAAEAAQABAQEBAQEBAAAAAQACAgMAAAACAAEAAAABAAICAAAAAAIAAQAAAAEAAQAEAQUAAQABAAAAAQACAAMBAAMCAAEAAAABAAIAAAMAAwIAAQAAAAEAAQABAwEDAQABAA=="),
//ultimate laser outpost //ultimate laser outpost
new Structure(0.02f, null, "BgMABmxhbmNlcgIAEmNhcmJpZGUtd2FsbC1sYXJnZQUAEXNvbGFyLXBhbmVsLWxhcmdlAAADYWlyBAALc29sYXItcGFuZWwBAAxjYXJiaWRlLXdhbGwPDwAAAAAAAAAAAAABAwIDAAABAwAAAAAAAAAAAAAAAAAAAAACAwAAAgMAAAAAAAACAwAAAgMAAAAAAAAAAAAAAQMAAAAAAAAAAAMDAAAAAAAAAAAAAAIDAAAAAAAAAgMAAAMDAAAEAwAAAAADAwAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAAAAAAAAAgMAAAMDAAAAAAUDAAAAAAAAAAAEAwAAAAABAwEDAAAAAAAAAAAAAAAAAAAAAAUDAAADAwAAAgMAAAIDAAADAwAAAAAAAAAABAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAFAwAAAAAAAAAAAwMAAAIDAAABAwEDAgMAAAQDAAAAAAAAAAAFAwAAAAAAAAAAAAAAAAAAAAAAAAMDAAADAwAAAAAAAAAAAwMAAAIDAAAAAAAAAgMAAAAAAAAAAAAAAwMAAAQDAAAAAAAAAAAAAAAAAAAAAAIDAAACAwAAAAAAAAIDAAACAwAAAQMAAAAAAAABAwAAAAAAAAAAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAAAAAEDAAAAAAAAAAAAAA=="), new Structure(0.02f, null, "BgMABmxhbmNlcgIAEmNhcmJpZGUtd2FsbC1sYXJnZQUAEXNvbGFyLXBhbmVsLWxhcmdlAAADYWlyBAALc29sYXItcGFuZWwBAAxjYXJiaWRlLXdhbGwPDwAAAAAAAAAAAAABAwIDAAABAwAAAAAAAAAAAAAAAAAAAAACAwAAAgMAAAAAAAACAwAAAgMAAAAAAAAAAAAAAQMAAAAAAAAAAAMDAAAAAAAAAAAAAAIDAAAAAAAAAgMAAAMDAAAEAwAAAAADAwAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAAAAAAAAAgMAAAMDAAAAAAUDAAAAAAAAAAAEAwAAAAABAwEDAAAAAAAAAAAAAAAAAAAAAAUDAAADAwAAAgMAAAIDAAADAwAAAAAAAAAABAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAFAwAAAAAAAAAAAwMAAAIDAAABAwEDAgMAAAQDAAAAAAAAAAAFAwAAAAAAAAAAAAAAAAAAAAAAAAMDAAADAwAAAAAAAAAAAwMAAAIDAAAAAAAAAgMAAAAAAAAAAAAAAwMAAAQDAAAAAAAAAAAAAAAAAAAAAAIDAAACAwAAAAAAAAIDAAACAwAAAQMAAAAAAAABAwAAAAAAAAAAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAAAAAEDAAAAAAAAAAAAAA=="),
//fabricator outpost
new Structure(0.02f, Items.tungsten, "BgUADWNhcmJpZGUtZHJpbGwBABJ0aG9yaXVtLXdhbGwtbGFyZ2UCAAx0aG9yaXVtLXdhbGwEAANkdW8AAANhaXIDAA5mYWJyaWNhdG9yLXBhZAkJAAAAAAEDAAACAwEDAAAAAAAAAAACAwADAAMCAwADAAMCAgAAAQMAAAMCAAACAAMCAAABAwAAAAAAAAAAAAAEAgAAAAAAAgAAAgMCAAIBBAIFAAQCAgMCAgIDAQMAAAMCAAAEAgMCAAABAwAAAAAAAAAAAAACAQAAAAAAAgAAAAACAAEDAAECAQEDAAECAQAAAAAAAAAAAAACAwACAAAAAAAA"),
//coal storage //coal storage
new Structure(0.02f, Items.coal, vaults), new Structure(0.02f, Items.coal, vaults),
}; };
bases = new Structure[]{
//primitive 4-spawner base
new Structure("CAQADXR1bmdzdGVuLXdhbGwFAANkdW8HAARjb3JlAQAKZGFnZ2VyLXBhZAYACHVubG9hZGVyAgAMcmVwYWlyLXBvaW50AAADYWlyAwALc29sYXItcGFuZWwJBwAAAQMAAAIDAQMAAAAAAAAAAAAAAwIAAAAAAAAEAAQBBAEEAQQBBAEEAgQABQIAAAAAAAAFAgQCBAAGAwAABwAAAAYDBAAEAAUCAAAAAAAABQIEAAQABAMEAwQDBAMEAAQAAAABAwAAAwIBAwAAAAAAAAAAAAACAwAAAAAAAA=="),
//more advanced base, 8 spawners
new Structure("CQIADXR1bmdzdGVuLXdhbGwGAANkdW8IAARjb3JlAQAKZGFnZ2VyLXBhZAcACHVubG9hZGVyBAATdHVuZ3N0ZW4td2FsbC1sYXJnZQUADHJlcGFpci1wb2ludAAAA2FpcgMAC3NvbGFyLXBhbmVsCwsAAAAAAQEAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAACAwMAAgMAAAAAAAAAAAEBAAAEAAAAAgMFAAIDBAAAAAEBAAAAAAAAAAAAAAYABwIGAAAAAAAAAAAAAAACAAIABgAAAAAAAAAGAAICAgAAAAAAAwAFAAcCAAAIAAAABwIFAAMAAAAAAAIAAgAGAAAAAAAAAAYAAgICAAAAAQEAAAQAAAAGAAcCBgAEAAAAAQEAAAAAAAAAAAAAAgEFAAIBAAAAAAAAAAAAAAAAAQEAAAIDAwACAwEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="),
//rather advanced flyer base, no ground units, drones
new Structure("DQIADXR1bmdzdGVuLXdhbGwHAAhjb252ZXlvcgMAA2R1bwwABGNvcmULAAh1bmxvYWRlcgEAE3R1bmdzdGVuLXdhbGwtbGFyZ2UGAA9pbnRlcmNlcHRvci1wYWQFAAhzcGxpdHRlcgoADHJlcGFpci1wb2ludAQABXNhbHZvAAADYWlyCAAJZHJvbmUtcGFkCQALc29sYXItcGFuZWwREQAAAAAAAAAAAAAAAAEAAAACAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAwAAAAAAAgABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAADAAUAAwAEAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAgMHAgIDAAAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAgMHAgcDBQEHAQcCAgMAAAAAAAAAAAAAAAACAAQAAAACAwgAAAAJAAcCCQAIAAAAAgMEAAAAAgAAAAEAAAAAAAAABwMAAAAACgMLAgoDAAAAAAcBAAAAAAEAAAAAAAAAAwACAwcCCQAKAwAAAAAAAAoDCQAHAgIDAwAAAAAAAgADAAUABwMFAAcDCwIAAAwAAAALAwcBBQIHAQUAAwACAAEAAAADAAIDBwAJAAoDAAAAAAAACgMJAAcAAgMDAAEAAAAAAAAABAAAAAcDCAAAAAoDCwMKAwgAAAAHAQQAAAAAAAAAAAACAAAAAAACAwAAAAAJAAcACQAAAAAAAgMAAAAAAgAAAAAAAQAAAAYAAAACAwcABwMFAgcBBwACAwYAAAABAAAAAAAAAAAAAAAAAAAABAAAAAIDBwACAwQAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAUDAwAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAEAAAADAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA"),
//advanced carbide base with fabricators, drones
new Structure("Ew4ADXR1bmdzdGVuLXdhbGwHABFzb2xhci1wYW5lbC1sYXJnZRAACGNvbnZleW9yDAADZHVvEgAEY29yZQMACmRhZ2dlci1wYWQRAAh1bmxvYWRlcgkAD2ludGVyY2VwdG9yLXBhZA8ACHNwbGl0dGVyBgAGbGFuY2VyDQARdGl0YW5pdW0tY29udmV5b3IBABJjYXJiaWRlLXdhbGwtbGFyZ2ULAAxyZXBhaXItcG9pbnQIAAVzYWx2bwAAA2FpcgUACXRpdGFuLXBhZAoAC3NvbGFyLXBhbmVsAgAMY2FyYmlkZS13YWxsBAAOZmFicmljYXRvci1wYWQTFQAAAAAAAAAAAAAAAAAAAQMAAwAAAAAAAAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAIBAAEAAQAAAAAAAAABAAECAQAAAAACAgAAAAAAAAAAAAAAAAICAwAAAAICBAAAAAAABQAAAAQAAAACAAMAAAACAgAAAAAAAAAAAAAAAAICAAAAAAICAAAAAAAAAAAAAAAAAAACAAAAAAACAgAAAAAAAAAAAAAAAAEAAAABAAAABgAAAAAAAAAAAAYAAAABAAAAAQAAAAAAAAAAAAIAAQIAAAAAAAAAAAAAAAMAAwAABwAAAAAAAAAAAAAAAAAAAAECAAACAAIAAAAAAAEAAAAIAAAACQAAAAAAAAAAAAkAAAAIAAAAAQAAAAAAAAACAAIACAMAAAAAAAAAAAAAAAAAAAoACwAKAAAAAAAAAAAAAAAAAAgDAAACAAIAAAAAAAIADAMMAw0CDgAMAAAAAAAAAAwADgANAgwBDAECAAAAAAACAAIAAgMPAw0DDwAPAw8AEAMRAgAAEgAAABECEAEPAA8DDwANAQ8DAgMCAAIACAMAAAIADAMMAw0ADgAMAAAAAAAAAAwADgANAAwBDAECAAgDAAACAAIAAAAAAAEAAAAIAAAACQAAAAoACwAKAAkAAAAIAAAAAQAAAAAAAAACAAIAAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAACAAIAAAIAAAEAAAABAAAABgAAAAAABwAAAAYAAAABAAAAAQAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAwAAAAICBAAAAAAAAAAAAAQAAAACAAMAAAACAAAAAAAAAAAAAAAAAAIAAAAAAAICAAAAAAAABQAAAAAAAAACAAAAAAACAAAAAAAAAAAAAAAAAAIAAAAAAAICAQMAAwAAAAAAAAEDAAMCAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAA=="),
//lots of titans and daggers
new Structure("DAcACHNwbGl0dGVyBgADZHVvCwAEY29yZQMACmRhZ2dlci1wYWQKAAh1bmxvYWRlcggAEXRpdGFuaXVtLWNvbnZleW9yAgASY2FyYmlkZS13YWxsLWxhcmdlBQAFc2Fsdm8AAANhaXIEAAl0aXRhbi1wYWQBAAxjYXJiaWRlLXdhbGwJAAtkaXN0cmlidXRvchMTAAAAAAECAAAAAAAAAAAAAAECAAABAgAAAAAAAAAAAAABAgAAAAAAAAIDAAAAAAAAAAAAAAAAAQIBAAECAAAAAAAAAAAAAAIDAAAAAAECAAAAAAAAAAAAAAMAAAABAgEAAQIDAAAAAAAAAAAAAAAAAAECAAAAAAAAAAAAAAAAAAMAAAECAQABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAFAwAABgAHAAYABQMAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAgCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAwAACQAAAAYDCAIGAwkAAAAFAwAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCgMKAAoDAAAAAAAAAAAAAAAAAAAAAAECAQMBAwEDBgABAAYDCgMAAAAAAAAKAwYDAQAGAAEBAQEBAQECAAABAwEDAQMHAAgDCAMKAAAACwAAAAoACAEIAQcAAQEBAQEBAAABAgEDAQMBAwYAAQAGAwoDAAAAAAAACgMGAwEABgABAQEBAQEBAgAAAAADAAAABQMAAAkAAAAKAwoACgMJAAAABQMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDCAAGAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAwAAAQMIAAEDBQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAGAAcABgAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAECAQABAAMAAAAAAAAAAAAAAAAAAAABAgIDAAAAAAAAAAAAAAAAAQIBAAEAAAAAAAADAAMAAwIDAAABAgAAAAAAAAAAAAAAAAAAAAABAgEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAAAAAAAAAAAAAECAAABAgAAAAAAAAAAAAABAgAAAAA="),
//superfortress
new Structure("EwwAEXNvbGFyLXBhbmVsLWxhcmdlDgADZHVvEgAEY29yZQMACmRhZ2dlci1wYWQQAAttb25zb29uLXBhZBEACHVubG9hZGVyCgAPaW50ZXJjZXB0b3ItcGFkCQAGbGFuY2VyDwARdGl0YW5pdW0tY29udmV5b3ICABJjYXJiaWRlLXdhbGwtbGFyZ2UGAA5yZXN1cHBseS1wb2ludAQADHJlcGFpci1wb2ludAsABXNhbHZvAAADYWlyCAAJZHJvbmUtcGFkBwAJdGl0YW4tcGFkBQALc29sYXItcGFuZWwBAAxjYXJiaWRlLXdhbGwNAAtkaXN0cmlidXRvch8fAAAAAAAAAAAAAAAAAAABAwAAAAAAAAAAAAACAgAAAQICAgAAAAAAAAAAAAAAAAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAAAAAAAAAAAAAAAAAABAgAAAAAAAAAAAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAAAAAAAAADAgAABAEFAQYBBQEEAQMCAAAAAAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAAAAAAABwIAAAAAAAAIAgAABQEIAgAAAAAAAAAABwIAAAAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAICAAAJAgAAAAAAAAAACgMAAAAAAAABAAAAAAAKAwAAAAAAAAAACQIAAAICAAAAAAAAAAAAAAAAAAAAAAECAAAAAAAAAAAAAAAAAAAAAAAACwAAAAEACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAAAAAAAAAAAAAICAAAJAgAACQIAAAAADAAAAAsAAAAAAAAAAQAAAAAACwAAAAAADAAAAAkCAAAJAgAAAgIAAAAAAAABAwEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAOAg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAA4CAAAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwIAAAAADAAAAAAADAAAAAAAAAABAQ8CDwIPAgEAAAAAAAAADAAAAAAADAAAAAAABwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBDwIPAg8CAQABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAgAACgMAAAsAAAALAAAAAQIAAAAAAAAPAg8CDwIAAAAAAAABAQsAAAALAAAACgMAAAMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgAAEAIAAA8CDwIPAgAAEAIAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAACAgAABAEIAgAACwEAAA0AAAABAQEBAAAAAAAAEQARABEAAAAAAAAAAQABAA0AAAALAQAACAIAAAQBAgIAAAAAAAAFAQAAAAAAAAAAAAAAAA8DDwMPAw8DEQMAAAAAAAARAw8BDwEPAQ8BAAAAAAAAAAAAAAAABQEAAAAAAQMBAwYBBQEBAQEBAQEOAg4CDwMPAw8DDwMRAAAAEgAAABEADwEPAQ8BDwEOAQ4BAQEBAQEBBQEGAQEBAQECAgAABQEIAgAACwEAAA0AAAAPAw8DDwMPAxEDAAAAAAAAEQMPAQ8BDwEPAQ0AAAALAQAACAIAAAUBAgIAAAAAAAAEAQAAAAAAAAAAAAAAAAECAQIAAAAAAAARAxEAEQMAAAAAAAABAwEDAAAAAAAAAAAAAAAABAEAAAAAAAAAAAMCAAAKAwAACwAAAAsAAAABAgAAEAIAAA8ADwAPAAAAEAIAAAEACwAAAAsAAAAKAwAAAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAAAAAAADwAPAA8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEPAA8ADwABAwEDAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwIAAAAADAAAAAAADAAAAAsAAAABAQ8ADwAPAAEDCwAAAAAADAAAAAAADAIAAAAABwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAOAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAQMCAgAACQIAAAkCAAAAAAAAAAALAAAAAAAAAA4AAAAAAAsAAAAAAAAAAAAJAgAACQIAAAICAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAALAQAAAQILAQAAAAAAAAAADAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAAAJAgAAAAAAAAAACgMAAAAAAAABAgAAAAAKAwAAAAAAAAAACQIAAAICAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAIAAAECCAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgIAAAAABwIAAAMCAAAAAAAABQEAAAAAAwIAAAAABwIAAAICAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBBQEGAQUBBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgIAAAEAAgIAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA="),
//welcome to drone hell
new Structure("CwcAEXNvbGFyLXBhbmVsLWxhcmdlCQAMdGhvcml1bS13YWxsCgAEY29yZQUACmRhZ2dlci1wYWQDAAZsYW5jZXIBABJjYXJiaWRlLXdhbGwtbGFyZ2UGAAxyZXBhaXItcG9pbnQAAANhaXIIAAlkcm9uZS1wYWQEAAtzb2xhci1wYW5lbAIADGNhcmJpZGUtd2FsbBERAQMAAAEAAAACAwIDAAAAAAICAAAAAAIBAgEBAwAAAQMAAAAAAAAAAAAAAwAAAAAAAAACAgADAAMDAAAAAAAAAAAAAAABAAAABAEEAwAAAAAFAwAABgEFAwAAAAAAAAQBBAEBAwAAAAAAAAQDAAAAAAAAAAAAAAQCAAAAAAAAAAAAAAQBAAAAAAIAAwAAAAAABwMAAAgBAAAJAAgBAAAAAAcDAAADAAAAAgACAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAIAAAAAAAUDAAAIAQAACQMJAwkDCQMJAwgBAAAFAwAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAACQIAAAAAAAAAAAAAAAACAwIDBgEEAgkBCQEJAAAACgAAAAkCCQEJAQQCBgECAQIBAAAAAAUDAAAIAQAACQAAAAAAAAAJAggBAAAFAwAAAAAAAAAAAAAAAAAAAAEAAAkACQEJAQkBCQEAAAAAAAAAAAAAAAACAAMAAAAAAAAAAAAIAQAACQIIAQAAAAAAAAAAAwAAAAIAAgAAAAAAAAAHAwAAAAAAAAkCAAAAAAAABwMAAAAAAAACAAEDAAAEAAAAAAAAAAUDAAAEAgUDAAAAAAAAAAAEAAEDAAAAAAAABAAEAAMAAAAAAAAABgEAAAAAAwAAAAQABAAAAAAAAQMAAAEDAAAAAAAAAAAAAAIAAAAAAAAAAAABAwAAAQMAAAAAAAAAAAAAAgMCAwAAAAACAAAAAAACAQIBAAAAAAAAAAA="),
//welcome to bomber/interceptor hell
new Structure("DgUACHNwbGl0dGVyBgAEaGFpbAIAEnRob3JpdW0td2FsbC1sYXJnZQEADHRob3JpdW0td2FsbAQAA2R1bw0ABGNvcmULAAttb25zb29uLXBhZAwACHVubG9hZGVyCgAPaW50ZXJjZXB0b3ItcGFkCAARdGl0YW5pdW0tY29udmV5b3IDAAVzYWx2bwkABnJpcHBsZQAAA2FpcgcAC2Rpc3RyaWJ1dG9yGRkAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAEAAgMAAAIDAAACAwAAAwIAAAQBAwIAAAIDAAACAwAAAgMAAAEAAgIAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAEBAQEAAAAAAAAGAQYBAwIAAAcAAAAIAgcAAAADAgAABgEGAQAAAAAAAAEBAQEAAAAAAgIAAAAACQEAAAoCAAAAAAAAAAAAAAgCAAAAAAAAAAAKAgAAAAAJAQAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgCCAIIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAAAGAAoCAAAKAwAAAAALAwAACAIIAggCAAALAwAACgMAAAoCAAAGAAICAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAIAggCCAIAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAACAgAAAwIAAAAAAAAAAAAAAAAAAAgCCAIIAgAAAAAAAAAAAAAAAAMCAAACAgAAAAABAAAAAAAAAAAAAAALAwAAAAALAwAACAIIAggCAAALAwAAAAALAwAAAAAAAAAAAAABAAEAAwIAAAcAAAAAAAAAAAAAAAAAAAAMAwwBDAIAAAAAAAAAAAAAAAAHBQAAAwIAAAEAAQAAAAAAAAAAAAgDCAMIAwgDCAMMAQAAAAAAAAwCCAEIAQgBCAEIAQAAAAAAAAAAAQABAAQBBQAIAwgDCAMIAwgDCAMIAwwDAAANAAAADAMIAQgBCAEIAQgBCAEIAQUABAEBAAEAAwIAAAcAAAAIAwgDCAMIAwgDDAIAAAAAAAAMAwgBCAEIAQgBCAEHAAAAAwIAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCDAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAIAAAADAgAAAAALAwAAAAALAwAACAAIAAgAAAALAwAAAAALAwAAAwIAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAKAgAACgMAAAAAAAAAAAgACAAIAAAAAAAAAAoDAAAKAgAABgACAAAAAAAAAAAAAAEGAAAAAAAAAAAAAAALAwAACAAIAAgAAAALAwAAAAAAAAAAAAAGAAAAAAAAAAAAAgAAAAAAAAAAAAoCAAAAAAAAAAAIAAgACAAAAAAAAAAKAgAAAAAAAAAAAgAAAAAAAAAAAAAAAAAJAQAAAAAAAAMCAAAHBQAACAAHAAAAAwIAAAAAAAAAAAkBAAAAAAAAAAAAAAEBAQEAAAAAAAAGAQYBAAAAAAAAAAAIAAAAAAAAAAAABgMGAwAAAAAAAAEBAQEAAAAAAgMAAAEAAgMAAwIDAAACAwAAAwIAAAUAAwIAAAIBAAACAQAAAgEAAAEDAgMAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAA=="),
//welcome to unit hell
new Structure("DQoACHNwbGl0dGVyBAAMdGhvcml1bS13YWxsDAAEY29yZQEACmRhZ2dlci1wYWQHAAttb25zb29uLXBhZAsACHVubG9hZGVyCAAPaW50ZXJjZXB0b3ItcGFkBQARdGl0YW5pdW0tY29udmV5b3IJAAxyZXBhaXItcG9pbnQDAAVzYWx2bwAAA2FpcgIACXRpdGFuLXBhZAYAC3NvbGFyLXBhbmVsFRUAAAAAAAAAAAAAAAABAQAAAQEAAAAAAQEAAAEBAAAAAAAAAAAAAAAAAAAAAAIBAAAAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAAAAAAIBAAAAAAAAAAAAAAAAAAADAQAABAAEAAAABAAEAAMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQMGAAAABgAFAQAAAAAAAAAAAAAAAAAAAAAAAAIBAAAAAAcDAAAIAwAABQIJAAAACQAFAggDAAAAAAcDAAAAAAIBAAAAAAAAAAAAAAAAAAAAAAAABQIKAAACCgAFAgAAAAAAAAAAAAAAAAAAAAABAQAAAwEAAAgDAAAAAAAAAAAFAgACBQIAAAAAAAAIAwAAAwEAAAEBAAAAAAAAAAAAAAAAAAAAAAcDAAAFAgACBQIAAAcDAAAAAAAAAAAAAAAAAAABAQAABAMFAgUDBQMAAAAAAAALAQACCwEAAAAAAAAFAQUBBQIEAQEBAAAAAAAABAMGAAkACgAFAwUDCwIAAAAAAAALAQUBBQEKAAkABgAEAQAAAAAAAAAAAAAAAAAAAAMAAwADAAIAAAwAAAAAAgABAAEAAQAAAAAAAAAAAAABAQAABAMGAAkACgAFAwUDCwAAAAAAAAALAgUBBQEKAAkABgAEAQEBAAAAAAAABAMFAAUDBQMAAAAAAAALAQABCwAAAAAAAAAFAQUBBQAEAQAAAAABAQAAAwEAAAgDAAAAAAcDAAAFAAAABQAAAAcDAAAIAwAAAwEAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAwAABQAKAAAACgAFAAgDAAAAAAAAAAAAAAAAAAAAAAIBAAAAAAcDAAAAAAAABQAJAAAACQAFAAAAAAAAAAcDAAAAAAIBAAAAAAAAAAAAAAAAAAADAQAABQMGAAAABgAFAQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAIBAAAAAAIBAAEBAQAAAQEAAAAAAQEAAAEBAAAAAAIBAAAAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA=")
};
} }
public void generate(Generation gen, Team team, int coreX, int coreY, int enemyX, int enemyY){ public void generate(Generation gen, Team team, int coreX, int coreY, int enemyX, int enemyY){
@@ -78,18 +122,31 @@ public class FortressGenerator{
void genOutposts(){ void genOutposts(){
int padding = 10; int padding = 10;
int maxDifficulty = 10; int maxDifficulty = 13;
float baseChance = 0.75f; float baseChance = 0.4f;
Array<Structure> selected = new Array<>(); Array<Structure> selected = new Array<>();
Array<Rectangle> used = new Array<>(); Array<Rectangle> used = new Array<>();
Rectangle rect = new Rectangle(); Rectangle rect = new Rectangle();
Structure base = bases[Mathf.clamp((int)(bases.length * (float)gen.sector.difficulty / maxDifficulty) + gen.random.range(2), 0, bases.length-1)];
int maxIndex = (int)(1 + ((float)gen.sector.difficulty / maxDifficulty * (structures.length-2))); int maxIndex = (int)(1 + ((float)gen.sector.difficulty / maxDifficulty * (structures.length-2)));
for(int i = maxIndex/3; i < maxIndex; i++){ for(int i = maxIndex/2; i < maxIndex; i++){
selected.add(structures[i]); selected.add(structures[i]);
} }
used.add(new Rectangle(enemyX - base.width()/2, enemyY - base.height()/2, base.width(), base.height()));
int elev = gen.tiles[enemyX][enemyY].getElevation();
for(int x = 0; x < base.width(); x++){
for(int y = 0; y < base.height(); y++){
Tile tile = gen.tiles[enemyX - base.width()/2 + x][enemyY - base.height()/2 + y];
StructBlock block = base.layout[x][y];
tile.setElevation(elev);
tile.setRotation(block.rotation);
tile.setBlock(block.block, team);
}
}
for(Structure struct : selected){ for(Structure struct : selected){
for(int x = padding; x < gen.width - padding; x++){ for(int x = padding; x < gen.width - padding; x++){
loop: loop:
@@ -115,9 +172,7 @@ public class FortressGenerator{
tile.setRotation(block.rotation); tile.setRotation(block.rotation);
tile.setBlock(block.block, team); tile.setBlock(block.block, team);
if(block.block instanceof Turret){ fill(tile);
fillTurret(tile);
}
} }
} }
} }
@@ -127,14 +182,17 @@ public class FortressGenerator{
} }
} }
void fillTurret(Tile tile){ void fill(Tile tile){
Block block = tile.block(); Block block = tile.block();
if(block instanceof PowerTurret){ if(block instanceof PowerTurret){
tile.entity.power.amount = block.powerCapacity; tile.entity.power.amount = block.powerCapacity;
}else if(block instanceof ItemTurret){ }else if(block instanceof ItemTurret){
ItemTurret turret = (ItemTurret)block; ItemTurret turret = (ItemTurret)block;
AmmoType[] type = turret.getAmmoTypes(); AmmoType[] type = turret.getAmmoTypes();
block.handleStack(type[0].item, block.acceptStack(type[0].item, 1000, tile, null), tile, null); block.handleStack(type[0].item, block.acceptStack(type[0].item, 1000, tile, null), tile, null);
}else if(block instanceof ResupplyPoint){
tile.entity.items.add(Items.lead, tile.block().itemCapacity);
} }
} }
@@ -148,5 +206,19 @@ public class FortressGenerator{
this.layout = StructureFormat.read(encoding); this.layout = StructureFormat.read(encoding);
this.chance = chance; this.chance = chance;
} }
public Structure(String encoding){
this.ore = null;
this.layout = StructureFormat.read(encoding);
this.chance = 0;
}
int width(){
return layout.length;
}
int height(){
return layout[0].length;
}
} }
} }

View File

@@ -248,10 +248,12 @@ public class WorldGenerator{
int lerpDst = 20; int lerpDst = 20;
lerpDst *= lerpDst; lerpDst *= lerpDst;
float minDst = Float.MAX_VALUE;
if(detailed && spawnpoints != null){ if(detailed && spawnpoints != null){
for(GridPoint2 p : spawnpoints){ for(GridPoint2 p : spawnpoints){
float dst = Vector2.dst2(p.x, p.y, localX, localY); float dst = Vector2.dst2(p.x, p.y, localX, localY);
minDst = Math.min(minDst, dst);
if(dst < lerpDst){ if(dst < lerpDst){
float targetElevation = Math.max(0.86f, (float)elevationOf(sectorX * sectorSize + p.x + Short.MAX_VALUE, sectorY * sectorSize + p.y + Short.MAX_VALUE, true)); float targetElevation = Math.max(0.86f, (float)elevationOf(sectorX * sectorSize + p.x + Short.MAX_VALUE, sectorY * sectorSize + p.y + Short.MAX_VALUE, true));
@@ -273,7 +275,7 @@ public class WorldGenerator{
}else if(temp + ridge/2f < 0.8 || elevation < 1.3){ }else if(temp + ridge/2f < 0.8 || elevation < 1.3){
floor = Blocks.blackstone; floor = Blocks.blackstone;
if(iceridge > 0.25){ if(iceridge > 0.25 && minDst > lerpDst/1.5f){
elevation ++; elevation ++;
} }
}else{ }else{

View File

@@ -88,6 +88,11 @@ public abstract class Turret extends Block{
turretIcon = true; turretIcon = true;
} }
@Override
public boolean outputsItems(){
return false;
}
@Override @Override
public void init(){ public void init(){
super.init(); super.init();

View File

@@ -26,6 +26,7 @@ public class SortedUnloader extends Unloader implements SelectionTrait{
@Remote(targets = Loc.both, called = Loc.both, forward = true) @Remote(targets = Loc.both, called = Loc.both, forward = true)
public static void setSortedUnloaderItem(Player player, Tile tile, Item item){ public static void setSortedUnloaderItem(Player player, Tile tile, Item item){
SortedUnloaderEntity entity = tile.entity(); SortedUnloaderEntity entity = tile.entity();
entity.items.clear();
entity.sortItem = item; entity.sortItem = item;
} }
@@ -35,7 +36,7 @@ public class SortedUnloader extends Unloader implements SelectionTrait{
if(entity.items.total() == 0 && entity.timer.get(timerUnload, speed)){ if(entity.items.total() == 0 && entity.timer.get(timerUnload, speed)){
tile.allNearby(other -> { tile.allNearby(other -> {
if(other.block() instanceof StorageBlock && entity.items.total() == 0 && if(other.getTeam() == tile.getTeam() && other.block() instanceof StorageBlock && entity.items.total() == 0 &&
((entity.sortItem == null && other.entity.items.total() > 0) || ((StorageBlock) other.block()).hasItem(other, entity.sortItem))){ ((entity.sortItem == null && other.entity.items.total() > 0) || ((StorageBlock) other.block()).hasItem(other, entity.sortItem))){
offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, entity.sortItem)); offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, entity.sortItem));
} }

View File

@@ -22,7 +22,7 @@ public class Unloader extends Block{
public void update(Tile tile){ public void update(Tile tile){
if(tile.entity.items.total() == 0 && tile.entity.timer.get(timerUnload, speed)){ if(tile.entity.items.total() == 0 && tile.entity.timer.get(timerUnload, speed)){
tile.allNearby(other -> { tile.allNearby(other -> {
if(other.block() instanceof StorageBlock && tile.entity.items.total() == 0 && if(other.getTeam() == tile.getTeam() && other.block() instanceof StorageBlock && tile.entity.items.total() == 0 &&
((StorageBlock) other.block()).hasItem(other, null)){ ((StorageBlock) other.block()).hasItem(other, null)){
offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, null)); offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, null));
} }

View File

@@ -9,6 +9,7 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.graphics.Shaders;
@@ -39,7 +40,6 @@ public class UnitPad extends Block{
protected float produceTime = 1000f; protected float produceTime = 1000f;
protected float openDuration = 50f; protected float openDuration = 50f;
protected float launchVelocity = 0f; protected float launchVelocity = 0f;
protected String unitRegion;
public UnitPad(String name){ public UnitPad(String name){
super(name); super(name);
@@ -109,7 +109,7 @@ public class UnitPad extends Block{
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
UnitFactoryEntity entity = tile.entity(); UnitFactoryEntity entity = tile.entity();
TextureRegion region = Draw.region(unitRegion == null ? type.name : unitRegion); TextureRegion region = type.iconRegion;
Draw.rect(name(), tile.drawx(), tile.drawy()); Draw.rect(name(), tile.drawx(), tile.drawy());
@@ -135,7 +135,7 @@ public class UnitPad extends Block{
Draw.reset(); Draw.reset();
Draw.rect(name + (entity.open ? "-top-open" : "-top"), tile.drawx(), tile.drawy()); Draw.rect(name + (entity.open || entity.hasSpawned ? "-top-open" : "-top"), tile.drawx(), tile.drawy());
} }
@Override @Override
@@ -157,21 +157,22 @@ public class UnitPad extends Block{
} }
} }
/* boolean isEnemy = tile.getTeam() == Team.red;
if(!entity.hasSpawned){
for(BaseUnit unit : unitGroups[tile.getTeamID()].all()){ if(!isEnemy){
if(unit.getType() == type && unit.getSpawner() == null){ //player-made spawners have default behavior
entity.hasSpawned = true;
unit.setSpawner(tile); if(!entity.hasSpawned && hasRequirements(entity.items, entity.buildTime / produceTime) &&
break; entity.cons.valid() && !entity.open){
}
entity.buildTime += Timers.delta();
entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f);
}else{
if(!entity.open) entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f);
} }
}*/ }else if(!entity.hasSpawned){
//otherwise, it's an enemy, cheat by not requiring resources
if(!entity.hasSpawned && hasRequirements(entity.items, entity.buildTime / produceTime) && entity.buildTime += Timers.delta() / 4f;
entity.cons.valid() && !entity.open){
entity.buildTime += Timers.delta();
entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f);
}else{ }else{
if(!entity.open) entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f); if(!entity.open) entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f);

View File

@@ -92,6 +92,8 @@ public class InventoryModule extends BlockModule{
} }
public void remove(Item item, int amount){ public void remove(Item item, int amount){
amount = Math.min(amount, items[item.id]);
items[item.id] -= amount; items[item.id] -= amount;
total -= amount; total -= amount;
} }