From 8556b7eef74c8c9f01cbe659b5212196fb83dad2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 15 Oct 2019 00:23:38 -0400 Subject: [PATCH] Block build visibility --- .../io/anuke/mindustry/content/Blocks.java | 32 +++++++++---------- .../io/anuke/mindustry/mod/ContentParser.java | 7 ++-- core/src/io/anuke/mindustry/world/Block.java | 18 +++++------ .../mindustry/world/meta/BuildVisibility.java | 22 +++++++++++++ 4 files changed, 49 insertions(+), 30 deletions(-) create mode 100644 core/src/io/anuke/mindustry/world/meta/BuildVisibility.java diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index c3890b1874..130d56d369 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -9,7 +9,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.Bullet; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -29,8 +29,6 @@ import io.anuke.mindustry.world.consumers.*; import io.anuke.mindustry.world.meta.*; import io.anuke.mindustry.world.modules.*; -import static io.anuke.mindustry.Vars.*; - public class Blocks implements ContentList{ public static Block @@ -716,23 +714,23 @@ public class Blocks implements ContentList{ //region sandbox powerVoid = new PowerVoid("power-void"){{ - requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; powerSource = new PowerSource("power-source"){{ - requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; itemSource = new ItemSource("item-source"){{ - requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; itemVoid = new ItemVoid("item-void"){{ - requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; liquidSource = new LiquidSource("liquid-source"){{ - requirements(Category.liquid, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with()); alwaysUnlocked = true; }}; message = new MessageBlock("message"){{ @@ -745,27 +743,27 @@ public class Blocks implements ContentList{ int wallHealthMultiplier = 4; scrapWall = new Wall("scrap-wall"){{ - requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); health = 60 * wallHealthMultiplier; variants = 5; }}; scrapWallLarge = new Wall("scrap-wall-large"){{ - requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); health = 60 * 4 * wallHealthMultiplier; size = 2; variants = 4; }}; scrapWallHuge = new Wall("scrap-wall-huge"){{ - requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); health = 60 * 9 * wallHealthMultiplier; size = 3; variants = 3; }}; scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ - requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); health = 60 * 16 * wallHealthMultiplier; size = 4; }}; @@ -1235,7 +1233,7 @@ public class Blocks implements ContentList{ //region storage coreShard = new CoreBlock("core-shard"){{ - requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 1000)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000)); alwaysUnlocked = true; health = 1100; @@ -1244,7 +1242,7 @@ public class Blocks implements ContentList{ }}; coreFoundation = new CoreBlock("core-foundation"){{ - requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 1500, Items.silicon, 1000)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 400, Items.silicon, 3000)); health = 2000; itemCapacity = 9000; @@ -1252,7 +1250,7 @@ public class Blocks implements ContentList{ }}; coreNucleus = new CoreBlock("core-nucleus"){{ - requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 1000)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 3000)); health = 4000; itemCapacity = 13000; @@ -1277,7 +1275,7 @@ public class Blocks implements ContentList{ }}; launchPad = new LaunchPad("launch-pad"){{ - requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.copper, 250, Items.silicon, 75, Items.lead, 100)); + requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 250, Items.silicon, 75, Items.lead, 100)); size = 3; itemCapacity = 100; launchTime = 60f * 16; @@ -1286,7 +1284,7 @@ public class Blocks implements ContentList{ }}; launchPadLarge = new LaunchPad("launch-pad-large"){{ - requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75)); + requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75)); size = 4; itemCapacity = 250; launchTime = 60f * 14; diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index d49dfec7dd..929ed83ad1 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -25,6 +25,7 @@ import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; +import io.anuke.mindustry.world.meta.*; import java.lang.reflect.*; @@ -173,9 +174,9 @@ public class ContentParser{ TechTree.create(find(ContentType.block, value.get("research").asString()), block); } - //make block visible - if(value.has("requirements")){ - block.buildVisibility = () -> true; + //make block visible by default if there are requirements and no visibility set + if(value.has("requirements") && block.buildVisibility == BuildVisibility.hidden){ + block.buildVisibility = BuildVisibility.shown; } }); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index e7c6f0a230..83b367e10d 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -39,8 +39,6 @@ import static io.anuke.mindustry.Vars.*; public class Block extends BlockStorage{ public static final int crackRegions = 8, maxCrackSize = 5; - private static final BooleanProvider invisible = () -> false; - /** whether this block has a tile entity that updates */ public boolean update; /** whether this block has health and can be destroyed */ @@ -124,7 +122,7 @@ public class Block extends BlockStorage{ /** Cost of building this block; do not modify directly! */ public float buildCost; /** Whether this block is visible and can currently be built. */ - public BooleanProvider buildVisibility = invisible; + public BuildVisibility buildVisibility = BuildVisibility.hidden; /** Multiplier for speed of building this block. */ public float buildCostMultiplier = 1f; /** Whether this block has instant transfer.*/ @@ -157,7 +155,7 @@ public class Block extends BlockStorage{ } public boolean isBuildable(){ - return buildVisibility != invisible; + return buildVisibility != BuildVisibility.hidden && buildVisibility != BuildVisibility.debugOnly; } public boolean isStatic(){ @@ -808,7 +806,7 @@ public class Block extends BlockStorage{ } public boolean isVisible(){ - return buildVisibility.get() && !isHidden(); + return buildVisibility.visible() && !isHidden(); } public boolean isFloor(){ @@ -825,7 +823,7 @@ public class Block extends BlockStorage{ @Override public boolean isHidden(){ - return !buildVisibility.get(); + return !buildVisibility.visible(); } @Override @@ -834,21 +832,21 @@ public class Block extends BlockStorage{ } protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){ - requirements(cat, () -> true, stacks); + requirements(cat, BuildVisibility.shown, stacks); this.alwaysUnlocked = unlocked; } protected void requirements(Category cat, ItemStack[] stacks){ - requirements(cat, () -> true, stacks); + requirements(cat, BuildVisibility.shown, stacks); } /** Sets up requirements. Use only this method to set up requirements. */ - protected void requirements(Category cat, BooleanProvider visible, ItemStack[] stacks){ + protected void requirements(Category cat, BuildVisibility visible, ItemStack[] stacks){ this.category = cat; this.requirements = stacks; this.buildVisibility = visible; - Arrays.sort(requirements, (a, b) -> Integer.compare(a.item.id, b.item.id)); + Arrays.sort(requirements, Structs.comparingInt(i -> i.item.id)); } } diff --git a/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java b/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java new file mode 100644 index 0000000000..38c98aeaa2 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java @@ -0,0 +1,22 @@ +package io.anuke.mindustry.world.meta; + +import io.anuke.arc.function.*; +import io.anuke.mindustry.*; + +public enum BuildVisibility{ + hidden(() -> false), + shown(() -> true), + debugOnly(() -> false), + sandboxOnly(() -> Vars.state.rules.infiniteResources), + campaignOnly(() -> Vars.world.isZone()); + + private final BooleanProvider visible; + + public boolean visible(){ + return visible.get(); + } + + BuildVisibility(BooleanProvider visible){ + this.visible = visible; + } +}