multi-liquids consumers

This commit is contained in:
Anuken
2021-11-14 23:30:58 -05:00
parent 486622e3e4
commit 7acf53c509
15 changed files with 134 additions and 98 deletions
@@ -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);
}
@@ -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
@@ -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;
}
}
@@ -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
@@ -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
@@ -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
@@ -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
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;
}
}