Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c569232e74 | ||
|
|
14c526d0c4 | ||
|
|
5c4ac6b702 | ||
|
|
d58cc18136 | ||
|
|
36c01fde94 | ||
|
|
d4d9d59fe4 | ||
|
|
8dbd0a6130 | ||
|
|
3746344cba | ||
|
|
d07fd1bbfe | ||
|
|
02f95c0ed4 | ||
|
|
c98fcbd795 | ||
|
|
d071877963 | ||
|
|
0267cb4006 | ||
|
|
bf571e595c | ||
|
|
c0cad70212 | ||
|
|
7bd6dbb4b4 | ||
|
|
6d932e3d04 | ||
|
|
e154b5179d | ||
|
|
52110d6008 | ||
|
|
103b08fd1d | ||
|
|
cb09d10e7f | ||
|
|
a041c1e60d | ||
|
|
586b4cf4bd | ||
|
|
d0ff149cca | ||
|
|
f8ddc8325c | ||
|
|
59ec09e82c | ||
|
|
2ae5c96690 | ||
|
|
fda9e6bb9c | ||
|
|
b70de81c2d | ||
|
|
5e89b2568f | ||
|
|
ac1d8215ff | ||
|
|
fefc734bfa | ||
|
|
7f8735842c | ||
|
|
a226983470 | ||
|
|
28526d0a12 | ||
|
|
913e005bae | ||
|
|
7bd9fd5bae | ||
|
|
ef936214f0 | ||
|
|
18fce6b3e3 | ||
|
|
ecda4d74ab | ||
|
|
31124037b5 | ||
|
|
aaf95e0756 | ||
|
|
804e311875 | ||
|
|
61ad9bc47d | ||
|
|
2b23b7876a | ||
|
|
547d334f43 | ||
|
|
7432dc115e | ||
|
|
905defe8ce | ||
|
|
0a8ff0cde7 | ||
|
|
bd5f44030e | ||
|
|
79abb86262 | ||
|
|
fe6f98ec5a | ||
|
|
e39a856e54 | ||
|
|
64e5f8155d | ||
|
|
8328b11f6b | ||
|
|
15778b2ca5 | ||
|
|
b7842014c1 | ||
|
|
3acb843109 | ||
|
|
1768aea66f | ||
|
|
b4272e0387 |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 209 B After Width: | Height: | Size: 210 B |
|
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 234 B |
|
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 235 B |
|
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 231 B |
|
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 240 B |
|
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 235 B |
|
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 234 B |
|
Before Width: | Height: | Size: 267 B After Width: | Height: | Size: 273 B |
|
Before Width: | Height: | Size: 287 B After Width: | Height: | Size: 285 B |
|
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 269 B |
|
Before Width: | Height: | Size: 289 B After Width: | Height: | Size: 272 B |
|
Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 273 B |
|
Before Width: | Height: | Size: 289 B After Width: | Height: | Size: 270 B |
|
Before Width: | Height: | Size: 270 B After Width: | Height: | Size: 267 B |
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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이 기기의 클립보드에 복사되었습니다.
|
||||||
@@ -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=당신은 총을 너무 빨리 발사했습니다.
|
||||||
@@ -60,20 +60,20 @@ 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=이 서버를 삭제 하시겠습니까?
|
||||||
@@ -81,7 +81,7 @@ 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
|
||||||
@@ -122,7 +122,7 @@ 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=확인
|
||||||
@@ -143,9 +143,9 @@ 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=사진 불러오기
|
||||||
@@ -205,7 +205,7 @@ 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,31 +350,49 @@ 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.explosiveness=[LIGHT_GRAY]폭발력:{0}
|
||||||
text.item.flammability=[LIGHT_GRAY]인화성:{0}
|
text.item.flammability=[LIGHT_GRAY]인화성:{0}
|
||||||
text.item.radioactivity=[LIGHT_GRAY]방사능:{0}
|
text.item.radioactivity=[LIGHT_GRAY]방사능:{0}
|
||||||
text.item.fluxiness=[LIGHT_GRAY]플렉스 파워:{0}
|
text.item.fluxiness=[LIGHT_GRAY]플렉스 파워:{0}
|
||||||
text.item.hardness=[LIGHT_GRAY]강도:{0}
|
text.item.hardness=[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=석유
|
||||||
|
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=합금벽
|
||||||
@@ -377,59 +400,59 @@ 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=지열 발전기
|
||||||
@@ -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=Администраторы
|
||||||
@@ -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=Ядерный реактор
|
||||||
|
|||||||
@@ -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.sector.retry=Повторити спробу
|
||||||
|
text.highscore=[accent] Новий рекорд!
|
||||||
|
text.wave.lasted=Ви проіснували до [accent]{0}[] хвилі.
|
||||||
text.level.highscore=Рекорд: [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.disconnect.data=Не вдалося завантажити світові дані!
|
||||||
text.connecting=[accent]Підключення...
|
text.connecting=[accent]Підключення...
|
||||||
text.connecting.data=[accent] Завантаження світових даних ...
|
text.connecting.data=[accent]Завантаження даних світу...
|
||||||
text.connectfail=[crimson]Не вдалося підключитися до сервера: [orange]{0}
|
text.connectfail=[crimson]Не вдалося підключитися до сервера: [orange]{0}
|
||||||
text.server.port=Порт
|
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.changelog.title=Журнал змін
|
||||||
|
text.changelog.loading=Отримання журналу змін...
|
||||||
|
text.changelog.error.android=[orange]Зверніть увагу, що іноді журнал змін не працює на ОС Android 4.4 або на нижчій версії!\nЦе пов'язано з внутрішньою помилкою Android.
|
||||||
|
text.changelog.error.ios=[orange]Журнал змін наразі не підтримується в iOS.
|
||||||
|
text.changelog.error=[scarlet]Помилка отримання журналу змін!\nПеревірте підключення до Інтернету.
|
||||||
|
text.changelog.current=[yellow][[Поточна версія]
|
||||||
|
text.changelog.latest=[orange][[Остання версія]
|
||||||
text.loading=[accent]Завантаження...
|
text.loading=[accent]Завантаження...
|
||||||
text.wave=[orange] хвиля {0}
|
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=Bисочина
|
||||||
|
text.editor.badsize=[orange]Недійсні розміри зображення! [] \n Дійсні розміри карти: {0}
|
||||||
|
text.editor.errorimageload=Помилка завантаження файлу:\n[orange]{0}
|
||||||
|
text.editor.errorimagesave=Помилка збереження файлу:\n[orange]{0}
|
||||||
|
text.editor.generate=Генерувати
|
||||||
text.editor.resize=Змінити розмір
|
text.editor.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.no=Ні
|
||||||
|
text.info.title=[accent]Інформація
|
||||||
text.error.title=[crimson]Виникла помилка
|
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
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 756 KiB After Width: | Height: | Size: 85 KiB |
@@ -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";
|
||||||
|
|||||||
@@ -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()){
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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(){
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.*/
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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(() -> {
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)){
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||