This commit is contained in:
Anuken
2025-02-08 00:07:58 -05:00
parent 49f68be2cb
commit 710895fab5
4 changed files with 31 additions and 6 deletions
+1
View File
@@ -2406,6 +2406,7 @@ public class Blocks{
envEnabled = Env.any; envEnabled = Env.any;
generateEffect = Fx.generatespark; generateEffect = Fx.generatespark;
itemDurationMultipliers.put(Items.phaseFabric, 210f / 14f);
drawer = new DrawMulti(new DrawDefault(), new DrawWarmupRegion()); drawer = new DrawMulti(new DrawDefault(), new DrawWarmupRegion());
consume(new ConsumeItemRadioactive()); consume(new ConsumeItemRadioactive());
}}; }};
@@ -3,6 +3,7 @@ package mindustry.world.blocks.power;
import arc.*; import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.*; import mindustry.entities.*;
@@ -21,6 +22,7 @@ public class ConsumeGenerator extends PowerGenerator{
public float effectChance = 0.01f; public float effectChance = 0.01f;
public Effect generateEffect = Fx.none, consumeEffect = Fx.none; public Effect generateEffect = Fx.none, consumeEffect = Fx.none;
public float generateEffectRange = 3f; public float generateEffectRange = 3f;
public float baseLightRadius = 65f;
public @Nullable LiquidStack outputLiquid; public @Nullable LiquidStack outputLiquid;
/** If true, this block explodes when outputLiquid exceeds capacity. */ /** If true, this block explodes when outputLiquid exceeds capacity. */
@@ -28,6 +30,8 @@ public class ConsumeGenerator extends PowerGenerator{
public @Nullable ConsumeItemFilter filterItem; public @Nullable ConsumeItemFilter filterItem;
public @Nullable ConsumeLiquidFilter filterLiquid; public @Nullable ConsumeLiquidFilter filterLiquid;
/** Multiplies the itemDuration for a given item. */
public ObjectFloatMap<Item> itemDurationMultipliers = new ObjectFloatMap<>();
public ConsumeGenerator(String name){ public ConsumeGenerator(String name){
super(name); super(name);
@@ -47,6 +51,11 @@ public class ConsumeGenerator extends PowerGenerator{
filterItem = findConsumer(c -> c instanceof ConsumeItemFilter); filterItem = findConsumer(c -> c instanceof ConsumeItemFilter);
filterLiquid = findConsumer(c -> c instanceof ConsumeLiquidFilter); 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){ if(outputLiquid != null){
outputsLiquid = true; outputsLiquid = true;
hasLiquids = true; hasLiquids = true;
@@ -56,9 +65,8 @@ public class ConsumeGenerator extends PowerGenerator{
explosionPuddleLiquid = outputLiquid.liquid; explosionPuddleLiquid = outputLiquid.liquid;
} }
//TODO hardcoded
emitLight = true; emitLight = true;
lightRadius = 65f * size; lightRadius = baseLightRadius * size;
super.init(); super.init();
} }
@@ -77,7 +85,7 @@ public class ConsumeGenerator extends PowerGenerator{
} }
public class ConsumeGeneratorBuild extends GeneratorBuild{ public class ConsumeGeneratorBuild extends GeneratorBuild{
public float warmup, totalTime, efficiencyMultiplier = 1f; public float warmup, totalTime, efficiencyMultiplier = 1f, itemDurationMultiplier = 1;
@Override @Override
public void updateEfficiencyMultiplier(){ public void updateEfficiencyMultiplier(){
@@ -106,6 +114,11 @@ public class ConsumeGenerator extends PowerGenerator{
generateEffect.at(x + Mathf.range(generateEffectRange), y + Mathf.range(generateEffectRange)); 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 //take in items periodically
if(hasItems && valid && generateTime <= 0f){ if(hasItems && valid && generateTime <= 0f){
consume(); 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 //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 @Override
@@ -1,10 +1,14 @@
package mindustry.world.consumers; package mindustry.world.consumers;
import arc.func.*; import arc.func.*;
import arc.struct.*;
import arc.util.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
public class ConsumeItemEfficiency extends ConsumeItemFilter{ public class ConsumeItemEfficiency extends ConsumeItemFilter{
/** This has no effect on the consumer itself, but is used for stat display. */
public @Nullable ObjectFloatMap<Item> itemDurationMultipliers;
public ConsumeItemEfficiency(Boolf<Item> item){ public ConsumeItemEfficiency(Boolf<Item> item){
super(item); super(item);
@@ -15,6 +19,6 @@ public class ConsumeItemEfficiency extends ConsumeItemFilter{
@Override @Override
public void display(Stats stats){ 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));
} }
} }
@@ -460,14 +460,21 @@ public class StatValues{
} }
public static StatValue itemEffMultiplier(Floatf<Item> efficiency, float timePeriod, Boolf<Item> filter){ public static StatValue itemEffMultiplier(Floatf<Item> efficiency, float timePeriod, Boolf<Item> filter){
return itemEffMultiplier(efficiency, timePeriod, filter, null);
}
public static StatValue itemEffMultiplier(Floatf<Item> efficiency, float timePeriod, Boolf<Item> filter, @Nullable ObjectFloatMap<Item> itemDurationMultipliers){
return table -> { return table -> {
table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left
table.row(); table.row();
table.table(c -> { table.table(c -> {
for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ 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 -> { c.table(Styles.grayPanel, b -> {
b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); 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); b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f);
}).growX().pad(5).row(); }).growX().pad(5).row();
} }