diff --git a/core/assets-raw/sprites/blocks/environment/metal-floor-4.png b/core/assets-raw/sprites/blocks/environment/metal-floor-4.png new file mode 100644 index 0000000000..da7ee79f48 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/metal-floor-4.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index c23e16b3a1..8aff18d4b9 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -677,6 +677,7 @@ unit.nobuild = [scarlet]Unit can't build lastaccessed = [lightgray]Last Accessed: {0} block.unknown = [lightgray]??? +stat.showinmap = stat.description = Purpose stat.input = Input stat.output = Output @@ -1163,8 +1164,9 @@ block.spore-cluster.name = Spore Cluster block.metal-floor.name = Metal Floor 1 block.metal-floor-2.name = Metal Floor 2 block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 4 -block.metal-floor-damaged.name = Metal Floor Damaged +block.metal-floor-4.name = Metal Floor 4 +block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-damaged.name = Damaged Metal Floor block.dark-panel-1.name = Dark Panel 1 block.dark-panel-2.name = Dark Panel 2 block.dark-panel-3.name = Dark Panel 3 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 552da17570..069518fd38 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -351,3 +351,4 @@ 63360=navanax|unit-navanax-ui 63354=payload-launch-pad|block-payload-launch-pad-ui 63353=silicon-arc-furnace|block-silicon-arc-furnace-ui +63352=metal-floor-4|block-metal-floor-4-ui diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 6a232f426c..bb35852758 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -27,8 +27,6 @@ public class BlockIndexer{ private static final Rect rect = new Rect(); private static boolean returnBool = false; - private final IntSet intSet = new IntSet(); - private int quadWidth, quadHeight; /** Stores all ore quadrants on the map. Maps ID to qX to qY to a list of tiles with that ore. */ @@ -41,9 +39,9 @@ public class BlockIndexer{ private Seq activeTeams = new Seq<>(Team.class); /** Maps teams to a map of flagged tiles by flag. */ private TileArray[][] flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; + /** Counts whether a certain floor is present in the world upon load. */ + private boolean[] blocksPresent; - /** Empty set used for returning. */ - private TileArray emptySet = new TileArray(); /** Array used for returning and reusing. */ private Seq returnArray = new Seq<>(); /** Array used for returning and reusing. */ @@ -74,6 +72,7 @@ public class BlockIndexer{ ores = new IntSeq[content.items().size][][]; quadWidth = Mathf.ceil(world.width() / (float)quadrantSize); quadHeight = Mathf.ceil(world.height() / (float)quadrantSize); + blocksPresent = new boolean[content.blocks().size]; for(Tile tile : world.tiles){ process(tile); @@ -153,6 +152,12 @@ public class BlockIndexer{ seq.removeValue(pos); } } + + } + + /** @return whether a certain block is anywhere on this map. */ + public boolean isBlockPresent(Block block){ + return blocksPresent != null && blocksPresent[block.id]; } private TileArray[] getFlagged(Team team){ @@ -383,6 +388,12 @@ public class BlockIndexer{ } data.buildings.insert(tile.build); } + + if(!tile.block().isStatic()){ + blocksPresent[tile.floorID()] = true; + blocksPresent[tile.overlayID()] = true; + } + blocksPresent[tile.blockID()] = true; } public static class TileArray implements Iterable{ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 436e4487ec..6125c6610a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -40,7 +40,7 @@ public class Blocks implements ContentList{ dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt, - metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall, + metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, pebbles, tendrils, @@ -410,32 +410,24 @@ public class Blocks implements ContentList{ wall = sporeWall; }}; - metalFloor = new Floor("metal-floor"){{ + metalFloor = new MetalFloor("metal-floor"){{ variants = 0; + attributes.set(Attribute.water, -1f); }}; - metalFloorDamaged = new Floor("metal-floor-damaged"){{ - variants = 3; - }}; + metalFloorDamaged = new MetalFloor("metal-floor-damaged", 3); - metalFloor2 = new Floor("metal-floor-2"){{ - variants = 0; - }}; + metalFloor2 = new MetalFloor("metal-floor-2"); + metalFloor3 = new MetalFloor("metal-floor-3"); + metalFloor4 = new MetalFloor("metal-floor-4"); + metalFloor5 = new MetalFloor("metal-floor-5"); - metalFloor3 = new Floor("metal-floor-3"){{ - variants = 0; - }}; - - metalFloor5 = new Floor("metal-floor-5"){{ - variants = 0; - }}; - - darkPanel1 = new Floor("dark-panel-1"){{ variants = 0; }}; - darkPanel2 = new Floor("dark-panel-2"){{ variants = 0; }}; - darkPanel3 = new Floor("dark-panel-3"){{ variants = 0; }}; - darkPanel4 = new Floor("dark-panel-4"){{ variants = 0; }}; - darkPanel5 = new Floor("dark-panel-5"){{ variants = 0; }}; - darkPanel6 = new Floor("dark-panel-6"){{ variants = 0; }}; + darkPanel1 = new MetalFloor("dark-panel-1"); + darkPanel2 = new MetalFloor("dark-panel-2"); + darkPanel3 = new MetalFloor("dark-panel-3"); + darkPanel4 = new MetalFloor("dark-panel-4"); + darkPanel5 = new MetalFloor("dark-panel-5"); + darkPanel6 = new MetalFloor("dark-panel-6"); darkMetal = new StaticWall("dark-metal"); diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 82939448c3..8017907da1 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -67,7 +67,7 @@ public class ContentInfoDialog extends BaseDialog{ for(Stat stat : map.keys()){ table.table(inset -> { inset.left(); - inset.add("[lightgray]" + stat.localized() + ":[] ").left(); + inset.add("[lightgray]" + stat.localized() + ":[] ").left().top(); Seq arr = map.get(stat); for(StatValue value : arr){ value.display(inset); diff --git a/core/src/mindustry/world/blocks/environment/MetalFloor.java b/core/src/mindustry/world/blocks/environment/MetalFloor.java new file mode 100644 index 0000000000..fd26f90183 --- /dev/null +++ b/core/src/mindustry/world/blocks/environment/MetalFloor.java @@ -0,0 +1,19 @@ +package mindustry.world.blocks.environment; + +import mindustry.world.meta.*; + +/** Class for quickly defining a floor with no water and no variants. Offers no new functionality. */ +public class MetalFloor extends Floor{ + + public MetalFloor(String name){ + super(name); + variants = 0; + attributes.set(Attribute.water, -1); + } + + public MetalFloor(String name, int variants){ + super(name); + this.variants = variants; + attributes.set(Attribute.water, -1); + } +} diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 041c58545d..4a7704e36f 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -8,10 +8,12 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import mindustry.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.entities.bullet.*; import mindustry.gen.*; +import mindustry.maps.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; @@ -117,6 +119,51 @@ public class StatValues{ ); } + public static StatValue floors(Attribute attr, boolean floating, float scale, boolean startZero){ + return table -> table.table(c -> { + Runnable[] rebuild = {null}; + Map[] lastMap = {null}; + + rebuild[0] = () -> { + c.clearChildren(); + c.left(); + + if(state.isGame()){ + var blocks = Vars.content.blocks() + .select(block -> block instanceof Floor f && indexer.isBlockPresent(block) && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating)) + .as().with(s -> s.sort(f -> f.attributes.get(attr))); + + if(blocks.any()){ + int i = 0; + for(var block : blocks){ + + floorEfficiency(block, block.attributes.get(attr) * scale, startZero).display(c); + if(++i % 5 == 0){ + c.row(); + } + } + }else{ + c.add("@none.found"); + } + }else{ + c.add("@stat.showinmap"); + } + }; + + rebuild[0].run(); + + //rebuild when map changes. + c.update(() -> { + Map current = state.isGame() ? state.map : null; + + if(current != lastMap[0]){ + rebuild[0].run(); + lastMap[0] = current; + } + }); + }); + } + public static StatValue blocks(Boolf pred){ return blocks(content.blocks().select(pred)); } diff --git a/core/src/mindustry/world/meta/Stats.java b/core/src/mindustry/world/meta/Stats.java index d5d91f2c20..d11b56f395 100644 --- a/core/src/mindustry/world/meta/Stats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -3,9 +3,7 @@ package mindustry.world.meta; import arc.struct.ObjectMap.*; import arc.struct.*; import arc.util.*; -import mindustry.*; import mindustry.type.*; -import mindustry.world.blocks.environment.*; /** Hold and organizes a list of block stats. */ public class Stats{ @@ -68,11 +66,7 @@ public class Stats{ } public void add(Stat stat, Attribute attr, boolean floating, float scale, boolean startZero){ - for(var block : Vars.content.blocks() - .select(block -> block instanceof Floor f && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating)) - .as().with(s -> s.sort(f -> f.attributes.get(attr)))){ - add(stat, StatValues.floorEfficiency(block, block.attributes.get(attr) * scale, startZero)); - } + add(stat, StatValues.floors(attr, floating, scale, startZero)); } /** Adds a single string value with this stat. */