diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 82b80e12b8..9ee4aa02f6 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -5786,6 +5786,7 @@ public class Blocks{ itemCapacity = 0; alwaysUnlocked = true; ambientSound = Sounds.none; + allDatabaseTabs = true; }}; //TODO move diff --git a/core/src/mindustry/ui/ItemDisplay.java b/core/src/mindustry/ui/ItemDisplay.java deleted file mode 100644 index 4967c1e09d..0000000000 --- a/core/src/mindustry/ui/ItemDisplay.java +++ /dev/null @@ -1,38 +0,0 @@ -package mindustry.ui; - -import arc.scene.ui.layout.*; -import arc.util.*; -import mindustry.type.*; -import mindustry.world.meta.*; - -//TODO replace with static methods? -/** An item image with text. */ -public class ItemDisplay extends Table{ - public final Item item; - public final int amount; - - public ItemDisplay(Item item){ - this(item, 0); - } - - public ItemDisplay(Item item, int amount, boolean showName){ - add(new ItemImage(new ItemStack(item, amount))); - if(showName) add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0); - - this.item = item; - this.amount = amount; - } - - public ItemDisplay(Item item, int amount){ - this(item, amount, true); - } - - /** Displays the item with a "/sec" qualifier based on the time period, in ticks. */ - public ItemDisplay(Item item, int amount, float timePeriod, boolean showName){ - add(new ItemImage(item.uiIcon, amount)); - add((showName ? item.localizedName + "\n" : "") + "[lightgray]" + Strings.autoFixed(amount / (timePeriod / 60f), 2) + StatUnit.perSecond.localized()).padLeft(2).padRight(5).style(Styles.outlineLabel); - - this.item = item; - this.amount = amount; - } -} diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java deleted file mode 100644 index d0982374ab..0000000000 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ /dev/null @@ -1,39 +0,0 @@ -package mindustry.ui; - -import arc.graphics.*; -import arc.scene.ui.*; -import arc.scene.ui.layout.*; -import arc.util.*; -import mindustry.type.*; -import mindustry.world.meta.*; - -import static mindustry.Vars.*; - -/** An ItemDisplay, but for liquids. */ -public class LiquidDisplay extends Table{ - public final Liquid liquid; - public final float amount; - public final boolean perSecond; - - public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ - this.liquid = liquid; - this.amount = amount; - this.perSecond = perSecond; - - add(new Stack(){{ - add(new Image(liquid.uiIcon).setScaling(Scaling.fit)); - - if(amount != 0){ - Table t = new Table().left().bottom(); - t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); - add(t); - } - }}).size(iconMed).padRight(3 + (amount != 0 && Strings.autoFixed(amount, 2).length() > 2 ? 8 : 0)); - - if(perSecond){ - add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); - } - - add(liquid.localizedName); - } -} diff --git a/core/src/mindustry/world/blocks/production/Separator.java b/core/src/mindustry/world/blocks/production/Separator.java index fd387d6960..1bd5351b5e 100644 --- a/core/src/mindustry/world/blocks/production/Separator.java +++ b/core/src/mindustry/world/blocks/production/Separator.java @@ -38,7 +38,14 @@ public class Separator extends Block{ stats.timePeriod = craftTime; super.setStats(); - stats.add(Stat.output, StatValues.items(item -> Structs.contains(results, i -> i.item == item))); + int[] sum = {0}; + for(var r : results) sum[0] += r.amount; + + stats.add(Stat.output, table -> { + for(ItemStack stack : results){ + table.add(StatValues.displayItemPercent(stack.item, (int)((float)stack.amount / sum[0] * 100), true)).padRight(5); + } + }); stats.add(Stat.productionTime, craftTime / 60f, StatUnit.seconds); } diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index b89d945c65..a2b4448d31 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -137,7 +137,7 @@ public class UnitFactory extends UnitBlock{ } ItemStack stack = plan.requirements[i]; - req.add(new ItemDisplay(stack.item, stack.amount, plan.time, true)).pad(5); + req.add(StatValues.displayItem(stack.item, stack.amount, plan.time, true)).pad(5); } }).right().grow().pad(10f); }else{ diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 9c548f2836..5e74f1f72b 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -66,7 +66,7 @@ public class StatValues{ } public static StatValue liquid(Liquid liquid, float amount, boolean perSecond){ - return table -> table.add(new LiquidDisplay(liquid, amount, perSecond)); + return table -> table.add(displayLiquid(liquid, amount, perSecond)); } public static StatValue liquids(Boolf filter, float amount, boolean perSecond){ @@ -74,7 +74,7 @@ public class StatValues{ Seq list = content.liquids().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden()); for(int i = 0; i < list.size; i++){ - table.add(new LiquidDisplay(list.get(i), amount, perSecond)).padRight(5); + table.add(displayLiquid(list.get(i), amount, perSecond)).padRight(5); if(i != list.size - 1){ table.add("/"); @@ -90,7 +90,7 @@ public class StatValues{ public static StatValue liquids(float timePeriod, boolean perSecond, LiquidStack... stacks){ return table -> { for(var stack : stacks){ - table.add(new LiquidDisplay(stack.liquid, stack.amount * (60f / timePeriod), perSecond)).padRight(5); + table.add(displayLiquid(stack.liquid, stack.amount * (60f / timePeriod), perSecond)).padRight(5); } }; } @@ -102,7 +102,7 @@ public class StatValues{ public static StatValue items(boolean displayName, ItemStack... stacks){ return table -> { for(ItemStack stack : stacks){ - table.add(new ItemDisplay(stack.item, stack.amount, displayName)).padRight(5); + table.add(displayItem(stack.item, stack.amount, displayName)).padRight(5); } }; } @@ -110,7 +110,7 @@ public class StatValues{ public static StatValue items(float timePeriod, ItemStack... stacks){ return table -> { for(ItemStack stack : stacks){ - table.add(new ItemDisplay(stack.item, stack.amount, timePeriod, true)).padRight(5); + table.add(displayItem(stack.item, stack.amount, timePeriod, true)).padRight(5); } }; } @@ -126,7 +126,7 @@ public class StatValues{ for(int i = 0; i < list.size; i++){ Item item = list.get(i); - table.add(timePeriod <= 0 ? new ItemDisplay(item) : new ItemDisplay(item, 1, timePeriod, true)).padRight(5); + table.add(timePeriod <= 0 ? displayItem(item) : displayItem(item, 1, timePeriod, true)).padRight(5); if(i != list.size - 1){ table.add("/"); @@ -135,6 +135,60 @@ public class StatValues{ }; } + public static Table displayLiquid(Liquid liquid, float amount, boolean perSecond){ + Table t = new Table(); + + t.add(new Stack(){{ + add(new Image(liquid.uiIcon).setScaling(Scaling.fit)); + + if(amount != 0){ + Table t = new Table().left().bottom(); + t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); + add(t); + } + }}).size(iconMed).padRight(3 + (amount != 0 && Strings.autoFixed(amount, 2).length() > 2 ? 8 : 0)); + + if(perSecond){ + t.add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); + } + + t.add(liquid.localizedName); + + return t; + } + + + public static Table displayItem(Item item){ + return displayItem(item, 0); + } + + public static Table displayItem(Item item, int amount, boolean showName){ + Table t = new Table(); + t.add(new ItemImage(new ItemStack(item, amount))); + if(showName) t.add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0); + return t; + } + + public static Table displayItem(Item item, int amount){ + return displayItem(item, amount, true); + } + + /** Displays the item with a "/sec" qualifier based on the time period, in ticks. */ + public static Table displayItem(Item item, int amount, float timePeriod, boolean showName){ + Table t = new Table(); + t.add(new ItemImage(item.uiIcon, amount)); + t.add((showName ? item.localizedName + "\n" : "") + "[lightgray]" + Strings.autoFixed(amount / (timePeriod / 60f), 2) + StatUnit.perSecond.localized()).padLeft(2).padRight(5).style(Styles.outlineLabel); + return t; + } + + /** Displays the item with a "/sec" qualifier based on the time period, in ticks. */ + public static Table displayItemPercent(Item item, int percent, boolean showName){ + Table t = new Table(); + t.add(new ItemImage(item.uiIcon, 0)); + t.add((showName ? item.localizedName + "\n" : "") + "[lightgray]" + percent + "%").padLeft(2).padRight(5).style(Styles.outlineLabel); + return t; + } + public static StatValue content(UnlockableContent content){ return table -> { table.add(new Image(content.uiIcon)).size(iconSmall).padRight(3); @@ -327,9 +381,9 @@ public class StatValues{ c.table(Styles.grayPanel, b -> { for(ItemStack stack : items){ if(timePeriod < 0){ - b.add(new ItemDisplay(stack.item, stack.amount, true)).pad(20f).left(); + b.add(displayItem(stack.item, stack.amount, true)).pad(20f).left(); }else{ - b.add(new ItemDisplay(stack.item, stack.amount, timePeriod, true)).pad(20f).left(); + b.add(displayItem(stack.item, stack.amount, timePeriod, true)).pad(20f).left(); } if(items.length > 1) b.row(); }