Compare commits

...

60 Commits
v49 ... v51

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

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, 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. 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 #### 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. 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`. 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. 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 #### Useful Information

View File

@@ -26,7 +26,7 @@ allprojects {
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.8' gdxVersion = '1.9.8'
roboVMVersion = '2.3.0' roboVMVersion = '2.3.0'
uCoreVersion = '9969ed07b1' uCoreVersion = '76dc741b49'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()
@@ -169,7 +169,6 @@ project(":core") {
build.finalizedBy(finish) build.finalizedBy(finish)
def comp = System.properties["release"] == null || System.properties["release"] == "false" def comp = System.properties["release"] == null || System.properties["release"] == "false"
if(!comp) println("Note: Compiling release build.") if(!comp) println("Note: Compiling release build.")
if(new File(projectDir.parent, '../uCore').exists() && comp){ 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

View File

@@ -431,6 +431,21 @@ text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0} text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {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.name=Tungsten Wall
block.tungsten-wall-large.name=Large Tungsten Wall block.tungsten-wall-large.name=Large Tungsten Wall
block.carbide-wall.name=Carbide Wall block.carbide-wall.name=Carbide Wall
@@ -446,7 +461,7 @@ block.lancer.name=Lancer
block.conveyor.name=Conveyor block.conveyor.name=Conveyor
block.titanium-conveyor.name=Titanium Conveyor block.titanium-conveyor.name=Titanium Conveyor
block.junction.name=Junction 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.splitter.description=Outputs items into three different directions once they are recieved.
block.router.name=Router block.router.name=Router
block.router.description=Splits items into all 4 directions. Can store items as a buffer. block.router.description=Splits items into all 4 directions. Can store items as a buffer.

View File

@@ -163,7 +163,7 @@ text.settings.game=Gioco
text.settings.sound=Suono text.settings.sound=Suono
text.settings.graphics=Grafica text.settings.graphics=Grafica
text.paused=In pausa text.paused=In pausa
text.info.title=[Accent]Info text.info.title=[accent] Info
text.error.title=[crimson]Si è verificato un errore text.error.title=[crimson]Si è verificato un errore
text.error.crashtitle=Si è verificato un errore text.error.crashtitle=Si è verificato un errore
text.blocks.blockinfo=info sul blocco text.blocks.blockinfo=info sul blocco
@@ -330,106 +330,106 @@ text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed text.blocks.drillspeed=Base Drill Speed
text.blocks.liquidoutput=Liquid Output text.blocks.liquidoutput=Uscita liquidi
text.blocks.liquiduse=Liquid Use text.blocks.liquiduse=Uso liquidi
text.blocks.coolant=Coolant text.blocks.coolant=Refrigerante
text.blocks.coolantuse=Coolant Use text.blocks.coolantuse=uso refrigerante
text.blocks.inputliquidfuel=Fuel Liquid text.blocks.inputliquidfuel=carburante liquido
text.blocks.liquidfueluse=Liquid Fuel Use text.blocks.liquidfueluse=Utilizzo carburante liquido
text.blocks.reload=Reload text.blocks.reload=Ricarica
text.blocks.inputfuel=Fuel text.blocks.inputfuel=Carburante
text.blocks.fuelburntime=Fuel Burn Time text.blocks.fuelburntime=Tempo combustione carburante
text.unit.blocks=blocks text.unit.blocks=blocchi
text.unit.powersecond=power units/second text.unit.powersecond=unità energia/secondo
text.unit.liquidsecond=liquid units/second text.unit.liquidsecond=unità liquide/secondo
text.unit.itemssecond=items/second text.unit.itemssecond=oggetti/secondo
text.unit.pixelssecond=pixels/second text.unit.pixelssecond=pixel/secondo
text.unit.liquidunits=liquid units text.unit.liquidunits=unità liquidi
text.unit.powerunits=power units text.unit.powerunits=unità energia
text.unit.degrees=degrees text.unit.degrees=gradi
text.unit.seconds=seconds text.unit.seconds=secondi
text.unit.none= text.unit.none=
text.unit.items=items text.unit.items=oggetti
text.category.general=General text.category.general=Generali
text.category.power=Power text.category.power=Energia
text.category.liquids=Liquids text.category.liquids=Liquidi
text.category.items=Items text.category.items=Oggetti
text.category.crafting=Crafting text.category.crafting=Produzione
text.category.shooting=Shooting text.category.shooting=Potenza di fuoco
setting.minimap.name=Show Minimap setting.minimap.name=Mostra minimappa
content.item.name=Items content.item.name=Oggetti
content.liquid.name=Liquids content.liquid.name=Liquidi
content.unit-type.name=Units content.unit-type.name=Unità
content.recipe.name=Blocks content.recipe.name=Blocchi
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava. item.stone.description=UN materiale grezzo molto comune, che solitamente viene rifinito per ottenerne degli altri.
item.tungsten.name=Tungsten item.tungsten.name=Tungsteno
item.tungsten.description=A common, but very useful structure material. Used in drills and heat-resistant blocks such as generators and smelteries. 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=Lead item.lead.name=Piombo
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks. item.lead.description=Un materiale base, molto usato nei blocchi di trasporto.
item.coal.description=A common and readily available fuel. item.coal.description=Un carburante comune e facilmente ottenibile.
item.carbide.name=Carbide item.carbide.name=Carburo
item.carbide.description=A tough alloy made with tungsten and carbon. Used in advanced transportation blocks and high-tier drills. 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=A rare super-light metal used extensively in liquid transportation, drills and aircraft. item.titanium.description=Un raro metallo super leggero usato ampiamente nel trasporto di liquidi, trapani e navi.
item.thorium.name=Thorium item.thorium.name=Torio
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel. item.thorium.description=Un materiale denso e radioattivo, utilizzato nella costruzione di strutture e come carburante del reattore nucleare.
item.silicon.name=Silicon item.silicon.name=Silicio
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics. item.silcion.description=Un semiconduttore molto utile che viene utilizzato nei pannelli solari e nei macchinari elettronici.
item.plastanium.name=Plastanium item.plastanium.name=Plastaniu
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition. item.plastanium.description=Un materiale leggero e duttile, utilizzato nelle navi avanzete e come munizione.
item.phase-matter.name=Phase Matter item.phase-matter.name=Vaporizzatore di materia
item.surge-alloy.name=Surge Alloy item.surge-alloy.name=Surge Alloy
item.biomatter.name=Biomatter item.biomatter.name=Biomateria
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel. item.biomatter.description=Materiale organico; Utilizzato per essere convertito in petrolio o carburante.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux. item.sand.description=Un materiale base che viene altamente usato nei processi di fusione, Sia come lega che come lubrificante.
item.blast-compound.name=Blast Compound item.blast-compound.name=Polvere esplosiva
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. 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=Pyratite item.pyratite.name=Pirite
item.pyratite.description=An extremely flammable substance used in incendiary weapons. item.pyratite.description=Una sostanza molto infiammabile che viene utilizzata nelle armi a fuoco.
liquid.cryofluid.name=Cryofluid liquid.cryofluid.name=criogenium
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0} text.item.explosiveness=[LIGHT_GRAY]Esplosività: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0} text.item.flammability=[LIGHT_GRAY]Infiammabilità: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0} text.item.radioactivity=[LIGHT_GRAY]Radioattività: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0} text.item.fluxiness=[LIGHT_GRAY]Portata: {0}
text.item.hardness=[LIGHT_GRAY]Hardness: {0} text.item.hardness=[LIGHT_GRAY]Durezza: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0} text.liquid.heatcapacity=[LIGHT_GRAY]Capacità calorifica: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0} text.liquid.viscosity=[LIGHT_GRAY]Viscosità: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0} text.liquid.temperature=[LIGHT_GRAY]Temperatura: {0}
block.tungsten-wall.name=Tungsten Wall block.tungsten-wall.name=Muro di tungseno
block.tungsten-wall-large.name=Large Tungsten Wall block.tungsten-wall-large.name=Muro grande di tungsteno
block.carbide-wall.name=Carbide Wall block.carbide-wall.name=Muro di carburo
block.carbide-wall-large.name=Large Carbide Wall block.carbide-wall-large.name=Muro grande di carburo
block.thorium-wall.name=Thorium Wall block.thorium-wall.name=Muro di torio
block.thorium-wall-large.name=Large Thorium Wall block.thorium-wall-large.name=Muro grande di torio
block.duo.name=Duo block.duo.name=Duo
block.scorch.name=Scorch block.scorch.name=Scorch
block.hail.name=Hail block.hail.name=Bombardiere
block.lancer.name=Lancer block.lancer.name=Idrogetto
block.titanium-conveyor.name=Titanium Conveyor block.titanium-conveyor.name=Nastro trasportatore potenziato
block.splitter.name=Splitter block.splitter.name=Divisore
block.splitter.description=Outputs items into three different directions once they are recieved. block.splitter.description=Divide gli oggetti in 3 direzioni diverse.
block.router.description=Splits items into all 4 directions. Can store items as a buffer. block.router.description=Divide gli oggetti in 4 direzioni. Ha inventario proprio che viente utilizzato per conservare provvisoriamente oggetti.
block.distributor.name=Distributor block.distributor.name=Mega router
block.distributor.description=A splitter that can split items into 8 directions. block.distributor.description=Un divisore che distribuisce oggetti su 8 lati.
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.sorter.description=Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati.
block.overflow-gate.name=Overflow Gate block.overflow-gate.name=splitter per eccesso
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked. 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=Bridge Conveyor block.bridgeconveyor.name=Nastro trasportatore sopraelevato
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks. block.bridgeconveyor.description=Un nastro trasportatore che può passare sopra i blocchi, al massimo due.
block.arc-smelter.name=Arc Smelter block.arc-smelter.name=Fonderia ad arco
block.silicon-smelter.name=Silicon Smelter block.silicon-smelter.name=Fonderia per silicio
block.phase-weaver.name=Phase Weaver block.phase-weaver.name=Tessitore di fase
block.pulverizer.name=Pulverizer block.pulverizer.name=Polverizzatore
block.cryofluidmixer.name=Cryofluid Mixer block.cryofluidmixer.name=Mixer liqidi
block.melter.name=Melter block.melter.name=Fonditore
block.incinerator.name=Incinerator block.incinerator.name=Inceneritore
block.biomattercompressor.name=Biomatter Compressor block.biomattercompressor.name=Compostore
block.separator.name=Separator block.separator.name=Separatore
block.centrifuge.name=Centrifuge block.centrifuge.name=Centrifugatore
block.power-node.name=Power Node block.power-node.name=Snodo energetico
block.power-node-large.name=Large Power Node block.power-node-large.name=Snodo energetico grande
block.battery.name=Battery block.battery.name=Batteria
block.battery-large.name=Large Battery block.battery-large.name=Batteria grossa
block.combustion-generator.name= block.combustion-generator.name=generatore a carbone
block.turbine-generator.name=Turbina block.turbine-generator.name=Turbina
block.tungsten-drill.name=Estrattore con punta al tungsteno block.tungsten-drill.name=Estrattore con punta al tungsteno
block.carbide-drill.name=Estrattore con punta al carburo 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.repairpoint.name=Punto di riparazione
block.resupplypoint.name=Punto di rifornimento block.resupplypoint.name=Punto di rifornimento
block.liquidtank.name=Tanica block.liquidtank.name=Tanica
block.bridgeconduit.name=Condotta sopraelevata block.bridgeconduit.name=Condotto sopraelevato
block.mechanical-pump.name=Pompa meccanica block.mechanical-pump.name=Pompa meccanica
block.itemsource.name=Sorgente oggetti block.itemsource.name=Sorgente oggetti
block.itemvoid.name=Vuoto 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.repair-point.name=Punto di riparazione
block.resupply-point.name=Punto di rifornimento block.resupply-point.name=Punto di rifornimento
block.pulse-conduit.name=Condotta attiva 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-router.name=Distributore liquidi
block.liquid-tank.name=Tanica d'acqua block.liquid-tank.name=Tanica d'acqua
block.liquid-junction.name=Giunzione liquida 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.rotary-pump.name=Pompa a turbina
block.nuclear-reactor.name=Reattore nucleare 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.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=This sector has been lost. Re-deploy? text.sector.gameover=Hai perso questo settore. Attaccare di nuovo?
text.sector.retry=Retry text.sector.retry=Riprova
text.wave.lasted=You lasted until wave [accent]{0}[]. text.wave.lasted=Sei sopravvissuto fino all'onda [accent]{0}[].
text.mission=Mission:[LIGHT_GRAY] {0} text.mission=Mission:[LIGHT_GRAY] {0}
text.mission.complete=Mission complete! text.mission.complete=Missione completata!
text.mission.complete.body=Sector {0},{1} has been conquered. text.mission.complete.body=Il settore {0},{1} è stato conquistato.
text.mission.wave=Survive [accent]{0}[] waves. text.mission.wave=Sopravvivi a [accent]{0}[] onda/e.
text.mission.battle=Destroy the enemy base. text.mission.battle=Distruggi la base del nemico.
text.mission.resource=Obtain {0} x{1} text.mission.resource=Ottieni {0} x{1}
text.none=<none> text.none=<Niente . . . >
text.sector.corrupted=[orange]A save file for this sector was found, but loading failed.\nA new one has been created. text.sector.corrupted=[orange]Un file per questo settore è stato trovato, ma è fallito il caricamnto.\nQuindi ne è stato creato uno nuovo.
setting.fpscap.name=Max FPS setting.fpscap.name=Limite FPS
setting.fpscap.none=None setting.fpscap.none=Niente
setting.fpscap.text={0} FPS 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. 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]Health: {0} text.unit.health=[LIGHT_GRAY]Vita: {0}
text.unit.speed=[LIGHT_GRAY]Speed: {0} text.unit.speed=[LIGHT_GRAY]Velocità: {0}
block.drone-pad.name=Drone Pad block.drone-pad.name=Base del drone
block.fabricator-pad.name=Fabricator Pad block.fabricator-pad.name=Base del costruttore
block.interceptor-pad.name=Interceptor Pad block.interceptor-pad.name=Bese dell'intercettatore
block.monsoon-pad.name=Monsoon Pad block.monsoon-pad.name=Base del vento del nord
block.command-center.name=Command Center block.command-center.name=Centro di comando
block.mass-driver.name=Mass Driver block.mass-driver.name=Lancia materiali
block.blast-drill.name=Blast Drill block.blast-drill.name=Blast Drill
block.thermal-pump.name=Thermal Pump block.thermal-pump.name=Pompa termica
block.dagger-pad.name=Dagger Pad block.dagger-pad.name=Pad pericolo
block.titan-pad.name=Titan Pad block.titan-pad.name=pad titano
block.thermal-generator.name=Thermal Generator block.thermal-generator.name=Generatore termico
unit.drone.name=Drone 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.drone.description=Un'unità base, che mina e costruisce.
unit.fabricator.name=Fabricator unit.fabricator.name=Costruttore
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=Un drone molto avanzato che raccoglie minerali e costruisce molto meglio e più velocemente di un drone base.
unit.scout.name=Scout unit.scout.name=Esploratore
unit.scout.description=A basic ground unit. Uses lead as ammo. unit.scout.description=Un unità di base a terra. Usa piombo come munizioni.
unit.titan.name=Titan unit.titan.name=Titano
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=Un'unità di terra corazzata avanzata. Utilizza carburo come munizione. Attacca sia bersagli terrestri che aerei.
unit.monsoon.name=Monsoon unit.monsoon.name=Monsone
unit.monsoon.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.monsoon.description=Un bombardiere molto potente, che raderà al suolo chiunque gli passi davanti.
unit.interceptor.name=Interceptor unit.interceptor.name=Intercettatore
unit.interceptor.description=A fast, hit-and-run strike unit. Uses lead as ammo. unit.interceptor.description=Un veloce ed efficiente torretta che funziona con il piombo.

View File

@@ -3,8 +3,8 @@ text.discord=Mindustry Discord 에 참여하세요!
text.link.discord.description=공식 Mindustry Discord 채팅방 text.link.discord.description=공식 Mindustry Discord 채팅방
text.link.github.description=게임 소스코드 text.link.github.description=게임 소스코드
text.link.dev-builds.description=개발중인 빌드 text.link.dev-builds.description=개발중인 빌드
text.link.trello.description=다음 계획된 기능들을 게시한 공식 trello 보드 text.link.trello.description=다음 출시될 기능들을 게시한 공식 Trello 보드
text.link.itch.io.description=PC 버전 다운로드 HTML5 버전이 있는 itch.io 사이트 text.link.itch.io.description=PC 버전 다운로드 HTML5 버전이 있는 itch.io 사이트
text.link.google-play.description=Google 플레이 스토어 등록 정보 text.link.google-play.description=Google 플레이 스토어 등록 정보
text.link.wiki.description=공식 Mindustry 위키 text.link.wiki.description=공식 Mindustry 위키
text.linkfail=링크를 여는데 실패했습니다!URL이 기기의 클립보드에 복사되었습니다. text.linkfail=링크를 여는데 실패했습니다!URL이 기기의 클립보드에 복사되었습니다.
@@ -12,7 +12,7 @@ text.editor.web=HTML5 버전은 에디터 기능을 지원하지 않습니다!
text.web.unsupported=HTML5 버전은 이 기능을 지원하지 않습니다!게임을 다운로드 한 뒤에 사용 해 주세요. text.web.unsupported=HTML5 버전은 이 기능을 지원하지 않습니다!게임을 다운로드 한 뒤에 사용 해 주세요.
text.gameover=코어가 터졌습니다. 게임 오버! text.gameover=코어가 터졌습니다. 게임 오버!
text.highscore=[YELLOW]최고점수 달성! text.highscore=[YELLOW]최고점수 달성!
text.level.highscore=최고 점수 : [accent]{0} text.level.highscore=최고 점수:[accent]{0}
text.level.delete.title=삭제 확인 text.level.delete.title=삭제 확인
text.map.delete=정말로 "[orange]{0}[]" 맵을 삭제하시겠습니까? text.map.delete=정말로 "[orange]{0}[]" 맵을 삭제하시겠습니까?
text.level.select=맵 선택 text.level.select=맵 선택
@@ -22,7 +22,7 @@ text.construction=[accent]블록 배치 모드[]를 선택하셨습니다.\n\n
text.deconstruction.title=블록 삭제 안내서 text.deconstruction.title=블록 삭제 안내서
text.deconstruction=[accent]블록 삭제 모드[]를 선택하셨습니다\n블록을 삭제하고 싶다면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 파괴 작업을 진행할 것입니다.\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요- [accent]블록을 넓은 범위로 삭제[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.- [accent]블록 삭제 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. text.deconstruction=[accent]블록 삭제 모드[]를 선택하셨습니다\n블록을 삭제하고 싶다면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 파괴 작업을 진행할 것입니다.\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요- [accent]블록을 넓은 범위로 삭제[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.- [accent]블록 삭제 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다.
text.showagain=다음 세션에서 이 메세지를 표시하지 않습니다 text.showagain=다음 세션에서 이 메세지를 표시하지 않습니다
text.unlocks=잠금 해제 text.unlocks=아이템들
text.savegame=게임 저장 text.savegame=게임 저장
text.loadgame=게임 불러오기 text.loadgame=게임 불러오기
text.joingame=게임 참가 text.joingame=게임 참가
@@ -32,11 +32,11 @@ text.maps=맵
text.maps.none=[LIGHT_GRAY]맵을 찾을 수 없습니다! text.maps.none=[LIGHT_GRAY]맵을 찾을 수 없습니다!
text.about.button=정보 text.about.button=정보
text.name=이름: text.name=이름:
text.unlocked=새 블록 잠금 해제되었습니다! text.unlocked=새 블록 잠금 해제
text.unlocked.plural=새 블록 잠금 해제되었습니다! text.unlocked.plural=새 블록 잠금 해제
text.players={0} 플레이어 온라인 text.players=현재 {0}명 접속중
text.players.single={0} 플레이어 온라인 text.players.single=현재 {0}명만 있음.
text.server.mismatch=패킷 오류: 클라이언트와 서버 버전이 일치하지 않습니다.자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요! text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니다. 자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요!
text.server.closing=[accent]서버 닫는중... text.server.closing=[accent]서버 닫는중...
text.server.kicked.kick=당신은 서버에서 추방되었습니다! text.server.kicked.kick=당신은 서버에서 추방되었습니다!
text.server.kicked.fastShoot=당신은 총을 너무 빨리 발사했습니다. text.server.kicked.fastShoot=당신은 총을 너무 빨리 발사했습니다.
@@ -44,13 +44,13 @@ text.server.kicked.invalidPassword=알 수 없는 비밀번호 입니다!
text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요!
text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다. text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다.
text.server.kicked.recentKick=당신은 방금 추방처리 되었습니다.잠시 기다린 후에 접속 해 주세요. text.server.kicked.recentKick=당신은 방금 추방처리 되었습니다. 잠시 기다린 후에 접속 해 주세요.
text.server.kicked.nameInUse=이 닉네임이 이미 서버에서 사용중입니다. text.server.kicked.nameInUse=이 닉네임이 이미 서버에서 사용중입니다.
text.server.kicked.nameEmpty=닉네임에는 반드시 영어 또는 숫자가 있어야 합니다. text.server.kicked.nameEmpty=닉네임에는 반드시 영어 또는 숫자가 있어야 합니다.
text.server.kicked.idInUse=당신은 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다. text.server.kicked.idInUse=당신은 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다.
text.server.kicked.customClient=이 서버는 커스텀 빌드를 지원하지 않습니다. 공식 버전을 사용하세요. 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.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.join.info=여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다.
text.hostserver=서버 열기 text.hostserver=서버 열기
text.host=호스트 text.host=호스트
text.hosting=[accent]서버 여는중.. text.hosting=[accent]서버 여는중..
@@ -60,28 +60,28 @@ text.server.refreshing=서버 목록 새로고치는중...
text.hosts.none=[lightgray]LAN 게임을 찾을 수 없습니다! text.hosts.none=[lightgray]LAN 게임을 찾을 수 없습니다!
text.host.invalid=[scarlet]서버에 연결할 수 없습니다! text.host.invalid=[scarlet]서버에 연결할 수 없습니다!
text.trace=플레이어 추적 text.trace=플레이어 추적
text.trace.playername=플레이어 이름: [accent]{0} text.trace.playername=이름:[accent]{0}
text.trace.ip=IP : [accent]{0} text.trace.ip=IP:[accent]{0}
text.trace.id=고유 ID: [accent]{0} text.trace.id=고유 ID:[accent]{0}
text.trace.android=Android 클라이언트 : [accent]{0} text.trace.android=Android 클라이언트:[accent]{0}
text.trace.modclient=수정된 클라이언트 : [accent]{0} text.trace.modclient=수정된 클라이언트:[accent]{0}
text.trace.totalblocksbroken=총 블럭 파괴 수: [accent]{0} text.trace.totalblocksbroken=총 블럭 파괴 수:[accent]{0}
text.trace.structureblocksbroken=구조 블럭 파괴 수: [accent]{0} text.trace.structureblocksbroken=구조 블럭 파괴 수:[accent]{0}
text.trace.lastblockbroken=마지막으로 파괴한 블럭: [accent]{0} text.trace.lastblockbroken=마지막으로 파괴한 블럭:[accent]{0}
text.trace.totalblocksplaced=총 설치한 블럭 수: [accent]{0} text.trace.totalblocksplaced=총 설치한 블럭 수:[accent]{0}
text.trace.lastblockplaced=마지막으로 설치한 블록: [accent]{0} text.trace.lastblockplaced=마지막으로 설치한 블록:[accent]{0}
text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry 으로 버그 보고서를 제출 해 주세요. text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요.
text.server.bans=차단된 유저 text.server.bans=차단된 유저
text.server.bans.none=차단된 플레이어가 없습니다. text.server.bans.none=차단된 플레이어가 없습니다.
text.server.admins=관리자 text.server.admins=관리자
text.server.admins.none=관리자가 없습니다! text.server.admins.none=관리자가 없습니다!
text.server.add=서버 추가 text.server.add=서버 추가
text.server.delete=이 서버를 삭제 하시겠습니까? text.server.delete=이 서버를 삭제 하시겠습니까?
text.server.hostname=호스트: {0} text.server.hostname=호스트:{0}
text.server.edit=서버 수정 text.server.edit=서버 수정
text.server.outdated=[crimson]서버 버전이 낮습니다![] text.server.outdated=[crimson]서버 버전이 낮습니다![]
text.server.outdated.client=[Crimson]클라이언트 버전이 낮습니다![] text.server.outdated.client=[Crimson]클라이언트 버전이 낮습니다![]
text.server.version=[lightgray]버전 : {0} text.server.version=[lightgray]서버 버전:{0}
text.server.custombuild=[yellow]커스텀 서버 text.server.custombuild=[yellow]커스텀 서버
text.confirmban=이 플레이어를 차단하시겠습니까? text.confirmban=이 플레이어를 차단하시겠습니까?
text.confirmunban=이 플레이어를 차단하시겠습니까? text.confirmunban=이 플레이어를 차단하시겠습니까?
@@ -90,14 +90,14 @@ text.confirmunadmin=이 플레이어의 관리자 상태를 해제하시겠습
text.joingame.title=게임 참가 text.joingame.title=게임 참가
text.joingame.ip=IP: text.joingame.ip=IP:
text.disconnect=서버와 연결이 해제되었습니다. text.disconnect=서버와 연결이 해제되었습니다.
text.disconnect.data=맵 데이터를 불러오지 못했습니다! text.disconnect.data=맵 데이터를 받아오는데 실패했습니다.
text.connecting=[accent]연결중... text.connecting=[accent]연결중...
text.connecting.data=[accent]월드 데이터 로딩중... text.connecting.data=[accent] 데이터 다운로드중...
text.connectfail=[crimson]{0}[orange] 서버에 연결하지 못했습니다.[] text.connectfail=[crimson]{0}[orange] 서버에 연결하지 못했습니다.[]
text.server.port=포트: text.server.port=포트:
text.server.addressinuse=이 주소는 이미 사용중입니다! text.server.addressinuse=이 주소는 이미 사용중입니다!
text.server.invalidport=포트 번호가 잘못되었습니다. text.server.invalidport=포트 번호가 잘못되었습니다.
text.server.error=[crimson]{0}[orange]서버를 호스팅 하는데 오류가 발생했습니다.[] text.server.error=[crimson]{0}[orange]서버를 는데 오류가 발생했습니다.[]
text.save.new=새로 저장\n text.save.new=새로 저장\n
text.save.overwrite=이 저장 슬롯을 덮어씌우겠습니까?\n text.save.overwrite=이 저장 슬롯을 덮어씌우겠습니까?\n
text.overwrite=덮어쓰기\n text.overwrite=덮어쓰기\n
@@ -108,8 +108,8 @@ text.save.delete.confirm=이 저장파일을 삭제 하시겠습니까?\n
text.save.delete=삭제\n text.save.delete=삭제\n
text.save.export=저장파일 내보내기\n text.save.export=저장파일 내보내기\n
text.save.import.invalid=[orange]저장 상태가 정상이 아닙니다! text.save.import.invalid=[orange]저장 상태가 정상이 아닙니다!
text.save.import.fail=[crimson]저장파일을 불러오지 못함: [orange]{0}\n text.save.import.fail=[crimson]저장파일을 불러오지 못함:[orange]{0}\n
text.save.export.fail=[crimson]저장파일을 내보내지 못함: [orange]{0} text.save.export.fail=[crimson]저장파일을 내보내지 못함:[orange]{0}
text.save.import=저장파일 불러오기\n text.save.import=저장파일 불러오기\n
text.save.newslot=저장 파일이름 :\n text.save.newslot=저장 파일이름 :\n
text.save.rename=이름 변경\n text.save.rename=이름 변경\n
@@ -120,11 +120,11 @@ text.save.corrupted=[orange]세이브 파일이 손상되었거나 잘못된 파
text.empty=<비어있음>\n text.empty=<비어있음>\n
text.on=켜기\n text.on=켜기\n
text.off=끄기\n text.off=끄기\n
text.save.autosave=자동저장: {0} text.save.autosave=자동저장:{0}
text.save.map= : {0} text.save.map=:{0}
text.save.wave={0} 웨이브 text.save.wave={0}단계
text.save.difficulty=난이도: {0} text.save.difficulty=난이도:{0}
text.save.date=마지막 저장 날짜 : {0} text.save.date=마지막 저장 날짜:{0}
text.confirm=확인 text.confirm=확인
text.delete=삭제\n text.delete=삭제\n
text.ok=승인 text.ok=승인
@@ -143,10 +143,10 @@ text.changelog.current=[orange][[현재 버전]
text.changelog.latest=[orange][[최신 버전] text.changelog.latest=[orange][[최신 버전]
text.loading=[accent]불러오는중... text.loading=[accent]불러오는중...
text.saving=[accent]저장중...\n text.saving=[accent]저장중...\n
text.wave=[orange]{0} 웨이브 text.wave=[orange]{0}단계
text.wave.waiting=다음 웨이브 시작까지 {0}초 text.wave.waiting=다음 단계 시작까지 {0}초
text.waiting=다리는중... text.waiting=기중...
text.enemies=남은 몹 : {0} text.enemies=남은 몹:{0}
text.enemies.single=몹이 {0}마리 남아있음 text.enemies.single=몹이 {0}마리 남아있음
text.loadimage=사진 불러오기 text.loadimage=사진 불러오기
text.saveimage=사진 저장 text.saveimage=사진 저장
@@ -166,7 +166,7 @@ text.editor.description=설명:
text.editor.name=이름: text.editor.name=이름:
text.editor.teams= text.editor.teams=
text.editor.elevation=높이 text.editor.elevation=높이
text.editor.badsize=[orange]사진 크기가 잘못되었습니다![]유효한 맵 크기 : {0} text.editor.badsize=[orange]사진 크기가 잘못되었습니다![]유효한 맵 크기:{0}
text.editor.errorimageload=[orange]{0}[] 파일을 불러오는데 오류가 발생했습니다. text.editor.errorimageload=[orange]{0}[] 파일을 불러오는데 오류가 발생했습니다.
text.editor.errorimagesave=[orange]{0}[] 파일 저장중 오류가 발생했습니다. text.editor.errorimagesave=[orange]{0}[] 파일 저장중 오류가 발생했습니다.
text.editor.generate=생성 text.editor.generate=생성
@@ -203,9 +203,9 @@ text.menu=메뉴
text.play=플레이 text.play=플레이
text.load=불러오기 text.load=불러오기
text.save=저장 text.save=저장
text.fps={0} FPS text.fps={0}FPS
text.tps={0} TPS text.tps={0}TPS
text.ping=핑 : {0}ms text.ping={0}ms
text.language.restart=언어를 변경하려면 게임을 다시 시작 해 주세요. text.language.restart=언어를 변경하려면 게임을 다시 시작 해 주세요.
text.settings.language=언어 text.settings.language=언어
text.settings=설정 text.settings=설정
@@ -227,50 +227,50 @@ text.error.title=[crimson]오류가 발생했습니다.
text.error.crashtitle=오류가 발생했습니다. text.error.crashtitle=오류가 발생했습니다.
text.blocks.blockinfo=블록 정보 text.blocks.blockinfo=블록 정보
text.blocks.powercapacity=최대 전력 용량 text.blocks.powercapacity=최대 전력 용량
text.blocks.powershot=1발당 파워 소모량 text.blocks.powershot=1발당 전력 소모량
text.blocks.targetsair=표적 공기 text.blocks.targetsair=공중공격 가능
text.blocks.itemspeed=유닛 이동 속도 text.blocks.itemspeed=유닛 이동 속도
text.blocks.shootrange=공격 범위 text.blocks.shootrange=사거리
text.blocks.size=블록 크기 text.blocks.size=블록 크기
text.blocks.liquidcapacity=최대 액체 용량 text.blocks.liquidcapacity=최대 액체 용량
text.blocks.maxitemssecond=최대 아이템 보관량 text.blocks.maxitemssecond=최대 아이템 보관량
text.blocks.powerrange=전력 범위 text.blocks.powerrange=전력 범위
text.blocks.poweruse=전력 사용 text.blocks.poweruse=전력 사용
text.blocks.inputitemcapacity=입력 아이템 용량 text.blocks.inputitemcapacity=입력 아이템 용량
text.blocks.outputitemcapacity=력 아이템 용량 text.blocks.outputitemcapacity=력 아이템 용량
text.blocks.itemcapacity=품목 용량 text.blocks.itemcapacity=저장 용량
text.blocks.maxpowergeneration=최대 발전량 text.blocks.maxpowergeneration=최대 발전량
text.blocks.powertransferspeed=전력 전송량 text.blocks.powertransferspeed=전력 전송량
text.blocks.craftspeed=생산 속도 text.blocks.craftspeed=생산 속도
text.blocks.inputliquid=입력 액체 text.blocks.inputliquid=사용되는 액체
text.blocks.inputliquidaux=보조 액체 text.blocks.inputliquidaux=보조 액체
text.blocks.inputitem=입력 아이템 text.blocks.inputitem=사용되는 아이템
text.blocks.inputitems=입력 아이템들 text.blocks.inputitems=사용되는 아이템들
text.blocks.outputitem=출력 아이템 text.blocks.outputitem=출력 아이템
text.blocks.drilltier=드릴 text.blocks.drilltier=드릴
text.blocks.drillspeed=기본 드릴 속도 text.blocks.drillspeed=기본 드릴 속도
text.blocks.liquidoutput=액체 출력 text.blocks.liquidoutput=액체 출력
text.blocks.liquiduse=액체 사용 text.blocks.liquiduse=액체 사용
text.blocks.coolant=냉각제 text.blocks.coolant=냉각제
text.blocks.coolantuse=냉각수 사용 text.blocks.coolantuse=냉각수 사용
text.blocks.inputliquidfuel=연료 액 text.blocks.inputliquidfuel=연료 액
text.blocks.liquidfueluse=액체 연료 사용 text.blocks.liquidfueluse=액체 연료 사용
text.blocks.explosive=이게 터지면 펑 터지면서 주변 블록에게 피해를 입힙니다! text.blocks.explosive=이게 터지면 펑 터지면서 주변 블록에게 피해를 입힙니다!
text.blocks.health=체력 text.blocks.health=체력
text.blocks.inaccuracy=빗맞을 확률 text.blocks.inaccuracy=오차각
text.blocks.shots=총알 text.blocks.shots=발포 횟수
text.blocks.reload=재장전 text.blocks.reload=재장전
text.blocks.inputfuel=연료 text.blocks.inputfuel=연료
text.blocks.fuelburntime=연료 연소 시간 text.blocks.fuelburntime=연료 연소 시간
text.blocks.inputcapacity=입력 용량 text.blocks.inputcapacity=입력 용량
text.blocks.outputcapacity=출력 용량 text.blocks.outputcapacity=출력 용량
text.unit.blocks=블록 text.unit.blocks=블록
text.unit.powersecond=당 전력 단위 text.unit.powersecond=전력/
text.unit.liquidsecond=액체 단위 / text.unit.liquidsecond=액체/
text.unit.itemssecond=항목 / text.unit.itemssecond=개/
text.unit.pixelssecond=초당 픽셀 text.unit.pixelssecond=초당 픽셀
text.unit.liquidunits=액상 단위 text.unit.liquidunits=
text.unit.powerunits=원 장치 text.unit.powerunits=
text.unit.degrees= text.unit.degrees=
text.unit.seconds= text.unit.seconds=
text.unit.none= text.unit.none=
@@ -280,12 +280,12 @@ text.category.power=전력
text.category.liquids=액체 text.category.liquids=액체
text.category.items=아이템 text.category.items=아이템
text.category.crafting=제작 text.category.crafting=제작
text.category.shooting= text.category.shooting=
setting.difficulty.easy=쉬움 setting.difficulty.easy=쉬움
setting.difficulty.normal=보통 setting.difficulty.normal=보통
setting.difficulty.hard=어려움 setting.difficulty.hard=어려움
setting.difficulty.insane=[#1E90FF]K[#ADFF2F]O[#FFB6C1]R[#B0C4DE]E[#FF4500]A 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.difficulty.name=난이도:
setting.screenshake.name=화면 흔들기 setting.screenshake.name=화면 흔들기
setting.indicators.name=적 위치 표시 화살표 setting.indicators.name=적 위치 표시 화살표
@@ -304,7 +304,9 @@ setting.musicvol.name=음악 크기
setting.mutemusic.name=음소거 setting.mutemusic.name=음소거
setting.sfxvol.name=효과음 크기 setting.sfxvol.name=효과음 크기
setting.mutesound.name=소리 끄기 setting.mutesound.name=소리 끄기
text.keybind.title=키 바인딩 text.keybind.title=키 바인딩
keybind.move_x.name=오른쪽/왼쪽 이동 keybind.move_x.name=오른쪽/왼쪽 이동
keybind.move_y.name=위쪽/아래쪽 이동 keybind.move_y.name=위쪽/아래쪽 이동
keybind.select.name=선택 keybind.select.name=선택
@@ -319,22 +321,25 @@ keybind.chat.name=채팅
keybind.player_list.name=플레이어 목록 keybind.player_list.name=플레이어 목록
keybind.console.name=콘솔 keybind.console.name=콘솔
keybind.rotate.name=회전 keybind.rotate.name=회전
mode.text.help.title=도움말 mode.text.help.title=도움말
mode.waves.name=웨이브 mode.waves.name=단계
mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 웨이브가 시작됩니다. mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다.
mode.sandbox.name=샌드박스 mode.sandbox.name=샌드박스
mode.sandbox.description=무한한 자원과 다음 웨이브 시작을 위한 타이머가 없습니다. mode.sandbox.description=무한한 자원과 다음단계 시작을 위한 타이머가 없습니다.
mode.freebuild.name=자유 건축 mode.freebuild.name=자유 건축
mode.freebuild.description=제한된 자원과 다음 웨이브 시작을 위한 타이머가 없습니다. mode.freebuild.description=제한된 자원과 다음단계 시작을 위한 타이머가 없습니다.
content.item.name=아이템 content.item.name=아이템
content.liquid.name=액체 content.liquid.name=액체
content.unit-type.name=종류 content.unit-type.name=종류
content.recipe.name=블록 content.recipe.name=블록
item.stone.name= item.stone.name=
item.stone.description=흔히 찾을 수 있는 자원. 바닥에서 돌을 캐거나 용암을 사용하여 얻을 수 있습니다. item.stone.description=흔히 찾을 수 있는 자원. 바닥에서 돌을 캐거나 용암을 사용하여 얻을 수 있습니다.
item.tungsten.name=텅스텐 item.tungsten.name=텅스텐
item.tungsten.description=일반적이지만 매우 유용한 건축 재료. 드릴 및 생산 건물, 제련소와 같은 내열성 블록에 사용됩니다. item.tungsten.description=일반적이지만 매우 유용한 건축 재료. 드릴 및 생산 건물, 제련소와 같은 내열성 블록에 사용됩니다.
item.lead.name=리드 item.lead.name=
item.lead.description=기본적인 시작 자원. 전자 및 액체 수송 블록에서 광범위하게 사용됩니다. item.lead.description=기본적인 시작 자원. 전자 및 액체 수송 블록에서 광범위하게 사용됩니다.
item.coal.name=석탄 item.coal.name=석탄
item.coal.description=일반적이고 쉽게 이용할 수 있는 연료. item.coal.description=일반적이고 쉽게 이용할 수 있는 연료.
@@ -345,91 +350,109 @@ item.titanium.description=물 운반이나 드릴, 비행기등에서 재료로
item.thorium.name=토륨 item.thorium.name=토륨
item.thorium.description=건물 탄약 또는 핵연료로 사용되는 방사성 금속. item.thorium.description=건물 탄약 또는 핵연료로 사용되는 방사성 금속.
item.silicon.name=실리콘 item.silicon.name=실리콘
item.silcion.description=매우 유용한 반도체로, 태양 전지 패널과 복잡한 전자 제품에 응용할 수 있습니다. item.silcion.description=매우 유용한 반도체로, 태양 전지과 복잡한 전자 제품에 응용할 수 있습니다.
item.plastanium.name=플라스타늄 item.plastanium.name=플라스타늄
item.plastanium.description=고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료. item.plastanium.description=고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료.
item.phase-matter.name=메타 item.phase-matter.name=메타
item.surge-alloy.name=합금 item.surge-alloy.name=
item.biomatter.name=바이오메터 item.biomatter.name=바이오메터
item.biomatter.description=이것은 유기농 덤불입니다! 석유로 전환하거나 기본 연료로 사용됩니다. item.biomatter.description=이것은 유기농 덤불입니다! 석유로 전환하거나 기본 연료로 사용됩니다.
item.sand.name=모래 item.sand.name=모래
item.sand.description=합금 및 플스 모두에서 제련시 광범위하게 사용되는 일반적인 재료. item.sand.description=합금 및 플스 모두에서 제련시 광범위하게 사용되는 일반적인 재료.
item.blast-compound.name=폭발 화합물 item.blast-compound.name=폭발 화합물
item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물.연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다. item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물.연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다.
item.pyratite.name=피러레이트 item.pyratite.name=피러레이트
item.pyratite.description=화염 무기에 사용되는 엄청난 가연성 물질. item.pyratite.description=화염 무기에 사용되는 엄청난 가연성 물질.
liquid.water.name= liquid.water.name=
liquid.lava.name=용암 liquid.lava.name=용암
liquid.oil.name=석유 liquid.oil.name=석유
liquid.cryofluid.name=크라이오플루드 liquid.cryofluid.name=냉각수
text.item.explosiveness=[LIGHT_GRAY]폭발력 : {0}
text.item.flammability=[LIGHT_GRAY]인화성 : {0} text.item.explosiveness=[LIGHT_GRAY]폭발력:{0}
text.item.radioactivity=[LIGHT_GRAY]방사능 : {0} text.item.flammability=[LIGHT_GRAY]인화성:{0}
text.item.fluxiness=[LIGHT_GRAY]플렉스 파워 : {0} text.item.radioactivity=[LIGHT_GRAY]방사능:{0}
text.item.hardness=[LIGHT_GRAY]강도 : {0} text.item.fluxiness=[LIGHT_GRAY]플렉스 파워:{0}
text.liquid.heatcapacity=[LIGHT_GRAY]발열 용량 : {0} text.item.hardness=[LIGHT_GRAY]강도:{0}
text.liquid.viscosity=[LIGHT_GRAY]점도 : {0} text.liquid.heatcapacity=[LIGHT_GRAY]발열량:{0}
text.liquid.temperature=[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.name=텅스텐 벽
block.tungsten-wall-large.name=큰 텅스텐 벽 block.tungsten-wall-large.name=큰 텅스텐 벽
block.carbide-wall.name=합금벽 block.carbide-wall.name=합금벽
block.carbide-wall-large.name=대형 합금벽 block.carbide-wall-large.name=대형 합금벽
block.thorium-wall.name=토룸 block.thorium-wall.name=토룸벽
block.thorium-wall-large.name=대형 토륨 block.thorium-wall-large.name=대형 토륨벽
block.door.name= block.door.name=
block.door-large.name= block.door-large.name=대형
block.duo.name=샷건 block.duo.name=듀오
block.scorch.name=스코치 block.scorch.name=스코치
block.hail.name=헤일 block.hail.name=헤일
block.lancer.name=랜서 block.lancer.name=랜서
block.conveyor.name=컨베이어 block.conveyor.name=컨베이어
block.titanium-conveyor.name=티타늄 컨베이어 block.titanium-conveyor.name=티타늄 컨베이어
block.junction.name=교차기 block.junction.name=교차기
block.splitter.name=스플리터 block.splitter.name=분배기
block.splitter.description=아이템을 넣는 즉시 컨베이어를 반대 방향으로 바꾼 후 내보냅니다. block.splitter.description=아이템을 넣는 즉시 컨베이어를 반대 방향으로 바꾼 후 내보냅니다.
block.router.name=분배기 block.router.name=분배기
block.router.description=아이템을 넣으면 다른 방향으로 아이템을 번갈아서 내보냅니다. block.router.description=아이템을 넣으면 다른 방향으로 아이템을 번갈아서 내보냅니다.
block.distributor.name=디스토이어 block.distributor.name=대형 분배기
block.distributor.description=아이템을 8방향으로 나눌 수있는 스플리터. block.distributor.description=아이템을 8방향으로 나눌 수 있는 대형 분배기.
block.sorter.name=필터 block.sorter.name=필터
block.sorter.description=아이템을 받아서 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다. block.sorter.description=아이템을 넣어서 필터에 설정된 아이템일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 통과합니다.
block.overflow-gate.name=오버플로 게이트 block.overflow-gate.name=오버플로 게이트
block.overflow-gate.description=정면 경로가 차단된 경우 왼쪽과 오른쪽으로만 출력하는 복합 스플리터와 분배기 입니다. block.overflow-gate.description=정면 경로가 차단된 경우 왼쪽과 오른쪽으로만 출력하는 복합 분배기입니다.
block.bridgeconveyor.name=터널 block.bridgeconveyor.name=터널
block.bridgeconveyor.description=최대 2블록을 건너 뛰고 자원을 운반하게 해 주는 블럭. block.bridgeconveyor.description=최대 2블록을 건너 뛰고 자원을 운반하게 해 주는 블럭.
block.smelter.name=제련소 block.smelter.name=제련소
block.arc-smelter.name=아크 제련소 block.arc-smelter.name=대형 제련소
block.silicon-smelter.name=실리콘 제련소 block.silicon-smelter.name=실리콘 제련소
block.phase-weaver.name=펄스 위버 block.phase-weaver.name=메타 합성기
block.pulverizer.name=분쇄기 block.pulverizer.name=분쇄기
block.cryofluidmixer.name=크라이오플루드 혼합기 block.cryofluidmixer.name=냉각수 혼합기
block.melter.name=멜터 block.melter.name=융해기
block.incinerator.name=소각로 block.incinerator.name=소각로
block.biomattercompressor.name=바이오터 압축기 block.biomattercompressor.name=바이오터 압축기
block.separator.name=셉터 block.separator.name=셉터
block.centrifuge.name=원심 분리기 block.centrifuge.name=원심 분리기
block.power-node.name=전력 노드 block.power-node.name=전력 송신기
block.power-node-large.name=대형 전력 노드 block.power-node-large.name=대형 전력 송신기
block.battery.name=배터리 block.battery.name=배터리
block.battery-large.name=대형 배터리 block.battery-large.name=대형 배터리
block.combustion-generator.name=연소 발전기 block.combustion-generator.name=석탄 발전기
block.turbine-generator.name=터빈 발전기 block.turbine-generator.name=터빈 발전기
block.tungsten-drill.name=텅스텐 드릴 block.tungsten-drill.name=텅스텐 드릴
block.carbide-drill.name=합금 드릴 block.carbide-drill.name=합금 드릴
block.laser-drill.name=레이저 드릴 block.laser-drill.name=레이저 드릴
block.water-extractor.name=물 추출기 block.water-extractor.name=물 추출기
block.cultivator.name=경운기 block.cultivator.name=온실
block.dart-ship-factory.name=다트 선박 공장 block.dart-ship-factory.name=비행기 공장
block.delta-mech-factory.name=델타 메크 공장 block.delta-mech-factory.name=샷건 공장
block.repairpoint.name=수리 포인트 block.repairpoint.name=수리 포인트
block.resupplypoint.name=재공급 포인트 block.resupplypoint.name=재공급 포인트
block.conduit.name=도관 block.conduit.name=파이프
block.pulseconduit.name=펄스 도관 block.pulseconduit.name=퓨즈 파이프
block.liquidrouter.name=액체 분배기 block.liquidrouter.name=액체 분배기
block.liquidtank.name=물탱크 block.liquidtank.name=물탱크
block.liquidjunction.name=액체 교차기 block.liquidjunction.name=액체 교차기
block.bridgeconduit.name=브릿지 도관 block.bridgeconduit.name=브릿지 파이프
block.mechanical-pump.name=기계 펌프 block.mechanical-pump.name=기계 펌프
block.itemsource.name=아이템 소스 block.itemsource.name=아이템 소스
block.itemvoid.name=아이템 무효 block.itemvoid.name=아이템 무효
block.liquidsource.name=액체 소스 block.liquidsource.name=액체 소스
@@ -437,82 +460,91 @@ block.powervoid.name=무효 전력
block.powerinfinite.name=무한한 힘 block.powerinfinite.name=무한한 힘
block.unloader.name=언로더 block.unloader.name=언로더
block.sortedunloader.name=정렬된 언로더 block.sortedunloader.name=정렬된 언로더
block.vault.name=Vault block.vault.name=창고
block.wave.name=웨이브 block.wave.name=파도
block.swarmer.name=워머 block.swarmer.name=
block.salvo.name=살보 block.salvo.name=살보
block.ripple.name=라이 block.ripple.name=
block.phase-conveyor.name=펄스 컨베이어 block.phase-conveyor.name=메타 컨베이어
block.bridge-conveyor.name=터널 block.bridge-conveyor.name=터널
block.plastanium-compressor.name=플라스터늄 압축기 block.plastanium-compressor.name=플라스터늄 압축기
block.pyratite-mixer.name=피터레이트 혼합기 block.pyratite-mixer.name=피터레이트 혼합기
block.blast-mixer.name=블래스트 혼합기 block.blast-mixer.name=폭발 화합물 혼합기
block.solidifer.name=고체 block.solidifer.name=고체
block.solar-panel.name=태양 전지 패널 block.solar-panel.name=태양 전지
block.solar-panel-large.name=대형 태양 전지판 block.solar-panel-large.name=대형 태양 전지판
block.oil-extractor.name=오일 추출기 block.oil-extractor.name=석유 추출기
block.javelin-ship-factory.name=창 던지기 선박 공장 block.javelin-ship-factory.name=전투기 공장
block.repair-point.name=수리 점 block.repair-point.name=정비소
block.resupply-point.name=재 공급 포인트 block.resupply-point.name=탄약 보급소
block.pulse-conduit.name=펄스 도관 block.pulse-conduit.name=퓨즈 파이프
block.phase-conduit.name=위상 도관 block.phase-conduit.name=메타 파이프
block.liquid-router.name=액체 라우터 block.liquid-router.name=액체 분배기
block.liquid-tank.name=액체 탱크 block.liquid-tank.name=탱크
block.liquid-junction.name=액체 교차기 block.liquid-junction.name=액체 교차기
block.bridge-conduit.name=브릿지 도관 block.bridge-conduit.name=다리 파이프
block.rotary-pump.name=로타리 펌프 block.rotary-pump.name=동력 펌프
block.nuclear-reactor.name=핵발전소 block.nuclear-reactor.name=원자로
text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
text.customgame=Custom Game text.customgame=커스텀 게임
text.campaign=Campaign text.campaign=캠페인
text.sectors=Sectors text.sectors=구역
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=선택된 구역:[LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=시간:[LIGHT_GRAY]{0}
text.sector.deploy=Deploy text.sector.deploy=배치
text.sector.resume=Resume text.sector.resume=계속하기
text.sector.locked=[scarlet][[Incomplete] text.sector.locked=[scarlet][[완료안됨]
text.sector.unexplored=[accent][[Unexplored] text.sector.unexplored=[accent][[탐색안됨]
text.close=Close text.close=닫기
text.save.playtime=Playtime: {0} text.save.playtime=플레이시간:{0}
text.editor.brush=Brush 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.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.gameover=이 구역을 잃었습니다. 다시 배치하시겠습니까?
text.sector.retry=Retry text.sector.retry=다시할꺼임
text.wave.lasted=You lasted until wave [accent]{0}[]. text.wave.lasted=[accent]{0}[] 까지 버티셨습니다.
setting.fpscap.name=Max FPS
setting.fpscap.none=None setting.fpscap.name=최대 FPS
setting.fpscap.none=없음
setting.fpscap.text={0} FPS setting.fpscap.text={0} FPS
block.command-center.name=Command Center
text.mission=Mission:[LIGHT_GRAY] {0} block.command-center.name=명령 본부
text.mission.wave=Survive [accent]{0}[] waves.
text.mission.battle=Destroy the enemy base. text.mission=목표:[LIGHT_GRAY] {0}
text.none=<none> text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요.
text.sector.corrupted=[orange]A save file for this sector was found, but loading failed.\nA new one has been created. text.mission.battle=적 본부를 파괴하세요.
text.mission.complete=Mission complete! text.none=<없음>
text.mission.complete.body=Sector {0},{1} has been conquered. text.sector.corrupted=[orange]저장 파일에서 구역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다.
text.mission.complete=미션 성공!
text.mission.complete.body=구역 {0},{1} 탐색 성공.
text.mission.resource=Obtain {0} x{1} text.mission.resource=Obtain {0} x{1}
text.unit.health=[LIGHT_GRAY]Health: {0} text.unit.health=[LIGHT_GRAY]체력:{0}
text.unit.speed=[LIGHT_GRAY]Speed: {0} text.unit.speed=[LIGHT_GRAY]속도:{0}
block.drone-pad.name=Drone Pad
block.fabricator-pad.name=Fabricator Pad block.drone-pad.name=드론 공장
block.interceptor-pad.name=Interceptor Pad block.fabricator-pad.name=페버 공장
block.monsoon-pad.name=Monsoon Pad block.interceptor-pad.name=인터셉터 공장
block.mass-driver.name=Mass Driver block.monsoon-pad.name=문순 공장
block.blast-drill.name=Blast Drill block.mass-driver.name=물질 이동기
unit.drone.name=Drone block.blast-drill.name=고속 발열 드릴
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.drone.name=드론
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.drone.description=초기형 드론 유닛입니다. 기본적으로 코어에서 1대를 스폰합니다. 자동으로 아이템을 수집/채광하며 블럭들을 수리합니다.
unit.scout.name=Scout unit.fabricator.name=페버
unit.scout.description=A basic ground unit. Uses lead as ammo. unit.fabricator.description=고급 드론 유닛입니다. 자동으로 아이템과 수집/채광/블록들을 수리하며, 일반 드론보다 더 빠르게 작업할 수 있습니다.
unit.titan.name=Titan unit.scout.name=스카웃
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.scout.description=기본 지상 유닛입니다. 납을 탄약으로 사용합니다.
unit.monsoon.name=Monsoon unit.titan.name=타이탄
unit.monsoon.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다.
unit.interceptor.name=Interceptor unit.monsoon.name=문순
unit.interceptor.description=A fast, hit-and-run strike unit. Uses lead as ammo. 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. 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.thermal-pump.name=지열 펌프
block.dagger-pad.name=Dagger Pad block.dagger-pad.name=디거 공장
block.titan-pad.name=Titan Pad block.titan-pad.name=타이탄 공장
block.thermal-generator.name=Thermal Generator block.thermal-generator.name=지열 발전기

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.credits=Авторы
text.discord=Присоединяйтесь к нашему Discord! text.discord=Присоединяйтесь к нашему Discord!
text.link.discord.description=официальный discord-сервер Mindustry text.link.discord.description=официальный discord-сервер Mindustry
@@ -21,10 +21,10 @@ text.level.delete.title=Подтвердите удаление
text.map.delete=Вы действительно хотите удалить карту "[orange]{0}[]"? text.map.delete=Вы действительно хотите удалить карту "[orange]{0}[]"?
text.level.select=Выбор уровня text.level.select=Выбор уровня
text.level.mode=Режим игры: text.level.mode=Режим игры:
text.construction.title=Руководство по строительству блоков text.construction.title=Руководство по размещения блоков
text.construction=Вы только что выбрали режим строительства [accent]блоков[].\n\nЧтобы начать размещение, просто коснитесь действительного местоположения рядом с вашим кораблем.\nПосле того, как вы выбрали несколько блоков, установите флажок, чтобы подтвердить, и ваш корабль начнет их строить.\n\n- [accent]Удалите блоки [] из вашего выбора, нажав на них.n- [accent]Shift выделение [], удерживая и перетаскивая любой блок в выборе.\n- [accent]Поместите блоки в линию [], нажимая и удерживая пустое место, а затем перетаскивая его в направлении.\n- [accent]Отмените строительство или выбор [], нажав X в левом нижнем углу. text.construction=Вы только что выбрали режим размещения[accent]блоков[].\n\nЧтобы начать размещение, просто коснитесь подходящего местоположения рядом с вашим кораблем.\nПосле того, как вы поставили несколько блоков, нажмите на галочку, чтобы подтвердить, и ваш корабль начнет их строить.\n\n- [accent]Удалите блоки [] из вашего выбора, нажав на них.n- [accent]Нажмите Shift [] и, удерживая, перетащите любой блок в выборе.\n- [accent]Поместите блоки в линию [], нажимая и удерживая пустое место, а затем перетаскивая его в направлении.\n- [accent]Отмените размещение или выбор [], нажав X в левом нижнем углу.
text.deconstruction.title=Руководство по разрушении блоков 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.showagain=Не показывать снова до следующей сессии
text.coreattack=< Ядро находится под атакой! > text.coreattack=< Ядро находится под атакой! >
text.unlocks=Разблокированные text.unlocks=Разблокированные
@@ -39,15 +39,15 @@ text.sector=Выбранный сектор: [LIGHT_GRAY]{0}
text.sector.time=Время: [LIGHT_GRAY]{0} text.sector.time=Время: [LIGHT_GRAY]{0}
text.sector.deploy=Высадиться text.sector.deploy=Высадиться
text.sector.resume=Продолжить text.sector.resume=Продолжить
text.sector.locked=[scarlet][[Не завершено] text.sector.locked=[scarlet][[Не завершён]
text.sector.unexplored=[accent][[Не изучено] text.sector.unexplored=[accent][[Неисследованный]
text.mission=Миссия:[LIGHT_GRAY] {0} text.mission=Миссия:[LIGHT_GRAY] {0}
text.mission.complete=Миссия выполнена! text.mission.complete=Миссия выполнена!
text.mission.complete.body=Сектор {0},{1} был завоёван. text.mission.complete.body=Сектор {0},{1} был завоёван.
text.mission.wave=Пережено следующее количество волн:[accent]{0}[]. text.mission.wave=Пережить следующее количество волн: [accent]{0}[].
text.mission.battle=Уничтожьте базу противника. text.mission.battle=Уничтожьте базу противника.
text.mission.resource=Приобретено {0} x{1} text.mission.resource=Приобретено {0} x{1}
text.none=ичего> text.none=ет>
text.close=Закрыть text.close=Закрыть
text.quit=Выход text.quit=Выход
text.maps=Карты text.maps=Карты
@@ -94,7 +94,7 @@ text.trace.structureblocksbroken=Структурных блоков слома
text.trace.lastblockbroken=Последний сломанный блок:[accent]{0} text.trace.lastblockbroken=Последний сломанный блок:[accent]{0}
text.trace.totalblocksplaced=Всего размещено блоков: [accent]{0} text.trace.totalblocksplaced=Всего размещено блоков: [accent]{0}
text.trace.lastblockplaced=Последний размещенный блок: [accent]{0} text.trace.lastblockplaced=Последний размещенный блок: [accent]{0}
text.invalidid=Недопустимый идентификатор клиента! Отправьте отчет об ошибке. text.invalidid=Недопустимый идентификатор клиента! Отправьте отчёт об ошибке.
text.server.bans=Блокировки text.server.bans=Блокировки
text.server.bans.none=Никаких заблокированных игроков не найдено! text.server.bans.none=Никаких заблокированных игроков не найдено!
text.server.admins=Администраторы text.server.admins=Администраторы
@@ -220,7 +220,7 @@ text.editor.exportimage=Экспортировать изображение ла
text.editor.exportimage.description=Экспортировать файл изображения карты text.editor.exportimage.description=Экспортировать файл изображения карты
text.editor.loadimage=Загрузить \nизображение text.editor.loadimage=Загрузить \nизображение
text.editor.saveimage=Сохранить \nизображение text.editor.saveimage=Сохранить \nизображение
text.editor.unsaved=[scarlet]У вас есть несохранённые изменения![] \nВы уверены,что хотите выйти? text.editor.unsaved=[scarlet]У вас есть несохранённые изменения![] \nВы уверены, что хотите выйти?
text.editor.resizemap=Изменить размер карты text.editor.resizemap=Изменить размер карты
text.editor.mapname=Название карты: text.editor.mapname=Название карты:
text.editor.overwrite=[accent]Внимание! \nЭто перезапишет уже существующую карту. text.editor.overwrite=[accent]Внимание! \nЭто перезапишет уже существующую карту.
@@ -364,13 +364,13 @@ content.liquid.name=Жидкости
content.unit-type.name=Боевые единицы content.unit-type.name=Боевые единицы
content.recipe.name=Блоки content.recipe.name=Блоки
item.stone.name=Камень item.stone.name=Камень
item.stone.description=Обычное сырье. Используется для разделения и переработки в другие материалы или плавления в лаву. item.stone.description=Обычное сырьё. Используется для разделения и переработки в другие материалы или плавления в лаву.
item.tungsten.name=Вольфрам item.tungsten.name=Вольфрам
item.tungsten.description=Обычный, но очень полезный строительный материал . Используется в бурах и теплостойких блоках, таких как генераторы и плавильные печи. item.tungsten.description=Обычный, но очень полезный строительный материал . Используется в бурах и теплостойких блоках, таких как генераторы и плавильные печи.
item.lead.name=Свинец item.lead.name=Свинец
item.lead.description=Основной начальный материал. Широко используется в блоках электроники и транспортировки жидкости. item.lead.description=Основной начальный материал. Широко используется в блоках электроники и транспортировки жидкости.
item.coal.name=Уголь item.coal.name=Уголь
item.coal.description=Распростанённое и легкодоступное топливо. item.coal.description=Распространённое и легкодоступное топливо.
item.carbide.name=Карбид item.carbide.name=Карбид
item.carbide.description=Жёсткий сплав, изготовленный из вольфрама и угля. Используется в передовых транспортных блоках и высокоуровневых бурах. item.carbide.description=Жёсткий сплав, изготовленный из вольфрама и угля. Используется в передовых транспортных блоках и высокоуровневых бурах.
item.titanium.name=Титан item.titanium.name=Титан
@@ -388,7 +388,7 @@ item.biomatter.description=Скопление органической каши;
item.sand.name=Песок item.sand.name=Песок
item.sand.description=Обычный материал, который широко используется при плавке как в сплаве, так и в виде шлака. item.sand.description=Обычный материал, который широко используется при плавке как в сплаве, так и в виде шлака.
item.blast-compound.name=Взрывоопасное соединение item.blast-compound.name=Взрывоопасное соединение
item.blast-compound.description=Летучее соединение, используемое в бомбах и взрывчатых веществах. Хотя это может сгореть в качестве топлива, но не рекомендуется этого делать. item.blast-compound.description=Летучее соединение, используемое в бомбах и взрывчатых веществах. Хотя может гореть в качестве топлива, но не рекомендуется этого делать.
item.pyratite.name=Пиротит item.pyratite.name=Пиротит
item.pyratite.description=Очень огнеопасное вещество, используемое в зажигательном оружии. item.pyratite.description=Очень огнеопасное вещество, используемое в зажигательном оружии.
liquid.water.name=Вода liquid.water.name=Вода
@@ -405,6 +405,21 @@ text.unit.speed=[LIGHT_GRAY]Скорость: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Теплоёмкость: {0} text.liquid.heatcapacity=[LIGHT_GRAY]Теплоёмкость: {0}
text.liquid.viscosity=[LIGHT_GRAY]Вязкость: {0} text.liquid.viscosity=[LIGHT_GRAY]Вязкость: {0}
text.liquid.temperature=[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.name=Вольфрамовая стена
block.tungsten-wall-large.name=Большая вольфрамовая стена block.tungsten-wall-large.name=Большая вольфрамовая стена
block.carbide-wall.name=Карбидная стена block.carbide-wall.name=Карбидная стена
@@ -420,18 +435,18 @@ block.lancer.name=Копейщик
block.conveyor.name=Конвейер block.conveyor.name=Конвейер
block.titanium-conveyor.name=Титановый конвейер block.titanium-conveyor.name=Титановый конвейер
block.junction.name=Перекрёсток block.junction.name=Перекрёсток
block.splitter.name=Разветвитель block.splitter.name=Маршрутизатор
block.splitter.description=Выводит предметы на два противоположных направления сразу после их получения. block.splitter.description=Выводит предметы на два противоположных направления сразу после их получения.
block.router.name=Маршрутизатор block.router.name=Маршрутизатор
block.router.description=Распределяет предметы во все 4 направления. Может хранить элементы как буфера. block.router.description=Распределяет предметы в 4 направления. Может хранить элементы как буфер.
block.distributor.name=Распределитель block.distributor.name=Распределитель
block.distributor.description=Разветвитель, который может распределять предметы на 8 направлений. block.distributor.description=Разветвитель, который может распределять предметы на 8 направлений.
block.sorter.name=Сортировщик block.sorter.name=Сортировщик
block.sorter.description=Сортирует предметы. Если предмет соответствует выбранному, то ему можно пройти. В противном случае элемент выводится слева и справа. block.sorter.description=Сортирует предметы. Если предмет соответствует выбранному, то ему можно пройти. В противном случае элемент выводится слева и справа.
block.overflow-gate.name=Избыточный затвор block.overflow-gate.name=Избыточный затвор
block.overflow-gate.description=Комбинированный разветвитель и маршрутизатор, который выводится только слева и справа, если передний путь заблокирован. block.overflow-gate.description=Комбинированный разветвитель и маршрутизатор, который выводит только слева и справа, если передний путь заблокирован.
block.bridgeconveyor.name=Мостовой конвейер block.bridgeconveyor.name=Мостовой конвейер
block.bridgeconveyor.description=Конвейер, который может переходить через другие блоки, до двух блоков в сумме. block.bridgeconveyor.description=Конвейер, который может переходить через другие блоки, до двух блоков всего.
block.smelter.name=Плавильный завод block.smelter.name=Плавильный завод
block.arc-smelter.name=Дуговая печь block.arc-smelter.name=Дуговая печь
block.silicon-smelter.name=Кремниевый плавильный завод block.silicon-smelter.name=Кремниевый плавильный завод
@@ -462,7 +477,7 @@ block.conduit.name=Трубопровод
block.pulseconduit.name=Импульсный трубопровод block.pulseconduit.name=Импульсный трубопровод
block.liquidrouter.name=Маршрутизатор жидкостей block.liquidrouter.name=Маршрутизатор жидкостей
block.liquidtank.name=Жидкостный резервуар block.liquidtank.name=Жидкостный резервуар
block.liquidjunction.name=Перекресток для жидкостей block.liquidjunction.name=Перекрёсток для жидкостей
block.bridgeconduit.name=Мостовой трубопровод block.bridgeconduit.name=Мостовой трубопровод
block.mechanical-pump.name=Механическая помпа block.mechanical-pump.name=Механическая помпа
block.itemsource.name=Источник предметов block.itemsource.name=Источник предметов
@@ -474,7 +489,7 @@ block.unloader.name=Разгрузчик
block.sortedunloader.name=Сортированный разгрузчик block.sortedunloader.name=Сортированный разгрузчик
block.vault.name=Хранилище block.vault.name=Хранилище
block.wave.name=Волна block.wave.name=Волна
block.swarmer.name=Зерг block.swarmer.name=Роевик
block.salvo.name=Залп block.salvo.name=Залп
block.ripple.name=Волнистость block.ripple.name=Волнистость
block.phase-conveyor.name=Фазовый конвейер block.phase-conveyor.name=Фазовый конвейер
@@ -497,7 +512,7 @@ block.pulse-conduit.name=Импульсный трубопровод
block.phase-conduit.name=Фазовый трубопровод block.phase-conduit.name=Фазовый трубопровод
block.liquid-router.name=Жидкостный маршрутизатор block.liquid-router.name=Жидкостный маршрутизатор
block.liquid-tank.name=Жидкостный резервуар block.liquid-tank.name=Жидкостный резервуар
block.liquid-junction.name=Жидкое соединение block.liquid-junction.name=Жидкостный перекрёсток
block.bridge-conduit.name=Мостовой трубопровод block.bridge-conduit.name=Мостовой трубопровод
block.rotary-pump.name=Роторный насос block.rotary-pump.name=Роторный насос
block.nuclear-reactor.name=Ядерный реактор block.nuclear-reactor.name=Ядерный реактор

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.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.gameover=Ядро було зруйновано.
text.highscore=[YELLOW] Новий рекорд! text.sector.gameover=Цей сектор було втрачено. Повторно висадитися?
text.level.highscore=Рекорд: [accent] {0} text.sector.retry=Повторити спробу
text.highscore=[accent] Новий рекорд!
text.wave.lasted=Ви проіснували до [accent]{0}[] хвилі.
text.level.highscore=Рекорд: [accent]{0}
text.level.delete.title=Підтвердьте видалення text.level.delete.title=Підтвердьте видалення
text.map.delete=Ви впевнені, що хочете видалити карту "[orange]{0}[]"?
text.level.select=Вибір рівня 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.savegame=Зберегти гру
text.loadgame=Завантажити гру text.loadgame=Завантажити гру
text.joingame=Приєднатися\nдо гри 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.quit=Вийти
text.about.button=Про text.maps=Карти
text.name=Назва: text.continue=Продовжити
text.nextmission=Наступна місія
text.maps.none=[LIGHT_GRAY]Карт не знайдено!
text.about.button=Про гру
text.name=Нік:
text.unlocked=Новий блок розблоковано!
text.unlocked.plural=Нові блоки розблоковано!
text.players={0} гравців онлайн text.players={0} гравців онлайн
text.players.single={0} гравців онлайн text.players.single={0} гравець онлай
text.server.mismatch=Пакетна помилка: невідповідність версії версії клієнта / сервера. Переконайтеся, що ви та хост мають останню версію Mindustry! text.server.mismatch=Пакетна помилка: невідповідність версії клієнта / сервера. \nПереконайтеся, що ви та хост мають останню версію Mindustry!
text.server.closing=[accent] Закриття сервера ... text.server.closing=[accent]Закриття сервера...
text.server.kicked.kick=Ви були вигнані з сервера! text.server.kicked.kick=Ви були вигнані(кікнуті) з сервера!
text.server.kicked.invalidPassword=Невірний пароль! text.server.kicked.fastShoot=Ви стріляєте занадто швидко.
text.server.kicked.clientOutdated=Застарілий клієнт! Оновіть свою гру! text.server.kicked.serverClose=Сервер закритий.
text.server.kicked.sectorComplete=Сектор завершено.
text.server.kicked.sectorComplete.text=Ваша місія завершена. \nСервер продовжить роботу в наступному секторі.
text.server.kicked.clientOutdated=Застаріли клієнт! Оновіть свою гру!
text.server.kicked.serverOutdated=Застарілий сервер! Попросіть хост оновити! 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.host=Хост
text.hosting=[accent] Відкриття сервера ... text.hosting=[accent]Открытие сервера ...
text.hosts.refresh=Оновити text.hosts.refresh=Оновити
text.hosts.discovering=Знайомство з мережевими іграми text.hosts.discovering=Пошук локальних ігор
text.server.refreshing=Оновити сервери text.server.refreshing=Оновлення серверу
text.hosts.none=[lightgray] Ніяких ігор у мережі не знайдено! text.hosts.none=[lightgray]Локальних ігр не знайдено
text.host.invalid=[scarlet] Неможливо підключитися до хосту. 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.add=Додати сервер
text.server.delete=Ви впевнені, що хочете видалити цей сервер? text.server.delete=Ви впевнені, що хочете видалити цей сервер?
text.server.hostname=Хост: {0} text.server.hostname=Хост: {0}
text.server.edit=Редагувати сервер 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.title=Приєднатися до гри
text.joingame.ip=IP text.joingame.ip=IP:
text.disconnect=Роз'єднано text.disconnect=Відключено.
text.connecting=[accent] Підключення ... text.disconnect.data=Не вдалося завантажити світові дані!
text.connecting.data=[accent] Завантаження світових даних ... text.connecting=[accent]Підключення...
text.connectfail=[crimson] Не вдалося підключитися до сервера: [orange] {0} text.connecting.data=[accent]Завантаження даних світу...
text.server.port=Порт text.connectfail=[crimson]Не вдалося підключитися до сервера: [orange]{0}
text.server.port=Порт:
text.server.addressinuse=Адреса вже використовується! text.server.addressinuse=Адреса вже використовується!
text.server.invalidport=Недійсний номер порту. text.server.invalidport=Недійсний номер порту!
text.server.error=[crimson] Помилка хостингу сервера: [orange] {0} text.server.error=[crimson]Помилка хостингу сервера: [orange]{0}
text.save.old=Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [LIGHT_GRAY] Зберігати зворотну сумісність буде реалізовано у повній версії 4.0.
text.save.new=Нове збереження text.save.new=Нове збереження
text.save.overwrite=Ви впевнені, що хочете перезаписати цей слот для збереження? text.save.overwrite=Ви впевнені, що хочете перезаписати цей слот для збереження?
text.overwrite=Перезаписати text.overwrite=Перезаписати
text.save.none=Не знайдено жодних збережень! text.save.none=Збережень не знайдено!
text.saveload=[accent] Збереження ... text.saveload=[accent]Збереження...
text.savefail=Не вдалося зберегти гру! text.savefail=Не вдалося зберегти гру!
text.save.delete.confirm=Ви впевнені, що хочете видалити це збереження? text.save.delete.confirm=Ви впевнені, що хочете видалити це збереження?
text.save.delete=Видалити text.save.delete=Видалити
text.save.export=Експорт збереження text.save.export=Экспортувати збереження
text.save.import.invalid=[orange] Це збереження недійсне! text.save.import.invalid=[orange]Це збереження недійсне!
text.save.import.fail=[crimson] Не вдалося імпортувати збереження: [orange] {0} text.save.import.fail=[crimson]Не вдалося імпортувати збереження: [orange]{0}
text.save.export.fail=[crimson] Не вдалося експортувати збереження: [orange] {0} text.save.export.fail=[crimson]Не вдалося экспортувати збереження: [orange]{0}
text.save.import=Імпортувати збереження text.save.import=Імпорт збереження
text.save.newslot=Назва збереження: text.save.newslot=Зберегти ім'я:
text.save.rename=Переіменувати text.save.rename=Перейменувати
text.save.rename.text=Нова назва: text.save.rename.text=Нова назва:
text.selectslot=Виберіть збереження. text.selectslot=Виберіть збереження.
text.slot=[accent] слот {0} text.slot=[accent]Слот {0}
text.save.corrupted=[orange] Збережений файл пошкоджений або він невірний! text.save.corrupted=[orange]Збережений файл пошкоджений або недійсний! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не []є помилкою.
text.empty=<порожньо> text.sector.corrupted=[orange]Знайдено файл збереження для цього сектора, але завантаження не вдалося. \n Буде створений новий.
text.on=Увімкнути text.empty=<порожній>
text.off=Вимкнути text.on=Вкл
text.off=Выкл
text.save.autosave=Автозбереження: {0} text.save.autosave=Автозбереження: {0}
text.save.map=Карта text.save.map=Карта: {0}
text.save.wave=Хвиля {0} text.save.wave=Хвиля {0}
text.save.difficulty=Складність text.save.difficulty=Рівень складності: {0}
text.save.date=Останнє збережено: {0} text.save.date=Останне збереження: {0}
text.save.playtime=Час гри: {0}
text.confirm=Підтвердити text.confirm=Підтвердити
text.delete=Видалити text.delete=Видалити
text.ok=ОК text.ok=ОК
text.open=Відкрити text.open=Відкрити
text.cancel=Скасувати text.cancel=Скасувати
text.openlink=Відкрити посилання text.openlink=Відкрити посилання
text.copylink=Скопіювати посилання
text.back=Назад text.back=Назад
text.quit.confirm=Ти впевнений що хочеш піти? text.quit.confirm=Ти впевнений що хочеш вийти?
text.loading=[accent] Завантаження ... text.changelog.title=Журнал змін
text.wave=[orange] хвиля {0} 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.wave.waiting=Хвиля через {0}
text.waiting=Очікування text.waiting=Очікування...
text.enemies={0} Вороги text.enemies=Ворогів:{0}
text.enemies.single=Противник text.enemies.single={0} Ворог
text.loadimage=Завантажити зображення text.loadimage=Завантажити зображення
text.saveimage=Зберегти зображення text.saveimage=Зберегти зображення
text.editor.badsize=[orange] Недійсні розміри зображення! [] Дійсні розміри карти: {0} text.unknown=Невідома
text.editor.errorimageload=Помилка завантаження файлу зображень: [orange] {0} text.custom=Користувальницька
text.editor.errorimagesave=Помилка збереження файлу зображення: [orange] {0} text.builtin=Bбудована
text.editor.generate=Генератор 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=сочина
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.resize=Змінити розмір
text.editor.loadmap=// Завантажити карту text.editor.loadmap=Завантажити карту
text.editor.savemap=Зберегти карту text.editor.savemap=Зберегти карту
text.editor.loadimage=Завантажити зображення text.editor.saved=Збережено!
text.editor.saveimage=Зберегти зображення text.editor.save.noname=Ваша карта не має імені! Встановіть його в меню "інформація про карту".
text.editor.unsaved=[scarlet] У вас є незбережені зміни! [] Ви впевнені, що хочете вийти? 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.resizemap=Змінити розмір карти
text.editor.mapname=Назва карти: text.editor.mapname=Назва карти:
text.editor.overwrite=[accent] Попередження! Це перезаписує існуючу карту. text.editor.overwrite=[accent]Попередження!\nЦе перезаписує існуючу карту.
text.editor.selectmap=Виберіть карту для завантаження: text.editor.overwrite.confirm=[scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її?
text.width=Ширина text.editor.selectmap=Select a map to load:
text.height=Висота text.width=Ширина:
text.height=Висота:
text.menu=Меню text.menu=Меню
text.play=Відтворити text.play=Грати
text.load=Завантаження text.load=Завантаження
text.save=Зберегти text.save=Зберегти
text.language.restart=Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. text.fps=FPS: {0}
text.settings.language=Мова text.tps=TPS: {0}
text.ping=Пінг: {0} мс
text.language.restart=Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.text.settings.language=Language
text.settings=Налаштування text.settings=Налаштування
text.tutorial=Навчальний\nпосібник text.tutorial=Навчальний\nпосібник
text.editor=Редактор text.editor=Редактор
text.mapeditor=Редактор карт text.mapeditor=Редактор карт
text.donate=Підтримати проект text.donate=Пожертвувати
text.settings.reset=Скинути до стандартних text.settings.reset=Скинути до стандартних
text.settings.rebind=Переназн.
text.settings.controls=Елементи управління text.settings.controls=Елементи управління
text.settings.game=Гра text.settings.game=Гра
text.settings.sound=Звук text.settings.sound=Звук
text.settings.graphics=Графіка text.settings.graphics=Графіка
text.paused=Пауза text.paused=Пауза
text.info.title=[accent] інформація text.yes=Так
text.error.title=[crimson] Виникла помилка text.no=Ні
text.info.title=[accent]Інформація
text.error.title=[crimson]Виникла помилка
text.error.crashtitle=Виникла помилка text.error.crashtitle=Виникла помилка
text.blocks.blockinfo=Блокування інформації text.blocks.blockinfo=Інформація про блок
text.blocks.powercapacity=Потужність text.blocks.powercapacity=Місткість енергії
text.blocks.powershot=Потужність / постріл text.blocks.powershot=Енергія/постріл
text.blocks.targetsair=Атакуе повітряних ворогів?
text.blocks.itemspeed=Переміщення одиниць
text.blocks.shootrange=Діапазон
text.blocks.size=Розмір text.blocks.size=Розмір
text.blocks.liquidcapacity=Ємкість рідини text.blocks.liquidcapacity=Місткість рідини
text.blocks.maxitemssecond=Макс. Елементи / секунду text.blocks.maxitemssecond=Макс. кількість предметів/секунду
text.blocks.powerrange=Радіус потужності text.blocks.powerrange=Діапазон потужності енергії
text.blocks.itemcapacity=Ємкість предмету text.blocks.poweruse=Енергії використовується
text.blocks.inputliquid=Ввід речовини text.blocks.inputitemcapacity=Ємність вхідних елементів
text.blocks.inputitem=Вхідний матеріал 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.explosive=Вибухонебезпечний!
text.blocks.health=Здоров'я text.blocks.health=Здоров'я
text.blocks.inaccuracy=Неточність text.blocks.inaccuracy=Розкид
text.blocks.shots=Постріли text.blocks.shots=Постріли
text.blocks.inputcapacity=Вхідна ємність text.blocks.reload=Перезарядка
text.blocks.outputcapacity=Випускна ємність text.blocks.inputfuel=Паливо
setting.difficulty.easy=Легкий text.blocks.fuelburntime=Час горіння топлива
setting.difficulty.normal=Нормальний text.blocks.inputcapacity=Вміщення вводу
setting.difficulty.hard=Важкий text.blocks.outputcapacity=Вміщення виводу
setting.difficulty.insane=Божевільний text.unit.blocks=блоки
setting.difficulty.purge=Очистити text.unit.powersecond=одиниць енергії/секунду
setting.difficulty.name=Складність text.unit.liquidsecond=рідких одиниць/секунду
setting.screenshake.name=Тряска екрана text.unit.itemssecond=предметів/секунду
setting.indicators.name=Індикатори ворога text.unit.pixelssecond=пікселів/секунду
setting.effects.name=Ефекти відображення 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.sensitivity.name=Чутливість контролера
setting.saveinterval.name=Інтервал автозбереження setting.saveinterval.name=Інтервал автозбереження
setting.seconds={0} секунд setting.seconds={0} сек.
setting.fullscreen.name=Повноекранний setting.fullscreen.name=Повний екран
setting.multithread.name=Багатопотоковий [scarlet] (нестабільний!) setting.multithread.name=Багатопотоковість
setting.fps.name=Показати FPS setting.fps.name=Показати FPS
setting.vsync.name=VSunc setting.vsync.name=Вертикальна синхронізація
setting.lasers.name=Показати енергетичні лазери setting.lasers.name=Показати енергетичні лазери
setting.healthbars.name=Показати здоров'я setting.healthbars.name=Показати смужки здоров'я об'єкта
setting.minimap.name=Показати мінікарту
setting.musicvol.name=Гучність музики setting.musicvol.name=Гучність музики
setting.mutemusic.name=Вимкнути музику setting.mutemusic.name=Заглушити музику
setting.sfxvol.name=Гучність ефектів setting.sfxvol.name=Гучність звукових ефектів
setting.mutesound.name=Вимкнути звук setting.mutesound.name=Заглушити звук
text.keybind.title=Ключ перемотки text.keybind.title=Переназначити клавіші
keybind.move_x.name=move_x keybind.move_x.name=Переміщення по осі x
keybind.move_y.name=move_y keybind.move_y.name=Переміщення по осі y
keybind.select.name=Вибрати keybind.select.name=Виберіть
keybind.break.name={0}break{/0}{1}; {/1} keybind.break.name=Зламати
keybind.shoot.name=Постріл keybind.shoot.name=Постріл
keybind.zoom_hold.name=zoom_hold keybind.zoom_hold.name=Утримувати масштаб
keybind.zoom.name=Збільшити keybind.zoom.name=Збільшити
keybind.menu.name=Меню keybind.menu.name=Меню
keybind.pause.name=Пауза keybind.pause.name=Пауза
keybind.dash.name=Тире keybind.dash.name=Тире
keybind.chat.name=Чат keybind.chat.name=Чат
keybind.player_list.name=Список гравців keybind.player_list.name=Список гравців
keybind.console.name=// Консоль 1 keybind.console.name=консоль
keybind.rotate.name=Повернути keybind.rotate.name=Повертати
mode.waves.name=Хвилі mode.text.help.title=Опис режимів
mode.sandbox.name=Пісочниця mode.waves.name=хвилі
mode.waves.description=нормальний режим. обмежені ресурси та автоматичні хвилі.
mode.sandbox.name=пісочниця
mode.sandbox.description=нескінченні ресурси і нема таймера для хвиль.
mode.sandbox.warning=Зверніть увагу, що блоки не можуть бути використані в режимі "пісочниця", доки вони не розблоковані в інших режимах.\n\n [LIGHT_GRAY] Якщо ви не розблокували будь-які блоки, нічого не з'явиться.
mode.freebuild.name=Вільний режим mode.freebuild.name=Вільний режим
mode.freebuild.description=обмежені ресурси і немає таймера для хвиль.
content.item.name=Предмети
content.liquid.name=Рідини
content.unit-type.name=Бойові одиниці
content.recipe.name=Блоки
item.stone.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.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.name=Пісок
item.sand.description=Загальний матеріал, який широко використовується при плавленні, як у процесі плавки, так і в відходах.
item.blast-compound.name=Вибухонебезпечне з'єднання
item.blast-compound.description=Нестійкий склад, що використовується в бомбах та вибухових речовинах. Хоча воно може спалюватися як паливо, та це не рекомендується.
item.pyratite.name=Піратит
item.pyratite.description=Вкрай легкозаймиста речовина, що використовується у запальному озброєнні.
liquid.water.name=Вода liquid.water.name=Вода
liquid.lava.name=Лава liquid.lava.name=Лава
liquid.oil.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.name=Двері
block.door-large.name=Великі двері block.door-large.name=Великі двері
block.conduit.name=Трубопровід block.duo.name=Подвійна
block.pulseconduit.name=Імпульсний канал block.scorch.name=Випалювач
block.liquidrouter.name=маршрутизатор для рідини block.hail.name=Град
block.lancer.name=Списоносець
block.conveyor.name=Конвеєр block.conveyor.name=Конвеєр
block.titanium-conveyor.name=Титановий конвеєр
block.junction.name=Перехрестя
block.splitter.name=Розгалужувач
block.splitter.description=Виводить елементи у три різні напрямки після їх отримання.
block.router.name=Маршрутизатор block.router.name=Маршрутизатор
block.junction.name=Міст block.router.description=Розбиває елементи на всі 4 напрямки. Можна зберігати елементи як буфер.
block.liquidjunction.name=Міст для рідини block.distributor.name=розподілювач
block.distributor.description=Розгалужувач, який може виводити елементи на 8 напрямків.
block.sorter.name=Сортувальник block.sorter.name=Сортувальник
block.smelter.name=Плавильня block.sorter.description=Сортує предмети. Якщо товар відповідає виділенню, йому можна пройти. В іншому випадку предмет виводиться ліворуч і праворуч.
text.credits=Credits block.overflow-gate.name=Надмірний затвор
text.link.discord.description=the official Mindustry discord chatroom block.overflow-gate.description=Комбінований розгалужувач і маршрутизатор, який виводить тільки вліво та вправо, якщо передній шлях заблоковано.
text.link.github.description=Game source code block.bridgeconveyor.name=Мостовий конвеєр
text.link.dev-builds.description=Unstable development builds block.bridgeconveyor.description=Конвеєр, який може пройти повз інші блоки, до двох блоків усього.
text.link.trello.description=Official trello board for planned features block.smelter.name=Плавильний завод
text.link.itch.io.description=itch.io page with PC downloads and web version block.arc-smelter.name=Дуговий плавильний завод
text.link.google-play.description=Google Play store listing block.silicon-smelter.name=Кремнієвий завод
text.link.wiki.description=official Mindustry wiki block.phase-weaver.name=Фазовий ткач
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard. block.pulverizer.name=Розпилювач
text.editor.web=The web version does not support the editor!\nDownload the game to use it. block.cryofluidmixer.name=Змішувач кріогненної рідини
text.web.unsupported=The web version does not support this feature! Download the game to use it. block.melter.name=Плавильня
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"? block.incinerator.name=Сміттєспалювальний завод
text.construction.title=Block Construction Guide block.biomattercompressor.name=Біоматерний компресор
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. block.separator.name=Сепаратор
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.centrifuge.name=Centrifuge block.centrifuge.name=Centrifuge
block.power-node.name=Power Node block.power-node.name=Енергійний вузол
block.power-node-large.name=Large Power Node block.power-node-large.name=Великий енергетичний вузол
block.battery.name=Battery block.battery.name=Акумулятор
block.battery-large.name=Large Battery block.battery-large.name=Великий акумулятор
block.combustion-generator.name=Combustion Generator block.combustion-generator.name=Генератор горіння
block.turbine-generator.name=Turbine Generator block.turbine-generator.name=Турбогенератор
block.tungsten-drill.name=Tungsten Drill block.tungsten-drill.name=Вольфрамовий дриль
block.carbide-drill.name=Carbide Drill block.carbide-drill.name=Карбідовий дриль
block.laser-drill.name=Laser Drill block.laser-drill.name=Лазерний дриль
block.water-extractor.name=Water Extractor block.water-extractor.name=Екстрактор води
block.cultivator.name=Cultivator block.cultivator.name=Культиватор
block.dart-ship-factory.name=Dart Ship Factory block.dart-ship-factory.name=Завод дротикових кораблів
block.delta-mech-factory.name=Delta Mech Factory block.delta-mech-factory.name=Завод механічного дельта броньовика
block.repairpoint.name=Repair Point block.javelin-ship-factory.name=Завод кораблів Javelin
block.resupplypoint.name=Resupply Point block.repairpoint.name=Ремонтний пункт
block.liquidtank.name=Liquid Tank block.resupplypoint.name=Постачальна точка
block.bridgeconduit.name=Bridge Conduit block.conduit.name=Трубопровід
block.mechanical-pump.name=Mechanical Pump block.pulseconduit.name=Імпульсний трубопровід
block.itemsource.name=Item Source block.liquidrouter.name=Рідкий маршрутизатор
block.itemvoid.name=Item Void block.liquidtank.name=Рідкий резервуар
block.liquidsource.name=Liquid Source block.liquidjunction.name=Рідкий з'єднання
block.powervoid.name=Power Void block.bridgeconduit.name=Мостовий трубопровід
block.powerinfinite.name=Power Infinite block.mechanical-pump.name=Механічний насос
block.unloader.name=Unloader block.itemsource.name=Джерело предметів
block.sortedunloader.name=Sorted Unloader block.itemvoid.name=Предметний вакуум
block.vault.name=Vault block.liquidsource.name=Рідке джерело
block.wave.name=Wave block.powervoid.name=Енергетичний вакуум
block.swarmer.name=Swarmer block.powerinfinite.name=Нескінченна енергія
block.salvo.name=Salvo block.unloader.name=Розвантажувач
block.ripple.name=Ripple block.sortedunloader.name=Сортований розвантажувач
block.phase-conveyor.name=Phase Conveyor 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.bridge-conveyor.name=Bridge Conveyor
block.plastanium-compressor.name=Plastanium Compressor block.plastanium-compressor.name=Пластиновий компресор
block.pyratite-mixer.name=Pyratite Mixer block.pyratite-mixer.name=Змішувач піратиту
block.blast-mixer.name=Blast Mixer block.blast-mixer.name=Доменний змішувач
block.solidifer.name=Solidifer block.solidifer.name=Затверджувач
block.solar-panel.name=Solar Panel block.solar-panel.name=Сонячна панель
block.solar-panel-large.name=Large Solar Panel block.solar-panel-large.name=Велика сонячна панель
block.oil-extractor.name=Oil Extractor block.oil-extractor.name=Екстрактор нафти
block.javelin-ship-factory.name=Javelin Ship factory block.drone-pad.name=Стартовий майданчик дронів
block.repair-point.name=Repair Point block.fabricator-pad.name=Стартовий майданчик складальників
block.resupply-point.name=Resupply Point block.interceptor-pad.name=Стартовий майданчик винищувачів-перехоплювачів
block.pulse-conduit.name=Pulse Conduit block.monsoon-pad.name=Стартовий майданчик мусонів
block.phase-conduit.name=Phase Conduit block.repair-point.name=Ремонтний пункт
block.liquid-router.name=Liquid Router block.resupply-point.name=постачальна точка
block.liquid-tank.name=Liquid Tank block.pulse-conduit.name=Імпульсний водовід
block.liquid-junction.name=Liquid Junction block.phase-conduit.name=Фазовий водопровід
block.bridge-conduit.name=Bridge Conduit block.liquid-router.name=Рідкий маршрутизатор
block.rotary-pump.name=Rotary Pump block.liquid-tank.name=Рідкий резервуар
block.nuclear-reactor.name=Nuclear Reactor block.liquid-junction.name=Рідкий з'єднання
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. block.bridge-conduit.name=Мостовий водопровід
text.customgame=Custom Game block.rotary-pump.name=Роторний насос
text.campaign=Campaign block.nuclear-reactor.name=Ядерний реактор
text.sectors=Sectors block.command-center.name=Командний центр
text.sector=Selected Sector: [LIGHT_GRAY]{0} block.mass-driver.name=Електромагнітна катапульта
text.sector.time=Time: [LIGHT_GRAY]{0} block.blast-drill.name=Бурова установка
text.sector.deploy=Deploy block.thermal-pump.name=Тепловий насос
text.sector.resume=Resume block.dagger-pad.name=Стартовий майданчик дронів
text.sector.locked=[scarlet][[Incomplete] block.titan-pad.name=Стартовий майданчик титанів
text.sector.unexplored=[accent][[Unexplored] block.thermal-generator.name=Тепловий генератор
text.close=Close unit.drone.name=Дрон
text.save.playtime=Playtime: {0} unit.drone.description=Стартова бойова одиниця. З'являеться в основному за замовчуванням. Автоматично видобуває руди, збирає предмети і відновлює блоки.
text.editor.brush=Brush unit.fabricator.name=Складальник
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!) unit.fabricator.description=Покращений дрон. Автоматично видобуває руди, збирає предмети і відновлює блоки. Значно ефективніший, ніж дрон.
text.sector.gameover=This sector has been lost. Re-deploy? unit.dagger.name=Кинджал
text.sector.retry=Retry unit.dagger.description=Базова наземна бойова одиниця. Корисна у купі.
text.wave.lasted=You lasted until wave [accent]{0}[]. unit.titan.name=Титан
setting.fpscap.name=Max FPS unit.titan.description=Просунута броньована наземна одиниця. Атакуе наземні та повітряні цілі.
setting.fpscap.none=None unit.monsoon.name=Мусон
setting.fpscap.text={0} FPS unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси.
block.command-center.name=Command Center unit.interceptor.name=Винищувач-перехполювач
text.mission=Mission:[LIGHT_GRAY] {0} unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком
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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

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

View File

@@ -34,6 +34,8 @@ public class Vars{
public static final float wavespace = 60 * 60 * 1.5f; public static final float wavespace = 60 * 60 * 1.5f;
//set ridiculously high for now //set ridiculously high for now
public static final float coreBuildRange = 800999f; public static final float coreBuildRange = 800999f;
public static final float enemyCoreBuildRange = 400f;
//discord group URL //discord group URL
public static final String discordURL = "https://discord.gg/BKADYds"; public static final String discordURL = "https://discord.gg/BKADYds";
public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases";

View File

@@ -119,7 +119,7 @@ public class BlockIndexer{
* Get all allied blocks with a flag. * Get all allied blocks with a flag.
*/ */
public ObjectSet<Tile> getAllied(Team team, BlockFlag type){ 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++){ for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){
Tile other = world.tile(tx, 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; TileEntity e = other.entity;
@@ -246,7 +246,6 @@ public class BlockIndexer{
int quadrantX = tile.x / structQuadrantSize; int quadrantX = tile.x / structQuadrantSize;
int quadrantY = tile.y / structQuadrantSize; int quadrantY = tile.y / structQuadrantSize;
int index = quadrantX + quadrantY * quadWidth(); int index = quadrantX + quadrantY * quadWidth();
//Log.info("Updating quadrant: {0} {1}", quadrantX, quadrantY);
for(TeamData data : state.teams.getTeams()){ for(TeamData data : state.teams.getTeams()){

View File

@@ -179,13 +179,13 @@ public class TurretBullets extends BulletList implements ContentList{
} }
}; };
driverBolt = new BulletType(5f, 50){ driverBolt = new BulletType(5.3f, 50){
{ {
collidesTiles = false; collidesTiles = false;
lifetime = 200f; lifetime = 200f;
despawneffect = BlockFx.smeltsmoke; despawneffect = BlockFx.smeltsmoke;
hiteffect = BulletFx.hitBulletBig; hiteffect = BulletFx.hitBulletBig;
drag = 0.02f; drag = 0.01f;
} }
@Override @Override

View File

@@ -31,8 +31,10 @@ import io.anuke.ucore.util.Pooling;
import io.anuke.ucore.util.Timer; import io.anuke.ucore.util.Timer;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Random; import java.util.Random;
import java.util.zip.InflaterInputStream;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -134,7 +136,7 @@ public class NetClient extends Module{
Net.handleClient(WorldStream.class, data -> { Net.handleClient(WorldStream.class, data -> {
Log.info("Recieved world data: {0} bytes.", data.stream.available()); Log.info("Recieved world data: {0} bytes.", data.stream.available());
NetworkIO.loadWorld(data.stream); NetworkIO.loadWorld(new InflaterInputStream(data.stream));
finishConnecting(); finishConnecting();
}); });
@@ -249,6 +251,17 @@ public class NetClient extends Module{
//get data input for reading from the stream //get data input for reading from the stream
DataInputStream input = netClient.dataStream; DataInputStream input = netClient.dataStream;
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 //read wave info
state.wavetime = input.readFloat(); state.wavetime = input.readFloat();
state.wave = input.readInt(); state.wave = input.readInt();
@@ -292,9 +305,9 @@ public class NetClient extends Module{
entity.read(input, timestamp); entity.read(input, timestamp);
byte readLength = input.readByte(); byte readLength = input.readByte();
if(netClient.byteStream.position() - position - 1 != readLength){ //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) + "]"); // throw new RuntimeException("Error reading entity of type '" + group.getType() + "': Read length mismatch [write=" + readLength + ", read=" + (netClient.byteStream.position() - position - 1) + "]");
} //}
if(add){ if(add){
entity.add(); entity.add();
@@ -302,13 +315,6 @@ public class NetClient extends Module{
} }
} }
} }
//confirm that snapshot has been recieved
netClient.lastSnapshotBaseID = snapshotID;
}catch(Exception e){
throw new RuntimeException(e);
}
} }
@Override @Override

View File

@@ -9,8 +9,10 @@ import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.content.Mechs;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player; 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.entities.traits.SyncTrait;
import io.anuke.mindustry.game.Version; import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
@@ -35,6 +37,7 @@ import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.zip.DeflaterOutputStream;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -43,7 +46,7 @@ public class NetServer extends Module{
public final static boolean showSnapshotSize = false; public final static boolean showSnapshotSize = false;
private final static byte[] reusableSnapArray = new byte[maxSnapshotSize]; 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(); private final static Vector2 vector = new Vector2();
/**If a play goes away of their server-side coordinates by this distance, they get teleported back.*/ /**If a play goes away of their server-side coordinates by this distance, they get teleported back.*/
private final static float correctDist = 16f; private final static float correctDist = 16f;
@@ -169,7 +172,8 @@ public class NetServer extends Module{
//TODO try DeflaterOutputStream //TODO try DeflaterOutputStream
ByteArrayOutputStream stream = new ByteArrayOutputStream(); ByteArrayOutputStream stream = new ByteArrayOutputStream();
NetworkIO.writeWorld(player, stream); DeflaterOutputStream def = new DeflaterOutputStream(stream);
NetworkIO.writeWorld(player, def);
WorldStream data = new WorldStream(); WorldStream data = new WorldStream();
data.stream = new ByteArrayInputStream(stream.toByteArray()); data.stream = new ByteArrayInputStream(stream.toByteArray());
Net.sendStream(id, data); Net.sendStream(id, data);
@@ -200,8 +204,14 @@ public class NetServer extends Module{
player.isBoosting = packet.boosting; player.isBoosting = packet.boosting;
player.isShooting = packet.shooting; player.isShooting = packet.shooting;
player.getPlaceQueue().clear(); player.getPlaceQueue().clear();
if(packet.currentRequest != null){ for(BuildRequest req : packet.requests){
player.getPlaceQueue().addLast(packet.currentRequest); //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); 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(); 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){ String getUUID(int connectionID){
return connections.get(connectionID).uuid; return connections.get(connectionID).uuid;
} }
@@ -464,68 +539,7 @@ public class NetServer extends Module{
//reset stream to begin writing //reset stream to begin writing
syncStream.reset(); syncStream.reset();
//write wave datas writeSnapshot(player, dataStream);
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);
}
}
byte[] bytes = syncStream.toByteArray(); byte[] bytes = syncStream.toByteArray();

View File

@@ -132,6 +132,8 @@ public class Renderer extends RendererModule{
@Override @Override
public void update(){ public void update(){
//TODO hack, find source of this bug
Color.WHITE.set(1f, 1f, 1f, 1f);
if(Core.cameraScale != targetscale){ if(Core.cameraScale != targetscale){
float targetzoom = (float) Core.cameraScale / targetscale; float targetzoom = (float) Core.cameraScale / targetscale;
@@ -195,6 +197,10 @@ public class Renderer extends RendererModule{
@Override @Override
public void draw(){ public void draw(){
camera.update(); 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); Graphics.clear(clearColor);
@@ -278,6 +284,7 @@ public class Renderer extends RendererModule{
drawAndInterpolate(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName); drawAndInterpolate(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName);
EntityDraw.setClip(true); EntityDraw.setClip(true);
Graphics.end(); Graphics.end();
Draw.color();
} }
private void drawFlyerShadows(){ private void drawFlyerShadows(){

View File

@@ -237,12 +237,9 @@ public class World extends Module{
EntityPhysics.resizeTree(0, 0, width * tilesize, height * tilesize); EntityPhysics.resizeTree(0, 0, width * tilesize, height * tilesize);
Timers.mark();
generator.generateMap(tiles, sector); generator.generateMap(tiles, sector);
endMapLoad(); endMapLoad();
Log.info("Full time to generate: {0}", Timers.elapsed());
} }
public void loadMap(Map map){ public void loadMap(Map map){
@@ -300,7 +297,7 @@ public class World extends Module{
} }
public void setBlock(Tile tile, Block block, Team team){ public void setBlock(Tile tile, Block block, Team team){
tile.setBlock(block); tile.setBlock(block, team);
if(block.isMultiblock()){ if(block.isMultiblock()){
int offsetx = -(block.size - 1) / 2; int offsetx = -(block.size - 1) / 2;
int offsety = -(block.size - 1) / 2; int offsety = -(block.size - 1) / 2;

View File

@@ -82,14 +82,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
//region unit and event overrides, utility methods //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) @Remote(targets = Loc.server, called = Loc.server)
public static void onPlayerDeath(Player player){ public static void onPlayerDeath(Player player){
if(player == null) return; if(player == null) return;
@@ -227,7 +219,10 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
@Override @Override
public void damage(float amount){ public void damage(float amount){
Call.onPlayerDamage(this, calculateDamage(amount)); hitTime = hitDuration;
if(!Net.client()){
health -= amount;
}
if(health <= 0 && !dead){ if(health <= 0 && !dead){
Call.onPlayerDeath(this); Call.onPlayerDeath(this);
@@ -365,9 +360,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void drawOver(){ public void drawOver(){
if(dead) return; if(dead) return;
if(!isShooting()){
drawBuilding(this); drawBuilding(this);
}
if(mech.flying || boostHeat > 0.001f){ if(mech.flying || boostHeat > 0.001f){
float wobblyness = 0.6f; float wobblyness = 0.6f;
@@ -443,6 +436,13 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
public void update(){ public void update(){
hitTime = Math.max(0f, hitTime - Timers.delta()); 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()){ if(isDead()){
isBoosting = false; isBoosting = false;
boostHeat = 0f; boostHeat = 0f;
@@ -478,9 +478,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
avoidOthers(8f); avoidOthers(8f);
} }
if(!isShooting()){
updateBuilding(this); updateBuilding(this);
}
x = Mathf.clamp(x, 0, world.width() * tilesize); x = Mathf.clamp(x, 0, world.width() * tilesize);
y = Mathf.clamp(y, 0, world.height() * tilesize); y = Mathf.clamp(y, 0, world.height() * tilesize);

View File

@@ -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){ 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){ if(unit != null){
return unit; return unit;
}else{ }else{

View File

@@ -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(); float deposited = Math.min((amount - maxLiquid / 1.5f) / 4f, 0.3f) * Timers.delta();
for(GridPoint2 point : Geometry.d4){ for(GridPoint2 point : Geometry.d4){
Tile other = world.tile(tile.x + point.x, tile.y + point.y); 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); deposit(other, tile, liquid, deposited, generation + 1);
amount -= deposited / 2f; //tweak to speed up/slow down puddle propagation amount -= deposited / 2f; //tweak to speed up/slow down puddle propagation
} }

View File

@@ -10,6 +10,7 @@ import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Build; import io.anuke.mindustry.world.Build;
@@ -71,6 +72,7 @@ public interface BuilderTrait extends Entity{
if(request != null){ if(request != null){
output.writeByte(request.remove ? 1 : 0); output.writeByte(request.remove ? 1 : 0);
output.writeInt(world.toPacked(request.x, request.y)); output.writeInt(world.toPacked(request.x, request.y));
output.writeFloat(request.progress);
if(!request.remove){ if(!request.remove){
output.writeByte(request.recipe.id); output.writeByte(request.recipe.id);
output.writeByte(request.rotation); output.writeByte(request.rotation);
@@ -91,6 +93,7 @@ public interface BuilderTrait extends Entity{
byte type = input.readByte(); byte type = input.readByte();
if(type != -1){ if(type != -1){
int position = input.readInt(); int position = input.readInt();
float progress = input.readFloat();
BuildRequest request; BuildRequest request;
if(type == 1){ //remove 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 = new BuildRequest(position % world.width(), position / world.width(), rotation, Recipe.getByID(recipe));
} }
request.progress = progress;
if(applyChanges){ if(applyChanges){
getPlaceQueue().addLast(request); getPlaceQueue().addLast(request);
}else if(isBuilding()){
getCurrentRequest().progress = progress;
} }
} }
} }
@@ -144,6 +151,10 @@ public interface BuilderTrait extends Entity{
return; 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); getPlaceQueue().addLast(place);
} }
} }
@@ -202,6 +213,17 @@ public interface BuilderTrait extends Entity{
//otherwise, update it. //otherwise, update it.
BuildEntity entity = tile.entity(); BuildEntity entity = tile.entity();
if(entity == null){
getPlaceQueue().removeFirst();
return;
}
if(unit.distanceTo(tile) <= placeDistance){
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(entity), 0.4f);
}
//progress is synced, thus not updated clientside
if(!Net.client()){
//deconstructing is 2x as fast //deconstructing is 2x as fast
if(current.remove){ if(current.remove){
entity.deconstruct(unit, core, 2f / entity.buildCost * Timers.delta() * getBuildPower(tile)); entity.deconstruct(unit, core, 2f / entity.buildCost * Timers.delta() * getBuildPower(tile));
@@ -209,10 +231,10 @@ public interface BuilderTrait extends Entity{
entity.construct(unit, core, 1f / entity.buildCost * Timers.delta() * getBuildPower(tile)); entity.construct(unit, core, 1f / entity.buildCost * Timers.delta() * getBuildPower(tile));
} }
if(unit.distanceTo(tile) <= placeDistance){
unit.rotation = Mathf.slerpDelta(unit.rotation, unit.angleTo(entity), 0.4f);
}
current.progress = entity.progress(); current.progress = entity.progress();
}else{
entity.progress = current.progress;
}
} }
/**Do not call directly.*/ /**Do not call directly.*/

View File

@@ -329,6 +329,10 @@ public class Drone extends FlyingUnit implements BuilderTrait{
public void update(){ public void update(){
super.update(); super.update();
if(target != null && target.getTeam() != team){
target = null;
}
if(Net.client() && state.is(repair) && target instanceof TileEntity){ if(Net.client() && state.is(repair) && target instanceof TileEntity){
TileEntity entity = (TileEntity) target; TileEntity entity = (TileEntity) target;
entity.health += type.healSpeed * Timers.delta(); entity.health += type.healSpeed * Timers.delta();
@@ -429,7 +433,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override @Override
public void write(DataOutput data) throws IOException{ public void write(DataOutput data) throws IOException{
super.write(data); 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); data.writeInt(state.is(repair) && target instanceof TileEntity ? ((TileEntity)target).tile.packedPosition() : -1);
writeBuilding(data); writeBuilding(data);
} }

View File

@@ -24,6 +24,7 @@ import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class OverlayRenderer{ public class OverlayRenderer{
private float buildFadeTime;
public void drawBottom(){ public void drawBottom(){
for(Player player : players){ for(Player player : players){
@@ -58,6 +59,24 @@ public class OverlayRenderer{
input.drawTop(); 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.reset();
//draw selected block bars and info //draw selected block bars and info

View File

@@ -93,7 +93,7 @@ public abstract class InputHandler extends InputAdapter{
ItemTransfer.create(stack.item, ItemTransfer.create(stack.item,
player.x + Angles.trnsx(player.rotation + 180f, backTrns), player.y + Angles.trnsy(player.rotation + 180f, backTrns), 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), () -> { 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); tile.block().handleStack(stack.item, removed, tile, player);
remaining[1] -= removed; remaining[1] -= removed;

View File

@@ -584,6 +584,11 @@ public class MobileInput extends InputHandler implements GestureListener{
@Override @Override
public void update(){ public void update(){
if(state.is(State.menu)){
selection.clear();
removals.clear();
mode = none;
}
//reset state when not placing //reset state when not placing
if(mode == none){ if(mode == none){

View File

@@ -105,7 +105,7 @@ public class TypeIO{
@WriteClass(CarryTrait.class) @WriteClass(CarryTrait.class)
public static void writeCarry(ByteBuffer buffer, CarryTrait unit){ public static void writeCarry(ByteBuffer buffer, CarryTrait unit){
if(unit == null){ if(unit == null || unit.getGroup() == null){
buffer.put((byte) -1); buffer.put((byte) -1);
return; return;
} }

View File

@@ -128,7 +128,7 @@ public class FortressGenerator{
int maxIndex = (int)(1 + ((float)gen.sector.difficulty / maxDifficulty * (structures.length-2))); int maxIndex = (int)(1 + ((float)gen.sector.difficulty / maxDifficulty * (structures.length-2)));
for(int i = maxIndex/2; i < maxIndex; i++){ 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; float baseChance = 0.8f / selected.size;
@@ -187,7 +187,7 @@ public class FortressGenerator{
Block fixBlock(Block result){ Block fixBlock(Block result){
if(result == UnitBlocks.resupplyPoint) result = DefenseBlocks.tungstenWall; 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; if(result == UnitBlocks.fabricatorPad) result = DefenseBlocks.tungstenWallLarge;
return result; return result;
} }

View File

@@ -283,8 +283,10 @@ public class WorldGenerator{
if(iceridge > 0.25 && minDst > lerpDst/1.5f){ if(iceridge > 0.25 && minDst > lerpDst/1.5f){
elevation ++; elevation ++;
} }
}else{ }else if(minDst > lerpDst/1.5f){
floor = Blocks.lava; floor = Blocks.lava;
}else{
floor = Blocks.blackstone;
} }
if(temp < 0.6f){ if(temp < 0.6f){

View File

@@ -129,6 +129,9 @@ public class NetworkIO{
} }
} }
//now write a snapshot.
netServer.writeSnapshot(player, stream);
}catch(IOException e){ }catch(IOException e){
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -185,10 +188,10 @@ public class NetworkIO{
int height = stream.readShort(); int height = stream.readShort();
//TODO send advanced map meta such as author, etc //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); Map currentMap = new Map(map, new MapMeta(0, new ObjectMap<>(), width, height, null), true, () -> null);
currentMap.meta.tags.clear(); currentMap.meta.tags.clear();
currentMap.meta.tags.putAll(tags); currentMap.meta.tags.putAll(tags);
world.setSector(null);
world.setMap(currentMap); world.setMap(currentMap);
Tile[][] tiles = world.createTiles(width, height); Tile[][] tiles = world.createTiles(width, height);
@@ -270,6 +273,9 @@ public class NetworkIO{
world.endMapLoad(); world.endMapLoad();
//read raw snapshot
netClient.readSnapshot(stream);
}catch(IOException e){ }catch(IOException e){
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -1,5 +1,6 @@
package io.anuke.mindustry.net; package io.anuke.mindustry.net;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Base64Coder; import com.badlogic.gdx.utils.Base64Coder;
import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
@@ -155,7 +156,7 @@ public class Packets{
public float x, y, pointerX, pointerY, rotation, baseRotation, xv, yv; public float x, y, pointerX, pointerY, rotation, baseRotation, xv, yv;
public Tile mining; public Tile mining;
public boolean boosting, shooting; public boolean boosting, shooting;
public BuildRequest currentRequest; public Array<BuildRequest> requests = new Array<>();
@Override @Override
public void write(ByteBuffer buffer){ public void write(ByteBuffer buffer){
@@ -180,17 +181,14 @@ public class Packets{
buffer.putInt(player.getMineTile() == null ? -1 : player.getMineTile().packedPosition()); buffer.putInt(player.getMineTile() == null ? -1 : player.getMineTile().packedPosition());
BuildRequest request = player.getCurrentRequest(); buffer.putShort((short)player.getPlaceQueue().size);
for(BuildRequest request : player.getPlaceQueue()){
if(request != null){
buffer.put(request.remove ? (byte) 1 : 0); buffer.put(request.remove ? (byte) 1 : 0);
buffer.putInt(world.toPacked(request.x, request.y)); buffer.putInt(world.toPacked(request.x, request.y));
if(!request.remove){ if(!request.remove){
buffer.put((byte) request.recipe.id); buffer.put((byte) request.recipe.id);
buffer.put((byte) request.rotation); buffer.put((byte) request.rotation);
} }
}else{
buffer.put((byte) -1);
} }
} }
@@ -211,10 +209,13 @@ public class Packets{
rotation = buffer.getShort() / 2f; rotation = buffer.getShort() / 2f;
baseRotation = buffer.getShort() / 2f; baseRotation = buffer.getShort() / 2f;
mining = world.tile(buffer.getInt()); mining = world.tile(buffer.getInt());
requests.clear();
short reqamount = buffer.getShort();
for(int i = 0; i < reqamount; i++){
byte type = buffer.get(); byte type = buffer.get();
if(type != -1){
int position = buffer.getInt(); int position = buffer.getInt();
BuildRequest currentRequest;
if(type == 1){ //remove if(type == 1){ //remove
currentRequest = new BuildRequest(position % world.width(), position / world.width()); currentRequest = new BuildRequest(position % world.width(), position / world.width());
@@ -223,8 +224,8 @@ public class Packets{
byte rotation = buffer.get(); byte rotation = buffer.get();
currentRequest = new BuildRequest(position % world.width(), position / world.width(), rotation, Recipe.getByID(recipe)); currentRequest = new BuildRequest(position % world.width(), position / world.width(), rotation, Recipe.getByID(recipe));
} }
}else{
currentRequest = null; requests.add(currentRequest);
} }
} }
} }

View File

@@ -96,8 +96,6 @@ public class ContentDisplay{
table.row(); table.row();
table.add(Bundles.format("text.item.fluxiness", (int) (item.fluxiness * 100))); table.add(Bundles.format("text.item.fluxiness", (int) (item.fluxiness * 100)));
table.row(); table.row();
table.add(Bundles.format("text.item.hardness", item.hardness));
table.row();
} }
public static void displayLiquid(Table table, Liquid liquid){ public static void displayLiquid(Table table, Liquid liquid){

View File

@@ -12,10 +12,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.scene.style.Drawable; import io.anuke.ucore.scene.style.Drawable;
import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.*;
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.layout.Cell; import io.anuke.ucore.scene.ui.layout.Cell;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.scene.utils.UIUtils; import io.anuke.ucore.scene.utils.UIUtils;
@@ -49,10 +46,12 @@ public class JoinDialog extends FloatingDialog{
add = new FloatingDialog("$text.joingame.title"); add = new FloatingDialog("$text.joingame.title");
add.content().add("$text.joingame.ip").padRight(5f).left(); 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.putString("ip", text);
Settings.save(); Settings.save();
}).size(320f, 54f).get(), 100); }).size(320f, 54f).get();
Platform.instance.addDialog(field, 100);
add.content().row(); add.content().row();
add.buttons().defaults().size(140f, 60f).pad(4f); add.buttons().defaults().size(140f, 60f).pad(4f);
@@ -75,6 +74,9 @@ public class JoinDialog extends FloatingDialog{
add.shown(() -> { add.shown(() -> {
add.getTitleLabel().setText(renaming != null ? "$text.server.edit" : "$text.server.add"); add.getTitleLabel().setText(renaming != null ? "$text.server.edit" : "$text.server.add");
if(renaming != null){
field.setText(renaming.ip);
}
}); });
shown(() -> { shown(() -> {

View File

@@ -89,7 +89,7 @@ public class BlockInventoryFragment extends Fragment{
table.background("inventory"); table.background("inventory");
table.setTouchable(Touchable.enabled); table.setTouchable(Touchable.enabled);
table.update(() -> { 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(); hide();
}else{ }else{
if(holding && lastItem != null){ if(holding && lastItem != null){

View File

@@ -65,13 +65,13 @@ public class BlocksFragment extends Fragment{
//add top description table //add top description table
descTable = new Table("button"); 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(() -> { descTable.update(() -> {
// note: This is required because there is no direct connection between input.recipe and the description ui. // 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. // If input.recipe gets set to null, a proper cleanup of the ui elements is required.
boolean anyRecipeShown = input.recipe != null || hoverRecipe != null; boolean anyRecipeShown = input.recipe != null || hoverRecipe != null;
boolean descriptionTableClean = descTable.getChildren().size == 0; boolean descriptionTableClean = descTable.getChildren().size == 0;
boolean cleanupRequired = !anyRecipeShown && !descriptionTableClean; boolean cleanupRequired = (!anyRecipeShown && !descriptionTableClean);
if(cleanupRequired){ if(cleanupRequired){
descTable.clear(); descTable.clear();
} }

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.fragments;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont; 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.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array; 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.players;
import static io.anuke.mindustry.Vars.state; 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.scene;
import static io.anuke.ucore.core.Core.skin; import static io.anuke.ucore.core.Core.skin;
@@ -34,7 +36,7 @@ public class ChatFragment extends Table{
private boolean chatOpen = false; private boolean chatOpen = false;
private TextField chatfield; private TextField chatfield;
private Label fieldlabel = new Label(">"); private Label fieldlabel = new Label(">");
private BitmapFont font; //private BitmapFont font;
private GlyphLayout layout = new GlyphLayout(); 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 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); private float textWidth = Unit.dp.scl(600);
@@ -54,7 +56,7 @@ public class ChatFragment extends Table{
super(); super();
setFillParent(true); setFillParent(true);
font = Core.skin.getFont("default-font"); //font = Core.skin.getFont("default-font");
visible(() -> !state.is(State.menu) && Net.active()); visible(() -> !state.is(State.menu) && Net.active());
@@ -97,15 +99,31 @@ public class ChatFragment extends Table{
private void setup(){ private void setup(){
fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle())); fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle()));
fieldlabel.getStyle().font = font; //fieldlabel.getStyle().font = font;
fieldlabel.setStyle(fieldlabel.getStyle()); 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.setTextFieldFilter((field, c) -> field.getText().length() < Vars.maxTextLength);
chatfield.getStyle().background = null; chatfield.getStyle().background = null;
chatfield.getStyle().fontColor = Color.WHITE; chatfield.getStyle().fontColor = Color.WHITE;
chatfield.getStyle().font = skin.getFont("default-font-chat");
chatfield.setStyle(chatfield.getStyle()); 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); Platform.instance.addDialog(chatfield, Vars.maxTextLength);
bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(4f); bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(4f);
@@ -127,8 +145,9 @@ public class ChatFragment extends Table{
batch.setColor(shadowColor); batch.setColor(shadowColor);
if(chatOpen) if(chatOpen){
batch.draw(skin.getRegion("white"), offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); batch.draw(skin.getRegion("white"), offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1);
}
super.draw(batch, alpha); super.draw(batch, alpha);
@@ -141,6 +160,7 @@ public class ChatFragment extends Table{
float theight = offsety + spacing + getMarginBottom(); float theight = offsety + spacing + getMarginBottom();
for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || chatOpen); i++){ 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); layout.setText(font, messages.get(i).formattedMessage, Color.WHITE, textWidth, Align.bottomLeft, true);
theight += layout.height + textspacing; theight += layout.height + textspacing;
@@ -166,6 +186,25 @@ public class ChatFragment extends Table{
fadetime -= Timers.delta() / 180f; 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(){ private void sendMessage(){
String message = chatfield.getText(); String message = chatfield.getText();
clearChatInput(); clearChatInput();

View File

@@ -121,7 +121,7 @@ public abstract class BaseBlock{
Tile other = proximity.get((i + dump) % proximity.size); Tile other = proximity.get((i + dump) % proximity.size);
Tile in = Edges.getFacingEdge(tile, other); 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 ofract = other.entity.liquids.get(liquid) / other.block().liquidCapacity;
float fract = tile.entity.liquids.get(liquid) / liquidCapacity; float fract = tile.entity.liquids.get(liquid) / liquidCapacity;
@@ -149,7 +149,7 @@ public abstract class BaseBlock{
next = next.target(); 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)){ if(next.block().acceptLiquid(next, tile, liquid, 0f)){
float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity; float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity;
@@ -199,7 +199,7 @@ public abstract class BaseBlock{
incrementDump(tile, proximity.size); incrementDump(tile, proximity.size);
Tile other = proximity.get((i + dump) % proximity.size); Tile other = proximity.get((i + dump) % proximity.size);
Tile in = Edges.getFacingEdge(tile, other); 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); other.block().handleItem(item, other, in);
return; return;
} }
@@ -239,7 +239,7 @@ public abstract class BaseBlock{
for(int ii = 0; ii < Item.all().size; ii++){ for(int ii = 0; ii < Item.all().size; ii++){
Item item = Item.getByID(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); other.block().handleItem(item, other, in);
tile.entity.items.remove(item, 1); tile.entity.items.remove(item, 1);
incrementDump(tile, proximity.size); incrementDump(tile, proximity.size);
@@ -248,7 +248,7 @@ public abstract class BaseBlock{
} }
}else{ }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); other.block().handleItem(todump, other, in);
tile.entity.items.remove(todump, 1); tile.entity.items.remove(todump, 1);
incrementDump(tile, proximity.size); 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.*/ /** Try offloading an item to a nearby container in its facing direction. Returns true if success.*/
public boolean offloadDir(Tile tile, Item item){ public boolean offloadDir(Tile tile, Item item){
Tile other = tile.getNearby(tile.getRotation()); 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); other.block().handleItem(item, other, tile);
return true; return true;
} }

View File

@@ -42,7 +42,7 @@ public class Block extends BaseBlock implements Content{
/** internal ID */ /** internal ID */
public final int id; public final int id;
/** display name */ /** display name */
public final String formalName; public String formalName;
/** Detailed description of the block. Can be as long as necesary. */ /** Detailed description of the block. Can be as long as necesary. */
public final String fullDescription; public final String fullDescription;
/** whether this block has a tile entity that updates */ /** whether this block has a tile entity that updates */

View File

@@ -1,10 +1,12 @@
package io.anuke.mindustry.world; package io.anuke.mindustry.world;
import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.EventType.BlockBuildEvent; import io.anuke.mindustry.game.EventType.BlockBuildEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.ucore.core.Events; 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); Tile tile = world.tile(x, y);
if(tile == null) return false; if(tile == null) return false;

View File

@@ -8,6 +8,7 @@ import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.game.Team; 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.blocks.Floor;
import io.anuke.mindustry.world.modules.ConsumeModule; import io.anuke.mindustry.world.modules.ConsumeModule;
import io.anuke.mindustry.world.modules.InventoryModule; import io.anuke.mindustry.world.modules.InventoryModule;
@@ -166,8 +167,13 @@ public class Tile implements PosTrait, TargetTrait{
} }
public void setBlock(Block type, Team team){ public void setBlock(Block type, Team team){
setBlock(type); synchronized(tileSetLock){
setTeam(team); preChanged();
this.wall = type;
this.team = (byte)team.ordinal();
this.link = 0;
changed();
}
} }
public void setBlock(Block type){ public void setBlock(Block type){
@@ -392,6 +398,7 @@ public class Tile implements PosTrait, TargetTrait{
if(entity != null){ if(entity != null){
entity.removeFromProximity(); entity.removeFromProximity();
} }
team = 0;
} }
} }
@@ -403,8 +410,6 @@ public class Tile implements PosTrait, TargetTrait{
entity = null; entity = null;
} }
team = 0;
Block block = block(); Block block = block();
if(block.hasEntity()){ if(block.hasEntity()){
@@ -414,7 +419,7 @@ public class Tile implements PosTrait, TargetTrait{
if(block.hasLiquids) entity.liquids = new LiquidModule(); if(block.hasLiquids) entity.liquids = new LiquidModule();
if(block.hasPower) entity.power = new PowerModule(); if(block.hasPower) entity.power = new PowerModule();
entity.updateProximity(); entity.updateProximity();
}else{ }else if(!(block instanceof BlockPart)){
//since the entity won't update proximity for us, update proximity for all nearby tiles manually //since the entity won't update proximity for us, update proximity for all nearby tiles manually
for(GridPoint2 p : Geometry.d4){ for(GridPoint2 p : Geometry.d4){
Tile tile = world.tile(x + p.x, y + p.y); Tile tile = world.tile(x + p.x, y + p.y);

View File

@@ -53,9 +53,8 @@ public class BuildBlock extends Block{
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team){ public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team){
world.setBlock(tile, block, team);
tile.setRotation(rotation); tile.setRotation(rotation);
tile.setTeam(team); world.setBlock(tile, block, team);
Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size); Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size);
//last builder was this local client player, call placed() //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 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); int accepting = core.tile.block().acceptStack(requirements[i].item, accumulated, core.tile, builder);
core.tile.block().handleStack(requirements[i].item, accepting, 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); 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); Call.onDeconstructFinish(tile, this.recipe == null ? previous : this.recipe.result);
} }
} }

View File

@@ -14,6 +14,7 @@ public class OreBlock extends Floor{
public OreBlock(Item ore, Floor base){ public OreBlock(Item ore, Floor base){
super("ore-" + ore.name + "-" + base.name); super("ore-" + ore.name + "-" + base.name);
this.formalName = ore.name + " " + base.formalName;
this.drops = new ItemStack(ore, 1); this.drops = new ItemStack(ore, 1);
this.base = base; this.base = base;
this.variants = 3; this.variants = 3;

View File

@@ -7,10 +7,10 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.Predict; import io.anuke.mindustry.entities.Predict;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.bullet.BulletType; 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.Layer;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.AmmoEntry; import io.anuke.mindustry.type.AmmoEntry;
@@ -37,7 +37,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
public abstract class Turret extends Block{ public abstract class Turret extends Block{
protected static final int targetInterval = 15; protected static final int targetInterval = 20;
protected final int timerTarget = timers++; protected final int timerTarget = timers++;
@@ -188,11 +188,11 @@ public abstract class Turret extends Block{
if(hasAmmo(tile)){ if(hasAmmo(tile)){
if(entity.timer.get(timerTarget, targetInterval)){ 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)); 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); AmmoType type = peekAmmo(tile);
float speed = type.bullet.speed; float speed = type.bullet.speed;
if(speed < 0.1f) speed = 9999999f; if(speed < 0.1f) speed = 9999999f;
@@ -322,7 +322,7 @@ public abstract class Turret extends Block{
public float recoil = 0f; public float recoil = 0f;
public float heat; public float heat;
public int shots; public int shots;
public Unit target; public TargetTrait target;
@Override @Override
public void write(DataOutputStream stream) throws IOException{ public void write(DataOutputStream stream) throws IOException{

View File

@@ -98,7 +98,7 @@ public class Conveyor extends Block{
byte rotation = tile.getRotation(); byte rotation = tile.getRotation();
int frame = entity.clogHeat <= 0.5f ? (int) ((Timers.time() / 4f) % 4) : 0; 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); 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)); Tile other = tile.getNearby(Mathf.mod(tile.getRotation() - direction, 4));
if(other != null) other = other.target(); if(other != null) other = other.target();
if(other == null || !other.block().outputsItems()) return false; return other != null && other.block().outputsItems()
return (tile.getNearby(tile.getRotation()) == other) && ((tile.getNearby(tile.getRotation()) == other) || (!other.block().rotate || other.getNearby(other.getRotation()) == tile));
|| (!other.block().rotate || other.getNearby(other.getRotation()) == tile);
} }
@Override @Override

View File

@@ -238,7 +238,7 @@ public class MassDriver extends Block{
protected boolean linkValid(Tile tile){ protected boolean linkValid(Tile tile){
MassDriverEntity entity = tile.entity(); MassDriverEntity entity = tile.entity();
if(entity.link == -1) return false; if(entity == null || entity.link == -1) return false;
Tile link = world.tile(entity.link); Tile link = world.tile(entity.link);
return link != null && link.block() instanceof MassDriver && tile.distanceTo(link) <= range; return link != null && link.block() instanceof MassDriver && tile.distanceTo(link) <= range;

View File

@@ -35,6 +35,7 @@ public class OverflowGate extends Splitter{
int from = tile.relativeTo(src.x, src.y); int from = tile.relativeTo(src.x, src.y);
if(from == -1) return null; if(from == -1) return null;
Tile to = tile.getNearby((from + 2) % 4); Tile to = tile.getNearby((from + 2) % 4);
if(to == null) return null;
Tile edge = Edges.getFacingEdge(tile, to); Tile edge = Edges.getFacingEdge(tile, to);
if(!to.block().acceptItem(item, to, edge) || (to.block() instanceof OverflowGate)){ if(!to.block().acceptItem(item, to, edge) || (to.block() instanceof OverflowGate)){

View File

@@ -53,7 +53,7 @@ public class PowerDistributor extends PowerBlock{
protected boolean shouldDistribute(Tile tile, Tile other){ protected boolean shouldDistribute(Tile tile, Tile other){
other = other.target(); other = other.target();
//only generators can distribute to other generators //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.entity != null
&& other.block().hasPower && other.block().hasPower
&& other.entity.power.amount / other.block().powerCapacity < tile.entity.power.amount / powerCapacity; && other.entity.power.amount / other.block().powerCapacity < tile.entity.power.amount / powerCapacity;

View File

@@ -60,7 +60,7 @@ public class PowerNode extends PowerBlock{
entity.links.add(other.packedPosition()); entity.links.add(other.packedPosition());
} }
if(other.block() instanceof PowerNode){ if(other.getTeamID() == tile.getTeamID() && other.block() instanceof PowerNode){
DistributorEntity oe = other.entity(); DistributorEntity oe = other.entity();
if(!oe.links.contains(tile.packedPosition())){ if(!oe.links.contains(tile.packedPosition())){
@@ -224,12 +224,12 @@ public class PowerNode extends PowerBlock{
} }
protected boolean shouldDistribute(Tile tile, Tile other){ 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 !(other.block() instanceof PowerGenerator); //do not distribute to power generators
} }
protected boolean shouldLeechPower(Tile tile, Tile other){ 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.block() instanceof PowerDistributor //only suck power from batteries and power generators
&& other.entity.power.amount / other.block().powerCapacity > tile.entity.power.amount / powerCapacity; && 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){ 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){ if(link.block() instanceof PowerNode){
DistributorEntity oe = link.entity(); DistributorEntity oe = link.entity();

View File

@@ -234,6 +234,7 @@ public class Drill extends Block{
} }
protected boolean isValid(Tile tile){ protected boolean isValid(Tile tile){
if(tile == null) return false;
ItemStack drops = tile.floor().drops; ItemStack drops = tile.floor().drops;
return drops != null && drops.item.hardness <= tier; return drops != null && drops.item.hardness <= tier;
} }

View File

@@ -81,7 +81,7 @@ public class GenericCrafter extends Block{
public void update(Tile tile){ public void update(Tile tile){
GenericCrafterEntity entity = tile.entity(); 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.progress += 1f / craftTime * Timers.delta();
entity.totalProgress += Timers.delta(); entity.totalProgress += Timers.delta();

View File

@@ -107,6 +107,7 @@ public class SolidPump extends Pump{
@Override @Override
protected boolean isValid(Tile tile){ protected boolean isValid(Tile tile){
if(tile == null) return false;
return !tile.floor().isLiquid; return !tile.floor().isLiquid;
} }

View File

@@ -103,7 +103,7 @@ public class CoreBlock extends StorageBlock{
@Override @Override
public float handleDamage(Tile tile, float amount){ public float handleDamage(Tile tile, float amount){
return amount; return debug ? 0 : amount;
} }
@Override @Override

View File

@@ -40,7 +40,7 @@ import java.io.IOException;
public class UnitPad extends Block{ public class UnitPad extends Block{
protected float gracePeriodMultiplier = 23f; protected float gracePeriodMultiplier = 23f;
protected float speedupTime = 60f * 60f * 20; protected float speedupTime = 60f * 60f * 20;
protected float maxSpeedup = 7f; protected float maxSpeedup = 2f;
protected UnitType type; protected UnitType type;
protected float produceTime = 1000f; protected float produceTime = 1000f;

View File

@@ -48,7 +48,7 @@ public class ConsumeItem extends Consume{
@Override @Override
public boolean valid(Block block, TileEntity entity){ 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 @Override

View File

@@ -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);
}
}
}

View File

@@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import com.esotericsoftware.kryonet.*; import com.esotericsoftware.kryonet.*;
import com.esotericsoftware.minlog.Log; import com.esotericsoftware.minlog.Log;
import io.anuke.kryonet.CustomListeners.UnreliableListener;
import io.anuke.mindustry.net.Host; import io.anuke.mindustry.net.Host;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.ClientProvider; import io.anuke.mindustry.net.Net.ClientProvider;
@@ -100,7 +99,7 @@ public class KryoClient implements ClientProvider{
}; };
if(KryoCore.fakeLag){ 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{ }else{
client.addListener(listener); client.addListener(listener);
} }

View File

@@ -5,9 +5,9 @@ import com.badlogic.gdx.utils.Array;
import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.FrameworkMessage; import com.esotericsoftware.kryonet.FrameworkMessage;
import com.esotericsoftware.kryonet.Listener; import com.esotericsoftware.kryonet.Listener;
import com.esotericsoftware.kryonet.Listener.LagListener;
import com.esotericsoftware.kryonet.Server; import com.esotericsoftware.kryonet.Server;
import com.esotericsoftware.kryonet.util.InputStreamSender; import com.esotericsoftware.kryonet.util.InputStreamSender;
import io.anuke.kryonet.CustomListeners.UnreliableListener;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Net.ServerProvider; import io.anuke.mindustry.net.Net.ServerProvider;
@@ -100,7 +100,7 @@ public class KryoServer implements ServerProvider {
}; };
if(KryoCore.fakeLag){ 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{ }else{
server.addListener(listener); server.addListener(listener);
} }

View File

@@ -38,13 +38,16 @@ import static io.anuke.ucore.util.Log.*;
public class ServerControl extends Module{ public class ServerControl extends Module{
private final CommandHandler handler = new CommandHandler(""); private final CommandHandler handler = new CommandHandler("");
private ShuffleMode mode; private ShuffleMode mode;
//consecutive sector losses
private int gameOvers;
public ServerControl(String[] args){ public ServerControl(String[] args){
Settings.defaultList( Settings.defaultList(
"shufflemode", "normal", "shufflemode", "normal",
"bans", "", "bans", "",
"admins", "", "admins", "",
"sectorid", 0 "sector_x", 0,
"sector_y", 1
); );
mode = ShuffleMode.valueOf(Settings.getString("shufflemode")); mode = ShuffleMode.valueOf(Settings.getString("shufflemode"));
@@ -105,7 +108,14 @@ public class ServerControl extends Module{
state.set(State.playing); state.set(State.playing);
} }
}else{ }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(); playSectorMap();
} }
}else{ }else{
@@ -183,7 +193,7 @@ public class ServerControl extends Module{
logic.play(); logic.play();
}else{ }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(); 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 -> { handler.register("fillitems", "Fill the core with 2000 items.", arg -> {
if(!state.is(State.playing)){ if(!state.is(State.playing)){
err("Not playing. Host first."); err("Not playing. Host first.");
@@ -623,9 +644,8 @@ public class ServerControl extends Module{
return; return;
} }
info("&lyCore destroyed.");
Events.fire(GameOverEvent.class); Events.fire(GameOverEvent.class);
info("Core destroyed.");
}); });
handler.register("debuginfo", "Print debug info", arg -> { handler.register("debuginfo", "Print debug info", arg -> {
@@ -825,7 +845,11 @@ public class ServerControl extends Module{
} }
private void playSectorMap(){ 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(); logic.play();
} }
@@ -846,7 +870,9 @@ public class ServerControl extends Module{
if(world.getSector().completedMissions >= world.getSector().missions.size){ if(world.getSector().completedMissions >= world.getSector().missions.size){
world.sectors().completeSector(world.getSector().x, world.getSector().y); world.sectors().completeSector(world.getSector().x, world.getSector().y);
world.sectors().save(); world.sectors().save();
Settings.putInt("sectorid", world.getSector().x + 1); gameOvers = 0;
Settings.putInt("sector_x", world.getSector().x + world.getSector().size);
Settings.save(); Settings.save();
netServer.kickAll(KickReason.sectorComplete); netServer.kickAll(KickReason.sectorComplete);