Block build visibility

This commit is contained in:
Anuken
2019-10-15 00:23:38 -04:00
parent 8e9b84f4f9
commit 8556b7eef7
4 changed files with 49 additions and 30 deletions

View File

@@ -9,7 +9,7 @@ import io.anuke.arc.util.*;
import io.anuke.mindustry.*; import io.anuke.mindustry.*;
import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.bullet.*; 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.game.*;
import io.anuke.mindustry.gen.*; import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.*; 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.meta.*;
import io.anuke.mindustry.world.modules.*; import io.anuke.mindustry.world.modules.*;
import static io.anuke.mindustry.Vars.*;
public class Blocks implements ContentList{ public class Blocks implements ContentList{
public static Block public static Block
@@ -716,23 +714,23 @@ public class Blocks implements ContentList{
//region sandbox //region sandbox
powerVoid = new PowerVoid("power-void"){{ powerVoid = new PowerVoid("power-void"){{
requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with()); requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
powerSource = new PowerSource("power-source"){{ powerSource = new PowerSource("power-source"){{
requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with()); requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
itemSource = new ItemSource("item-source"){{ itemSource = new ItemSource("item-source"){{
requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with()); requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
itemVoid = new ItemVoid("item-void"){{ itemVoid = new ItemVoid("item-void"){{
requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with()); requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
liquidSource = new LiquidSource("liquid-source"){{ liquidSource = new LiquidSource("liquid-source"){{
requirements(Category.liquid, () -> state.rules.infiniteResources, ItemStack.with()); requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with());
alwaysUnlocked = true; alwaysUnlocked = true;
}}; }};
message = new MessageBlock("message"){{ message = new MessageBlock("message"){{
@@ -745,27 +743,27 @@ public class Blocks implements ContentList{
int wallHealthMultiplier = 4; int wallHealthMultiplier = 4;
scrapWall = new Wall("scrap-wall"){{ scrapWall = new Wall("scrap-wall"){{
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with()); requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
health = 60 * wallHealthMultiplier; health = 60 * wallHealthMultiplier;
variants = 5; variants = 5;
}}; }};
scrapWallLarge = new Wall("scrap-wall-large"){{ 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; health = 60 * 4 * wallHealthMultiplier;
size = 2; size = 2;
variants = 4; variants = 4;
}}; }};
scrapWallHuge = new Wall("scrap-wall-huge"){{ 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; health = 60 * 9 * wallHealthMultiplier;
size = 3; size = 3;
variants = 3; variants = 3;
}}; }};
scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ 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; health = 60 * 16 * wallHealthMultiplier;
size = 4; size = 4;
}}; }};
@@ -1235,7 +1233,7 @@ public class Blocks implements ContentList{
//region storage //region storage
coreShard = new CoreBlock("core-shard"){{ 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; alwaysUnlocked = true;
health = 1100; health = 1100;
@@ -1244,7 +1242,7 @@ public class Blocks implements ContentList{
}}; }};
coreFoundation = new CoreBlock("core-foundation"){{ 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; health = 2000;
itemCapacity = 9000; itemCapacity = 9000;
@@ -1252,7 +1250,7 @@ public class Blocks implements ContentList{
}}; }};
coreNucleus = new CoreBlock("core-nucleus"){{ 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; health = 4000;
itemCapacity = 13000; itemCapacity = 13000;
@@ -1277,7 +1275,7 @@ public class Blocks implements ContentList{
}}; }};
launchPad = new LaunchPad("launch-pad"){{ 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; size = 3;
itemCapacity = 100; itemCapacity = 100;
launchTime = 60f * 16; launchTime = 60f * 16;
@@ -1286,7 +1284,7 @@ public class Blocks implements ContentList{
}}; }};
launchPadLarge = new LaunchPad("launch-pad-large"){{ 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; size = 4;
itemCapacity = 250; itemCapacity = 250;
launchTime = 60f * 14; launchTime = 60f * 14;

View File

@@ -25,6 +25,7 @@ import io.anuke.mindustry.mod.Mods.*;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.consumers.*; import io.anuke.mindustry.world.consumers.*;
import io.anuke.mindustry.world.meta.*;
import java.lang.reflect.*; import java.lang.reflect.*;
@@ -173,9 +174,9 @@ public class ContentParser{
TechTree.create(find(ContentType.block, value.get("research").asString()), block); TechTree.create(find(ContentType.block, value.get("research").asString()), block);
} }
//make block visible //make block visible by default if there are requirements and no visibility set
if(value.has("requirements")){ if(value.has("requirements") && block.buildVisibility == BuildVisibility.hidden){
block.buildVisibility = () -> true; block.buildVisibility = BuildVisibility.shown;
} }
}); });

View File

@@ -39,8 +39,6 @@ import static io.anuke.mindustry.Vars.*;
public class Block extends BlockStorage{ public class Block extends BlockStorage{
public static final int crackRegions = 8, maxCrackSize = 5; public static final int crackRegions = 8, maxCrackSize = 5;
private static final BooleanProvider invisible = () -> false;
/** whether this block has a tile entity that updates */ /** whether this block has a tile entity that updates */
public boolean update; public boolean update;
/** whether this block has health and can be destroyed */ /** 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! */ /** Cost of building this block; do not modify directly! */
public float buildCost; public float buildCost;
/** Whether this block is visible and can currently be built. */ /** 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. */ /** Multiplier for speed of building this block. */
public float buildCostMultiplier = 1f; public float buildCostMultiplier = 1f;
/** Whether this block has instant transfer.*/ /** Whether this block has instant transfer.*/
@@ -157,7 +155,7 @@ public class Block extends BlockStorage{
} }
public boolean isBuildable(){ public boolean isBuildable(){
return buildVisibility != invisible; return buildVisibility != BuildVisibility.hidden && buildVisibility != BuildVisibility.debugOnly;
} }
public boolean isStatic(){ public boolean isStatic(){
@@ -808,7 +806,7 @@ public class Block extends BlockStorage{
} }
public boolean isVisible(){ public boolean isVisible(){
return buildVisibility.get() && !isHidden(); return buildVisibility.visible() && !isHidden();
} }
public boolean isFloor(){ public boolean isFloor(){
@@ -825,7 +823,7 @@ public class Block extends BlockStorage{
@Override @Override
public boolean isHidden(){ public boolean isHidden(){
return !buildVisibility.get(); return !buildVisibility.visible();
} }
@Override @Override
@@ -834,21 +832,21 @@ public class Block extends BlockStorage{
} }
protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){ protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){
requirements(cat, () -> true, stacks); requirements(cat, BuildVisibility.shown, stacks);
this.alwaysUnlocked = unlocked; this.alwaysUnlocked = unlocked;
} }
protected void requirements(Category cat, ItemStack[] stacks){ 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. */ /** 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.category = cat;
this.requirements = stacks; this.requirements = stacks;
this.buildVisibility = visible; 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));
} }
} }

View File

@@ -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;
}
}