DEATH AND DESTRUCTION

This commit is contained in:
Anuken
2022-02-15 16:46:32 -05:00
parent 3babe7686b
commit c324f2124b
135 changed files with 704 additions and 2080 deletions

View File

@@ -1,8 +1,8 @@
package mindustry.world.consumers;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.gen.*;
import mindustry.world.*;
import mindustry.world.meta.*;
/** An abstract class that defines a type of resource that a block can consume. */
@@ -11,21 +11,15 @@ public abstract class Consume{
public boolean optional;
/** If true, this consumer will be displayed as a boost input. */
public boolean booster;
//TODO bad.
@Deprecated
public boolean update = true;
/**
* Apply a filter to items accepted.
* This should set all item IDs that are present in the filter to true.
* Apply extra filters to a block.
*/
public void applyItemFilter(Bits filter){
}
/**
* Apply a filter to liquids accepted.
* This should set all liquid IDs that are present in the filter to true.
*/
public void applyLiquidFilter(Bits filter){
public void apply(Block block){
}
@@ -39,25 +33,12 @@ public abstract class Consume{
return optional(true, true);
}
@Deprecated
public Consume update(boolean update){
this.update = update;
return this;
}
public boolean isOptional(){
return optional;
}
public boolean isBoost(){
return booster;
}
public boolean isUpdate(){
return update;
}
public abstract ConsumeType type();
public void build(Building build, Table table){}
/** Called when a consumption is triggered manually. */

View File

@@ -5,6 +5,7 @@ import arc.scene.ui.layout.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
public class ConsumeItemDynamic extends Consume{
public final Func<Building, ItemStack[]> items;
@@ -15,8 +16,9 @@ public class ConsumeItemDynamic extends Consume{
}
@Override
public ConsumeType type(){
return ConsumeType.item;
public void apply(Block block){
block.hasItems = true;
block.acceptsItems = true;
}
@Override

View File

@@ -2,10 +2,10 @@ package mindustry.world.consumers;
import arc.func.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -18,13 +18,10 @@ public class ConsumeItemFilter extends Consume{
}
@Override
public void applyItemFilter(Bits arr){
content.items().each(filter, item -> arr.set(item.id));
}
@Override
public ConsumeType type(){
return ConsumeType.item;
public void apply(Block block){
block.hasItems = true;
block.acceptsItems = true;
content.items().each(filter, item -> block.itemFilter[item.id] = true);
}
@Override

View File

@@ -1,10 +1,10 @@
package mindustry.world.consumers;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*;
public class ConsumeItems extends Consume{
@@ -20,17 +20,14 @@ public class ConsumeItems extends Consume{
}
@Override
public void applyItemFilter(Bits filter){
public void apply(Block block){
block.hasItems = true;
block.acceptsItems = true;
for(var stack : items){
filter.set(stack.item.id);
block.itemFilter[stack.item.id] = true;
}
}
@Override
public ConsumeType type(){
return ConsumeType.item;
}
@Override
public void build(Building build, Table table){
table.table(c -> {

View File

@@ -1,10 +1,10 @@
package mindustry.world.consumers;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -23,8 +23,9 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
}
@Override
public void applyLiquidFilter(Bits filter){
filter.set(liquid.id);
public void apply(Block block){
super.apply(block);
block.liquidFilter[liquid.id] = true;
}
@Override

View File

@@ -1,6 +1,7 @@
package mindustry.world.consumers;
import mindustry.gen.*;
import mindustry.world.*;
public abstract class ConsumeLiquidBase extends Consume{
/** amount used per frame */
@@ -13,8 +14,8 @@ public abstract class ConsumeLiquidBase extends Consume{
public ConsumeLiquidBase(){}
@Override
public ConsumeType type(){
return ConsumeType.liquid;
public void apply(Block block){
block.hasLiquids = true;
}
protected float use(Building entity){

View File

@@ -6,6 +6,7 @@ import arc.struct.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -23,8 +24,9 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
}
@Override
public void applyLiquidFilter(Bits arr){
content.liquids().each(filter, item -> arr.set(item.id));
public void apply(Block block){
block.hasLiquids = true;
content.liquids().each(filter, item -> block.liquidFilter[item.id] = true);
}
@Override

View File

@@ -1,11 +1,11 @@
package mindustry.world.consumers;
import arc.scene.ui.layout.*;
import arc.struct.*;
import mindustry.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.meta.*;
//TODO test!
@@ -22,17 +22,13 @@ public class ConsumeLiquids extends Consume{
}
@Override
public void applyLiquidFilter(Bits filter){
public void apply(Block block){
block.hasLiquids = true;
for(var stack : liquids){
filter.set(stack.liquid.id);
block.itemFilter[stack.liquid.id] = true;
}
}
@Override
public ConsumeType type(){
return ConsumeType.liquid;
}
@Override
public void build(Building build, Table table){
table.table(c -> {

View File

@@ -60,9 +60,4 @@ public class ConsumePayloadDynamic extends Consume{
}
}).left();
}
@Override
public ConsumeType type(){
return ConsumeType.payload;
}
}

View File

@@ -61,9 +61,4 @@ public class ConsumePayloadFilter extends Consume{
table.add(image).size(8 * 4);
}
@Override
public ConsumeType type(){
return ConsumeType.payload;
}
}

View File

@@ -49,9 +49,4 @@ public class ConsumePayloads extends Consume{
}
}).left();
}
@Override
public ConsumeType type(){
return ConsumeType.payload;
}
}

View File

@@ -1,8 +1,8 @@
package mindustry.world.consumers;
import arc.math.*;
import arc.scene.ui.layout.*;
import mindustry.gen.*;
import mindustry.world.*;
import mindustry.world.meta.*;
/** Consumer class for blocks which consume power while being connected to a power graph. */
@@ -25,8 +25,9 @@ public class ConsumePower extends Consume{
}
@Override
public ConsumeType type(){
return ConsumeType.power;
public void apply(Block block){
block.hasPower = true;
block.consPower = this;
}
@Override

View File

@@ -0,0 +1,19 @@
package mindustry.world.consumers;
import arc.func.*;
import mindustry.gen.*;
/** A power consumer that only activates sometimes. */
public class ConsumePowerCondition extends ConsumePower{
private final Boolf<Building> consume;
public ConsumePowerCondition(float usage, Boolf<Building> consume){
super(usage, 0, false);
this.consume = consume;
}
@Override
public float requestedPower(Building entity){
return consume.get(entity) ? usage : 0f;
}
}

View File

@@ -0,0 +1,19 @@
package mindustry.world.consumers;
import arc.func.*;
import mindustry.gen.*;
/** A power consumer that uses a dynamic amount of power. */
public class ConsumePowerDynamic extends ConsumePower{
private final Floatf<Building> usage;
public ConsumePowerDynamic(Floatf<Building> usage){
super(0, 0, false);
this.usage = usage;
}
@Override
public float requestedPower(Building entity){
return usage.get(entity);
}
}

View File

@@ -1,10 +0,0 @@
package mindustry.world.consumers;
public enum ConsumeType{
item,
power,
liquid,
payload;
public static final ConsumeType[] all = values();
}

View File

@@ -1,141 +0,0 @@
package mindustry.world.consumers;
import arc.func.*;
import arc.struct.*;
import arc.util.*;
import mindustry.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.blocks.power.*;
import mindustry.world.meta.*;
public class Consumers{
private Consume[] map = new Consume[ConsumeType.all.length];
public Consume[] all = {}, optionals = {};
public final Bits itemFilters = new Bits(Vars.content.items().size);
public final Bits liquidfilters = new Bits(Vars.content.liquids().size);
public boolean consumesItem(Item item){
return itemFilters.get(item.id);
}
public boolean consumesLiquid(Liquid liq){
return liquidfilters.get(liq.id);
}
public boolean any(){
return all.length > 0;
}
public void each(Cons<Consume> c){
for(var cons : map){
if(cons != null){
c.get(cons);
}
}
}
public void init(){
all = Structs.filter(Consume.class, map, m -> m != null);
optionals = Structs.filter(Consume.class, map, m -> m != null && m.isOptional());
for(Consume cons : all){
cons.applyItemFilter(itemFilters);
cons.applyLiquidFilter(liquidfilters);
}
}
public ConsumePower getPower(){
return get(ConsumeType.power);
}
public ConsumeItems getItem(){
return get(ConsumeType.item);
}
public boolean hasPower(){
return has(ConsumeType.power);
}
public ConsumeLiquid liquid(Liquid liquid, float amount){
return add(new ConsumeLiquid(liquid, amount));
}
public ConsumeLiquids liquids(LiquidStack... stacks){
return add(new ConsumeLiquids(stacks));
}
/**
* Creates a consumer which directly uses power without buffering it.
* @param powerPerTick The amount of power which is required each tick for 100% efficiency.
* @return the created consumer object.
*/
public ConsumePower power(float powerPerTick){
return add(new ConsumePower(powerPerTick, 0.0f, false));
}
/** Creates a consumer which only consumes power when the condition is met. */
public <T extends Building> ConsumePower powerCond(float usage, Boolf<T> cons){
return add(new ConditionalConsumePower(usage, (Boolf<Building>)cons));
}
/** Creates a consumer that consumes a dynamic amount of power. */
public <T extends Building> ConsumePower powerDynamic(Floatf<T> usage){
return add(new DynamicConsumePower((Floatf<Building>)usage));
}
/**
* Creates a consumer which stores power.
* @param powerCapacity The maximum capacity in power units.
*/
public ConsumePower powerBuffered(float powerCapacity){
return add(new ConsumePower(0f, powerCapacity, true));
}
public ConsumeItems item(Item item){
return item(item, 1);
}
public ConsumeItems item(Item item, int amount){
return add(new ConsumeItems(new ItemStack[]{new ItemStack(item, amount)}));
}
public ConsumeItems items(ItemStack... items){
return add(new ConsumeItems(items));
}
public <T extends Consume> T add(T consume){
map[consume.type().ordinal()] = consume;
return consume;
}
public void remove(ConsumeType type){
map[type.ordinal()] = null;
}
public boolean has(ConsumeType type){
return map[type.ordinal()] != null;
}
@SuppressWarnings("unchecked")
public <T extends Consume> T get(ConsumeType type){
if(map[type.ordinal()] == null){
throw new IllegalArgumentException("Block does not contain consumer of type '" + type + "'!");
}
return (T)map[type.ordinal()];
}
public @Nullable <T extends Consume>T getOrNull(ConsumeType type){
return (T)map[type.ordinal()];
}
public void display(Stats stats){
for(Consume c : map){
if(c != null){
c.display(stats);
}
}
}
}