This commit is contained in:
Anuken
2020-06-01 18:55:19 -04:00
parent 68f1efdbdd
commit 69d0751e65
9 changed files with 58 additions and 14 deletions

View File

@@ -162,6 +162,8 @@ public class Block extends UnlockableContent{
public float buildCost;
/** Whether this block is visible and can currently be built. */
public BuildVisibility buildVisibility = BuildVisibility.hidden;
/** Defines when this block can be placed. */
public BuildPlaceability buildPlaceability = BuildPlaceability.always;
/** Multiplier for speed of building this block. */
public float buildCostMultiplier = 1f;
/** Whether this block has instant transfer.*/
@@ -298,7 +300,7 @@ public class Block extends UnlockableContent{
public void setStats(){
stats.add(BlockStat.size, "@x@", size, size);
stats.add(BlockStat.health, health, StatUnit.none);
if(isBuildable()){
if(canBeBuilt()){
stats.add(BlockStat.buildTime, buildCost / 60, StatUnit.seconds);
stats.add(BlockStat.buildCost, new ItemListValue(false, requirements));
}
@@ -465,6 +467,15 @@ public class Block extends UnlockableContent{
return buildVisibility.visible() && !isHidden();
}
public boolean isPlaceable(){
return isVisible() && buildPlaceability.placeable() && !state.rules.bannedBlocks.contains(this);
}
/** @return a message detailing why this block can't be placed. */
public String unplaceableMessage(){
return state.rules.bannedBlocks.contains(this) ? Core.bundle.get("banned") : buildPlaceability.message();
}
public boolean isFloor(){
return this instanceof Floor;
}
@@ -481,7 +492,7 @@ public class Block extends UnlockableContent{
return id == 0;
}
public boolean isBuildable(){
public boolean canBeBuilt(){
return buildVisibility != BuildVisibility.hidden && buildVisibility != BuildVisibility.debugOnly;
}

View File

@@ -63,11 +63,8 @@ public class Build{
/** Returns whether a tile can be placed at this location by this team. */
public static boolean validPlace(Team team, int x, int y, Block type, int rotation){
if(type == null || !type.isVisible() || type.isHidden()){
return false;
}
if(state.rules.bannedBlocks.contains(type) && !(state.rules.waves && team == state.rules.waveTeam)){
//the wave team can build whatever they want as long as it's visible - banned blocks are not applicable
if(type == null || (!type.isPlaceable() && !(state.rules.waves && team == state.rules.waveTeam && type.isVisible()))){
return false;
}

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.campaign;
import mindustry.*;
import mindustry.gen.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import static mindustry.Vars.state;
@@ -15,6 +16,7 @@ public class CoreLauncher extends Block{
hasItems = true;
configurable = true;
update = true;
buildPlaceability = BuildPlaceability.sectorCaptured;
}
public class CoreLauncherEntity extends TileEntity{

View File

@@ -0,0 +1,32 @@
package mindustry.world.meta;
import arc.*;
import arc.func.*;
import mindustry.*;
import java.util.*;
/**
* Like BuildVisiblity, but defines whether a block can be *placed*, with an extra message.
* This is like defining a conditionally banned block.
* */
public enum BuildPlaceability{
always(() -> true),
sectorCaptured(() -> Vars.state.rules.sector != null && Vars.state.rules.sector.isCaptured());
private final Boolp placeability;
BuildPlaceability(Boolp placeability){
this.placeability = placeability;
}
public boolean placeable(){
return placeability.get();
}
/** @return why this block is banned. */
public String message(){
return Core.bundle.get("unplaceable." + name().toLowerCase(Locale.ROOT));
}
}