diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index adead08465..673d66e77a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2406,6 +2406,7 @@ public class Blocks{ envEnabled = Env.any; generateEffect = Fx.generatespark; + itemDurationMultipliers.put(Items.phaseFabric, 210f / 14f); drawer = new DrawMulti(new DrawDefault(), new DrawWarmupRegion()); consume(new ConsumeItemRadioactive()); }}; diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index 49cad2fc7e..6ebecbfabb 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.power; import arc.*; import arc.graphics.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; @@ -21,6 +22,7 @@ public class ConsumeGenerator extends PowerGenerator{ public float effectChance = 0.01f; public Effect generateEffect = Fx.none, consumeEffect = Fx.none; public float generateEffectRange = 3f; + public float baseLightRadius = 65f; public @Nullable LiquidStack outputLiquid; /** If true, this block explodes when outputLiquid exceeds capacity. */ @@ -28,6 +30,8 @@ public class ConsumeGenerator extends PowerGenerator{ public @Nullable ConsumeItemFilter filterItem; public @Nullable ConsumeLiquidFilter filterLiquid; + /** Multiplies the itemDuration for a given item. */ + public ObjectFloatMap itemDurationMultipliers = new ObjectFloatMap<>(); public ConsumeGenerator(String name){ super(name); @@ -47,6 +51,11 @@ public class ConsumeGenerator extends PowerGenerator{ filterItem = findConsumer(c -> c instanceof ConsumeItemFilter); filterLiquid = findConsumer(c -> c instanceof ConsumeLiquidFilter); + //pass along the duration multipliers to the consumer, so it can display them properly + if(filterItem instanceof ConsumeItemEfficiency eff){ + eff.itemDurationMultipliers = itemDurationMultipliers; + } + if(outputLiquid != null){ outputsLiquid = true; hasLiquids = true; @@ -56,9 +65,8 @@ public class ConsumeGenerator extends PowerGenerator{ explosionPuddleLiquid = outputLiquid.liquid; } - //TODO hardcoded emitLight = true; - lightRadius = 65f * size; + lightRadius = baseLightRadius * size; super.init(); } @@ -77,7 +85,7 @@ public class ConsumeGenerator extends PowerGenerator{ } public class ConsumeGeneratorBuild extends GeneratorBuild{ - public float warmup, totalTime, efficiencyMultiplier = 1f; + public float warmup, totalTime, efficiencyMultiplier = 1f, itemDurationMultiplier = 1; @Override public void updateEfficiencyMultiplier(){ @@ -106,6 +114,11 @@ public class ConsumeGenerator extends PowerGenerator{ generateEffect.at(x + Mathf.range(generateEffectRange), y + Mathf.range(generateEffectRange)); } + //make sure the multiplier doesn't change when there is nothing to consume while it's still running + if(filterItem != null && valid && itemDurationMultipliers.size > 0 && filterItem.getConsumed(this) != null){ + itemDurationMultiplier = itemDurationMultipliers.get(filterItem.getConsumed(this), 1); + } + //take in items periodically if(hasItems && valid && generateTime <= 0f){ consume(); @@ -125,7 +138,7 @@ public class ConsumeGenerator extends PowerGenerator{ } //generation time always goes down, but only at the end so consumeTriggerValid doesn't assume fake items - generateTime -= delta() / itemDuration; + generateTime -= delta() / (itemDuration * itemDurationMultiplier); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java b/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java index 57e1a860b2..f424c37f66 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java +++ b/core/src/mindustry/world/consumers/ConsumeItemEfficiency.java @@ -1,10 +1,14 @@ package mindustry.world.consumers; import arc.func.*; +import arc.struct.*; +import arc.util.*; import mindustry.type.*; import mindustry.world.meta.*; public class ConsumeItemEfficiency extends ConsumeItemFilter{ + /** This has no effect on the consumer itself, but is used for stat display. */ + public @Nullable ObjectFloatMap itemDurationMultipliers; public ConsumeItemEfficiency(Boolf item){ super(item); @@ -15,6 +19,6 @@ public class ConsumeItemEfficiency extends ConsumeItemFilter{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(this::itemEfficiencyMultiplier, stats.timePeriod, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(this::itemEfficiencyMultiplier, stats.timePeriod, filter, itemDurationMultipliers)); } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 8b2c98db0d..5720179103 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -460,14 +460,21 @@ public class StatValues{ } public static StatValue itemEffMultiplier(Floatf efficiency, float timePeriod, Boolf filter){ + return itemEffMultiplier(efficiency, timePeriod, filter, null); + } + + public static StatValue itemEffMultiplier(Floatf efficiency, float timePeriod, Boolf filter, @Nullable ObjectFloatMap itemDurationMultipliers){ 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())){ + float timeMultiplier = itemDurationMultipliers == null ? 1f : itemDurationMultipliers.get(item, 1f); + float time = 1f / (timePeriod * timeMultiplier / 60f); + 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(item.localizedName + (timePeriod > 0 ? "\n[lightgray]" + (time < 0.01f ? Strings.fixed(time, 3) : Strings.autoFixed(time, 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(); }