Added thermal generator / Enemy bases with spawning
Before Width: | Height: | Size: 478 B After Width: | Height: | Size: 455 B |
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 534 B |
Before Width: | Height: | Size: 313 B After Width: | Height: | Size: 501 B |
BIN
core/assets-raw/sprites/blocks/units/dagger-pad-top-open.png
Normal file
After Width: | Height: | Size: 432 B |
BIN
core/assets-raw/sprites/blocks/units/dagger-pad-top.png
Normal file
After Width: | Height: | Size: 439 B |
BIN
core/assets-raw/sprites/blocks/units/dagger-pad.png
Normal file
After Width: | Height: | Size: 284 B |
Before Width: | Height: | Size: 425 B |
After Width: | Height: | Size: 434 B |
Before Width: | Height: | Size: 443 B After Width: | Height: | Size: 433 B |
Before Width: | Height: | Size: 561 B After Width: | Height: | Size: 562 B |
BIN
core/assets-raw/sprites/blocks/units/titan-pad-top-open.png
Normal file
After Width: | Height: | Size: 339 B |
BIN
core/assets-raw/sprites/blocks/units/titan-pad-top.png
Normal file
After Width: | Height: | Size: 332 B |
BIN
core/assets-raw/sprites/blocks/units/titan-pad.png
Normal file
After Width: | Height: | Size: 572 B |
Before Width: | Height: | Size: 195 B After Width: | Height: | Size: 195 B |
Before Width: | Height: | Size: 177 B After Width: | Height: | Size: 177 B |
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 279 B |
@ -526,6 +526,9 @@ block.command-center.name=Command Center
|
||||
block.mass-driver.name=Mass Driver
|
||||
block.blast-drill.name=Blast Drill
|
||||
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.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
|
||||
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 138 KiB |
@ -95,6 +95,7 @@ public class Recipes implements ContentList{
|
||||
//generators - combustion
|
||||
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.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
|
||||
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
|
||||
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.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.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.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.resupplyPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));
|
||||
|
@ -8,7 +8,7 @@ import io.anuke.mindustry.game.Content;
|
||||
import io.anuke.mindustry.type.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
|
||||
public void load(){
|
||||
@ -23,7 +23,7 @@ public class UnitTypes implements ContentList{
|
||||
health = 45;
|
||||
}};
|
||||
|
||||
scout = new UnitType("scout", Scout.class, Scout::new){{
|
||||
dagger = new UnitType("dagger", Dagger.class, Dagger::new){{
|
||||
maxVelocity = 1.1f;
|
||||
speed = 0.2f;
|
||||
drag = 0.4f;
|
||||
@ -55,6 +55,7 @@ public class UnitTypes implements ContentList{
|
||||
drag = 0.01f;
|
||||
isFlying = true;
|
||||
weapon = Weapons.bomber;
|
||||
ammoCapacity = 50;
|
||||
}};
|
||||
|
||||
fabricator = new UnitType("fabricator", Fabricator.class, Fabricator::new){{
|
||||
|
@ -22,6 +22,7 @@ public class LiquidBlocks extends BlockList implements ContentList{
|
||||
pumpAmount = 0.25f;
|
||||
consumes.power(0.015f);
|
||||
liquidCapacity = 30f;
|
||||
powerCapacity = 20f;
|
||||
hasPower = true;
|
||||
size = 2;
|
||||
tier = 1;
|
||||
@ -32,6 +33,8 @@ public class LiquidBlocks extends BlockList implements ContentList{
|
||||
pumpAmount = 0.55f;
|
||||
consumes.power(0.03f);
|
||||
liquidCapacity = 40f;
|
||||
hasPower = true;
|
||||
powerCapacity = 20f;
|
||||
size = 2;
|
||||
tier = 2;
|
||||
}};
|
||||
|
@ -21,9 +21,8 @@ public class PowerBlocks extends BlockList implements ContentList{
|
||||
|
||||
thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{
|
||||
maxLiquidGenerate = 0.5f;
|
||||
powerPerLiquid = 0.08f;
|
||||
powerCapacity = 40f;
|
||||
powerPerLiquid = 0.25f;
|
||||
powerPerLiquid = 0.55f;
|
||||
generateEffect = BlockFx.redgeneratespark;
|
||||
size = 2;
|
||||
}};
|
||||
|
@ -9,7 +9,7 @@ import io.anuke.mindustry.world.blocks.units.*;
|
||||
|
||||
public class UnitBlocks extends BlockList implements ContentList{
|
||||
public static Block resupplyPoint, repairPoint, dronePad,
|
||||
fabricatorPad, interceptorPad, monsoonPad, scoutPad, titanPad,
|
||||
fabricatorPad, interceptorPad, monsoonPad, daggerPad, titanPad,
|
||||
dropPoint, reconstructor, overdriveProjector, shieldProjector, commandCenter;
|
||||
|
||||
@Override
|
||||
@ -24,7 +24,7 @@ public class UnitBlocks extends BlockList implements ContentList{
|
||||
|
||||
fabricatorPad = new UnitPad("fabricator-pad"){{
|
||||
type = UnitTypes.fabricator;
|
||||
produceTime = 1600;
|
||||
produceTime = 1400;
|
||||
size = 2;
|
||||
consumes.power(0.2f);
|
||||
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"){{
|
||||
type = UnitTypes.interceptor;
|
||||
produceTime = 1300;
|
||||
produceTime = 800;
|
||||
size = 2;
|
||||
consumes.power(0.1f);
|
||||
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 30), new ItemStack(Items.titanium, 40)});
|
||||
consumes.power(0.08f);
|
||||
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.titanium, 10)});
|
||||
}};
|
||||
|
||||
monsoonPad = new UnitPad("monsoon-pad"){{
|
||||
@ -44,7 +44,24 @@ public class UnitBlocks extends BlockList implements ContentList{
|
||||
size = 3;
|
||||
consumes.power(0.14f);
|
||||
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"){{
|
||||
|
@ -43,7 +43,7 @@ public class UnitType implements UnlockableContent{
|
||||
public float retreatPercent = 0.2f;
|
||||
public float armor = 0f;
|
||||
public float carryWeight = 1f;
|
||||
public int ammoCapacity = 100;
|
||||
public int ammoCapacity = 220;
|
||||
public int itemCapacity = 30;
|
||||
public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.tungsten);
|
||||
public float buildPower = 0.3f, minePower = 0.7f, healSpeed = 0.1f;
|
||||
|
@ -2,6 +2,6 @@ package io.anuke.mindustry.entities.units.types;
|
||||
|
||||
import io.anuke.mindustry.entities.units.GroundUnit;
|
||||
|
||||
public class Scout extends GroundUnit{
|
||||
public class Dagger extends GroundUnit{
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package io.anuke.mindustry.game;
|
||||
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.badlogic.gdx.utils.ObjectMap;
|
||||
import com.badlogic.gdx.utils.ObjectSet;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
@ -130,7 +131,7 @@ public class TeamInfo{
|
||||
}
|
||||
|
||||
public class TeamData{
|
||||
public final ThreadArray<Tile> cores = new ThreadArray<>();
|
||||
public final Array<Tile> cores = new ThreadArray<>();
|
||||
public final Team team;
|
||||
public final boolean ally;
|
||||
|
||||
|
@ -11,7 +11,7 @@ public class Waves{
|
||||
|
||||
public static Array<SpawnGroup> getSpawns(){
|
||||
return Array.with(
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
end = 8;
|
||||
unitScaling = 2;
|
||||
}},
|
||||
@ -21,7 +21,7 @@ public class Waves{
|
||||
end = 14;
|
||||
}},
|
||||
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
begin = 11;
|
||||
unitScaling = 2;
|
||||
spacing = 2;
|
||||
@ -36,7 +36,7 @@ public class Waves{
|
||||
end = 30;
|
||||
}},
|
||||
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
begin = 10;
|
||||
unitScaling = 2;
|
||||
unitAmount = 1;
|
||||
@ -79,7 +79,7 @@ public class Waves{
|
||||
max = 7;
|
||||
}},
|
||||
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
begin = 82;
|
||||
spacing = 3;
|
||||
unitAmount = 4;
|
||||
@ -89,7 +89,7 @@ public class Waves{
|
||||
ammoItem = Items.silicon;
|
||||
}},
|
||||
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
begin = 41;
|
||||
spacing = 5;
|
||||
unitAmount = 1;
|
||||
@ -99,7 +99,7 @@ public class Waves{
|
||||
max = 10;
|
||||
}},
|
||||
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
begin = 35;
|
||||
spacing = 3;
|
||||
unitAmount = 4;
|
||||
@ -109,7 +109,7 @@ public class Waves{
|
||||
end = 60;
|
||||
}},
|
||||
|
||||
new SpawnGroup(UnitTypes.scout){{
|
||||
new SpawnGroup(UnitTypes.dagger){{
|
||||
begin = 42;
|
||||
spacing = 3;
|
||||
unitAmount = 4;
|
||||
|
@ -13,13 +13,16 @@ import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
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.Turret;
|
||||
import io.anuke.mindustry.world.blocks.units.ResupplyPoint;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
import static io.anuke.mindustry.Vars.world;
|
||||
|
||||
public class FortressGenerator{
|
||||
private final static int minCoreDst = 60;
|
||||
|
||||
private static Structure[] structures;
|
||||
private static Structure[] bases;
|
||||
|
||||
private int enemyX, enemyY, coreX, coreY;
|
||||
private Team team;
|
||||
@ -40,9 +43,15 @@ public class FortressGenerator{
|
||||
//more advanced duo outpost
|
||||
new Structure(0.04f, Items.lead, "BwYADnR1bmdzdGVuLWRyaWxsAwADZHVvBAAIc3BsaXR0ZXIBAA10dW5nc3Rlbi13YWxsAgATdHVuZ3N0ZW4td2FsbC1sYXJnZQAAA2FpcgUACGNvbnZleW9yCQkAAAAAAQEBAQEBAQEBAgAAAAAAAAICAAEDAAQDAwACAgAAAAABAgACAAABAgUCAQEAAAAAAQABAgMAAQIBAgUCAQEBAQMAAQABAgQCBQMFAwYCBQEFAQQDAQABAgMAAQEBAQUAAQMBAwMAAQABAwICAAMBAQUAAQMCAgADAQMAAAAAAAIDAAQDAwAAAwADAAAAAAAAAQIBAwEDAQMBAwAAAAA="),
|
||||
|
||||
//tungsten duo and drone outpost
|
||||
new Structure(0.02f, Items.tungsten, "BgEADXR1bmdzdGVuLXdhbGwEAA1jYXJiaWRlLWRyaWxsAwADZHVvAgATdHVuZ3N0ZW4td2FsbC1sYXJnZQAAA2FpcgUACWRyb25lLXBhZAUHAAAAAAEDAQMCAgAAAAAAAAAAAQADAAADAAMBAgAAAAABAAQBBQAAAAECAAAAAAEAAwAAAAAAAQIAAAAAAQABAQEBAQEBAg=="),
|
||||
|
||||
//lead storage
|
||||
new Structure(0.02f, Items.lead, vaults),
|
||||
|
||||
//mini dagger outpost
|
||||
new Structure(0.02f, Items.lead, "CwIADXR1bmdzdGVuLXdhbGwGAAhjb252ZXlvcgUAA2R1bwgACmRhZ2dlci1wYWQBABN0dW5nc3Rlbi13YWxsLWxhcmdlBwAIc3BsaXR0ZXIDAA5yZXN1cHBseS1wb2ludAoADHJlcGFpci1wb2ludAkADnR1bmdzdGVuLWRyaWxsAAADYWlyBAALc29sYXItcGFuZWwHCQAAAAABAAABAgECAQIBAAAAAAEAAAMAAwADAwEEAAIBAgICAgAAAAAFAwYDBwMCAQIBBQECAgAAAAAIAAAACQMGAQYBBwMCAgAAAAAAAAAAAQMAAAIDBQECAgEAAAAKAQQBAAAAAAIBAgECAgAAAAACAQIBAgEAAAAAAAAAAA=="),
|
||||
|
||||
//salvo outpost
|
||||
new Structure(0.02f, Items.tungsten, "BAIABXNhbHZvAwANY2FyYmlkZS1kcmlsbAAAA2FpcgEADGNhcmJpZGUtd2FsbAcHAAAAAAEDAQMBAwEDAAABAwEDAQMCAAAAAQMAAAEAAgAAAAAAAAABAwEDAQAAAAAAAwACAAAAAQIBAAEBAgAAAAAAAAABAgAAAQEAAAAAAQEBAQEBAAABAQEBAQEBAQAAAAA="),
|
||||
|
||||
@ -52,15 +61,50 @@ public class FortressGenerator{
|
||||
//titanium storage
|
||||
new Structure(0.02f, Items.titanium, vaults),
|
||||
|
||||
//2x interceptor outpost
|
||||
new Structure(0.02f, Items.lead, "CgMAEXNvbGFyLXBhbmVsLWxhcmdlBgADZHVvAgAPaW50ZXJjZXB0b3ItcGFkBAASY2FyYmlkZS13YWxsLWxhcmdlBwAOcmVzdXBwbHktcG9pbnQAAANhaXIFAAtzb2xhci1wYW5lbAEADGNhcmJpZGUtd2FsbAkAC2Rpc3RyaWJ1dG9yCAALbGFzZXItZHJpbGwKCAEAAQMBAwEDAQMBAwECAAABAAIDAAAAAAAAAAABAgAAAQAAAAAAAAADAQAAAQIBAgQDAAAFAAAAAAAAAAYCAQMAAAAABwAIAAAACQAAAAECBAMAAAEAAAAAAAABAAABAgAAAAAFAAAAAAAAAAYCAQIBAAIDAAAAAAMBAAABAgECAQAAAAAAAAAAAAAAAQIAAAEAAQEBAQEBAQEBAQEBAAA="),
|
||||
|
||||
//coal laser outpost
|
||||
new Structure(0.03f, null, "BgEADHRob3JpdW0td2FsbAMABmxhbmNlcgUAFGNvbWJ1c3Rpb24tZ2VuZXJhdG9yBAANY2FyYmlkZS1kcmlsbAAAA2FpcgIAC3NvbGFyLXBhbmVsBwcAAAEAAQABAQEBAQEBAAAAAQACAgMAAAACAAEAAAABAAICAAAAAAIAAQAAAAEAAQAEAQUAAQABAAAAAQACAAMBAAMCAAEAAAABAAIAAAMAAwIAAQAAAAEAAQABAwEDAQABAA=="),
|
||||
|
||||
//ultimate laser outpost
|
||||
new Structure(0.02f, null, "BgMABmxhbmNlcgIAEmNhcmJpZGUtd2FsbC1sYXJnZQUAEXNvbGFyLXBhbmVsLWxhcmdlAAADYWlyBAALc29sYXItcGFuZWwBAAxjYXJiaWRlLXdhbGwPDwAAAAAAAAAAAAABAwIDAAABAwAAAAAAAAAAAAAAAAAAAAACAwAAAgMAAAAAAAACAwAAAgMAAAAAAAAAAAAAAQMAAAAAAAAAAAMDAAAAAAAAAAAAAAIDAAAAAAAAAgMAAAMDAAAEAwAAAAADAwAAAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAAAAAAAAAgMAAAMDAAAAAAUDAAAAAAAAAAAEAwAAAAABAwEDAAAAAAAAAAAAAAAAAAAAAAUDAAADAwAAAgMAAAIDAAADAwAAAAAAAAAABAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAFAwAAAAAAAAAAAwMAAAIDAAABAwEDAgMAAAQDAAAAAAAAAAAFAwAAAAAAAAAAAAAAAAAAAAAAAAMDAAADAwAAAAAAAAAAAwMAAAIDAAAAAAAAAgMAAAAAAAAAAAAAAwMAAAQDAAAAAAAAAAAAAAAAAAAAAAIDAAACAwAAAAAAAAIDAAACAwAAAQMAAAAAAAABAwAAAAAAAAAAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAAAAAEDAAAAAAAAAAAAAA=="),
|
||||
|
||||
//fabricator outpost
|
||||
new Structure(0.02f, Items.tungsten, "BgUADWNhcmJpZGUtZHJpbGwBABJ0aG9yaXVtLXdhbGwtbGFyZ2UCAAx0aG9yaXVtLXdhbGwEAANkdW8AAANhaXIDAA5mYWJyaWNhdG9yLXBhZAkJAAAAAAEDAAACAwEDAAAAAAAAAAACAwADAAMCAwADAAMCAgAAAQMAAAMCAAACAAMCAAABAwAAAAAAAAAAAAAEAgAAAAAAAgAAAgMCAAIBBAIFAAQCAgMCAgIDAQMAAAMCAAAEAgMCAAABAwAAAAAAAAAAAAACAQAAAAAAAgAAAAACAAEDAAECAQEDAAECAQAAAAAAAAAAAAACAwACAAAAAAAA"),
|
||||
|
||||
//coal storage
|
||||
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){
|
||||
@ -78,18 +122,31 @@ public class FortressGenerator{
|
||||
|
||||
void genOutposts(){
|
||||
int padding = 10;
|
||||
int maxDifficulty = 10;
|
||||
float baseChance = 0.75f;
|
||||
int maxDifficulty = 13;
|
||||
float baseChance = 0.4f;
|
||||
Array<Structure> selected = new Array<>();
|
||||
Array<Rectangle> used = new Array<>();
|
||||
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)));
|
||||
|
||||
for(int i = maxIndex/3; i < maxIndex; i++){
|
||||
for(int i = maxIndex/2; i < maxIndex; 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(int x = padding; x < gen.width - padding; x++){
|
||||
loop:
|
||||
@ -115,9 +172,7 @@ public class FortressGenerator{
|
||||
tile.setRotation(block.rotation);
|
||||
tile.setBlock(block.block, team);
|
||||
|
||||
if(block.block instanceof Turret){
|
||||
fillTurret(tile);
|
||||
}
|
||||
fill(tile);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -127,14 +182,17 @@ public class FortressGenerator{
|
||||
}
|
||||
}
|
||||
|
||||
void fillTurret(Tile tile){
|
||||
void fill(Tile tile){
|
||||
Block block = tile.block();
|
||||
|
||||
if(block instanceof PowerTurret){
|
||||
tile.entity.power.amount = block.powerCapacity;
|
||||
}else if(block instanceof ItemTurret){
|
||||
ItemTurret turret = (ItemTurret)block;
|
||||
AmmoType[] type = turret.getAmmoTypes();
|
||||
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.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -248,10 +248,12 @@ public class WorldGenerator{
|
||||
|
||||
int lerpDst = 20;
|
||||
lerpDst *= lerpDst;
|
||||
float minDst = Float.MAX_VALUE;
|
||||
|
||||
if(detailed && spawnpoints != null){
|
||||
for(GridPoint2 p : spawnpoints){
|
||||
float dst = Vector2.dst2(p.x, p.y, localX, localY);
|
||||
minDst = Math.min(minDst, dst);
|
||||
|
||||
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));
|
||||
@ -273,7 +275,7 @@ public class WorldGenerator{
|
||||
}else if(temp + ridge/2f < 0.8 || elevation < 1.3){
|
||||
floor = Blocks.blackstone;
|
||||
|
||||
if(iceridge > 0.25){
|
||||
if(iceridge > 0.25 && minDst > lerpDst/1.5f){
|
||||
elevation ++;
|
||||
}
|
||||
}else{
|
||||
|
@ -88,6 +88,11 @@ public abstract class Turret extends Block{
|
||||
turretIcon = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean outputsItems(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
super.init();
|
||||
|
@ -26,6 +26,7 @@ public class SortedUnloader extends Unloader implements SelectionTrait{
|
||||
@Remote(targets = Loc.both, called = Loc.both, forward = true)
|
||||
public static void setSortedUnloaderItem(Player player, Tile tile, Item item){
|
||||
SortedUnloaderEntity entity = tile.entity();
|
||||
entity.items.clear();
|
||||
entity.sortItem = item;
|
||||
}
|
||||
|
||||
@ -35,7 +36,7 @@ public class SortedUnloader extends Unloader implements SelectionTrait{
|
||||
|
||||
if(entity.items.total() == 0 && entity.timer.get(timerUnload, speed)){
|
||||
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))){
|
||||
offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, entity.sortItem));
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ public class Unloader extends Block{
|
||||
public void update(Tile tile){
|
||||
if(tile.entity.items.total() == 0 && tile.entity.timer.get(timerUnload, speed)){
|
||||
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)){
|
||||
offloadNear(tile, ((StorageBlock) other.block()).removeItem(other, null));
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.entities.Units;
|
||||
import io.anuke.mindustry.entities.units.BaseUnit;
|
||||
import io.anuke.mindustry.entities.units.UnitType;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.gen.Call;
|
||||
import io.anuke.mindustry.graphics.Palette;
|
||||
import io.anuke.mindustry.graphics.Shaders;
|
||||
@ -39,7 +40,6 @@ public class UnitPad extends Block{
|
||||
protected float produceTime = 1000f;
|
||||
protected float openDuration = 50f;
|
||||
protected float launchVelocity = 0f;
|
||||
protected String unitRegion;
|
||||
|
||||
public UnitPad(String name){
|
||||
super(name);
|
||||
@ -109,7 +109,7 @@ public class UnitPad extends Block{
|
||||
@Override
|
||||
public void draw(Tile tile){
|
||||
UnitFactoryEntity entity = tile.entity();
|
||||
TextureRegion region = Draw.region(unitRegion == null ? type.name : unitRegion);
|
||||
TextureRegion region = type.iconRegion;
|
||||
|
||||
Draw.rect(name(), tile.drawx(), tile.drawy());
|
||||
|
||||
@ -135,7 +135,7 @@ public class UnitPad extends Block{
|
||||
|
||||
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
|
||||
@ -157,21 +157,22 @@ public class UnitPad extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if(!entity.hasSpawned){
|
||||
for(BaseUnit unit : unitGroups[tile.getTeamID()].all()){
|
||||
if(unit.getType() == type && unit.getSpawner() == null){
|
||||
entity.hasSpawned = true;
|
||||
unit.setSpawner(tile);
|
||||
break;
|
||||
}
|
||||
boolean isEnemy = tile.getTeam() == Team.red;
|
||||
|
||||
if(!isEnemy){
|
||||
//player-made spawners have default behavior
|
||||
|
||||
if(!entity.hasSpawned && hasRequirements(entity.items, entity.buildTime / produceTime) &&
|
||||
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);
|
||||
}
|
||||
}*/
|
||||
|
||||
if(!entity.hasSpawned && hasRequirements(entity.items, entity.buildTime / produceTime) &&
|
||||
entity.cons.valid() && !entity.open){
|
||||
|
||||
entity.buildTime += Timers.delta();
|
||||
}else if(!entity.hasSpawned){
|
||||
//otherwise, it's an enemy, cheat by not requiring resources
|
||||
entity.buildTime += Timers.delta() / 4f;
|
||||
entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f);
|
||||
}else{
|
||||
if(!entity.open) entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f);
|
||||
|
@ -92,6 +92,8 @@ public class InventoryModule extends BlockModule{
|
||||
}
|
||||
|
||||
public void remove(Item item, int amount){
|
||||
amount = Math.min(amount, items[item.id]);
|
||||
|
||||
items[item.id] -= amount;
|
||||
total -= amount;
|
||||
}
|
||||
|