diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 260c5af6512..1875cd15695 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -996,6 +996,7 @@ stat.buildspeedmultiplier = Build Speed Multiplier stat.reactive = Reacts stat.immunities = Immunities stat.healing = Healing +stat.efficiency = [stat]{0}% Efficiency ability.forcefield = Force Field ability.repairfield = Repair Field diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index d0982374ab6..f49b4e7862c 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -15,25 +15,27 @@ public class LiquidDisplay extends Table{ public final float amount; public final boolean perSecond; - public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ + public LiquidDisplay(Liquid liquid, float size, float amount, boolean perSecond){ this.liquid = liquid; this.amount = amount; this.perSecond = perSecond; + left(); add(new Stack(){{ - add(new Image(liquid.uiIcon).setScaling(Scaling.fit)); + Image i = new Image(liquid.uiIcon).setScaling(Scaling.fit); + i.setAlign(Align.left); + add(i); - if(amount != 0){ + if(!perSecond && 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); - } + }}).height(size).minWidth(size).left(); + add(liquid.localizedName + (perSecond && amount != 0 ? "\n[lightgray]" + Strings.autoFixed(amount, 2) + StatUnit.perSecond.localized() : "[]")).left().style(Styles.outlineLabel); + } - add(liquid.localizedName); + public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ + this(liquid, iconMed, amount, perSecond); } } diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 8defe26a248..2d305e823a1 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -82,7 +82,6 @@ public void show(UnlockableContent content){ value.display(inset); inset.add().size(10f); } - }).fillX().padLeft(10); table.row(); } diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index a3b29b4cfdb..49cad2fc7e6 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -64,6 +64,7 @@ public void init(){ @Override public void setStats(){ + stats.timePeriod = itemDuration; super.setStats(); if(hasItems){ @@ -80,12 +81,14 @@ public class ConsumeGeneratorBuild extends GeneratorBuild{ @Override public void updateEfficiencyMultiplier(){ + efficiencyMultiplier = 1f; if(filterItem != null){ float m = filterItem.efficiencyMultiplier(this); - if(m > 0) efficiencyMultiplier = m; - }else if(filterLiquid != null){ + if(m > 0) efficiencyMultiplier *= m; + } + if(filterLiquid != null){ float m = filterLiquid.efficiencyMultiplier(this); - if(m > 0) efficiencyMultiplier = m; + if(m > 0) efficiencyMultiplier *= m; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemCharged.java b/core/src/mindustry/world/consumers/ConsumeItemCharged.java index 20d6a007699..91cb01fa6be 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemCharged.java +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.meta.*; /** For mods. I don't use this (yet). */ public class ConsumeItemCharged extends ConsumeItemFilter{ @@ -16,8 +17,12 @@ public ConsumeItemCharged(){ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.charge; + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.charge, stats.timePeriod, filter)); + } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.charge; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java index 0bed91970b9..c7ee0840a99 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.meta.*; public class ConsumeItemExplosive extends ConsumeItemFilter{ public float minExplosiveness; @@ -15,8 +16,12 @@ public ConsumeItemExplosive(){ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.explosiveness; + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.explosiveness, stats.timePeriod, filter)); + } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.explosiveness; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index 8993bd59e1d..01b630b7c09 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -66,6 +66,16 @@ public float efficiency(Building build){ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, stats.timePeriod < 0 ? StatValues.items(filter) : StatValues.items(stats.timePeriod, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.items(stats.timePeriod, filter)); + } + + @Override + public float efficiencyMultiplier(Building build){ + var item = getConsumed(build); + return item == null ? 0f : itemEfficiencyMultiplier(item); + } + + public float itemEfficiencyMultiplier(Item item){ + return 1f; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java index 34b5a74b02a..840d7158a61 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.meta.*; public class ConsumeItemFlammable extends ConsumeItemFilter{ public float minFlammability; @@ -15,8 +16,12 @@ public ConsumeItemFlammable(){ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.flammability; + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.flammability, stats.timePeriod, filter)); + } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.flammability; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java index b4beca53b24..0d0f11f1d65 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.meta.*; public class ConsumeItemRadioactive extends ConsumeItemFilter{ public float minRadioactivity; @@ -15,8 +16,12 @@ public ConsumeItemRadioactive(){ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.radioactivity; + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.radioactivity, stats.timePeriod, filter)); + } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.radioactivity; } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 7dbaab70436..fd55d6c597b 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -53,7 +53,13 @@ public float efficiency(Building build){ if(ed <= 0.00000001f) return 0f; return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed * multiplier.get(build)), 1f) : 0f; } - + + @Override + public float efficiencyMultiplier(Building build){ + var liq = getConsumed(build); + return liq == null ? 0 : liquidEfficiencyMultiplier(liq); + } + public @Nullable Liquid getConsumed(Building build){ if(filter.get(build.liquids.current()) && build.liquids.currentAmount() > 0){ return build.liquids.current(); @@ -74,4 +80,8 @@ public float efficiency(Building build){ public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.liquids(filter, amount * 60f, true)); } + + public float liquidEfficiencyMultiplier(Liquid liquid){ + return 1f; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java index be399031542..df2826b0e79 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.meta.*; public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ public float minFlammability; @@ -20,8 +21,12 @@ public ConsumeLiquidFlammable(){ } @Override - public float efficiencyMultiplier(Building build){ - var liq = getConsumed(build); - return liq == null ? 0f : liq.flammability; + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.flammability, amount * 60f, filter)); + } + + @Override + public float liquidEfficiencyMultiplier(Liquid liquid){ + return liquid.flammability; } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java b/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java index 9079658629c..ae82560ef4b 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java @@ -1,12 +1,12 @@ package mindustry.world.consumers; -import arc.func.Func; -import arc.scene.ui.layout.Table; -import mindustry.Vars; -import mindustry.gen.Building; -import mindustry.type.LiquidStack; -import mindustry.ui.ReqImage; -import mindustry.world.Block; +import arc.func.*; +import arc.scene.ui.layout.*; +import mindustry.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; public class ConsumeLiquidsDynamic extends Consume{ public final Func liquids; diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 36872d3546b..c34cfb970bd 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -66,7 +66,7 @@ public static StatValue number(float value, StatUnit unit){ } public static StatValue liquid(Liquid liquid, float amount, boolean perSecond){ - return table -> table.add(new LiquidDisplay(liquid, amount, perSecond)); + return table -> table.add(new LiquidDisplay(liquid, amount, perSecond)).left(); } public static StatValue liquids(Boolf filter, float amount, boolean perSecond){ @@ -292,6 +292,37 @@ public static StatValue boosters(float reload, float maxUsed, float multiplier, }; } + public static StatValue itemEffMultiplier(Floatf efficiency, float timePeriod, Boolf filter){ + return table -> { + table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left + table.row(); + table.table(c -> { + for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ + c.table(Styles.grayPanel, b -> { + b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); + b.add(item.localizedName + (timePeriod > 0 ? "\n[lightgray]" + Strings.autoFixed(1f / (timePeriod / 60f), 2) + StatUnit.perSecond.localized() : "")).left().grow(); + b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); + }).growX().pad(5).row(); + } + }).growX().colspan(table.getColumns()).row(); + }; + } + + public static StatValue liquidEffMultiplier(Floatf efficiency, float amount, Boolf filter){ + return table -> { + table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left + table.row(); + table.table(c -> { + for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ + c.table(Styles.grayPanel, b -> { + b.add(new LiquidDisplay(liquid, 40f, amount, true)).pad(10f).left().grow(); + b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(liquid) * 100f))).right().pad(10f).padRight(15f); + }).growX().pad(5).row(); + } + }).growX().colspan(table.getColumns()).row(); + }; + } + public static StatValue speedBoosters(String unit, float amount, float speed, boolean strength, Boolf filter){ return table -> { table.row(); @@ -554,4 +585,4 @@ private static String ammoStat(float val){ private static TextureRegion icon(UnlockableContent t){ return t.uiIcon; } -} \ No newline at end of file +}