Compare commits

..
60 Commits
Author SHA1 Message Date
Anuken c569232e74 Fixed multiblocks not accepting items 2018-08-15 19:38:13 -04:00
Anuken 14c526d0c4 Power distribution fix 2018-08-15 18:41:21 -04:00
Anuken 5c4ac6b702 Fixed major issue with Vector2.ZERO mutation 2018-08-15 18:37:20 -04:00
Anuken d58cc18136 Fixed block targeting bug 2018-08-15 18:18:57 -04:00
Anuken 36c01fde94 Updated uCore / Minor server tweak 2018-08-15 17:46:33 -04:00
Anuken d4d9d59fe4 Server sector commands / World data compression / Snapshot sent w/ world 2018-08-15 17:25:19 -04:00
Anuken 8dbd0a6130 Fixed drones repairing incorrect blocks 2018-08-15 16:28:00 -04:00
Anuken 3746344cba Crash fixes 2018-08-15 16:26:08 -04:00
Anuken d07fd1bbfe Improved build sync 2018-08-15 15:16:56 -04:00
Anuken 02f95c0ed4 Merge remote-tracking branch 'origin/master' 2018-08-15 14:16:42 -04:00
Anuken c98fcbd795 Turrets target blocks / Added core no-build radius 2018-08-15 14:13:50 -04:00
Anuken d071877963 Merge pull request #186 from Leone25/patch-1
Big update for italian bundle
2018-08-15 13:12:18 -04:00
Anuken 0267cb4006 Conduit sprites improved / Fixed incorrect proximity update 2018-08-15 13:11:55 -04:00
Leone25 bf571e595c Update bundle_ita.properties 2018-08-15 19:05:18 +02:00
Anuken c0cad70212 Merge remote-tracking branch 'origin/master' 2018-08-15 10:49:05 -04:00
Anuken 7bd6dbb4b4 Partial korean font PR revert / Crash fixes 2018-08-15 10:48:19 -04:00
Anuken 6d932e3d04 Merge pull request #185 from Prosta4okua/patch-19
Update bundle_ru.properties
2018-08-15 09:20:41 -04:00
Prosta4okua e154b5179d Update bundle_ru.properties 2018-08-15 08:27:26 +03:00
Anuken 52110d6008 ok 2018-08-14 19:30:05 -04:00
Anuken 103b08fd1d Added build progress sync 2018-08-14 18:56:42 -04:00
Anuken cb09d10e7f Merge remote-tracking branch 'origin/master' 2018-08-14 18:51:13 -04:00
Anuken a041c1e60d Synced whole place queue / Fixed player flash desync 2018-08-14 18:51:06 -04:00
Anuken 586b4cf4bd Merge pull request #183 from cloud9350/master
Add korean chat fonts + fix typos
2018-08-14 18:32:52 -04:00
Leone25 d0ff149cca Update bundle_ita.properties 2018-08-14 21:07:39 +02:00
Anuken f8ddc8325c Fixed puddle/IO crash / crafter storage / player NaN position / red tint 2018-08-14 12:24:04 -04:00
Anuken 59ec09e82c Crash fixes / Resource-steal fixed / No-build while shooting fixed 2018-08-14 12:16:21 -04:00
Anuken 2ae5c96690 Merge remote-tracking branch 'origin/master' 2018-08-14 10:42:09 -04:00
Anuken fda9e6bb9c Various crashes fixed 2018-08-14 10:41:54 -04:00
Leone25 b70de81c2d Update bundle_ita.properties 2018-08-14 14:41:38 +02:00
Gureumi 5e89b2568f Add korean chat fonts + fix typos 2018-08-14 15:59:07 +09:00
Anuken ac1d8215ff Merge pull request #182 from Prosta4okua/patch-18
[COMPLETE]Update bundle_ru.properties
2018-08-13 22:21:06 -04:00
Leone25 fefc734bfa Update bundle_ita.properties 2018-08-12 22:24:10 +02:00
Prosta4okua 7f8735842c Update bundle_ru.properties 2018-08-12 22:28:23 +03:00
Prosta4okua a226983470 Update bundle_ru.properties 2018-08-12 19:19:07 +03:00
Prosta4okua 28526d0a12 Update bundle_ru.properties 2018-08-12 18:54:51 +03:00
Prosta4okua 913e005bae Update bundle_ru.properties 2018-08-12 10:44:56 +03:00
Prosta4okua 7bd9fd5bae Update bundle_ru.properties 2018-08-12 00:12:55 +03:00
Anuken ef936214f0 Merge pull request #180 from Prosta4okua/patch-17
[Complete]Update bundle_uk_UA.properties
2018-08-10 10:20:43 -04:00
Anuken 18fce6b3e3 Merge pull request #179 from cloud9350/master
Change items name texts and update font
2018-08-10 09:12:52 -04:00
Prosta4okua ecda4d74ab Update bundle_uk_UA.properties 2018-08-10 16:12:44 +03:00
Prosta4okua 31124037b5 Update bundle_uk_UA.properties 2018-08-10 16:07:46 +03:00
Prosta4okua aaf95e0756 Update bundle_uk_UA.properties 2018-08-10 16:06:01 +03:00
Gureumi 804e311875 Update 2018-08-10 19:21:46 +09:00
Anuken 61ad9bc47d Merge remote-tracking branch 'origin/master' 2018-08-09 22:20:52 -04:00
Anuken 2b23b7876a Minor bugfix 2018-08-09 22:20:46 -04:00
Anuken 547d334f43 Merge pull request #178 from Leone25/patch-1
update italian boundle_ita
2018-08-09 19:29:34 -04:00
Leone25 7432dc115e Update bundle_ita.properties 2018-08-10 00:48:20 +02:00
Anuken 905defe8ce Merge pull request #177 from Prosta4okua/patch-15
Update bundle_ru.properties
2018-08-09 18:35:44 -04:00
Prosta4okua 0a8ff0cde7 Update bundle_ru.properties 2018-08-10 00:59:27 +03:00
Prosta4okua bd5f44030e Update bundle_ru.properties 2018-08-10 00:53:41 +03:00
Anuken 79abb86262 Merge remote-tracking branch 'origin/master' 2018-08-09 17:45:09 -04:00
Anuken fe6f98ec5a Minor bugfixes / Added block names to bundle/ Autogen ore names 2018-08-09 17:44:52 -04:00
Anuken e39a856e54 Update TRANSLATING.md 2018-08-09 09:47:15 -04:00
Anuken 64e5f8155d Merge pull request #176 from cloud9350/patch-1
Update language ko file
2018-08-09 09:20:10 -04:00
Gureumi 8328b11f6b Update. 2018-08-09 19:54:09 +09:00
Anuken 15778b2ca5 Server hotfix 2018-08-08 22:37:52 -04:00
Anuken b7842014c1 Fixed minor autotile bug 2018-08-08 22:29:56 -04:00
Leone25 3acb843109 Update bundle_ita.properties 2018-08-07 21:48:42 +02:00
Leone25 1768aea66f Update bundle_ita.properties 2018-08-07 20:54:40 +02:00
Leone25 b4272e0387 Update bundle_ita.properties 2018-08-06 20:44:09 +02:00
72 changed files with 3712 additions and 3650 deletions
+2 -2
View File
@@ -7,7 +7,7 @@ To begin, log in to your GitHub account, or if you don't have one yet, create it
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
head over to the translation bundle folder and check the [list of bundles](https://github.com/Anuken/Mindustry/tree/master/core/assets/bundles) that have already been created.
You're looking for a file called "`bundle_`(insert locale code here)`.properties`".
You're looking for a file called "`bundle_`(insert locale code here)`.properties`". If you don't find one, create one manually (more info below).
#### Editing an existing translation
@@ -19,7 +19,7 @@ Once this is done, all you need to do is wait for me to approve your changes.
If a translation bundle for your language *doesn't* exist, you need to create one yourself.
In the folder with all the bundles in it, click the *'create new file'* button, and name it `bundle_(locale code here).properties`.
Then, copy-paste the entire contents of the [English translation bundle](https://raw.githubusercontent.com/Anuken/Mindustry/master/core/assets/bundles/bundle.properties) into the file, and translate all the necessary text to your language.
Once you are done, press the *propose new file* button at the bottom, then 'create pull request twice'.
Once you are done, press the *propose new file* button at the bottom, then 'create pull request' twice.
#### Useful Information
+1 -2
View File
@@ -26,7 +26,7 @@ allprojects {
appName = 'Mindustry'
gdxVersion = '1.9.8'
roboVMVersion = '2.3.0'
uCoreVersion = '9969ed07b1'
uCoreVersion = '76dc741b49'
getVersionString = {
String buildVersion = getBuildVersion()
@@ -169,7 +169,6 @@ project(":core") {
build.finalizedBy(finish)
def comp = System.properties["release"] == null || System.properties["release"] == "false"
if(!comp) println("Note: Compiling release build.")
if(new File(projectDir.parent, '../uCore').exists() && comp){
Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 267 B

+16 -1
View File
@@ -431,6 +431,21 @@ text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
block.tungsten-wall.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall
@@ -446,7 +461,7 @@ block.lancer.name=Lancer
block.conveyor.name=Conveyor
block.titanium-conveyor.name=Titanium Conveyor
block.junction.name=Junction
block.splitter.name=Splitter
block.splitter.name=Router
block.splitter.description=Outputs items into three different directions once they are recieved.
block.router.name=Router
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
+137 -137
View File
@@ -163,7 +163,7 @@ text.settings.game=Gioco
text.settings.sound=Suono
text.settings.graphics=Grafica
text.paused=In pausa
text.info.title=[Accent]Info
text.info.title=[accent] Info
text.error.title=[crimson]Si è verificato un errore
text.error.crashtitle=Si è verificato un errore
text.blocks.blockinfo=info sul blocco
@@ -330,106 +330,106 @@ text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
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.blocks.liquidoutput=Uscita liquidi
text.blocks.liquiduse=Uso liquidi
text.blocks.coolant=Refrigerante
text.blocks.coolantuse=uso refrigerante
text.blocks.inputliquidfuel=carburante liquido
text.blocks.liquidfueluse=Utilizzo carburante liquido
text.blocks.reload=Ricarica
text.blocks.inputfuel=Carburante
text.blocks.fuelburntime=Tempo combustione carburante
text.unit.blocks=blocchi
text.unit.powersecond=unità energia/secondo
text.unit.liquidsecond=unità liquide/secondo
text.unit.itemssecond=oggetti/secondo
text.unit.pixelssecond=pixel/secondo
text.unit.liquidunits=unità liquidi
text.unit.powerunits=unità energia
text.unit.degrees=gradi
text.unit.seconds=secondi
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.minimap.name=Show Minimap
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.name=Thorium
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
text.unit.items=oggetti
text.category.general=Generali
text.category.power=Energia
text.category.liquids=Liquidi
text.category.items=Oggetti
text.category.crafting=Produzione
text.category.shooting=Potenza di fuoco
setting.minimap.name=Mostra minimappa
content.item.name=Oggetti
content.liquid.name=Liquidi
content.unit-type.name=Unità
content.recipe.name=Blocchi
item.stone.description=UN materiale grezzo molto comune, che solitamente viene rifinito per ottenerne degli altri.
item.tungsten.name=Tungsteno
item.tungsten.description=Un materiale di strutturale molto comune, ma molto utile. Utilizzato in trapani e blocchi resistenti al calore come generatori e fonderie.
item.lead.name=Piombo
item.lead.description=Un materiale base, molto usato nei blocchi di trasporto.
item.coal.description=Un carburante comune e facilmente ottenibile.
item.carbide.name=Carburo
item.carbide.description=Una lega resistente realizzata con tungsteno e carbone. Utilizzato in blocchi di trasporto avanzati e trapani ad alto livello.
item.titanium.description=Un raro metallo super leggero usato ampiamente nel trasporto di liquidi, trapani e navi.
item.thorium.name=Torio
item.thorium.description=Un materiale denso e radioattivo, utilizzato nella costruzione di strutture e come carburante del reattore nucleare.
item.silicon.name=Silicio
item.silcion.description=Un semiconduttore molto utile che viene utilizzato nei pannelli solari e nei macchinari elettronici.
item.plastanium.name=Plastaniu
item.plastanium.description=Un materiale leggero e duttile, utilizzato nelle navi avanzete e come munizione.
item.phase-matter.name=Vaporizzatore di materia
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
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
item.biomatter.name=Biomateria
item.biomatter.description=Materiale organico; Utilizzato per essere convertito in petrolio o carburante.
item.sand.description=Un materiale base che viene altamente usato nei processi di fusione, Sia come lega che come lubrificante.
item.blast-compound.name=Polvere esplosiva
item.blast-compound.description=Un composto altamente volatile, utilizzato nella produzione di bombe ed esplosivi. Può essere utilizzato come combustibile anche se non è consigliato.
item.pyratite.name=Pirite
item.pyratite.description=Una sostanza molto infiammabile che viene utilizzata nelle armi a fuoco.
liquid.cryofluid.name=criogenium
text.item.explosiveness=[LIGHT_GRAY]Esplosività: {0}
text.item.flammability=[LIGHT_GRAY]Infiammabilità: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioattività: {0}
text.item.fluxiness=[LIGHT_GRAY]Portata: {0}
text.item.hardness=[LIGHT_GRAY]Durezza: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Capacità calorifica: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosità: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperatura: {0}
block.tungsten-wall.name=Muro di tungseno
block.tungsten-wall-large.name=Muro grande di tungsteno
block.carbide-wall.name=Muro di carburo
block.carbide-wall-large.name=Muro grande di carburo
block.thorium-wall.name=Muro di torio
block.thorium-wall-large.name=Muro grande di torio
block.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into three different directions once they are recieved.
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
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=
block.hail.name=Bombardiere
block.lancer.name=Idrogetto
block.titanium-conveyor.name=Nastro trasportatore potenziato
block.splitter.name=Divisore
block.splitter.description=Divide gli oggetti in 3 direzioni diverse.
block.router.description=Divide gli oggetti in 4 direzioni. Ha inventario proprio che viente utilizzato per conservare provvisoriamente oggetti.
block.distributor.name=Mega router
block.distributor.description=Un divisore che distribuisce oggetti su 8 lati.
block.sorter.description=Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati.
block.overflow-gate.name=splitter per eccesso
block.overflow-gate.description=Una combinazione di un divisore e di un router , che distribuisce sui suoi lati se la via centrale è bloccata.
block.bridgeconveyor.name=Nastro trasportatore sopraelevato
block.bridgeconveyor.description=Un nastro trasportatore che può passare sopra i blocchi, al massimo due.
block.arc-smelter.name=Fonderia ad arco
block.silicon-smelter.name=Fonderia per silicio
block.phase-weaver.name=Tessitore di fase
block.pulverizer.name=Polverizzatore
block.cryofluidmixer.name=Mixer liqidi
block.melter.name=Fonditore
block.incinerator.name=Inceneritore
block.biomattercompressor.name=Compostore
block.separator.name=Separatore
block.centrifuge.name=Centrifugatore
block.power-node.name=Snodo energetico
block.power-node-large.name=Snodo energetico grande
block.battery.name=Batteria
block.battery-large.name=Batteria grossa
block.combustion-generator.name=generatore a carbone
block.turbine-generator.name=Turbina
block.tungsten-drill.name=Estrattore con punta al tungsteno
block.carbide-drill.name=Estrattore con punta al carburo
@@ -441,7 +441,7 @@ block.delta-mech-factory.name=Fabbrica di mech
block.repairpoint.name=Punto di riparazione
block.resupplypoint.name=Punto di rifornimento
block.liquidtank.name=Tanica
block.bridgeconduit.name=Condotta sopraelevata
block.bridgeconduit.name=Condotto sopraelevato
block.mechanical-pump.name=Pompa meccanica
block.itemsource.name=Sorgente oggetti
block.itemvoid.name=Vuoto oggetti
@@ -468,51 +468,51 @@ block.javelin-ship-factory.name=Fabbrica ni navi
block.repair-point.name=Punto di riparazione
block.resupply-point.name=Punto di rifornimento
block.pulse-conduit.name=Condotta attiva
block.phase-conduit.name=Condotta ad alta velocità
block.phase-conduit.name=Condotto ad alta velocità
block.liquid-router.name=Distributore liquidi
block.liquid-tank.name=Tanica d'acqua
block.liquid-junction.name=Giunzione liquida
block.bridge-conduit.name=Condotta forzata sopraelevata
block.bridge-conduit.name=Condotta sopraelevata
block.rotary-pump.name=Pompa a turbina
block.nuclear-reactor.name=Reattore nucleare
text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.sector.gameover=This sector has been lost. Re-deploy?
text.sector.retry=Retry
text.wave.lasted=You lasted until wave [accent]{0}[].
text.credits.text=Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](Nel caso non te ne sia accorto, la traduzione del gioco non è completa.\n Chi di dovere sta lavorando più velocemente possibile per completarla!)
text.sector.gameover=Hai perso questo settore. Attaccare di nuovo?
text.sector.retry=Riprova
text.wave.lasted=Sei sopravvissuto fino all'onda [accent]{0}[].
text.mission=Mission:[LIGHT_GRAY] {0}
text.mission.complete=Mission complete!
text.mission.complete.body=Sector {0},{1} has been conquered.
text.mission.wave=Survive [accent]{0}[] waves.
text.mission.battle=Destroy the enemy base.
text.mission.resource=Obtain {0} x{1}
text.none=<none>
text.sector.corrupted=[orange]A save file for this sector was found, but loading failed.\nA new one has been created.
setting.fpscap.name=Max FPS
setting.fpscap.none=None
text.mission.complete=Missione completata!
text.mission.complete.body=Il settore {0},{1} è stato conquistato.
text.mission.wave=Sopravvivi a [accent]{0}[] onda/e.
text.mission.battle=Distruggi la base del nemico.
text.mission.resource=Ottieni {0} x{1}
text.none=<Niente . . . >
text.sector.corrupted=[orange]Un file per questo settore è stato trovato, ma è fallito il caricamnto.\nQuindi ne è stato creato uno nuovo.
setting.fpscap.name=Limite FPS
setting.fpscap.none=Niente
setting.fpscap.text={0} FPS
mode.sandbox.warning=Note that blocks cannot be used in sandbox mode until they are unlocked in other modes.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
text.unit.health=[LIGHT_GRAY]Health: {0}
text.unit.speed=[LIGHT_GRAY]Speed: {0}
block.drone-pad.name=Drone Pad
block.fabricator-pad.name=Fabricator Pad
block.interceptor-pad.name=Interceptor Pad
block.monsoon-pad.name=Monsoon Pad
block.command-center.name=Command Center
block.mass-driver.name=Mass Driver
mode.sandbox.warning=Nota che questo blocco non può essere utilizzato in modalità sandbox e non lo sblocchi .\n\n[LIGHT_GRAY]Se non hai sbloccato alcun blocco, non ne comparirà nessuno.
text.unit.health=[LIGHT_GRAY]Vita: {0}
text.unit.speed=[LIGHT_GRAY]Velocità: {0}
block.drone-pad.name=Base del drone
block.fabricator-pad.name=Base del costruttore
block.interceptor-pad.name=Bese dell'intercettatore
block.monsoon-pad.name=Base del vento del nord
block.command-center.name=Centro di comando
block.mass-driver.name=Lancia materiali
block.blast-drill.name=Blast Drill
block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
block.thermal-pump.name=Pompa termica
block.dagger-pad.name=Pad pericolo
block.titan-pad.name=pad titano
block.thermal-generator.name=Generatore termico
unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
unit.monsoon.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo.
unit.interceptor.name=Interceptor
unit.interceptor.description=A fast, hit-and-run strike unit. Uses lead as ammo.
unit.drone.description=Un'unità base, che mina e costruisce.
unit.fabricator.name=Costruttore
unit.fabricator.description=Un drone molto avanzato che raccoglie minerali e costruisce molto meglio e più velocemente di un drone base.
unit.scout.name=Esploratore
unit.scout.description=Un unità di base a terra. Usa piombo come munizioni.
unit.titan.name=Titano
unit.titan.description=Un'unità di terra corazzata avanzata. Utilizza carburo come munizione. Attacca sia bersagli terrestri che aerei.
unit.monsoon.name=Monsone
unit.monsoon.description=Un bombardiere molto potente, che raderà al suolo chiunque gli passi davanti.
unit.interceptor.name=Intercettatore
unit.interceptor.description=Un veloce ed efficiente torretta che funziona con il piombo.
+205 -173
View File
@@ -3,8 +3,8 @@ text.discord=Mindustry Discord 에 참여하세요!
text.link.discord.description=공식 Mindustry Discord 채팅방
text.link.github.description=게임 소스코드
text.link.dev-builds.description=개발중인 빌드
text.link.trello.description=다음 계획된 기능들을 게시한 공식 trello 보드
text.link.itch.io.description=PC 버전 다운로드 HTML5 버전이 있는 itch.io 사이트
text.link.trello.description=다음 출시될 기능들을 게시한 공식 Trello 보드
text.link.itch.io.description=PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트
text.link.google-play.description=Google 플레이 스토어 등록 정보
text.link.wiki.description=공식 Mindustry 위키
text.linkfail=링크를 여는데 실패했습니다!URL이 기기의 클립보드에 복사되었습니다.
@@ -12,7 +12,7 @@ text.editor.web=HTML5 버전은 에디터 기능을 지원하지 않습니다!
text.web.unsupported=HTML5 버전은 이 기능을 지원하지 않습니다!게임을 다운로드 한 뒤에 사용 해 주세요.
text.gameover=코어가 터졌습니다. 게임 오버!
text.highscore=[YELLOW]최고점수 달성!
text.level.highscore=최고 점수 : [accent]{0}
text.level.highscore=최고 점수:[accent]{0}
text.level.delete.title=삭제 확인
text.map.delete=정말로 "[orange]{0}[]" 맵을 삭제하시겠습니까?
text.level.select=맵 선택
@@ -22,7 +22,7 @@ text.construction=[accent]블록 배치 모드[]를 선택하셨습니다.\n\n
text.deconstruction.title=블록 삭제 안내서
text.deconstruction=[accent]블록 삭제 모드[]를 선택하셨습니다\n블록을 삭제하고 싶다면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 파괴 작업을 진행할 것입니다.\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요- [accent]블록을 넓은 범위로 삭제[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.- [accent]블록 삭제 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다.
text.showagain=다음 세션에서 이 메세지를 표시하지 않습니다
text.unlocks=잠금 해제
text.unlocks=아이템들
text.savegame=게임 저장
text.loadgame=게임 불러오기
text.joingame=게임 참가
@@ -32,11 +32,11 @@ text.maps=맵
text.maps.none=[LIGHT_GRAY]맵을 찾을 수 없습니다!
text.about.button=정보
text.name=이름:
text.unlocked=새 블록이 잠금 해제되었습니다!
text.unlocked.plural=새 블록이 잠금 해제되었습니다!
text.players={0} 플레이어 온라인
text.players.single={0} 플레이어 온라인
text.server.mismatch=패킷 오류: 클라이언트와 서버 버전이 일치하지 않습니다.자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요!
text.unlocked=새 블록 잠금 해제
text.unlocked.plural=새 블록 잠금 해제
text.players=현재 {0}명 접속중
text.players.single=현재 {0}명만 있음.
text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니다. 자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요!
text.server.closing=[accent]서버 닫는중...
text.server.kicked.kick=당신은 서버에서 추방되었습니다!
text.server.kicked.fastShoot=당신은 총을 너무 빨리 발사했습니다.
@@ -44,13 +44,13 @@ text.server.kicked.invalidPassword=알 수 없는 비밀번호 입니다!
text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요!
text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다.
text.server.kicked.recentKick=당신은 방금 추방처리 되었습니다.잠시 기다린 후에 접속 해 주세요.
text.server.kicked.recentKick=당신은 방금 추방처리 되었습니다. 잠시 기다린 후에 접속 해 주세요.
text.server.kicked.nameInUse=이 닉네임이 이미 서버에서 사용중입니다.
text.server.kicked.nameEmpty=닉네임에는 반드시 영어 또는 숫자가 있어야 합니다.
text.server.kicked.idInUse=당신은 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다.
text.server.kicked.customClient=이 서버는 커스텀 빌드를 지원하지 않습니다. 공식 버전을 사용하세요.
text.host.info=[accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 과 [scarlet]6568[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고 : LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요.
text.join.info=여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고 : 여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다.
text.host.info=[accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 과 [scarlet]6568[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고:LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요.
text.join.info=여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다.
text.hostserver=서버 열기
text.host=호스트
text.hosting=[accent]서버 여는중..
@@ -60,28 +60,28 @@ text.server.refreshing=서버 목록 새로고치는중...
text.hosts.none=[lightgray]LAN 게임을 찾을 수 없습니다!
text.host.invalid=[scarlet]서버에 연결할 수 없습니다!
text.trace=플레이어 추적
text.trace.playername=플레이어 이름: [accent]{0}
text.trace.ip=IP : [accent]{0}
text.trace.id=고유 ID: [accent]{0}
text.trace.android=Android 클라이언트 : [accent]{0}
text.trace.modclient=수정된 클라이언트 : [accent]{0}
text.trace.totalblocksbroken=총 블럭 파괴 수: [accent]{0}
text.trace.structureblocksbroken=총 구조 블럭 파괴 수: [accent]{0}
text.trace.lastblockbroken=마지막으로 파괴한 블럭: [accent]{0}
text.trace.totalblocksplaced=총 설치한 블럭 수: [accent]{0}
text.trace.lastblockplaced=마지막으로 설치한 블록: [accent]{0}
text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry 으로 버그 보고서를 제출 해 주세요.
text.trace.playername=이름:[accent]{0}
text.trace.ip=IP:[accent]{0}
text.trace.id=고유 ID:[accent]{0}
text.trace.android=Android 클라이언트:[accent]{0}
text.trace.modclient=수정된 클라이언트:[accent]{0}
text.trace.totalblocksbroken=총 블럭 파괴 개수:[accent]{0}
text.trace.structureblocksbroken=구조 블럭 파괴 수:[accent]{0}
text.trace.lastblockbroken=마지막으로 파괴한 블럭:[accent]{0}
text.trace.totalblocksplaced=총 설치한 블럭 개수:[accent]{0}
text.trace.lastblockplaced=마지막으로 설치한 블록:[accent]{0}
text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요.
text.server.bans=차단된 유저
text.server.bans.none=차단된 플레이어가 없습니다.
text.server.admins=관리자들
text.server.admins=관리자
text.server.admins.none=관리자가 없습니다!
text.server.add=서버 추가
text.server.delete=이 서버를 삭제 하시겠습니까?
text.server.hostname=호스트: {0}
text.server.hostname=호스트:{0}
text.server.edit=서버 수정
text.server.outdated=[crimson]서버 버전이 낮습니다![]
text.server.outdated.client=[Crimson]클라이언트 버전이 낮습니다![]
text.server.version=[lightgray]버전 : {0}
text.server.version=[lightgray]서버 버전:{0}
text.server.custombuild=[yellow]커스텀 서버
text.confirmban=이 플레이어를 차단하시겠습니까?
text.confirmunban=이 플레이어를 차단하시겠습니까?
@@ -90,14 +90,14 @@ text.confirmunadmin=이 플레이어의 관리자 상태를 해제하시겠습
text.joingame.title=게임 참가
text.joingame.ip=IP:
text.disconnect=서버와 연결이 해제되었습니다.
text.disconnect.data=맵 데이터를 불러오지 못했습니다!
text.disconnect.data=맵 데이터를 받아오는데 실패했습니다.
text.connecting=[accent]연결중...
text.connecting.data=[accent]월드 데이터 로딩중...
text.connecting.data=[accent]맵 데이터 다운로드중...
text.connectfail=[crimson]{0}[orange] 서버에 연결하지 못했습니다.[]
text.server.port=포트:
text.server.addressinuse=이 주소는 이미 사용중입니다!
text.server.invalidport=포트 번호가 잘못되었습니다.
text.server.error=[crimson]{0}[orange]서버를 호스팅 하는데 오류가 발생했습니다.[]
text.server.error=[crimson]{0}[orange]서버를 여는데 오류가 발생했습니다.[]
text.save.new=새로 저장\n
text.save.overwrite=이 저장 슬롯을 덮어씌우겠습니까?\n
text.overwrite=덮어쓰기\n
@@ -108,8 +108,8 @@ text.save.delete.confirm=이 저장파일을 삭제 하시겠습니까?\n
text.save.delete=삭제\n
text.save.export=저장파일 내보내기\n
text.save.import.invalid=[orange]저장 상태가 정상이 아닙니다!
text.save.import.fail=[crimson]저장파일을 불러오지 못함: [orange]{0}\n
text.save.export.fail=[crimson]저장파일을 내보내지 못함: [orange]{0}
text.save.import.fail=[crimson]저장파일을 불러오지 못함:[orange]{0}\n
text.save.export.fail=[crimson]저장파일을 내보내지 못함:[orange]{0}
text.save.import=저장파일 불러오기\n
text.save.newslot=저장 파일이름 :\n
text.save.rename=이름 변경\n
@@ -120,11 +120,11 @@ text.save.corrupted=[orange]세이브 파일이 손상되었거나 잘못된 파
text.empty=<비어있음>\n
text.on=켜기\n
text.off=끄기\n
text.save.autosave=자동저장: {0}
text.save.map=맵 : {0}
text.save.wave={0} 웨이브
text.save.difficulty=난이도: {0}
text.save.date=마지막 저장 날짜 : {0}
text.save.autosave=자동저장:{0}
text.save.map=맵:{0}
text.save.wave={0}단계
text.save.difficulty=난이도:{0}
text.save.date=마지막 저장 날짜:{0}
text.confirm=확인
text.delete=삭제\n
text.ok=승인
@@ -143,10 +143,10 @@ text.changelog.current=[orange][[현재 버전]
text.changelog.latest=[orange][[최신 버전]
text.loading=[accent]불러오는중...
text.saving=[accent]저장중...\n
text.wave=[orange]{0} 웨이브
text.wave.waiting=다음 웨이브 시작까지 {0}초
text.waiting=기다리는중...
text.enemies=남은 몹 : {0}
text.wave=[orange]{0}단계
text.wave.waiting=다음 단계 시작까지 {0}초
text.waiting=대기중...
text.enemies=남은 몹:{0}
text.enemies.single=몹이 {0}마리 남아있음
text.loadimage=사진 불러오기
text.saveimage=사진 저장
@@ -166,7 +166,7 @@ text.editor.description=설명:
text.editor.name=이름:
text.editor.teams=팀
text.editor.elevation=높이
text.editor.badsize=[orange]사진 크기가 잘못되었습니다![]유효한 맵 크기 : {0}
text.editor.badsize=[orange]사진 크기가 잘못되었습니다![]유효한 맵 크기:{0}
text.editor.errorimageload=[orange]{0}[] 파일을 불러오는데 오류가 발생했습니다.
text.editor.errorimagesave=[orange]{0}[] 파일 저장중 오류가 발생했습니다.
text.editor.generate=생성
@@ -203,9 +203,9 @@ text.menu=메뉴
text.play=플레이
text.load=불러오기
text.save=저장
text.fps={0} FPS
text.tps={0} TPS
text.ping=핑 : {0}ms
text.fps={0}FPS
text.tps={0}TPS
text.ping={0}ms
text.language.restart=언어를 변경하려면 게임을 다시 시작 해 주세요.
text.settings.language=언어
text.settings=설정
@@ -227,50 +227,50 @@ text.error.title=[crimson]오류가 발생했습니다.
text.error.crashtitle=오류가 발생했습니다.
text.blocks.blockinfo=블록 정보
text.blocks.powercapacity=최대 전력 용량
text.blocks.powershot=1발당 파워 소모량
text.blocks.targetsair=표적 공기
text.blocks.powershot=1발당 전력 소모량
text.blocks.targetsair=공중공격 가능
text.blocks.itemspeed=유닛 이동 속도
text.blocks.shootrange=공격 범위
text.blocks.shootrange=사거리
text.blocks.size=블록 크기
text.blocks.liquidcapacity=최대 액체 용량
text.blocks.maxitemssecond=최대 아이템 보관량
text.blocks.powerrange=전력 범위
text.blocks.poweruse=전력 사용
text.blocks.inputitemcapacity=입력 아이템 용량
text.blocks.outputitemcapacity=입력 아이템 용량
text.blocks.itemcapacity=품목 용량
text.blocks.outputitemcapacity=출력 아이템 용량
text.blocks.itemcapacity=저장 용량
text.blocks.maxpowergeneration=최대 발전량
text.blocks.powertransferspeed=전력 전송량
text.blocks.craftspeed=생산 속도
text.blocks.inputliquid=입력 액체
text.blocks.inputliquid=사용되는 액체
text.blocks.inputliquidaux=보조 액체
text.blocks.inputitem=입력 아이템
text.blocks.inputitems=입력 아이템들
text.blocks.inputitem=사용되는 아이템
text.blocks.inputitems=사용되는 아이템들
text.blocks.outputitem=출력 아이템
text.blocks.drilltier=드릴
text.blocks.drillspeed=기본 드릴 속도
text.blocks.liquidoutput=액체 출력
text.blocks.liquiduse=액체 사용
text.blocks.liquiduse=액체 사용량
text.blocks.coolant=냉각제
text.blocks.coolantuse=냉각수 사용
text.blocks.inputliquidfuel=연료 액
text.blocks.liquidfueluse=액체 연료 사용
text.blocks.explosive=이게 터지면 펑 터지면서 주변 블록에게 피해를 입힙니다!
text.blocks.health=체력
text.blocks.inaccuracy=빗맞을 확률
text.blocks.shots=총알
text.blocks.inaccuracy=오차각
text.blocks.shots=발포 횟수
text.blocks.reload=재장전
text.blocks.inputfuel=연료
text.blocks.fuelburntime=연료 연소 시간
text.blocks.inputcapacity=입력 용량
text.blocks.outputcapacity=출력 용량
text.unit.blocks=블록들
text.unit.powersecond=초당 전력 단위
text.unit.liquidsecond=액체 단위 / 초
text.unit.itemssecond=항목 / 초
text.unit.blocks=블록
text.unit.powersecond=전력/초
text.unit.liquidsecond=액체/초
text.unit.itemssecond=개/초
text.unit.pixelssecond=초당 픽셀
text.unit.liquidunits=액상 단위
text.unit.powerunits=전원 장치
text.unit.liquidunits=
text.unit.powerunits=전력
text.unit.degrees=도
text.unit.seconds=초
text.unit.none=
@@ -280,12 +280,12 @@ text.category.power=전력
text.category.liquids=액체
text.category.items=아이템
text.category.crafting=제작
text.category.shooting=발사
text.category.shooting=사격
setting.difficulty.easy=쉬움
setting.difficulty.normal=보통
setting.difficulty.hard=어려움
setting.difficulty.insane=[#1E90FF]K[#ADFF2F]O[#FFB6C1]R[#B0C4DE]E[#FF4500]A
setting.difficulty.purge=[#1E90FF]K[#ADFF2F]O[#FFB6C1]R[#B0C4DE]E[#FF4500]A
setting.difficulty.name=난이도:
setting.screenshake.name=화면 흔들기
setting.indicators.name=적 위치 표시 화살표
@@ -304,7 +304,9 @@ setting.musicvol.name=음악 크기
setting.mutemusic.name=음소거
setting.sfxvol.name=효과음 크기
setting.mutesound.name=소리 끄기
text.keybind.title=키 바인딩
keybind.move_x.name=오른쪽/왼쪽 이동
keybind.move_y.name=위쪽/아래쪽 이동
keybind.select.name=선택
@@ -319,22 +321,25 @@ keybind.chat.name=채팅
keybind.player_list.name=플레이어 목록
keybind.console.name=콘솔
keybind.rotate.name=회전
mode.text.help.title=도움말
mode.waves.name=웨이브
mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 웨이브가 시작됩니다.
mode.waves.name=단계
mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다.
mode.sandbox.name=샌드박스
mode.sandbox.description=무한한 자원과 다음 웨이브 시작을 위한 타이머가 없습니다.
mode.sandbox.description=무한한 자원과 다음단계 시작을 위한 타이머가 없습니다.
mode.freebuild.name=자유 건축
mode.freebuild.description=제한된 자원과 다음 웨이브 시작을 위한 타이머가 없습니다.
mode.freebuild.description=제한된 자원과 다음단계 시작을 위한 타이머가 없습니다.
content.item.name=아이템
content.liquid.name=액체
content.unit-type.name=종류
content.recipe.name=블록들
content.recipe.name=블록
item.stone.name=돌
item.stone.description=흔히 찾을 수 있는 자원. 바닥에서 돌을 캐거나 용암을 사용하여 얻을 수 있습니다.
item.tungsten.name=텅스텐
item.tungsten.description=일반적이지만 매우 유용한 건축 재료. 드릴 및 생산 건물, 제련소와 같은 내열성 블록에 사용됩니다.
item.lead.name=리드
item.lead.name=납
item.lead.description=기본적인 시작 자원. 전자 및 액체 수송 블록에서 광범위하게 사용됩니다.
item.coal.name=석탄
item.coal.description=일반적이고 쉽게 이용할 수 있는 연료.
@@ -345,91 +350,109 @@ item.titanium.description=물 운반이나 드릴, 비행기등에서 재료로
item.thorium.name=토륨
item.thorium.description=건물 탄약 또는 핵연료로 사용되는 방사성 금속.
item.silicon.name=실리콘
item.silcion.description=매우 유용한 반도체로, 태양 전지 패널과 복잡한 전자 제품에 응용할 수 있습니다.
item.silcion.description=매우 유용한 반도체로, 태양 전지판과 복잡한 전자 제품에 응용할 수 있습니다.
item.plastanium.name=플라스타늄
item.plastanium.description=고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료.
item.phase-matter.name=메타
item.surge-alloy.name=설합금
item.surge-alloy.name=설탕
item.biomatter.name=바이오메터
item.biomatter.description=이것은 유기농 덤불입니다! 석유로 전환하거나 기본 연료로 사용됩니다.
item.sand.name=모래
item.sand.description=합금 및 플럭스 모두에서 제련시 광범위하게 사용되는 일반적인 재료.
item.sand.description=합금 및 플렉스 모두에서 제련시 광범위하게 사용되는 일반적인 재료.
item.blast-compound.name=폭발 화합물
item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물.연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다.
item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물. 이 연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다.
item.pyratite.name=피러레이트
item.pyratite.description=화염 무기에 사용되는 엄청난 가연성 물질.
liquid.water.name=물
liquid.lava.name=용암
liquid.oil.name=석유
liquid.cryofluid.name=크라이오플루드
text.item.explosiveness=[LIGHT_GRAY]폭발력 : {0}
text.item.flammability=[LIGHT_GRAY]인화성 : {0}
text.item.radioactivity=[LIGHT_GRAY]방사능 : {0}
text.item.fluxiness=[LIGHT_GRAY]플렉스 파워 : {0}
text.item.hardness=[LIGHT_GRAY]강도 : {0}
text.liquid.heatcapacity=[LIGHT_GRAY]발열 용량 : {0}
text.liquid.viscosity=[LIGHT_GRAY]점도 : {0}
text.liquid.temperature=[LIGHT_GRAY]온도 : {0}
liquid.cryofluid.name=냉각수
text.item.explosiveness=[LIGHT_GRAY]폭발력:{0}
text.item.flammability=[LIGHT_GRAY]인화성:{0}
text.item.radioactivity=[LIGHT_GRAY]방사능:{0}
text.item.fluxiness=[LIGHT_GRAY]플렉스 파워:{0}
text.item.hardness=[LIGHT_GRAY]강도:{0}
text.liquid.heatcapacity=[LIGHT_GRAY]발열량:{0}
text.liquid.viscosity=[LIGHT_GRAY]점도:{0}
text.liquid.temperature=[LIGHT_GRAY]온도:{0}
block.deepwater.name=깊은물
block.water.name=물
block.lava.name=용암
block.oil.name=석유
block.blackstone.name=검은돌
block.stone.name=돌
block.dirt.name=흙
block.sand.name=모래
block.ice.name=얼음
block.snow.name=눈
block.grass.name=잔디
block.shrub.name=관목
block.rock.name=바위
block.blackrock.name=검은바위
block.icerock.name=얼음바위
block.tungsten-wall.name=텅스텐 벽
block.tungsten-wall-large.name=큰 텅스텐 벽
block.carbide-wall.name=합금벽
block.carbide-wall-large.name=대형 합금벽
block.thorium-wall.name=토룸 벽
block.thorium-wall-large.name=대형 토륨 벽
block.thorium-wall.name=토룸벽
block.thorium-wall-large.name=대형 토륨벽
block.door.name=문
block.door-large.name=큰 문
block.duo.name=샷건
block.door-large.name=대형문
block.duo.name=듀오
block.scorch.name=스코치
block.hail.name=헤일
block.lancer.name=랜서
block.conveyor.name=컨베이어
block.titanium-conveyor.name=티타늄 컨베이어
block.junction.name=교차기
block.splitter.name=스플리터
block.splitter.name=분배기
block.splitter.description=아이템을 넣는 즉시 컨베이어를 반대 방향으로 바꾼 후 내보냅니다.
block.router.name=분배기
block.router.description=아이템을 넣으면 다른 방향으로 아이템을 번갈아서 내보냅니다.
block.distributor.name=디스토이어
block.distributor.description=아이템을 8방향으로 나눌 수있는 스플리터.
block.distributor.name=대형 분배기
block.distributor.description=아이템을 8방향으로 나눌 수 있는 대형 분배기.
block.sorter.name=필터
block.sorter.description=아이템을 받아서 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다.
block.sorter.description=아이템을 넣어서 필터에 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다.
block.overflow-gate.name=오버플로 게이트
block.overflow-gate.description=정면 경로가 차단된 경우 왼쪽과 오른쪽으로만 출력하는 복합 스플리터와 분배기 입니다.
block.overflow-gate.description=정면 경로가 차단된 경우 왼쪽과 오른쪽으로만 출력하는 복합 분배기입니다.
block.bridgeconveyor.name=터널
block.bridgeconveyor.description=최대 2블록을 건너 뛰고 자원을 운반하게 해 주는 블럭.
block.smelter.name=제련소
block.arc-smelter.name=아크 제련소
block.arc-smelter.name=대형 제련소
block.silicon-smelter.name=실리콘 제련소
block.phase-weaver.name=펄스 위버
block.phase-weaver.name=메타 합성기
block.pulverizer.name=분쇄기
block.cryofluidmixer.name=크라이오플루드 혼합기
block.melter.name=멜터
block.cryofluidmixer.name=냉각수 혼합기
block.melter.name=융해기
block.incinerator.name=소각로
block.biomattercompressor.name=바이오매터 압축기
block.biomattercompressor.name=바이오메터 압축기
block.separator.name=셉터
block.centrifuge.name=원심 분리기
block.power-node.name=전력 노드
block.power-node-large.name=대형 전력 노드
block.power-node.name=전력 송신기
block.power-node-large.name=대형 전력 송신기
block.battery.name=배터리
block.battery-large.name=대형 배터리
block.combustion-generator.name=연소 발전기
block.combustion-generator.name=석탄 발전기
block.turbine-generator.name=터빈 발전기
block.tungsten-drill.name=텅스텐 드릴
block.carbide-drill.name=합금 드릴
block.laser-drill.name=레이저 드릴
block.water-extractor.name=물 추출기
block.cultivator.name=경운기
block.dart-ship-factory.name=다트 선박 공장
block.delta-mech-factory.name=델타 메크 공장
block.cultivator.name=온실
block.dart-ship-factory.name=비행기 공장
block.delta-mech-factory.name=샷건 공장
block.repairpoint.name=수리 포인트
block.resupplypoint.name=재공급 포인트
block.conduit.name=도관
block.pulseconduit.name=펄스 도관
block.conduit.name=파이프
block.pulseconduit.name=퓨즈 파이프
block.liquidrouter.name=액체 분배기
block.liquidtank.name=물탱크
block.liquidjunction.name=액체 교차기
block.bridgeconduit.name=브릿지 도관
block.mechanical-pump.name=기계 펌프
block.bridgeconduit.name=브릿지 파이프
block.mechanical-pump.name=기계식 펌프
block.itemsource.name=아이템 소스
block.itemvoid.name=아이템 무효
block.liquidsource.name=액체 소스
@@ -437,82 +460,91 @@ block.powervoid.name=무효 전력
block.powerinfinite.name=무한한 힘
block.unloader.name=언로더
block.sortedunloader.name=정렬된 언로더
block.vault.name=Vault
block.wave.name=웨이브
block.swarmer.name=스워머
block.vault.name=창고
block.wave.name=파도
block.swarmer.name=스웜
block.salvo.name=살보
block.ripple.name=라이플
block.phase-conveyor.name=펄스 컨베이어
block.ripple.name=립플
block.phase-conveyor.name=메타 컨베이어
block.bridge-conveyor.name=터널
block.plastanium-compressor.name=플라스터늄 압축기
block.pyratite-mixer.name=피터레이트 혼합기
block.blast-mixer.name=블래스트 혼합기
block.blast-mixer.name=폭발 화합물 혼합기
block.solidifer.name=고체
block.solar-panel.name=태양 전지 패널
block.solar-panel.name=태양 전지판
block.solar-panel-large.name=대형 태양 전지판
block.oil-extractor.name=오일 추출기
block.javelin-ship-factory.name=창 던지기 선박 공장
block.repair-point.name=수리 점
block.resupply-point.name=재 공급 포인트
block.pulse-conduit.name=펄스 도관
block.phase-conduit.name=위상 도관
block.liquid-router.name=액체 라우터
block.liquid-tank.name=액체 탱크
block.oil-extractor.name=석유 추출기
block.javelin-ship-factory.name=전투기 공장
block.repair-point.name=정비소
block.resupply-point.name=탄약 보급소
block.pulse-conduit.name=퓨즈 파이프
block.phase-conduit.name=메타 파이프
block.liquid-router.name=액체 분배기
block.liquid-tank.name=물탱크
block.liquid-junction.name=액체 교차기
block.bridge-conduit.name=브릿지 도관
block.rotary-pump.name=로타리 펌프
block.nuclear-reactor.name=핵발전소
block.bridge-conduit.name=다리 파이프
block.rotary-pump.name=동력 펌프
block.nuclear-reactor.name=원자로
text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
text.sector.deploy=Deploy
text.sector.resume=Resume
text.sector.locked=[scarlet][[Incomplete]
text.sector.unexplored=[accent][[Unexplored]
text.close=Close
text.save.playtime=Playtime: {0}
text.editor.brush=Brush
text.customgame=커스텀 게임
text.campaign=캠페인
text.sectors=구역
text.sector=선택된 구역:[LIGHT_GRAY]{0}
text.sector.time=시간:[LIGHT_GRAY]{0}
text.sector.deploy=배치
text.sector.resume=계속하기
text.sector.locked=[scarlet][[완료안됨]
text.sector.unexplored=[accent][[탐색안됨]
text.close=닫기
text.save.playtime=플레이시간:{0}
text.editor.brush=브러쉬
text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.sector.gameover=This sector has been lost. Re-deploy?
text.sector.retry=Retry
text.wave.lasted=You lasted until wave [accent]{0}[].
setting.fpscap.name=Max FPS
setting.fpscap.none=None
text.sector.gameover=이 구역을 잃었습니다. 다시 배치하시겠습니까?
text.sector.retry=다시할꺼임
text.wave.lasted=[accent]{0}[] 까지 버티셨습니다.
setting.fpscap.name=최대 FPS
setting.fpscap.none=없음
setting.fpscap.text={0} FPS
block.command-center.name=Command Center
text.mission=Mission:[LIGHT_GRAY] {0}
text.mission.wave=Survive [accent]{0}[] waves.
text.mission.battle=Destroy the enemy base.
text.none=<none>
text.sector.corrupted=[orange]A save file for this sector was found, but loading failed.\nA new one has been created.
text.mission.complete=Mission complete!
text.mission.complete.body=Sector {0},{1} has been conquered.
block.command-center.name=명령 본부
text.mission=목표:[LIGHT_GRAY] {0}
text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요.
text.mission.battle=적 본부를 파괴하세요.
text.none=<없음>
text.sector.corrupted=[orange]저장 파일에서 구역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다.
text.mission.complete=미션 성공!
text.mission.complete.body=구역 {0},{1} 탐색 성공.
text.mission.resource=Obtain {0} x{1}
text.unit.health=[LIGHT_GRAY]Health: {0}
text.unit.speed=[LIGHT_GRAY]Speed: {0}
block.drone-pad.name=Drone Pad
block.fabricator-pad.name=Fabricator Pad
block.interceptor-pad.name=Interceptor Pad
block.monsoon-pad.name=Monsoon Pad
block.mass-driver.name=Mass Driver
block.blast-drill.name=Blast Drill
unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
unit.monsoon.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo.
unit.interceptor.name=Interceptor
unit.interceptor.description=A fast, hit-and-run strike unit. Uses lead as ammo.
text.unit.health=[LIGHT_GRAY]체력:{0}
text.unit.speed=[LIGHT_GRAY]속도:{0}
block.drone-pad.name=드론 공장
block.fabricator-pad.name=페버 공장
block.interceptor-pad.name=인터셉터 공장
block.monsoon-pad.name=문순 공장
block.mass-driver.name=물질 이동기
block.blast-drill.name=고속 발열 드릴
unit.drone.name=드론
unit.drone.description=초기형 드론 유닛입니다. 기본적으로 코어에서 1대를 스폰합니다. 자동으로 아이템을 수집/채광하며 블럭들을 수리합니다.
unit.fabricator.name=페버
unit.fabricator.description=고급 드론 유닛입니다. 자동으로 아이템과 수집/채광/블록들을 수리하며, 일반 드론보다 더 빠르게 작업할 수 있습니다.
unit.scout.name=스카웃
unit.scout.description=기본 지상 유닛입니다. 납을 탄약으로 사용합니다.
unit.titan.name=타이탄
unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다.
unit.monsoon.name=문순
unit.monsoon.description=자폭 유닛입니다. 폭발 화합물 또는 피러레이트를 탄약으로 사용합니다.
unit.interceptor.name=인터셉터
unit.interceptor.description=빠르고, 공격하고 튀는 방식을 사용합니다. 납을 탄약으로 사용합니다.
unit.dagger.name=디거
unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다.
mode.sandbox.warning=Note that blocks cannot be used in sandbox mode until they are unlocked in other modes.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
block.thermal-pump.name=지열 펌프
block.dagger-pad.name=디거 공장
block.titan-pad.name=타이탄 공장
block.thermal-generator.name=지열 발전기
+36 -21
View File
@@ -1,4 +1,4 @@
text.credits.text=Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[]\n\nЕсть недороботки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.
text.credits.text=Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недороботки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.
text.credits=Авторы
text.discord=Присоединяйтесь к нашему Discord!
text.link.discord.description=официальный discord-сервер Mindustry
@@ -21,10 +21,10 @@ text.level.delete.title=Подтвердите удаление
text.map.delete=Вы действительно хотите удалить карту "[orange]{0}[]"?
text.level.select=Выбор уровня
text.level.mode=Режим игры:
text.construction.title=Руководство по строительству блоков
text.construction=Вы только что выбрали режим строительства [accent]блоков[].\n\nЧтобы начать размещение, просто коснитесь действительного местоположения рядом с вашим кораблем.\nПосле того, как вы выбрали несколько блоков, установите флажок, чтобы подтвердить, и ваш корабль начнет их строить.\n\n- [accent]Удалите блоки [] из вашего выбора, нажав на них.n- [accent]Shift выделение [], удерживая и перетаскивая любой блок в выборе.\n- [accent]Поместите блоки в линию [], нажимая и удерживая пустое место, а затем перетаскивая его в направлении.\n- [accent]Отмените строительство или выбор [], нажав X в левом нижнем углу.
text.construction.title=Руководство по размещения блоков
text.construction=Вы только что выбрали режим размещения[accent]блоков[].\n\nЧтобы начать размещение, просто коснитесь подходящего местоположения рядом с вашим кораблем.\nПосле того, как вы поставили несколько блоков, нажмите на галочку, чтобы подтвердить, и ваш корабль начнет их строить.\n\n- [accent]Удалите блоки [] из вашего выбора, нажав на них.n- [accent]Нажмите Shift [] и, удерживая, перетащите любой блок в выборе.\n- [accent]Поместите блоки в линию [], нажимая и удерживая пустое место, а затем перетаскивая его в направлении.\n- [accent]Отмените размещение или выбор [], нажав X в левом нижнем углу.
text.deconstruction.title=Руководство по разрушении блоков
text.deconstruction=Вы только что выбрали режим удаления[accent] блока.[].\n\nЧтобы начать ломать, просто нажмите на блок рядом с вашим кораблем.\nПосле того как вы выбрали некоторые блоки, установите флажок, чтобы подтвердить, и ваш корабль начнет их деконструкцию.\n\n- [accent]Удалите блоки [] из вашего выбора, нажав на них.\n- [accent]Удалите блоки в области [], нажав и удерживая пустое место, а затем перетащив его в направлении.\n- [accent]Отмените деконструкцию или выбор [], нажав X в левом нижнем углу.
text.deconstruction=Вы только что выбрали режим сноса[accent] блоков.[].\n\nЧтобы начать удалять, просто нажмите на блок рядом с вашим кораблем.\nПосле того как вы выбрали некоторые блоки, нажмите на галочку, чтобы подтвердить, и ваш корабль начнёт их снос.\n\n- [accent]Удалите блоки [] из вашего выбора, нажав на них.\n- [accent]Удалите блоки в области [], нажав и удерживая пустое место, а затем перетащив в нужном направлении.\n- [accent]Отменить снос или выбор [] можно нажав X в левом нижнем углу.
text.showagain=Не показывать снова до следующей сессии
text.coreattack=< Ядро находится под атакой! >
text.unlocks=Разблокированные
@@ -39,15 +39,15 @@ text.sector=Выбранный сектор: [LIGHT_GRAY]{0}
text.sector.time=Время: [LIGHT_GRAY]{0}
text.sector.deploy=Высадиться
text.sector.resume=Продолжить
text.sector.locked=[scarlet][[Не завершено]
text.sector.unexplored=[accent][[Не изучено]
text.sector.locked=[scarlet][[Не завершён]
text.sector.unexplored=[accent][[Неисследованный]
text.mission=Миссия:[LIGHT_GRAY] {0}
text.mission.complete=Миссия выполнена!
text.mission.complete.body=Сектор {0},{1} был завоёван.
text.mission.wave=Пережено следующее количество волн:[accent]{0}[].
text.mission.wave=Пережить следующее количество волн: [accent]{0}[].
text.mission.battle=Уничтожьте базу противника.
text.mission.resource=Приобретено {0} x{1}
text.none=<ничего>
text.none=<нет>
text.close=Закрыть
text.quit=Выход
text.maps=Карты
@@ -74,7 +74,7 @@ text.server.kicked.nameEmpty=Ваше имя должно содержать х
text.server.kicked.idInUse=Вы уже на этом сервере! Соединение с двумя учетными записями не разрешено.
text.server.kicked.customClient=Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию.
text.host.info=Кнопка [accent] Сервер [] размещает сервер на порт [accent]6567[].[]\nЛюбой пользователь в той же [LIGHT_GRAY]сети или локальной сети [] должен иметь возможность видеть ваш сервер в своём списке серверов.\n\nЕсли вы хотите, чтобы люди могли подключаться из любого места по IP, то требуется переадресация(проброс) портов.[].\n\n[LIGHT_GRAY] Примечание. Если у кого-то возникают проблемы с подключением к вашей локальной сети, убедитесь, что вы разрешили Mindustry доступ к вашей локальной сети в настройках брандмауэра.
text.join.info=Здесь вы можете ввести IP-адрес [accent]сервера[] для подключения или открыть [accent]локальную сеть [] для подключения к серверам.\nПоддерживается многопользовательский режим LAN и WAN.\n\n[LIGHT_GRAY] Примечание: это не является автоматическим глобальным списком серверов; если вы хотите подключиться к кому-то по IP, вам нужно будет спросить хост о его IP-адресе.
text.join.info=Здесь вы можете ввести IP-адрес [accent]сервера[] для подключения или открыть [accent]локальную сеть [] для подключения к серверам.\nПоддерживается многопользовательский режим LAN и WAN.\n\n[LIGHT_GRAY] Примечание: это не является автоматическим глобальным списком серверов; если вы хотите подключиться к кому-то по IP, вам нужно будет спросить хост о его IP-адресе.
text.hostserver=Запустить сервер
text.host=Сервер
text.hosting=[accent]Открытие сервера...
@@ -94,7 +94,7 @@ text.trace.structureblocksbroken=Структурных блоков слома
text.trace.lastblockbroken=Последний сломанный блок:[accent]{0}
text.trace.totalblocksplaced=Всего размещено блоков: [accent]{0}
text.trace.lastblockplaced=Последний размещенный блок: [accent]{0}
text.invalidid=Недопустимый идентификатор клиента! Отправьте отчет об ошибке.
text.invalidid=Недопустимый идентификатор клиента! Отправьте отчёт об ошибке.
text.server.bans=Блокировки
text.server.bans.none=Никаких заблокированных игроков не найдено!
text.server.admins=Администраторы
@@ -220,7 +220,7 @@ text.editor.exportimage=Экспортировать изображение ла
text.editor.exportimage.description=Экспортировать файл изображения карты
text.editor.loadimage=Загрузить \nизображение
text.editor.saveimage=Сохранить \nизображение
text.editor.unsaved=[scarlet]У вас есть несохранённые изменения![] \nВы уверены,что хотите выйти?
text.editor.unsaved=[scarlet]У вас есть несохранённые изменения![] \nВы уверены, что хотите выйти?
text.editor.resizemap=Изменить размер карты
text.editor.mapname=Название карты:
text.editor.overwrite=[accent]Внимание! \nЭто перезапишет уже существующую карту.
@@ -364,13 +364,13 @@ content.liquid.name=Жидкости
content.unit-type.name=Боевые единицы
content.recipe.name=Блоки
item.stone.name=Камень
item.stone.description=Обычное сырье. Используется для разделения и переработки в другие материалы или плавления в лаву.
item.stone.description=Обычное сырьё. Используется для разделения и переработки в другие материалы или плавления в лаву.
item.tungsten.name=Вольфрам
item.tungsten.description=Обычный, но очень полезный строительный материал . Используется в бурах и теплостойких блоках, таких как генераторы и плавильные печи.
item.lead.name=Свинец
item.lead.description=Основной начальный материал. Широко используется в блоках электроники и транспортировки жидкости.
item.coal.name=Уголь
item.coal.description=Распростанённое и легкодоступное топливо.
item.coal.description=Распространённое и легкодоступное топливо.
item.carbide.name=Карбид
item.carbide.description=Жёсткий сплав, изготовленный из вольфрама и угля. Используется в передовых транспортных блоках и высокоуровневых бурах.
item.titanium.name=Титан
@@ -388,7 +388,7 @@ item.biomatter.description=Скопление органической каши;
item.sand.name=Песок
item.sand.description=Обычный материал, который широко используется при плавке как в сплаве, так и в виде шлака.
item.blast-compound.name=Взрывоопасное соединение
item.blast-compound.description=Летучее соединение, используемое в бомбах и взрывчатых веществах. Хотя это может сгореть в качестве топлива, но не рекомендуется этого делать.
item.blast-compound.description=Летучее соединение, используемое в бомбах и взрывчатых веществах. Хотя может гореть в качестве топлива, но не рекомендуется этого делать.
item.pyratite.name=Пиротит
item.pyratite.description=Очень огнеопасное вещество, используемое в зажигательном оружии.
liquid.water.name=Вода
@@ -405,6 +405,21 @@ text.unit.speed=[LIGHT_GRAY]Скорость: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Теплоёмкость: {0}
text.liquid.viscosity=[LIGHT_GRAY]Вязкость: {0}
text.liquid.temperature=[LIGHT_GRAY]Температура: {0}
block.deepwater.name=Глубоководье
block.water.name=Вода
block.lava.name=Лава
block.oil.name=Нeфть
block.blackstone.name=Чёрный камень
block.stone.name=Камень
block.dirt.name=Земля
block.sand.name=Песок
block.ice.name=Лёд
block.snow.name=Снег
block.grass.name=Трава
block.shrub.name=Куст
block.rock.name=Булыжник
block.blackrock.name=Чёрный булыжник
block.icerock.name=Ледяной булыжник
block.tungsten-wall.name=Вольфрамовая стена
block.tungsten-wall-large.name=Большая вольфрамовая стена
block.carbide-wall.name=Карбидная стена
@@ -420,18 +435,18 @@ block.lancer.name=Копейщик
block.conveyor.name=Конвейер
block.titanium-conveyor.name=Титановый конвейер
block.junction.name=Перекрёсток
block.splitter.name=Разветвитель
block.splitter.name=Маршрутизатор
block.splitter.description=Выводит предметы на два противоположных направления сразу после их получения.
block.router.name=Маршрутизатор
block.router.description=Распределяет предметы во все 4 направления. Может хранить элементы как буфера.
block.router.description=Распределяет предметы в 4 направления. Может хранить элементы как буфер.
block.distributor.name=Распределитель
block.distributor.description=Разветвитель, который может распределять предметы на 8 направлений.
block.sorter.name=Сортировщик
block.sorter.description=Сортирует предметы. Если предмет соответствует выбранному, то ему можно пройти. В противном случае элемент выводится слева и справа.
block.overflow-gate.name=Избыточный затвор
block.overflow-gate.description=Комбинированный разветвитель и маршрутизатор, который выводится только слева и справа, если передний путь заблокирован.
block.overflow-gate.description=Комбинированный разветвитель и маршрутизатор, который выводит только слева и справа, если передний путь заблокирован.
block.bridgeconveyor.name=Мостовой конвейер
block.bridgeconveyor.description=Конвейер, который может переходить через другие блоки, до двух блоков в сумме.
block.bridgeconveyor.description=Конвейер, который может переходить через другие блоки, до двух блоков всего.
block.smelter.name=Плавильный завод
block.arc-smelter.name=Дуговая печь
block.silicon-smelter.name=Кремниевый плавильный завод
@@ -462,7 +477,7 @@ block.conduit.name=Трубопровод
block.pulseconduit.name=Импульсный трубопровод
block.liquidrouter.name=Маршрутизатор жидкостей
block.liquidtank.name=Жидкостный резервуар
block.liquidjunction.name=Перекресток для жидкостей
block.liquidjunction.name=Перекрёсток для жидкостей
block.bridgeconduit.name=Мостовой трубопровод
block.mechanical-pump.name=Механическая помпа
block.itemsource.name=Источник предметов
@@ -474,7 +489,7 @@ block.unloader.name=Разгрузчик
block.sortedunloader.name=Сортированный разгрузчик
block.vault.name=Хранилище
block.wave.name=Волна
block.swarmer.name=Зерг
block.swarmer.name=Роевик
block.salvo.name=Залп
block.ripple.name=Волнистость
block.phase-conveyor.name=Фазовый конвейер
@@ -497,7 +512,7 @@ block.pulse-conduit.name=Импульсный трубопровод
block.phase-conduit.name=Фазовый трубопровод
block.liquid-router.name=Жидкостный маршрутизатор
block.liquid-tank.name=Жидкостный резервуар
block.liquid-junction.name=Жидкое соединение
block.liquid-junction.name=Жидкостный перекрёсток
block.bridge-conduit.name=Мостовой трубопровод
block.rotary-pump.name=Роторный насос
block.nuclear-reactor.name=Ядерный реактор
+451 -432
View File
@@ -1,518 +1,537 @@
text.credits.text=Створив [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY]Перекладач — Prosta4ok_ua\n\n Є питання по грі або проблеми с перекладом? Іди в офіційний сервер discord Mindustry.
text.credits=Автори
text.discord=Приєднуйтесь до нашого Discord!
text.link.discord.description=офіційний сервер discord Mindustry
text.link.github.description=Ігровий код гри
text.link.dev-builds.description=Нестабільні розробки
text.link.trello.description=Офіційна дошка trello для запланованих функцій
text.link.itch.io.description=Itch.io сторінка з веб-версією та завантаженням для ПК
text.link.google-play.description=Google Play список магазинів
text.link.wiki.description=офіційна Mindustry вікі
text.linkfail=Не вдалося відкрити посилання!\nURL-адреса скопійовано у ваш буфер обміну.
text.editor.web=Веб-версія не підтримує редактора! \nЗавантажте гру, щоб використовувати його.
text.web.unsupported=Веб-версія не підтримує цю функцію! Завантажте гру, щоб використовувати її.
text.gameover=Ядро було зруйновано.
text.highscore=[YELLOW] Новий рекорд!
text.level.highscore=Рекорд: [accent] {0}
text.sector.gameover=Цей сектор було втрачено. Повторно висадитися?
text.sector.retry=Повторити спробу
text.highscore=[accent] Новий рекорд!
text.wave.lasted=Ви проіснували до [accent]{0}[] хвилі.
text.level.highscore=Рекорд: [accent]{0}
text.level.delete.title=Підтвердьте видалення
text.map.delete=Ви впевнені, що хочете видалити карту "[orange]{0}[]"?
text.level.select=Вибір рівня
text.level.mode=Ігровий режим
text.level.mode=Ігровий режим:
text.construction.title=Block Construction Guide
text.construction=\You've just selected [accent]block construction mode[].\n\n\To begin placing, simply tap a valid location near your ship.\n\Once you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\\n\- [accent]Remove blocks[] from your selection by tapping them.\n\- [accent]Shift the selection[] by holding and dragging any block in the selection.\n\- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n\- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=\You've just selected [accent]block deconstruction mode[].\n\n\To begin breaking, simply tap a block near your ship.\n\Once you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\\n\- [accent]Remove blocks[] from your selection by tapping them.\n\- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n\- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Не показувати знову до наступного сеансу
text.coreattack=< Ядро під атакою! >
text.unlocks=Разблоковане
text.savegame=Зберегти гру
text.loadgame=Завантажити гру
text.joingame=Приєднатися\nдо гри
text.addplayers=Дод/Видалити Гравців
text.customgame=Індивідуальна гра
text.sectors=Сектори
text.sector=Сектор: [LIGHT_GRAY]{0}
text.sector.time=Час: [LIGHT_GRAY]{0}
text.sector.deploy=Висадитися
text.sector.resume=Продовжити
text.sector.locked=[scarlet][[Незавершений]
text.sector.unexplored=[accent][[Недосліджений]
text.mission=Місія:[LIGHT_GRAY] {0}
text.mission.complete=Місія завершена!
text.mission.complete.body=Сектор {0},{1} був завойований.
text.mission.wave=Пережено наступну кількість хвиль :[accent]{0}[] .
text.mission.battle=Знищити базу супротивника.
text.mission.resource=Отримано {0} x{1}
text.none=<нічого>
text.close=Закрити
text.quit=Вийти
text.about.button=Про
text.name=Назва:
text.maps=Карти
text.continue=Продовжити
text.nextmission=Наступна місія
text.maps.none=[LIGHT_GRAY]Карт не знайдено!
text.about.button=Про гру
text.name=Нік:
text.unlocked=Новий блок розблоковано!
text.unlocked.plural=Нові блоки розблоковано!
text.players={0} гравців онлайн
text.players.single={0} гравців онлайн
text.server.mismatch=Пакетна помилка: невідповідність версії версії клієнта / сервера. Переконайтеся, що ви та хост мають останню версію Mindustry!
text.server.closing=[accent] Закриття сервера ...
text.server.kicked.kick=Ви були вигнані з сервера!
text.server.kicked.invalidPassword=Невірний пароль!
text.server.kicked.clientOutdated=Застарілий клієнт! Оновіть свою гру!
text.players.single={0} гравець онлай
text.server.mismatch=Пакетна помилка: невідповідність версії клієнта / сервера. \nПереконайтеся, що ви та хост мають останню версію Mindustry!
text.server.closing=[accent]Закриття сервера...
text.server.kicked.kick=Ви були вигнані(кікнуті) з сервера!
text.server.kicked.fastShoot=Ви стріляєте занадто швидко.
text.server.kicked.serverClose=Сервер закритий.
text.server.kicked.sectorComplete=Сектор завершено.
text.server.kicked.sectorComplete.text=Ваша місія завершена. \nСервер продовжить роботу в наступному секторі.
text.server.kicked.clientOutdated=Застаріли клієнт! Оновіть свою гру!
text.server.kicked.serverOutdated=Застарілий сервер! Попросіть хост оновити!
text.hostserver=Хост-сервер
text.server.kicked.banned=Ви були заблоковані на цьому сервері.
text.server.kicked.recentKick=Нещодавно вас вигнали(кікнули). \nПочекайте, перш ніж підключитися знову.
text.server.kicked.nameInUse=На цьому сервері є хтось \nз таким ім'ям.
text.server.kicked.nameEmpty=Ваш нікнейм має містити принаймні один символ або цифру.
text.server.kicked.idInUse=Ви вже на цьому сервері! Підключення двох облікових записів не допускається.
text.server.kicked.customClient=Цей сервер не підтримує власні збірки. Завантажте офіційну версію.
text.host.info=The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.hostserver=Host Server
text.host=Хост
text.hosting=[accent] Відкриття сервера ...
text.hosting=[accent]Открытие сервера ...
text.hosts.refresh=Оновити
text.hosts.discovering=Знайомство з мережевими іграми
text.server.refreshing=Оновити сервери
text.hosts.none=[lightgray] Ніяких ігор у мережі не знайдено!
text.host.invalid=[scarlet] Неможливо підключитися до хосту.
text.hosts.discovering=Пошук локальних ігор
text.server.refreshing=Оновлення серверу
text.hosts.none=[lightgray]Локальних ігр не знайдено
text.host.invalid=[scarlet]Неможливо підключитися до хосту.
text.trace=Стежити за гравцем
text.trace.playername=Ім'я гравця: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Унікальний ідентифікатор: [accent]{0}
text.trace.android=Клієнт Android: [accent]{0}
text.trace.modclient=Користувацький клієнт: [accent]{0}
text.trace.totalblocksbroken=Всього зруйновано блоків: [accent]{0}
text.trace.structureblocksbroken=Структурних блоків зруйновано: [accent]{0}
text.trace.lastblockbroken=Останній зруйнований блок: [accent]{0}
text.trace.totalblocksplaced=Всього встановлено блоків: [accent]{0}
text.trace.lastblockplaced=Останній встановлений блок: [accent]{0}
text.invalidid=Невірний ідентифікатор клієнта! Надішліть звіт про помилку.
text.server.bans=Блокування
text.server.bans.none=Нема заблокованих гравців!
text.server.admins=Адміністратори
text.server.admins.none=Адміністраторів не знайдено
text.server.add=Додати сервер
text.server.delete=Ви впевнені, що хочете видалити цей сервер?
text.server.hostname=Хост: {0}
text.server.edit=Редагувати сервер
text.server.outdated=[crimson]Застарілий сервер![]
text.server.outdated.client=[crimson]Застарілий клієнт![]
text.server.version=[lightgray]Версія: {0}
text.server.custombuild=[yellow]Користувацька конструкція
text.confirmban=Ви впевнені, що хочете заблокувати(забанити) цього гравця?
text.confirmunban=Ви впевнені, що хочете розблокувати) цього гравця?
text.confirmadmin=Ви впевнені, що хочете зробити цього гравця адміністратором?
text.confirmunadmin=Ви впевнені, що хочете видалити статус адміністратора з цього гравця?
text.joingame.title=Приєднатися до гри
text.joingame.ip=IP
text.disconnect=Роз'єднано
text.connecting=[accent] Підключення ...
text.connecting.data=[accent] Завантаження світових даних ...
text.connectfail=[crimson] Не вдалося підключитися до сервера: [orange] {0}
text.server.port=Порт
text.joingame.ip=IP:
text.disconnect=Відключено.
text.disconnect.data=Не вдалося завантажити світові дані!
text.connecting=[accent]Підключення...
text.connecting.data=[accent]Завантаження даних світу...
text.connectfail=[crimson]Не вдалося підключитися до сервера: [orange]{0}
text.server.port=Порт:
text.server.addressinuse=Адреса вже використовується!
text.server.invalidport=Недійсний номер порту.
text.server.error=[crimson] Помилка хостингу сервера: [orange] {0}
text.server.invalidport=Недійсний номер порту!
text.server.error=[crimson]Помилка хостингу сервера: [orange]{0}
text.save.old=Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [LIGHT_GRAY] Зберігати зворотну сумісність буде реалізовано у повній версії 4.0.
text.save.new=Нове збереження
text.save.overwrite=Ви впевнені, що хочете перезаписати цей слот для збереження?
text.overwrite=Перезаписати
text.save.none=Не знайдено жодних збережень!
text.saveload=[accent] Збереження ...
text.save.none=Збережень не знайдено!
text.saveload=[accent]Збереження...
text.savefail=Не вдалося зберегти гру!
text.save.delete.confirm=Ви впевнені, що хочете видалити це збереження?
text.save.delete=Видалити
text.save.export=Експорт збереження
text.save.import.invalid=[orange] Це збереження недійсне!
text.save.import.fail=[crimson] Не вдалося імпортувати збереження: [orange] {0}
text.save.export.fail=[crimson] Не вдалося експортувати збереження: [orange] {0}
text.save.import=Імпортувати збереження
text.save.newslot=Назва збереження:
text.save.rename=Переіменувати
text.save.export=Экспортувати збереження
text.save.import.invalid=[orange]Це збереження недійсне!
text.save.import.fail=[crimson]Не вдалося імпортувати збереження: [orange]{0}
text.save.export.fail=[crimson]Не вдалося экспортувати збереження: [orange]{0}
text.save.import=Імпорт збереження
text.save.newslot=Зберегти ім'я:
text.save.rename=Перейменувати
text.save.rename.text=Нова назва:
text.selectslot=Виберіть збереження.
text.slot=[accent] слот {0}
text.save.corrupted=[orange] Збережений файл пошкоджений або він невірний!
text.empty=<порожньо>
text.on=Увімкнути
text.off=Вимкнути
text.slot=[accent]Слот {0}
text.save.corrupted=[orange]Збережений файл пошкоджений або недійсний! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не []є помилкою.
text.sector.corrupted=[orange]Знайдено файл збереження для цього сектора, але завантаження не вдалося. \n Буде створений новий.
text.empty=<порожній>
text.on=Вкл
text.off=Выкл
text.save.autosave=Автозбереження: {0}
text.save.map=Карта
text.save.map=Карта: {0}
text.save.wave=Хвиля {0}
text.save.difficulty=Складність
text.save.date=Останнє збережено: {0}
text.save.difficulty=Рівень складності: {0}
text.save.date=Останне збереження: {0}
text.save.playtime=Час гри: {0}
text.confirm=Підтвердити
text.delete=Видалити
text.ok=ОК
text.open=Відкрити
text.cancel=Скасувати
text.openlink=Відкрити посилання
text.copylink=Скопіювати посилання
text.back=Назад
text.quit.confirm=Ти впевнений що хочеш піти?
text.loading=[accent] Завантаження ...
text.wave=[orange] хвиля {0}
text.quit.confirm=Ти впевнений що хочеш вийти?
text.changelog.title=Журнал змін
text.changelog.loading=Отримання журналу змін...
text.changelog.error.android=[orange]Зверніть увагу, що іноді журнал змін не працює на ОС Android 4.4 або на нижчій версії!\nЦе пов'язано з внутрішньою помилкою Android.
text.changelog.error.ios=[orange]Журнал змін наразі не підтримується в iOS.
text.changelog.error=[scarlet]Помилка отримання журналу змін!\nПеревірте підключення до Інтернету.
text.changelog.current=[yellow][[Поточна версія]
text.changelog.latest=[orange][[Остання версія]
text.loading=[accent]Завантаження...
text.saving=[accent]Збереження...
text.wave=[orange]Хвиля {0}
text.wave.waiting=Хвиля через {0}
text.waiting=Очікування…
text.enemies={0} Вороги
text.enemies.single=Противник
text.waiting=Очікування...
text.enemies=Ворогів:{0}
text.enemies.single={0} Ворог
text.loadimage=Завантажити зображення
text.saveimage=Зберегти зображення
text.editor.badsize=[orange] Недійсні розміри зображення! [] Дійсні розміри карти: {0}
text.editor.errorimageload=Помилка завантаження файлу зображень: [orange] {0}
text.editor.errorimagesave=Помилка збереження файлу зображення: [orange] {0}
text.editor.generate=Генератор
text.unknown=Невідома
text.custom=Користувальницька
text.builtin=Bбудована
text.map.delete.confirm=Ви впевнені, що хочете видалити цю карту? Цю дію не можна скасувати!
text.map.random=[accent]Випадкова карта
text.map.nospawn=Ця карта не має жодного ядра для спавну гравця! Додайте [ROYAL] сине[] ядро в цю карту в редакторі.
text.map.invalid=Помилка завантаження карти: пошкоджений або невірний файл карти.
text.editor.brush=Пензлик
text.editor.slope=\\
text.editor.openin=Відкрити в редакторі
text.editor.oregen=Генерація руд
text.editor.oregen.info=Генерація руд:
text.editor.mapinfo=Інформація про карту
text.editor.author=Автор:
text.editor.description=Опис:
text.editor.name=Назва:
text.editor.teams=Команди
text.editor.elevation=Bисочина
text.editor.badsize=[orange]Недійсні розміри зображення! [] \n Дійсні розміри карти: {0}
text.editor.errorimageload=Помилка завантаження файлу:\n[orange]{0}
text.editor.errorimagesave=Помилка збереження файлу:\n[orange]{0}
text.editor.generate=Генерувати
text.editor.resize=Змінити розмір
text.editor.loadmap=// Завантажити карту
text.editor.loadmap=Завантажити карту
text.editor.savemap=Зберегти карту
text.editor.loadimage=Завантажити зображення
text.editor.saveimage=Зберегти зображення
text.editor.unsaved=[scarlet] У вас є незбережені зміни! [] Ви впевнені, що хочете вийти?
text.editor.saved=Збережено!
text.editor.save.noname=Ваша карта не має імені! Встановіть його в меню "інформація про карту".
text.editor.save.overwrite=Ваша карта перезаписує вбудовану карту! Виберіть інше ім'я в меню "інформація про карту".
text.editor.import.exists=[scarlet]Неможливо імпортувати: [] вбудована карта з назвою "{0}" вже існує!
text.editor.import=Імпорт...
text.editor.importmap=Імпортувати карту
text.editor.importmap.description=Імпортуйте вже існуючої карти
text.editor.importfile=Імпортувати файл
text.editor.importfile.description=Імпортуйте зовнішній файл карти
text.editor.importimage=Імпорт зображення місцевості
text.editor.importimage.description=Імпорт зовнішнього файла зображення карти
text.editor.export=Експорт...
text.editor.exportfile=Експорт файлу
text.editor.exportfile.description=Експортувати файл карти
text.editor.exportimage=Експорт зображення місцевості
text.editor.exportimage.description=Експорт файла з зображенням карти
text.editor.loadimage=Імпорт місцевості
text.editor.saveimage=Екпорт місцевості
text.editor.unsaved=[scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти?
text.editor.resizemap=Змінити розмір карти
text.editor.mapname=Назва карти:
text.editor.overwrite=[accent] Попередження! Це перезаписує існуючу карту.
text.editor.selectmap=Виберіть карту для завантаження:
text.width=Ширина
text.height=Висота
text.editor.overwrite=[accent]Попередження!\nЦе перезаписує існуючу карту.
text.editor.overwrite.confirm=[scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її?
text.editor.selectmap=Select a map to load:
text.width=Ширина:
text.height=Висота:
text.menu=Меню
text.play=Відтворити
text.play=Грати
text.load=Завантаження
text.save=Зберегти
text.language.restart=Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.
text.settings.language=Мова
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Пінг: {0} мс
text.language.restart=Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.text.settings.language=Language
text.settings=Налаштування
text.tutorial=Навчальний\nпосібник
text.editor=Редактор
text.mapeditor=Редактор карт
text.donate=Підтримати проект
text.donate=Пожертвувати
text.settings.reset=Скинути до стандартних
text.settings.rebind=Переназн.
text.settings.controls=Елементи управління
text.settings.game=Гра
text.settings.sound=Звук
text.settings.graphics=Графіка
text.paused=Пауза
text.info.title=[accent] інформація
text.error.title=[crimson] Виникла помилка
text.yes=Так
text.no=Ні
text.info.title=[accent]Інформація
text.error.title=[crimson]Виникла помилка
text.error.crashtitle=Виникла помилка
text.blocks.blockinfo=Блокування інформації
text.blocks.powercapacity=Потужність
text.blocks.powershot=Потужність / постріл
text.blocks.blockinfo=Інформація про блок
text.blocks.powercapacity=Місткість енергії
text.blocks.powershot=Енергія/постріл
text.blocks.targetsair=Атакуе повітряних ворогів?
text.blocks.itemspeed=Переміщення одиниць
text.blocks.shootrange=Діапазон
text.blocks.size=Розмір
text.blocks.liquidcapacity=Ємкість рідини
text.blocks.maxitemssecond=Макс. Елементи / секунду
text.blocks.powerrange=Радіус потужності
text.blocks.itemcapacity=Ємкість предмету
text.blocks.inputliquid=Ввід речовини
text.blocks.inputitem=Вхідний матеріал
text.blocks.liquidcapacity=Місткість рідини
text.blocks.maxitemssecond=Макс. кількість предметів/секунду
text.blocks.powerrange=Діапазон потужності енергії
text.blocks.poweruse=Енергії використовується
text.blocks.inputitemcapacity=Ємність вхідних елементів
text.blocks.outputitemcapacity=Ємність вихідних елементів
text.blocks.itemcapacity=Місткість предметів
text.blocks.maxpowergeneration=Максимальна потужність
text.blocks.powertransferspeed=Передача енергії
text.blocks.craftspeed=Швидкість виробництва
text.blocks.inputliquid=Прийом рідини
text.blocks.inputliquidaux=Допоміжна рідина
text.blocks.inputitem=Вхідний предмет
text.blocks.inputitems=Вхідні предмети
text.blocks.outputitem=Вихідний предмет
text.blocks.drilltier=Видобуває
text.blocks.drillspeed=Базова швидкість свердління
text.blocks.liquidoutput=Вихідна рідина
text.blocks.liquiduse=Використовуеться рідина
text.blocks.coolant=Охолоджуюча рідина
text.blocks.coolantuse=Охолодж. рідини використовуеться
text.blocks.inputliquidfuel=Рідке паливо
text.blocks.liquidfueluse=Рідкого палива використовуеться
text.blocks.explosive=Вибухонебезпечний!
text.blocks.health=Здоров'я
text.blocks.inaccuracy=Неточність
text.blocks.inaccuracy=Розкид
text.blocks.shots=Постріли
text.blocks.inputcapacity=Вхідна ємність
text.blocks.outputcapacity=Випускна ємність
setting.difficulty.easy=Легкий
setting.difficulty.normal=Нормальний
setting.difficulty.hard=Важкий
setting.difficulty.insane=Божевільний
setting.difficulty.purge=Очистити
setting.difficulty.name=Складність
setting.screenshake.name=Тряска екрана
setting.indicators.name=Індикатори ворога
setting.effects.name=Ефекти відображення
text.blocks.reload=Перезарядка
text.blocks.inputfuel=Паливо
text.blocks.fuelburntime=Час горіння топлива
text.blocks.inputcapacity=Вміщення вводу
text.blocks.outputcapacity=Вміщення виводу
text.unit.blocks=блоки
text.unit.powersecond=одиниць енергії/секунду
text.unit.liquidsecond=рідких одиниць/секунду
text.unit.itemssecond=предметів/секунду
text.unit.pixelssecond=пікселів/секунду
text.unit.liquidunits=рідин. одиниць
text.unit.powerunits=енерг. одиниць
text.unit.degrees=град.
text.unit.seconds=сек.
text.unit.none=
text.unit.items=предм.
text.category.general=Загальне
text.category.power=Енергетичне
text.category.liquids=Рідинне
text.category.items=Елементи
text.category.crafting=Створення
text.category.shooting=Стрільба
setting.fpscap.name=Макс. FPS
setting.fpscap.none=Необмежений
setting.fpscap.text={0} FPS
setting.difficulty.easy=легкий
setting.difficulty.normal=нормальний
setting.difficulty.hard=важкий
setting.difficulty.insane=божевільний
setting.difficulty.purge=зачистка
setting.difficulty.name=Рівень складності:
setting.screenshake.name=Потрясіння екрану
setting.indicators.name=Індикатор ворога
setting.effects.name=Ефекти на екрані
setting.sensitivity.name=Чутливість контролера
setting.saveinterval.name=Інтервал автозбереження
setting.seconds={0} секунд
setting.fullscreen.name=Повноекранний
setting.multithread.name=Багатопотоковий [scarlet] (нестабільний!)
setting.seconds={0} сек.
setting.fullscreen.name=Повний екран
setting.multithread.name=Багатопотоковість
setting.fps.name=Показати FPS
setting.vsync.name=VSunc
setting.vsync.name=Вертикальна синхронізація
setting.lasers.name=Показати енергетичні лазери
setting.healthbars.name=Показати здоров'я
setting.healthbars.name=Показати смужки здоров'я об'єкта
setting.minimap.name=Показати мінікарту
setting.musicvol.name=Гучність музики
setting.mutemusic.name=Вимкнути музику
setting.sfxvol.name=Гучність ефектів
setting.mutesound.name=Вимкнути звук
text.keybind.title=Ключ перемотки
keybind.move_x.name=move_x
keybind.move_y.name=move_y
keybind.select.name=Вибрати
keybind.break.name={0}break{/0}{1}; {/1}
setting.mutemusic.name=Заглушити музику
setting.sfxvol.name=Гучність звукових ефектів
setting.mutesound.name=Заглушити звук
text.keybind.title=Переназначити клавіші
keybind.move_x.name=Переміщення по осі x
keybind.move_y.name=Переміщення по осі y
keybind.select.name=Виберіть
keybind.break.name=Зламати
keybind.shoot.name=Постріл
keybind.zoom_hold.name=zoom_hold
keybind.zoom_hold.name=Утримувати масштаб
keybind.zoom.name=Збільшити
keybind.menu.name=Меню
keybind.pause.name=Пауза
keybind.dash.name=Тире
keybind.chat.name=Чат
keybind.player_list.name=Список гравців
keybind.console.name=// Консоль 1
keybind.rotate.name=Повернути
mode.waves.name=Хвилі
mode.sandbox.name=Пісочниця
keybind.console.name=консоль
keybind.rotate.name=Повертати
mode.text.help.title=Опис режимів
mode.waves.name=хвилі
mode.waves.description=нормальний режим. обмежені ресурси та автоматичні хвилі.
mode.sandbox.name=пісочниця
mode.sandbox.description=нескінченні ресурси і нема таймера для хвиль.
mode.sandbox.warning=Зверніть увагу, що блоки не можуть бути використані в режимі "пісочниця", доки вони не розблоковані в інших режимах.\n\n [LIGHT_GRAY] Якщо ви не розблокували будь-які блоки, нічого не з'явиться.
mode.freebuild.name=Вільний режим
mode.freebuild.description=обмежені ресурси і немає таймера для хвиль.
content.item.name=Предмети
content.liquid.name=Рідини
content.unit-type.name=Бойові одиниці
content.recipe.name=Блоки
item.stone.name=Камінь
item.coal.name=Вугівалля
item.stone.description=Загальна сировина. Використовується для розділення та переробки в інші матеріали або плавки в лаву.
item.tungsten.name=Вольфрам
item.tungsten.description=Звичайний, але дуже корисний структурнй матеріал. Використовується в свердлах та термостійких блоках, таких як генератори та плавильні.
item.lead.name=Свинець
item.lead.description=Базовий стартовий матеріал. Широко використовується в блоках електроніки та транспорту рідини.
item.coal.name=Вугілля
item.coal.description=Загальне та легкодоступне паливо.
item.carbide.name=Карбід
item.carbide.description=Жорсткий сплав з вольфрамом та карбідом. Використовується в передових транспортних блоках та високорівневих свердлах.
item.titanium.name=Титан
item.thorium.name=Уран
item.titanium.description=Рідкий суперлегкий метал широко використовується в рідкому транспорті, свердлах та літальних апаратах.
item.thorium.name=Торій
item.thorium.description=Густий, радіоактивний метал, що використовується як структурна підтримка та ядерне паливо.
item.silicon.name=Кремній
item.silcion.description=Надзвичайно корисний напівпровідник з застосуванням в сонячних батареях та багатьох складних електроніках.
item.plastanium.name=Пластиній
item.plastanium.description=Легкий, пластичний матеріал, що використовується в сучасних літальних апаратах, та боєприпаси для фрагментації.
item.phase-matter.name=Фазова матерія
item.surge-alloy.name=Хвилястий сплав
item.biomatter.name=Біоматерія
item.biomatter.description=Скупчення органічної муси; використовується для перетворення в нафту або як основне паливо.
item.sand.name=Пісок
item.sand.description=Загальний матеріал, який широко використовується при плавленні, як у процесі плавки, так і в відходах.
item.blast-compound.name=Вибухонебезпечне з'єднання
item.blast-compound.description=Нестійкий склад, що використовується в бомбах та вибухових речовинах. Хоча воно може спалюватися як паливо, та це не рекомендується.
item.pyratite.name=Піратит
item.pyratite.description=Вкрай легкозаймиста речовина, що використовується у запальному озброєнні.
liquid.water.name=Вода
liquid.lava.name=Лава
liquid.oil.name=Нафта
liquid.cryofluid.name=Кріогенна рідина
text.item.explosiveness=[LIGHT_GRAY]Вибухонебезпечність: {0}
text.item.flammability=[LIGHT_GRAY]Вогненебезпечність: {0}
text.item.radioactivity=[LIGHT_GRAY]Радіоактивність: {0}
text.item.fluxiness=[LIGHT_GRAY]Осадковість: {0}
text.item.hardness=[LIGHT_GRAY]Міцність: {0}
text.unit.health=[LIGHT_GRAY]Здоров'я: {0}
text.unit.speed=[LIGHT_GRAY]Швидкість: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Теплоємність: {0}
text.liquid.viscosity=[LIGHT_GRAY]В'язкість: {0}
text.liquid.temperature=[LIGHT_GRAY]Темпаратура: {0}
block.deepwater.name=глибокі води
block.water.name=вода
block.lava.name=лава
block.oil.name=нафта
block.blackstone.name=чорний-камінь
block.stone.name=камінь
block.dirt.name=земля
block.sand.name=пісок
block.ice.name=лід
block.snow.name=сніг
block.grass.name=трава
block.shrub.name=кущ
block.rock.name=кругляк
block.blackrock.name=чорний-кругляк
block.icerock.name=льодяний-кругляк
block.tungsten-wall.name=Вольфрамова стіна
block.tungsten-wall-large.name=Велика вольфрамова стіна
block.carbide-wall.name=Карбідна стіна
block.carbide-wall-large.name=Велика карбідна стіна
block.thorium-wall.name=Торієва стіна
block.thorium-wall-large.name=Велика Торнієва стіна
block.door.name=Двері
block.door-large.name=Великі двері
block.conduit.name=Трубопровід
block.pulseconduit.name=Імпульсний канал
block.liquidrouter.name=маршрутизатор для рідини
block.duo.name=Подвійна
block.scorch.name=Випалювач
block.hail.name=Град
block.lancer.name=Списоносець
block.conveyor.name=Конвеєр
block.titanium-conveyor.name=Титановий конвеєр
block.junction.name=Перехрестя
block.splitter.name=Розгалужувач
block.splitter.description=Виводить елементи у три різні напрямки після їх отримання.
block.router.name=Маршрутизатор
block.junction.name=Міст
block.liquidjunction.name=Міст для рідини
block.router.description=Розбиває елементи на всі 4 напрямки. Можна зберігати елементи як буфер.
block.distributor.name=розподілювач
block.distributor.description=Розгалужувач, який може виводити елементи на 8 напрямків.
block.sorter.name=Сортувальник
block.smelter.name=Плавильня
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
text.unlocks=Unlocks
text.addplayers=Add/Remove Players
text.maps=Maps
text.maps.none=[LIGHT_GRAY]No maps found!
text.unlocked=New Block Unlocked!
text.unlocked.plural=New Blocks Unlocked!
text.server.kicked.fastShoot=You are shooting too quickly.
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
text.trace=Trace Player
text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0}
text.trace.id=Unique ID: [accent]{0}
text.trace.android=Android Client: [accent]{0}
text.trace.modclient=Custom Client: [accent]{0}
text.trace.totalblocksbroken=Total blocks broken: [accent]{0}
text.trace.structureblocksbroken=Structure blocks broken: [accent]{0}
text.trace.lastblockbroken=Last block broken: [accent]{0}
text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans
text.server.bans.none=No banned players found!
text.server.admins=Admins
text.server.admins.none=No admins found!
text.server.outdated=[crimson]Outdated Server![]
text.server.outdated.client=[crimson]Outdated Client![]
text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player?
text.confirmunban=Are you sure you want to unban this player?
text.confirmadmin=Are you sure you want to make this player an admin?
text.confirmunadmin=Are you sure you want to remove admin status from this player?
text.disconnect.data=Failed to load world data!
text.copylink=Copy Link
text.changelog.title=Changelog
text.changelog.loading=Getting changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection.
text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving...
text.unknown=Unknown
text.custom=Custom
text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone!
text.map.random=[accent]Random Map
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor.
text.editor.slope=\\
text.editor.openin=Open In Editor
text.editor.oregen=Ore Generation
text.editor.oregen.info=Ore Generation:
text.editor.mapinfo=Map Info
text.editor.author=Author:
text.editor.description=Description:
text.editor.name=Name:
text.editor.teams=Teams
text.editor.elevation=Elevation
text.editor.saved=Saved!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists!
text.editor.import=Import...
text.editor.importmap=Import Map
text.editor.importmap.description=Import an already existing map
text.editor.importfile=Import File
text.editor.importfile.description=Import an external map file
text.editor.importimage=Import Terrain Image
text.editor.importimage.description=Import an external map image file
text.editor.export=Export...
text.editor.exportfile=Export File
text.editor.exportfile.description=Export a map file
text.editor.exportimage=Export Terrain Image
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.settings.rebind=Rebind
text.yes=Yes
text.no=No
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output
text.blocks.liquiduse=Liquid Use
text.blocks.coolant=Coolant
text.blocks.coolantuse=Coolant Use
text.blocks.inputliquidfuel=Fuel Liquid
text.blocks.liquidfueluse=Liquid Fuel Use
text.blocks.reload=Reload
text.blocks.inputfuel=Fuel
text.blocks.fuelburntime=Fuel Burn Time
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.minimap.name=Show Minimap
mode.text.help.title=Description of modes
mode.waves.description=the normal mode. limited resources and automatic incoming waves.
mode.sandbox.description=infinite resources and no timer for waves.
mode.freebuild.description=limited resources and no timer for waves.
content.item.name=Items
content.liquid.name=Liquids
content.unit-type.name=Units
content.recipe.name=Blocks
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava.
item.tungsten.name=Tungsten
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries.
item.lead.name=Lead
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.coal.description=A common and readily available fuel.
item.carbide.name=Carbide
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel.
item.silicon.name=Silicon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics.
item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition.
item.phase-matter.name=Phase Matter
item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux.
item.blast-compound.name=Blast Compound
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised.
item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons.
liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0}
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.duo.name=Duo
block.scorch.name=Scorch
block.hail.name=Hail
block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor
block.splitter.name=Splitter
block.splitter.description=Outputs items into two opposite directions immediately after they are recieved.
block.router.description=Splits items into all 4 directions. Can store items as a buffer.
block.distributor.name=Distributor
block.distributor.description=A splitter that can split items into 8 directions.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked.
block.bridgeconveyor.name=Bridge Conveyor
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks.
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.sorter.description=Сортує предмети. Якщо товар відповідає виділенню, йому можна пройти. В іншому випадку предмет виводиться ліворуч і праворуч.
block.overflow-gate.name=Надмірний затвор
block.overflow-gate.description=Комбінований розгалужувач і маршрутизатор, який виводить тільки вліво та вправо, якщо передній шлях заблоковано.
block.bridgeconveyor.name=Мостовий конвеєр
block.bridgeconveyor.description=Конвеєр, який може пройти повз інші блоки, до двох блоків усього.
block.smelter.name=Плавильний завод
block.arc-smelter.name=Дуговий плавильний завод
block.silicon-smelter.name=Кремнієвий завод
block.phase-weaver.name=Фазовий ткач
block.pulverizer.name=Розпилювач
block.cryofluidmixer.name=Змішувач кріогненної рідини
block.melter.name=Плавильня
block.incinerator.name=Сміттєспалювальний завод
block.biomattercompressor.name=Біоматерний компресор
block.separator.name=Сепаратор
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.repairpoint.name=Repair Point
block.resupplypoint.name=Resupply Point
block.liquidtank.name=Liquid Tank
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
block.unloader.name=Unloader
block.sortedunloader.name=Sorted Unloader
block.vault.name=Vault
block.wave.name=Wave
block.swarmer.name=Swarmer
block.salvo.name=Salvo
block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor
block.power-node.name=Енергійний вузол
block.power-node-large.name=Великий енергетичний вузол
block.battery.name=Акумулятор
block.battery-large.name=Великий акумулятор
block.combustion-generator.name=Генератор горіння
block.turbine-generator.name=Турбогенератор
block.tungsten-drill.name=Вольфрамовий дриль
block.carbide-drill.name=Карбідовий дриль
block.laser-drill.name=Лазерний дриль
block.water-extractor.name=Екстрактор води
block.cultivator.name=Культиватор
block.dart-ship-factory.name=Завод дротикових кораблів
block.delta-mech-factory.name=Завод механічного дельта броньовика
block.javelin-ship-factory.name=Завод кораблів Javelin
block.repairpoint.name=Ремонтний пункт
block.resupplypoint.name=Постачальна точка
block.conduit.name=Трубопровід
block.pulseconduit.name=Імпульсний трубопровід
block.liquidrouter.name=Рідкий маршрутизатор
block.liquidtank.name=Рідкий резервуар
block.liquidjunction.name=Рідкий з'єднання
block.bridgeconduit.name=Мостовий трубопровід
block.mechanical-pump.name=Механічний насос
block.itemsource.name=Джерело предметів
block.itemvoid.name=Предметний вакуум
block.liquidsource.name=Рідке джерело
block.powervoid.name=Енергетичний вакуум
block.powerinfinite.name=Нескінченна енергія
block.unloader.name=Розвантажувач
block.sortedunloader.name=Сортований розвантажувач
block.vault.name=Сховище
block.wave.name=Хвиля
block.swarmer.name=Ройевик
block.salvo.name=Залп
block.ripple.name=Хвилястість
block.phase-conveyor.name=Фазовий конвеєр
block.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor
block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel
block.oil-extractor.name=Oil Extractor
block.javelin-ship-factory.name=Javelin Ship factory
block.repair-point.name=Repair Point
block.resupply-point.name=Resupply Point
block.pulse-conduit.name=Pulse Conduit
block.phase-conduit.name=Phase Conduit
block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction
block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
text.sector.deploy=Deploy
text.sector.resume=Resume
text.sector.locked=[scarlet][[Incomplete]
text.sector.unexplored=[accent][[Unexplored]
text.close=Close
text.save.playtime=Playtime: {0}
text.editor.brush=Brush
text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.sector.gameover=This sector has been lost. Re-deploy?
text.sector.retry=Retry
text.wave.lasted=You lasted until wave [accent]{0}[].
setting.fpscap.name=Max FPS
setting.fpscap.none=None
setting.fpscap.text={0} FPS
block.command-center.name=Command Center
text.mission=Mission:[LIGHT_GRAY] {0}
text.mission.wave=Survive [accent]{0}[] waves.
text.mission.battle=Destroy the enemy base.
text.none=<none>
text.sector.corrupted=[orange]A save file for this sector was found, but loading failed.\nA new one has been created.
text.mission.complete=Mission complete!
text.mission.complete.body=Sector {0},{1} has been conquered.
text.mission.resource=Obtain {0} x{1}
text.unit.health=[LIGHT_GRAY]Health: {0}
text.unit.speed=[LIGHT_GRAY]Speed: {0}
block.drone-pad.name=Drone Pad
block.fabricator-pad.name=Fabricator Pad
block.interceptor-pad.name=Interceptor Pad
block.monsoon-pad.name=Monsoon Pad
block.mass-driver.name=Mass Driver
block.blast-drill.name=Blast Drill
unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
unit.monsoon.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo.
unit.interceptor.name=Interceptor
unit.interceptor.description=A fast, hit-and-run strike unit. Uses lead as ammo.
mode.sandbox.warning=Note that blocks cannot be used in sandbox mode until they are unlocked in other modes.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
block.plastanium-compressor.name=Пластиновий компресор
block.pyratite-mixer.name=Змішувач піратиту
block.blast-mixer.name=Доменний змішувач
block.solidifer.name=Затверджувач
block.solar-panel.name=Сонячна панель
block.solar-panel-large.name=Велика сонячна панель
block.oil-extractor.name=Екстрактор нафти
block.drone-pad.name=Стартовий майданчик дронів
block.fabricator-pad.name=Стартовий майданчик складальників
block.interceptor-pad.name=Стартовий майданчик винищувачів-перехоплювачів
block.monsoon-pad.name=Стартовий майданчик мусонів
block.repair-point.name=Ремонтний пункт
block.resupply-point.name=постачальна точка
block.pulse-conduit.name=Імпульсний водовід
block.phase-conduit.name=Фазовий водопровід
block.liquid-router.name=Рідкий маршрутизатор
block.liquid-tank.name=Рідкий резервуар
block.liquid-junction.name=Рідкий з'єднання
block.bridge-conduit.name=Мостовий водопровід
block.rotary-pump.name=Роторний насос
block.nuclear-reactor.name=Ядерний реактор
block.command-center.name=Командний центр
block.mass-driver.name=Електромагнітна катапульта
block.blast-drill.name=Бурова установка
block.thermal-pump.name=Тепловий насос
block.dagger-pad.name=Стартовий майданчик дронів
block.titan-pad.name=Стартовий майданчик титанів
block.thermal-generator.name=Тепловий генератор
unit.drone.name=Дрон
unit.drone.description=Стартова бойова одиниця. З'являеться в основному за замовчуванням. Автоматично видобуває руди, збирає предмети і відновлює блоки.
unit.fabricator.name=Складальник
unit.fabricator.description=Покращений дрон. Автоматично видобуває руди, збирає предмети і відновлює блоки. Значно ефективніший, ніж дрон.
unit.dagger.name=Кинджал
unit.dagger.description=Базова наземна бойова одиниця. Корисна у купі.
unit.titan.name=Титан
unit.titan.description=Просунута броньована наземна одиниця. Атакуе наземні та повітряні цілі.
unit.monsoon.name=Мусон
unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси.
unit.interceptor.name=Винищувач-перехполювач
unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком
Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

+2446 -2542
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 756 KiB

After

Width:  |  Height:  |  Size: 85 KiB

+2
View File
@@ -34,6 +34,8 @@ public class Vars{
public static final float wavespace = 60 * 60 * 1.5f;
//set ridiculously high for now
public static final float coreBuildRange = 800999f;
public static final float enemyCoreBuildRange = 400f;
//discord group URL
public static final String discordURL = "https://discord.gg/BKADYds";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";
@@ -119,7 +119,7 @@ public class BlockIndexer{
* Get all allied blocks with a flag.
*/
public ObjectSet<Tile> getAllied(Team team, BlockFlag type){
return (state.teams.get(team).ally ? allyMap : enemyMap).get(type, emptyArray);
return state.teams.has(team) ? (state.teams.get(team).ally ? allyMap : enemyMap).get(type, emptyArray) : emptyArray;
}
/**
@@ -142,7 +142,7 @@ public class BlockIndexer{
for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){
Tile other = world.tile(tx, ty);
if(other == null || other.entity == null || !pred.test(other)) continue;
if(other == null || other.entity == null || other.getTeam() != team || !pred.test(other)) continue;
TileEntity e = other.entity;
@@ -246,7 +246,6 @@ public class BlockIndexer{
int quadrantX = tile.x / structQuadrantSize;
int quadrantY = tile.y / structQuadrantSize;
int index = quadrantX + quadrantY * quadWidth();
//Log.info("Updating quadrant: {0} {1}", quadrantX, quadrantY);
for(TeamData data : state.teams.getTeams()){
@@ -164,13 +164,13 @@ public class CraftingBlocks extends BlockList implements ContentList{
separator = new Separator("separator"){{
results = new Item[]{
null, null, null, null, null, null, null, null, null, null,
Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand,
Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone,
Items.tungsten, Items.tungsten, Items.tungsten, Items.tungsten,
Items.lead, Items.lead,
Items.coal, Items.coal,
Items.titanium
null, null, null, null, null, null, null, null, null, null,
Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand,
Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone,
Items.tungsten, Items.tungsten, Items.tungsten, Items.tungsten,
Items.lead, Items.lead,
Items.coal, Items.coal,
Items.titanium
};
filterTime = 40f;
itemCapacity = 40;
@@ -182,14 +182,14 @@ public class CraftingBlocks extends BlockList implements ContentList{
centrifuge = new Separator("centrifuge"){{
results = new Item[]{
null, null, null, null, null, null, null, null, null, null, null, null, null,
Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand,
Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone,
Items.tungsten, Items.tungsten, Items.tungsten, Items.tungsten, Items.tungsten,
Items.lead, Items.lead, Items.lead,
Items.coal, Items.coal, Items.coal,
Items.titanium, Items.titanium,
Items.thorium,
null, null, null, null, null, null, null, null, null, null, null, null, null,
Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand, Items.sand,
Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone, Items.stone,
Items.tungsten, Items.tungsten, Items.tungsten, Items.tungsten, Items.tungsten,
Items.lead, Items.lead, Items.lead,
Items.coal, Items.coal, Items.coal,
Items.titanium, Items.titanium,
Items.thorium,
};
hasPower = true;
@@ -179,13 +179,13 @@ public class TurretBullets extends BulletList implements ContentList{
}
};
driverBolt = new BulletType(5f, 50){
driverBolt = new BulletType(5.3f, 50){
{
collidesTiles = false;
lifetime = 200f;
despawneffect = BlockFx.smeltsmoke;
hiteffect = BulletFx.hitBulletBig;
drag = 0.02f;
drag = 0.01f;
}
@Override
+61 -55
View File
@@ -31,8 +31,10 @@ import io.anuke.ucore.util.Pooling;
import io.anuke.ucore.util.Timer;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.zip.InflaterInputStream;
import static io.anuke.mindustry.Vars.*;
@@ -134,7 +136,7 @@ public class NetClient extends Module{
Net.handleClient(WorldStream.class, data -> {
Log.info("Recieved world data: {0} bytes.", data.stream.available());
NetworkIO.loadWorld(data.stream);
NetworkIO.loadWorld(new InflaterInputStream(data.stream));
finishConnecting();
});
@@ -249,68 +251,72 @@ public class NetClient extends Module{
//get data input for reading from the stream
DataInputStream input = netClient.dataStream;
//read wave info
state.wavetime = input.readFloat();
state.wave = input.readInt();
byte cores = input.readByte();
for(int i = 0; i < cores; i++){
int pos = input.readInt();
world.tile(pos).entity.items.read(input);
}
long timestamp = input.readLong();
byte totalGroups = input.readByte();
//for each group...
for(int i = 0; i < totalGroups; i++){
//read group info
byte groupID = input.readByte();
short amount = input.readShort();
EntityGroup group = Entities.getGroup(groupID);
//go through each entity
for(int j = 0; j < amount; j++){
int position = netClient.byteStream.position(); //save position to check read/write correctness
int id = input.readInt();
byte typeID = input.readByte();
SyncTrait entity = (SyncTrait) group.getByID(id);
boolean add = false;
//entity must not be added yet, so create it
if(entity == null){
entity = (SyncTrait) TypeTrait.getTypeByID(typeID).get(); //create entity from supplier
entity.resetID(id);
if(!netClient.isEntityUsed(entity.getID())){
add = true;
}
}
//read the entity
entity.read(input, timestamp);
byte readLength = input.readByte();
if(netClient.byteStream.position() - position - 1 != readLength){
throw new RuntimeException("Error reading entity of type '" + group.getType() + "': Read length mismatch [write=" + readLength + ", read=" + (netClient.byteStream.position() - position - 1) + "]");
}
if(add){
entity.add();
netClient.addRemovedEntity(entity.getID());
}
}
}
netClient.readSnapshot(input);
//confirm that snapshot has been recieved
netClient.lastSnapshotBaseID = snapshotID;
}catch(Exception e){
throw new RuntimeException(e);
}
}
public void readSnapshot(DataInputStream input) throws IOException{
//read wave info
state.wavetime = input.readFloat();
state.wave = input.readInt();
byte cores = input.readByte();
for(int i = 0; i < cores; i++){
int pos = input.readInt();
world.tile(pos).entity.items.read(input);
}
long timestamp = input.readLong();
byte totalGroups = input.readByte();
//for each group...
for(int i = 0; i < totalGroups; i++){
//read group info
byte groupID = input.readByte();
short amount = input.readShort();
EntityGroup group = Entities.getGroup(groupID);
//go through each entity
for(int j = 0; j < amount; j++){
int position = netClient.byteStream.position(); //save position to check read/write correctness
int id = input.readInt();
byte typeID = input.readByte();
SyncTrait entity = (SyncTrait) group.getByID(id);
boolean add = false;
//entity must not be added yet, so create it
if(entity == null){
entity = (SyncTrait) TypeTrait.getTypeByID(typeID).get(); //create entity from supplier
entity.resetID(id);
if(!netClient.isEntityUsed(entity.getID())){
add = true;
}
}
//read the entity
entity.read(input, timestamp);
byte readLength = input.readByte();
//if(netClient.byteStream.position() - position - 1 != readLength){
// throw new RuntimeException("Error reading entity of type '" + group.getType() + "': Read length mismatch [write=" + readLength + ", read=" + (netClient.byteStream.position() - position - 1) + "]");
//}
if(add){
entity.add();
netClient.addRemovedEntity(entity.getID());
}
}
}
}
@Override
public void update(){
if(!Net.client()) return;
+80 -66
View File
@@ -9,8 +9,10 @@ import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.content.Mechs;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.traits.SyncTrait;
import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call;
@@ -35,6 +37,7 @@ import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.zip.DeflaterOutputStream;
import static io.anuke.mindustry.Vars.*;
@@ -43,7 +46,7 @@ public class NetServer extends Module{
public final static boolean showSnapshotSize = false;
private final static byte[] reusableSnapArray = new byte[maxSnapshotSize];
private final static float serverSyncTime = 5, kickDuration = 30 * 1000;
private final static float serverSyncTime = 4, kickDuration = 30 * 1000;
private final static Vector2 vector = new Vector2();
/**If a play goes away of their server-side coordinates by this distance, they get teleported back.*/
private final static float correctDist = 16f;
@@ -169,7 +172,8 @@ public class NetServer extends Module{
//TODO try DeflaterOutputStream
ByteArrayOutputStream stream = new ByteArrayOutputStream();
NetworkIO.writeWorld(player, stream);
DeflaterOutputStream def = new DeflaterOutputStream(stream);
NetworkIO.writeWorld(player, def);
WorldStream data = new WorldStream();
data.stream = new ByteArrayInputStream(stream.toByteArray());
Net.sendStream(id, data);
@@ -200,8 +204,14 @@ public class NetServer extends Module{
player.isBoosting = packet.boosting;
player.isShooting = packet.shooting;
player.getPlaceQueue().clear();
if(packet.currentRequest != null){
player.getPlaceQueue().addLast(packet.currentRequest);
for(BuildRequest req : packet.requests){
//auto-skip done requests
if(req.remove && world.tile(req.x, req.y).block() == Blocks.air){
continue;
}else if(!req.remove && world.tile(req.x, req.y).block() == req.recipe.result && (!req.recipe.result.rotate || world.tile(req.x, req.y).getRotation() == req.rotation)){
continue;
}
player.getPlaceQueue().addLast(req);
}
vector.set(packet.x - player.getInterpolator().target.x, packet.y - player.getInterpolator().target.y);
@@ -393,6 +403,71 @@ public class NetServer extends Module{
admins.save();
}
public void writeSnapshot(Player player, DataOutputStream dataStream) throws IOException{
//write wave datas
dataStream.writeFloat(state.wavetime);
dataStream.writeInt(state.wave);
Array<Tile> cores = state.teams.get(player.getTeam()).cores;
dataStream.writeByte(cores.size);
//write all core inventory data
for(Tile tile : cores){
dataStream.writeInt(tile.packedPosition());
tile.entity.items.write(dataStream);
}
//write timestamp
dataStream.writeLong(TimeUtils.millis());
int totalGroups = 0;
for(EntityGroup<?> group : Entities.getAllGroups()){
if(!group.isEmpty() && (group.all().get(0) instanceof SyncTrait)) totalGroups++;
}
//write total amount of serializable groups
dataStream.writeByte(totalGroups);
//check for syncable groups
for(EntityGroup<?> group : Entities.getAllGroups()){
//TODO range-check sync positions to optimize?
if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue;
//make sure mapping is enabled for this group
if(!group.mappingEnabled()){
throw new RuntimeException("Entity group '" + group.getType() + "' contains SyncTrait entities, yet mapping is not enabled. In order for syncing to work, you must enable mapping for this group.");
}
int amount = 0;
for(Entity entity : group.all()){
if(((SyncTrait) entity).isSyncing()){
amount++;
}
}
//write group ID + group size
dataStream.writeByte(group.getID());
dataStream.writeShort(amount);
for(Entity entity : group.all()){
if(!((SyncTrait) entity).isSyncing()) continue;
int position = syncStream.position();
//write all entities now
dataStream.writeInt(entity.getID()); //write id
dataStream.writeByte(((SyncTrait) entity).getTypeID()); //write type ID
((SyncTrait) entity).write(dataStream); //write entity
int length = syncStream.position() - position; //length must always be less than 127 bytes
if(length > 127)
throw new RuntimeException("Write size for entity of type " + group.getType() + " must not exceed 127!");
dataStream.writeByte(length);
}
}
}
String getUUID(int connectionID){
return connections.get(connectionID).uuid;
}
@@ -464,68 +539,7 @@ public class NetServer extends Module{
//reset stream to begin writing
syncStream.reset();
//write wave datas
dataStream.writeFloat(state.wavetime);
dataStream.writeInt(state.wave);
Array<Tile> cores = state.teams.get(player.getTeam()).cores;
dataStream.writeByte(cores.size);
//write all core inventory data
for(Tile tile : cores){
dataStream.writeInt(tile.packedPosition());
tile.entity.items.write(dataStream);
}
//write timestamp
dataStream.writeLong(TimeUtils.millis());
int totalGroups = 0;
for(EntityGroup<?> group : Entities.getAllGroups()){
if(!group.isEmpty() && (group.all().get(0) instanceof SyncTrait)) totalGroups++;
}
//write total amount of serializable groups
dataStream.writeByte(totalGroups);
//check for syncable groups
for(EntityGroup<?> group : Entities.getAllGroups()){
//TODO range-check sync positions to optimize?
if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue;
//make sure mapping is enabled for this group
if(!group.mappingEnabled()){
throw new RuntimeException("Entity group '" + group.getType() + "' contains SyncTrait entities, yet mapping is not enabled. In order for syncing to work, you must enable mapping for this group.");
}
int amount = 0;
for(Entity entity : group.all()){
if(((SyncTrait) entity).isSyncing()){
amount++;
}
}
//write group ID + group size
dataStream.writeByte(group.getID());
dataStream.writeShort(amount);
for(Entity entity : group.all()){
if(!((SyncTrait) entity).isSyncing()) continue;
int position = syncStream.position();
//write all entities now
dataStream.writeInt(entity.getID()); //write id
dataStream.writeByte(((SyncTrait) entity).getTypeID()); //write type ID
((SyncTrait) entity).write(dataStream); //write entity
int length = syncStream.position() - position; //length must always be less than 127 bytes
if(length > 127)
throw new RuntimeException("Write size for entity of type " + group.getType() + " must not exceed 127!");
dataStream.writeByte(length);
}
}
writeSnapshot(player, dataStream);
byte[] bytes = syncStream.toByteArray();
@@ -132,6 +132,8 @@ public class Renderer extends RendererModule{
@Override
public void update(){
//TODO hack, find source of this bug
Color.WHITE.set(1f, 1f, 1f, 1f);
if(Core.cameraScale != targetscale){
float targetzoom = (float) Core.cameraScale / targetscale;
@@ -195,6 +197,10 @@ public class Renderer extends RendererModule{
@Override
public void draw(){
camera.update();
if(Float.isNaN(Core.camera.position.x) || Float.isNaN(Core.camera.position.y)){
Core.camera.position.x = players[0].x;
Core.camera.position.y = players[0].y;
}
Graphics.clear(clearColor);
@@ -278,6 +284,7 @@ public class Renderer extends RendererModule{
drawAndInterpolate(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName);
EntityDraw.setClip(true);
Graphics.end();
Draw.color();
}
private void drawFlyerShadows(){
+1 -4
View File
@@ -237,12 +237,9 @@ public class World extends Module{
EntityPhysics.resizeTree(0, 0, width * tilesize, height * tilesize);
Timers.mark();
generator.generateMap(tiles, sector);
endMapLoad();
Log.info("Full time to generate: {0}", Timers.elapsed());
}
public void loadMap(Map map){
@@ -300,7 +297,7 @@ public class World extends Module{
}
public void setBlock(Tile tile, Block block, Team team){
tile.setBlock(block);
tile.setBlock(block, team);
if(block.isMultiblock()){
int offsetx = -(block.size - 1) / 2;
int offsety = -(block.size - 1) / 2;
@@ -82,14 +82,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
//region unit and event overrides, utility methods
@Remote(targets = Loc.server, called = Loc.server)
public static void onPlayerDamage(Player player, float amount){
if(player == null) return;
player.hitTime = hitDuration;
player.health -= amount;
}
@Remote(targets = Loc.server, called = Loc.server)
public static void onPlayerDeath(Player player){
if(player == null) return;
@@ -227,7 +219,10 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override
public void damage(float amount){
Call.onPlayerDamage(this, calculateDamage(amount));
hitTime = hitDuration;
if(!Net.client()){
health -= amount;
}
if(health <= 0 && !dead){
Call.onPlayerDeath(this);
@@ -365,9 +360,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void drawOver(){
if(dead) return;
if(!isShooting()){
drawBuilding(this);
}
drawBuilding(this);
if(mech.flying || boostHeat > 0.001f){
float wobblyness = 0.6f;
@@ -443,6 +436,13 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void update(){
hitTime = Math.max(0f, hitTime - Timers.delta());
if(Float.isNaN(x) || Float.isNaN(y)){
TileEntity core = getClosestCore();
if(core != null){
set(core.x, core.y);
}
}
if(isDead()){
isBoosting = false;
boostHeat = 0f;
@@ -478,9 +478,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
avoidOthers(8f);
}
if(!isShooting()){
updateBuilding(this);
}
updateBuilding(this);
x = Mathf.clamp(x, 0, world.width() * tilesize);
y = Mathf.clamp(y, 0, world.height() * tilesize);
@@ -147,11 +147,14 @@ public class Units{
}
}
/**
* Returns the closest target enemy. First, units are checked, then tile entities.
*/
/**Returns the closest target enemy. First, units are checked, then tile entities.*/
public static TargetTrait getClosestTarget(Team team, float x, float y, float range){
Unit unit = getClosestEnemy(team, x, y, range, u -> true);
return getClosestTarget(team, x, y, range, u -> true);
}
/**Returns the closest target enemy. First, units are checked, then tile entities.*/
public static TargetTrait getClosestTarget(Team team, float x, float y, float range, Predicate<Unit> unitPred){
Unit unit = getClosestEnemy(team, x, y, range, unitPred);
if(unit != null){
return unit;
}else{
@@ -179,7 +179,7 @@ public class Puddle extends BaseEntity implements SaveTrait, Poolable, DrawTrait
float deposited = Math.min((amount - maxLiquid / 1.5f) / 4f, 0.3f) * Timers.delta();
for(GridPoint2 point : Geometry.d4){
Tile other = world.tile(tile.x + point.x, tile.y + point.y);
if(other.block() == Blocks.air && !other.hasCliffs()){
if(other != null && other.block() == Blocks.air && !other.hasCliffs()){
deposit(other, tile, liquid, deposited, generation + 1);
amount -= deposited / 2f; //tweak to speed up/slow down puddle propagation
}
@@ -10,6 +10,7 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Build;
@@ -71,6 +72,7 @@ public interface BuilderTrait extends Entity{
if(request != null){
output.writeByte(request.remove ? 1 : 0);
output.writeInt(world.toPacked(request.x, request.y));
output.writeFloat(request.progress);
if(!request.remove){
output.writeByte(request.recipe.id);
output.writeByte(request.rotation);
@@ -91,6 +93,7 @@ public interface BuilderTrait extends Entity{
byte type = input.readByte();
if(type != -1){
int position = input.readInt();
float progress = input.readFloat();
BuildRequest request;
if(type == 1){ //remove
@@ -101,8 +104,12 @@ public interface BuilderTrait extends Entity{
request = new BuildRequest(position % world.width(), position / world.width(), rotation, Recipe.getByID(recipe));
}
request.progress = progress;
if(applyChanges){
getPlaceQueue().addLast(request);
}else if(isBuilding()){
getCurrentRequest().progress = progress;
}
}
}
@@ -144,6 +151,10 @@ public interface BuilderTrait extends Entity{
return;
}
}
Tile tile = world.tile(place.x, place.y);
if(tile != null && tile.entity instanceof BuildEntity){
place.progress = tile.<BuildEntity>entity().progress;
}
getPlaceQueue().addLast(place);
}
}
@@ -202,17 +213,28 @@ public interface BuilderTrait extends Entity{
//otherwise, update it.
BuildEntity entity = tile.entity();
//deconstructing is 2x as fast
if(current.remove){
entity.deconstruct(unit, core, 2f / entity.buildCost * Timers.delta() * getBuildPower(tile));
}else{
entity.construct(unit, core, 1f / entity.buildCost * Timers.delta() * getBuildPower(tile));
if(entity == null){
getPlaceQueue().removeFirst();
return;
}
if(unit.distanceTo(tile) <= placeDistance){
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(entity), 0.4f);
}
current.progress = entity.progress();
//progress is synced, thus not updated clientside
if(!Net.client()){
//deconstructing is 2x as fast
if(current.remove){
entity.deconstruct(unit, core, 2f / entity.buildCost * Timers.delta() * getBuildPower(tile));
}else{
entity.construct(unit, core, 1f / entity.buildCost * Timers.delta() * getBuildPower(tile));
}
current.progress = entity.progress();
}else{
entity.progress = current.progress;
}
}
/**Do not call directly.*/
@@ -329,6 +329,10 @@ public class Drone extends FlyingUnit implements BuilderTrait{
public void update(){
super.update();
if(target != null && target.getTeam() != team){
target = null;
}
if(Net.client() && state.is(repair) && target instanceof TileEntity){
TileEntity entity = (TileEntity) target;
entity.health += type.healSpeed * Timers.delta();
@@ -429,7 +433,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override
public void write(DataOutput data) throws IOException{
super.write(data);
data.writeInt(mineTile == null ? -1 : mineTile.packedPosition());
data.writeInt(mineTile == null || !state.is(mine) ? -1 : mineTile.packedPosition());
data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.packedPosition() : -1);
writeBuilding(data);
}
@@ -24,6 +24,7 @@ import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.*;
public class OverlayRenderer{
private float buildFadeTime;
public void drawBottom(){
for(Player player : players){
@@ -58,6 +59,24 @@ public class OverlayRenderer{
input.drawTop();
buildFadeTime = Mathf.lerpDelta(buildFadeTime, input.isPlacing() ? 1f : 0f, 0.06f);
Draw.reset();
Lines.stroke(buildFadeTime*2f);
if(buildFadeTime > 0.005f){
for(TeamData data : state.teams.enemyDataOf(player.getTeam())){
for(Tile core : data.cores){
float dst = Vector2.dst(player.x, player.y, core.drawx(), core.drawy());
if(dst < enemyCoreBuildRange * 1.5f){
Draw.color(Color.DARK_GRAY);
Lines.poly(core.drawx(), core.drawy() - 2, 200, enemyCoreBuildRange);
Draw.color(Palette.accent, data.team.color, 0.5f + Mathf.absin(Timers.time(), 10f, 0.5f));
Lines.poly(core.drawx(), core.drawy(), 200, enemyCoreBuildRange);
}
}
}
}
Draw.reset();
//draw selected block bars and info
@@ -93,7 +93,7 @@ public abstract class InputHandler extends InputAdapter{
ItemTransfer.create(stack.item,
player.x + Angles.trnsx(player.rotation + 180f, backTrns), player.y + Angles.trnsy(player.rotation + 180f, backTrns),
new Translator(tile.drawx() + stackTrns.x, tile.drawy() + stackTrns.y), () -> {
if(tile.block() != block) return;
if(tile.block() != block || tile.entity == null) return;
tile.block().handleStack(stack.item, removed, tile, player);
remaining[1] -= removed;
@@ -584,6 +584,11 @@ public class MobileInput extends InputHandler implements GestureListener{
@Override
public void update(){
if(state.is(State.menu)){
selection.clear();
removals.clear();
mode = none;
}
//reset state when not placing
if(mode == none){
+1 -1
View File
@@ -105,7 +105,7 @@ public class TypeIO{
@WriteClass(CarryTrait.class)
public static void writeCarry(ByteBuffer buffer, CarryTrait unit){
if(unit == null){
if(unit == null || unit.getGroup() == null){
buffer.put((byte) -1);
return;
}
@@ -128,7 +128,7 @@ public class FortressGenerator{
int maxIndex = (int)(1 + ((float)gen.sector.difficulty / maxDifficulty * (structures.length-2)));
for(int i = maxIndex/2; i < maxIndex; i++){
selected.add(structures[i]);
selected.add(structures[Math.min(i, structures.length-1)]);
}
float baseChance = 0.8f / selected.size;
@@ -187,7 +187,7 @@ public class FortressGenerator{
Block fixBlock(Block result){
if(result == UnitBlocks.resupplyPoint) result = DefenseBlocks.tungstenWall;
if(result == UnitBlocks.monsoonPad) result = DefenseBlocks.tungstenWallLarge;
if(result == UnitBlocks.dronePad) result = DefenseBlocks.tungstenWallLarge;
if(result == UnitBlocks.fabricatorPad) result = DefenseBlocks.tungstenWallLarge;
return result;
}
@@ -283,8 +283,10 @@ public class WorldGenerator{
if(iceridge > 0.25 && minDst > lerpDst/1.5f){
elevation ++;
}
}else{
}else if(minDst > lerpDst/1.5f){
floor = Blocks.lava;
}else{
floor = Blocks.blackstone;
}
if(temp < 0.6f){
@@ -129,6 +129,9 @@ public class NetworkIO{
}
}
//now write a snapshot.
netServer.writeSnapshot(player, stream);
}catch(IOException e){
throw new RuntimeException(e);
}
@@ -185,10 +188,10 @@ public class NetworkIO{
int height = stream.readShort();
//TODO send advanced map meta such as author, etc
//TODO scan for cores
Map currentMap = new Map(map, new MapMeta(0, new ObjectMap<>(), width, height, null), true, () -> null);
currentMap.meta.tags.clear();
currentMap.meta.tags.putAll(tags);
world.setSector(null);
world.setMap(currentMap);
Tile[][] tiles = world.createTiles(width, height);
@@ -270,6 +273,9 @@ public class NetworkIO{
world.endMapLoad();
//read raw snapshot
netClient.readSnapshot(stream);
}catch(IOException e){
throw new RuntimeException(e);
}
+11 -10
View File
@@ -1,5 +1,6 @@
package io.anuke.mindustry.net;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Base64Coder;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.Vars;
@@ -155,7 +156,7 @@ public class Packets{
public float x, y, pointerX, pointerY, rotation, baseRotation, xv, yv;
public Tile mining;
public boolean boosting, shooting;
public BuildRequest currentRequest;
public Array<BuildRequest> requests = new Array<>();
@Override
public void write(ByteBuffer buffer){
@@ -180,17 +181,14 @@ public class Packets{
buffer.putInt(player.getMineTile() == null ? -1 : player.getMineTile().packedPosition());
BuildRequest request = player.getCurrentRequest();
if(request != null){
buffer.putShort((short)player.getPlaceQueue().size);
for(BuildRequest request : player.getPlaceQueue()){
buffer.put(request.remove ? (byte) 1 : 0);
buffer.putInt(world.toPacked(request.x, request.y));
if(!request.remove){
buffer.put((byte) request.recipe.id);
buffer.put((byte) request.rotation);
}
}else{
buffer.put((byte) -1);
}
}
@@ -211,10 +209,13 @@ public class Packets{
rotation = buffer.getShort() / 2f;
baseRotation = buffer.getShort() / 2f;
mining = world.tile(buffer.getInt());
requests.clear();
byte type = buffer.get();
if(type != -1){
short reqamount = buffer.getShort();
for(int i = 0; i < reqamount; i++){
byte type = buffer.get();
int position = buffer.getInt();
BuildRequest currentRequest;
if(type == 1){ //remove
currentRequest = new BuildRequest(position % world.width(), position / world.width());
@@ -223,8 +224,8 @@ public class Packets{
byte rotation = buffer.get();
currentRequest = new BuildRequest(position % world.width(), position / world.width(), rotation, Recipe.getByID(recipe));
}
}else{
currentRequest = null;
requests.add(currentRequest);
}
}
}
@@ -96,8 +96,6 @@ public class ContentDisplay{
table.row();
table.add(Bundles.format("text.item.fluxiness", (int) (item.fluxiness * 100)));
table.row();
table.add(Bundles.format("text.item.hardness", item.hardness));
table.row();
}
public static void displayLiquid(Table table, Liquid liquid){
@@ -12,10 +12,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.scene.style.Drawable;
import io.anuke.ucore.scene.ui.Dialog;
import io.anuke.ucore.scene.ui.ImageButton;
import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.TextButton;
import io.anuke.ucore.scene.ui.*;
import io.anuke.ucore.scene.ui.layout.Cell;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.scene.utils.UIUtils;
@@ -49,10 +46,12 @@ public class JoinDialog extends FloatingDialog{
add = new FloatingDialog("$text.joingame.title");
add.content().add("$text.joingame.ip").padRight(5f).left();
Platform.instance.addDialog(add.content().addField(Settings.getString("ip"), text -> {
TextField field = add.content().addField(Settings.getString("ip"), text -> {
Settings.putString("ip", text);
Settings.save();
}).size(320f, 54f).get(), 100);
}).size(320f, 54f).get();
Platform.instance.addDialog(field, 100);
add.content().row();
add.buttons().defaults().size(140f, 60f).pad(4f);
@@ -75,6 +74,9 @@ public class JoinDialog extends FloatingDialog{
add.shown(() -> {
add.getTitleLabel().setText(renaming != null ? "$text.server.edit" : "$text.server.add");
if(renaming != null){
field.setText(renaming.ip);
}
});
shown(() -> {
@@ -89,7 +89,7 @@ public class BlockInventoryFragment extends Fragment{
table.background("inventory");
table.setTouchable(Touchable.enabled);
table.update(() -> {
if(tile == null || tile.entity == null || !tile.block().isAccessible() || tile.entity.items.total() == 0){
if(state.is(State.menu) || tile == null || tile.entity == null || !tile.block().isAccessible() || tile.entity.items.total() == 0){
hide();
}else{
if(holding && lastItem != null){
@@ -65,13 +65,13 @@ public class BlocksFragment extends Fragment{
//add top description table
descTable = new Table("button");
descTable.visible(() -> hoverRecipe != null || input.recipe != null); //make sure it's visible when necessary
descTable.visible(() -> (hoverRecipe != null || input.recipe != null) && shown); //make sure it's visible when necessary
descTable.update(() -> {
// note: This is required because there is no direct connection between input.recipe and the description ui.
// If input.recipe gets set to null, a proper cleanup of the ui elements is required.
boolean anyRecipeShown = input.recipe != null || hoverRecipe != null;
boolean descriptionTableClean = descTable.getChildren().size == 0;
boolean cleanupRequired = !anyRecipeShown && !descriptionTableClean;
boolean cleanupRequired = (!anyRecipeShown && !descriptionTableClean);
if(cleanupRequired){
descTable.clear();
}
@@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.fragments;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.BitmapFont.Glyph;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array;
@@ -24,6 +25,7 @@ import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.players;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.ucore.core.Core.font;
import static io.anuke.ucore.core.Core.scene;
import static io.anuke.ucore.core.Core.skin;
@@ -34,7 +36,7 @@ public class ChatFragment extends Table{
private boolean chatOpen = false;
private TextField chatfield;
private Label fieldlabel = new Label(">");
private BitmapFont font;
//private BitmapFont font;
private GlyphLayout layout = new GlyphLayout();
private float offsetx = Unit.dp.scl(4), offsety = Unit.dp.scl(4), fontoffsetx = Unit.dp.scl(2), chatspace = Unit.dp.scl(50);
private float textWidth = Unit.dp.scl(600);
@@ -54,7 +56,7 @@ public class ChatFragment extends Table{
super();
setFillParent(true);
font = Core.skin.getFont("default-font");
//font = Core.skin.getFont("default-font");
visible(() -> !state.is(State.menu) && Net.active());
@@ -97,15 +99,31 @@ public class ChatFragment extends Table{
private void setup(){
fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle()));
fieldlabel.getStyle().font = font;
//fieldlabel.getStyle().font = font;
fieldlabel.setStyle(fieldlabel.getStyle());
chatfield = new TextField("", new TextField.TextFieldStyle(skin.get(TextField.TextFieldStyle.class)));
chatfield = new TextField("", new TextField.TextFieldStyle(skin.get(TextField.TextFieldStyle.class))){
@Override
public void draw(Batch batch, float parentAlpha){
getStyle().font.getData().markupEnabled = false;
super.draw(batch, parentAlpha);
getStyle().font.getData().markupEnabled = true;
}
};
chatfield.setTextFieldFilter((field, c) -> field.getText().length() < Vars.maxTextLength);
chatfield.getStyle().background = null;
chatfield.getStyle().fontColor = Color.WHITE;
chatfield.getStyle().font = skin.getFont("default-font-chat");
chatfield.setStyle(chatfield.getStyle());
chatfield.update(() -> {
BitmapFont font = detectFont(chatfield.getText());;
if(font != chatfield.getStyle().font){
chatfield.getStyle().font = detectFont(chatfield.getText());
chatfield.setStyle(chatfield.getStyle());
String text = chatfield.getText();
chatfield.clearText();
chatfield.appendText(text);
}
});
Platform.instance.addDialog(chatfield, Vars.maxTextLength);
bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(4f);
@@ -127,8 +145,9 @@ public class ChatFragment extends Table{
batch.setColor(shadowColor);
if(chatOpen)
if(chatOpen){
batch.draw(skin.getRegion("white"), offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1);
}
super.draw(batch, alpha);
@@ -141,6 +160,7 @@ public class ChatFragment extends Table{
float theight = offsety + spacing + getMarginBottom();
for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || chatOpen); i++){
BitmapFont font = detectFont(messages.get(i).formattedMessage);
layout.setText(font, messages.get(i).formattedMessage, Color.WHITE, textWidth, Align.bottomLeft, true);
theight += layout.height + textspacing;
@@ -166,6 +186,25 @@ public class ChatFragment extends Table{
fadetime -= Timers.delta() / 180f;
}
private BitmapFont detectFont(String text){
for(int i = 0; i < text.length(); i++){
if(isControl((int) text.charAt(i))) continue;
Glyph g = font.getData().getGlyph(text.charAt(i));
if(g == null || g == font.getData().missingGlyph){
for(BitmapFont font : Core.skin.getAll(BitmapFont.class).values()){
if(font.getData().getGlyph(text.charAt(i)) != null){
return font;
}
}
}
}
return Core.font;
}
private boolean isControl(int var0){
return var0 <= 159 && (var0 >= 127 || var0 >>> 5 == 0);
}
private void sendMessage(){
String message = chatfield.getText();
clearChatInput();
@@ -121,7 +121,7 @@ public abstract class BaseBlock{
Tile other = proximity.get((i + dump) % proximity.size);
Tile in = Edges.getFacingEdge(tile, other);
if(other.block().hasLiquids && canDumpLiquid(tile, other, liquid)){
if(other.getTeamID() == tile.getTeamID() && other.block().hasLiquids && canDumpLiquid(tile, other, liquid)){
float ofract = other.entity.liquids.get(liquid) / other.block().liquidCapacity;
float fract = tile.entity.liquids.get(liquid) / liquidCapacity;
@@ -149,7 +149,7 @@ public abstract class BaseBlock{
next = next.target();
if(next.block().hasLiquids && tile.entity.liquids.get(liquid) > 0f){
if(next.getTeamID() == tile.getTeamID() && next.block().hasLiquids && tile.entity.liquids.get(liquid) > 0f){
if(next.block().acceptLiquid(next, tile, liquid, 0f)){
float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity;
@@ -199,7 +199,7 @@ public abstract class BaseBlock{
incrementDump(tile, proximity.size);
Tile other = proximity.get((i + dump) % proximity.size);
Tile in = Edges.getFacingEdge(tile, other);
if(other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
if(other.getTeamID() == tile.getTeamID() && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
other.block().handleItem(item, other, in);
return;
}
@@ -239,7 +239,7 @@ public abstract class BaseBlock{
for(int ii = 0; ii < Item.all().size; ii++){
Item item = Item.getByID(ii);
if(entity.items.has(item) && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
if(other.getTeamID() == tile.getTeamID() && entity.items.has(item) && other.block().acceptItem(item, other, in) && canDump(tile, other, item)){
other.block().handleItem(item, other, in);
tile.entity.items.remove(item, 1);
incrementDump(tile, proximity.size);
@@ -248,7 +248,7 @@ public abstract class BaseBlock{
}
}else{
if(other.block().acceptItem(todump, other, in) && canDump(tile, other, todump)){
if(other.getTeamID() == tile.getTeamID() && other.block().acceptItem(todump, other, in) && canDump(tile, other, todump)){
other.block().handleItem(todump, other, in);
tile.entity.items.remove(todump, 1);
incrementDump(tile, proximity.size);
@@ -274,7 +274,7 @@ public abstract class BaseBlock{
/** Try offloading an item to a nearby container in its facing direction. Returns true if success.*/
public boolean offloadDir(Tile tile, Item item){
Tile other = tile.getNearby(tile.getRotation());
if(other != null && other.block().acceptItem(item, other, tile)){
if(other != null && other.target().getTeamID() == tile.getTeamID() && other.block().acceptItem(item, other, tile)){
other.block().handleItem(item, other, tile);
return true;
}
+1 -1
View File
@@ -42,7 +42,7 @@ public class Block extends BaseBlock implements Content{
/** internal ID */
public final int id;
/** display name */
public final String formalName;
public String formalName;
/** Detailed description of the block. Can be as long as necesary. */
public final String fullDescription;
/** whether this block has a tile entity that updates */
@@ -1,10 +1,12 @@
package io.anuke.mindustry.world;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.EventType.BlockBuildEvent;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.ucore.core.Events;
@@ -135,6 +137,15 @@ public class Build{
}
}
//check for enemy cores
for(TeamData data : state.teams.enemyDataOf(team)){
for(Tile core : data.cores){
if(Vector2.dst(x*tilesize + type.offset(), y*tilesize + type.offset(), core.drawx(), core.drawy()) < enemyCoreBuildRange + type.size*tilesize/2f){
return false;
}
}
}
Tile tile = world.tile(x, y);
if(tile == null) return false;
+10 -5
View File
@@ -8,6 +8,7 @@ import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.blocks.BlockPart;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.modules.ConsumeModule;
import io.anuke.mindustry.world.modules.InventoryModule;
@@ -166,8 +167,13 @@ public class Tile implements PosTrait, TargetTrait{
}
public void setBlock(Block type, Team team){
setBlock(type);
setTeam(team);
synchronized(tileSetLock){
preChanged();
this.wall = type;
this.team = (byte)team.ordinal();
this.link = 0;
changed();
}
}
public void setBlock(Block type){
@@ -392,6 +398,7 @@ public class Tile implements PosTrait, TargetTrait{
if(entity != null){
entity.removeFromProximity();
}
team = 0;
}
}
@@ -403,8 +410,6 @@ public class Tile implements PosTrait, TargetTrait{
entity = null;
}
team = 0;
Block block = block();
if(block.hasEntity()){
@@ -414,7 +419,7 @@ public class Tile implements PosTrait, TargetTrait{
if(block.hasLiquids) entity.liquids = new LiquidModule();
if(block.hasPower) entity.power = new PowerModule();
entity.updateProximity();
}else{
}else if(!(block instanceof BlockPart)){
//since the entity won't update proximity for us, update proximity for all nearby tiles manually
for(GridPoint2 p : Geometry.d4){
Tile tile = world.tile(x + p.x, y + p.y);
@@ -53,9 +53,8 @@ public class BuildBlock extends Block{
@Remote(called = Loc.server)
public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team){
world.setBlock(tile, block, team);
tile.setRotation(rotation);
tile.setTeam(team);
world.setBlock(tile, block, team);
Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size);
//last builder was this local client player, call placed()
@@ -225,7 +224,7 @@ public class BuildBlock extends Block{
int accumulated = (int) (accumulator[i]); //get amount
if(amount > 0){ //if it's positive, add it to the core
if(amount > 0 && accumulated > 0){ //if it's positive, add it to the core
int accepting = core.tile.block().acceptStack(requirements[i].item, accumulated, core.tile, builder);
core.tile.block().handleStack(requirements[i].item, accepting, core.tile, builder);
@@ -236,7 +235,7 @@ public class BuildBlock extends Block{
progress = Mathf.clamp(progress - amount);
if(progress <= 0 || debug || state.mode.infiniteResources){
if(progress <= 0 || state.mode.infiniteResources){
Call.onDeconstructFinish(tile, this.recipe == null ? previous : this.recipe.result);
}
}
@@ -14,6 +14,7 @@ public class OreBlock extends Floor{
public OreBlock(Item ore, Floor base){
super("ore-" + ore.name + "-" + base.name);
this.formalName = ore.name + " " + base.formalName;
this.drops = new ItemStack(ore, 1);
this.base = base;
this.variants = 3;
@@ -7,10 +7,10 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.Predict;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType;
import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.AmmoEntry;
@@ -37,7 +37,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.tilesize;
public abstract class Turret extends Block{
protected static final int targetInterval = 15;
protected static final int targetInterval = 20;
protected final int timerTarget = timers++;
@@ -188,11 +188,11 @@ public abstract class Turret extends Block{
if(hasAmmo(tile)){
if(entity.timer.get(timerTarget, targetInterval)){
entity.target = Units.getClosestEnemy(tile.getTeam(),
entity.target = Units.getClosestTarget(tile.getTeam(),
tile.drawx(), tile.drawy(), range, e -> !e.isDead() && (!e.isFlying() || targetAir));
}
if(entity.target != null){
if(!Units.invalidateTarget(entity.target, tile.getTeam(), tile.drawx(), tile.drawy())){
AmmoType type = peekAmmo(tile);
float speed = type.bullet.speed;
if(speed < 0.1f) speed = 9999999f;
@@ -322,7 +322,7 @@ public abstract class Turret extends Block{
public float recoil = 0f;
public float heat;
public int shots;
public Unit target;
public TargetTrait target;
@Override
public void write(DataOutputStream stream) throws IOException{
@@ -98,7 +98,7 @@ public class Conveyor extends Block{
byte rotation = tile.getRotation();
int frame = entity.clogHeat <= 0.5f ? (int) ((Timers.time() / 4f) % 4) : 0;
Draw.rect(regions[entity.blendbits][frame], tile.drawx(), tile.drawy(),
Draw.rect(regions[Mathf.clamp(entity.blendbits, 0, regions.length - 1)][Mathf.clamp(frame, 0, regions[0].length - 1)], tile.drawx(), tile.drawy(),
tilesize * entity.blendsclx, tilesize * entity.blendscly, rotation*90);
}
@@ -134,9 +134,8 @@ public class Conveyor extends Block{
Tile other = tile.getNearby(Mathf.mod(tile.getRotation() - direction, 4));
if(other != null) other = other.target();
if(other == null || !other.block().outputsItems()) return false;
return (tile.getNearby(tile.getRotation()) == other)
|| (!other.block().rotate || other.getNearby(other.getRotation()) == tile);
return other != null && other.block().outputsItems()
&& ((tile.getNearby(tile.getRotation()) == other) || (!other.block().rotate || other.getNearby(other.getRotation()) == tile));
}
@Override
@@ -238,7 +238,7 @@ public class MassDriver extends Block{
protected boolean linkValid(Tile tile){
MassDriverEntity entity = tile.entity();
if(entity.link == -1) return false;
if(entity == null || entity.link == -1) return false;
Tile link = world.tile(entity.link);
return link != null && link.block() instanceof MassDriver && tile.distanceTo(link) <= range;
@@ -35,6 +35,7 @@ public class OverflowGate extends Splitter{
int from = tile.relativeTo(src.x, src.y);
if(from == -1) return null;
Tile to = tile.getNearby((from + 2) % 4);
if(to == null) return null;
Tile edge = Edges.getFacingEdge(tile, to);
if(!to.block().acceptItem(item, to, edge) || (to.block() instanceof OverflowGate)){
@@ -53,7 +53,7 @@ public class PowerDistributor extends PowerBlock{
protected boolean shouldDistribute(Tile tile, Tile other){
other = other.target();
//only generators can distribute to other generators
return (!(other.block() instanceof PowerGenerator) || tile.block() instanceof PowerGenerator)
return other.getTeamID() == tile.getTeamID() && (!(other.block() instanceof PowerGenerator) || tile.block() instanceof PowerGenerator)
&& other.entity != null
&& other.block().hasPower
&& other.entity.power.amount / other.block().powerCapacity < tile.entity.power.amount / powerCapacity;
@@ -60,7 +60,7 @@ public class PowerNode extends PowerBlock{
entity.links.add(other.packedPosition());
}
if(other.block() instanceof PowerNode){
if(other.getTeamID() == tile.getTeamID() && other.block() instanceof PowerNode){
DistributorEntity oe = other.entity();
if(!oe.links.contains(tile.packedPosition())){
@@ -224,12 +224,12 @@ public class PowerNode extends PowerBlock{
}
protected boolean shouldDistribute(Tile tile, Tile other){
return other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
return other != null && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
!(other.block() instanceof PowerGenerator); //do not distribute to power generators
}
protected boolean shouldLeechPower(Tile tile, Tile other){
return !(other.block() instanceof PowerNode)
return other.getTeamID() == tile.getTeamID() && !(other.block() instanceof PowerNode)
&& other.block() instanceof PowerDistributor //only suck power from batteries and power generators
&& other.entity.power.amount / other.block().powerCapacity > tile.entity.power.amount / powerCapacity;
}
@@ -282,7 +282,7 @@ public class PowerNode extends PowerBlock{
}
protected boolean linkValid(Tile tile, Tile link, boolean checkMaxNodes){
if(!(tile != link && link != null && link.block().hasPower)) return false;
if(!(tile != link && link != null && link.block().hasPower) || tile.getTeamID() != link.getTeamID()) return false;
if(link.block() instanceof PowerNode){
DistributorEntity oe = link.entity();
@@ -234,6 +234,7 @@ public class Drill extends Block{
}
protected boolean isValid(Tile tile){
if(tile == null) return false;
ItemStack drops = tile.floor().drops;
return drops != null && drops.item.hardness <= tier;
}
@@ -81,7 +81,7 @@ public class GenericCrafter extends Block{
public void update(Tile tile){
GenericCrafterEntity entity = tile.entity();
if(entity.cons.valid()){
if(entity.cons.valid() && tile.entity.items.get(output) < itemCapacity){
entity.progress += 1f / craftTime * Timers.delta();
entity.totalProgress += Timers.delta();
@@ -107,6 +107,7 @@ public class SolidPump extends Pump{
@Override
protected boolean isValid(Tile tile){
if(tile == null) return false;
return !tile.floor().isLiquid;
}
@@ -103,7 +103,7 @@ public class CoreBlock extends StorageBlock{
@Override
public float handleDamage(Tile tile, float amount){
return amount;
return debug ? 0 : amount;
}
@Override
@@ -40,7 +40,7 @@ import java.io.IOException;
public class UnitPad extends Block{
protected float gracePeriodMultiplier = 23f;
protected float speedupTime = 60f * 60f * 20;
protected float maxSpeedup = 7f;
protected float maxSpeedup = 2f;
protected UnitType type;
protected float produceTime = 1000f;
@@ -48,7 +48,7 @@ public class ConsumeItem extends Consume{
@Override
public boolean valid(Block block, TileEntity entity){
return entity.items.has(item, amount);
return entity != null && entity.items != null && entity.items.has(item, amount);
}
@Override
@@ -1,89 +0,0 @@
package io.anuke.kryonet;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import com.esotericsoftware.kryonet.Listener.QueuedListener;
import java.util.LinkedList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class CustomListeners {
static public class LagListener extends QueuedListener {
protected final ScheduledExecutorService threadPool;
private final int lagMillisMin, lagMillisMax;
final LinkedList<Runnable> runnables = new LinkedList<>();
public LagListener (int lagMillisMin, int lagMillisMax, Listener listener) {
super(listener);
this.lagMillisMin = lagMillisMin;
this.lagMillisMax = lagMillisMax;
threadPool = Executors.newScheduledThreadPool(1, r -> {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
});
}
protected int calculateLag() {
return lagMillisMin + (int)(Math.random() * (lagMillisMax - lagMillisMin));
}
@Override
public void queue (Runnable runnable) {
synchronized (runnables) {
runnables.addFirst(runnable);
}
threadPool.schedule(() -> {
Runnable runnable1;
synchronized (runnables) {
runnable1 = runnables.removeLast();
}
runnable1.run();
}, calculateLag(), TimeUnit.MILLISECONDS);
}
}
/**
* Delays, reorders and does not make guarantees to the delivery of incoming objects
* to the wrapped listener (in order to simulate lag, jitter, package loss and
* package duplication).
* Notification events are likely processed on a separate thread after a delay.
* Note that only the delivery of incoming objects is modified. To modify the delivery
* of outgoing objects, use a UnreliableListener at the other end of the connection.
*/
static public class UnreliableListener extends LagListener {
private final float lossPercentage;
private final float duplicationPercentage;
private final CustomListeners.LagListener tcpListener;
public UnreliableListener (int lagMillisMin, int lagMillisMax, float lossPercentage,
float duplicationPercentage, Listener listener) {
super(lagMillisMin, lagMillisMax, listener);
this.tcpListener = new CustomListeners.LagListener(lagMillisMin, lagMillisMax, listener);
this.lossPercentage = lossPercentage;
this.duplicationPercentage = duplicationPercentage;
}
@Override
public void received(Connection connection, Object object) {
if(KryoCore.lastUDP) {
super.received(connection, object);
}else{
tcpListener.received(connection, object);
}
}
@Override
public void queue (Runnable runnable) {
do {
if (Math.random() >= lossPercentage) {
threadPool.schedule(runnable, calculateLag(), TimeUnit.MILLISECONDS);
}
} while (Math.random() < duplicationPercentage);
}
}
}
+1 -2
View File
@@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet;
import com.esotericsoftware.kryonet.*;
import com.esotericsoftware.minlog.Log;
import io.anuke.kryonet.CustomListeners.UnreliableListener;
import io.anuke.mindustry.net.Host;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.ClientProvider;
@@ -100,7 +99,7 @@ public class KryoClient implements ClientProvider{
};
if(KryoCore.fakeLag){
client.addListener(new UnreliableListener(KryoCore.fakeLagMin, KryoCore.fakeLagMax, KryoCore.fakeLagDrop, KryoCore.fakeLagDuplicate, listener));
client.addListener(new Listener.LagListener(KryoCore.fakeLagMin, KryoCore.fakeLagMax, listener));
}else{
client.addListener(listener);
}
+2 -2
View File
@@ -5,9 +5,9 @@ import com.badlogic.gdx.utils.Array;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.FrameworkMessage;
import com.esotericsoftware.kryonet.Listener;
import com.esotericsoftware.kryonet.Listener.LagListener;
import com.esotericsoftware.kryonet.Server;
import com.esotericsoftware.kryonet.util.InputStreamSender;
import io.anuke.kryonet.CustomListeners.UnreliableListener;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Net.ServerProvider;
@@ -100,7 +100,7 @@ public class KryoServer implements ServerProvider {
};
if(KryoCore.fakeLag){
server.addListener(new UnreliableListener(KryoCore.fakeLagMin, KryoCore.fakeLagMax, KryoCore.fakeLagDrop, KryoCore.fakeLagDuplicate, listener));
server.addListener(new LagListener(KryoCore.fakeLagMin, KryoCore.fakeLagMax, listener));
}else{
server.addListener(listener);
}
@@ -38,13 +38,16 @@ import static io.anuke.ucore.util.Log.*;
public class ServerControl extends Module{
private final CommandHandler handler = new CommandHandler("");
private ShuffleMode mode;
//consecutive sector losses
private int gameOvers;
public ServerControl(String[] args){
Settings.defaultList(
"shufflemode", "normal",
"bans", "",
"admins", "",
"sectorid", 0
"sector_x", 0,
"sector_y", 1
);
mode = ShuffleMode.valueOf(Settings.getString("shufflemode"));
@@ -105,7 +108,14 @@ public class ServerControl extends Module{
state.set(State.playing);
}
}else{
info("Re-trying sector map.");
if(gameOvers >= 2){
info("Two consecutive game-overs detected, shifting sector Y.");
Settings.putInt("sector_x", Settings.getInt("sector_x") - 1);
Settings.putInt("sector_y", Settings.getInt("sector_y") + 1);
Settings.save();
}
info("Re-trying sector map: {0} {1}", Settings.getInt("sector_x"), Settings.getInt("sector_y"));
gameOvers ++;
playSectorMap();
}
}else{
@@ -183,7 +193,7 @@ public class ServerControl extends Module{
logic.play();
}else{
Log.info("&ly&fiNo map specified. Loading sector {0}, {1}.", Settings.getInt("sectorid"), 0);
Log.info("&ly&fiNo map specified. Loading sector {0}, {1}.", Settings.getInt("sector_x"), Settings.getInt("sector_y"));
playSectorMap();
}
@@ -259,6 +269,17 @@ public class ServerControl extends Module{
}
});
handler.register("setsector <x> <y>", "Sets the next sector to be played. Does not affect current game.", arg -> {
try{
Settings.putInt("sector_x", Integer.parseInt(arg[0]));
Settings.putInt("sector_y", Integer.parseInt(arg[1]));
Settings.save();
info("Sector position set.");
}catch(NumberFormatException e){
err("Invalid coordinates.");
}
});
handler.register("fillitems", "Fill the core with 2000 items.", arg -> {
if(!state.is(State.playing)){
err("Not playing. Host first.");
@@ -623,9 +644,8 @@ public class ServerControl extends Module{
return;
}
info("&lyCore destroyed.");
Events.fire(GameOverEvent.class);
info("Core destroyed.");
});
handler.register("debuginfo", "Print debug info", arg -> {
@@ -825,7 +845,11 @@ public class ServerControl extends Module{
}
private void playSectorMap(){
world.loadSector(world.sectors().get(Settings.getInt("sectorid"), 0));
int x = Settings.getInt("sector_x"), y = Settings.getInt("sector_y");
if(world.sectors().get(x, y) == null){
world.sectors().createSector(x, y);
}
world.loadSector(world.sectors().get(x, y));
logic.play();
}
@@ -846,7 +870,9 @@ public class ServerControl extends Module{
if(world.getSector().completedMissions >= world.getSector().missions.size){
world.sectors().completeSector(world.getSector().x, world.getSector().y);
world.sectors().save();
Settings.putInt("sectorid", world.getSector().x + 1);
gameOvers = 0;
Settings.putInt("sector_x", world.getSector().x + world.getSector().size);
Settings.save();
netServer.kickAll(KickReason.sectorComplete);