Optimizations / Very broken changes

This commit is contained in:
Anuken
2019-03-31 13:11:12 -04:00
parent 160ae4e244
commit 6392330e70
40 changed files with 179 additions and 304 deletions

View File

@ -287,11 +287,11 @@ public class UI implements ApplicationListener{
public String formatAmount(int number){
if(number >= 1000000){
return Strings.toFixed(number / 1000000f, 1) + "[gray]mil[]";
return Strings.fixed(number / 1000000f, 1) + "[gray]mil[]";
}else if(number >= 10000){
return number / 1000 + "[gray]k[]";
}else if(number >= 1000){
return Strings.toFixed(number / 1000f, 1) + "[gray]k[]";
return Strings.fixed(number / 1000f, 1) + "[gray]k[]";
}else{
return number + "";
}

View File

@ -184,7 +184,7 @@ public class WaveInfoDialog extends FloatingDialog{
}).width(80f);
a.add(" + ");
a.addField(Strings.toFixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f/group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> {
a.addField(Strings.fixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f/group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> {
if(Strings.canParsePositiveFloat(text)){
group.unitScaling = 1f / Strings.parseFloat(text);
updateWaves();

View File

@ -5,17 +5,17 @@ import io.anuke.annotations.Annotations.Remote;
import io.anuke.arc.Events;
import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.ObjectSet;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.impl.BaseEntity;
import io.anuke.mindustry.entities.traits.HealthTrait;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Interval;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.EntityGroup;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.impl.BaseEntity;
import io.anuke.mindustry.entities.traits.HealthTrait;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.game.EventType.BlockDestroyEvent;
import io.anuke.mindustry.game.Team;
@ -24,7 +24,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Edges;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.defense.Wall;
import io.anuke.mindustry.world.consumers.Consume;
import io.anuke.mindustry.world.modules.ConsumeModule;
import io.anuke.mindustry.world.modules.ItemModule;
import io.anuke.mindustry.world.modules.LiquidModule;
@ -164,10 +163,6 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
return tile;
}
public boolean consumed(Class<? extends Consume> type){
return tile.block().consumes.get(type).valid(tile.block(), this);
}
public void removeFromProximity(){
tile.block().onProximityRemoved(tile);

View File

@ -60,7 +60,9 @@ public class ContentDisplay{
Array<StatValue> arr = map.get(stat);
for(StatValue value : arr){
value.display(inset);
inset.add().size(10f);
}
//map.get(stat).display(inset);
}).fillX().padLeft(10);
table.row();
@ -201,7 +203,7 @@ public class ContentDisplay{
table.add(Core.bundle.format("unit.health", unit.health));
table.row();
table.add(Core.bundle.format("unit.speed", Strings.toFixed(unit.speed, 1)));
table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1)));
table.row();
table.row();
}

View File

@ -12,7 +12,7 @@ public class ItemDisplay extends Table{
}
public ItemDisplay(Item item, int amount){
add(new ItemImage(new ItemStack(item, amount))).size(8*3);
add(new ItemImage(new ItemStack(item, amount))).size(8*4);
add(item.localizedName()).padLeft(4);
}
}

View File

@ -27,7 +27,7 @@ public class ItemImage extends Stack{
}
public ItemImage(ItemStack stack){
add(new Image(stack.item.icon(Icon.medium)));
add(new Image(stack.item.icon(Icon.large)));
if(stack.amount != 0){
Table t = new Table().left().bottom();

View File

@ -10,7 +10,7 @@ import io.anuke.mindustry.type.Liquid;
public class LiquidDisplay extends Table{
public LiquidDisplay(Liquid liquid){
add(new Image(liquid.getContentIcon())).size(8*3);
add(new Image(liquid.getContentIcon())).size(8*4);
add(liquid.localizedName()).padLeft(3);
}
@ -20,7 +20,7 @@ public class LiquidDisplay extends Table{
if(amount != 0){
Table t = new Table().left().bottom();
t.add(Strings.toFixed(amount, 2));
t.add(Strings.autoFixed(amount));
add(t);
}
}}).size(8*4);

View File

@ -187,9 +187,9 @@ public class BlockInventoryFragment extends Fragment{
private String round(float f){
f = (int) f;
if(f >= 1000000){
return Strings.toFixed(f / 1000000f, 1) + "[gray]mil[]";
return Strings.fixed(f / 1000000f, 1) + "[gray]mil[]";
}else if(f >= 1000){
return Strings.toFixed(f / 1000, 1) + "k";
return Strings.fixed(f / 1000, 1) + "k";
}else{
return (int) f + "";
}

View File

@ -395,7 +395,7 @@ public class Block extends BlockStorage{
stats.add(BlockStat.size, "{0}x{0}", size);
stats.add(BlockStat.health, health, StatUnit.none);
consumes.forEach(cons -> cons.display(stats));
consumes.display(stats);
// Note: Power stats are added by the consumers.
if(hasLiquids) stats.add(BlockStat.liquidCapacity, liquidCapacity, StatUnit.liquidUnits);

View File

@ -12,11 +12,7 @@ import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.type.Unit;
import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.consumers.ConsumeItem;
import io.anuke.mindustry.world.consumers.ConsumeItems;
import io.anuke.mindustry.world.consumers.ConsumeLiquid;
import io.anuke.mindustry.world.consumers.Consumers;
import io.anuke.mindustry.world.meta.BlockBars;
import io.anuke.mindustry.world.meta.BlockStats;
@ -27,7 +23,6 @@ public abstract class BlockStorage extends UnlockableContent{
public boolean hasPower;
public boolean outputsLiquid = false;
public boolean singleLiquid = true;
public boolean consumesPower = true;
public boolean outputsPower = false;
@ -97,21 +92,11 @@ public abstract class BlockStorage extends UnlockableContent{
}
public boolean acceptItem(Item item, Tile tile, Tile source){
if(tile.entity != null && consumes.has(ConsumeItems.class)){
for(ItemStack stack : consumes.items()){
if(stack.item == item){
return tile.entity.items.get(item) < getMaximumAccepted(tile, item);
}
}
}
return tile.entity != null && consumes.has(ConsumeItem.class) && consumes.item() == item &&
tile.entity.items.get(item) < getMaximumAccepted(tile, item);
return consumes.itemFilters[item.id] && tile.entity.items.get(item) < getMaximumAccepted(tile, item);
}
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){
return hasLiquids && tile.entity.liquids.get(liquid) + amount < liquidCapacity &&
(!singleLiquid || (tile.entity.liquids.current() == liquid || tile.entity.liquids.get(tile.entity.liquids.current()) < 0.2f)) &&
(!consumes.has(ConsumeLiquid.class) || consumes.liquid() == liquid);
return hasLiquids && tile.entity.liquids.get(liquid) + amount < liquidCapacity && consumes.liquidfilters[liquid.id];
}
public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){

View File

@ -21,7 +21,6 @@ public class LaserTurret extends PowerTurret{
super(name);
canOverdrive = false;
consumes.remove(ConsumeLiquidFilter.class);
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.01f)).update(false);
}

View File

@ -3,7 +3,6 @@ package io.anuke.mindustry.world.blocks.power;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumeItem;
import io.anuke.mindustry.world.consumers.ConsumeLiquid;
public class DifferentialGenerator extends TurbineGenerator{

View File

@ -52,7 +52,7 @@ public class ImpactReactor extends PowerGenerator{
bars.add("poweroutput", entity -> new Bar(() ->
Core.bundle.format("blocks.poweroutput",
Strings.toFixed(Math.max(entity.tile.block().getPowerProduction(entity.tile) - consumes.get(ConsumePower.class).powerPerTick, 0)*60 * entity.delta(), 1)),
Strings.fixed(Math.max(entity.tile.block().getPowerProduction(entity.tile) - consumes.get(ConsumePower.class).powerPerTick, 0)*60 * entity.delta(), 1)),
() -> Pal.powerBar,
() -> ((GeneratorEntity)entity).productionEfficiency));
}

View File

@ -40,7 +40,7 @@ public class PowerGenerator extends PowerDistributor{
if(hasPower && outputsPower && !consumes.has(ConsumePower.class)){
bars.add("power", entity -> new Bar(() ->
Core.bundle.format("blocks.poweroutput",
Strings.toFixed(entity.tile.block().getPowerProduction(entity.tile)*60 * entity.timeScale, 1)),
Strings.fixed(entity.tile.block().getPowerProduction(entity.tile)*60 * entity.timeScale, 1)),
() -> Pal.powerBar,
() -> ((GeneratorEntity)entity).productionEfficiency));
}

View File

@ -93,7 +93,7 @@ public class PowerNode extends PowerBlock{
super.setBars();
bars.add("power", entity -> new Bar(() ->
Core.bundle.format("blocks.powerbalance",
((entity.power.graph.getPowerBalance() >= 0 ? "+" : "") + Strings.toFixed(entity.power.graph.getPowerBalance()*60, 1))),
((entity.power.graph.getPowerBalance() >= 0 ? "+" : "") + Strings.fixed(entity.power.graph.getPowerBalance()*60, 1))),
() -> Pal.powerBar,
() -> Mathf.clamp(entity.power.graph.getPowerProduced() / entity.power.graph.getPowerNeeded())));
}

View File

@ -28,7 +28,7 @@ public class ThermalGenerator extends PowerGenerator{
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
drawPlaceText(Core.bundle.formatDouble("blocks.efficiency", sumAttribute(Attribute.heat, x, y)*100, 1), x, y, valid);
drawPlaceText(Core.bundle.formatFloat("blocks.efficiency", sumAttribute(Attribute.heat, x, y)*100, 1), x, y, valid);
}
@Override

View File

@ -53,7 +53,7 @@ public class Cultivator extends GenericCrafter{
public void setBars(){
super.setBars();
bars.add("multiplier", entity -> new Bar(() ->
Core.bundle.formatDouble("blocks.efficiency",
Core.bundle.formatFloat("blocks.efficiency",
((((CultivatorEntity)entity).boost + 1f) * ((CultivatorEntity)entity).warmup)*100f,1),
() -> Pal.ammo,
() -> ((CultivatorEntity)entity).warmup));
@ -61,7 +61,7 @@ public class Cultivator extends GenericCrafter{
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
drawPlaceText(Core.bundle.formatDouble("blocks.efficiency", (1+sumAttribute(Attribute.spores, x, y))*100, 1), x, y, valid);
drawPlaceText(Core.bundle.formatFloat("blocks.efficiency", (1+sumAttribute(Attribute.spores, x, y))*100, 1), x, y, valid);
}
@Override

View File

@ -85,7 +85,7 @@ public class Drill extends Block{
bars.add("drillspeed", e -> {
DrillEntity entity = (DrillEntity)e;
return new Bar(() -> Core.bundle.format("blocks.outputspeed", Strings.toFixed(entity.lastDrillSpeed * 60 * entity.timeScale, 2)), () -> Pal.ammo, () -> entity.warmup);
return new Bar(() -> Core.bundle.format("blocks.outputspeed", Strings.fixed(entity.lastDrillSpeed * 60 * entity.timeScale, 2)), () -> Pal.ammo, () -> entity.warmup);
});
}

View File

@ -5,7 +5,6 @@ import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumeItem;
import io.anuke.arc.graphics.g2d.Draw;
public class Fracker extends SolidPump{

View File

@ -14,6 +14,7 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.LiquidStack;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumeType;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.StatUnit;
@ -47,6 +48,11 @@ public class GenericCrafter extends Block{
super.setStats();
stats.add(BlockStat.productionTime, craftTime / 60f, StatUnit.seconds);
if(consumes.has(ConsumeType.liquid)){
//TODO replace with per second instead of
//stats.remove();
}
if(outputItem != null){
stats.add(BlockStat.output, outputItem);
}

View File

@ -10,7 +10,6 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity;
import io.anuke.mindustry.world.consumers.ConsumeItem;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.values.ItemFilterValue;
@ -99,9 +98,7 @@ public class Separator extends Block{
count += stack.amount;
}
if(consumes.has(ConsumeItem.class)){
entity.items.remove(consumes.item(), consumes.itemAmount());
}
entity.cons.trigger();
if(item != null && entity.items.get(item) < itemCapacity){
offloadNear(tile, item);

View File

@ -42,7 +42,7 @@ public class SolidPump extends Pump{
@Override
public void drawPlace(int x, int y, int rotation, boolean valid){
if(attribute != null){
drawPlaceText(Core.bundle.formatDouble("blocks.efficiency", (sumAttribute(attribute, x, y) + 1f)*100, 1), x, y, valid);
drawPlaceText(Core.bundle.formatFloat("blocks.efficiency", (sumAttribute(attribute, x, y) + 1f)*100, 1), x, y, valid);
}
}
@ -50,7 +50,7 @@ public class SolidPump extends Pump{
public void setBars(){
super.setBars();
bars.add("efficiency", entity -> new Bar(() ->
Core.bundle.formatDouble("blocks.efficiency",
Core.bundle.formatFloat("blocks.efficiency",
((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100, 1),
() -> Pal.ammo,
() -> ((SolidPumpEntity)entity).warmup));

View File

@ -162,7 +162,7 @@ public class UnitFactory extends Block{
if(!tile.isEnemyCheat()){
//player-made spawners have default behavior
if(hasRequirements(entity.items, entity.buildTime / produceTime) && entity.cons.valid()){
if(entity.cons.valid()){
entity.time += entity.delta() * entity.speedScl;
entity.buildTime += entity.delta() * entity.power.satisfaction;
entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f);
@ -186,9 +186,7 @@ public class UnitFactory extends Block{
Call.onUnitFactorySpawn(tile, entity.spawned + 1);
useContent(tile, type);
for(ItemStack stack : consumes.items()){
entity.items.remove(stack.item, stack.amount);
}
entity.cons.trigger();
}
}
@ -223,15 +221,6 @@ public class UnitFactory extends Block{
return entity.spawned < maxSpawn;
}
protected boolean hasRequirements(ItemModule inv, float fraction){
for(ItemStack stack : consumes.items()){
if(!inv.has(stack.item, (int) (fraction * stack.amount))){
return false;
}
}
return true;
}
public static class UnitFactoryEntity extends TileEntity{
public float buildTime;
public float time;

View File

@ -11,6 +11,18 @@ public abstract class Consume{
protected boolean optional;
protected boolean update = true, boost = false;
/**Apply a filter to items accepted.
* This should set all item IDs that are present in the filter to true.*/
public void applyItemFilter(boolean[] filter){
}
/**Apply a filter to liquids accepted.
* This should set all liquid IDs that are present in the filter to true.*/
public void applyLiquidFilter(boolean[] filter){
}
public Consume optional(boolean optional){
this.optional = optional;
return this;
@ -34,6 +46,8 @@ public abstract class Consume{
return update;
}
public abstract ConsumeType type();
public abstract void build(Tile tile, Table table);
/**Called when a consumption is triggered manually.*/

View File

@ -1,66 +0,0 @@
package io.anuke.mindustry.world.consumers;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Item.Icon;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.ui.ItemImage;
import io.anuke.mindustry.ui.ReqImage;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.BlockStats;
public class ConsumeItem extends Consume{
private final Item item;
private final int amount;
public ConsumeItem(Item item){
this.item = item;
this.amount = 1;
}
public ConsumeItem(Item item, int amount){
this.item = item;
this.amount = amount;
}
public int getAmount(){
return amount;
}
public Item get(){
return item;
}
@Override
public void trigger(Block block, TileEntity entity){
entity.items.remove(item, amount);
}
@Override
public void build(Tile tile, Table table){
table.add(new ReqImage(new ItemImage(item.icon(Icon.large), amount), () -> valid(tile.block(), tile.entity))).size(8*4);
}
@Override
public String getIcon(){
return "icon-item";
}
@Override
public void update(Block block, TileEntity entity){
//doesn't update because consuming items is very specific
}
@Override
public boolean valid(Block block, TileEntity entity){
return entity != null && entity.items != null && entity.items.has(item, amount);
}
@Override
public void display(BlockStats stats){
stats.add(boost ? BlockStat.booster : BlockStat.input, new ItemStack(item, amount));
}
}

View File

@ -24,6 +24,16 @@ public class ConsumeItemFilter extends Consume{
this.filter = item;
}
@Override
public void applyItemFilter(boolean[] arr){
content.items().each(filter, item -> arr[item.id] = true);
}
@Override
public ConsumeType type(){
return ConsumeType.item;
}
@Override
public void build(Tile tile, Table table){
Array<Item> list = content.items().select(filter);

View File

@ -13,7 +13,7 @@ import io.anuke.mindustry.world.meta.BlockStats;
import io.anuke.mindustry.world.meta.values.ItemListValue;
public class ConsumeItems extends Consume{
private ItemStack[] items;
private final ItemStack[] items;
public ConsumeItems(ItemStack[] items){
this.items = items;
@ -23,6 +23,18 @@ public class ConsumeItems extends Consume{
return items;
}
@Override
public void applyItemFilter(boolean[] filter){
for(ItemStack stack : items){
filter[stack.item.id] = true;
}
}
@Override
public ConsumeType type(){
return ConsumeType.item;
}
@Override
public void build(Tile tile, Table table){
for(ItemStack stack : items){

View File

@ -3,12 +3,12 @@ package io.anuke.mindustry.world.consumers;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.type.LiquidStack;
import io.anuke.mindustry.ui.ReqImage;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.BlockStats;
import io.anuke.mindustry.world.meta.StatUnit;
public class ConsumeLiquid extends Consume{
protected final float use;
@ -19,6 +19,11 @@ public class ConsumeLiquid extends Consume{
this.use = use;
}
@Override
public void applyLiquidFilter(boolean[] filter){
filter[liquid.id] = true;
}
public float used(){
return use;
}
@ -27,6 +32,11 @@ public class ConsumeLiquid extends Consume{
return liquid;
}
@Override
public ConsumeType type(){
return ConsumeType.liquid;
}
@Override
public void build(Tile tile, Table table){
table.add(new ReqImage(liquid.getContentIcon(), () -> valid(tile.block(), tile.entity))).size(8*4);
@ -49,12 +59,8 @@ public class ConsumeLiquid extends Consume{
@Override
public void display(BlockStats stats){
if(!boost){
stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond);
stats.add(BlockStat.input, liquid);
}else{
stats.add(BlockStat.booster, liquid);
}
//stats.add(BlockStat.liquidUse, use * 60f, StatUnit.liquidSecond);
stats.add(boost ? BlockStat.booster : BlockStat.input, new LiquidStack(liquid, use * 60f));
}
float use(Block block, TileEntity entity){

View File

@ -11,7 +11,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.BlockStats;
import io.anuke.mindustry.world.meta.StatUnit;
import io.anuke.mindustry.world.meta.values.LiquidFilterValue;
import static io.anuke.mindustry.Vars.content;
@ -25,6 +24,16 @@ public class ConsumeLiquidFilter extends Consume{
this.use = amount;
}
@Override
public void applyLiquidFilter(boolean[] arr){
content.liquids().each(filter, item -> arr[item.id] = true);
}
@Override
public ConsumeType type(){
return ConsumeType.liquid;
}
@Override
public void build(Tile tile, Table table){
Array<Liquid> list = content.liquids().select(l -> !l.isHidden() && filter.test(l));
@ -51,12 +60,7 @@ public class ConsumeLiquidFilter extends Consume{
@Override
public void display(BlockStats stats){
if(boost){
stats.add(BlockStat.booster, new LiquidFilterValue(filter));
}else {
stats.add(BlockStat.input, new LiquidFilterValue(filter));
stats.add(BlockStat.liquidUse, 60f * use, StatUnit.liquidSecond);
}
stats.add(boost ? BlockStat.booster : BlockStat.input, new LiquidFilterValue(filter, use * 60f));
}
float use(Block block, TileEntity entity){

View File

@ -24,6 +24,11 @@ public class ConsumePower extends Consume{
this.isBuffered = isBuffered;
}
@Override
public ConsumeType type(){
return ConsumeType.power;
}
@Override
public void build(Tile tile, Table table){
//No tooltip for power, for now

View File

@ -0,0 +1,7 @@
package io.anuke.mindustry.world.consumers;
public enum ConsumeType{
item,
power,
liquid
}

View File

@ -1,39 +1,51 @@
package io.anuke.mindustry.world.consumers;
import io.anuke.arc.collection.Array;
import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.collection.ObjectSet;
import io.anuke.arc.function.Consumer;
import io.anuke.arc.util.Log;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.meta.BlockStats;
public class Consumers{
private ObjectMap<Class<? extends Consume>, Consume> map = new ObjectMap<>();
private ObjectSet<Class<? extends Consume>> required = new ObjectSet<>();
private Array<Consume> results = new Array<>();
private Consume[] map = new Consume[ConsumeType.values().length];
private ObjectSet<ConsumeType> required = new ObjectSet<>();
private Consume[] results;
public void require(Class<? extends Consume> type){
public final boolean[] itemFilters = new boolean[Vars.content.items().size];
public final boolean[] liquidfilters = new boolean[Vars.content.liquids().size];
public void require(ConsumeType type){
required.add(type);
}
public void checkRequired(Block block){
for(Class<? extends Consume> c : required){
if(!map.containsKey(c)){
for(ConsumeType c : required){
if(!has(c)){
throw new RuntimeException("Missing required consumer of type \"" + c + "\" in block \"" + block.name + "\"!");
}
}
for(Consume cons : map.values()){
results.add(cons);
Array<Consume> array = new Array<>(Consume.class);
for(Consume cons : map){
if(cons != null){
array.add(cons);
}
}
results = array.toArray();
for(Consume cons : all()){
cons.applyItemFilter(itemFilters);
cons.applyLiquidFilter(liquidfilters);
}
}
public ConsumeLiquid liquid(Liquid liquid, float amount){
ConsumeLiquid c = new ConsumeLiquid(liquid, amount);
add(c);
return c;
return add(new ConsumeLiquid(liquid, amount));
}
/**
@ -42,9 +54,7 @@ public class Consumers{
* @return the created consumer object.
*/
public ConsumePower power(float powerPerTick){
ConsumePower c = new ConsumePower(powerPerTick, 0.0f, false);
add(c);
return c;
return add(new ConsumePower(powerPerTick, 0.0f, false));
}
/**
@ -62,83 +72,55 @@ public class Consumers{
* @param ticksToFill The number of ticks it shall take to fill the buffer.
*/
public ConsumePower powerBuffered(float powerCapacity, float ticksToFill){
ConsumePower c = new ConsumePower(powerCapacity / ticksToFill, powerCapacity, true);
add(c);
return c;
return add(new ConsumePower(powerCapacity / ticksToFill, powerCapacity, true));
}
public ConsumeItem item(Item item){
public ConsumeItems item(Item item){
return item(item, 1);
}
public ConsumeItem item(Item item, int amount){
ConsumeItem i = new ConsumeItem(item, amount);
add(i);
return i;
public ConsumeItems item(Item item, int amount){
return add(new ConsumeItems(new ItemStack[]{new ItemStack(item, amount)}));
}
public ConsumeItems items(ItemStack... items){
ConsumeItems i = new ConsumeItems(items);
add(i);
return i;
return add(new ConsumeItems(items));
}
public Item item(){
return get(ConsumeItem.class).get();
}
public <T extends Consume> T add(T consume){
if(map[consume.type().ordinal()] != null){
Log.warn("[WARN] Conflict: Replacing {0} with {1}", consume, map[consume.type().ordinal()]);
}
public ItemStack[] items(){
return get(ConsumeItems.class).getItems();
}
public int itemAmount(){
return get(ConsumeItem.class).getAmount();
}
public Liquid liquid(){
return get(ConsumeLiquid.class).get();
}
public float liquidAmount(){
return get(ConsumeLiquid.class).use;
}
public Consume add(Consume consume){
map.put((consume instanceof ConsumePower ? ConsumePower.class : consume.getClass()), consume);
map[consume.type().ordinal()] = consume;
return consume;
}
public void remove(Class<? extends Consume> type){
map.remove(type);
public void remove(ConsumeType type){
map[type.ordinal()] = null;
}
public boolean has(Class<? extends Consume> type){
return map.containsKey(type);
public boolean has(ConsumeType type){
return map[type.ordinal()] != null;
}
@SuppressWarnings("unchecked")
public <T extends Consume> T get(Class<T> type){
if(!map.containsKey(type)){
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.get(type);
return (T) map[type.ordinal()];
}
public Iterable<Consume> all(){
return map.values();
}
public Array<Consume> array(){
public Consume[] all(){
return results;
}
public boolean hasAny(){
return map.size > 0;
}
public void forEach(Consumer<Consume> cons){
for(Consume c : all()){
cons.accept(c);
public void display(BlockStats stats){
for(Consume c : map){
if(c != null){
c.display(stats);
}
}
}
}

View File

@ -26,7 +26,7 @@ public class BlockStats{
/**Adds an item value.*/
public void add(BlockStat stat, Item item){
add(stat, new ItemValue(new ItemStack(item, 1)));
add(stat, new ItemListValue(new ItemStack(item, 1)));
}
/**Adds a liquid value.*/
@ -36,7 +36,7 @@ public class BlockStats{
/**Adds an item value.*/
public void add(BlockStat stat, ItemStack item){
add(stat, new ItemValue(item));
add(stat, new ItemListValue(item));
}
/**Adds an item value.*/
@ -51,10 +51,6 @@ public class BlockStats{
/**Adds a stat value.*/
public void add(BlockStat stat, StatValue value){
//if(map.containsKey(stat.category) && map.get(stat.category).containsKey(stat)){
// throw new RuntimeException("Duplicate stat entry: \"" + stat + "\" in block.");
//}
if(!map.containsKey(stat.category)){
map.put(stat.category, new OrderedMap<>());
}

View File

@ -1,7 +0,0 @@
package io.anuke.mindustry.world.meta;
import io.anuke.mindustry.game.UnlockableContent;
public interface ContentStatValue extends StatValue{
UnlockableContent[] getValueContent();
}

View File

@ -35,14 +35,14 @@ public class AmmoListValue<T extends UnlockableContent> implements StatValue{
bt.add(Core.bundle.format("bullet.damage", type.damage));
if(type.splashDamage > 0){
sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.toFixed(type.splashDamageRadius / tilesize, 1)));
sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1)));
}
if(!Mathf.isEqual(type.ammoMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier));
if(!Mathf.isEqual(type.reloadMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.reload", Strings.toFixed(type.reloadMultiplier, 1)));
if(!Mathf.isEqual(type.reloadMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.reload", Strings.fixed(type.reloadMultiplier, 1)));
if(type.knockback > 0){
sep(bt, Core.bundle.format("bullet.knockback", Strings.toFixed(type.knockback, 1)));
sep(bt, Core.bundle.format("bullet.knockback", Strings.fixed(type.knockback, 1)));
}
if((type.status == StatusEffects.burning || type.status == StatusEffects.melting) || type.incendAmount > 0){

View File

@ -1,49 +1,21 @@
package io.anuke.mindustry.world.meta.values;
import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.type.Item;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.ui.ItemDisplay;
import io.anuke.mindustry.world.meta.ContentStatValue;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.world.meta.StatValue;
public class ItemListValue implements ContentStatValue{
private final Item[] items;
public class ItemListValue implements StatValue{
private final ItemStack[] stacks;
public ItemListValue(Item[] items){
this.items = items;
this.stacks = null;
}
public ItemListValue(ItemStack[] stacks){
public ItemListValue(ItemStack... stacks){
this.stacks = stacks;
this.items = null;
}
@Override
public UnlockableContent[] getValueContent(){
if(items != null){
return items;
}else{
Item[] res = new Item[stacks.length];
for(int i = 0; i < res.length; i++){
res[i] = stacks[i].item;
}
return res;
}
}
@Override
public void display(Table table){
if(items != null){
for(Item item : items){
table.add(new ItemDisplay(item)).padRight(5);
}
}else{
for(ItemStack stack : stacks){
table.add(new ItemDisplay(stack.item, stack.amount)).padRight(5);
}
for(ItemStack stack : stacks){
table.add(new ItemDisplay(stack.item, stack.amount)).padRight(5);
}
}
}

View File

@ -1,26 +0,0 @@
package io.anuke.mindustry.world.meta.values;
import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.ui.ItemDisplay;
import io.anuke.mindustry.world.meta.ContentStatValue;
import io.anuke.arc.scene.ui.layout.Table;
public class ItemValue implements ContentStatValue{
private final ItemStack item;
public ItemValue(ItemStack item){
this.item = item;
}
@Override
public UnlockableContent[] getValueContent(){
return new Item[]{item.item};
}
@Override
public void display(Table table){
table.add(new ItemDisplay(item.item, item.amount));
}
}

View File

@ -11,9 +11,11 @@ import static io.anuke.mindustry.Vars.content;
public class LiquidFilterValue implements StatValue{
private final Predicate<Liquid> filter;
private final float amount;
public LiquidFilterValue(Predicate<Liquid> filter){
public LiquidFilterValue(Predicate<Liquid> filter, float amount){
this.filter = filter;
this.amount = amount;
}
@Override
@ -25,7 +27,7 @@ public class LiquidFilterValue implements StatValue{
}
for(int i = 0; i < list.size; i++){
table.add(new LiquidDisplay(list.get(i))).padRight(5);
table.add(new LiquidDisplay(list.get(i), amount)).padRight(5);
if(i != list.size - 1){
table.add("/");

View File

@ -1,12 +1,11 @@
package io.anuke.mindustry.world.meta.values;
import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.ui.LiquidDisplay;
import io.anuke.mindustry.world.meta.ContentStatValue;
import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.mindustry.world.meta.StatValue;
public class LiquidValue implements ContentStatValue{
public class LiquidValue implements StatValue{
private final Liquid liquid;
private final float amount;
@ -19,11 +18,6 @@ public class LiquidValue implements ContentStatValue{
this(liquid, 0f);
}
@Override
public UnlockableContent[] getValueContent(){
return new UnlockableContent[]{liquid};
}
@Override
public void display(Table table){
table.add(new LiquidDisplay(liquid, amount));

View File

@ -20,10 +20,9 @@ public class NumberValue implements StatValue{
@Override
public void display(Table table){
float diff = Math.abs((int) value - value);
int precision = diff <= 0.01f ? 0 : diff <= 0.1f ? 1 : 2;
int precision = Math.abs((int) value - value) <= 0.001f ? 0 : Math.abs((int) (value * 10) - value * 10) <= 0.001f ? 1 : 2;
table.add(Strings.toFixed(value, precision));
table.add(Strings.fixed(value, precision));
table.add(" " + unit.localized());
}
}