The on-going consumer disaster

This commit is contained in:
Anuken
2022-02-20 23:00:25 -05:00
parent 8b916d03af
commit 19828410a9
68 changed files with 371 additions and 451 deletions

View File

@@ -7,11 +7,14 @@ import mindustry.world.meta.*;
/** An abstract class that defines a type of resource that a block can consume. */
public abstract class Consume{
//TODO maybe remove these and make it an interface if possible?
/** If true, this consumer will not influence consumer validity. */
public boolean optional;
/** If true, this consumer will be displayed as a boost input. */
public boolean booster;
//TODO bad. I don't like it.
@Deprecated
public boolean update = true;
/**
@@ -31,6 +34,7 @@ public abstract class Consume{
return optional(true, true);
}
@Deprecated
public Consume update(boolean update){
this.update = update;
return this;

View File

@@ -0,0 +1,21 @@
package mindustry.world.consumers;
import mindustry.gen.*;
/** For mods. I don't use this (yet). */
public class ConsumeItemCharged extends ConsumeItemFilter{
public ConsumeItemCharged(float minCharge){
super(item -> item.charge >= minCharge);
}
public ConsumeItemCharged(){
this(0.2f);
}
@Override
public float getEfficiency(Building build){
var item = getConsumed(build);
return item == null ? 0f : item.charge;
}
}

View File

@@ -0,0 +1,64 @@
package mindustry.world.consumers;
import arc.math.*;
import arc.scene.ui.layout.*;
import mindustry.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.gen.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
/** Causes a block to explode when explosive items are moved into it. */
public class ConsumeItemExplode extends ConsumeItemFilter{
public float damage = 4f;
public float threshold, baseChance = 0.06f;
public Effect explodeEffect = Fx.generatespark;
public ConsumeItemExplode(float threshold){
super(item -> item.explosiveness >= threshold);
this.threshold = threshold;
}
public ConsumeItemExplode(){
this(0.5f);
}
@Override
public void update(Building build){
var item = getConsumed(build);
if(item != null){
if(Vars.state.rules.reactorExplosions && Mathf.chance(build.delta() * baseChance * Mathf.clamp(item.explosiveness - threshold))){
build.damage(damage);
explodeEffect.at(build.x + Mathf.range(build.block.size * tilesize / 2f), build.y + Mathf.range(build.block.size * tilesize / 2f));
}
}
}
//as this consumer doesn't actually consume anything, all methods below are empty
@Override
public void build(Building build, Table table){}
@Override
public void trigger(Building build){}
@Override
public void display(Stats stats){}
@Override
public void apply(Block block){}
@Override
public float getEfficiency(Building build){
return 1f;
}
@Override
public boolean valid(Building build){
return true;
}
}

View File

@@ -46,6 +46,11 @@ 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. */
public float getEfficiency(Building build){
return 1f;
}
public @Nullable Item getConsumed(Building build){
for(int i = 0; i < content.items().size; i++){
Item item = content.item(i);

View File

@@ -0,0 +1,20 @@
package mindustry.world.consumers;
import mindustry.gen.*;
public class ConsumeItemFlammable extends ConsumeItemFilter{
public ConsumeItemFlammable(float minFlammability){
super(item -> item.flammability >= minFlammability);
}
public ConsumeItemFlammable(){
this(0.2f);
}
@Override
public float getEfficiency(Building build){
var item = getConsumed(build);
return item == null ? 0f : item.flammability;
}
}

View File

@@ -0,0 +1,20 @@
package mindustry.world.consumers;
import mindustry.gen.*;
public class ConsumeItemRadioactive extends ConsumeItemFilter{
public ConsumeItemRadioactive(float minRadioactivity){
super(item -> item.radioactivity >= minRadioactivity);
}
public ConsumeItemRadioactive(){
this(0.2f);
}
@Override
public float getEfficiency(Building build){
var item = getConsumed(build);
return item == null ? 0f : item.radioactivity;
}
}

View File

@@ -51,6 +51,11 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
var liq = getConsumed(build);
return liq != null && build.liquids.get(liq) >= use(build);
}
/** @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){
float u = use(build);

View File

@@ -0,0 +1,20 @@
package mindustry.world.consumers;
import mindustry.gen.*;
public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{
public ConsumeLiquidFlammable(float minFlammability, float amount){
super(item -> item.flammability >= minFlammability, amount);
}
public ConsumeLiquidFlammable(float amount){
this(0.2f, amount);
}
@Override
public float getEfficiency(Building build){
var item = getConsumed(build);
return item == null ? 0f : item.flammability;
}
}