diff --git a/core/src/mindustry/type/LiquidStack.java b/core/src/mindustry/type/LiquidStack.java index 241c3e6ca3..9250d24c8e 100644 --- a/core/src/mindustry/type/LiquidStack.java +++ b/core/src/mindustry/type/LiquidStack.java @@ -5,6 +5,8 @@ import arc.struct.*; import mindustry.content.*; public class LiquidStack implements Comparable{ + public static final LiquidStack[] empty = {}; + public Liquid liquid; public float amount; diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index 250d9e4921..e0747fc853 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -130,7 +130,7 @@ public class ForceProjector extends Block{ @Override public void updateTile(){ - boolean phaseValid = consumes.get(ConsumeType.item).valid(this); + boolean phaseValid = consumes.has(ConsumeType.item) && consumes.get(ConsumeType.item).valid(this); phaseHeat = Mathf.lerpDelta(phaseHeat, Mathf.num(phaseValid), 0.1f); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 8e1a2c0ad5..01c9a58194 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -56,18 +56,18 @@ public class ItemTurret extends Turret{ public void init(){ consumes.add(new ConsumeItemFilter(i -> ammoTypes.containsKey(i)){ @Override - public void build(Building tile, Table table){ + public void build(Building build, Table table){ MultiReqImage image = new MultiReqImage(); content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.uiIcon), - () -> tile instanceof ItemTurretBuild it && !it.ammo.isEmpty() && ((ItemEntry)it.ammo.peek()).item == item))); + () -> build instanceof ItemTurretBuild it && !it.ammo.isEmpty() && ((ItemEntry)it.ammo.peek()).item == item))); table.add(image).size(8 * 4); } @Override - public boolean valid(Building entity){ + public boolean valid(Building build){ //valid when there's any ammo in the turret - return entity instanceof ItemTurretBuild it && !it.ammo.isEmpty(); + return build instanceof ItemTurretBuild it && !it.ammo.isEmpty(); } @Override diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 5e02e195a5..a18654ee3c 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -48,12 +48,12 @@ public class LiquidTurret extends Turret{ public void init(){ consumes.add(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){ @Override - public boolean valid(Building entity){ - return entity.liquids.total() > 0.001f; + public boolean valid(Building build){ + return build.liquids.total() > 0.001f; } @Override - public void update(Building entity){ + public void update(Building build){ } diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index 4340cd083d..735af932ec 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -345,9 +345,9 @@ public class PowerGraph{ } } - private boolean otherConsumersAreValid(Building tile, Consume consumePower){ - for(Consume cons : tile.block.consumes.all()){ - if(cons != consumePower && !cons.isOptional() && !cons.valid(tile)){ + private boolean otherConsumersAreValid(Building build, Consume consumePower){ + for(Consume cons : build.block.consumes.all()){ + if(cons != consumePower && !cons.isOptional() && !cons.valid(build)){ return false; } } diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index aae3c984b9..17f66b7d61 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -70,7 +70,7 @@ public class GenericCrafter extends Block{ super.setBars(); //set up liquid bars for multiple liquid outputs; TODO multiple inputs not yet supported due to inherent complexity - //TODO this will currently screw up input display if input liquids are available + //TODO this will currently screw up input display if input liquids are available - no good way to fix that yet if(outputLiquids != null && outputLiquids.length > 1){ bars.remove("liquid"); diff --git a/core/src/mindustry/world/consumers/Consume.java b/core/src/mindustry/world/consumers/Consume.java index e1e9cac916..335c16e79a 100644 --- a/core/src/mindustry/world/consumers/Consume.java +++ b/core/src/mindustry/world/consumers/Consume.java @@ -58,16 +58,14 @@ public abstract class Consume{ public abstract ConsumeType type(); - public abstract void build(Building tile, Table table); + public void build(Building build, Table table){} /** Called when a consumption is triggered manually. */ - public void trigger(Building entity){} + public void trigger(Building build){} - public abstract String getIcon(); + public void update(Building build){} - public abstract void update(Building entity); + public void display(Stats stats){} - public abstract boolean valid(Building entity); - - public abstract void display(Stats stats); + public abstract boolean valid(Building build); } diff --git a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java index 009824d1d8..3f1125be89 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java @@ -26,18 +26,18 @@ public class ConsumeItemDynamic extends Consume{ } @Override - public void build(Building tile, Table table){ - ItemStack[][] current = {items.get(tile)}; + public void build(Building build, Table table){ + ItemStack[][] current = {items.get(build)}; table.table(cont -> { table.update(() -> { - if(current[0] != items.get(tile)){ - rebuild(tile, cont); - current[0] = items.get(tile); + if(current[0] != items.get(build)){ + rebuild(build, cont); + current[0] = items.get(build); } }); - rebuild(tile, cont); + rebuild(build, cont); }); } @@ -58,20 +58,20 @@ public class ConsumeItemDynamic extends Consume{ } @Override - public void update(Building entity){ + public void update(Building build){ } @Override - public void trigger(Building entity){ - for(ItemStack stack : items.get(entity)){ - entity.items.remove(stack); + public void trigger(Building build){ + for(ItemStack stack : items.get(build)){ + build.items.remove(stack); } } @Override - public boolean valid(Building entity){ - return entity.items != null && entity.items.has(items.get(entity)); + public boolean valid(Building build){ + return build.items != null && build.items.has(items.get(build)); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index bc81cc9201..7eb98ace27 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -28,39 +28,34 @@ public class ConsumeItemFilter extends Consume{ } @Override - public void build(Building tile, Table table){ + public void build(Building build, Table table){ MultiReqImage image = new MultiReqImage(); content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.uiIcon, 1), - () -> tile.items != null && tile.items.has(item)))); + () -> build.items != null && build.items.has(item)))); table.add(image).size(8 * 4); } @Override - public String getIcon(){ - return "icon-item"; + public void update(Building build){ } @Override - public void update(Building entity){ - } - - @Override - public void trigger(Building entity){ + public void trigger(Building build){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); - if(entity.items != null && entity.items.has(item) && this.filter.get(item)){ - entity.items.remove(item, 1); + if(build.items != null && build.items.has(item) && this.filter.get(item)){ + build.items.remove(item, 1); break; } } } @Override - public boolean valid(Building entity){ + public boolean valid(Building build){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); - if(entity.items != null && entity.items.has(item) && this.filter.get(item)){ + if(build.items != null && build.items.has(item) && this.filter.get(item)){ return true; } } diff --git a/core/src/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java index be41ed773c..d0c1226bfc 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -32,37 +32,27 @@ public class ConsumeItems extends Consume{ } @Override - public void build(Building tile, Table table){ + public void build(Building build, Table table){ table.table(c -> { int i = 0; for(var stack : items){ c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount), - () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); + () -> build.items != null && build.items.has(stack.item, stack.amount))).padRight(8); if(++i % 4 == 0) c.row(); } }).left(); } @Override - public String getIcon(){ - return "icon-item"; - } - - @Override - public void update(Building entity){ - - } - - @Override - public void trigger(Building entity){ + public void trigger(Building build){ for(var stack : items){ - entity.items.remove(stack); + build.items.remove(stack); } } @Override - public boolean valid(Building entity){ - return entity.items != null && entity.items.has(items); + public boolean valid(Building build){ + return build.items != null && build.items.has(items); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index fc345f88cc..4d499bda1d 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -27,23 +27,18 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ } @Override - public void build(Building tile, Table table){ - table.add(new ReqImage(liquid.uiIcon, () -> valid(tile))).size(iconMed).top().left(); + public void build(Building build, Table table){ + table.add(new ReqImage(liquid.uiIcon, () -> valid(build))).size(iconMed).top().left(); } @Override - public String getIcon(){ - return "icon-liquid-consume"; + public void update(Building build){ + build.liquids.remove(liquid, Math.min(use(build), build.liquids.get(liquid))); } @Override - public void update(Building entity){ - entity.liquids.remove(liquid, Math.min(use(entity), entity.liquids.get(liquid))); - } - - @Override - public boolean valid(Building entity){ - return entity != null && entity.liquids != null && entity.liquids.get(liquid) >= amount * entity.delta(); + public boolean valid(Building build){ + return build.liquids != null && build.liquids.get(liquid) >= amount * build.delta(); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 8b2e8fe270..9d3c69a71d 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -38,18 +38,13 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ } @Override - public String getIcon(){ - return "icon-liquid-consume"; + public void update(Building build){ + build.liquids.remove(build.liquids.current(), use(build)); } @Override - public void update(Building entity){ - entity.liquids.remove(entity.liquids.current(), use(entity)); - } - - @Override - public boolean valid(Building entity){ - return entity != null && entity.liquids != null && filter.get(entity.liquids.current()) && entity.liquids.currentAmount() >= use(entity); + public boolean valid(Building build){ + return build != null && build.liquids != null && filter.get(build.liquids.current()) && build.liquids.currentAmount() >= use(build); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeLiquids.java b/core/src/mindustry/world/consumers/ConsumeLiquids.java new file mode 100644 index 0000000000..ddefd5d4ff --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeLiquids.java @@ -0,0 +1,72 @@ +package mindustry.world.consumers; + +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; + +//TODO test! +public class ConsumeLiquids extends Consume{ + public final LiquidStack[] liquids; + + public ConsumeLiquids(LiquidStack[] liquids){ + this.liquids = liquids; + } + + /** Mods.*/ + protected ConsumeLiquids(){ + this(LiquidStack.empty); + } + + @Override + public void applyLiquidFilter(Bits filter){ + for(var stack : liquids){ + filter.set(stack.liquid.id); + } + } + + @Override + public ConsumeType type(){ + return ConsumeType.liquid; + } + + @Override + public void build(Building build, Table table){ + table.table(c -> { + int i = 0; + for(var stack : liquids){ + c.add(new ReqImage(stack.liquid.uiIcon, + () -> build.liquids != null && build.liquids.get(stack.liquid) >= stack.amount * build.delta())).padRight(8); + if(++i % 4 == 0) c.row(); + } + }).left(); + } + + @Override + public void update(Building build){ + for(var stack : liquids){ + build.liquids.remove(stack.liquid, Math.min(use(stack.amount, build), build.liquids.get(stack.liquid))); + } + } + + @Override + public boolean valid(Building build){ + for(var stack : liquids){ + if(build.liquids.get(stack.liquid) < stack.amount * build.delta()){ + return false; + } + } + return true; + } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquids(stats.timePeriod, stats.timePeriod >= 0, liquids)); + } + + protected float use(float amount, Building build){ + return Math.min(amount * build.edelta(), build.block.liquidCapacity); + } +} diff --git a/core/src/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java index 7b0819cf9b..bc79f7aa9f 100644 --- a/core/src/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -30,26 +30,11 @@ public class ConsumePower extends Consume{ } @Override - public void build(Building tile, Table table){ - //No tooltip for power, for now - } - - @Override - public String getIcon(){ - return "icon-power"; - } - - @Override - public void update(Building entity){ - // Nothing to do since PowerGraph directly updates entity.power.status - } - - @Override - public boolean valid(Building entity){ + public boolean valid(Building build){ if(buffered){ return true; }else{ - return entity.power.status > 0f; + return build.power.status > 0f; } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index af071b3f06..b148c6a16e 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -62,9 +62,13 @@ public class StatValues{ } public static StatValue liquids(float timePeriod, LiquidStack... stacks){ + return liquids(timePeriod, true, stacks); + } + + 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), true)).padRight(5); + table.add(new LiquidDisplay(stack.liquid, stack.amount * (60f / timePeriod), perSecond)).padRight(5); } }; }