aeugh
This commit is contained in:
@@ -456,37 +456,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
return timeScale;
|
return timeScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean consValid(){
|
|
||||||
return consValid && enabled && shouldConsume();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void consume(){
|
|
||||||
for(Consume cons : block.consumers){
|
|
||||||
cons.trigger(self());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canConsume(){
|
|
||||||
return consValid && enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Scaled delta. */
|
|
||||||
public float delta(){
|
|
||||||
return Time.delta * timeScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Efficiency * delta. */
|
|
||||||
public float edelta(){
|
|
||||||
return efficiency() * delta();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Base efficiency. If this entity has non-buffered power, returns the power %, otherwise returns 1. */
|
|
||||||
public float efficiency(){
|
|
||||||
//disabled -> 0 efficiency
|
|
||||||
if(!enabled) return 0;
|
|
||||||
return power != null && (block.consPower != null && !block.consPower.buffered) ? power.status : 1f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the building's 'warmup', a smooth value from 0 to 1.
|
* @return the building's 'warmup', a smooth value from 0 to 1.
|
||||||
* usually used for crafters and things that need to spin up before reaching full efficiency.
|
* usually used for crafters and things that need to spin up before reaching full efficiency.
|
||||||
@@ -1614,30 +1583,161 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
|
||||||
|
public float efficiency(){
|
||||||
|
return efficiency;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO probably should not have a shouldConsume() check?
|
||||||
|
public boolean consValid(){
|
||||||
|
return consValid && shouldConsume();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void consume(){
|
||||||
|
for(Consume cons : block.consumers){
|
||||||
|
cons.trigger(self());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canConsume(){
|
||||||
|
return consValid && enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Scaled delta. */
|
||||||
|
public float delta(){
|
||||||
|
return Time.delta * timeScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Efficiency * delta. */
|
||||||
|
public float edelta(){
|
||||||
|
return efficiency * delta();
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO save/load this, new building version
|
||||||
|
/** Base efficiency. If this entity has non-buffered power, returns the power %, otherwise returns 1. */
|
||||||
|
private transient float efficiency = 1f;
|
||||||
|
|
||||||
|
//TODO remove?
|
||||||
|
@Deprecated
|
||||||
|
private transient boolean consOptionalValid = false;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public boolean consOptionalValid(){
|
||||||
|
return consValid && consOptionalValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO unit tests:
|
||||||
|
//- 50% power efficiency -> 50% liquid consumption
|
||||||
|
//- 50% liquid consumption -> other liquid or item consumer runs at 50% efficiency
|
||||||
|
//- same as above but with overdrive and timeScale = 2 and differing delta values
|
||||||
|
|
||||||
|
/*
|
||||||
|
SCENARIOS:
|
||||||
|
|
||||||
|
1.
|
||||||
|
- liquid at 50% satisfied
|
||||||
|
- liquid at 100% satisfied
|
||||||
|
- item at 100% satisfied
|
||||||
|
result:
|
||||||
|
- efficiency = 50%
|
||||||
|
- all consumers should consume at 50%
|
||||||
|
|
||||||
|
2.
|
||||||
|
- liquid at 50% satisfied
|
||||||
|
- power at 100% satisfied
|
||||||
|
result:
|
||||||
|
- efficiency = 50%
|
||||||
|
- power will still consume 100% - SHOULD IT?
|
||||||
|
|
||||||
|
3.
|
||||||
|
- liquid at 50% satisfied
|
||||||
|
- item at 200% satisfied (boosted)
|
||||||
|
result: ???
|
||||||
|
|
||||||
|
4.
|
||||||
|
- item at 200% satisfied
|
||||||
|
- liquid at 200% satisfied
|
||||||
|
result:
|
||||||
|
- 200% efficiency (why?)
|
||||||
|
- will consume at *normal rate*
|
||||||
|
|
||||||
|
5.
|
||||||
|
- item at 200% satisfied
|
||||||
|
- liquid at 100% satisfied (required, no boost)
|
||||||
|
result:
|
||||||
|
- averaging efficiency would lead to 150%, but this is WRONG. it should be 200% - how?
|
||||||
|
|
||||||
|
6.
|
||||||
|
- item at 200%
|
||||||
|
- liquid at 50%
|
||||||
|
result:
|
||||||
|
- 100% efficiency (2 * 0.5)
|
||||||
|
- consumption of liquid at 50% (how?)
|
||||||
|
- ...but consumption of item at 100% rate (how?)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
//TODO test with overdraw, e.g. requesting 20/frame on a block with only 10 capacity
|
||||||
|
//- should lead to 50% efficiency, for example - make sure all blocks have, at minimum, 10x their capacity per frame - should last for a second at least
|
||||||
|
|
||||||
public void updateConsumption(){
|
public void updateConsumption(){
|
||||||
//everything is valid when cheating
|
//everything is valid when cheating
|
||||||
if(cheating()){
|
if(cheating()){
|
||||||
consValid = true;
|
consValid = true;
|
||||||
|
consOptionalValid = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean prevValid = consValid();
|
//disabled -> nothing works
|
||||||
consValid = true;
|
if(!enabled){
|
||||||
boolean docons = shouldConsume() && productionValid();
|
efficiency = 0f;
|
||||||
|
consValid = consOptionalValid = false;
|
||||||
for(Consume cons : block.nonOptionalConsumers){
|
return;
|
||||||
if(docons && cons.update && prevValid && cons.valid(self())){
|
|
||||||
cons.update(self());
|
|
||||||
}
|
|
||||||
|
|
||||||
consValid &= cons.valid(self());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean prevValid = consValid;
|
||||||
|
consValid = true;
|
||||||
|
//consOptionalValid = true;
|
||||||
|
boolean docons = shouldConsume() && productionValid();
|
||||||
|
|
||||||
|
float minEfficiency = 1f;
|
||||||
|
var nonOptional = block.nonOptionalConsumers;
|
||||||
|
|
||||||
|
//assume efficiency is 1 for the calculations below
|
||||||
|
efficiency = 1f;
|
||||||
|
|
||||||
|
//first pass: get the minimum efficiency of any consumer
|
||||||
|
for(var cons : nonOptional){
|
||||||
|
minEfficiency = Math.min(minEfficiency, cons.efficiency(self()));
|
||||||
|
//consValid &= cons.valid(self());
|
||||||
|
}
|
||||||
|
|
||||||
|
//efficiency is now this minimum value
|
||||||
|
efficiency = minEfficiency;
|
||||||
|
|
||||||
|
//second pass: update every consumer based on efficiency
|
||||||
|
|
||||||
|
//TODO item consumption fraction array
|
||||||
|
|
||||||
|
if(docons && prevValid && minEfficiency > 0){
|
||||||
|
for(var cons : nonOptional){
|
||||||
|
//TODO different array for update = true?
|
||||||
|
if(cons.update){
|
||||||
|
cons.update(self());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO optionals
|
||||||
|
/*
|
||||||
for(Consume cons : block.optionalConsumers){
|
for(Consume cons : block.optionalConsumers){
|
||||||
if(docons && cons.update && prevValid && cons.valid(self())){
|
if(docons && cons.update && prevValid && cons.valid(self())){
|
||||||
cons.update(self());
|
cons.update(self());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
consOptionalValid &= cons.valid(self());
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
|||||||
@@ -147,6 +147,26 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
netClient.clearRemovedEntity(id);
|
netClient.clearRemovedEntity(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Replace
|
||||||
|
public boolean inFogTo(Team viewer){
|
||||||
|
if(this.team == viewer || !state.rules.fog) return false;
|
||||||
|
|
||||||
|
if(hitSize <= 14f){
|
||||||
|
return !fogControl.isVisible(viewer, x, y);
|
||||||
|
}else{
|
||||||
|
//for large hitsizes, check around the unit instead
|
||||||
|
float trns = hitSize / 2f;
|
||||||
|
for(var p : Geometry.d8){
|
||||||
|
if(fogControl.isVisible(team, x + p.x * trns, y + p.y * trns)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float range(){
|
public float range(){
|
||||||
return type.maxRange;
|
return type.maxRange;
|
||||||
|
|||||||
@@ -340,8 +340,6 @@ public class ClassMap{
|
|||||||
classes.put("IncineratorBuild", mindustry.world.blocks.production.Incinerator.IncineratorBuild.class);
|
classes.put("IncineratorBuild", mindustry.world.blocks.production.Incinerator.IncineratorBuild.class);
|
||||||
classes.put("ItemIncinerator", mindustry.world.blocks.production.ItemIncinerator.class);
|
classes.put("ItemIncinerator", mindustry.world.blocks.production.ItemIncinerator.class);
|
||||||
classes.put("ItemIncineratorBuild", mindustry.world.blocks.production.ItemIncinerator.ItemIncineratorBuild.class);
|
classes.put("ItemIncineratorBuild", mindustry.world.blocks.production.ItemIncinerator.ItemIncineratorBuild.class);
|
||||||
classes.put("LiquidConverter", mindustry.world.blocks.production.LiquidConverter.class);
|
|
||||||
classes.put("LiquidConverterBuild", mindustry.world.blocks.production.LiquidConverter.LiquidConverterBuild.class);
|
|
||||||
classes.put("Pump", mindustry.world.blocks.production.Pump.class);
|
classes.put("Pump", mindustry.world.blocks.production.Pump.class);
|
||||||
classes.put("PumpBuild", mindustry.world.blocks.production.Pump.PumpBuild.class);
|
classes.put("PumpBuild", mindustry.world.blocks.production.Pump.PumpBuild.class);
|
||||||
classes.put("Separator", mindustry.world.blocks.production.Separator.class);
|
classes.put("Separator", mindustry.world.blocks.production.Separator.class);
|
||||||
|
|||||||
@@ -1090,8 +1090,8 @@ public class Block extends UnlockableContent implements Senseable{
|
|||||||
buildCost *= buildCostMultiplier;
|
buildCost *= buildCostMultiplier;
|
||||||
|
|
||||||
consumers = consumeBuilder.toArray(Consume.class);
|
consumers = consumeBuilder.toArray(Consume.class);
|
||||||
optionalConsumers = consumeBuilder.select(consume -> consume.optional).toArray(Consume.class);
|
optionalConsumers = consumeBuilder.select(consume -> consume.optional && !consume.ignore()).toArray(Consume.class);
|
||||||
nonOptionalConsumers = consumeBuilder.select(consume -> !consume.optional).toArray(Consume.class);
|
nonOptionalConsumers = consumeBuilder.select(consume -> !consume.optional && !consume.ignore()).toArray(Consume.class);
|
||||||
hasConsumers = consumers.length > 0;
|
hasConsumers = consumers.length > 0;
|
||||||
itemFilter = new boolean[content.items().size];
|
itemFilter = new boolean[content.items().size];
|
||||||
liquidFilter = new boolean[content.liquids().size];
|
liquidFilter = new boolean[content.liquids().size];
|
||||||
|
|||||||
@@ -143,10 +143,10 @@ public class DirectionalForceProjector extends Block{
|
|||||||
if(buildup > 0 && false){
|
if(buildup > 0 && false){
|
||||||
float scale = !broken ? cooldownNormal : cooldownBrokenBase;
|
float scale = !broken ? cooldownNormal : cooldownBrokenBase;
|
||||||
Consume cons = null;
|
Consume cons = null;
|
||||||
if(cons.valid(this)){
|
//if(cons.valid(this)){
|
||||||
cons.update(this);
|
// cons.update(this);
|
||||||
scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f));
|
// scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f));
|
||||||
}
|
//}
|
||||||
|
|
||||||
buildup -= delta() * scale;
|
buildup -= delta() * scale;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,10 +41,6 @@ public class LiquidTurret extends Turret{
|
|||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
consume(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){
|
consume(new ConsumeLiquidFilter(i -> ammoTypes.containsKey(i), 1f){
|
||||||
@Override
|
|
||||||
public boolean valid(Building build){
|
|
||||||
return build.liquids.currentAmount() >= 0.001f;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building build){
|
public void update(Building build){
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class ReloadTurret extends BaseTurret{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void updateCooling(){
|
protected void updateCooling(){
|
||||||
if(reload < reloadTime && coolant != null && coolant.valid(this)){
|
if(reload < reloadTime && coolant != null && coolant.efficiency(this) > 0){
|
||||||
float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : 1f;
|
float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : 1f;
|
||||||
coolant.update(this);
|
coolant.update(this);
|
||||||
reload += coolant.amount * edelta() * capacity * coolantMultiplier;
|
reload += coolant.amount * edelta() * capacity * coolantMultiplier;
|
||||||
|
|||||||
@@ -81,11 +81,11 @@ public class ConsumeGenerator extends PowerGenerator{
|
|||||||
float multiplier = 1f;
|
float multiplier = 1f;
|
||||||
if(valid){
|
if(valid){
|
||||||
if(filterItem != null && filterItem.getConsumed(this) != null){
|
if(filterItem != null && filterItem.getConsumed(this) != null){
|
||||||
itemMultiplier = filterItem.getEfficiency(this);
|
itemMultiplier = filterItem.efficiency(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//efficiency is added together
|
//efficiency is added together
|
||||||
multiplier *= itemMultiplier + (filterLiquid == null ? 0f : filterLiquid.getEfficiency(this));
|
multiplier *= (itemMultiplier + (filterLiquid == null ? 0f : filterLiquid.efficiency(this)));
|
||||||
}
|
}
|
||||||
|
|
||||||
productionEfficiency = (valid ? 1f : 0f) * multiplier;
|
productionEfficiency = (valid ? 1f : 0f) * multiplier;
|
||||||
|
|||||||
@@ -340,9 +340,11 @@ public class PowerGraph{
|
|||||||
entity.remove();
|
entity.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
private boolean otherConsumersAreValid(Building build, Consume consumePower){
|
private boolean otherConsumersAreValid(Building build, Consume consumePower){
|
||||||
for(Consume cons : build.block.consumers){
|
for(Consume cons : build.block.nonOptionalConsumers){
|
||||||
if(cons != consumePower && !cons.optional && !cons.valid(build)){
|
//TODO fix this properly
|
||||||
|
if(cons != consumePower && cons.efficiency(build) <= 0.0000001f){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,11 @@ public abstract class Consume{
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return if true, this consumer will be ignored in the consumer list (no updates or valid() checks) */
|
||||||
|
public boolean ignore(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void build(Building build, Table table){}
|
public void build(Building build, Table table){}
|
||||||
|
|
||||||
/** Called when a consumption is triggered manually. */
|
/** Called when a consumption is triggered manually. */
|
||||||
@@ -47,7 +52,13 @@ public abstract class Consume{
|
|||||||
|
|
||||||
public void update(Building build){}
|
public void update(Building build){}
|
||||||
|
|
||||||
|
/** @return efficiency multiplier based on input; overridden in subclasses. Returns 0 if not valid in subclasses. Should return fraction if needs are partially met. */
|
||||||
|
public float efficiency(Building build){
|
||||||
|
return 1f;
|
||||||
|
}
|
||||||
|
|
||||||
public void display(Stats stats){}
|
public void display(Stats stats){}
|
||||||
|
|
||||||
public abstract boolean valid(Building build);
|
//TODO this should use efficiency instead - remove or deprecate
|
||||||
|
//public abstract boolean valid(Building build);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,4 @@ public class ConsumeCoolant extends ConsumeLiquidFilter{
|
|||||||
this.filter = liquid -> liquid.coolant && liquid.temperature <= maxTemp && liquid.flammability < maxFlammability;
|
this.filter = liquid -> liquid.coolant && liquid.temperature <= maxTemp && liquid.flammability < maxFlammability;
|
||||||
this.amount = amount;
|
this.amount = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
//mods
|
|
||||||
public ConsumeCoolant(){
|
|
||||||
this(0.1f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public class ConsumeItemCharged extends ConsumeItemFilter{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getEfficiency(Building build){
|
public float efficiency(Building build){
|
||||||
var item = getConsumed(build);
|
var item = getConsumed(build);
|
||||||
return item == null ? 0f : item.charge;
|
return item == null ? 0f : item.charge;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class ConsumeItemDynamic extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
return build.consumeTriggerValid() || build.items.has(items.get(build));
|
return build.consumeTriggerValid() || build.items.has(items.get(build)) ? 1f : 0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,12 +53,7 @@ public class ConsumeItemExplode extends ConsumeItemFilter{
|
|||||||
public void apply(Block block){}
|
public void apply(Block block){}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getEfficiency(Building build){
|
public float efficiency(Building build){
|
||||||
return 1f;
|
return 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean valid(Building build){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,9 +46,9 @@ public class ConsumeItemFilter extends Consume{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return efficiency multiplier based on current item to be consumed; overridden in subclasses. Returns 0 if not valid in subclasses. */
|
@Override
|
||||||
public float getEfficiency(Building build){
|
public float efficiency(Building build){
|
||||||
return 1f;
|
return build.consumeTriggerValid() || getConsumed(build) != null ? 1f : 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable Item getConsumed(Building build){
|
public @Nullable Item getConsumed(Building build){
|
||||||
@@ -61,13 +61,6 @@ public class ConsumeItemFilter extends Consume{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean valid(Building build){
|
|
||||||
if(build.consumeTriggerValid()) return true;
|
|
||||||
|
|
||||||
return getConsumed(build) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void display(Stats stats){
|
public void display(Stats stats){
|
||||||
stats.add(booster ? Stat.booster : Stat.input, stats.timePeriod < 0 ? StatValues.items(filter) : StatValues.items(stats.timePeriod, filter));
|
stats.add(booster ? Stat.booster : Stat.input, stats.timePeriod < 0 ? StatValues.items(filter) : StatValues.items(stats.timePeriod, filter));
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class ConsumeItemFlammable extends ConsumeItemFilter{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getEfficiency(Building build){
|
public float efficiency(Building build){
|
||||||
var item = getConsumed(build);
|
var item = getConsumed(build);
|
||||||
return item == null ? 0f : item.flammability;
|
return item == null ? 0f : item.flammability;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class ConsumeItemRadioactive extends ConsumeItemFilter{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getEfficiency(Building build){
|
public float efficiency(Building build){
|
||||||
var item = getConsumed(build);
|
var item = getConsumed(build);
|
||||||
return item == null ? 0f : item.radioactivity;
|
return item == null ? 0f : item.radioactivity;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ public class ConsumeItems extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
return build.consumeTriggerValid() || build.items.has(items);
|
return build.consumeTriggerValid() || build.items.has(items) ? 1f : 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -30,17 +30,18 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Building build, Table table){
|
public void build(Building build, Table table){
|
||||||
table.add(new ReqImage(liquid.uiIcon, () -> valid(build))).size(iconMed).top().left();
|
table.add(new ReqImage(liquid.uiIcon, () -> build.liquids.get(liquid) > 0)).size(iconMed).top().left();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Building build){
|
public void update(Building build){
|
||||||
build.liquids.remove(liquid, Math.min(use(build), build.liquids.get(liquid)));
|
build.liquids.remove(liquid, amount * build.edelta());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
return build.liquids != null && build.liquids.get(liquid) >= amount * build.delta();
|
//there can be more liquid than necessary, so cap at 1
|
||||||
|
return Math.min(build.liquids.get(liquid) / (amount * build.edelta()), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package mindustry.world.consumers;
|
package mindustry.world.consumers;
|
||||||
|
|
||||||
import mindustry.gen.*;
|
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
|
||||||
public abstract class ConsumeLiquidBase extends Consume{
|
public abstract class ConsumeLiquidBase extends Consume{
|
||||||
@@ -17,8 +16,4 @@ public abstract class ConsumeLiquidBase extends Consume{
|
|||||||
public void apply(Block block){
|
public void apply(Block block){
|
||||||
block.hasLiquids = true;
|
block.hasLiquids = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected float use(Building entity){
|
|
||||||
return Math.min(amount * entity.edelta(), entity.block.liquidCapacity);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
|||||||
Seq<Liquid> list = content.liquids().select(l -> !l.isHidden() && filter.get(l));
|
Seq<Liquid> list = content.liquids().select(l -> !l.isHidden() && filter.get(l));
|
||||||
MultiReqImage image = new MultiReqImage();
|
MultiReqImage image = new MultiReqImage();
|
||||||
list.each(liquid -> image.add(new ReqImage(liquid.uiIcon, () ->
|
list.each(liquid -> image.add(new ReqImage(liquid.uiIcon, () ->
|
||||||
build.liquids != null && build.liquids.get(liquid) >= Math.max(use(build), amount * build.delta()))));
|
build.liquids != null && build.liquids.get(liquid) > 0)));
|
||||||
|
|
||||||
table.add(image).size(8 * 4);
|
table.add(image).size(8 * 4);
|
||||||
}
|
}
|
||||||
@@ -43,23 +43,17 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
|||||||
@Override
|
@Override
|
||||||
public void update(Building build){
|
public void update(Building build){
|
||||||
Liquid liq = getConsumed(build);
|
Liquid liq = getConsumed(build);
|
||||||
build.liquids.remove(liq, use(build));
|
build.liquids.remove(liq, amount * build.edelta());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
var liq = getConsumed(build);
|
var liq = getConsumed(build);
|
||||||
return liq != null && build.liquids.get(liq) >= use(build);
|
return liq != null ? Math.min(build.liquids.get(liq) / (amount * build.edelta()), 1f) : 0f;
|
||||||
}
|
|
||||||
|
|
||||||
/** @return efficiency multiplier based on current item to be consumed; overridden in subclasses. Returns 0 if not valid in subclasses. */
|
|
||||||
public float getEfficiency(Building build){
|
|
||||||
return 1f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable Liquid getConsumed(Building build){
|
public @Nullable Liquid getConsumed(Building build){
|
||||||
float u = use(build);
|
if(filter.get(build.liquids.current()) && build.liquids.currentAmount() > 0){
|
||||||
if(filter.get(build.liquids.current()) && build.liquids.currentAmount() >= u){
|
|
||||||
return build.liquids.current();
|
return build.liquids.current();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +61,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
|
|||||||
|
|
||||||
for(int i = 0; i < liqs.size; i++){
|
for(int i = 0; i < liqs.size; i++){
|
||||||
var liq = liqs.get(i);
|
var liq = liqs.get(i);
|
||||||
if(filter.get(liq) && build.liquids.get(liq) >= u){
|
if(filter.get(liq) && build.liquids.get(liq) > 0){
|
||||||
return liq;
|
return liq;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getEfficiency(Building build){
|
public float efficiency(Building build){
|
||||||
var item = getConsumed(build);
|
var item = getConsumed(build);
|
||||||
return item == null ? 0f : item.flammability;
|
return item == null ? 0f : item.flammability * super.efficiency(build);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,13 +49,13 @@ public class ConsumeLiquids extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
|
//TODO delta or edelta
|
||||||
|
float min = 1f, delta = build.edelta();
|
||||||
for(var stack : liquids){
|
for(var stack : liquids){
|
||||||
if(build.liquids.get(stack.liquid) < stack.amount * build.delta()){
|
min = Math.min(build.liquids.get(stack.liquid) / (stack.amount * delta), min);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ public class ConsumePayloadDynamic extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
return build.getPayloads().contains(payloads.get(build));
|
return build.getPayloads().contains(payloads.get(build)) ? 1f : 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ public class ConsumePayloadFilter extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
var payloads = build.getPayloads();
|
var payloads = build.getPayloads();
|
||||||
for(var block : fitting){
|
for(var block : fitting){
|
||||||
if(payloads.contains(block, 1)){
|
if(payloads.contains(block, 1)){
|
||||||
return true;
|
return 1f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ public class ConsumePayloads extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public float efficiency(Building build){
|
||||||
return build.getPayloads().contains(payloads);
|
return build.getPayloads().contains(payloads) ? 1f : 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package mindustry.world.consumers;
|
package mindustry.world.consumers;
|
||||||
|
|
||||||
import arc.math.*;
|
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
@@ -31,12 +30,13 @@ public class ConsumePower extends Consume{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean valid(Building build){
|
public boolean ignore(){
|
||||||
if(buffered){
|
return buffered;
|
||||||
return true;
|
}
|
||||||
}else{
|
|
||||||
return build.power.status > 0f;
|
@Override
|
||||||
}
|
public float efficiency(Building build){
|
||||||
|
return build.power.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -54,18 +54,9 @@ public class ConsumePower extends Consume{
|
|||||||
* @return The amount of power which is requested per tick.
|
* @return The amount of power which is requested per tick.
|
||||||
*/
|
*/
|
||||||
public float requestedPower(Building entity){
|
public float requestedPower(Building entity){
|
||||||
if(entity == null) return 0f;
|
return buffered ?
|
||||||
|
(1f - entity.power.status) * capacity :
|
||||||
if(buffered){
|
usage * (entity.shouldConsume() ? 1f : 0f);
|
||||||
return (1f-entity.power.status)*capacity;
|
|
||||||
}else{
|
|
||||||
try{
|
|
||||||
return usage * Mathf.num(entity.shouldConsume());
|
|
||||||
}catch(Exception e){
|
|
||||||
//HACK an error will only happen with a bar that is checking its requested power, and the entity is null/a different class
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ public class ItemModule extends BlockModule{
|
|||||||
if(item > 0) amount++;
|
if(item > 0) amount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
write.s(amount); //amount of items
|
write.s(amount);
|
||||||
|
|
||||||
for(int i = 0; i < items.length; i++){
|
for(int i = 0; i < items.length; i++){
|
||||||
if(items[i] > 0){
|
if(items[i] > 0){
|
||||||
|
|||||||
@@ -120,7 +120,8 @@ public class LiquidModule extends BlockModule{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void remove(Liquid liquid, float amount){
|
public void remove(Liquid liquid, float amount){
|
||||||
add(liquid, -amount);
|
//cap to prevent negative removal
|
||||||
|
add(liquid, Math.max(-amount, -liquids[liquid.id]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void each(LiquidConsumer cons){
|
public void each(LiquidConsumer cons){
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public class ConsumeGeneratorTests extends PowerTestFixture{
|
|||||||
// Execute all tests for the case where only liquids are accepted and for the case where liquids and items are accepted (but supply only liquids)
|
// Execute all tests for the case where only liquids are accepted and for the case where liquids and items are accepted (but supply only liquids)
|
||||||
InputType[] inputTypesToBeTested = new InputType[]{
|
InputType[] inputTypesToBeTested = new InputType[]{
|
||||||
InputType.liquids,
|
InputType.liquids,
|
||||||
InputType.any
|
//InputType.any
|
||||||
};
|
};
|
||||||
|
|
||||||
ArrayList<DynamicTest> tests = new ArrayList<>();
|
ArrayList<DynamicTest> tests = new ArrayList<>();
|
||||||
@@ -100,7 +100,7 @@ public class ConsumeGeneratorTests extends PowerTestFixture{
|
|||||||
// Execute all tests for the case where only items are accepted and for the case where liquids and items are accepted (but supply only items)
|
// Execute all tests for the case where only items are accepted and for the case where liquids and items are accepted (but supply only items)
|
||||||
InputType[] inputTypesToBeTested = new InputType[]{
|
InputType[] inputTypesToBeTested = new InputType[]{
|
||||||
InputType.items,
|
InputType.items,
|
||||||
InputType.any
|
//InputType.any
|
||||||
};
|
};
|
||||||
|
|
||||||
ArrayList<DynamicTest> tests = new ArrayList<>();
|
ArrayList<DynamicTest> tests = new ArrayList<>();
|
||||||
@@ -145,7 +145,7 @@ public class ConsumeGeneratorTests extends PowerTestFixture{
|
|||||||
/** Makes sure the efficiency stays equal during the item duration. */
|
/** Makes sure the efficiency stays equal during the item duration. */
|
||||||
@Test
|
@Test
|
||||||
void efficiencyRemainsConstantWithinItemDuration_ItemsAndLiquids(){
|
void efficiencyRemainsConstantWithinItemDuration_ItemsAndLiquids(){
|
||||||
testItemDuration(InputType.any);
|
//testItemDuration(InputType.any);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testItemDuration(InputType inputType){
|
void testItemDuration(InputType inputType){
|
||||||
@@ -168,7 +168,6 @@ public class ConsumeGeneratorTests extends PowerTestFixture{
|
|||||||
|
|
||||||
enum InputType{
|
enum InputType{
|
||||||
items,
|
items,
|
||||||
liquids,
|
liquids
|
||||||
any
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user