diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 0ad3c00139..5025f88d55 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -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 + ""; } diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java index 39666616d3..8c407c7d5d 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -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(); diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index fa302ada5f..b5e929f625 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -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 type){ - return tile.block().consumes.get(type).valid(tile.block(), this); - } - public void removeFromProximity(){ tile.block().onProximityRemoved(tile); diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/io/anuke/mindustry/ui/ContentDisplay.java index 2d9329647b..a0deb600a4 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ContentDisplay.java @@ -60,7 +60,9 @@ public class ContentDisplay{ Array 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(); } diff --git a/core/src/io/anuke/mindustry/ui/ItemDisplay.java b/core/src/io/anuke/mindustry/ui/ItemDisplay.java index ff5b6153f3..b8f755986b 100644 --- a/core/src/io/anuke/mindustry/ui/ItemDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemDisplay.java @@ -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); } } diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index 3e4692c270..6ac6e91ad3 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -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(); diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java index 0416085b86..d1176e6649 100644 --- a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java +++ b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java @@ -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); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 3af57bb8c5..3ef695fc10 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -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 + ""; } diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index b87c6f286b..e5ec3eec6f 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -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); diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/io/anuke/mindustry/world/BlockStorage.java index 30efc78fe2..6c86bdf80a 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/io/anuke/mindustry/world/BlockStorage.java @@ -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){ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 3796103fe3..272de74281 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -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); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java index 38f20f53db..281125b5ba 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/DifferentialGenerator.java @@ -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{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java index 9a18a8fe4f..3b20b2a377 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -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)); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java index 88d7608636..bac3ff9c65 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -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)); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 01662ccb50..01a56a2f87 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -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()))); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java index f79007b348..596da2c6ab 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java @@ -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 diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index 8251519d57..799f119d5b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -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 diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 4de14c8b72..cbd29a7de6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -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); }); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index 2f6e2609a0..76b5011112 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -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{ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 9cb5c4cf57..f38821aa87 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -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); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java index 911e1a71ff..7ad19fc305 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -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); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index a1acaae9ce..5fffb79f36 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -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)); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index cbbd0b31a0..fd9abae51e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -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; diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/io/anuke/mindustry/world/consumers/Consume.java index bb18472602..c147bec19d 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consume.java @@ -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.*/ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java deleted file mode 100644 index 05fe7ae01f..0000000000 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItem.java +++ /dev/null @@ -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)); - } -} diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 56c41ed4b3..288a17fd08 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -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 list = content.items().select(filter); diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index deff821e85..d4d66f29b7 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -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){ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 26d12fc805..b623cae7c6 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -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){ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 5b1a0895c2..9dd12549d0 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -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 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){ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index a88b09a929..c27877386d 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -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 diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeType.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeType.java new file mode 100644 index 0000000000..572332f9df --- /dev/null +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeType.java @@ -0,0 +1,7 @@ +package io.anuke.mindustry.world.consumers; + +public enum ConsumeType{ + item, + power, + liquid +} diff --git a/core/src/io/anuke/mindustry/world/consumers/Consumers.java b/core/src/io/anuke/mindustry/world/consumers/Consumers.java index 0616e8ea80..99d8331c86 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consumers.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consumers.java @@ -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, Consume> map = new ObjectMap<>(); - private ObjectSet> required = new ObjectSet<>(); - private Array results = new Array<>(); + private Consume[] map = new Consume[ConsumeType.values().length]; + private ObjectSet required = new ObjectSet<>(); + private Consume[] results; - public void require(Class 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 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 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 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 type){ - map.remove(type); + public void remove(ConsumeType type){ + map[type.ordinal()] = null; } - public boolean has(Class type){ - return map.containsKey(type); + public boolean has(ConsumeType type){ + return map[type.ordinal()] != null; } @SuppressWarnings("unchecked") - public T get(Class type){ - if(!map.containsKey(type)){ + public 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 all(){ - return map.values(); - } - - public Array array(){ + public Consume[] all(){ return results; } - public boolean hasAny(){ - return map.size > 0; - } - - public void forEach(Consumer cons){ - for(Consume c : all()){ - cons.accept(c); + public void display(BlockStats stats){ + for(Consume c : map){ + if(c != null){ + c.display(stats); + } } } } diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStats.java b/core/src/io/anuke/mindustry/world/meta/BlockStats.java index 2a867288f0..c91047c296 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStats.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStats.java @@ -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<>()); } diff --git a/core/src/io/anuke/mindustry/world/meta/ContentStatValue.java b/core/src/io/anuke/mindustry/world/meta/ContentStatValue.java deleted file mode 100644 index 6a8375522e..0000000000 --- a/core/src/io/anuke/mindustry/world/meta/ContentStatValue.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.anuke.mindustry.world.meta; - -import io.anuke.mindustry.game.UnlockableContent; - -public interface ContentStatValue extends StatValue{ - UnlockableContent[] getValueContent(); -} diff --git a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java index f04e63d977..c567bf50f5 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -35,14 +35,14 @@ public class AmmoListValue 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){ diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java index a316eb26a7..494be7285c 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java @@ -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); } } } diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java deleted file mode 100644 index 97d10985da..0000000000 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java +++ /dev/null @@ -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)); - } -} diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java index 7d34d5049d..6b046f7628 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java @@ -11,9 +11,11 @@ import static io.anuke.mindustry.Vars.content; public class LiquidFilterValue implements StatValue{ private final Predicate filter; + private final float amount; - public LiquidFilterValue(Predicate filter){ + public LiquidFilterValue(Predicate 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("/"); diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java b/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java index 510935dc55..b55b2e77fc 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java @@ -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)); diff --git a/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java b/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java index 620bfc1186..a83e5c9063 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java @@ -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()); } }