Full implementation of #7014

This commit is contained in:
Anuken
2022-10-04 13:07:23 -04:00
parent e661abaf24
commit 88d6c4c8f9
17 changed files with 70 additions and 26 deletions

View File

@@ -121,6 +121,8 @@ public class Reconstructor extends UnitBlock{
}
}
consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));
super.init();
}

View File

@@ -123,6 +123,8 @@ public class UnitAssembler extends PayloadBlock{
updateClipRadius(areaSize * tilesize);
consume(consPayload = new ConsumePayloadDynamic((UnitAssemblerBuild build) -> build.plan().requirements));
consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));
super.init();
}

View File

@@ -25,6 +25,8 @@ import mindustry.world.blocks.payloads.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class UnitFactory extends UnitBlock{
public int[] capacities = {};
@@ -74,6 +76,8 @@ public class UnitFactory extends UnitBlock{
}
}
consumeBuilder.each(c -> c.multiplier = b -> state.rules.unitCost(b.team));
super.init();
}

View File

@@ -1,5 +1,6 @@
package mindustry.world.consumers;
import arc.func.*;
import arc.scene.ui.layout.*;
import mindustry.gen.*;
import mindustry.world.*;
@@ -13,6 +14,8 @@ public abstract class Consume{
public boolean booster;
/** If false, this consumer will still be checked, but it will need to updated manually. */
public boolean update = true;
/** Multiplier for costs. Does not work for power consumers. */
public Floatf<Building> multiplier = b -> 1f;
/**
* Apply extra filters to a block.

View File

@@ -37,13 +37,13 @@ public class ConsumeItemDynamic extends Consume{
});
}
private void rebuild(Building tile, Table table){
private void rebuild(Building build, Table table){
table.clear();
int i = 0;
for(ItemStack stack : items.get(tile)){
table.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
() -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8).left();
for(ItemStack stack : items.get(build)){
table.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
() -> build.items != null && build.items.has(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8).left();
if(++i % 4 == 0) table.row();
}
}
@@ -51,12 +51,12 @@ public class ConsumeItemDynamic extends Consume{
@Override
public void trigger(Building build){
for(ItemStack stack : items.get(build)){
build.items.remove(stack);
build.items.remove(stack.item, Math.round(stack.amount * multiplier.get(build)));
}
}
@Override
public float efficiency(Building build){
return build.consumeTriggerValid() || build.items.has(items.get(build)) ? 1f : 0f;
return build.consumeTriggerValid() || build.items.has(items.get(build), multiplier.get(build)) ? 1f : 0f;
}
}

View File

@@ -33,8 +33,8 @@ public class ConsumeItems extends Consume{
table.table(c -> {
int i = 0;
for(var stack : items){
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
() -> build.items.has(stack.item, stack.amount))).padRight(8);
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
() -> build.items.has(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8);
if(++i % 4 == 0) c.row();
}
}).left();
@@ -43,13 +43,13 @@ public class ConsumeItems extends Consume{
@Override
public void trigger(Building build){
for(var stack : items){
build.items.remove(stack);
build.items.remove(stack.item, Math.round(stack.amount * multiplier.get(build)));
}
}
@Override
public float efficiency(Building build){
return build.consumeTriggerValid() || build.items.has(items) ? 1f : 0f;
return build.consumeTriggerValid() || build.items.has(items, multiplier.get(build)) ? 1f : 0f;
}
@Override

View File

@@ -35,7 +35,7 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
@Override
public void update(Building build){
build.liquids.remove(liquid, amount * build.edelta());
build.liquids.remove(liquid, amount * build.edelta() * multiplier.get(build));
}
@Override
@@ -43,7 +43,7 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
float ed = build.edelta() * build.efficiencyScale();
if(ed <= 0.00000001f) return 0f;
//there can be more liquid than necessary, so cap at 1
return Math.min(build.liquids.get(liquid) / (amount * ed), 1f);
return Math.min(build.liquids.get(liquid) / (amount * ed * multiplier.get(build)), 1f);
}
@Override

View File

@@ -43,7 +43,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
public void update(Building build){
Liquid liq = getConsumed(build);
if(liq != null){
build.liquids.remove(liq, amount * build.edelta());
build.liquids.remove(liq, amount * build.edelta() * multiplier.get(build));
}
}
@@ -52,7 +52,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
var liq = getConsumed(build);
float ed = build.edelta();
if(ed <= 0.00000001f) return 0f;
return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed), 1f) : 0f;
return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed * multiplier.get(build)), 1f) : 0f;
}
public @Nullable Liquid getConsumed(Building build){

View File

@@ -42,18 +42,20 @@ public class ConsumeLiquids extends Consume{
@Override
public void update(Building build){
float mult = multiplier.get(build);
for(var stack : liquids){
build.liquids.remove(stack.liquid, stack.amount * build.edelta());
build.liquids.remove(stack.liquid, stack.amount * build.edelta() * mult);
}
}
@Override
public float efficiency(Building build){
float mult = multiplier.get(build);
float ed = build.edelta();
if(ed <= 0.00000001f) return 0f;
float min = 1f;
for(var stack : liquids){
min = Math.min(build.liquids.get(stack.liquid) / (stack.amount * ed), min);
min = Math.min(build.liquids.get(stack.liquid) / (stack.amount * ed * mult), min);
}
return min;
}

View File

@@ -18,12 +18,21 @@ public class ConsumePayloadDynamic extends Consume{
@Override
public float efficiency(Building build){
return build.getPayloads().contains(payloads.get(build)) ? 1f : 0f;
float mult = multiplier.get(build);
for(PayloadStack stack : payloads.get(build)){
if(!build.getPayloads().contains(stack.item, Math.round(stack.amount * mult))){
return 0f;
}
}
return 1f;
}
@Override
public void trigger(Building build){
build.getPayloads().remove(payloads.get(build));
float mult = multiplier.get(build);
for(PayloadStack stack : payloads.get(build)){
build.getPayloads().remove(stack.item, Math.round(stack.amount * mult));
}
}
@Override
@@ -54,8 +63,8 @@ public class ConsumePayloadDynamic extends Consume{
table.table(c -> {
int i = 0;
for(var stack : pay){
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
() -> inv.contains(stack.item, stack.amount))).padRight(8);
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
() -> inv.contains(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8);
if(++i % 4 == 0) c.row();
}
}).left();

View File

@@ -16,12 +16,21 @@ public class ConsumePayloads extends Consume{
@Override
public float efficiency(Building build){
return build.getPayloads().contains(payloads) ? 1f : 0f;
float mult = multiplier.get(build);
for(PayloadStack stack : payloads){
if(!build.getPayloads().contains(stack.item, Math.round(stack.amount * mult))){
return 0f;
}
}
return 1f;
}
@Override
public void trigger(Building build){
build.getPayloads().remove(payloads);
float mult = multiplier.get(build);
for(PayloadStack stack : payloads){
build.getPayloads().remove(stack.item, Math.round(stack.amount * mult));
}
}
@Override
@@ -42,8 +51,8 @@ public class ConsumePayloads extends Consume{
table.table(c -> {
int i = 0;
for(var stack : payloads){
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, stack.amount),
() -> inv.contains(stack.item, stack.amount))).padRight(8);
c.add(new ReqImage(new ItemImage(stack.item.uiIcon, Math.round(stack.amount * multiplier.get(build))),
() -> inv.contains(stack.item, Math.round(stack.amount * multiplier.get(build))))).padRight(8);
if(++i % 4 == 0) c.row();
}
}).left();