diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 1e59b8449e..bf853461f0 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1047,6 +1047,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.forcefield.description = Projects a force shield that absorbs bullets diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index b0e2bfb3ea..0464bde619 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -83,7 +83,6 @@ public class ContentInfoDialog extends BaseDialog{ 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 a3b29b4cfd..49cad2fc7e 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -64,6 +64,7 @@ public class ConsumeGenerator extends PowerGenerator{ @Override public void setStats(){ + stats.timePeriod = itemDuration; super.setStats(); if(hasItems){ @@ -80,12 +81,14 @@ public class ConsumeGenerator extends PowerGenerator{ @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 20d6a00769..66e89d117f 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemCharged.java +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -1,9 +1,9 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; /** For mods. I don't use this (yet). */ -public class ConsumeItemCharged extends ConsumeItemFilter{ +public class ConsumeItemCharged extends ConsumeItemEfficiency{ public float minCharge; public ConsumeItemCharged(float minCharge){ @@ -16,8 +16,7 @@ public class ConsumeItemCharged extends ConsumeItemFilter{ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.charge; + public float itemEfficiencyMultiplier(Item item){ + return item.charge; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java b/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java new file mode 100644 index 0000000000..57e1a860b2 --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java @@ -0,0 +1,20 @@ +package mindustry.world.consumers; + +import arc.func.*; +import mindustry.type.*; +import mindustry.world.meta.*; + +public class ConsumeItemEfficiency extends ConsumeItemFilter{ + + public ConsumeItemEfficiency(Boolf item){ + super(item); + } + + public ConsumeItemEfficiency(){ + } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(this::itemEfficiencyMultiplier, stats.timePeriod, filter)); + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java index 0bed91970b..c2bc2f1370 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java @@ -1,8 +1,8 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; -public class ConsumeItemExplosive extends ConsumeItemFilter{ +public class ConsumeItemExplosive extends ConsumeItemEfficiency{ public float minExplosiveness; public ConsumeItemExplosive(float minCharge){ @@ -15,8 +15,7 @@ public class ConsumeItemExplosive extends ConsumeItemFilter{ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.explosiveness; + 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 a2ed17f52d..b0ca96cc71 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -66,6 +66,16 @@ public class ConsumeItemFilter extends Consume{ @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 34b5a74b02..df3dd87069 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -1,8 +1,8 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; -public class ConsumeItemFlammable extends ConsumeItemFilter{ +public class ConsumeItemFlammable extends ConsumeItemEfficiency{ public float minFlammability; public ConsumeItemFlammable(float minFlammability){ @@ -15,8 +15,7 @@ public class ConsumeItemFlammable extends ConsumeItemFilter{ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.flammability; + 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 b4beca53b2..ab044c6cbf 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -1,8 +1,8 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; -public class ConsumeItemRadioactive extends ConsumeItemFilter{ +public class ConsumeItemRadioactive extends ConsumeItemEfficiency{ public float minRadioactivity; public ConsumeItemRadioactive(float minRadioactivity){ @@ -15,8 +15,7 @@ public class ConsumeItemRadioactive extends ConsumeItemFilter{ } @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.radioactivity; + 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 94e049c260..ceacb52554 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -54,6 +54,12 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ 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(); @@ -79,4 +85,8 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ public boolean consumes(Liquid liquid){ return filter.get(liquid); } + + 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 be39903154..df2826b0e7 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 class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ } @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 9079658629..ae82560ef4 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 1e5e34d0c8..1e553c4272 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -112,7 +112,7 @@ public class StatValues{ } public static StatValue liquid(Liquid liquid, float amount, boolean perSecond){ - return table -> table.add(displayLiquid(liquid, amount, perSecond)); + return table -> table.add(displayLiquid(liquid, amount, perSecond)).left(); } public static StatValue liquids(Boolf filter, float amount, boolean perSecond){ @@ -459,6 +459,37 @@ public class StatValues{ }; } + 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(displayLiquid(liquid, 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();