diff --git a/core/assets-raw/sprites/items/liquid-icon.png b/core/assets-raw/sprites/items/liquid-icon.png new file mode 100644 index 0000000000..642517ce48 Binary files /dev/null and b/core/assets-raw/sprites/items/liquid-icon.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6c1bbfcf1e..5e717c5d82 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -256,28 +256,28 @@ placemode.touch.name=touch placemode.cursor.name=cursor text.blocks.blockinfo=Block Info text.blocks.powercapacity=Power Capacity -text.blocks.powershot=Power/shot -text.blocks.powersecond=Power/second -text.blocks.powerdraindamage=Power Drain/damage -text.blocks.itemspeed=Units Moved/second +text.blocks.powershot=Power/Shot +text.blocks.itemspeed=Units Moved text.blocks.shootrange=Range text.blocks.size=Size text.blocks.liquidcapacity=Liquid Capacity -text.blocks.maxitemssecond=Max items/second +text.blocks.maxitemssecond=Max Items text.blocks.powerrange=Power Range -text.blocks.poweruse=Power Use/Second +text.blocks.poweruse=Power Use text.blocks.inputitemcapacity=Input Item Capacity text.blocks.outputitemcapacity=Input Item Capacity text.blocks.itemcapacity=Item Capacity -text.blocks.maxpowergenerationsecond=Max Power Generation/second -text.blocks.powertransferspeed=Power Transfer/Second +text.blocks.maxpowergeneration=Max Power Generation +text.blocks.powertransferspeed=Power Transfer +text.blocks.craftspeed=Production Speed text.blocks.inputliquid=Input Liquid text.blocks.inputitem=Input Item text.blocks.inputitems=Input Items text.blocks.outputitem=Output Item -text.blocks.liquidoutput=Liquid Output/Second -text.blocks.secondsitem=Seconds/item -text.blocks.maxpowergeneration=Max power transfer/second +text.blocks.drilltier=Drill Tier +text.blocks.drillspeed=Base Drill Speed +text.blocks.liquidoutput=Liquid Output +text.blocks.liquiduse=Liquid Use text.blocks.explosive=Highly explosive! text.blocks.health=Health text.blocks.inaccuracy=Inaccuracy @@ -285,12 +285,27 @@ text.blocks.shots=Shots text.blocks.reload=Reload text.blocks.inputfuel=Fuel text.blocks.fuelburntime=Fuel Burn Time -text.blocks.craftspeed=Max crafted/second text.blocks.inputcapacity=Input capacity text.blocks.outputcapacity=Output capacity -text.placemode=Place Mode -text.breakmode=Break Mode -text.health=Health + +text.unit.blocks=blocks +text.unit.powersecond=power units/second +text.unit.liquidsecond=liquid units/second +text.unit.itemssecond=items/second +text.unit.pixelssecond=pixels/second +text.unit.liquidunits=liquid units +text.unit.powerunits=power units +text.unit.degrees=degrees +text.unit.seconds=seconds +text.unit.none= +text.unit.items=items + +text.category.general=General +text.category.power=Power +text.category.liquids=Liquids +text.category.items=Items +text.category.crafting=Crafting +text.category.shooting=Shooting setting.difficulty.easy=easy setting.difficulty.normal=normal setting.difficulty.hard=hard @@ -353,3 +368,64 @@ mode.sandbox.name=sandbox mode.sandbox.description=infinite resources and no timer for waves. mode.freebuild.name=freebuild mode.freebuild.description=limited resources and no timer for waves. + +block.tungsten-wall.name=Tungsten Wall +block.tungsten-wall-large.name=Large Tungsten Wall +block.carbide-wall.name=Carbide Wall +block.carbide-wall-large.name=Large Carbide Wall +block.thorium-wall.name=Thorium Wall +block.thorium-wall-large.name=Large Thorium Wall +block.door.name=Door +block.door-large.name=Large Door +block.duo.name=Duo +block.scorch.name=Scorch +block.hail.name=Hail +block.lancer.name=Lancer +block.conveyor.name=Conveyor +block.titanium-conveyor.name=Titanium Conveyor +block.junction.name=Junction +block.splitter.name=Splitter +block.router.name=Router +block.multiplexer.name=Multiplexer +block.sorter.name=Sorter +block.overflowgate.name=Overflowgate +block.bridgeconveyor.name=Bridge Conveyor +block.smelter.name=Smelter +block.arc-smelter.name=Arc Smelter +block.silicon-smelter.name=Silicon Smelter +block.phase-weaver.name=Phase Weaver +block.pulverizer.name=Pulverizer +block.cryofluidmixer.name=Cryofluid Mixer +block.melter.name=Melter +block.incinerator.name=Incinerator +block.biomattercompressor.name=Biomatter Compressor +block.separator.name=Separator +block.centrifuge.name=Centrifuge +block.power-node.name=Power Node +block.power-node-large.name=Large Power Node +block.battery.name=Battery +block.battery-large.name=Large Battery +block.combustion-generator.name=Combustion Generator +block.turbine-generator.name=Turbine Generator +block.tungsten-drill.name=Tungsten Drill +block.carbide-drill.name=Carbide Drill +block.laser-drill.name=Laser Drill +block.water-extractor.name=Water Extractor +block.cultivator.name=Cultivator +block.dart-ship-factory.name=Dart Ship Factory +block.delta-mech-factory.name=Delta Mech Factory +block.dronefactory.name=Drone Factory +block.repairpoint.name=Repair Point +block.resupplypoint.name=Resupply Point +block.conduit.name=Conduit +block.pulseconduit.name=Pulse Conduit +block.liquidrouter.name=Liquid Router +block.liquidtank.name=Liquid Tank +block.liquidjunction.name=Liquid Junction +block.bridgeconduit.name=Bridge Conduit +block.mechanical-pump.name=Mechanical Pump +block.itemsource.name=Item Source +block.itemvoid.name=Item Void +block.liquidsource.name=Liquid Source +block.powervoid.name=Power Void +block.powerinfinite.name=Power Infinite diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 7b9c4847ad..010f21d8a9 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -188,21 +188,21 @@ plasma-drill-top index: -1 tungsten-drill rotate: false - xy: 491, 71 + xy: 501, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tungsten-drill-rotator rotate: false - xy: 501, 81 + xy: 491, 61 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tungsten-drill-top rotate: false - xy: 491, 61 + xy: 501, 71 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -496,35 +496,35 @@ lead3 index: -1 metalfloor2 rotate: false - xy: 919, 421 + xy: 929, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor3 rotate: false - xy: 929, 421 + xy: 939, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor4 rotate: false - xy: 939, 421 + xy: 949, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor5 rotate: false - xy: 949, 421 + xy: 720, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 metalfloor6 rotate: false - xy: 720, 253 + xy: 730, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -545,49 +545,49 @@ oiledge index: -1 rock2 rotate: false - xy: 555, 91 + xy: 565, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge rotate: false - xy: 595, 88 + xy: 605, 90 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-1 rotate: false - xy: 605, 90 + xy: 441, 86 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-edge-2 rotate: false - xy: 441, 86 + xy: 441, 76 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand-cliff-side rotate: false - xy: 441, 76 + xy: 441, 66 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand2 rotate: false - xy: 575, 91 + xy: 585, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 sand3 rotate: false - xy: 585, 88 + xy: 595, 88 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -601,49 +601,49 @@ sandedge index: -1 shrubshadow rotate: false - xy: 441, 46 + xy: 441, 36 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge rotate: false - xy: 461, 82 + xy: 451, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-1 rotate: false - xy: 451, 72 + xy: 471, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-edge-2 rotate: false - xy: 471, 82 + xy: 461, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow-cliff-side rotate: false - xy: 461, 72 + xy: 451, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow2 rotate: false - xy: 441, 36 + xy: 451, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 snow3 rotate: false - xy: 451, 82 + xy: 461, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -664,42 +664,42 @@ spaceedge index: -1 stone-cliff-edge rotate: false - xy: 471, 72 + xy: 461, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-1 rotate: false - xy: 461, 62 + xy: 451, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-edge-2 rotate: false - xy: 451, 52 + xy: 481, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone-cliff-side rotate: false - xy: 481, 72 + xy: 471, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone2 rotate: false - xy: 451, 62 + xy: 481, 82 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 stone3 rotate: false - xy: 481, 82 + xy: 471, 72 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -713,91 +713,91 @@ stoneedge index: -1 thorium1 rotate: false - xy: 471, 62 + xy: 461, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 461, 52 + xy: 451, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 451, 42 + xy: 481, 62 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 481, 62 + xy: 471, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 471, 52 + xy: 461, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 461, 42 + xy: 481, 52 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tungsten1 rotate: false - xy: 471, 42 + xy: 481, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tungsten2 rotate: false - xy: 481, 42 + xy: 491, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 tungsten3 rotate: false - xy: 491, 81 + xy: 491, 71 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge rotate: false - xy: 501, 71 + xy: 511, 81 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-1 rotate: false - xy: 511, 81 + xy: 491, 51 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-edge-2 rotate: false - xy: 491, 51 + xy: 501, 61 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 water-cliff-side rotate: false - xy: 501, 61 + xy: 511, 71 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -909,14 +909,14 @@ nuclearreactor-shadow index: -1 place-arrow rotate: false - xy: 485, 92 + xy: 495, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 playerspawn rotate: false - xy: 495, 91 + xy: 505, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1105,28 +1105,28 @@ laserconduit-end index: -1 liquidrouter rotate: false - xy: 945, 431 + xy: 889, 419 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidrouter-bottom rotate: false - xy: 889, 419 + xy: 899, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidrouter-liquid rotate: false - xy: 899, 421 + xy: 909, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 liquidrouter-top rotate: false - xy: 909, 421 + xy: 919, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1154,14 +1154,14 @@ liquidtank-top index: -1 pulseconduit-bottom rotate: false - xy: 505, 91 + xy: 515, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulseconduit-top rotate: false - xy: 515, 91 + xy: 525, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1266,7 +1266,7 @@ nuclear-reactor-lights index: -1 rtg-generator-top rotate: false - xy: 565, 91 + xy: 575, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1476,21 +1476,21 @@ silicon-smelter-top index: -1 pulverizer rotate: false - xy: 525, 91 + xy: 535, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 535, 91 + xy: 545, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 441, 66 + xy: 441, 56 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1735,7 +1735,7 @@ reconstructor-open index: -1 repairpoint-turret rotate: false - xy: 545, 91 + xy: 555, 91 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1910,7 +1910,7 @@ shell-back index: -1 shot rotate: false - xy: 441, 56 + xy: 441, 46 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1924,7 +1924,7 @@ transfer index: -1 transfer-arrow rotate: false - xy: 481, 52 + xy: 471, 42 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3310,525 +3310,525 @@ mech-icon-tau-mech index: -1 ore-coal-grass1 rotate: false - xy: 730, 253 + xy: 725, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass2 rotate: false - xy: 725, 243 + xy: 725, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-grass3 rotate: false - xy: 725, 233 + xy: 722, 223 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice1 rotate: false - xy: 722, 223 + xy: 722, 213 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice2 rotate: false - xy: 722, 213 + xy: 722, 203 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-ice3 rotate: false - xy: 722, 203 + xy: 722, 193 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand1 rotate: false - xy: 722, 193 + xy: 722, 183 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand2 rotate: false - xy: 722, 183 + xy: 722, 173 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-sand3 rotate: false - xy: 722, 173 + xy: 722, 163 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow1 rotate: false - xy: 722, 163 + xy: 720, 153 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow2 rotate: false - xy: 720, 153 + xy: 720, 143 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-snow3 rotate: false - xy: 720, 143 + xy: 720, 133 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone1 rotate: false - xy: 720, 133 + xy: 735, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone2 rotate: false - xy: 735, 243 + xy: 735, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-coal-stone3 rotate: false - xy: 735, 233 + xy: 732, 223 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass1 rotate: false - xy: 732, 223 + xy: 732, 213 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass2 rotate: false - xy: 732, 213 + xy: 732, 203 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-grass3 rotate: false - xy: 732, 203 + xy: 732, 193 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice1 rotate: false - xy: 732, 193 + xy: 732, 183 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice2 rotate: false - xy: 732, 183 + xy: 732, 173 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-ice3 rotate: false - xy: 732, 173 + xy: 732, 163 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand1 rotate: false - xy: 732, 163 + xy: 730, 153 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand2 rotate: false - xy: 730, 153 + xy: 730, 143 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-sand3 rotate: false - xy: 730, 143 + xy: 730, 133 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow1 rotate: false - xy: 730, 133 + xy: 742, 223 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow2 rotate: false - xy: 742, 223 + xy: 742, 213 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-snow3 rotate: false - xy: 742, 213 + xy: 742, 203 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone1 rotate: false - xy: 742, 203 + xy: 742, 193 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone2 rotate: false - xy: 742, 193 + xy: 742, 183 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-lead-stone3 rotate: false - xy: 742, 183 + xy: 742, 173 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass1 rotate: false - xy: 742, 173 + xy: 742, 163 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass2 rotate: false - xy: 742, 163 + xy: 740, 153 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-grass3 rotate: false - xy: 740, 153 + xy: 740, 143 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice1 rotate: false - xy: 740, 143 + xy: 740, 133 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice2 rotate: false - xy: 740, 133 + xy: 445, 9 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-ice3 rotate: false - xy: 445, 9 + xy: 455, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand1 rotate: false - xy: 455, 122 + xy: 455, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand2 rotate: false - xy: 455, 112 + xy: 465, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-sand3 rotate: false - xy: 465, 122 + xy: 465, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow1 rotate: false - xy: 465, 112 + xy: 475, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow2 rotate: false - xy: 475, 122 + xy: 475, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-snow3 rotate: false - xy: 475, 112 + xy: 485, 122 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone1 rotate: false - xy: 485, 122 + xy: 485, 112 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone2 rotate: false - xy: 485, 112 + xy: 455, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-thorium-stone3 rotate: false - xy: 455, 102 + xy: 465, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass1 rotate: false - xy: 465, 102 + xy: 475, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass2 rotate: false - xy: 475, 102 + xy: 485, 102 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-grass3 rotate: false - xy: 485, 102 + xy: 495, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice1 rotate: false - xy: 495, 111 + xy: 505, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice2 rotate: false - xy: 505, 111 + xy: 515, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-ice3 rotate: false - xy: 515, 111 + xy: 525, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand1 rotate: false - xy: 525, 111 + xy: 535, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand2 rotate: false - xy: 535, 111 + xy: 545, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-sand3 rotate: false - xy: 545, 111 + xy: 555, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow1 rotate: false - xy: 555, 111 + xy: 565, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow2 rotate: false - xy: 565, 111 + xy: 575, 111 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-snow3 rotate: false - xy: 575, 111 + xy: 495, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone1 rotate: false - xy: 495, 101 + xy: 505, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone2 rotate: false - xy: 505, 101 + xy: 515, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-titanium-stone3 rotate: false - xy: 515, 101 + xy: 525, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-grass1 rotate: false - xy: 525, 101 + xy: 535, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-grass2 rotate: false - xy: 535, 101 + xy: 545, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-grass3 rotate: false - xy: 545, 101 + xy: 555, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-ice1 rotate: false - xy: 555, 101 + xy: 565, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-ice2 rotate: false - xy: 565, 101 + xy: 575, 101 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-ice3 rotate: false - xy: 575, 101 + xy: 585, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-sand1 rotate: false - xy: 585, 108 + xy: 595, 108 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-sand2 rotate: false - xy: 595, 108 + xy: 585, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-sand3 rotate: false - xy: 585, 98 + xy: 595, 98 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-snow1 rotate: false - xy: 595, 98 + xy: 605, 100 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-snow2 rotate: false - xy: 605, 100 + xy: 445, 96 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-snow3 rotate: false - xy: 445, 96 + xy: 455, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-stone1 rotate: false - xy: 455, 92 + xy: 465, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-stone2 rotate: false - xy: 465, 92 + xy: 475, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 ore-tungsten-stone3 rotate: false - xy: 475, 92 + xy: 485, 92 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -3966,6 +3966,13 @@ item-tungsten orig: 8, 8 offset: 0, 0 index: -1 +liquid-icon + rotate: false + xy: 945, 431 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 alpha-mech rotate: false xy: 195, 124 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 92d4a51fed..5450225198 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index 547d4ecb24..a98d27b90e 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -56,7 +56,7 @@ public class Items implements ContentList{ plasteel = new Item("plasteel", Color.valueOf("e9ead3")) {{ type = ItemType.material; - flammability = 0.2f; + flammability = 0.1f; explosiveness = 0.1f; }}; diff --git a/core/src/io/anuke/mindustry/content/Recipes.java b/core/src/io/anuke/mindustry/content/Recipes.java index be876e24ee..2bd4cd917b 100644 --- a/core/src/io/anuke/mindustry/content/Recipes.java +++ b/core/src/io/anuke/mindustry/content/Recipes.java @@ -63,12 +63,12 @@ public class Recipes implements ContentList{ //TODO implement alloy smelter // new Recipe(crafting, CraftingBlocks.alloySmelter, new ItemStack(Items.silicon, 160), new ItemStack(Items.lead, 160), new ItemStack(Items.thorium, 140)); - new Recipe(crafting, CraftingBlocks.plasteelcompressor, new ItemStack(Items.silicon, 60), new ItemStack(Items.lead, 170), new ItemStack(Items.titanium, 170)); + // new Recipe(crafting, CraftingBlocks.plasteelcompressor, new ItemStack(Items.silicon, 60), new ItemStack(Items.lead, 170), new ItemStack(Items.titanium, 170)); //misc new Recipe(crafting, CraftingBlocks.pulverizer, new ItemStack(Items.tungsten, 60), new ItemStack(Items.lead, 50)); - new Recipe(crafting, CraftingBlocks.thermiteMixer, new ItemStack(Items.tungsten, 100), new ItemStack(Items.lead, 50)); - new Recipe(crafting, CraftingBlocks.blastMixer, new ItemStack(Items.tungsten, 60), new ItemStack(Items.lead, 60), new ItemStack(Items.carbide, 40)); + //new Recipe(crafting, CraftingBlocks.thermiteMixer, new ItemStack(Items.tungsten, 100), new ItemStack(Items.lead, 50)); + //new Recipe(crafting, CraftingBlocks.blastMixer, new ItemStack(Items.tungsten, 60), new ItemStack(Items.lead, 60), new ItemStack(Items.carbide, 40)); new Recipe(crafting, CraftingBlocks.cryofluidmixer, new ItemStack(Items.lead, 130), new ItemStack(Items.silicon, 80), new ItemStack(Items.titanium, 90)); new Recipe(crafting, CraftingBlocks.melter, new ItemStack(Items.tungsten, 60), new ItemStack(Items.lead, 70), new ItemStack(Items.carbide, 90)); @@ -102,7 +102,7 @@ public class Recipes implements ContentList{ new Recipe(production, ProductionBlocks.waterextractor, new ItemStack(Items.tungsten, 50), new ItemStack(Items.carbide, 50), new ItemStack(Items.lead, 40)); new Recipe(production, ProductionBlocks.cultivator, new ItemStack(Items.tungsten, 20), new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 20)); - new Recipe(production, ProductionBlocks.oilextractor, new ItemStack(Items.tungsten, 90), new ItemStack(Items.carbide, 150), new ItemStack(Items.lead, 100), new ItemStack(Items.silicon, 100)); + //new Recipe(production, ProductionBlocks.oilextractor, new ItemStack(Items.tungsten, 90), new ItemStack(Items.carbide, 150), new ItemStack(Items.lead, 100), new ItemStack(Items.silicon, 100)); //UNITS diff --git a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java index e34b4b309c..c8ae84a957 100644 --- a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java @@ -14,10 +14,10 @@ public class UnitBlocks extends BlockList implements ContentList { public void load() { droneFactory = new UnitFactory("dronefactory") {{ type = UnitTypes.drone; - produceTime = 300; + produceTime = 800; size = 2; requirements = new ItemStack[]{ - new ItemStack(Items.silicon, 20), new ItemStack(Items.lead, 20) + new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30) }; }}; diff --git a/core/src/io/anuke/mindustry/type/Recipe.java b/core/src/io/anuke/mindustry/type/Recipe.java index 03d97745b4..132b61ce33 100644 --- a/core/src/io/anuke/mindustry/type/Recipe.java +++ b/core/src/io/anuke/mindustry/type/Recipe.java @@ -9,6 +9,8 @@ import io.anuke.mindustry.world.Block; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Log; +import java.util.Arrays; + import static io.anuke.mindustry.Vars.debug; import static io.anuke.mindustry.Vars.headless; @@ -31,6 +33,8 @@ public class Recipe implements UnlockableContent{ this.requirements = requirements; this.category = category; + Arrays.sort(requirements, (a, b) -> Integer.compare(a.item.id, b.item.id)); + float timeToPlace = 0f; for(ItemStack stack : requirements){ timeToPlace += stack.amount * stack.item.cost; @@ -56,9 +60,9 @@ public class Recipe implements UnlockableContent{ public void init() { if(!Bundles.has("block." + result.name + ".name")) { Log.err("WARNING: Recipe block '{0}' does not have a formal name defined.", result.name); - }else if(result.fullDescription == null){ + }/*else if(result.fullDescription == null){ Log.err("WARNING: Recipe block '{0}' does not have a description defined.", result.name); - } + }*/ } @Override diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index fe7902a39d..1e8691fe65 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -2,34 +2,37 @@ package io.anuke.mindustry.ui; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import io.anuke.mindustry.type.ItemStack; import io.anuke.ucore.function.Supplier; -import io.anuke.ucore.scene.style.TextureRegionDrawable; import io.anuke.ucore.scene.ui.Image; import io.anuke.ucore.scene.ui.layout.Stack; import io.anuke.ucore.scene.ui.layout.Table; public class ItemImage extends Stack { - private Image image; - public ItemImage(TextureRegion region, Supplier text, Color color) { + public ItemImage(TextureRegion region, Supplier text) { Table t = new Table().left().bottom(); + t.label(text).color(Color.DARK_GRAY).padBottom(-60).get().setFontScale(0.5f); + t.row(); t.label(text).get().setFontScale(0.5f); - image = new Image(region); - image.setColor(color); + Image image = new Image(region); add(image); add(t); } - public ItemImage updateColor(Supplier c){ - image.update(() -> image.setColor(c.get())); - return this; - } + public ItemImage(ItemStack stack) { + Table t = new Table().left().bottom(); - public ItemImage updateRegion(Supplier c){ - image.update(() -> image.setDrawable(new TextureRegionDrawable(c.get()))); - return this; + t.add(stack.amount + "").color(Color.DARK_GRAY).padBottom(-22).get().setFontScale(0.5f); + t.row(); + t.add(stack.amount + "").get().setFontScale(0.5f); + + Image image = new Image(stack.item.region); + + add(image); + add(t); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 2db9ab757f..f3ef577269 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.ui.fragments; -import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.IntSet; @@ -106,7 +105,7 @@ public class BlockInventoryFragment implements Fragment { HandCursorListener l = new HandCursorListener(); l.setEnabled(canPick); - ItemImage image = new ItemImage(item.region, () -> round(items[f]), Color.WHITE); + ItemImage image = new ItemImage(item.region, () -> round(items[f])); image.addListener(l); image.tapped(() -> { if(!canPick.get() || items[f] == 0) return; diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java index 5f1e660a24..b02cbd577b 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlocksFragment.java @@ -4,15 +4,24 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.OrderedMap; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.type.Category; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Recipe; +import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.BlockStats; +import io.anuke.mindustry.world.meta.StatCategory; +import io.anuke.mindustry.world.meta.StatValue; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.actions.Actions; @@ -317,6 +326,8 @@ public class BlocksFragment implements Fragment{ nameLabel.setWrap(true); header.add(nameLabel).padLeft(2).width(120f); + header.addButton("?", () -> showBlockInfo(recipe.result)).expandX().padLeft(3).top().right().size(40f, 44f).padTop(-2); + descTable.add().pad(2); Table requirements = new Table(); @@ -345,6 +356,56 @@ public class BlocksFragment implements Fragment{ descTable.row(); } + private void showBlockInfo(Block block){ + FloatingDialog dialog = new FloatingDialog("$text.blocks.blockinfo"); + dialog.addCloseButton(); + + Table table = new Table(); + ScrollPane pane = new ScrollPane(table, "clear"); + + table.table(title -> { + title.addImage(Draw.region("block-icon-" + block.name)).size(8 * 6); + title.add("[accent]" + block.formalName).padLeft(5); + }); + + table.row(); + + table.addImage("white").height(3).color(Color.LIGHT_GRAY).pad(15).padLeft(0).padRight(0).fillX(); + + table.row(); + + if(block.fullDescription != null){ + table.add(block.fullDescription); + table.row(); + + table.addImage("white").height(3).color(Color.LIGHT_GRAY).pad(15).padLeft(0).padRight(0).fillX(); + table.row(); + } + + BlockStats stats = block.stats; + + for(StatCategory cat : stats.toMap().keys()){ + OrderedMap map = stats.toMap().get(cat); + + if(map.size == 0) continue; + + table.add("$text.category." + cat.name()).color(Palette.accent).fillX(); + table.row(); + + for (BlockStat stat : map.keys()){ + table.table(inset -> { + inset.left(); + inset.add("[LIGHT_GRAY]" + stat.localized() + ":[] "); + map.get(stat).display(inset); + }).fillX().padLeft(10); + table.row(); + } + } + + dialog.content().add(pane).grow(); + dialog.show(); + } + String format(int number){ if(number >= 1000000) { return Strings.toFixed(number/1000000f, 1) + "[gray]mil[]"; diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index a08b4394c1..bf56c187bd 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -126,7 +126,7 @@ public class Block extends BaseBlock implements UnlockableContent{ public Block(String name) { this.name = name; this.formalName = Bundles.get("block." + name + ".name", name); - this.fullDescription = Bundles.getOrNull("block." + name + ".fulldescription"); + this.fullDescription = Bundles.getOrNull("block." + name + ".description"); this.solid = false; this.id = lastid++; @@ -221,11 +221,11 @@ public class Block extends BaseBlock implements UnlockableContent{ public void setStats(){ stats.add(BlockStat.size, "{0}x{0}", size); - stats.add(BlockStat.health, health); + stats.add(BlockStat.health, health, StatUnit.none); - if(hasPower) stats.add(BlockStat.powerCapacity, powerCapacity); - if(hasLiquids) stats.add(BlockStat.liquidCapacity, liquidCapacity); - if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity); + if(hasPower) stats.add(BlockStat.powerCapacity, powerCapacity, StatUnit.powerUnits); + if(hasLiquids) stats.add(BlockStat.liquidCapacity, liquidCapacity, StatUnit.liquidUnits); + if(hasItems) stats.add(BlockStat.itemCapacity, itemCapacity, StatUnit.items); } //TODO make this easier to config. diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java index 8b8955d539..3a12751d13 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -8,6 +8,8 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockBar; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.values.ItemFilterValue; public class ItemTurret extends CooledTurret { protected int maxAmmo = 50; @@ -19,6 +21,15 @@ public class ItemTurret extends CooledTurret { hasItems = true; } + @Override + public void setStats() { + super.setStats(); + + stats.remove(BlockStat.itemCapacity); + + stats.add(BlockStat.inputItems, new ItemFilterValue(item -> ammoMap.containsKey(item))); + } + @Override public int acceptStack(Item item, int amount, Tile tile, Unit source) { TurretEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 27d27d7594..2b83867eb7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -5,8 +5,10 @@ import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.BarType; -import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.meta.BlockBar; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.values.LiquidFilterValue; import io.anuke.ucore.core.Effects; public abstract class LiquidTurret extends Turret { @@ -18,6 +20,13 @@ public abstract class LiquidTurret extends Turret { hasLiquids = true; } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.inputItems, new LiquidFilterValue(item -> liquidAmmoMap.containsKey(item))); + } + @Override public void setBars() { super.setBars(); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java index 945fad33e5..da4580cd2b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; public abstract class PowerTurret extends CooledTurret { protected float powerUsed = 0.5f; @@ -17,7 +18,7 @@ public abstract class PowerTurret extends CooledTurret { public void setStats(){ super.setStats(); - stats.add(BlockStat.powerShot, powerUsed); + stats.add(BlockStat.powerShot, powerUsed, StatUnit.powerUnits); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index dcc88852bd..56180b9e9c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -18,6 +18,7 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Graphics; @@ -88,10 +89,11 @@ public abstract class Turret extends Block{ if(ammo != null) stats.add("ammo", ammo); if(ammo != null) stats.add("ammocapacity", maxAmmo); if(ammo != null) stats.add("ammoitem", ammoMultiplier);*/ - stats.add(BlockStat.shootRange, (int)range); - stats.add(BlockStat.inaccuracy, (int)inaccuracy); - stats.add(BlockStat.reload, Strings.toFixed(60f/reload, 1)); - stats.add(BlockStat.shots, shots); + + stats.add(BlockStat.shootRange, range, StatUnit.blocks); + stats.add(BlockStat.inaccuracy, (int)inaccuracy, StatUnit.degrees); + stats.add(BlockStat.reload, 60f/reload, StatUnit.seconds); + stats.add(BlockStat.shots, shots, StatUnit.none); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index d5d3c099ad..8e2261be57 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -12,6 +12,7 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.*; @@ -57,7 +58,7 @@ public class Conveyor extends Block{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.itemSpeed, speed * 60); + stats.add(BlockStat.itemSpeed, speed * 60, StatUnit.pixelsSecond); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java index 40ce8429ab..b97e58e3b3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemGenerator.java @@ -7,6 +7,8 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockBar; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.values.ItemFilterValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -30,6 +32,13 @@ public abstract class ItemGenerator extends PowerGenerator { hasItems = true; } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.inputItems, new ItemFilterValue(item -> getItemEfficiency(item) >= minItemEfficiency)); + } + @Override public void setBars(){ super.setBars(); @@ -86,7 +95,7 @@ public abstract class ItemGenerator extends PowerGenerator { } - protected abstract float getItemEfficiency(Item item); + protected abstract float getItemEfficiency(Item item); @Override public TileEntity getEntity() { diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 36b5d5bdca..ae799a5551 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -4,6 +4,8 @@ import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.values.LiquidFilterValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; @@ -21,6 +23,13 @@ public abstract class ItemLiquidGenerator extends ItemGenerator { liquidCapacity = 10f; } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.inputLiquid, new LiquidFilterValue(item -> getLiquidEfficiency(item) >= minLiquidEfficiency)); + } + @Override public void update(Tile tile){ ItemGeneratorEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java index 06e01a2708..ff276b057e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LiquidGenerator.java @@ -5,6 +5,8 @@ import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.power.ItemGenerator.ItemGeneratorEntity; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.values.LiquidFilterValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -23,7 +25,14 @@ public abstract class LiquidGenerator extends PowerGenerator { liquidCapacity = 30f; hasLiquids = true; } - + + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.inputLiquid, new LiquidFilterValue(item -> getEfficiency(item) >= minEfficiency)); + } + @Override public void draw(Tile tile){ super.draw(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index 9de000b63e..33f83ace98 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -12,6 +12,7 @@ import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; @@ -60,8 +61,8 @@ public class NuclearReactor extends PowerGenerator { @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.inputItem, generateItem.toString()); - stats.add(BlockStat.maxPowerGeneration, powerMultiplier*60f); + stats.add(BlockStat.inputItem, generateItem); + stats.add(BlockStat.maxPowerGeneration, powerMultiplier*60f, StatUnit.powerSecond); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java index ad9cc8f29e..c094deb1f5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java @@ -14,6 +14,7 @@ import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; @@ -68,8 +69,8 @@ public class PowerDistributor extends PowerBlock{ public void setStats(){ super.setStats(); - stats.add(BlockStat.powerRange, laserRange); - stats.add(BlockStat.powerTransferSpeed, powerSpeed * 60); + stats.add(BlockStat.powerRange, laserRange, StatUnit.blocks); + stats.add(BlockStat.powerTransferSpeed, powerSpeed * 60, StatUnit.powerSecond); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java index 47513fe2b5..5dee77caf8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java @@ -1,6 +1,8 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Timers; public class SolarGenerator extends PowerGenerator { @@ -11,6 +13,13 @@ public class SolarGenerator extends PowerGenerator { super(name); } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.maxPowerGeneration, generation * 60f, StatUnit.powerSecond); + } + @Override public void update(Tile tile){ addPower(tile, generation * Timers.delta()); 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 88c40dd707..4a890d1bd8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -12,6 +12,8 @@ import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Graphics; @@ -117,6 +119,9 @@ public class Drill extends Block{ public void setStats(){ super.setStats(); //TODO add drill speed stats + + stats.add(BlockStat.drillTier, tier, StatUnit.none); + stats.add(BlockStat.drillSpeed, 60f/drillTime, StatUnit.itemsSecond); } @Override 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 4437f70165..1173847e9b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -12,6 +12,7 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -56,11 +57,13 @@ public class GenericCrafter extends Block{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.craftSpeed, 60f/craftTime); - stats.add(BlockStat.outputItem, output.toString()); + stats.add(BlockStat.craftSpeed, 60f/craftTime, StatUnit.itemsSecond); + stats.add(BlockStat.outputItem, output); - if(inputLiquid != null) stats.add(BlockStat.inputLiquid, "{0} x {1}", inputLiquid, (int)(liquidUse * craftTime)); - if(inputItem != null) stats.add(BlockStat.inputItem, "{0} x {1}", inputItem, inputItem.amount); + if(inputLiquid != null) stats.add(BlockStat.inputLiquid, inputLiquid); + if(inputLiquid != null) stats.add(BlockStat.liquidUse, (liquidUse * craftTime), StatUnit.liquidSecond); + if(inputItem != null) stats.add(BlockStat.inputItem, inputItem); + if(hasPower) stats.add(BlockStat.powerUse, powerUse * 60f, StatUnit.powerSecond); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java index b230121294..285288b9c5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java @@ -8,6 +8,8 @@ import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.BarType; 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.StatUnit; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -34,6 +36,13 @@ public class Incinerator extends Block { bars.remove(BarType.liquid); } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.powerUse, powerUse * 60f, StatUnit.powerSecond); + } + @Override public void update(Tile tile) { IncineratorEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java index af6fb7aac5..bec6388a72 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java @@ -7,6 +7,8 @@ import io.anuke.mindustry.type.Liquid; 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.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Mathf; @@ -31,6 +33,25 @@ public class PowerCrafter extends Block{ hasItems = true; } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.inputItem, input); + + if(outputItem != null){ + stats.add(BlockStat.outputItem, outputItem); + } + + if(outputLiquid != null){ + stats.add(BlockStat.liquidOutput, outputLiquid); + } + + if(hasPower){ + stats.add(BlockStat.powerUse, 60f * powerUse, StatUnit.powerSecond); + } + } + @Override public void update(Tile tile) { GenericCrafterEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java b/core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java index a113a965f9..b6fb136c3f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java @@ -10,6 +10,8 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.values.ItemListValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -20,7 +22,6 @@ import io.anuke.ucore.util.Mathf; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.util.Arrays; public class PowerSmelter extends PowerBlock { protected final int timerDump = timers++; @@ -70,12 +71,12 @@ public class PowerSmelter extends PowerBlock { super.setStats(); //TODO input/outputs - stats.add(BlockStat.inputItems, Arrays.toString(inputs)); - stats.add(BlockStat.powerUse, powerUse * 60f); - stats.add(BlockStat.outputItem, result.toString()); - stats.add(BlockStat.craftSpeed, 60f/craftTime); - stats.add(BlockStat.inputItemCapacity, itemCapacity); - stats.add(BlockStat.outputItemCapacity, itemCapacity); + stats.add(BlockStat.inputItems, new ItemListValue(inputs)); + stats.add(BlockStat.powerUse, powerUse * 60f, StatUnit.powerSecond); + stats.add(BlockStat.outputItem, result); + stats.add(BlockStat.craftSpeed, 60f/craftTime, StatUnit.itemsSecond); + stats.add(BlockStat.inputItemCapacity, itemCapacity, StatUnit.items); + stats.add(BlockStat.outputItemCapacity, itemCapacity, StatUnit.items); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java index e5a4adba79..a5d9350499 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; @@ -35,7 +36,7 @@ public class Pump extends LiquidBlock{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.liquidOutput, 60f*pumpAmount); + stats.add(BlockStat.liquidOutput, 60f*pumpAmount, StatUnit.liquidSecond); } @Override 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 c0d33b99b0..4c3c981d69 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -7,6 +7,9 @@ import io.anuke.mindustry.type.Liquid; 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.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.values.ItemFilterValue; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; @@ -37,6 +40,24 @@ public class Separator extends Block { hasLiquids = true; } + @Override + public void setStats() { + super.setStats(); + + if(hasPower){ + stats.add(BlockStat.powerUse, powerUse * 60f, StatUnit.powerSecond); + } + + stats.add(BlockStat.liquidUse, liquidUse * 60f, StatUnit.liquidSecond); + stats.add(BlockStat.inputLiquid, liquid); + stats.add(BlockStat.outputItem, new ItemFilterValue(item -> { + for(Item i : results){ + if(item == i) return true; + } + return false; + })); + } + @Override public void draw(Tile tile) { super.draw(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java index 3574058f8d..303aded079 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java @@ -10,6 +10,8 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.values.ItemListValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -17,8 +19,6 @@ import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.util.Mathf; -import java.util.Arrays; - public class Smelter extends Block{ protected final int timerDump = timers++; protected final int timerCraft = timers++; @@ -55,13 +55,13 @@ public class Smelter extends Block{ public void setStats(){ super.setStats(); - stats.add(BlockStat.inputFuel, fuel.toString()); - stats.add(BlockStat.fuelBurnTime, burnDuration/60f); - stats.add(BlockStat.inputItems, Arrays.toString(inputs)); - stats.add(BlockStat.outputItem, result.toString()); - stats.add(BlockStat.craftSpeed, 60f/craftTime); - stats.add(BlockStat.inputItemCapacity, itemCapacity); - stats.add(BlockStat.outputItemCapacity, itemCapacity); + stats.add(BlockStat.inputFuel, fuel); + stats.add(BlockStat.fuelBurnTime, burnDuration/60f, StatUnit.seconds); + stats.add(BlockStat.inputItems, new ItemListValue(inputs)); + stats.add(BlockStat.outputItem, result); + stats.add(BlockStat.craftSpeed, 60f/craftTime, StatUnit.itemsSecond); + stats.add(BlockStat.inputItemCapacity, itemCapacity, StatUnit.items); + stats.add(BlockStat.outputItemCapacity, itemCapacity, StatUnit.items); } @Override 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 8ae2cc68c8..fd77cc75d2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -6,6 +6,8 @@ import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -27,6 +29,16 @@ public class SolidPump extends Pump { liquidRegion = name + "-liquid"; } + @Override + public void setStats() { + super.setStats(); + + stats.remove(BlockStat.liquidOutput); + + stats.add(BlockStat.powerUse, powerUse * 60f, StatUnit.powerSecond); + stats.add(BlockStat.liquidOutput, result); + } + @Override public void draw(Tile tile) { SolidPumpEntity entity = tile.entity(); 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 e81173ac45..5f9b4d848f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -21,6 +21,9 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.modules.InventoryModule; import io.anuke.mindustry.world.meta.BlockBar; +import io.anuke.mindustry.world.meta.BlockStat; +import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.values.ItemListValue; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; @@ -49,6 +52,15 @@ public class UnitFactory extends Block { solidifes = true; } + @Override + public void setStats() { + super.setStats(); + + stats.add(BlockStat.inputItems, new ItemListValue(requirements)); + stats.add(BlockStat.powerUse, powerUse * 60f, StatUnit.powerSecond); + stats.add(BlockStat.craftSpeed, produceTime/60f, StatUnit.seconds); + } + @Override public boolean isSolidFor(Tile tile) { UnitFactoryEntity entity = tile.entity(); diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStat.java b/core/src/io/anuke/mindustry/world/meta/BlockStat.java index af0354d2fd..2580c4c7bf 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStat.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStat.java @@ -1,5 +1,7 @@ package io.anuke.mindustry.world.meta; +import io.anuke.ucore.util.Bundles; + /**Describes one type of stat for a block.*/ public enum BlockStat { health(StatCategory.general), @@ -20,12 +22,15 @@ public enum BlockStat { maxPowerGeneration(StatCategory.power), inputLiquid(StatCategory.crafting), + liquidUse(StatCategory.crafting), inputItem(StatCategory.crafting), inputItems(StatCategory.crafting), inputFuel(StatCategory.crafting), fuelBurnTime(StatCategory.crafting), craftSpeed(StatCategory.crafting), outputItem(StatCategory.crafting), + drillTier(StatCategory.crafting), + drillSpeed(StatCategory.crafting), shootRange(StatCategory.shooting), inaccuracy(StatCategory.shooting), @@ -41,4 +46,8 @@ public enum BlockStat { BlockStat(StatCategory category) { this.category = category; } + + public String localized(){ + return Bundles.get("text.blocks." + name().toLowerCase()); + } } diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStats.java b/core/src/io/anuke/mindustry/world/meta/BlockStats.java index 9ff8b94bc0..a9659c6e97 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStats.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStats.java @@ -2,30 +2,51 @@ package io.anuke.mindustry.world.meta; import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.OrderedMap; +import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.meta.values.ItemValue; +import io.anuke.mindustry.world.meta.values.LiquidValue; +import io.anuke.mindustry.world.meta.values.NumberValue; +import io.anuke.mindustry.world.meta.values.StringValue; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Log; -import io.anuke.ucore.util.Strings; /**Hold and organizes a list of block stats.*/ public class BlockStats { - //TODO change back to true - private static final boolean errorWhenMissing = false; + private static final boolean errorWhenMissing = true; - private OrderedMap> map = new OrderedMap<>(); + private OrderedMap> map = new OrderedMap<>(); private boolean dirty; - /**Adds a single integer value with this stat.*/ - public void add(BlockStat stat, int value){ - add(stat, "" + value); - } - /**Adds a single float value with this stat, formatted to 2 decimal places.*/ - public void add(BlockStat stat, float value){ - add(stat, Strings.toFixed(value, 2)); + public void add(BlockStat stat, float value, StatUnit unit){ + add(stat, new NumberValue(value, unit)); } - /**Adds a formatted string with this stat.*/ - public void add(BlockStat stat, String format, Object... arguments){ + /**Adds an item value.*/ + public void add(BlockStat stat, Item item){ + add(stat, new ItemValue(new ItemStack(item, 1))); + } + + /**Adds a liquid value.*/ + public void add(BlockStat stat, Liquid liquid){ + add(stat, new LiquidValue(liquid)); + } + + + /**Adds an item value.*/ + public void add(BlockStat stat, ItemStack item){ + add(stat, new ItemValue(item)); + } + + /**Adds a single string value with this stat.*/ + public void add(BlockStat stat, String format, Object... args){ + add(stat, new StringValue(format, args)); + } + + /**Adds a stat value.*/ + public void add(BlockStat stat, StatValue value){ if(!Bundles.has("text.blocks." + stat.name().toLowerCase())){ if(!errorWhenMissing){ Log.err("Warning: No bundle entry for stat type \"" + stat + "\"!"); @@ -34,6 +55,14 @@ public class BlockStats { } } + if(!Bundles.has("text.category." + stat.category.name().toLowerCase())){ + if(!errorWhenMissing){ + Log.err("Warning: No bundle entry for stat cateogry \"" + stat.category + "\"!"); + }else{ + throw new RuntimeException("No bundle entry for stat category \"" + stat.category + "\"!"); + } + } + if(map.containsKey(stat.category) && map.get(stat.category).containsKey(stat)){ throw new RuntimeException("Duplicate stat entry: \"" +stat + "\""); } @@ -42,7 +71,7 @@ public class BlockStats { map.put(stat.category, new OrderedMap<>()); } - map.get(stat.category).put(stat, Strings.formatArgs(format, arguments)); + map.get(stat.category).put(stat, value); dirty = true; } @@ -57,11 +86,11 @@ public class BlockStats { dirty = true; } - public OrderedMap> toMap() { + public OrderedMap> toMap() { //sort stats by index if they've been modified if(dirty) { map.orderedKeys().sort(); - for (Entry> entry : map.entries()) { + for (Entry> entry : map.entries()) { entry.value.orderedKeys().sort(); } diff --git a/core/src/io/anuke/mindustry/world/meta/StatUnit.java b/core/src/io/anuke/mindustry/world/meta/StatUnit.java new file mode 100644 index 0000000000..c093d31fb3 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/StatUnit.java @@ -0,0 +1,22 @@ +package io.anuke.mindustry.world.meta; + +import io.anuke.ucore.util.Bundles; + +/**Defines a unit of measurement for block stats.*/ +public enum StatUnit { + blocks, + powerSecond, + liquidSecond, + itemsSecond, + pixelsSecond, + liquidUnits, + powerUnits, + degrees, + seconds, + none, + items; + + public String localized(){ + return Bundles.get("text.unit." + name().toLowerCase()); + } +} diff --git a/core/src/io/anuke/mindustry/world/meta/StatValue.java b/core/src/io/anuke/mindustry/world/meta/StatValue.java new file mode 100644 index 0000000000..7a6784ca88 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/StatValue.java @@ -0,0 +1,10 @@ +package io.anuke.mindustry.world.meta; + +import io.anuke.ucore.scene.ui.layout.Table; + +/**A base interface for a value of a stat that is displayed.*/ +public interface StatValue { + /**This method should all elements necessary to display this stat to the specified table. + * For example, a stat that is just text would add label to the table. */ + void display(Table table); +} diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java new file mode 100644 index 0000000000..60ac578f41 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java @@ -0,0 +1,32 @@ +package io.anuke.mindustry.world.meta.values; + +import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.function.Predicate; +import io.anuke.ucore.scene.ui.layout.Table; + +public class ItemFilterValue implements StatValue { + private final Predicate filter; + + public ItemFilterValue(Predicate filter) { + this.filter = filter; + } + + @Override + public void display(Table table) { + Array list = new Array<>(); + + for(Item item : Item.all()){ + if(filter.test(item)) list.add(item); + } + + for (int i = 0; i < list.size; i++) { + Item item = list.get(i); + table.addImage(item.region).size(8*3).padRight(2).padLeft(2); + if(i != list.size - 1){ + table.add("/"); + } + } + } +} diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java new file mode 100644 index 0000000000..1920f27f08 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java @@ -0,0 +1,35 @@ +package io.anuke.mindustry.world.meta.values; + +import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.scene.ui.layout.Table; + +public class ItemListValue implements StatValue{ + private final Item[] items; + private final ItemStack[] stacks; + + public ItemListValue(Item[] items) { + this.items = items; + this.stacks = null; + } + + public ItemListValue(ItemStack[] stacks) { + this.stacks = stacks; + this.items = null; + } + + @Override + public void display(Table table) { + if(items != null){ + for(Item item : items){ + table.addImage(item.region).size(8*3).padRight(5); + } + }else{ + for(ItemStack stack : stacks){ + table.add(new ItemImage(stack)).size(8*3).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 new file mode 100644 index 0000000000..5ba5d2219c --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemValue.java @@ -0,0 +1,20 @@ +package io.anuke.mindustry.world.meta.values; + +import io.anuke.mindustry.type.ItemStack; +import io.anuke.mindustry.ui.ItemImage; +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.scene.ui.layout.Table; + +public class ItemValue implements StatValue { + private final ItemStack item; + + public ItemValue(ItemStack item) { + this.item = item; + } + + @Override + public void display(Table table) { + //TODO better implementation, quantity support + table.add(new ItemImage(item)).size(8*3); + } +} diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java new file mode 100644 index 0000000000..caab4d3dab --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java @@ -0,0 +1,32 @@ +package io.anuke.mindustry.world.meta.values; + +import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.function.Predicate; +import io.anuke.ucore.scene.ui.layout.Table; + +public class LiquidFilterValue implements StatValue { + private final Predicate filter; + + public LiquidFilterValue(Predicate filter) { + this.filter = filter; + } + + @Override + public void display(Table table) { + Array list = new Array<>(); + + for(Liquid item : Liquid.all()){ + if(filter.test(item)) list.add(item); + } + + for (int i = 0; i < list.size; i++) { + Liquid item = list.get(i); + table.addImage("liquid-icon").color(item.color).size(8*3).padRight(2).padLeft(2); + 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 new file mode 100644 index 0000000000..382c51c1e0 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java @@ -0,0 +1,18 @@ +package io.anuke.mindustry.world.meta.values; + +import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.scene.ui.layout.Table; + +public class LiquidValue implements StatValue { + private final Liquid liquid; + + public LiquidValue(Liquid liquid) { + this.liquid = liquid; + } + + @Override + public void display(Table table) { + table.addImage("liquid-icon").color(liquid.color).size(8*3); + } +} diff --git a/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java b/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java new file mode 100644 index 0000000000..65f6a48a78 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java @@ -0,0 +1,31 @@ +package io.anuke.mindustry.world.meta.values; + +import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Strings; + +/**A stat that is a number with a unit attacked. + * The number is rounded to 2 decimal places by default.*/ +public class NumberValue implements StatValue{ + private final StatUnit unit; + private final float value; + + public NumberValue(float value, StatUnit unit) { + this.unit = unit; + this.value = value; + + if(unit.localized().contains("???")){ + throw new RuntimeException("No bundle definition found for unit: '" + unit + "'"); + } + } + + @Override + public void display(Table table) { + float diff = Math.abs((int)value - value); + int precision = diff <= 0.01f ? 0 : diff <= 0.1f ? 1 : 2; + + table.add(Strings.toFixed(value, precision)); + table.add(" " + unit.localized()); + } +} diff --git a/core/src/io/anuke/mindustry/world/meta/values/StringValue.java b/core/src/io/anuke/mindustry/world/meta/values/StringValue.java new file mode 100644 index 0000000000..1e3ab92fdd --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/StringValue.java @@ -0,0 +1,18 @@ +package io.anuke.mindustry.world.meta.values; + +import io.anuke.mindustry.world.meta.StatValue; +import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Strings; + +public class StringValue implements StatValue { + private final String value; + + public StringValue(String value, Object... args) { + this.value = Strings.formatArgs(value, args); + } + + @Override + public void display(Table table) { + table.add(value); + } +}