multi-liquids consumers
This commit is contained in:
@@ -5,6 +5,8 @@ import arc.struct.*;
|
|||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
|
|
||||||
public class LiquidStack implements Comparable<LiquidStack>{
|
public class LiquidStack implements Comparable<LiquidStack>{
|
||||||
|
public static final LiquidStack[] empty = {};
|
||||||
|
|
||||||
public Liquid liquid;
|
public Liquid liquid;
|
||||||
public float amount;
|
public float amount;
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ public class ForceProjector extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
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);
|
phaseHeat = Mathf.lerpDelta(phaseHeat, Mathf.num(phaseValid), 0.1f);
|
||||||
|
|
||||||
|
|||||||
@@ -56,18 +56,18 @@ public class ItemTurret extends Turret{
|
|||||||
public void init(){
|
public void init(){
|
||||||
consumes.add(new ConsumeItemFilter(i -> ammoTypes.containsKey(i)){
|
consumes.add(new ConsumeItemFilter(i -> ammoTypes.containsKey(i)){
|
||||||
@Override
|
@Override
|
||||||
public void build(Building tile, Table table){
|
public void build(Building build, Table table){
|
||||||
MultiReqImage image = new MultiReqImage();
|
MultiReqImage image = new MultiReqImage();
|
||||||
content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.uiIcon),
|
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);
|
table.add(image).size(8 * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building entity){
|
public boolean valid(Building build){
|
||||||
//valid when there's any ammo in the turret
|
//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
|
@Override
|
||||||
|
|||||||
@@ -48,12 +48,12 @@ public class LiquidTurret extends Turret{
|
|||||||
public void init(){
|
public void init(){
|
||||||
consumes.add(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){
|
consumes.add(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building entity){
|
public boolean valid(Building build){
|
||||||
return entity.liquids.total() > 0.001f;
|
return build.liquids.total() > 0.001f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building entity){
|
public void update(Building build){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -345,9 +345,9 @@ public class PowerGraph{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean otherConsumersAreValid(Building tile, Consume consumePower){
|
private boolean otherConsumersAreValid(Building build, Consume consumePower){
|
||||||
for(Consume cons : tile.block.consumes.all()){
|
for(Consume cons : build.block.consumes.all()){
|
||||||
if(cons != consumePower && !cons.isOptional() && !cons.valid(tile)){
|
if(cons != consumePower && !cons.isOptional() && !cons.valid(build)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public class GenericCrafter extends Block{
|
|||||||
super.setBars();
|
super.setBars();
|
||||||
|
|
||||||
//set up liquid bars for multiple liquid outputs; TODO multiple inputs not yet supported due to inherent complexity
|
//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){
|
if(outputLiquids != null && outputLiquids.length > 1){
|
||||||
bars.remove("liquid");
|
bars.remove("liquid");
|
||||||
|
|
||||||
|
|||||||
@@ -58,16 +58,14 @@ public abstract class Consume{
|
|||||||
|
|
||||||
public abstract ConsumeType type();
|
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. */
|
/** 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 boolean valid(Building build);
|
||||||
|
|
||||||
public abstract void display(Stats stats);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,18 +26,18 @@ public class ConsumeItemDynamic extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Building tile, Table table){
|
public void build(Building build, Table table){
|
||||||
ItemStack[][] current = {items.get(tile)};
|
ItemStack[][] current = {items.get(build)};
|
||||||
|
|
||||||
table.table(cont -> {
|
table.table(cont -> {
|
||||||
table.update(() -> {
|
table.update(() -> {
|
||||||
if(current[0] != items.get(tile)){
|
if(current[0] != items.get(build)){
|
||||||
rebuild(tile, cont);
|
rebuild(build, cont);
|
||||||
current[0] = items.get(tile);
|
current[0] = items.get(build);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
rebuild(tile, cont);
|
rebuild(build, cont);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,20 +58,20 @@ public class ConsumeItemDynamic extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building entity){
|
public void update(Building build){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void trigger(Building entity){
|
public void trigger(Building build){
|
||||||
for(ItemStack stack : items.get(entity)){
|
for(ItemStack stack : items.get(build)){
|
||||||
entity.items.remove(stack);
|
build.items.remove(stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building entity){
|
public boolean valid(Building build){
|
||||||
return entity.items != null && entity.items.has(items.get(entity));
|
return build.items != null && build.items.has(items.get(build));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -28,39 +28,34 @@ public class ConsumeItemFilter extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Building tile, Table table){
|
public void build(Building build, Table table){
|
||||||
MultiReqImage image = new MultiReqImage();
|
MultiReqImage image = new MultiReqImage();
|
||||||
content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.uiIcon, 1),
|
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);
|
table.add(image).size(8 * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIcon(){
|
public void update(Building build){
|
||||||
return "icon-item";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building entity){
|
public void trigger(Building build){
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void trigger(Building entity){
|
|
||||||
for(int i = 0; i < content.items().size; i++){
|
for(int i = 0; i < content.items().size; i++){
|
||||||
Item item = content.item(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)){
|
||||||
entity.items.remove(item, 1);
|
build.items.remove(item, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building entity){
|
public boolean valid(Building build){
|
||||||
for(int i = 0; i < content.items().size; i++){
|
for(int i = 0; i < content.items().size; i++){
|
||||||
Item item = content.item(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;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,37 +32,27 @@ public class ConsumeItems extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Building tile, Table table){
|
public void build(Building build, Table table){
|
||||||
table.table(c -> {
|
table.table(c -> {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(var stack : items){
|
for(var stack : items){
|
||||||
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
|
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();
|
if(++i % 4 == 0) c.row();
|
||||||
}
|
}
|
||||||
}).left();
|
}).left();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIcon(){
|
public void trigger(Building build){
|
||||||
return "icon-item";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(Building entity){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void trigger(Building entity){
|
|
||||||
for(var stack : items){
|
for(var stack : items){
|
||||||
entity.items.remove(stack);
|
build.items.remove(stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building entity){
|
public boolean valid(Building build){
|
||||||
return entity.items != null && entity.items.has(items);
|
return build.items != null && build.items.has(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -27,23 +27,18 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Building tile, Table table){
|
public void build(Building build, Table table){
|
||||||
table.add(new ReqImage(liquid.uiIcon, () -> valid(tile))).size(iconMed).top().left();
|
table.add(new ReqImage(liquid.uiIcon, () -> valid(build))).size(iconMed).top().left();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIcon(){
|
public void update(Building build){
|
||||||
return "icon-liquid-consume";
|
build.liquids.remove(liquid, Math.min(use(build), build.liquids.get(liquid)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building entity){
|
public boolean valid(Building build){
|
||||||
entity.liquids.remove(liquid, Math.min(use(entity), entity.liquids.get(liquid)));
|
return build.liquids != null && build.liquids.get(liquid) >= amount * build.delta();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean valid(Building entity){
|
|
||||||
return entity != null && entity.liquids != null && entity.liquids.get(liquid) >= amount * entity.delta();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -38,18 +38,13 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIcon(){
|
public void update(Building build){
|
||||||
return "icon-liquid-consume";
|
build.liquids.remove(build.liquids.current(), use(build));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building entity){
|
public boolean valid(Building build){
|
||||||
entity.liquids.remove(entity.liquids.current(), use(entity));
|
return build != null && build.liquids != null && filter.get(build.liquids.current()) && build.liquids.currentAmount() >= use(build);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean valid(Building entity){
|
|
||||||
return entity != null && entity.liquids != null && filter.get(entity.liquids.current()) && entity.liquids.currentAmount() >= use(entity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,26 +30,11 @@ public class ConsumePower extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Building tile, Table table){
|
public boolean valid(Building build){
|
||||||
//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){
|
|
||||||
if(buffered){
|
if(buffered){
|
||||||
return true;
|
return true;
|
||||||
}else{
|
}else{
|
||||||
return entity.power.status > 0f;
|
return build.power.status > 0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,9 +62,13 @@ public class StatValues{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static StatValue liquids(float timePeriod, LiquidStack... stacks){
|
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 -> {
|
return table -> {
|
||||||
for(var stack : stacks){
|
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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user