Merge pull request #10 from Timmeey86/baltitenger

Continued work on Power Generators
This commit is contained in:
Baltazár Radics
2018-12-03 18:46:06 +01:00
committed by GitHub
135 changed files with 2034 additions and 1984 deletions

View File

@@ -20,7 +20,7 @@
<activity <activity
android:name="io.anuke.mindustry.AndroidLauncher" android:name="io.anuke.mindustry.AndroidLauncher"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="sensor" android:screenOrientation="user"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout"> android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
<intent-filter> <intent-filter>

View File

@@ -8,12 +8,11 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0' classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8" classpath "com.badlogicgames.gdx:gdx-tools:1.9.9"
} }
} }
allprojects { allprojects {
apply plugin: "eclipse"
apply plugin: "idea" apply plugin: "idea"
version = 'release' version = 'release'
@@ -25,7 +24,7 @@ allprojects {
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.9' gdxVersion = '1.9.9'
roboVMVersion = '2.3.0' roboVMVersion = '2.3.0'
uCoreVersion = 'f73e538757ac66ff62d7f25d93011142b6abb8df' uCoreVersion = '3dfb820142a0fc583ad19413a24fc5038aa29d89'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()

View File

@@ -1,5 +1,6 @@
{ {
duplicatePadding: true, duplicatePadding: true,
combineSubdirectories: true, combineSubdirectories: true,
flattenPaths: true flattenPaths: true,
fast: true
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 B

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 B

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 B

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 B

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 B

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 B

After

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

View File

@@ -351,6 +351,7 @@ text.category.items = Items
text.category.crafting = Crafting text.category.crafting = Crafting
text.category.shooting = Shooting text.category.shooting = Shooting
text.category.optional = Optional Enhancements text.category.optional = Optional Enhancements
setting.indicators.name = Ally Indicators
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None

View File

@@ -99,7 +99,7 @@ text.hosts.refresh = Actualizar
text.hosts.discovering = Descubrir partidas LAN text.hosts.discovering = Descubrir partidas LAN
text.server.refreshing = Actualizando servidor... text.server.refreshing = Actualizando servidor...
text.hosts.none = [lightgray]¡No se han encontrado partidas LAN! text.hosts.none = [lightgray]¡No se han encontrado partidas LAN!
text.host.invalid = [scarlet]No se ha podido conectar al anfitrión text.host.invalid = [scarlet]No se ha podido conectar al anfitrión.
text.trace = Rastrear Jugador text.trace = Rastrear Jugador
text.trace.playername = Nombre de jugador: [accent]{0} text.trace.playername = Nombre de jugador: [accent]{0}
text.trace.ip = IP: [accent]{0} text.trace.ip = IP: [accent]{0}
@@ -176,7 +176,7 @@ text.open = Abrir
text.cancel = Cancelar text.cancel = Cancelar
text.openlink = Abrir Enlace text.openlink = Abrir Enlace
text.copylink = Copiar Enlace text.copylink = Copiar Enlace
text.back = Atras text.back = Atrás
text.quit.confirm = ¿Estás seguro de querer salir de la partida? text.quit.confirm = ¿Estás seguro de querer salir de la partida?
text.changelog.title = Registro de Parches text.changelog.title = Registro de Parches
text.changelog.loading = Consiguiendo el registro de parches... text.changelog.loading = Consiguiendo el registro de parches...
@@ -252,7 +252,7 @@ text.load = Cargar
text.save = Guardar text.save = Guardar
text.fps = FPS: {0} text.fps = FPS: {0}
text.tps = TPS: {0} text.tps = TPS: {0}
text.ping = Ping: {0}ms text.ping = Ping: {0} ms
text.language.restart = Por favor reinicie el juego para que los cambios del lenguaje surjan efecto. text.language.restart = Por favor reinicie el juego para que los cambios del lenguaje surjan efecto.
text.settings = Ajustes text.settings = Ajustes
text.tutorial = Tutorial text.tutorial = Tutorial
@@ -277,9 +277,9 @@ text.settings.graphics = Gráficos
text.settings.cleardata = Limpiar Datos del Juego... text.settings.cleardata = Limpiar Datos del Juego...
text.settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse! text.settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse!
text.settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y keybinds.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente. text.settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y keybinds.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente.
text.settings.clearsectors = Limpiar Sectores text.settings.clearsectors = Eliminar Sectores
text.settings.clearunlocks = Limpiar Desbloqueos text.settings.clearunlocks = Eliminar Desbloqueos
text.settings.clearall = Limpiar Todo text.settings.clearall = Eliminar Todo
text.paused = Pausado text.paused = Pausado
text.yes = text.yes =
text.no = No text.no = No
@@ -311,10 +311,10 @@ text.blocks.inputitem = Objeto de Entrada
text.blocks.inputitems = Objetos de Entrada text.blocks.inputitems = Objetos de Entrada
text.blocks.outputitem = Objeto de Salida text.blocks.outputitem = Objeto de Salida
text.blocks.drilltier = Taladrables text.blocks.drilltier = Taladrables
text.blocks.drillspeed = Velocidad de Base del Taladro text.blocks.drillspeed = Velocidad Base del Taladro
text.blocks.liquidoutput = Líquido de Salida text.blocks.liquidoutput = Líquido de Salida
text.blocks.liquidoutputspeed = Velocidad de Salida del Líquido text.blocks.liquidoutputspeed = Velocidad de Salida del Líquido
text.blocks.liquiduse = Uso del Líquido text.blocks.liquiduse = Uso de Líquido
text.blocks.coolant = Refrigerante text.blocks.coolant = Refrigerante
text.blocks.coolantuse = Uso del Refrigerante text.blocks.coolantuse = Uso del Refrigerante
text.blocks.inputliquidfuel = Combustible Líquido text.blocks.inputliquidfuel = Combustible Líquido
@@ -345,7 +345,7 @@ text.category.liquids = Líquidos
text.category.items = Objetos text.category.items = Objetos
text.category.crafting = Fabricación text.category.crafting = Fabricación
text.category.shooting = Disparo text.category.shooting = Disparo
text.category.optional = Optional Enhancements text.category.optional = Mejoras Opcionales
setting.autotarget.name = Auto apuntado setting.autotarget.name = Auto apuntado
setting.fpscap.name = Máx FPS setting.fpscap.name = Máx FPS
setting.fpscap.none = Nada setting.fpscap.none = Nada
@@ -370,7 +370,7 @@ setting.musicvol.name = Volumen de la Música
setting.mutemusic.name = Silenciar Musica setting.mutemusic.name = Silenciar Musica
setting.sfxvol.name = Volumen de los efectos de sonido setting.sfxvol.name = Volumen de los efectos de sonido
setting.mutesound.name = Silenciar Sonido setting.mutesound.name = Silenciar Sonido
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Enviar informes de fallos anónimos
text.keybind.title = Reasignar Teclas text.keybind.title = Reasignar Teclas
category.general.name = General category.general.name = General
category.view.name = Visión category.view.name = Visión
@@ -412,7 +412,7 @@ mode.pvp.name = PvP
mode.pvp.description = Pelea contra otros jugadores localmente. mode.pvp.description = Pelea contra otros jugadores localmente.
content.item.name = Objetos content.item.name = Objetos
content.liquid.name = Líquidos content.liquid.name = Líquidos
content.unit.name = Units content.unit.name = Unidades
content.recipe.name = Bloques content.recipe.name = Bloques
content.mech.name = Mecanoides content.mech.name = Mecanoides
item.stone.name = Piedra item.stone.name = Piedra
@@ -433,7 +433,7 @@ item.silicon.name = Silicona
item.silicon.description = Un semiconductor muy útil, se usa para paneles solares y muchos electrónicos complejos. item.silicon.description = Un semiconductor muy útil, se usa para paneles solares y muchos electrónicos complejos.
item.plastanium.name = Plastanio item.plastanium.name = Plastanio
item.plastanium.description = Un material dúctil, ligero usado en aeronaves y proyectiles de fragmentación. item.plastanium.description = Un material dúctil, ligero usado en aeronaves y proyectiles de fragmentación.
item.phase-fabric.name = Phase Fabric item.phase-fabric.name = Tejido de fase
item.phase-fabric.description = Una sustancia casi sin peso usada en electrónica avanzada y en tecnología autoreparadora. item.phase-fabric.description = Una sustancia casi sin peso usada en electrónica avanzada y en tecnología autoreparadora.
item.surge-alloy.name = Surge Alloy item.surge-alloy.name = Surge Alloy
item.surge-alloy.description = Una aleación avanzada con propiedades eléctricas únicas. item.surge-alloy.description = Una aleación avanzada con propiedades eléctricas únicas.
@@ -493,14 +493,14 @@ text.mech.ability = [LIGHT_GRAY]Hablidad: {0}
text.liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0}
text.liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} text.liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0}
text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0} text.liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.constructing = {0}\n[LIGHT_GRAY](Construyendo)
block.spawn.name = Punto de generación block.spawn.name = Punto de generación
block.core.name = Núcleo block.core.name = Núcleo
block.metalfloor.name = Suelo de Metal block.metalfloor.name = Suelo de Metal
block.deepwater.name = Aguas profundas block.deepwater.name = Aguas profundas
block.water.name = Agua block.water.name = Agua
block.lava.name = Lava block.lava.name = Lava
block.tar.name = Tar block.tar.name = Alquitrán
block.blackstone.name = Piedra negra block.blackstone.name = Piedra negra
block.stone.name = Piedra block.stone.name = Piedra
block.dirt.name = Tierra block.dirt.name = Tierra
@@ -516,8 +516,8 @@ block.copper-wall.name = Muro de cobre
block.copper-wall-large.name = Muro de cobre grande block.copper-wall-large.name = Muro de cobre grande
block.dense-alloy-wall.name = Muro de aleación densa block.dense-alloy-wall.name = Muro de aleación densa
block.dense-alloy-wall-large.name = Muro de aleación densa grande block.dense-alloy-wall-large.name = Muro de aleación densa grande
block.phase-wall.name = Phase Wall block.phase-wall.name = Muro de Fase grande
block.phase-wall-large.name = Large Phase Wall block.phase-wall-large.name = Muro de Fase grande
block.thorium-wall.name = Pared de Torio block.thorium-wall.name = Pared de Torio
block.thorium-wall-large.name = Pared de Torio grande block.thorium-wall-large.name = Pared de Torio grande
block.door.name = Puerta block.door.name = Puerta
@@ -532,7 +532,7 @@ block.junction.name = Cruce
block.router.name = Enrutador block.router.name = Enrutador
block.distributor.name = Distribuidor block.distributor.name = Distribuidor
block.sorter.name = Clasificador block.sorter.name = Clasificador
block.sorter.description = Clasifica objetos. Si un objeto es igual a uno seleccionado, va a pasar. O si no, el objeto saldrá en la izquierda y la derecha. block.sorter.description = Clasifica objetos. Si un objeto es igual al seleccionado, pasará al frente. Si no, el objeto saldrá por la izquierda y la derecha.
block.overflow-gate.name = Compuerta de Desborde block.overflow-gate.name = Compuerta de Desborde
block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena. block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena.
block.smelter.name = Horno de Fundición block.smelter.name = Horno de Fundición
@@ -562,7 +562,7 @@ block.dart-ship-pad.name = Pad de nave de dardos
block.delta-mech-pad.name = Pad de mecanoide Delta block.delta-mech-pad.name = Pad de mecanoide Delta
block.javelin-ship-pad.name = Pad de nave Jabalina block.javelin-ship-pad.name = Pad de nave Jabalina
block.trident-ship-pad.name = Pad de nave Tridente block.trident-ship-pad.name = Pad de nave Tridente
block.glaive-ship-pad.name = Glaive Ship Pad block.glaive-ship-pad.name = Pad de nave Glaive
block.omega-mech-pad.name = Pad de mecanoide Omega block.omega-mech-pad.name = Pad de mecanoide Omega
block.tau-mech-pad.name = Pad de mecanoide Tau block.tau-mech-pad.name = Pad de mecanoide Tau
block.conduit.name = Conducto block.conduit.name = Conducto
@@ -589,12 +589,12 @@ block.solar-panel-large.name = Panel Solar Grande
block.oil-extractor.name = Extractor de Petróleo block.oil-extractor.name = Extractor de Petróleo
block.spirit-factory.name = Fábrica de Drones Espíritu block.spirit-factory.name = Fábrica de Drones Espíritu
block.phantom-factory.name = Fábrica de Drones Fantasmales block.phantom-factory.name = Fábrica de Drones Fantasmales
block.wraith-factory.name = Wraith Fighter Factory block.wraith-factory.name = Fábrica de Wraith Fighter
block.ghoul-factory.name = Ghoul Bomber Factory block.ghoul-factory.name = Fábrica de Ghoul Bomber
block.dagger-factory.name = Fábrica de Dagas block.dagger-factory.name = Fábrica de Dagas
block.titan-factory.name = Fábrica de Titanes block.titan-factory.name = Fábrica de Titanes
block.fortress-factory.name = Fortress Mech Factory block.fortress-factory.name = Fábrica de mecanoide Fortress
block.revenant-factory.name = Revenant Fighter Factory block.revenant-factory.name = Fábrica de Revenant Fighter
block.repair-point.name = Punto de Reparación block.repair-point.name = Punto de Reparación
block.pulse-conduit.name = Conducto de Pulso block.pulse-conduit.name = Conducto de Pulso
block.phase-conduit.name = Conducto de Fase block.phase-conduit.name = Conducto de Fase
@@ -606,18 +606,18 @@ block.rotary-pump.name = Bomba Rotatoria
block.thorium-reactor.name = Reactor de Torio block.thorium-reactor.name = Reactor de Torio
block.command-center.name = Centro de Comando block.command-center.name = Centro de Comando
block.mass-driver.name = Teletransportador de Masa block.mass-driver.name = Teletransportador de Masa
block.blast-drill.name = Taladro Gigante block.blast-drill.name = Taladro de explosión
block.thermal-pump.name = Bomba Térmica block.thermal-pump.name = Bomba Térmica
block.thermal-generator.name = Generador Térmico block.thermal-generator.name = Generador Térmico
block.alloy-smelter.name = Alloy Smtler block.alloy-smelter.name = Alloy Smelter
block.mend-projector.name = Proyector de reparación block.mend-projector.name = Proyector de reparación
block.surge-wall.name = Surge Wall block.surge-wall.name = Surge Wall
block.surge-wall-large.name = Large Surge Wall block.surge-wall-large.name = Large Surge Wall
block.cyclone.name = Ciclón block.cyclone.name = Ciclón
block.fuse.name = Fuse block.fuse.name = Fuse
block.shock-mine.name = Shock Mine block.shock-mine.name = Shock Mine
block.overdrive-projector.name = Overdrive Projector block.overdrive-projector.name = Proyector de sobremarcha
block.force-projector.name = Force Projector block.force-projector.name = Proyector de fuerza
block.arc.name = Arc block.arc.name = Arc
block.rtg-generator.name = Generador RTG block.rtg-generator.name = Generador RTG
block.spectre.name = Espectro block.spectre.name = Espectro
@@ -703,7 +703,7 @@ block.junction.description = Actúa como puente para dos transportadores que se
block.mass-driver.description = El mejor bloque de transorte. Recoge varios objetos y los dispara a otro conductor de masa en un largo rango. block.mass-driver.description = El mejor bloque de transorte. Recoge varios objetos y los dispara a otro conductor de masa en un largo rango.
block.smelter.description = Quema carbón para fundir cobre y plomo, produciendo así aleación densa. block.smelter.description = Quema carbón para fundir cobre y plomo, produciendo así aleación densa.
block.arc-smelter.description = Funde cobre y plomo en aleación densa usando una fuented de energía externa. block.arc-smelter.description = Funde cobre y plomo en aleación densa usando una fuented de energía externa.
block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. block.silicon-smelter.description = Reduce arena con coque de alta pureza para producir silicona.
block.plastanium-compressor.description = Produce plastanio con aceite y titanio. block.plastanium-compressor.description = Produce plastanio con aceite y titanio.
block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand.
block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicona y cobre. block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicona y cobre.
@@ -743,12 +743,12 @@ block.trident-ship-pad.description = Deja tu nave actual y transfórmate en una
block.javelin-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea fuerte y rápida interceptora con arma eléctrica.\nUsa el pad tocándolo dos veces mientras estás en él. block.javelin-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea fuerte y rápida interceptora con arma eléctrica.\nUsa el pad tocándolo dos veces mientras estás en él.
block.glaive-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea grande y bien armada nave pistolera.\nUsa el pad tocándolo dos veces mientras estás en él. block.glaive-ship-pad.description = Deja tu nave actual y transfórmate en una unidad aérea grande y bien armada nave pistolera.\nUsa el pad tocándolo dos veces mientras estás en él.
block.tau-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide de soporte que puede reparar construcciones y tropas aliadas.\nUsa el pad tocándolo dos veces mientras estás en él. block.tau-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide de soporte que puede reparar construcciones y tropas aliadas.\nUsa el pad tocándolo dos veces mientras estás en él.
block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. block.delta-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide rápido y ligero hecho para ataques de emboscada y retirada.\nUsa el pad tocándolo dos veces mientras estás en él.
block.omega-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide pesado y bien armado, hecho para asaltos en primera línea.\nUsa el pad tocándolo dos veces mientras estás en él. block.omega-mech-pad.description = Deja tu nave actual y transfórmate en un mecanoide pesado y bien armado, hecho para asaltos en primera línea.\nUsa el pad tocándolo dos veces mientras estás en él.
block.spirit-factory.description = Produce drones ligeros que obtienen minerales y reparan bloques. block.spirit-factory.description = Produce drones ligeros que obtienen minerales y reparan bloques.
block.phantom-factory.description = Produce drones avanzados que son significativamente más eficientes que un dron espíritu. block.phantom-factory.description = Produce drones avanzados que son significativamente más eficientes que un dron espíritu.
block.wraith-factory.description = Produce unidades aéreas rápidas e interceptoras. block.wraith-factory.description = Produce unidades aéreas rápidas e interceptoras.
block.ghoul-factory.description = Produce unidadess bombarderas pesadas. block.ghoul-factory.description = Produce unidades bombarderas pesadas.
block.dagger-factory.description = Produce unidades terrestres básicas. block.dagger-factory.description = Produce unidades terrestres básicas.
block.titan-factory.description = Produce unidades terrestres avanzadas. block.titan-factory.description = Produce unidades terrestres avanzadas.
block.fortress-factory.description = Produce unidades terrestres de artillería pesada. block.fortress-factory.description = Produce unidades terrestres de artillería pesada.

View File

@@ -1,5 +1,6 @@
text.credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недороботки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский. \n\n Активные переводчики:\n[GREEN]Prosta4ok_ua[]\n[GREEN]xga[]\n[BLACK]XZimur[]\n Неактивные переводчики:\n[MAGENTA]Krocotavus[]\nReazy\n[RED]Lexa1549[] text.credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недороботки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[GREEN]xga\n[BLACK]XZimur
text.credits = Авторы text.credits = Авторы
text.contributors = Переводчики и контрибьюторы
text.discord = Присоединяйтесь к нашему Discord! text.discord = Присоединяйтесь к нашему Discord!
text.link.discord.description = Официальный discord-сервер Mindustry text.link.discord.description = Официальный discord-сервер Mindustry
text.link.github.description = Исходный код игры text.link.github.description = Исходный код игры
@@ -14,7 +15,7 @@ text.gameover.pvp = [accent] {0}[] команда победила!
text.sector.gameover = Этот сектор потерян. Высадится повторно? text.sector.gameover = Этот сектор потерян. Высадится повторно?
text.sector.retry = Повторить попытку text.sector.retry = Повторить попытку
text.highscore = [YELLOW]Новый рекорд! text.highscore = [YELLOW]Новый рекорд!
text.wave.lasted = Вы продержались до волны [accent]{0}[]. 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 = Вы действительно хотите удалить карту "[accent]{0}[]"? text.map.delete = Вы действительно хотите удалить карту "[accent]{0}[]"?
@@ -30,7 +31,7 @@ text.coreattack = < Ядро находится под атакой! >
text.unlocks = Разблокированные text.unlocks = Разблокированные
text.savegame = Сохранить игру text.savegame = Сохранить игру
text.loadgame = Загрузить игру text.loadgame = Загрузить игру
text.joingame = Присоединиться text.joingame = Присоеди\nниться
text.addplayers = Доб/удалить игроков text.addplayers = Доб/удалить игроков
text.customgame = Пользовательская игра text.customgame = Пользовательская игра
text.sectors = Секторы text.sectors = Секторы
@@ -238,7 +239,7 @@ text.editor.exportimage = Экспортировать изображение л
text.editor.exportimage.description = Экспортировать файл с изображением карты text.editor.exportimage.description = Экспортировать файл с изображением карты
text.editor.loadimage = Загрузить \nизображение text.editor.loadimage = Загрузить \nизображение
text.editor.saveimage = Сохранить \nизображение text.editor.saveimage = Сохранить \nизображение
text.editor.unsaved = [scarlet]У вас есть несохранённые изменения![] \nВы уверены, что хотите выйти? text.editor.unsaved = [scarlet]У вас есть несохранённые изменения![]\nВы уверены, что хотите выйти?
text.editor.resizemap = Изменить размер карты text.editor.resizemap = Изменить размер карты
text.editor.mapname = Название карты: text.editor.mapname = Название карты:
text.editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту. text.editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту.
@@ -258,12 +259,12 @@ text.settings = Настройки
text.tutorial = Обучение text.tutorial = Обучение
text.editor = Редактор text.editor = Редактор
text.mapeditor = Редактор карт text.mapeditor = Редактор карт
text.donate = Донат text.donate = Пожертво\nвать
text.connectfail = [crimson]Не удалось подключиться к серверу: [accent] {0} text.connectfail = [crimson]Не удалось подключиться к серверу: [accent] {0}
text.error.unreachable = Сервер недоступен. text.error.unreachable = Сервер недоступен.
text.error.invalidaddress = Некорректный адрес. text.error.invalidaddress = Некорректный адрес.
text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный!
text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у вас и у создателя сервера установлена последняя версия Mindustry\\! text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry!
text.error.alreadyconnected = Вы уже подключены. text.error.alreadyconnected = Вы уже подключены.
text.error.mapnotfound = Map file not found! text.error.mapnotfound = Map file not found!
text.error.any = Неизвестная сетевая ошибка. text.error.any = Неизвестная сетевая ошибка.
@@ -319,8 +320,8 @@ text.blocks.coolant = Охлаждающая жидкость
text.blocks.coolantuse = Охлажд. жидкости используется text.blocks.coolantuse = Охлажд. жидкости используется
text.blocks.inputliquidfuel = Жидкое топливо text.blocks.inputliquidfuel = Жидкое топливо
text.blocks.liquidfueluse = Жидкого топлива используется text.blocks.liquidfueluse = Жидкого топлива используется
text.blocks.boostitem = Boost Item text.blocks.boostitem = Ускоряющий предмет
text.blocks.boostliquid = Boost Liquid text.blocks.boostliquid = Ускоряющая жидкость
text.blocks.health = Здоровье text.blocks.health = Здоровье
text.blocks.inaccuracy = Разброс text.blocks.inaccuracy = Разброс
text.blocks.shots = Выстрелы text.blocks.shots = Выстрелы
@@ -345,7 +346,7 @@ text.category.liquids = Жидкости
text.category.items = Предметы text.category.items = Предметы
text.category.crafting = Создание text.category.crafting = Создание
text.category.shooting = рельба text.category.shooting = рельба
text.category.optional = Optional Enhancements text.category.optional = Дополнительные улучшения
setting.autotarget.name = Авто-цель setting.autotarget.name = Авто-цель
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
setting.fpscap.none = Неограниченный setting.fpscap.none = Неограниченный
@@ -364,13 +365,13 @@ setting.seconds = {0} Секунд
setting.fullscreen.name = Полноэкранный режим setting.fullscreen.name = Полноэкранный режим
setting.fps.name = Показывать FPS setting.fps.name = Показывать FPS
setting.vsync.name = Верт. синхронизация setting.vsync.name = Верт. синхронизация
setting.lasers.name = Показывать энергетические лазеры setting.lasers.name = Показывать энергию лазеров
setting.minimap.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 = Заглушить звук
setting.crashreport.name = Отправлять анонимные отчёты о сбоях setting.crashreport.name = Отправлять анонимные отчёты о вылетах
text.keybind.title = Настройка управления text.keybind.title = Настройка управления
category.general.name = Основное category.general.name = Основное
category.view.name = Просмотр category.view.name = Просмотр
@@ -380,14 +381,14 @@ command.retreat = Отступить
command.patrol = Патрулирование command.patrol = Патрулирование
keybind.press = Нажмите клавишу... keybind.press = Нажмите клавишу...
keybind.press.axis = Нажмите клавишу... keybind.press.axis = Нажмите клавишу...
keybind.move_x.name = Движение по x keybind.move_x.name = Движение по оси x
keybind.move_y.name = Движение по y keybind.move_y.name = Движение по оси y
keybind.select.name = Выбор/Выстрел keybind.select.name = Выбор/Выстрел
keybind.break.name = Разрушение keybind.break.name = Разрушение
keybind.deselect.name = Отмена keybind.deselect.name = Отмена
keybind.shoot.name = Выстрел keybind.shoot.name = Выстрел
keybind.zoom_hold.name = Удержание зума 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 = Мчаться
@@ -403,10 +404,10 @@ keybind.drop_unit.name = Сбросить юнита
keybind.zoom_minimap.name = Увеличить миникарту. keybind.zoom_minimap.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 = Свободная\nстройка mode.freebuild.name = Cвободная\nстрой
mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. mode.freebuild.description = ограниченные ресурсы и нет таймера для волн.
mode.pvp.name = Противо-\nстояние mode.pvp.name = Противо-\nстояние
mode.pvp.description = боритесь против других игроков. mode.pvp.description = боритесь против других игроков.
@@ -460,7 +461,7 @@ mech.delta-mech.description = Быстрый, легкобронированны
mech.tau-mech.name = Тау mech.tau-mech.name = Тау
mech.tau-mech.weapon = Восстановительный лазер mech.tau-mech.weapon = Восстановительный лазер
mech.tau-mech.ability = Регенирирующая вспышка mech.tau-mech.ability = Регенирирующая вспышка
mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может потушить пожары и исцелить союзников радиусом с его способностью восстанавления. mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления.
mech.omega-mech.name = Омега mech.omega-mech.name = Омега
mech.omega-mech.weapon = Ракетомётный пулемётконфигурация mech.omega-mech.weapon = Ракетомётный пулемётконфигурация
mech.omega-mech.ability = Защитная mech.omega-mech.ability = Защитная
@@ -493,9 +494,10 @@ text.mech.ability = [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.constructing = {0}\n[LIGHT_GRAY](В процессе) block.constructing = {0}[LIGHT_GRAY](В процессе)
block.spawn.name = Спаун врагов block.spawn.name = Точка появления врагов
block.core.name = Ядро block.core.name = Ядро
block.space.name = Пустота
block.metalfloor.name = Маличeский пoл block.metalfloor.name = Маличeский пoл
block.deepwater.name = Глубоководье block.deepwater.name = Глубоководье
block.water.name = Вода block.water.name = Вода
@@ -590,7 +592,7 @@ block.oil-extractor.name = Нефтяной экстрактор
block.spirit-factory.name = Завод дронов "Призрак" block.spirit-factory.name = Завод дронов "Призрак"
block.phantom-factory.name = Завод дронов "Фантом" block.phantom-factory.name = Завод дронов "Фантом"
block.wraith-factory.name = Завод призрачных истребителей block.wraith-factory.name = Завод призрачных истребителей
block.ghoul-factory.name = Завод гулевых бомбардировщиков block.ghoul-factory.name = Завод бомбардировщиков "Гуль"
block.dagger-factory.name = Завод мехов "Разведчик" block.dagger-factory.name = Завод мехов "Разведчик"
block.titan-factory.name = Завод мехов "Титан" block.titan-factory.name = Завод мехов "Титан"
block.fortress-factory.name = Завод мехов "Крепость" block.fortress-factory.name = Завод мехов "Крепость"
@@ -775,6 +777,6 @@ block.itemvoid.description = Уничтожает любые предметы,
block.powerinfinite.description = Бесконечность — не предел. Бесконечно выводит энергию. Доступен только в песочнице. block.powerinfinite.description = Бесконечность — не предел. Бесконечно выводит энергию. Доступен только в песочнице.
block.powervoid.description = Энергия просто уходит в пустоту. Присутствует только в песочнице. block.powervoid.description = Энергия просто уходит в пустоту. Присутствует только в песочнице.
liquid.water.description = Намного лучше чем [BLUE]монооксид дигидрогена[].\n\n Для получения воды используйте помпу(насос) на источнике(блоке) или экстрактор воды.\n\n Эту жидкость можно подвести к бурам для ускорения скорости добычи или к турелям для ускорения стрельбы. liquid.water.description = Намного лучше чем [BLUE]монооксид дигидрогена[].\n\n Для получения воды используйте помпу(насос) на источнике(блоке) или экстрактор воды.\n\n Эту жидкость можно подвести к бурам для ускорения скорости добычи или к турелям для ускорения стрельбы.
liquid.lava.description = [accent]Горячо...\nВещество расплавленное из горно-каменных пород.\nСлужит как топливо для термального генератора. liquid.lava.description = [accent]Горячо...\nВещество расплавленное из горно-каменных пород.
liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления.\nСлужит для пластиниевого компрессора и т.д.. liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления.
liquid.cryofluid.description = Жидкость с температурой ниже чем -273 градусов по цельсию. Может быть использована для ускорения стрельбы турелей или для охлаждения чего-то. liquid.cryofluid.description = Жидкость с температурой ниже чем -273 градусов по цельсию. Может быть использована для ускорения стрельбы турелей или для охлаждения чего-то.

View File

@@ -1,10 +1,11 @@
text.credits.text = Створив [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\nПерекладачі:\n[YELLOW]Prosta4ok_ua[]\n[GREEN]xga\n\n[] Є питання по грі або проблеми с перекладом? Іди в офіційний сервер discord Mindustry в канал #український. text.credits.text = Створив [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\nЄ питання по грі або проблеми с перекладом? Іди в офіційний сервер discord Mindustry в канал #український.
text.credits = Автори text.credits = Автори
text.contributors = Перекладачі та Контриб'ютори
text.discord = Приєднуйтесь до нашого Discord! text.discord = Приєднуйтесь до нашого Discord!
text.link.discord.description = Офіційний сервер discord Mindustry text.link.discord.description = Офіційний discord-сервер Mindustry
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 = Itch.io сторінка з веб-версією та завантаженням для ПК text.link.itch.io.description = Itch.io сторінка з веб-версією та завантаженням для ПК
text.link.google-play.description = Скачати з Google Play для Android text.link.google-play.description = Скачати з Google Play для Android
text.link.wiki.description = Офіційна Mindustry вікі (англ.) text.link.wiki.description = Офіційна Mindustry вікі (англ.)
@@ -14,15 +15,15 @@ text.gameover.pvp = [accent] {0}[] команда перемогла!
text.sector.gameover = Цей сектор було втрачено. Повторно висадитися? text.sector.gameover = Цей сектор було втрачено. Повторно висадитися?
text.sector.retry = Повторити спробу text.sector.retry = Повторити спробу
text.highscore = [YELLOW]Новий рекорд! text.highscore = [YELLOW]Новий рекорд!
text.wave.lasted = Ви проіснували до [accent]{0}[]-ої хвилі. 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 = Ви впевнені, що хочете видалити карту "[accent]{0}[]"? text.map.delete = Ви впевнені, що хочете видалити карту "[accent]{0}[]"?
text.level.select = Вибір мапи text.level.select = Вибір мапи
text.level.mode = Ігровий режим: text.level.mode = Режим гри:
text.construction.desktop = Щоб скасувати вибір блоку або припинити будівництво, [accent] скористайтеся пробілом[]. text.construction.desktop = Щоб скасувати вибір блоку або припинити будівництво, [accent] скористайтеся пробілом[].
text.construction.title = Інструкція з будівництва блоків text.construction.title = Інструкція з будівництва блоків
text.construction = Ви тільки що перешли в [accent]режим будівництва блоків[].\n\nЩоб розпочати розміщення, просто торкніться відповідного розташування поруч із вашим кораблем.\nПісля вибору деяких блоків натисніть прапорець, щоб підтвердити, і ваш корабель почне будувати їх.\n\n- [accent]Вилучіть блоки[] з вашого вибору, торкнувшись їх.\n- [accent]Перемістіть виділення[] утримуючи та перетягнувши будь-який блок у виділенні.\n- [accent]Розташуйте блоки у лінію[], торкнувшись і утримуючи порожнє місце, а потім перетягуючи в потрібному напрямку.\n- [accent]Скасуйте конструкцію або виділення[] натиснувши X внизу ліворуч. text.construction = Ви тільки що перейшли в режим будівництва[accent] блоків[].\n\nЩоб розпочати розміщення, просто торкніться підходящого місця поруч із вашим кораблем.\nПісля вибору деяких блоків натисніть прапорець, щоб підтвердити, і ваш корабель почне будувати їх.\n\n- [accent]Вилучіть блоки[] з вашого вибору, торкнувшись їх.\n- [accent]Перемістіть виділення[] утримуючи та перетягнувши будь-який блок у виділенні.\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 = Не показувати знову до наступного сеансу
@@ -30,11 +31,11 @@ text.coreattack = < Ядро під атакою! >
text.unlocks = Розблоковане text.unlocks = Розблоковане
text.savegame = Зберегти гру text.savegame = Зберегти гру
text.loadgame = Завантажити гру text.loadgame = Завантажити гру
text.joingame = Приєднатися\nдо гри text.joingame = Приєднатися
text.addplayers = Дод/Видалити гравців text.addplayers = Дод/Видалити гравців
text.customgame = Індивідуальна гра text.customgame = Користувальницька гра
text.sectors = Сектори text.sectors = Сектори
text.sector = Сектор: [LIGHT_GRAY]{0} 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.abandon = Відступити text.sector.abandon = Відступити
@@ -45,27 +46,27 @@ text.sector.unexplored = [accent][[Недосліджений]
text.missions = Місії:[LIGHT_GRAY] {0} text.missions = Місії:[LIGHT_GRAY] {0}
text.mission = Місія:[LIGHT_GRAY] {0} text.mission = Місія:[LIGHT_GRAY] {0}
text.mission.main = Головна місія:[LIGHT_GRAY] {0} text.mission.main = Головна місія:[LIGHT_GRAY] {0}
text.mission.info = Інформація про місії text.mission.info = Інформація про місію
text.mission.complete = Місія завершена! text.mission.complete = Місія виконана!
text.mission.complete.body = Сектор {0},{1} був завойований. text.mission.complete.body = Сектор {0},{1} був завойований.
text.mission.wave = Пережити наступну кількість хвиль:[accent]{0}/{1}[]\nХвиля в {2} text.mission.wave = Пережити [accent]{0}/{1}[]\nХвиля через {2}
text.mission.wave.enemies = Пережити [accent] {0}/{1} []хвиль\n{2} Ворог. text.mission.wave.enemies = Пережити [accent] {0}/{1} []хвиль\n{2} ворог.
text.mission.wave.enemy = Пережити[accent] {0}/{1} []хвиль\n{2} Ворог text.mission.wave.enemy = Пережити[accent] {0}/{1} []хвил.\n{2} Ворог
text.mission.wave.menu = Пережити[accent] {0} []хвиль text.mission.wave.menu = Пережити[accent] {0} [] хвиль
text.mission.battle = Знищити базу супротивника. text.mission.battle = Знищте ядро супротивника.
text.mission.resource.menu = Добути {0} x{1} text.mission.resource.menu = Добути {0} x{1}
text.mission.resource = Отримано {0} x{1} text.mission.resource = Добути {0}:\n[accent]{1}/{2}[]
text.mission.block = Створити {0} text.mission.block = Створити {0}
text.mission.unit = Створити {0} бой.од. text.mission.unit = Створити {0} бой.од.
text.mission.command = Надіслати команду {0} до боїв. одиниць text.mission.command = Надіслати команду {0} боїв. одиницям
text.mission.linknode = З'єднати силові вузли text.mission.linknode = З'єднати силові вузли
text.mission.display = [accent]Місія:\n[LIGHT_GRAY]{0} text.mission.display = [accent]Місія:\n[LIGHT_GRAY]{0}
text.mission.mech = Переключитися на мех[accent] {0}[] text.mission.mech = Переключитися на мех[accent] {0}[]
text.mission.create = Створити[accent] {0} [] text.mission.create = Створити[accent] {0}[]
text.none = <нічого> text.none = <нічого>
text.close = Закрити text.close = Закрити
text.quit = Вийти text.quit = Вийти
text.maps = Карти text.maps = Мапи
text.continue = Продовжити text.continue = Продовжити
text.nextmission = Наступна місія text.nextmission = Наступна місія
text.maps.none = [LIGHT_GRAY]Карт не знайдено! text.maps.none = [LIGHT_GRAY]Карт не знайдено!
@@ -74,27 +75,27 @@ text.name = Нік:
text.filename = Ім'я файлу: text.filename = Ім'я файлу:
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.closing = [accent]Закриття серверу... text.server.closing = [accent]Закриття серверу...
text.server.kicked.kick = Ви були вигнані(кікнуті) з сервера! text.server.kicked.kick = Ви були вигнані(кікнуті) з сервера!
text.server.kicked.serverClose = Сервер закритий. text.server.kicked.serverClose = Сервер закрито.
text.server.kicked.sectorComplete = Сектор завойован. text.server.kicked.sectorComplete = Сектор завойовано.
text.server.kicked.sectorComplete.text = Ваша місія завершена. \nСервер продовжить роботу в наступному секторі. text.server.kicked.sectorComplete.text = Ваша місія завершена. \nСервер продовжить роботу і висадить Вас в наступному секторі.
text.server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! text.server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
text.server.kicked.serverOutdated = Застарілий сервер! Попросіть хост оновити сервер/гру! text.server.kicked.serverOutdated = Застарілий сервер! Попросіть адміністратора серверу оновити сервер/гру!
text.server.kicked.banned = Ви були заблоковані на цьому сервері. text.server.kicked.banned = Ви були заблоковані на цьому сервері.
text.server.kicked.recentKick = Нещодавно вас вигнали(кікнули). \nПочекайте, перш ніж підключитися знову. text.server.kicked.recentKick = Нещодавно Вас вигнали(кікнули). \nПочекайте трохи перед наступним підключенням.
text.server.kicked.nameInUse = На цьому сервері є хтось \nз таким ніком. text.server.kicked.nameInUse = На цьому сервері є хтось \nз таким ніком.
text.server.kicked.nameEmpty = Ваш нікнейм має містити принаймні один символ або цифру. text.server.kicked.nameEmpty = Ваш нікнейм має містити принаймні один символ або цифру.
text.server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не допускається. text.server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не допускається.
text.server.kicked.customClient = Цей сервер не підтримує користувальницькі збірки. Завантажте офіційну версію. text.server.kicked.customClient = Цей сервер не підтримує користувальницькі збірки. Завантажте офіційну версію.
text.host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [LIGHT_GRAY] WiFi або локальній мережі [] повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то [accent] переадресація портів [] обов'язкова.\n\n[LIGHT_GRAY] Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. text.host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [LIGHT_GRAY] WiFi або локальній мережі[] повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то [accent] переадресація порту [] обов'язкова.\n\n[LIGHT_GRAY] Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера.
text.join.info = Тут ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[LIGHT_GRAY] Примітка. Там немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити хазяїна серверу дати свій ip. text.join.info = Тут ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[LIGHT_GRAY] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача серверу дати свій ip.
text.hostserver = Запустити сервер text.hostserver = Запустити сервер
text.hostserver.mobile = Запустити\nСервер text.hostserver.mobile = Запустити\nсерверу
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 = Оновлення серверу
@@ -113,9 +114,9 @@ text.trace.totalblocksplaced = Всього встановлено блоків:
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 = Адміністратори
text.server.admins.none = Адміністраторів нема! text.server.admins.none = Адміністраторів нема
text.server.add = Додати сервер text.server.add = Додати сервер
text.server.delete = Ви впевнені, що хочете видалити цей сервер? text.server.delete = Ви впевнені, що хочете видалити цей сервер?
text.server.hostname = Хост: {0} text.server.hostname = Хост: {0}
@@ -123,10 +124,10 @@ 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.confirmkick = Ви впевнені, що хочете викинути(кікнути) цього гравця? text.confirmkick = Ви впевнені, що хочете викинути(кікнути) цього гравця?
text.confirmunban = Ви впевнені, що хочете розблокувати) цього гравця? text.confirmunban = Ви впевнені, що хочете розблокувати цього гравця?
text.confirmadmin = Ви впевнені, що хочете зробити цього гравця адміністратором? text.confirmadmin = Ви впевнені, що хочете зробити цього гравця адміністратором?
text.confirmunadmin = Ви впевнені, що хочете видалити статус адміністратора з цього гравця? text.confirmunadmin = Ви впевнені, що хочете видалити статус адміністратора з цього гравця?
text.joingame.title = Приєднатися до гри text.joingame.title = Приєднатися до гри
@@ -136,10 +137,10 @@ text.disconnect.data = Не вдалося завантажити світові
text.connecting = [accent]Підключення... text.connecting = [accent]Підключення...
text.connecting.data = [accent]Завантаження даних світу... text.connecting.data = [accent]Завантаження даних світу...
text.server.port = Порт: text.server.port = Порт:
text.server.addressinuse = Адреса вже використовується! text.server.addressinuse = Ця адреса вже використовується!
text.server.invalidport = Недійсний номер порту! text.server.invalidport = Недійсний номер порту!
text.server.error = [crimson]Помилка хостингу сервера: [accent]{0} text.server.error = [crimson]Помилка запуску сервера: [accent]{0}
text.save.old = Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [LIGHT_GRAY]Зберігати зворотну сумісність буде реалізовано у повній версії 4.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 = Перезаписати
@@ -152,24 +153,24 @@ text.save.export = Экспортувати збереження
text.save.import.invalid = [accent]Це збереження недійсне! text.save.import.invalid = [accent]Це збереження недійсне!
text.save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0} text.save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0}
text.save.export.fail = [crimson]Не вдалося экспортувати збереження: [accent]{0} text.save.export.fail = [crimson]Не вдалося экспортувати збереження: [accent]{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 = [accent]Збережений файл пошкоджений або недійсний! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не []є помилкою. text.save.corrupted = [accent]Збережений файл пошкоджено або э недійсним! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не[] є помилкою.
text.sector.corrupted = [accent]Знайдено файл збереження для цього сектора, але завантаження не вдалося. \n Буде створено новий. text.sector.corrupted = [accent]Файл збереження для цього сектора знайдено, але завантаження не вдалося. \n Буде створено новий файл.
text.empty = <порожній> text.empty = <порожній>
text.on = Вкл text.on = Включено
text.off = Викл text.off = Вимкнено
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 = Останнє збереження
text.save.playtime = Час гри: {0} text.save.playtime = Час гри: {0}
text.confirm = Підтвердити text.confirm = Підтвердження
text.delete = Видалити text.delete = Видалити
text.ok = ОК text.ok = ОК
text.open = Відкрити text.open = Відкрити
@@ -177,11 +178,11 @@ text.cancel = Скасувати
text.openlink = Відкрити посилання text.openlink = Відкрити посилання
text.copylink = Скопіювати посилання text.copylink = Скопіювати посилання
text.back = Назад text.back = Назад
text.quit.confirm = Ти впевнений що хочеш вийти? text.quit.confirm = Ви впевнені що хочете вийти?
text.changelog.title = Журнал змін text.changelog.title = Журнал змін
text.changelog.loading = Отримання журналу змін... text.changelog.loading = Отримання журналу змін...
text.changelog.error.android = [accent]Зверніть увагу, що іноді журнал змін не працює на ОС Android 4.4 або на нижчій версії!\nЦе пов'язано з внутрішньою помилкою Android. text.changelog.error.android = [accent]Зверніть увагу, що іноді журнал змін не працює на ОС Android 4.4 або на нижчій версії!\nЦе пов'язано з внутрішньою помилкою Android.
text.changelog.error.ios = [accent]Журнал змін наразі не підтримується в iOS. text.changelog.error.ios = [accent]В настоящее время журнал изменений не поддерживается iOS.
text.changelog.error = [scarlet]Помилка отримання журналу змін!\nПеревірте підключення до Інтернету. text.changelog.error = [scarlet]Помилка отримання журналу змін!\nПеревірте підключення до Інтернету.
text.changelog.current = [yellow][[Поточна версія] text.changelog.current = [yellow][[Поточна версія]
text.changelog.latest = [accent][[Остання версія] text.changelog.latest = [accent][[Остання версія]
@@ -190,7 +191,7 @@ text.saving = [accent]Збереження...
text.wave = [accent]Хвиля {0} text.wave = [accent]Хвиля {0}
text.wave.waiting = Хвиля через {0} text.wave.waiting = Хвиля через {0}
text.waiting = Очікування... text.waiting = Очікування...
text.waiting.players = Очікування гравців ... text.waiting.players = Очікування гравців
text.wave.enemies = [LIGHT_GRAY]{0} ворог. залишилося text.wave.enemies = [LIGHT_GRAY]{0} ворог. залишилося
text.wave.enemy = [LIGHT_GRAY]{0} ворог залишився text.wave.enemy = [LIGHT_GRAY]{0} ворог залишився
text.loadimage = Завантажити зображення text.loadimage = Завантажити зображення
@@ -199,91 +200,90 @@ text.unknown = Невідомо
text.custom = Користувальницька text.custom = Користувальницька
text.builtin = Bбудована text.builtin = Bбудована
text.map.delete.confirm = Ви впевнені, що хочете видалити цю карту? Цю дію не можна скасувати! text.map.delete.confirm = Ви впевнені, що хочете видалити цю карту? Цю дію не можна скасувати!
text.map.random = [accent]Випадкова карта text.map.random = [accent]Випадкова мапа
text.map.nospawn = Ця карта не має жодного ядра для спавну гравця! Додайте[ROYAL] сине[] ядро в цю карту в редакторі. text.map.nospawn = Ця мапа не має жодного ядра для спавну гравця! Додайте[ROYAL] сине[] ядро в цю мапу редакторі.
text.map.nospawn.pvp = У цій карти немає ворожих ядер, в яких гравець може з'явитися! Додайте[SCARLET] червоні[] ядра до цієї карті в редакторі. text.map.nospawn.pvp = У цій карти немає ворожих ядер, в яких гравець може з'явитися! Додайте[SCARLET] червоні[] ядра до цієї карті в редакторі.
text.map.invalid = Помилка завантаження карти: пошкоджений або невірний файл карти. text.map.invalid = Помилка завантаження карти: пошкоджений або невірний файл карти.
text.editor.brush = Пензлик text.editor.brush = Пензлик
text.editor.slope = \\ text.editor.slope =
text.editor.openin = Відкрити в редакторі text.editor.openin = Відкрити в редакторі
text.editor.oregen = Генерація руд text.editor.oregen = Генерація руд
text.editor.oregen.info = Генерація руд: text.editor.oregen.info = Генерація руд:
text.editor.mapinfo = Інформація про карту text.editor.mapinfo = Інформація про мапу
text.editor.author = Автор: text.editor.author = Автор:
text.editor.description = Опис: text.editor.description = Опис:
text.editor.name = Назва: text.editor.name = Назва:
text.editor.teams = Команди text.editor.teams = Команди
text.editor.elevation = Высота височини text.editor.elevation = Висота
text.editor.errorimageload = Помилка завантаження файлу:\n[accent]{0} text.editor.errorimageload = Помилка завантаження зображення:[accent] {0}
text.editor.errorimagesave = Помилка збереження файлу:\n[accent]{0} text.editor.errorimagesave = Помилка збереження зображення:\n[accent]{0}
text.editor.generate = Генерувати text.editor.generate = Створити
text.editor.resize = Змінити розмір text.editor.resize = Змінити \nрозмір
text.editor.loadmap = Завантажити карту text.editor.loadmap = Завантажити мапу
text.editor.savemap = Зберегти карту text.editor.savemap = Зберегти карту
text.editor.saved = Збережено! text.editor.saved = Збережено!
text.editor.save.noname = Ваша карта не має назви! Встановіть його в меню "інформація про карту". text.editor.save.noname = Ваша карта не має назви! Встановіть його в меню «Інформація про карту».
text.editor.save.overwrite = Ваша карта перезаписує вбудовану карту! Виберіть інше ім'я в меню "інформація про карту". text.editor.save.overwrite = Ваша карта перезаписує вбудовану карту! Виберіть інше ім'я в меню «Інформація про карту».
text.editor.import.exists = [scarlet]Неможливо імпортувати: [] вбудована карта з назвою "{0}" вже існує! text.editor.import.exists = [scarlet]Неможливо імпортувати: [] вбудована карта з назвою "{0}" вже існує!
text.editor.import = Імпорт... text.editor.import = Імпорт...
text.editor.importmap = Імпортувати карту text.editor.importmap = Імпортувати карту
text.editor.importmap.description = Імпортуйте вже існуючої карти text.editor.importmap.description = Імпортувати вже існуючу карту
text.editor.importfile = Імпортувати файл text.editor.importfile = Імпортувати файл
text.editor.importfile.description = Імпортуйте зовнішній файл карти text.editor.importfile.description = Імпортувати зовнішній файл карти
text.editor.importimage = Імпорт зображення місцевості text.editor.importimage = Імпорт зовнішнього файла зображення карти
text.editor.importimage.description = Імпорт зовнішнього файла зображення карти text.editor.importimage.description = Імпорт зображення місцевості
text.editor.export = Експорт... text.editor.export = Експорт...
text.editor.exportfile = Експорт файлу text.editor.exportfile = Експорт файлу
text.editor.exportfile.description = Експортувати файл карти text.editor.exportfile.description = Експортувати файл карти
text.editor.exportimage = Експорт зображення місцевості text.editor.exportimage = Експорт зображення місцевості
text.editor.exportimage.description = Експорт файла з зображенням карти text.editor.exportimage.description = Експорт файла з зображенням карти
text.editor.loadimage = Імпорт місцевості text.editor.loadimage = Завантажити\nзображення
text.editor.saveimage = Екпорт місцевості text.editor.saveimage = Зберегти\nзображення
text.editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? text.editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти?
text.editor.resizemap = Змінити розмір карти text.editor.resizemap = Змінити розмір карти
text.editor.mapname = Назва карти: text.editor.mapname = Название карты:
text.editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу карту. text.editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу карту.
text.editor.overwrite.confirm = [scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її? text.editor.overwrite.confirm = [scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її?
text.editor.selectmap = Виберіть карту для завантаження: text.editor.selectmap = Виберіть мапу для завантаження:
text.width = Ширина: text.width = Ширина:
text.height = Висота: text.height = Висота:
text.menu = Меню text.menu = Меню
text.play = Грати text.play = Грати
text.load = Завантаження text.load = Завантажити
text.save = Зберегти text.save = Зберегти
text.fps = FPS: {0} text.fps = FPS: {0}
text.tps = TPS: {0} text.tps = TPS: {0}
text.ping = Пінг: {0} мс text.ping = Пінг: {0} мс
text.language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. text.language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.\nPlease restart your game for the language settings to take effect.
text.settings = Налаштування text.settings = Налаштування
text.tutorial = Навчання text.tutorial = Навчання
text.editor = Редактор text.editor = Редактор
text.mapeditor = Редактор карт text.mapeditor = Редактор мап
text.donate = Пожертвувати text.donate = Пожертву\nвання
text.connectfail = [crimson]Не вдалося підключитися до сервера: [accent]{0} text.connectfail = [crimson]Не вдалося підключитися до сервера: [accent]{0}
text.error.unreachable = Server unreachable. text.error.unreachable = Сервер не доступний.
text.error.invalidaddress = Invalid address. text.error.invalidaddress = Некоректна адреса.
text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! text.error.timedout = Час очікувування вийшов.\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту!
text.error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! text.error.mismatch = Ошибка пакету:\nможливе невідповідність версії клієнта / сервера.\nПереконайтеся, що у Вас та у володара сервера встановлена остання версія Mindustry!
text.error.alreadyconnected = Already connected. text.error.alreadyconnected = Ви вже підключилися.
text.error.mapnotfound = Map file not found! text.error.any = Невідома мережева помилка
text.error.any = Unkown network error.
text.settings.language = Мова text.settings.language = Мова
text.settings.reset = Скинути до стандартних text.settings.reset = Скинути за замовчуванням
text.settings.rebind = Змінити 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.settings.cleardata = Очистити ігрові дані... text.settings.cleardata = Очистити дані...
text.settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЩо робиться, не може бути скасовано! text.settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЦя дія не може бути скасовано!
text.settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, карти, розблокування та призначенні клавіші.\nПісля того, як ви натиснете "ОК", гра видалить усі дані та автоматично вийде. text.settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, карти, розблокуване та призначенні клавіші.\nПісля того, як ви натиснете ОК, гра видалить усі дані та автоматично вийде.
text.settings.clearsectors = Очистити сектори text.settings.clearsectors = Очистити сектори
text.settings.clearunlocks = Очистити розблоковане text.settings.clearunlocks = Очистити розблоковане
text.settings.clearall = Очистити все text.settings.clearall = Очистити все
text.paused = Пауза text.paused = Пауза
text.yes = Так text.yes = Так
text.no = Ні text.no = Ні
text.info.title = [accent]Інформація text.info.title = Інформація
text.error.title = [crimson]Виникла помилка text.error.title = [crimson]Виникла помилка
text.error.crashtitle = Виникла помилка text.error.crashtitle = Виникла помилка
text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.unknown = [LIGHT_GRAY]???
@@ -291,14 +291,14 @@ text.blocks.blockinfo = Інформація про блок
text.blocks.powercapacity = Місткість енергії text.blocks.powercapacity = Місткість енергії
text.blocks.powershot = Енергія/постріл text.blocks.powershot = Енергія/постріл
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.powerdamage = Енергія/Урон text.blocks.powerdamage = Енергія/урон
text.blocks.inputitemcapacity = Ємність вхідних елементів text.blocks.inputitemcapacity = Ємність вхідних елементів
text.blocks.outputitemcapacity = Ємність вихідних елементів text.blocks.outputitemcapacity = Ємність вихідних елементів
text.blocks.itemcapacity = Місткість предметів text.blocks.itemcapacity = Місткість предметів
@@ -314,102 +314,102 @@ text.blocks.drilltier = Видобуває
text.blocks.drillspeed = Базова швидкість свердління text.blocks.drillspeed = Базова швидкість свердління
text.blocks.liquidoutput = Вихідна рідина text.blocks.liquidoutput = Вихідна рідина
text.blocks.liquidoutputspeed = Швидкість вихідної рідини text.blocks.liquidoutputspeed = Швидкість вихідної рідини
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.boostitem = Boost Item text.blocks.boostitem = Прискорюючий предмет
text.blocks.boostliquid = Boost Liquid text.blocks.boostliquid = Прискорююча рідина
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.items = предм. text.unit.items = предм.
text.category.general = Загальне text.category.general = Загальні
text.category.power = Енергетичне 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 = Стрільба
text.category.optional = Optional Enhancements text.category.optional = Додаткові поліпшення
setting.autotarget.name = Авто-ціль setting.autotarget.name = Авто-ціль
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
setting.fpscap.none = Необмежений setting.fpscap.none = Необмежений
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.difficulty.training = навчання setting.difficulty.training = навчання
setting.difficulty.easy = легкий setting.difficulty.easy = легка
setting.difficulty.normal = нормальний setting.difficulty.normal = нормальна
setting.difficulty.hard = важкий setting.difficulty.hard = важка
setting.difficulty.insane = божевільний setting.difficulty.insane = божевільна
setting.difficulty.name = Рівень складності: setting.difficulty.name = Складність:
setting.screenshake.name = Тряска екрану setting.screenshake.name = Тряска екрану
setting.effects.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.fps.name = Показати FPS setting.fps.name = Показувати FPS
setting.vsync.name = Вертикальна синхронізація setting.vsync.name = Вертикальна синхронізація
setting.lasers.name = Показати енергетичні лазери setting.lasers.name = Показувати енергію лазерів
setting.minimap.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 = Заглушити звук
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Надіслати анонімні звіти про аварійне завершення гри
text.keybind.title = Налаштування управління text.keybind.title = Налаштування управління
category.general.name = Основне category.general.name = Основне
category.view.name = Перегляд category.view.name = Перегляд
category.multiplayer.name = Мультиплеєр category.multiplayer.name = Мультиплеєр
command.attack = Атакувати command.attack = Атакувати
command.retreat = Відступити command.retreat = Відступити
command.patrol = Патрулювання command.patrol = Патрулювати
keybind.press = Натисніть клавішу... keybind.press = Натисніть клавішу...
keybind.press.axis = Натисніть клавішу... keybind.press.axis = Натисніть клавішу...
keybind.move_x.name = Переміщення по осі x keybind.move_x.name = Рух по осі x
keybind.move_y.name = Переміщення по осі y keybind.move_y.name = Рух по осі x
keybind.select.name = Виберіть keybind.select.name = ВибратиПостріл
keybind.break.name = Зламати keybind.break.name = Руйнування
keybind.deselect.name = Скасувати keybind.deselect.name = Скасувати
keybind.shoot.name = Постріл keybind.shoot.name = Постріл
keybind.zoom_hold.name = Утримувати масштаб 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 = Консоль keybind.console.name = Консоль
keybind.rotate.name = Повертати keybind.rotate.name = Обертати
keybind.toggle_menus.name = Меню перемикання keybind.toggle_menus.name = Меню перемикання
keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_prev.name = Попередня історія чату
keybind.chat_history_next.name = Наступна історія чату keybind.chat_history_next.name = Наступна історія чату
keybind.chat_scroll.name = Прокрутка чату keybind.chat_scroll.name = Прокрутка чату
keybind.drop_unit.name = Скинути юніта keybind.drop_unit.name = Скинути бой. од.
keybind.zoom_minimap.name = Збільшити мінікарту keybind.zoom_minimap.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 = Вільне\nбудівництво
mode.freebuild.description = обмежені ресурси і немає таймера для хвиль. mode.freebuild.description = В режимі "Пісочниця" треба самим добувати ресурси та хвилі йдуть за вашим бажанням.
mode.pvp.name = PvP mode.pvp.name = PVP
mode.pvp.description = борітесь проти інших гравців тут. mode.pvp.description = боріться проти інших гравців.
content.item.name = Предмети content.item.name = Предмети
content.liquid.name = Рідини content.liquid.name = Рідини
content.unit.name = Бойові одиниці content.unit.name = Бойові одиниці
@@ -420,29 +420,29 @@ item.stone.description = Загальна сировина. Використов
item.copper.name = Мідь item.copper.name = Мідь
item.copper.description = Корисний структурний матеріал. Широко використовується у всіх типах блоків. item.copper.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.dense-alloy.name = Щільний сплав item.dense-alloy.name = Щільний сплав
item.dense-alloy.description = Жорсткий сплав з свинцем та міддю. Використовується в передових транспортних блоках та високорівневих свердлах. item.dense-alloy.description = Жорсткий сплав вироблений зі свинця та міді. Використовується в передових транспортних блоках та високорівневих свердлах.
item.titanium.name = Титан item.titanium.name = Титан
item.titanium.description = Рідкий суперлегкий метал широко використовується в рідкому транспорті, свердлах та літальних апаратах. item.titanium.description = Рідкий суперлегкий метал широко використовується в рідкому транспорті, свердлах та літальних апаратах.
item.thorium.name = Торій item.thorium.name = Торій
item.thorium.description = Густий, радіоактивний метал, що використовується як структурна підтримка та ядерне паливо. item.thorium.description = Густий, радіоактивний метал, що використовується як структурна підтримка та ядерне паливо.
item.silicon.name = Кремній item.silicon.name = Кремень
item.silicon.description = Надзвичайно корисний напівпровідник з застосуванням в сонячних батареях та багатьох складних електроніках. item.silicon.description = Надзвичайно корисний напівпровідник з застосуванням в сонячних батареях та складній електроніці.
item.plastanium.name = Пластиній item.plastanium.name = Пластиній
item.plastanium.description = Легкий, пластичний матеріал, що використовується в сучасних літальних апаратах, та боєприпаси для фрагментації. item.plastanium.description = Легкий, пластичний матеріал, що використовується в сучасних літальних апаратах та у боєприпасах для фрагментації.
item.phase-fabric.name = Phase Fabric item.phase-fabric.name = Фазова тканина
item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. item.phase-fabric.description = Невагоме речовина, що використовується в сучасній електроніці і технології самовідновлення.
item.surge-alloy.name = Хвилястий сплав item.surge-alloy.name = Високоміцний сплав
item.surge-alloy.description = An advanced alloy with unique electrical properties. item.surge-alloy.description = Передовий сплав з унікальними електричними властивостями.
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 = Вода
@@ -450,9 +450,9 @@ liquid.lava.name = Лава
liquid.oil.name = Нафта liquid.oil.name = Нафта
liquid.cryofluid.name = Кріогенна рідина liquid.cryofluid.name = Кріогенна рідина
mech.alpha-mech.name = Альфа mech.alpha-mech.name = Альфа
mech.alpha-mech.weapon = Кулемет mech.alpha-mech.weapon = Звичайний кулемет
mech.alpha-mech.ability = Виклик дронів mech.alpha-mech.ability = Виклик дронів
mech.alpha-mech.description = Стандартний мех. Має пристойну швидкість і урон; може створити до 3-х дронів для збільшення можливості перемоги. mech.alpha-mech.description = Стандартний мех для настільних пристроїв. Має пристойну швидкість і урон; може створити до 3-х дронів для збільшення можливості перемоги.
mech.delta-mech.name = Дельта mech.delta-mech.name = Дельта
mech.delta-mech.weapon = Генератор дуг mech.delta-mech.weapon = Генератор дуг
mech.delta-mech.ability = Розряд mech.delta-mech.ability = Розряд
@@ -460,18 +460,18 @@ mech.delta-mech.description = Швидкий, легкоброньований
mech.tau-mech.name = Тау mech.tau-mech.name = Тау
mech.tau-mech.weapon = Відновлювальний лазер mech.tau-mech.weapon = Відновлювальний лазер
mech.tau-mech.ability = Відновлювальний спалах mech.tau-mech.ability = Відновлювальний спалах
mech.tau-mech.description = Мех підтримки. Зцілює союзницькі блоки, стріляючи в них. Можна гасити пожежі і зцілити союзників у радіусі зі своєю можливостю для ремонту. mech.tau-mech.description = Мех підтримки. Зцілює союзницькі блоки, стріляючи в них. Може зцілити союзників у радіусі зі своєю здатністю для ремонту.
mech.omega-mech.name = Омега mech.omega-mech.name = Омега
mech.omega-mech.weapon = Купа ракет mech.omega-mech.weapon = Купа ракет
mech.omega-mech.ability = Захисна конфігурація mech.omega-mech.ability = Захисна конфігурація
mech.omega-mech.description = Громіздкий і добре броньований хутро, зроблений для фронтових нападів. Його здатність може блокувати до 90% вхідного шкоди. mech.omega-mech.description = Громіздкий і добре броньований мех, зроблений для фронтових нападів. Його здатність може блокувати до 90% вхідного урона.
mech.dart-ship.name = Дротик mech.dart-ship.name = Дротик
mech.dart-ship.weapon = Ретранслятор mech.dart-ship.weapon = Ретранслятор
mech.dart-ship.description = Стандартний корабель для мобільних пристріях. Досить швидкий і легкий, але має невеликі наступальні можливості і низьку швидкість видобутку. mech.dart-ship.description = Стандартний корабель на мобільних пристріях. Досить швидкий і легкий, але має невеликі наступальні можливості і низьку швидкість видобутку.
mech.javelin-ship.name = Джавелін mech.javelin-ship.name = Джавелін
mech.javelin-ship.description = Ударний корабель, який використовує набіг з відскоком. Спочатку повільний, але пізніше він може прискоритися до великих швидкостей і літати над ворожими заставами, завдаючи великої шкоди своєю. блискавичною здатністю і ракетами. mech.javelin-ship.description = Ударний корабель, який використовує набіг з відскоком. Спочатку повільний, але пізніше він може прискоритися до великих швидкостей і літати над ворожими заставами, завдаючи великої шкоди своєю. блискавичною здатністю і ракетами.
mech.javelin-ship.weapon = Вибухові ракети mech.javelin-ship.weapon = Вибухові ракети
mech.javelin-ship.ability = Дуговий генератор mech.javelin-ship.ability = Генератор дуг
mech.trident-ship.name = Тризубець mech.trident-ship.name = Тризубець
mech.trident-ship.description = Важкий бомбардувальник. Досить добре броньований. mech.trident-ship.description = Важкий бомбардувальник. Досить добре броньований.
mech.trident-ship.weapon = Вантажний відсік з бомбами mech.trident-ship.weapon = Вантажний відсік з бомбами
@@ -493,9 +493,10 @@ text.mech.ability = [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.constructing = {0}\n[LIGHT_GRAY](Constructing) block.constructing = {0}[LIGHT_GRAY](В процесі)
block.spawn.name = Спавн ворога block.spawn.name = Місце появи ворога
block.core.name = Ядро block.core.name = Ядро
block.space.name = Пустота
block.metalfloor.name = Металічна підлога block.metalfloor.name = Металічна підлога
block.deepwater.name = Глибоководдя block.deepwater.name = Глибоководдя
block.water.name = Вода block.water.name = Вода
@@ -510,7 +511,7 @@ block.snow.name = Сніг
block.grass.name = Трава block.grass.name = Трава
block.shrub.name = Кущ block.shrub.name = Кущ
block.rock.name = Кругляк block.rock.name = Кругляк
block.blackrock.name = Чорнийкругляк block.blackrock.name = Чорний кругляк
block.icerock.name = Льодяний кругляк block.icerock.name = Льодяний кругляк
block.copper-wall.name = Мідна стіна block.copper-wall.name = Мідна стіна
block.copper-wall-large.name = Велика мідна стіна block.copper-wall-large.name = Велика мідна стіна
@@ -557,9 +558,9 @@ block.pneumatic-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.alpha-mech-pad.name = Завод мехів "Альфа" block.alpha-mech-pad.name = Реконстуктор "Альфа"
block.dart-ship-pad.name = Завод дротікових літаків block.dart-ship-pad.name = Завод дротікових літаків
block.delta-mech-pad.name = Завод мехів "Дельта" block.delta-mech-pad.name = Реконструктор "Дельта"
block.javelin-ship-pad.name = Реконструктор "Джавелін" block.javelin-ship-pad.name = Реконструктор "Джавелін"
block.trident-ship-pad.name = Реконструктор "Тризуб" block.trident-ship-pad.name = Реконструктор "Тризуб"
block.glaive-ship-pad.name = Реконструктор "Спис" block.glaive-ship-pad.name = Реконструктор "Спис"
@@ -577,7 +578,7 @@ 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 = Пластиновий компресор
@@ -587,14 +588,14 @@ 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.spirit-factory.name = Завод дронів "Привид" block.spirit-factory.name = Завод дронов "Призрак"
block.phantom-factory.name = Завод дронів "Фантом" block.phantom-factory.name = Завод дронов "Фантом"
block.wraith-factory.name = Завод примарних винищувачів block.wraith-factory.name = Завод винищувачів "Примара"
block.ghoul-factory.name = Завод гулевих бомбардувальників block.ghoul-factory.name = Завод бомбардувальників "Ґуль"
block.dagger-factory.name = Завод мехів "Розвідник" block.dagger-factory.name = Завод мехов "Разведчик"
block.titan-factory.name = Завод мехів "Титан" block.titan-factory.name = Завод мехов "Титан"
block.fortress-factory.name = Завод мехів "Фортеця" block.fortress-factory.name = Завод мехов "Крепость"
block.revenant-factory.name = Завод бомбардувальників "Потойбічний вбивця" block.revenant-factory.name = Завод бомбардировщиков "Потусторонний убийца"
block.repair-point.name = Ремонтний пункт block.repair-point.name = Ремонтний пункт
block.pulse-conduit.name = Імпульсний водовід block.pulse-conduit.name = Імпульсний водовід
block.phase-conduit.name = Фазовий водопровід block.phase-conduit.name = Фазовий водопровід
@@ -620,161 +621,161 @@ block.overdrive-projector.name = Сверхприводний проектор
block.force-projector.name = Силовий проектор block.force-projector.name = Силовий проектор
block.arc.name = Дуга block.arc.name = Дуга
block.rtg-generator.name = Радіоізотопний термоелектричний генератор block.rtg-generator.name = Радіоізотопний термоелектричний генератор
block.spectre.name = Spectre block.spectre.name = Мара
block.meltdown.name = Meltdown block.meltdown.name = Розтоплення
block.container.name = Склад block.container.name = Склад
block.core.description = Найголовніша будівля в грі.
team.blue.name = Синя team.blue.name = Синя
team.red.name = Червона team.red.name = Червона
team.orange.name = Помаренчева team.orange.name = Помаренчева
team.none.name = Сіра team.none.name = Сіра
team.green.name = Зелена team.green.name = Зелена
team.purple.name = Фіолетова team.purple.name = Фіолетова
unit.alpha-drone.name = Альфа дрон unit.alpha-drone.name = Альфа
unit.spirit.name = Дрон-привид unit.spirit.name = Дрон-привид
unit.spirit.description = Початковий дрон. З'являється в ядрі за замовчуванням. Автоматично добуває руди та ремонтує блоки. unit.spirit.description = Початковий дрон. З'являється в ядрі за замовчуванням. Автоматично добуває руди та ремонтує блоки.
unit.phantom.name = Фантом unit.phantom.name = Фантом
unit.phantom.description = Покращений дрон. Автоматично добуває руди та ремонтує блоки.\nЗначно краще дрона-привида. unit.phantom.description = Покращений дрон. Автоматично добуває руди та ремонтує блоки.
unit.dagger.name = Кинджал unit.dagger.name = Розвідник
unit.dagger.description = Базова наземна бойова одиниця. Корисен у купі. unit.dagger.description = Базова наземна бойова одиниця. Корисен у купі.
unit.titan.name = Титан unit.titan.name = Титан
unit.titan.description = Просунута броньована наземна одиниця. Атакуе наземні та повітряні цілі. unit.titan.description = Улучшенная бронированная наземная боевая единица. Атакует наземные и воздушные цели.
unit.ghoul.name = Гулевий бомбардувальник unit.ghoul.name = Бомбардувальний "Ґуль"
unit.ghoul.description = Тяжкий ковровий бомбардувальник unit.ghoul.description = Тяжкий ковровий бомбардувальник.
unit.wraith.name = Примарний винищувач unit.wraith.name = Примарний винищувач
unit.wraith.description = Швидка бойова одиниця. unit.wraith.description = Швидка бойова одиниця, котрий використовує набіг з відскоком.
unit.fortress.name = Фортеця unit.fortress.name = Фортеця
unit.fortress.description = Тяжка артилерійна наземна бойова одиниця. unit.fortress.description = Тяжка артилерійна наземна бойова одиниця.
unit.revenant.name = Потойбічний вбивця unit.revenant.name = Потойбічний вбивця
unit.revenant.description = Важка лазерна платформа. unit.revenant.description = Бойова одиниця з важкою лазерною зброєю.
tutorial.begin = Ваша місія тут полягає в ліквідації[LIGHT_GRAY] противника[].\\n\\nПочнімо з[accent] видобутку міді[]. Щоб зробити це, торкніться мідної рудної жили біля вашого ядра. tutorial.begin = Ваша місія тут полягає в ліквідації[LIGHT_GRAY] противника[].\n\nПочнімо з[accent] видобутку міді[]. Щоб зробити це, торкніться мідної рудної жили біля вашого ядра.
tutorial.drill = Ручна робота не ефективна\\n[accent]Бури []можуть копати автоматично.\\оставте один на мідній жилі. tutorial.drill = Ручна робота не ефективна\n[accent]Бури []можуть копати автоматично.\nПоставте один на мідній жилі.
tutorial.conveyor = [accent]Конвейери[] використовуються для транспортування предметів в ядра.\\nЗробіть лінію конвейерів від бурів до ядра. tutorial.conveyor = [accent]Конвейери[] використовуються для транспортування предметів в ядра.\nЗробіть лінію конвейерів від бурів до ядра.
tutorial.morecopper = Треба більше міді\\n\\nДобудьте вручну або поставте більше бурів tutorial.morecopper = Треба більше міді\n\nДобудьте вручну або поставте більше бурів
tutorial.turret = Захистні споруди повинні бути побудованими для захисту від [LIGHT_GRAY] ворога[].\\обудуйте подвійну турель біля бази. tutorial.turret = Захистні споруди повинні бути побудованими для захисту від [LIGHT_GRAY] ворога[].\nПобудуйте подвійну турель біля бази.
tutorial.drillturret = Подвійні турелі потребують[accent] мідні патрони []для стрільби.\\оставте бури поруч з турелею, щоб знаюдити її видобутою міддю. tutorial.drillturret = Подвійні турелі потребують[accent] мідні патрони []для стрільби.\nПоставте бури поруч з турелею, щоб знаюдити її видобутою міддю.
tutorial.waves = [LIGHT_GRAY] Супротивник[] прижується.\\n\\nЗахистіть своє ядро від двух хвиль противника. Побудуйте більше турелей. tutorial.waves = [LIGHT_GRAY] Супротивник[] прижується.\n\nЗахистіть своє ядро від двух хвиль противника. Побудуйте більше турелей.
tutorial.lead = Стало доступно більше руд. Знайдіть і добудьте[accent] свинець[].\\n\\nПеретягніть з вашого меху в ядро для передачі ресурсів. tutorial.lead = Стало доступно більше руд. Знайдіть і добудьте[accent] свинець[].\n\nПеретягніть з вашого меху в ядро для передачі ресурсів.
tutorial.smelter = Свинець і мідь тяжкі метали.\\nНайліпший[accent] щільний сплав[] може бути створеним у плавильному заводі.\\n\\nПобудуйте один завод. tutorial.smelter = Свинець і мідь тяжкі метали.\nНайліпший[accent] щільний сплав[] може бути створеним у плавильному заводі.\n\nПобудуйте один завод.
tutorial.densealloy = Плавильний завод тепер буде створювати сплав. tutorial.densealloy = Плавильний завод тепер буде створювати сплав.
tutorial.siliconsmelter = Ядро зараз створить[accent] дрона привида[] для добування і ремонтування блоків.\\n\\nЗаводи для других одиниць(юнітов) може бути створено за допомогою [accent] кремнія.\\nЗробіть кремнієвий завод. tutorial.siliconsmelter = Ядро зараз створить[accent] дрона привида[] для добування і ремонтування блоків.\n\nЗаводи для других одиниць(юнітов) може бути створено за допомогою [accent] кремнія.\nЗробіть кремнієвий завод.
tutorial.silicondrill = Кремній потребує[accent] вугілляl[] та[accent] пісок[].\\очніть зі створення бурів. tutorial.silicondrill = Кремній потребує[accent] вугілляl[] та[accent] пісок[].\nПочніть зі створення бурів.
tutorial.generator = Ця технологія потребує енергії.\\nЗробіть[accent] генератор внутрішнього згорання[] для цього. tutorial.generator = Ця технологія потребує енергії.\nЗробіть[accent] генератор внутрішнього згорання[] для цього.
tutorial.generatordrill = Генератор потребує вугілля.\\обудуйте бур на вугільній жилі. tutorial.generatordrill = Генератор потребує вугілля.\nПобудуйте бур на вугільній жилі.
tutorial.node = Енергії потребує транспортування\\nСоздайте[accent] силовий вузол[] поруч з вашим генератором згорання, щоб передавати його енергію. tutorial.node = Енергії потребує транспортування\nСоздайте[accent] силовий вузол[] поруч з вашим генератором згорання, щоб передавати його енергію.
tutorial.nodelink = Енергія може бути передана через контактні енергетичні блоки та генератори, або з'єднані силові вузли.\\n\\nЗ'єднайте живлення, торкнувшись вузла та вибравши генератор і кремнієвий завод. tutorial.nodelink = Енергія може бути передана через контактні енергетичні блоки та генератори, або з'єднані силові вузли.\n\nЗ'єднайте живлення, торкнувшись вузла та вибравши генератор і кремнієвий завод.
tutorial.silicon = Кремній почався створюватися. Отримайте трохи.\\n\\nРекомендується вдосконалити виробничу систему. tutorial.silicon = Кремній почався створюватися. Отримайте трохи.\n\nРекомендується вдосконалити виробничу систему.
tutorial.daggerfactory = Побудуйте[accent] завод "Розвідник".[]\\n\\nЦе буде використано для створення мехів атаки. tutorial.daggerfactory = Побудуйте[accent] завод "Розвідник".[]\n\nЦе буде використано для створення мехів атаки.
tutorial.router = Фабрики потребують ресурсів для функціонування.\\nСтворіть маршрутизатор для розподілення ресурсів з конвейера. tutorial.router = Фабрики потребують ресурсів для функціонування.\nСтворіть маршрутизатор для розподілення ресурсів з конвейера.
tutorial.dagger = Зв'яжіть силовий вузол з заводом.\nЯк тільки вимоги будуть виконані, буде створено мех.\n\nЯкщо необхідно, то створіть ще бурів, генераторів та конвейерів tutorial.dagger = Зв'яжіть силовий вузол з заводом.\nЯк тільки вимоги будуть виконані, буде створено мех.\n\nЯкщо необхідно, то створіть ще бурів, генераторів та конвейерів
tutorial.battle = [LIGHT_GRAY] Супротивник[] показав своє ядро.\\nЗнищьте його з вашим мехом та бойовою одиницею. tutorial.battle = [LIGHT_GRAY] Супротивник[] показав своє ядро.\nЗнищьте його з вашим мехом та бойовою одиницею.
block.copper-wall.description = Стіна з найменшим запасом міцності.\nДуж на початку гри для захисту. block.core.description = Найголовніше будівля в грі.
block.copper-wall-large.description = Велика стіна найменшим запасом міцності.\nХороша на початку гри. block.copper-wall.description = Дешевий оборонний блок.\nКорисен для захисту ядра і турелей під час перших хвиль.
block.copper-wall-large.description = Велика стіна найменшим запасом міцності.\nКорисна на початку гри.
block.dense-alloy-wall.description = Стіна з показником міцності "нижче середнього". block.dense-alloy-wall.description = Стіна з показником міцності "нижче середнього".
block.dense-alloy-wall-large.description = Велика стіна з показником міцності "нижче середнього". block.dense-alloy-wall-large.description = Велика стіна з показником міцності "нижче середнього".
block.thorium-wall.description = Стіна з показником міцності "вище середнього". block.thorium-wall.description = Стіна з показником міцності "вище середнього".
block.thorium-wall-large.description = Велика стіна з показником міцності "вище середнього". block.thorium-wall-large.description = Велика стіна з показником міцності "вище середнього".
block.phase-wall.description = Стіна з середнім показником міцності. block.phase-wall.description = Стіна з середнім показником міцності.
block.phase-wall-large.description = Велика стіна з середнім показником міцності. block.phase-wall-large.description = Велика стіна з середнім показником міцності.
block.surge-wall.description = Стіна з найбільшим запасом міцності. block.surge-wall.description = Стіна з найбільшим показником міцності.
block.surge-wall-large.description = Велика стіна з найбільшим запасом міцності. block.surge-wall-large.description = Велика стіна з найбільшим запасом міцності.
block.door.description = Через ці двері не пройдуть вороги, якщо вона закрита. Щоб відкрити / закрити просто натисніть на неї. block.door.description = Двері в прямому сенсі цього слова. Просто натисніть на неї.
block.door-large.description = Для великих стін потрібні великі двері. Щоб відкрити / закрити просто натисніть на неї. block.door-large.description = Для великих стін потрібні великі двері.\nДля відкриття або закриття просто натисніть на неї.
block.mend-projector.description = Ремонтує будівлі в невеликому радіусі. Споживає енергію. block.mend-projector.description = Ремонтує будівлі в невеликому радіусі. Споживає енергію.
block.overdrive-projector.description = Прискорює в невеликому радіусі всі ваші дії. block.overdrive-projector.description = Прискорює в невеликому радіусі роботу механізмів.
block.force-projector.description = Створює в невеликому радіусі силове поле, яке захищає від противника. block.force-projector.description = Створює в невеликому радіусі силове поле, яке захищає від атак супротивника.
block.shock-mine.description = Поставте її. Вона б електрикою О_О block.shock-mine.description = Поставте її на землю. Вона бться ЕЛЕКТРИКОЮ О_О
block.duo.description = Хороша турель початкова турель. Використовуйте стіни для її захисту.\n\n Використовує як снаряди мідь, щільний сплав, кремній і піротит.\n\nМожно підвести воду і криогенну рідина для прискорення стрільби. block.duo.description = Маленька і дешева турель.\nДля прискорення стрільби можна підвести воду або кріогенну рідина.
block.arc.description = Турель з малим радіусом атаки. Для патронів треба воду або кріогенну рідина. Також потрібна енергія. block.arc.description = Турель с малым радиусом атаки.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.hail.description = Далекобійна початкова турель.\nВикористовує як снаряди щільний сплав, кремній і піротит.\nДля прискорення стрільби можна підвести воду і криогенну рідину. block.hail.description = Далекобійна початкова турель.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.lancer.description = Турель, яка стріляє лазером на середню відстань.\nВикористовує як снаряди енергію.\nДля прискорення стрільби можна підвести воду, нафту і криогенну рідину. block.lancer.description = Турель, яка стріляє лазером на середню відстань.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.wave.description = Турель з середнім радіусом атаки, яка відштовхує супротивників в сторони. Використовує в якості снарядів воду, нафту, лаву або кріогенну рідину. block.wave.description = Турель з середнім радіусом атаки, яка відштовхує супротивників в сторони.
block.salvo.description = Турель з середнім радіусом атаки. Використовує в якості снарядів мідь, щільний сплав, торій, кремній і піротит.\nТакож потрібна якась рідина: вода, нафта або кріогенна. block.salvo.description = Турель з середнім радіусом атаки.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.swarmer.description = Навіть Керріган в захваті від такого.\nВикористовує в якості снарядів високоміцний сплав, піротит і вибухонебезпечне з'єднання.\nТакож потрібна якась рідина: вода, нафта або кріогенна. block.swarmer.description = Середній розмір турелі з великим радіусом атаки, яка стріляє ракетами.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.ripple.description = Перша турель 3х3.\nВикористовує в якості снарядів щільний сплав, кремній, піротит, вибухонебезпечне з'єднання.\nТакож потрібна якась рідина: вода, нафта або кріогенна. block.ripple.description = Велика артилерійська турель, яка одночасно стріляє декільками пострілами.
block.cyclone.description = Турель з великою дальністю. Використовує в якості снарядів пластиній, вибухонебезпечне з'єднання і високоміцний сплав.\nТакож потрібна якась рідина: вода, нафта або кріогенна. block.cyclone.description = Велика швидка вогняна турель. \nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.fuse.description = Турель з малою дальністю атаки. Використовує в якості снарядів щільний сплав.\nТакож потрібна якась рідина: вода, нафта або кріогенна. block.fuse.description = Велика турель, яка стріляє потужними ближніми променями.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.spectre.description = Перша турель 4х4 з середнім радіусом атаки. Використовує в якості снарядів щільний сплав, торій і піротит. block.spectre.description = Велика вежа, яка стріляє зразу двома потужніми кулями.\nДля прискорення стрільби можна підвести воду або кріогенну рідину.
block.meltdown.description = Турель з середнім радіусом атаки. Для патронів треба воду або кріогенну рідину. Також потрібна енергія. block.meltdown.description = Велика турель, яка стріляє могутніми далекобійними променями.
block.conveyor.description = Переміщує ресурси з малою швидкістю. block.conveyor.description = Переміщує ресурси з малою швидкістю.
block.titanium-conveyor.description = Конвеєр другого покоління. Збільшена швидкість переміщення предметів і міцність. block.titanium-conveyor.description = Конвеєр другого покоління. Збільшена швидкість переміщення предметів і міцність конвеєра.
block.phase-conveyor.description = Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі. Вимагає енергії. block.phase-conveyor.description = Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі (можливо, це брехня).\nПотрібує енергії і підключається як мостовий конвеєр.
block.junction.description = Назва говорить сама за себе. За допомогою нього можна зробити дві конвеєрні стрічки, які проходять через один одного і не змішуються. block.junction.description = Назва говорить сама за себе. За допомогою нього можна зробити дві конвеєрні стрічки, які проходять через один одного і не змішуються.
block.mass-driver.description = При наявності енергії передають ресурси на відстань 100 блоків, стріляючи в один-одного. block.mass-driver.description = При наявності енергії передають ресурси на відстань 100 блоків, стріляючи в один-одного.
block.smelter.description = Виробляє щільний сплав з міді і свинцю. Можна підвести пісок для прискорення виробництва. block.smelter.description = Виробляє щільний сплав з міді і свинцю. Можна підвести пісок для прискорення виробництва.
block.arc-smelter.description = Покращена версія плавильного заводу. Вимагає енергію. Виробляє щільний сплав з вугілля, міді і свинцю.\nМожно підвести пісок для прискорення виробництва. block.arc-smelter.description = Покращена версія плавильного заводу. Вимагає енергію. Виробляє щільний сплав зміді і свинця.\nМожно підвести пісок для прискорення виробництва.
block.silicon-smelter.description = За допомогою піску, вугілля і енергії виробляє кремній.\n[RED]НЕ СИЛІКОН[] block.silicon-smelter.description = За допомогою піску, вугілля і енергії виробляє кремній.
block.plastanium-compressor.description = Створює пластини з титану і нафти. Вимагає енергії. Для прискорення виробництва можна додати в компресор пісок. block.plastanium-compressor.description = Створює пластинійи з титану і нафти. Вимагає енергії. Для прискорення виробництва можна додати в компресор пісок.
block.phase-weaver.description = Виробляє фазову матерію з торію і піску. Вимагає багато енергії. block.phase-weaver.description = Виробляє фазову тканину торію і піску. Вимагає багато енергії.
block.alloy-smelter.description = Створює високоміцний сплав з титану, кремнію, міді і свинцю. Вимагає енергію. block.alloy-smelter.description = Створює високоміцний сплав з титану, кременя, міді і свинця. Вимагає енергію.
block.pulverizer.description = Подрібнює камінь в пісок. Вимагає енергії. block.pulverizer.description = Подрібнює камінь в пісок. Вимагає енергії.
block.pyratite-mixer.description = Створює піротит з вугілля, свинцю і піску. Вимагає енергії. block.pyratite-mixer.description = Створює піротит з вугілля, свинцю і піску. Вимагає енергії.
block.blast-mixer.description = Створює вибухонебезпечне з'єднання з нафти і піротіта. Для прискорення виробництва можна додати в мішалку пісок. block.blast-mixer.description = Створює вибухонебезпечне з'єднання з нафти і піротіта. Для прискорення виробництва можна додати в мішалку пісок.
block.cryofluidmixer.description = Виробляє криогенну рідина з води і титану. Вимагає енергії. block.cryofluidmixer.description = Виробляє криогенну рідину з води і титану. Вимагає енергії.
block.solidifer.description = Остуджує лаву до каменя. Вимагає енергію. block.solidifer.description = Остуджує лаву до каменя. Вимагає енергію.
block.melter.description = Переплавляє камінь в лаву. Вимагає енергію. block.melter.description = Переплавляє камінь в лаву. Вимагає енергію.
block.incinerator.description = Спалює сміття за допомогою енергії. block.incinerator.description = Якщо є непотрібні ресурси, можна просто їх спалити.\nВимагає енергії.
block.biomattercompressor.description = Робить біоматерію з біосміття і енергії. block.biomattercompressor.description = Виробляє нафту з біоматеріі, біосміття і енергії.
block.separator.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться". block.separator.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться".
block.centrifuge.description = Покращена версія отделителя.\nШукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться".\nВимагає енергію. block.centrifuge.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться".\nТребует енергію.
block.power-node.description = Максимум допустимо 4 підключення. Щоб з'єднати з якимось блоком потрібно наступне:\n1. Щоб він знаходився в радіусі дії\n2.Нажать на потрібний блок. block.power-node.description = Максимум допустимо 4 підключення.\nЩоб з'єднати з якимось блоком потрібно наступне\:\n1. Щоб він знаходився в радіусі дії \n2. Натиснити на потрібний силовий вузол, а потім на інший силовий вузол або блок.
block.power-node-large.description = Силовий вузол другого покоління. Збільшено розмір вузла, кількість максимально допустимих підключень і інше. block.power-node-large.description = Силовий вузол другого покоління. Збільшено радіус дії і кількість максимально допустимих підключень.
block.battery.description = Зберігає енергію, але батарейки DURACELL зберігають в 10 разів більше.(прихована реклама) block.battery.description = Хранит энергию всякий раз, когда есть изобилие, и обеспечивает мощность всякий раз, когда есть недостаток, если есть мощность, але БАТАРЕЙКИ DURACELL ЗБЕРІГАЮТЬ БІЛЬШЕ! (прихована реклама)
block.battery-large.description = Зберігає енергію, але батарейки DURACELL все одно зберігають більше!(прихована реклама) block.battery-large.description = Зберігає значно більше енергії, ніж звичайна батарейка...
block.combustion-generator.description = Початкове і дешевийе джерело енергії. Для виробництва енергії використовує нафту, вугілля, піротит, біоматерію і вибухонебезпечне з'єднання. block.combustion-generator.description = Генерує енергію, спалюючи нафту або легкозаймисті матеріали.
block.turbine-generator.description = Для виробництва енергії використовує нафту, вугілля, Піроте, біоматерію і вибухонебезпечне з'єднання.\nТакже обов'язково потрібна вода. block.turbine-generator.description = Більш ефективний, ніж генератор горіння, але вимагає додаткової води.
block.thermal-generator.description = Гаряче сприймає на ура. block.thermal-generator.description = Генерує велику кількість енергії з лави.
block.solar-panel.description = Зелена енергія block.solar-panel.description = Забезпечує невелику кількість енергії від сонця.
block.solar-panel-large.description = Зелена енергія. Велике і нескінченне джерело енергії. block.solar-panel-large.description = Забезпечує набагато краще джерело живлення, ніж стандартна панель, але в той же час набагато дорожче її побудувати.
block.thorium-reactor.description = Найбільше виробляє енергію. Може вибухнути. Потрібно рідина (вода, нафта або кріогенна) і торій. block.thorium-reactor.description = Генерує величезну кількість енергії з високоактивного торію. Потребує постійного охолодження. Вибухне сильно, якщо постачається недостатня кількість рідини.
block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.rtg-generator.description = Радіоізотопний термоелектричний генератор, який не потребує охолодження, але забезпечує меншу потужність, ніж торієвий реактор.
block.unloader.description = Вивантажує з ядра або сховища верхній лівий предмет. block.unloader.description = Вивантажує предмети з контейнера, сховища або ядра на конвеєр або безпосередньо в сусідній блок. Тип вивантажуваного елемента можна змінити, торкнувшись розвантажувача.
block.container.description = Зберігає ресурси. Спробуй звідти їх дістати :) block.container.description = Зберігає невелику кількість предметів кожного типу. Сусідні контейнери, склепіння та ядра будуть розглядатися як одиничне сховище. [LIGHT_GRAY]Розвантажувач [] можна використовувати для вилучення елементів з контейнера.
block.vault.description = Зберігає предмети як ядро до 2 000. block.vault.description = Зберігає велику кількість предметів кожного типу. Сусідні контейнери, сховища та ядра будуть розглядатися як одиничне сховище. [LIGHT_GRAY]Розвантажувач[] можна використовуватися для отримання елементів із сховища.
block.mechanical-drill.description = Найперший доступний бур. Видобуває мідь, свинець, вугілля, пісок.Можна підвести до нього воду для збільшення швидкості свердління. block.mechanical-drill.description = Найперший доступний бур.\nВидобуває мідь, свинець, вугілля, пісок. \nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління.
block.pneumatic-drill.description = Покращена версія механічного бура.\n\nВидобуває теж саме, що і механічний бур. Також може добувати титан і камінь.\n\nМожно підвести до нього[BLUE] воду [] для збільшення швидкості свердління. block.pneumatic-drill.description = Покращена версія механічного бура.\nВидобуває теж саме, що і механічний бур. Також може добувати титан і камінь.\nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління.
block.laser-drill.description = Покращена версія пневматичного бура.\n\nВидобуває теж саме, що і пневматичний бур. Також може добувати торій.\n\nМожно підвести до нього[BLUE] воду[] для збільшення швидкості свердління. block.laser-drill.description = Покращена версія пневматичного бура.\nДобивает теж саме, що і пневматичний бур. Також може добувати торій.\nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління.
block.blast-drill.description = Найкрутіший бур.\n\nШукає вона теж саме, що і лазерний бур. Свердлить швидше всіх бурів, але вимагає ще більше енергії. N n Можна підвести до нього [BLUE] воду [] для збільшення швидкості свердління. block.blast-drill.description = Найпотужніший бур.\n\nВидобуває теж саме, що і лазерний бур. Свердлить швидше всіх бурів, але вимагає ще більше енергії.\nМожно підвести до нього[BLUE] воду [] для збільшення швидкості свердління.
block.water-extractor.description = Видобуває воду з землі. Вимагає енергію. block.water-extractor.description = Витягує воду з землі. Використовуйте його, коли поблизу немає озера.
block.cultivator.description = Виробляє біоматерію з трави і води. Вимагає енергії. block.cultivator.description = Культивує грунт водою для отримання біоматеріі.
block.oil-extractor.description = Виробляє нафту з динозаврів (закреслено), грунту (закреслено), води і піску. Вимагає енергії. block.oil-extractor.description = Використовує велику кількість енергії для видобутку нафти з піску, динозаврів (закреслено). Використовуйте його, коли поблизу немає прямого джерела нафти.
block.dart-ship-pad.description = Перетворює вас в дротіковий літак. Реконструктор вимагає енергію.\nПодробиці про дротікових літаків в "розблоковане". block.dart-ship-pad.description = Залиште свій поточний судно і перейдіть на основний винищувач.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.trident-ship-pad.description = Перетворює вас в Тризуб. Вимагає енергію. Подробиці про Тризуб в "розблоковане" block.trident-ship-pad.description = Залиште свій поточний корабель і перейдіть в досить добре броньований важкий бомбардувальник.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.javelin-ship-pad.description = Перетворює вас в Джавелін. Вимагає енергію. Подробиці про Джавелін в "розблоковане" block.javelin-ship-pad.description = Залиште свій поточний корабель і перейдіть в сильний і швидкий перехоплювач з блискавичним зброєю.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.glaive-ship-pad.description = Перетворює вас в Спис. Вимагає енергію. Подробиці про Спис в "розблоковане" block.glaive-ship-pad.description = Залиште своє існуюче судно і перетворитесь на великий, добре броньований мех.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.tau-mech-pad.description = Перетворює вас в Тау. Вимагає енергію. N Подробиці про Тау в "розблоковане" block.tau-mech-pad.description = Покиньте свій поточний корабель і перетворитеся на мех підтримки, який може зцілювати дружні будівлі і юніти.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.delta-mech-pad.description = Перетворює вас в "Дельта". Реконструктор вимагає енергію.\nПодробиці про "Дельта" в "розблоковане". block.delta-mech-pad.description = Залиште свій поточний корабель і перейдіть в великий, добре броньований бойовий корабель.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.omega-mech-pad.description = Перетворює вас в Омега. Вимагає енергію.Подробиці про Омега в "розблоковане" block.omega-mech-pad.description = Залиште свій поточний корабель і перетворіть його в громіздкий і добре броньований мех, зроблений для фронтових нападів.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех.
block.spirit-factory.description = Виробляє дронів типу "привид" block.spirit-factory.description = Виробляє легкі дрони, які видобувають руду (мідну і свинцеву) і ремонтує блоки. Один за замовчуванням з'являється з ядра.
block.phantom-factory.description = Виробляє дронів типу "фантом" \nПодробиці в "розблоковане" block.phantom-factory.description = Виробляє вдосконалені одиниці, які значно ефективніше, ніж дрон-привид.
block.wraith-factory.description = Виробляє примарних винищувачів\nПодробиці в "розблоковане" block.wraith-factory.description = Виробляє швидких і літаючих бойових одиниць.
block.ghoul-factory.description = Виробляє Гулев бомбардувальників\nПодробиці в "розблоковане" block.ghoul-factory.description = Виробляє важких килимових бомбардувальників.
block.dagger-factory.description = Виробляє "Розвідник\nПодробиці в "розблоковане" block.dagger-factory.description = Виробляє основні наземні бойові одиниці.
block.titan-factory.description = Виробляє меха типу "Титан".\nПодробиці в "розблоковане". block.titan-factory.description = Виробляє просунуті захищені бойові одиниці.
block.fortress-factory.description = Величезний повільний мех володіє такою-ж величезною гарматою. block.fortress-factory.description = Виробляє важкі артилерійські бойові одиниці.
block.revenant-factory.description = Виробляє бомбардувальників типу "Потойбічний вбивця"\nПодробиці в "розблоковане" block.revenant-factory.description = Виробляє важкі наземні бойові одиниці.
block.repair-point.description = За допомогою енергії лікує тебе. block.repair-point.description = Постійно лікує найближчий пошкоджений апарат в його зоні дії.
block.command-center.description = Дозволяє управляти бойовими одиницями. Або атакувати, або стояти на місці, або застрявати в блоках ... block.command-center.description = Дозволяє змінювати дружню поведінку AI. В даний час, атаки, відступ і патрулювання команди підтримуються.
block.conduit.description = Конвеєр для рідин першого покоління. block.conduit.description = Основний транспортний блок. Працює як конвеєр, але з рідинами. Найкраще використовується з екстракторами, насосами або іншими трубопроводами.
block.pulse-conduit.description = "Конвеєр" для рідин другого покоління. block.pulse-conduit.description = Розширений блок перевезення рідин. Транспортує рідини швидше і зберігає більше, аніж стандартні.
block.phase-conduit.description = Кращий трубопровід, вимагає енергію. Схоже, він з майбутнього. block.phase-conduit.description = Покращений блок перевезення рідин. Використовує енергію для телепорту рідин до підключеного фазового каналу по декілька блоків.
block.liquid-router.description = Розподіляє рідину на 4 сторони. block.liquid-router.description = Приймає рідини з одного напрямку і виведить їх до 3 інших напрямків однаково. Можна також зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела на кілька.
block.liquid-tank.description = Зберігає рідину. block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте його для створення буферів, коли існує нестійкий попит на матеріали або як захист для охолодження життєво важливих блоків.
block.liquid-junction.description = Назва говорить сама за себе. За допомогою нього можна зробити дві труби, які проходять через один-одного і не змішуються. block.liquid-junction.description = Діє як міст для двох перехресних трубопроводів. Корисно в ситуаціях з двома різними трубами, що несуть різні рідини в різні місця.
block.bridge-conduit.description = Дозволяє проходити над височинами (блоками). Найкраще підключати послідовно і в лінію. block.bridge-conduit.description = Покращений блок перевезення рідин. Дозволяє транспортувати рідини понад 3 блоки будь-якої місцевості або будівлі.
block.mechanical-pump.description = Качає тільки воду. block.mechanical-pump.description = Дешевий насос з повільною швидкістю, але без споживання енергії.
block.rotary-pump.description = Качає воду і нафту. Вимагає енергії. block.rotary-pump.description = Розширений насос, який подвоює швидкість, використовуючи енергію.
block.thermal-pump.description = Дозволяє качати лаву, воду і нафту. block.thermal-pump.description = Остаточний насос. Тричі швидше, ніж механічний насос і єдиний насос, який здатний отримати лаву.
block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. block.router.description = Приймає елементи з одного напрямку і рівномірно виводить їх до 3 інших напрямків. Корисно для розділення матеріалів від одного джерела на кілька.
block.distributor.description = An advanced router which splits items to up to 7 other directions equally. block.distributor.description = Розширений маршрутизатор, який рівномірно розбиває елементи на 7 різних напрямків.
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. block.bridge-conveyor.description = Покращений блок транспортування предметів. Дозволяє транспортувати предмети понад 3 блоки над будь-якої місцевостю або будівлеє.
block.alpha-mech-pad.description = Перетворює вас в Альфа. Вимагає енергію.Подробиці про Джавелін в "розблоковане" block.alpha-mech-pad.description = Коли ви отримаєте достатньо енергії, перебудовує ваш корабель у [accent] Альфа[] мех.
block.itemsource.description = З цього блоку можна отримати будь-який предмет. block.itemsource.description = Безліченно виводить предмети. Лише пісочниця.
block.liquidsource.description = З цього блоку можна отримати будь-яку рідину. block.liquidsource.description = Безліченно виводить рідини. Лише пісочниця.
block.itemvoid.description = Предмети просто йдуть в порожнечу block.itemvoid.description = Знищує будь-які предмети, які входять, без використання енергії. Працює тільки в пісочниці.
block.powerinfinite.description = Ти не повинен це бачити!\n[RED]WARNING[] block.powerinfinite.description = Нескінченність не межа. Безмежно виводить енергію. Лише пісочниця.
block.powervoid.description = Рідини просто йдуть в порожнечу block.powervoid.description = Енергія просто йде в порожнечу. Лише пісочниця.
liquid.water.description = Набагато краще ніж[BLUE] монооксид дігідрогена[].\n\nДля отримання води використовуйте помпу(насос) на джерел(блоці) або екстрактор води.\n\nЦю рідину можна підвести до бурів для прискорення швидкості видобутку або до турелям для прискорення стрільби. liquid.water.description = Зазвичай використовується для охолодження машин та переробки відходів.
liquid.lava.description = [accent]Гаряче...\nРечовина розплавлене з гірничо-кам'яних пород.\nСлужить як паливо для термального генератора. liquid.lava.description = Можна перетворити в[LIGHT_GRAY] камінь[], який використовується для генерації енергії або використовуати як боєприпаси для певних турелей.
liquid.oil.description = Хтось писав про додавання золота в гру. Його додали, правда воно якесь чорне ...\nСуміш рідких вуглеводнів, що виділяється з природного газу в результаті зниження температури і пластового тиску.\nСлугує для пластіенівого компресора і т.д .. liquid.oil.description = Можна спалити, взірвати або використовувати як теплоносій.
liquid.cryofluid.description = Рідина з температурою нижче ніж -273 градусів за Цельсієм. Може бути використана для прискорення стрільби турелей або для охолодження чогось. liquid.cryofluid.description = Найефективніша рідина для охолодження. Рідина з температурою нижче ніж -273 градусів за Цельсієм. Може бути використана для прискорення стрільби турелей або для охолодження чогось.

View File

@@ -38,7 +38,7 @@ void main() {
else if(m > 0.35) gl_FragColor.rgb = p4; else if(m > 0.35) gl_FragColor.rgb = p4;
else gl_FragColor.rgb = vec3(0.0); else gl_FragColor.rgb = vec3(0.0);
gl_FragColor.rgb *= 0.75; gl_FragColor.rgb *= 0.5;
gl_FragColor.a = mod(abs(float(coords.x)) + abs(float(coords.y)), 110.0) < 35.0 ? 1.0 : 0.0; gl_FragColor.a = mod(abs(float(coords.x)) + abs(float(coords.y)), 110.0) < 35.0 ? 1.0 : 0.0;
} }

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -12,51 +12,53 @@ TintedDrawable: {
invis: {name: white, color: {r: 0, g: 0, b: 0, a: 0} } invis: {name: white, color: {r: 0, g: 0, b: 0, a: 0} }
loadDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.8} }, loadDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.8} },
chatfield: {name: white, color: {r: 0, g: 0, b: 0, a: 0.2}}, chatfield: {name: white, color: {r: 0, g: 0, b: 0, a: 0.2}},
clear: {name: white, color: {r: 0.1, g: 0.1, b: 0.1, a: 0.75}}, dark: {name: white, color: {hex: "#000000ff"}},
none: {name: white, color: {r: 0, g: 0, b: 0, a: 0}}, none: {name: white, color: {r: 0, g: 0, b: 0, a: 0}},
clear-over: {name: white, color: { hex: "#ffffff82" }}, flat: {name: white, color: {r: 0.0, g: 0.0, b: 0.0, a: 0.6}},
clear-alpha: {name: white, color: { hex: "#ffd37fff" }}, flat-over: {name: white, color: { hex: "#ffffff82" }},
clear-down: {name: white, color: { hex: "#ffd37fff" }} flat-down: {name: white, color: { hex: "#ffd37fff" }}
}, },
ButtonStyle: { ButtonStyle: {
default: {down: button-down, up: button }, default: {down: button-down, up: button },
toggle: {checked: button-down, down: button-down, up: button } toggle: {checked: button-down, down: button-down, up: button }
}, },
TextButtonStyle: { TextButtonStyle: {
default: {over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: gray, down: button-down, up: button, transition: 0 }, default: {over: button-over, disabled: button, font: default-font, fontColor: white, disabledFontColor: gray, down: button-down, up: button},
right: {over: button-right-over, font: default-font, fontColor: white, disabledFontColor: gray, down: button-right-down, up: button-right},
wave: {font: default-font, fontColor: white, disabledFontColor: gray, up: button-edge-4},
clear: {over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray, down: pane, up: flat},
discord: {font: default-font, fontColor: white, up: discord-banner}, discord: {font: default-font, fontColor: white, up: discord-banner},
info: {font: default-font, fontColor: white, up: info-banner}, info: {font: default-font, fontColor: white, up: info-banner},
clear: {down: clear-down, up: clear, over: clear-over, font: default-font, fontColor: white, disabledFontColor: gray }, clear-partial: {down: white, up: button-select, over: flat-down, font: default-font, fontColor: white, disabledFontColor: gray },
clear-partial: {down: white, up: button-select, over: clear-down, font: default-font, fontColor: white, disabledFontColor: gray }, clear-partial-2: {down: flat-over, up: none, over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray },
empty: {font: default-font}, empty: {font: default-font},
toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: gray } toggle: {font: default-font, fontColor: white, checked: button-down, down: button-down, up: button, over: button-over, disabled: button, disabledFontColor: gray }
}, },
ImageButtonStyle: { ImageButtonStyle: {
default: {down: button-down, up: button, over: button-over, imageDisabledColor: gray, imageUpColor: white }, default: {down: button-down, up: button, over: button-over, imageDisabledColor: gray, imageUpColor: white },
right: {over: button-right-over, down: button-right-down, up: button-right},
empty: { imageDownColor: accent, imageUpColor: white}, empty: { imageDownColor: accent, imageUpColor: white},
emptytoggle: {imageCheckedColor: white, imageDownColor: white, imageUpColor: gray}, emptytoggle: {imageCheckedColor: white, imageDownColor: white, imageUpColor: gray},
static: {up: button }, static: {up: button },
static-down: {up: button-down }, static-down: {up: button-down },
toggle: {checked: button-down, down: button-down, up: button, imageDisabledColor: gray, imageUpColor: white }, toggle: {checked: button-down, down: button-down, up: button, imageDisabledColor: gray, imageUpColor: white },
select: {checked: button-select, up: none }, select: {checked: button-select, up: none },
clear: {down: clear-down, up: clear, over: clear-over}, clear: {down: flat-over, up: flat, over: flat-over},
clear-partial: {down: clear-down, up: none, over: clear-over}, clear-full: {down: white, up: button-select, over: flat-down},
clear-toggle: {down: clear-down, checked: clear-down, up: clear, over: clear-over}, clear-partial: {down: flat-down, up: none, over: flat-over},
clear-toggle-partial: {down: clear-down, checked: clear-down, up: none, over: clear-over}, clear-toggle: {down: flat-down, checked: flat-down, up: flat, over: flat-over},
clear-toggle-partial: {down: flat-down, checked: flat-down, up: none, over: flat-over},
}, },
ScrollPaneStyle: { ScrollPaneStyle: {
default: {background: border, vScroll: scroll, vScrollKnob: scroll-knob-vertical-black}, default: {vScroll: scroll, vScrollKnob: scroll-knob-vertical-black},
horizontal: {background: border, vScroll: scroll, vScrollKnob: scroll-knob-vertical, hScroll: scroll-horizontal, hScrollKnob: scroll-knob-horizontal}, horizontal: {vScroll: scroll, vScrollKnob: scroll-knob-vertical-black, hScroll: scroll-horizontal, hScrollKnob: scroll-knob-horizontal-black},
volume: {background: button, vScroll: scroll, vScrollKnob: scroll-knob-vertical-black},
clear: {vScroll: scroll, vScrollKnob: scroll-knob-vertical-black},
clear-black: {vScroll: scroll, vScrollKnob: scroll-knob-vertical-black}
}, },
WindowStyle: { WindowStyle: {
default: {titleFont: default-font, titleFontColor: accent }, default: {titleFont: default-font, titleFontColor: accent },
dialog: {stageBackground: dialogDim, titleFont: default-font, background: window-empty, titleFontColor: accent } dialog: {stageBackground: dialogDim, titleFont: default-font, background: window-empty, titleFontColor: accent }
}, },
KeybindDialogStyle: { KeybindDialogStyle: {
default: {keyColor: accent, keyNameColor: white, controllerColor: lightgray, paneStyle: clear}, default: {keyColor: accent, keyNameColor: white, controllerColor: lightgray},
}, },
SliderStyle: { SliderStyle: {
default-horizontal: {background: slider, knob: slider-knob, knobOver: slider-knob-over, knobDown: slider-knob-down}, default-horizontal: {background: slider, knob: slider-knob, knobOver: slider-knob-over, knobDown: slider-knob-down},
@@ -67,8 +69,8 @@ LabelStyle: {
small: {font: default-font, fontColor: white } small: {font: default-font, fontColor: white }
}, },
TextFieldStyle: { TextFieldStyle: {
default: {font: default-font-chat, fontColor: white, disabledFontColor: gray, selection: selection, background: button, cursor: cursor, messageFont: default-font, messageFontColor: gray } default: {font: default-font-chat, fontColor: white, disabledFontColor: gray, selection: selection, background: underline, cursor: cursor, messageFont: default-font, messageFontColor: gray }
textarea: {font: default-font-chat, fontColor: white, disabledFontColor: gray, selection: selection, background: textarea, cursor: cursor, messageFont: default-font, messageFontColor: gray } textarea: {font: default-font-chat, fontColor: white, disabledFontColor: gray, selection: selection, background: underline, cursor: cursor, messageFont: default-font, messageFontColor: gray }
}, },
CheckBoxStyle: { CheckBoxStyle: {
default: {checkboxOn: check-on, checkboxOff: check-off, checkboxOnOver: check-on-over, checkboxOver: check-over, font: default-font, fontColor: white, disabledFontColor: gray } default: {checkboxOn: check-on, checkboxOff: check-off, checkboxOnOver: check-on-over, checkboxOver: check-over, font: default-font, fontColor: white, disabledFontColor: gray }

View File

@@ -45,7 +45,7 @@ public class Pathfinder{
} }
public void update(){ public void update(){
if(Net.client()) return; if(Net.client() || paths == null) return;
for(Team team : Team.all){ for(Team team : Team.all){
if(state.teams.isActive(team)){ if(state.teams.isActive(team)){

View File

@@ -10,9 +10,9 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Waves; import io.anuke.mindustry.game.Waves;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.util.Structs;
import io.anuke.ucore.util.GridBits; import io.anuke.ucore.util.GridBits;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Structs;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;

View File

@@ -14,7 +14,7 @@ public class AmmoTypes implements ContentList{
bulletDenseBig, bulletPyratiteBig, bulletThoriumBig, bulletDenseBig, bulletPyratiteBig, bulletThoriumBig,
shock, bombExplosive, bombIncendiary, bombOil, shellCarbide, flamerThermite, weaponMissile, weaponMissileSwarm, bulletMech, shock, bombExplosive, bombIncendiary, bombOil, shellCarbide, flamerThermite, weaponMissile, weaponMissileSwarm, bulletMech,
healBlaster, bulletGlaive, healBlaster, bulletGlaive,
/*flakCopper, */flakExplosive, flakPlastic, flakSurge, flakExplosive, flakPlastic, flakSurge,
missileExplosive, missileIncindiary, missileSurge, missileExplosive, missileIncindiary, missileSurge,
artilleryDense, artilleryPlastic, artilleryHoming, artilleryIncindiary, artilleryExplosive, unitArtillery, artilleryDense, artilleryPlastic, artilleryHoming, artilleryIncindiary, artilleryExplosive, unitArtillery,
basicFlame, lancerLaser, lightning, meltdownLaser, burstLaser, basicFlame, lancerLaser, lightning, meltdownLaser, burstLaser,

View File

@@ -43,7 +43,6 @@ public class UnitTypes implements ContentList{
speed = 0.2f; speed = 0.2f;
maxVelocity = 0.8f; maxVelocity = 0.8f;
range = 50f; range = 50f;
healSpeed = 0.22f;
health = 60; health = 60;
}}; }};
@@ -115,6 +114,7 @@ public class UnitTypes implements ContentList{
}}; }};
phantom = new UnitType("phantom", Phantom.class, Phantom::new){{ phantom = new UnitType("phantom", Phantom.class, Phantom::new){{
weapon = Weapons.healBlasterDrone2;
isFlying = true; isFlying = true;
drag = 0.01f; drag = 0.01f;
mass = 2f; mass = 2f;
@@ -125,7 +125,6 @@ public class UnitTypes implements ContentList{
health = 220; health = 220;
buildPower = 0.9f; buildPower = 0.9f;
minePower = 1.1f; minePower = 1.1f;
healSpeed = 0.5f;
toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium); toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium);
}}; }};
} }

View File

@@ -8,7 +8,7 @@ import io.anuke.mindustry.type.Weapon;
public class Weapons implements ContentList{ public class Weapons implements ContentList{
public static Weapon blaster, blasterSmall, glaiveBlaster, droneBlaster, healBlaster, healBlasterDrone, chainBlaster, shockgun, public static Weapon blaster, blasterSmall, glaiveBlaster, droneBlaster, healBlaster, healBlasterDrone, chainBlaster, shockgun,
sapper, swarmer, bomber, bomberTrident, flakgun, flamethrower, missiles, artillery, laserBurster; sapper, swarmer, bomber, bomberTrident, flakgun, flamethrower, missiles, artillery, laserBurster, healBlasterDrone2;
@Override @Override
public void load(){ public void load(){
@@ -179,6 +179,16 @@ public class Weapons implements ContentList{
recoil = 2f; recoil = 2f;
ammo = AmmoTypes.healBlaster; ammo = AmmoTypes.healBlaster;
}}; }};
healBlasterDrone2 = new Weapon("heal-blaster"){{
length = 1.5f;
reload = 20f;
width = 0.5f;
roundrobin = true;
ejectEffect = Fx.none;
recoil = 2f;
ammo = AmmoTypes.healBlaster;
}};
} }
@Override @Override

View File

@@ -135,13 +135,13 @@ public class CraftingBlocks extends BlockList implements ContentList{
melter = new PowerCrafter("melter"){{ melter = new PowerCrafter("melter"){{
health = 200; health = 200;
outputLiquid = Liquids.lava; outputLiquid = Liquids.lava;
outputLiquidAmount = 0.75f; outputLiquidAmount = 1f;
itemCapacity = 50; itemCapacity = 20;
craftTime = 10f; craftTime = 10f;
hasLiquids = hasPower = true; hasLiquids = hasPower = true;
consumes.powerDirect(0.1f); consumes.powerDirect(0.1f);
consumes.item(Items.stone, 2); consumes.item(Items.stone, 1);
}}; }};
separator = new Separator("separator"){{ separator = new Separator("separator"){{

View File

@@ -90,8 +90,11 @@ public class DebugBlocks extends BlockList implements ContentList{
@Override @Override
public void update(Tile tile){ public void update(Tile tile){
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
if(entity.sortItem == null) return;
entity.items.set(entity.sortItem, 1); entity.items.set(entity.sortItem, 1);
tryDump(tile, entity.sortItem); tryDump(tile, entity.sortItem);
entity.items.set(entity.sortItem, 0);
} }
@Override @Override
@@ -142,8 +145,8 @@ public class DebugBlocks extends BlockList implements ContentList{
if(!control.unlocks.isUnlocked(items.get(i))) continue; if(!control.unlocks.isUnlocked(items.get(i))) continue;
final int f = i; final int f = i;
ImageButton button = cont.addImageButton("liquid-icon-" + items.get(i).name, "toggle", 24, ImageButton button = cont.addImageButton("liquid-icon-" + items.get(i).name, "clear-toggle", 24,
() -> Call.setLiquidSourceLiquid(null, tile, items.get(f))).size(38, 42).padBottom(-5.1f).group(group).get(); () -> Call.setLiquidSourceLiquid(null, tile, items.get(f))).size(38).group(group).get();
button.setChecked(entity.source.id == f); button.setChecked(entity.source.id == f);
if(i % 4 == 3){ if(i % 4 == 3){

View File

@@ -83,7 +83,6 @@ public class DefenseBlocks extends BlockList implements ContentList{
}}; }};
forceProjector = new ForceProjector("force-projector"){{ forceProjector = new ForceProjector("force-projector"){{
consumes.powerDirect(0.2f);
size = 3; size = 3;
consumes.item(Items.phasefabric).optional(true); consumes.item(Items.phasefabric).optional(true);
}}; }};

View File

@@ -19,18 +19,14 @@ public class PowerBlocks extends BlockList implements ContentList{
}}; }};
thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{ thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{
maxLiquidGenerate = 4f; maxLiquidGenerate = 2f;
// TODO: Balance powerProduction = 2f;
powerProduction = 0.17f;
liquidPowerMultiplier = 0.1f;
generateEffect = BlockFx.redgeneratespark; generateEffect = BlockFx.redgeneratespark;
size = 2; size = 2;
}}; }};
turbineGenerator = new TurbineGenerator("turbine-generator"){{ turbineGenerator = new TurbineGenerator("turbine-generator"){{
// TODO: Balance
powerProduction = 0.28f; powerProduction = 0.28f;
liquidPowerMultiplier = 0.3f;
itemDuration = 30f; itemDuration = 30f;
consumes.liquid(Liquids.water, 0.05f); consumes.liquid(Liquids.water, 0.05f);
size = 2; size = 2;
@@ -46,14 +42,15 @@ public class PowerBlocks extends BlockList implements ContentList{
powerProduction = 0.0045f; powerProduction = 0.0045f;
}}; }};
largeSolarPanel = new PowerGenerator("solar-panel-large"){{ largeSolarPanel = new SolarGenerator("solar-panel-large"){{
size = 3;
powerProduction = 0.055f; powerProduction = 0.055f;
}}; }};
thoriumReactor = new NuclearReactor("thorium-reactor"){{ thoriumReactor = new NuclearReactor("thorium-reactor"){{
size = 3; size = 3;
health = 700; health = 700;
powerMultiplier = 1.1f; powerProduction = 1.1f;
}}; }};
fusionReactor = new FusionReactor("fusion-reactor"){{ fusionReactor = new FusionReactor("fusion-reactor"){{

View File

@@ -110,7 +110,7 @@ public class TurretBlocks extends BlockList implements ContentList{
shootShake = 1f; shootShake = 1f;
shootCone = 40f; shootCone = 40f;
rotatespeed = 8f; rotatespeed = 8f;
powerUsed = 10f; powerUsed = 1f / 3f;
consumes.powerBuffered(30f); consumes.powerBuffered(30f);
range = 150f; range = 150f;
shootEffect = ShootFx.lightningShoot; shootEffect = ShootFx.lightningShoot;

View File

@@ -53,7 +53,6 @@ public class Control extends Module{
private Throwable error; private Throwable error;
public Control(){ public Control(){
saves = new Saves(); saves = new Saves();
unlocks = new Unlocks(); unlocks = new Unlocks();
@@ -373,7 +372,7 @@ public class Control extends Module{
} }
} }
if(Inputs.keyTap("screenshot")){ if(Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){
renderer.takeMapScreenshot(); renderer.takeMapScreenshot();
} }

View File

@@ -79,7 +79,9 @@ public class NetServer extends Module{
public NetServer(){ public NetServer(){
Events.on(WorldLoadEvent.class, event -> { Events.on(WorldLoadEvent.class, event -> {
if(!headless){
connections.clear(); connections.clear();
}
}); });
Net.handleServer(Connect.class, (id, connect) -> { Net.handleServer(Connect.class, (id, connect) -> {
@@ -596,14 +598,18 @@ public class NetServer extends Module{
} }
void sync(){ void sync(){
try{ try{
//iterate through each player //iterate through each player
for(Player player : connections.values()){ for(int i = 0; i < playerGroup.size(); i ++){
Player player = playerGroup.all().get(i);
if(player.isLocal) continue;
NetConnection connection = player.con; NetConnection connection = player.con;
if(!connection.isConnected()){ if(!connection.isConnected() || !connections.containsKey(connection.id)){
//player disconnected, ignore them //player disconnected, call d/c event
onDisconnect(player); onDisconnect(player);
return; return;
} }

View File

@@ -32,9 +32,22 @@ public abstract class Platform {
dialog.setFillParent(true); dialog.setFillParent(true);
dialog.content().top(); dialog.content().top();
dialog.content().defaults().height(65f); dialog.content().defaults().height(65f);
TextField[] use = {null};
dialog.content().addImageButton("icon-copy", "clear", 16*3, () -> use[0].copy())
.visible(() -> !use[0].getSelection().isEmpty()).width(65f);
dialog.content().addImageButton("icon-paste", "clear", 16*3, () ->
use[0].paste(Gdx.app.getClipboard().getContents(), false))
.visible(() -> Gdx.app.getClipboard() != null && Gdx.app.getClipboard().getContents() != null && !Gdx.app.getClipboard().getContents().isEmpty()).width(65f);
TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get();
to.setMaxLength(maxLength); to.setMaxLength(maxLength);
to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick());
use[0] = to;
dialog.content().addButton("$text.ok", () -> { dialog.content().addButton("$text.ok", () -> {
field.clearText(); field.clearText();
field.appendText(to.getText()); field.appendText(to.getText());

View File

@@ -30,8 +30,8 @@ public class World extends Module{
public final Sectors sectors = new Sectors(); public final Sectors sectors = new Sectors();
public final WorldGenerator generator = new WorldGenerator(); public final WorldGenerator generator = new WorldGenerator();
public final BlockIndexer indexer = new BlockIndexer(); public final BlockIndexer indexer = new BlockIndexer();
public final Pathfinder pathfinder = new Pathfinder();
public final WaveSpawner spawner = new WaveSpawner(); public final WaveSpawner spawner = new WaveSpawner();
public final Pathfinder pathfinder = new Pathfinder();
private Map currentMap; private Map currentMap;
private Sector currentSector; private Sector currentSector;

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
@@ -58,7 +59,9 @@ public class MapEditorDialog extends Dialog implements Disposable{
private ButtonGroup<ImageButton> blockgroup; private ButtonGroup<ImageButton> blockgroup;
public MapEditorDialog(){ public MapEditorDialog(){
super("$text.mapeditor", "dialog"); super("", "dialog");
background("dark");
editor = new MapEditor(); editor = new MapEditor();
view = new MapView(editor); view = new MapView(editor);
@@ -227,6 +230,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
}); });
} }
@Override
protected void drawBackground(Batch batch, float parentAlpha, float x, float y){
drawDefaultBackground(batch, parentAlpha, x, y);
}
private void save(){ private void save(){
String name = editor.getTags().get("name", ""); String name = editor.getTags().get("name", "");
@@ -352,7 +360,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
table(cont -> { table(cont -> {
cont.left(); cont.left();
cont.table("button", mid -> { cont.table(mid -> {
mid.top(); mid.top();
Table tools = new Table().top(); Table tools = new Table().top();
@@ -360,7 +368,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
ButtonGroup<ImageButton> group = new ButtonGroup<>(); ButtonGroup<ImageButton> group = new ButtonGroup<>();
Consumer<EditorTool> addTool = tool -> { Consumer<EditorTool> addTool = tool -> {
ImageButton button = new ImageButton("icon-" + tool.name(), "toggle"); ImageButton button = new ImageButton("icon-" + tool.name(), "clear-toggle");
button.clicked(() -> view.setTool(tool)); button.clicked(() -> view.setTool(tool));
button.resizeImage(16 * 2f); button.resizeImage(16 * 2f);
button.update(() -> button.setChecked(view.getTool() == tool)); button.update(() -> button.setChecked(view.getTool() == tool));
@@ -368,21 +376,21 @@ public class MapEditorDialog extends Dialog implements Disposable{
if(tool == EditorTool.pencil) if(tool == EditorTool.pencil)
button.setChecked(true); button.setChecked(true);
tools.add(button).padBottom(-5.1f); tools.add(button);
}; };
tools.defaults().size(size, size + 4f).padBottom(-5.1f); tools.defaults().size(size, size);
tools.addImageButton("icon-menu-large", 16 * 2f, menu::show); tools.addImageButton("icon-menu-large", "clear", 16 * 2f, menu::show);
ImageButton grid = tools.addImageButton("icon-grid", "toggle", 16 * 2f, () -> view.setGrid(!view.isGrid())).get(); ImageButton grid = tools.addImageButton("icon-grid", "clear-toggle", 16 * 2f, () -> view.setGrid(!view.isGrid())).get();
addTool.accept(EditorTool.zoom); addTool.accept(EditorTool.zoom);
tools.row(); tools.row();
ImageButton undo = tools.addImageButton("icon-undo", 16 * 2f, () -> view.undo()).get(); ImageButton undo = tools.addImageButton("icon-undo", "clear", 16 * 2f, () -> view.undo()).get();
ImageButton redo = tools.addImageButton("icon-redo", 16 * 2f, () -> view.redo()).get(); ImageButton redo = tools.addImageButton("icon-redo", "clear", 16 * 2f, () -> view.redo()).get();
addTool.accept(EditorTool.pick); addTool.accept(EditorTool.pick);
@@ -404,7 +412,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
addTool.accept(EditorTool.fill); addTool.accept(EditorTool.fill);
addTool.accept(EditorTool.elevation); addTool.accept(EditorTool.elevation);
ImageButton rotate = tools.addImageButton("icon-arrow-16", 16 * 2f, () -> editor.setDrawRotation((editor.getDrawRotation() + 1) % 4)).get(); ImageButton rotate = tools.addImageButton("icon-arrow-16", "clear", 16 * 2f, () -> editor.setDrawRotation((editor.getDrawRotation() + 1) % 4)).get();
rotate.getImage().update(() -> { rotate.getImage().update(() -> {
rotate.getImage().setRotation(editor.getDrawRotation() * 90); rotate.getImage().setRotation(editor.getDrawRotation() * 90);
rotate.getImage().setOrigin(Align.center); rotate.getImage().setOrigin(Align.center);
@@ -412,8 +420,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
tools.row(); tools.row();
tools.table("button", t -> t.add("$text.editor.teams")) tools.table("underline", t -> t.add("$text.editor.teams"))
.colspan(3).height(40).width(size * 3f); .colspan(3).height(40).width(size * 3f).padBottom(3);
tools.row(); tools.row();
@@ -422,14 +430,14 @@ public class MapEditorDialog extends Dialog implements Disposable{
int i = 0; int i = 0;
for(Team team : Team.all){ for(Team team : Team.all){
ImageButton button = new ImageButton("white", "toggle"); ImageButton button = new ImageButton("white", "clear-toggle-partial");
button.margin(4f, 4f, 10f, 4f); button.margin(4f);
button.getImageCell().grow(); button.getImageCell().grow();
button.getStyle().imageUpColor = team.color; button.getStyle().imageUpColor = team.color;
button.clicked(() -> editor.setDrawTeam(team)); button.clicked(() -> editor.setDrawTeam(team));
button.update(() -> button.setChecked(editor.getDrawTeam() == team)); button.update(() -> button.setChecked(editor.getDrawTeam() == team));
teamgroup.add(button); teamgroup.add(button);
tools.add(button).padBottom(-5.1f); tools.add(button);
if(i++ % 3 == 2) tools.row(); if(i++ % 3 == 2) tools.row();
} }
@@ -438,7 +446,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
mid.row(); mid.row();
mid.table("button", t -> { mid.table("underline", t -> {
Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false); Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false);
slider.moved(f -> editor.setBrushSize(MapEditor.brushSizes[(int) (float) f])); slider.moved(f -> editor.setBrushSize(MapEditor.brushSizes[(int) (float) f]));
@@ -450,28 +458,27 @@ public class MapEditorDialog extends Dialog implements Disposable{
mid.row(); mid.row();
mid.table("button", t -> t.add("$text.editor.elevation")) mid.table("underline", t -> t.add("$text.editor.elevation"))
.colspan(3).height(40).width(size * 3f); .colspan(3).height(40).width(size * 3f);
mid.row(); mid.row();
mid.table("button", t -> { mid.table("underline", t -> {
t.margin(0); t.margin(0);
t.addImageButton("icon-arrow-left", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() - 1)) t.addImageButton("icon-arrow-left", "clear-partial", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() - 1))
.disabled(b -> editor.getDrawElevation() <= -1).size(size); .disabled(b -> editor.getDrawElevation() <= -1).size(size);
t.label(() -> editor.getDrawElevation() == -1 ? "$text.editor.slope" : (editor.getDrawElevation() + "")) t.label(() -> editor.getDrawElevation() == -1 ? "$text.editor.slope" : (editor.getDrawElevation() + ""))
.size(size).get().setAlignment(Align.center, Align.center); .size(size).get().setAlignment(Align.center, Align.center);
t.addImageButton("icon-arrow-right", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() + 1)) t.addImageButton("icon-arrow-right", "clear-partial", 16 * 2f, () -> editor.setDrawElevation(editor.getDrawElevation() + 1))
.disabled(b -> editor.getDrawElevation() >= 63).size(size); .disabled(b -> editor.getDrawElevation() >= 63).size(size);
}).colspan(3).height(size).padTop(-5).width(size * 3f); }).colspan(3).height(size).width(size * 3f);
}).margin(0).left().growY(); }).margin(0).left().growY();
cont.table("button", t -> t.add(view).grow()) cont.table(t -> t.add(view).grow()).grow();
.margin(5).marginBottom(10).grow();
cont.table(this::addBlockSelection).right().growY(); cont.table(this::addBlockSelection).right().growY();
@@ -525,7 +532,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
private void addBlockSelection(Table table){ private void addBlockSelection(Table table){
Table content = new Table(); Table content = new Table();
pane = new ScrollPane(content, "volume"); pane = new ScrollPane(content);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
pane.setOverscroll(true, false); pane.setOverscroll(true, false);
ButtonGroup<ImageButton> group = new ButtonGroup<>(); ButtonGroup<ImageButton> group = new ButtonGroup<>();
@@ -552,7 +559,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
stack.add(new Image(region)); stack.add(new Image(region));
} }
ImageButton button = new ImageButton("white", "toggle"); ImageButton button = new ImageButton("white", "clear-toggle");
button.clicked(() -> editor.setDrawBlock(block)); button.clicked(() -> editor.setDrawBlock(block));
button.resizeImage(8 * 4f); button.resizeImage(8 * 4f);
button.getImageCell().setActor(stack); button.getImageCell().setActor(stack);
@@ -560,7 +567,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
button.getImage().remove(); button.getImage().remove();
button.update(() -> button.setChecked(editor.getDrawBlock() == block)); button.update(() -> button.setChecked(editor.getDrawBlock() == block));
group.add(button); group.add(button);
content.add(button).pad(4f).size(53f, 58f); content.add(button).size(60f);
if(i++ % 3 == 2){ if(i++ % 3 == 2){
content.row(); content.row();
@@ -569,9 +576,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
group.getButtons().get(2).setChecked(true); group.getButtons().get(2).setChecked(true);
Table extra = new Table("button"); table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center()).growX();
extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center();
table.add(extra).growX();
table.row(); table.row();
table.add(pane).growY().fillX(); table.add(pane).growY().fillX();
} }

View File

@@ -4,11 +4,9 @@ import com.badlogic.gdx.utils.Scaling;
import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.ui.BorderImage; import io.anuke.mindustry.ui.BorderImage;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.ScrollPane; import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.ScrollPane.ScrollPaneStyle;
import io.anuke.ucore.scene.ui.TextButton; import io.anuke.ucore.scene.ui.TextButton;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
@@ -69,7 +67,6 @@ public class MapLoadDialog extends FloatingDialog{
} }
if(world.maps.all().size == 0){ if(world.maps.all().size == 0){
pane.setStyle(Core.skin.get("clear", ScrollPaneStyle.class));
table.add("$text.maps.none").center(); table.add("$text.maps.none").center();
}else{ }else{
content().add("$text.editor.loadmap"); content().add("$text.editor.loadmap");

View File

@@ -74,6 +74,11 @@ public class MapRenderer implements Disposable{
for(int y = 0; y < chunks[0].length; y++){ for(int y = 0; y < chunks[0].length; y++){
IndexedRenderer mesh = chunks[x][y]; IndexedRenderer mesh = chunks[x][y];
if(mesh == null){
chunks[x][y] = new IndexedRenderer(chunksize * chunksize * 2);
mesh = chunks[x][y];
}
mesh.getTransformMatrix().setToTranslation(tx, ty, 0).scl(tw / (width * tilesize), mesh.getTransformMatrix().setToTranslation(tx, ty, 0).scl(tw / (width * tilesize),
th / (height * tilesize), 1f); th / (height * tilesize), 1f);
mesh.setProjectionMatrix(Core.batch.getProjectionMatrix()); mesh.setProjectionMatrix(Core.batch.getProjectionMatrix());

View File

@@ -270,8 +270,8 @@ public class MapView extends Element implements GestureListener{
Graphics.beginClip(x, y, width, height); Graphics.beginClip(x, y, width, height);
Draw.color(Color.LIGHT_GRAY); Draw.color(Palette.remove);
Lines.stroke(-2f); Lines.stroke(2f);
Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2);
editor.renderer().draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); editor.renderer().draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
Draw.reset(); Draw.reset();

View File

@@ -1,5 +1,6 @@
package io.anuke.mindustry.entities.traits; package io.anuke.mindustry.entities.traits;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Queue; import com.badlogic.gdx.utils.Queue;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
@@ -229,7 +230,7 @@ public interface BuilderTrait extends Entity{
} }
if(!current.initialized){ if(!current.initialized){
Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking)); Gdx.app.postRunnable(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking)));
current.initialized = true; current.initialized = true;
} }
} }

View File

@@ -97,7 +97,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
} }
public boolean isCommanded(){ public boolean isCommanded(){
return !isWave && world.indexer.getAllied(team, BlockFlag.comandCenter).size != 0; return !isWave && world.indexer.getAllied(team, BlockFlag.comandCenter).size != 0 && world.indexer.getAllied(team, BlockFlag.comandCenter).first().entity instanceof CommandCenterEntity;
} }
public UnitCommand getCommand(){ public UnitCommand getCommand(){

View File

@@ -41,7 +41,7 @@ public class UnitType extends UnlockableContent{
public float carryWeight = 1f; public float carryWeight = 1f;
public int itemCapacity = 30; public int itemCapacity = 30;
public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.copper); public ObjectSet<Item> toMine = ObjectSet.with(Items.lead, Items.copper);
public float buildPower = 0.3f, minePower = 0.7f, healSpeed = 2f; public float buildPower = 0.3f, minePower = 0.7f;
public Weapon weapon = Weapons.blaster; public Weapon weapon = Weapons.blaster;
public float weaponOffsetX, weaponOffsetY; public float weaponOffsetX, weaponOffsetY;
public Color trailColor = Color.valueOf("ffa665"); public Color trailColor = Color.valueOf("ffa665");

View File

@@ -1,8 +1,6 @@
package io.anuke.mindustry.game; package io.anuke.mindustry.game;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.ObjectMap.Entry;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.game.EventType.UnlockEvent; import io.anuke.mindustry.game.EventType.UnlockEvent;
import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.ContentType;
@@ -67,27 +65,8 @@ public class Unlocks{
save(); save();
} }
/**Loads 'legacy' unlocks. Will be removed in final release.*/
public void tryLoadLegacy(){
try{
ObjectMap<String, ObjectMap<ContentType, Array<String>>> sets = Settings.getObject("content-sets", ObjectMap.class, ObjectMap::new);
for(Entry<ContentType, Array<String>> entry : sets.get("root").entries()){
unlocked.put(entry.key, new ObjectSet<>());
unlocked.get(entry.key).addAll(entry.value);
}
}catch(Throwable t){
t.printStackTrace();
}
Settings.prefs().remove("content-sets");
Settings.save();
}
public void load(){ public void load(){
unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new); unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new);
if(Settings.has("content-sets")){
tryLoadLegacy();
}
} }
public void save(){ public void save(){

View File

@@ -17,6 +17,8 @@ public class Version{
public static int number; public static int number;
/**Build number, e.g. '43'. set to '-1' for custom builds.*/ /**Build number, e.g. '43'. set to '-1' for custom builds.*/
public static int build = 0; public static int build = 0;
/**Revision number. Used for hotfixes. Does not affect server compatibility.*/
public static int revision = 0;
public static void init(){ public static void init(){
try{ try{
@@ -28,7 +30,18 @@ public class Version{
type = map.get("type"); type = map.get("type");
number = Integer.parseInt(map.get("number")); number = Integer.parseInt(map.get("number"));
modifier = map.get("modifier"); modifier = map.get("modifier");
if(map.get("build").contains(".")){
String[] split = map.get("build").split("\\.");
try{
build = Integer.parseInt(split[0]);
revision = Integer.parseInt(split[1]);
}catch(Throwable e){
e.printStackTrace();
build = -1;
}
}else{
build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1;
}
}catch(IOException e){ }catch(IOException e){
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -2,6 +2,7 @@ package io.anuke.mindustry.graphics;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
@@ -12,16 +13,21 @@ import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class OverlayRenderer{ public class OverlayRenderer{
private static final float indicatorLength = 14f;
private static final Rectangle rect = new Rectangle();
private float buildFadeTime; private float buildFadeTime;
public void drawBottom(){ public void drawBottom(){
@@ -45,6 +51,21 @@ public class OverlayRenderer{
public void drawTop(){ public void drawTop(){
for(Player player : playerGroup.all()){
if(Settings.getBool("indicators") && player != players[0] && player.getTeam() == players[0].getTeam()){
if(!rect.setSize(Core.camera.viewportWidth * Core.camera.zoom * 0.9f, Core.camera.viewportHeight * Core.camera.zoom * 0.9f)
.setCenter(Core.camera.position.x, Core.camera.position.y).contains(player.x, player.y)){
Tmp.v1.set(player.x, player.y).sub(Core.camera.position.x, Core.camera.position.y).setLength(indicatorLength);
Draw.color(player.getTeam().color);
Lines.stroke(2f);
Lines.lineAngle(Core.camera.position.x + Tmp.v1.x, Core.camera.position.y + Tmp.v1.y, Tmp.v1.angle(), 4f);
Draw.reset();
}
}
}
for(Player player : players){ for(Player player : players){
if(player.isDead()) continue; //dead players don't draw if(player.isDead()) continue; //dead players don't draw

View File

@@ -45,6 +45,7 @@ public class MobileInput extends InputHandler implements GestureListener{
//gesture data //gesture data
private Vector2 vector = new Vector2(); private Vector2 vector = new Vector2();
private boolean canPan;
private boolean zoomed = false; private boolean zoomed = false;
/** Set of completed guides. */ /** Set of completed guides. */
private ObjectSet<String> guides = new ObjectSet<>(); private ObjectSet<String> guides = new ObjectSet<>();
@@ -241,8 +242,10 @@ public class MobileInput extends InputHandler implements GestureListener{
if(tile != null){ if(tile != null){
if(!request.remove){ if(!request.remove){
rotation = request.rotation; rotation = request.rotation;
Recipe before = recipe;
recipe = request.recipe; recipe = request.recipe;
tryPlaceBlock(tile.x, tile.y); tryPlaceBlock(tile.x, tile.y);
recipe = before;
}else{ }else{
tryBreakBlock(tile.x, tile.y); tryBreakBlock(tile.x, tile.y);
} }
@@ -650,7 +653,7 @@ public class MobileInput extends InputHandler implements GestureListener{
@Override @Override
public boolean pan(float x, float y, float deltaX, float deltaY){ public boolean pan(float x, float y, float deltaX, float deltaY){
if(ui.hasMouse()) return false; if(!canPan) return false;
//can't pan in line mode with one finger or while dropping items! //can't pan in line mode with one finger or while dropping items!
if((lineMode && !Gdx.input.isTouched(1)) || droppingItem){ if((lineMode && !Gdx.input.isTouched(1)) || droppingItem){
@@ -704,6 +707,7 @@ public class MobileInput extends InputHandler implements GestureListener{
@Override @Override
public boolean touchDown(float x, float y, int pointer, int button){ public boolean touchDown(float x, float y, int pointer, int button){
canPan = !ui.hasMouse();
return false; return false;
} }

View File

@@ -356,13 +356,12 @@ public class Net{
Gdx.net.sendHttpRequest(req, new HttpResponseListener(){ Gdx.net.sendHttpRequest(req, new HttpResponseListener(){
@Override @Override
public void handleHttpResponse(HttpResponse httpResponse){ public void handleHttpResponse(HttpResponse httpResponse){
String result = httpResponse.getResultAsString(); listener.accept(httpResponse.getResultAsString());
Gdx.app.postRunnable(() -> listener.accept(result));
} }
@Override @Override
public void failed(Throwable t){ public void failed(Throwable t){
Gdx.app.postRunnable(() -> failure.accept(t)); failure.accept(t);
} }
@Override @Override

View File

@@ -298,7 +298,7 @@ public class NetworkIO{
int maxlen = 32; int maxlen = 32;
String host = (headless ? "Server" : players[0].name); String host = (headless ? "Server" : players[0].name);
String map = world.getMap().name; String map = world.getMap() == null ? "None" : world.getMap().name;
host = host.substring(0, Math.min(host.length(), maxlen)); host = host.substring(0, Math.min(host.length(), maxlen));
map = map.substring(0, Math.min(map.length(), maxlen)); map = map.substring(0, Math.min(map.length(), maxlen));

View File

@@ -22,7 +22,7 @@ public class MenuButton extends TextButton{
table(t -> { table(t -> {
t.addImage(icon).size(14 * 3); t.addImage(icon).size(14 * 3);
t.update(() -> t.setBackground(getClickListener().isOver() || getClickListener().isVisualPressed() ? "button-over" : "button")); t.update(() -> t.setBackground(getClickListener().isVisualPressed() ? "button-down" : getClickListener().isOver() ? "button-over" : "button"));
}).size(s - 5, s); }).size(s - 5, s);

View File

@@ -16,10 +16,9 @@ import static io.anuke.mindustry.Vars.*;
public class Minimap extends Table{ public class Minimap extends Table{
public Minimap(){ public Minimap(){
super("button"); super("pane");
margin(5); margin(5);
marginBottom(10);
TextureRegion r = new TextureRegion(); TextureRegion r = new TextureRegion();

View File

@@ -42,14 +42,14 @@ public class AboutDialog extends FloatingDialog{
float w = UIUtils.portrait() ? 330f : 600f; float w = UIUtils.portrait() ? 330f : 600f;
Table in = new Table(); Table in = new Table();
ScrollPane pane = new ScrollPane(in, "clear"); ScrollPane pane = new ScrollPane(in);
for(LinkEntry link : Links.getLinks()){ for(LinkEntry link : Links.getLinks()){
if((ios || OS.isMac) && bannedItems.contains(link.name)){ //because Apple doesn't like me mentioning things if((ios || OS.isMac) && bannedItems.contains(link.name)){ //because Apple doesn't like me mentioning things
continue; continue;
} }
Table table = new Table("button"); Table table = new Table("underline-2");
table.margin(0); table.margin(0);
table.table(img -> { table.table(img -> {
img.addImage("white").height(h - 5).width(40f).color(link.color); img.addImage("white").height(h - 5).width(40f).color(link.color);
@@ -58,7 +58,7 @@ public class AboutDialog extends FloatingDialog{
}).expandY(); }).expandY();
table.table(i -> { table.table(i -> {
i.background("button"); i.background("button-edge-3");
i.addImage("icon-" + link.name).size(14 * 3f); i.addImage("icon-" + link.name).size(14 * 3f);
}).size(h - 5, h); }).size(h - 5, h);
@@ -108,7 +108,7 @@ public class AboutDialog extends FloatingDialog{
dialog.content().row(); dialog.content().row();
dialog.content().add("$text.contributors"); dialog.content().add("$text.contributors");
dialog.content().row(); dialog.content().row();
dialog.content().pane("clear", new Table(){{ dialog.content().pane(new Table(){{
int i = 0; int i = 0;
left(); left();
for(Contributor c : contributors){ for(Contributor c : contributors){

View File

@@ -24,7 +24,7 @@ public class AdminsDialog extends FloatingDialog{
Table table = new Table(); Table table = new Table();
ScrollPane pane = new ScrollPane(table, "clear"); ScrollPane pane = new ScrollPane(table);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
if(netServer.admins.getAdmins().size == 0){ if(netServer.admins.getAdmins().size == 0){
@@ -41,17 +41,10 @@ public class AdminsDialog extends FloatingDialog{
ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> { ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> {
netServer.admins.unAdminPlayer(info.id); netServer.admins.unAdminPlayer(info.id);
playerGroup.forEach(player -> { playerGroup.forEach(player -> {
if(player.uuid.equals(info.id)){ if(player != null && player.uuid != null && player.uuid.equals(info.id)){
player.isAdmin = false; player.isAdmin = false;
} }
}); });
/*
for(Player player : playerGroup.all()){
if(player.con != null){
player.isAdmin = false;
break;
}
}*/
setup(); setup();
}); });
}).size(h).pad(-14f); }).size(h).pad(-14f);

View File

@@ -25,7 +25,7 @@ public class BansDialog extends FloatingDialog{
Table table = new Table(); Table table = new Table();
ScrollPane pane = new ScrollPane(table, "clear"); ScrollPane pane = new ScrollPane(table);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
if(netServer.admins.getBanned().size == 0){ if(netServer.admins.getBanned().size == 0){

View File

@@ -38,7 +38,7 @@ public class ChangelogDialog extends FloatingDialog{
void setup(){ void setup(){
Table table = new Table(); Table table = new Table();
ScrollPane pane = new ScrollPane(table, "clear"); ScrollPane pane = new ScrollPane(table);
content().clear(); content().clear();
content().add(pane).grow(); content().add(pane).grow();
@@ -60,7 +60,7 @@ public class ChangelogDialog extends FloatingDialog{
desc = desc.replace("Android", "Mobile"); desc = desc.replace("Android", "Mobile");
Table in = new Table("clear"); Table in = new Table("underline");
in.top().left().margin(10); in.top().left().margin(10);
in.add("[accent]" + info.name + "[LIGHT_GRAY] | " + info.date); in.add("[accent]" + info.name + "[LIGHT_GRAY] | " + info.date);

View File

@@ -25,10 +25,10 @@ public class ColorPickDialog extends Dialog{
for(int i = 0; i < playerColors.length; i++){ for(int i = 0; i < playerColors.length; i++){
Color color = playerColors[i]; Color color = playerColors[i];
ImageButton button = table.addImageButton("white", "toggle", 34, () -> { ImageButton button = table.addImageButton("white", "clear-toggle", 34, () -> {
cons.accept(color); cons.accept(color);
hide(); hide();
}).size(44, 48).pad(0).padBottom(-5.1f).get(); }).size(48).get();
button.setChecked(players[0].color.equals(color)); button.setChecked(players[0].color.equals(color));
button.getStyle().imageUpColor = color; button.getStyle().imageUpColor = color;

View File

@@ -20,7 +20,7 @@ public class ContentInfoDialog extends FloatingDialog{
content.displayInfo(table); content.displayInfo(table);
ScrollPane pane = new ScrollPane(table, "clear-black"); ScrollPane pane = new ScrollPane(table);
content().add(pane); content().add(pane);
show(); show();

View File

@@ -23,7 +23,7 @@ import static io.anuke.mindustry.Vars.*;
public class CustomGameDialog extends FloatingDialog{ public class CustomGameDialog extends FloatingDialog{
public CustomGameDialog(){ public CustomGameDialog(){
super("$text.level.select"); super("$text.customgame");
addCloseButton(); addCloseButton();
shown(this::setup); shown(this::setup);
@@ -35,7 +35,7 @@ public class CustomGameDialog extends FloatingDialog{
Table maps = new Table(); Table maps = new Table();
maps.marginRight(14); maps.marginRight(14);
ScrollPane pane = new ScrollPane(maps, "clear-black"); ScrollPane pane = new ScrollPane(maps);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
int maxwidth = (Gdx.graphics.getHeight() > Gdx.graphics.getHeight() ? 2 : 4); int maxwidth = (Gdx.graphics.getHeight() > Gdx.graphics.getHeight() ? 2 : 4);
@@ -52,7 +52,7 @@ public class CustomGameDialog extends FloatingDialog{
if(mode.hidden) continue; if(mode.hidden) continue;
modes.addButton("$mode." + mode.name() + ".name", "toggle", () -> state.mode = mode) modes.addButton("$mode." + mode.name() + ".name", "toggle", () -> state.mode = mode)
.update(b -> b.setChecked(state.mode == mode)).group(group).size(140f, 54f).padBottom(-5); .update(b -> b.setChecked(state.mode == mode)).group(group).size(140f, 54f);
if(i++ % 2 == 1) modes.row(); if(i++ % 2 == 1) modes.row();
} }
selmode.add(modes); selmode.add(modes);
@@ -139,7 +139,7 @@ public class CustomGameDialog extends FloatingDialog{
d.setFillParent(false); d.setFillParent(false);
Table table = new Table(); Table table = new Table();
table.defaults().pad(1f); table.defaults().pad(1f);
ScrollPane pane = new ScrollPane(table, "clear"); ScrollPane pane = new ScrollPane(table);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
table.row(); table.row();
for(GameMode mode : GameMode.values()){ for(GameMode mode : GameMode.values()){

View File

@@ -34,13 +34,13 @@ public class HostDialog extends FloatingDialog{
ui.listfrag.rebuild(); ui.listfrag.rebuild();
}).grow().pad(8).get().setMaxLength(40); }).grow().pad(8).get().setMaxLength(40);
ImageButton button = t.addImageButton("white", 40, () -> { ImageButton button = t.addImageButton("white", "clear-full", 40, () -> {
new ColorPickDialog().show(color -> { new ColorPickDialog().show(color -> {
player.color.set(color); player.color.set(color);
Settings.putInt("color-0", Color.rgba8888(color)); Settings.putInt("color-0", Color.rgba8888(color));
Settings.save(); Settings.save();
}); });
}).size(50f, 54f).get(); }).size(54f).get();
button.update(() -> button.getStyle().imageUpColor = player.color); button.update(() -> button.getStyle().imageUpColor = player.color);
}).width(w).height(70f).pad(4).colspan(3); }).width(w).height(70f).pad(4).colspan(3);

View File

@@ -100,7 +100,7 @@ public class JoinDialog extends FloatingDialog{
if(!buttons[0].childrenPressed()){ if(!buttons[0].childrenPressed()){
connect(server.ip, server.port); connect(server.ip, server.port);
} }
}).width(targetWidth()).height(150f).pad(4f).get(); }).width(targetWidth()).height(155f).pad(4f).get();
button.getLabel().setWrap(true); button.getLabel().setWrap(true);
@@ -156,10 +156,10 @@ public class JoinDialog extends FloatingDialog{
versionString = Bundles.get("text.server.outdated"); versionString = Bundles.get("text.server.outdated");
}else if(host.version < Version.build && Version.build != -1){ }else if(host.version < Version.build && Version.build != -1){
versionString = Bundles.get("text.server.outdated") + "\n" + versionString = Bundles.get("text.server.outdated") + "\n" +
Bundles.format("text.server.version", host.version); Bundles.format("text.server.version", host.version, "");
}else if(host.version > Version.build && Version.build != -1){ }else if(host.version > Version.build && Version.build != -1){
versionString = Bundles.get("text.server.outdated.client") + "\n" + versionString = Bundles.get("text.server.outdated.client") + "\n" +
Bundles.format("text.server.version", host.version); Bundles.format("text.server.version", host.version, "");
}else{ }else{
versionString = Bundles.format("text.server.version", host.version, host.versionType); versionString = Bundles.format("text.server.version", host.version, host.versionType);
} }
@@ -194,7 +194,7 @@ public class JoinDialog extends FloatingDialog{
hosts.row(); hosts.row();
hosts.add(local).width(w); hosts.add(local).width(w);
ScrollPane pane = new ScrollPane(hosts, "clear"); ScrollPane pane = new ScrollPane(hosts);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
pane.setScrollingDisabled(true, false); pane.setScrollingDisabled(true, false);
@@ -210,19 +210,19 @@ public class JoinDialog extends FloatingDialog{
Settings.save(); Settings.save();
}).grow().pad(8).get().setMaxLength(maxNameLength); }).grow().pad(8).get().setMaxLength(maxNameLength);
ImageButton button = t.addImageButton("white", 40, () -> { ImageButton button = t.addImageButton("white", "clear-full", 40, () -> {
new ColorPickDialog().show(color -> { new ColorPickDialog().show(color -> {
player.color.set(color); player.color.set(color);
Settings.putInt("color-0", Color.rgba8888(color)); Settings.putInt("color-0", Color.rgba8888(color));
Settings.save(); Settings.save();
}); });
}).size(50f, 54f).get(); }).size(54f).get();
button.update(() -> button.getStyle().imageUpColor = player.color); button.update(() -> button.getStyle().imageUpColor = player.color);
}).width(w).height(70f).pad(4); }).width(w).height(70f).pad(4);
content().row(); content().row();
content().add(pane).width(w + 38).pad(0); content().add(pane).width(w + 38).pad(0);
content().row(); content().row();
content().addCenteredImageTextButton("$text.server.add", "icon-add", "clear", 14 * 3, () -> { content().addCenteredImageTextButton("$text.server.add", "icon-add", 14 * 3, () -> {
renaming = null; renaming = null;
add.show(); add.show();
}).marginLeft(6).width(w).height(80f).update(button -> { }).marginLeft(6).width(w).height(80f).update(button -> {
@@ -258,7 +258,7 @@ public class JoinDialog extends FloatingDialog{
local.background("button"); local.background("button");
local.add("$text.hosts.none").pad(10f); local.add("$text.hosts.none").pad(10f);
local.add().growX(); local.add().growX();
local.addImageButton("icon-loading", 16 * 2f, this::refreshLocal).pad(-10f).padLeft(0).padTop(-6).size(70f, 74f); local.addImageButton("icon-loading", 16 * 2f, this::refreshLocal).pad(-12f).padLeft(0).size(70f);
}else{ }else{
local.background((Drawable) null); local.background((Drawable) null);
} }

View File

@@ -24,7 +24,7 @@ public class LanguageDialog extends FloatingDialog{
private void setup(){ private void setup(){
Table langs = new Table(); Table langs = new Table();
langs.marginRight(24f).marginLeft(24f); langs.marginRight(24f).marginLeft(24f);
ScrollPane pane = new ScrollPane(langs, "clear"); ScrollPane pane = new ScrollPane(langs);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
ButtonGroup<TextButton> group = new ButtonGroup<>(); ButtonGroup<TextButton> group = new ButtonGroup<>();
@@ -38,7 +38,7 @@ public class LanguageDialog extends FloatingDialog{
Log.info("Setting locale: {0}", loc.toString()); Log.info("Setting locale: {0}", loc.toString());
ui.showInfo("$text.language.restart"); ui.showInfo("$text.language.restart");
}); });
langs.add(button).group(group).update(t -> t.setChecked(loc.equals(getLocale()))).size(400f, 50f).row(); langs.add(button).group(group).update(t -> t.setChecked(loc.equals(getLocale()))).size(400f, 50f).pad(2).row();
} }
content().add(pane); content().add(pane);

View File

@@ -45,7 +45,7 @@ public class LoadDialog extends FloatingDialog{
content().clear(); content().clear();
slots = new Table(); slots = new Table();
pane = new ScrollPane(slots, "clear-black"); pane = new ScrollPane(slots);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
pane.setScrollingDisabled(true, false); pane.setScrollingDisabled(true, false);
@@ -146,7 +146,7 @@ public class LoadDialog extends FloatingDialog{
if(!valids){ if(!valids){
slots.row(); slots.row();
slots.addButton("$text.save.none", "clear", () -> { slots.addButton("$text.save.none", () -> {
}).disabled(true).fillX().margin(20f).minWidth(340f).height(80f).pad(4f); }).disabled(true).fillX().margin(20f).minWidth(340f).height(80f).pad(4f);
} }
@@ -154,7 +154,7 @@ public class LoadDialog extends FloatingDialog{
if(ios) return; if(ios) return;
slots.addImageTextButton("$text.save.import", "icon-add", "clear", 14 * 3, () -> { slots.addImageTextButton("$text.save.import", "icon-add", 14 * 3, () -> {
Platform.instance.showFileChooser(Bundles.get("text.save.import"), "Mindustry Save", file -> { Platform.instance.showFileChooser(Bundles.get("text.save.import"), "Mindustry Save", file -> {
if(SaveIO.isSaveValid(file)){ if(SaveIO.isSaveValid(file)){
try{ try{

View File

@@ -4,8 +4,8 @@ import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Scaling; import com.badlogic.gdx.utils.Scaling;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.io.MapIO; import io.anuke.mindustry.io.MapIO;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.maps.MapMeta; import io.anuke.mindustry.maps.MapMeta;
import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.maps.MapTileData;
import io.anuke.mindustry.ui.BorderImage; import io.anuke.mindustry.ui.BorderImage;
@@ -73,7 +73,7 @@ public class MapsDialog extends FloatingDialog{
Table maps = new Table(); Table maps = new Table();
maps.marginRight(24); maps.marginRight(24);
ScrollPane pane = new ScrollPane(maps, "clear-black"); ScrollPane pane = new ScrollPane(maps);
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
int maxwidth = 4; int maxwidth = 4;
@@ -88,7 +88,7 @@ public class MapsDialog extends FloatingDialog{
TextButton button = maps.addButton("", "clear", () -> showMapInfo(map)).width(mapsize).pad(8).get(); TextButton button = maps.addButton("", "clear", () -> showMapInfo(map)).width(mapsize).pad(8).get();
button.clearChildren(); button.clearChildren();
button.margin(6); button.margin(9);
button.add(map.meta.tags.get("name", map.name)).growX().center().get().setEllipsis(true); button.add(map.meta.tags.get("name", map.name)).growX().center().get().setEllipsis(true);
button.row(); button.row();
button.addImage("white").growX().pad(4).color(Color.GRAY); button.addImage("white").growX().pad(4).color(Color.GRAY);
@@ -116,12 +116,12 @@ public class MapsDialog extends FloatingDialog{
table.stack(new Image(map.texture).setScaling(Scaling.fit), new BorderImage(map.texture).setScaling(Scaling.fit)).size(mapsize); table.stack(new Image(map.texture).setScaling(Scaling.fit), new BorderImage(map.texture).setScaling(Scaling.fit)).size(mapsize);
table.table("clear", desc -> { table.table("flat", desc -> {
desc.top(); desc.top();
Table t = new Table(); Table t = new Table();
t.margin(6); t.margin(6);
ScrollPane pane = new ScrollPane(t, "clear-black"); ScrollPane pane = new ScrollPane(t);
desc.add(pane).grow(); desc.add(pane).grow();
t.top(); t.top();
@@ -146,7 +146,7 @@ public class MapsDialog extends FloatingDialog{
table.row(); table.row();
table.addImageTextButton("$text.editor.openin", "icon-load-map", "clear", 16 * 2, () -> { table.addImageTextButton("$text.editor.openin", "icon-load-map", 16 * 2, () -> {
try{ try{
Vars.ui.editor.beginEditMap(map.stream.get()); Vars.ui.editor.beginEditMap(map.stream.get());
dialog.hide(); dialog.hide();
@@ -155,15 +155,15 @@ public class MapsDialog extends FloatingDialog{
e.printStackTrace(); e.printStackTrace();
ui.showError("$text.error.mapnotfound"); ui.showError("$text.error.mapnotfound");
} }
}).fillX().height(50f).marginLeft(6); }).fillX().height(54f).marginLeft(10);
table.addImageTextButton("$text.delete", "icon-trash-16", "clear", 16 * 2, () -> { table.addImageTextButton("$text.delete", "icon-trash-16", 16 * 2, () -> {
ui.showConfirm("$text.confirm", Bundles.format("text.map.delete", map.name), () -> { ui.showConfirm("$text.confirm", Bundles.format("text.map.delete", map.name), () -> {
world.maps.removeMap(map); world.maps.removeMap(map);
dialog.hide(); dialog.hide();
setup(); setup();
}); });
}).fillX().height(50f).marginLeft(6).disabled(!map.custom).touchable(map.custom ? Touchable.enabled : Touchable.disabled); }).fillX().height(54f).marginLeft(10).disabled(!map.custom).touchable(map.custom ? Touchable.enabled : Touchable.disabled);
dialog.show(); dialog.show();
} }

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.dialogs;
import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.Input.Keys;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.ucore.scene.style.Drawable;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
@@ -29,13 +30,9 @@ public class PausedDialog extends FloatingDialog{
void rebuild(){ void rebuild(){
missionTable.clear(); missionTable.clear();
if(world.getSector() != null && !world.getSector().complete){ missionTable.background((Drawable) null);
missionTable.add("[LIGHT_GRAY]" + Bundles.format("text.mission", "")); if(world.getSector() != null){
missionTable.row(); missionTable.background("underline");
missionTable.table(t -> {
world.getSector().currentMission().display(t);
});
missionTable.row();
missionTable.add(Bundles.format("text.sector", world.getSector().x + ", " + world.getSector().y)); missionTable.add(Bundles.format("text.sector", world.getSector().x + ", " + world.getSector().y));
} }
} }
@@ -47,31 +44,26 @@ public class PausedDialog extends FloatingDialog{
} }
}); });
content().table(t -> missionTable = t).colspan(mobile ? 3 : 1); content().table(t -> missionTable = t).colspan(mobile ? 3 : 2);
content().row(); content().row();
if(!mobile){ if(!mobile){
content().defaults().width(220).height(50); float dw = 210f;
content().defaults().width(dw).height(50).pad(5f);
content().addButton("$text.back", () -> { content().addButton("$text.back", this::hide).colspan(2).width(dw*2 + 20f);
hide();
});
content().row(); content().row();
content().addButton("$text.unlocks", ui.unlocks::show); content().addButton("$text.unlocks", ui.unlocks::show);
content().row();
content().addButton("$text.settings", ui.settings::show); content().addButton("$text.settings", ui.settings::show);
content().row(); content().row();
content().addButton("$text.savegame", save::show).disabled(s -> world.getSector() != null); content().addButton("$text.savegame", save::show).disabled(s -> world.getSector() != null);
content().row();
content().addButton("$text.loadgame", load::show).disabled(b -> Net.active()); content().addButton("$text.loadgame", load::show).disabled(b -> Net.active());
content().row(); content().row();
content().addButton("$text.hostserver", ui.host::show).disabled(b -> Net.active()); content().addButton("$text.hostserver", ui.host::show).disabled(b -> Net.active()).colspan(2).width(dw*2 + 20f);
content().row(); content().row();
@@ -81,7 +73,7 @@ public class PausedDialog extends FloatingDialog{
runExitSave(); runExitSave();
hide(); hide();
}); });
}); }).colspan(2).width(dw + 10f);
}else{ }else{
content().defaults().size(120f).pad(5); content().defaults().size(120f).pad(5);

View File

@@ -22,7 +22,7 @@ public class SaveDialog extends LoadDialog{
public void addSetup(){ public void addSetup(){
slots.row(); slots.row();
slots.addImageTextButton("$text.save.new", "icon-add", "clear", 14 * 3, () -> slots.addImageTextButton("$text.save.new", "icon-add",14 * 3, () ->
ui.showTextInput("$text.save", "$text.save.newslot", "", text -> { ui.showTextInput("$text.save", "$text.save.newslot", "", text -> {
ui.loadGraphics("$text.saving", () -> { ui.loadGraphics("$text.saving", () -> {
control.saves.addSave(text); control.saves.addSave(text);

View File

@@ -95,7 +95,7 @@ public class SettingsMenuDialog extends SettingsDialog{
prefs.clearChildren(); prefs.clearChildren();
prefs.add(menu); prefs.add(menu);
ScrollPane pane = new ScrollPane(prefs, "clear"); ScrollPane pane = new ScrollPane(prefs);
pane.addCaptureListener(new InputListener(){ pane.addCaptureListener(new InputListener(){
@Override @Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){ public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
@@ -148,21 +148,21 @@ public class SettingsMenuDialog extends SettingsDialog{
dialog.setFillParent(false); dialog.setFillParent(false);
dialog.content().defaults().size(230f, 60f).pad(3); dialog.content().defaults().size(230f, 60f).pad(3);
dialog.addCloseButton(); dialog.addCloseButton();
dialog.content().addButton("$text.settings.clearsectors", "clear", () -> { dialog.content().addButton("$text.settings.clearsectors", () -> {
ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> {
world.sectors.clear(); world.sectors.clear();
dialog.hide(); dialog.hide();
}); });
}); });
dialog.content().row(); dialog.content().row();
dialog.content().addButton("$text.settings.clearunlocks", "clear", () -> { dialog.content().addButton("$text.settings.clearunlocks", () -> {
ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> {
control.unlocks.reset(); control.unlocks.reset();
dialog.hide(); dialog.hide();
}); });
}); });
dialog.content().row(); dialog.content().row();
dialog.content().addButton("$text.settings.clearall", "clear", () -> { dialog.content().addButton("$text.settings.clearall", () -> {
ui.showConfirm("$text.confirm", "$text.settings.clearall.confirm", () -> { ui.showConfirm("$text.confirm", "$text.settings.clearall.confirm", () -> {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
for(String value : Settings.prefs().get().keySet()){ for(String value : Settings.prefs().get().keySet()){
@@ -208,6 +208,7 @@ public class SettingsMenuDialog extends SettingsDialog{
} }
graphics.checkPref("fps", false); graphics.checkPref("fps", false);
graphics.checkPref("indicators", true);
graphics.checkPref("lasers", true); graphics.checkPref("lasers", true);
graphics.checkPref("minimap", !mobile); //minimap is disabled by default on mobile devices graphics.checkPref("minimap", !mobile); //minimap is disabled by default on mobile devices
} }

View File

@@ -32,7 +32,7 @@ public class UnlocksDialog extends FloatingDialog{
Table table = new Table(); Table table = new Table();
table.margin(20); table.margin(20);
ScrollPane pane = new ScrollPane(table, "clear-black"); ScrollPane pane = new ScrollPane(table);
Array<Content>[] allContent = content.getContentMap(); Array<Content>[] allContent = content.getContentMap();
@@ -65,9 +65,8 @@ public class UnlocksDialog extends FloatingDialog{
if(control.unlocks.isUnlocked(unlock)){ if(control.unlocks.isUnlocked(unlock)){
image.clicked(() -> Vars.ui.content.show(unlock)); image.clicked(() -> Vars.ui.content.show(unlock));
image.addListener(new Tooltip<>(new Table("clear"){{ image.addListener(new Tooltip<>(new Table("button"){{
add(unlock.localizedName()); add(unlock.localizedName());
margin(4);
}})); }}));
} }

View File

@@ -11,6 +11,7 @@ import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.EventType.StateChangeEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.net.Packets.AdminAction;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
@@ -23,9 +24,13 @@ import io.anuke.ucore.scene.Element;
import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.Group;
import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.actions.Actions;
import io.anuke.ucore.scene.event.Touchable; import io.anuke.ucore.scene.event.Touchable;
import io.anuke.ucore.scene.ui.*; import io.anuke.ucore.scene.ui.Image;
import io.anuke.ucore.scene.ui.ImageButton;
import io.anuke.ucore.scene.ui.Label;
import io.anuke.ucore.scene.ui.TextButton;
import io.anuke.ucore.scene.ui.layout.Stack; import io.anuke.ucore.scene.ui.layout.Stack;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
@@ -59,10 +64,10 @@ public class HudFragment extends Fragment{
select.left(); select.left();
select.defaults().size(dsize).left(); select.defaults().size(dsize).left();
menu = select.addImageButton("icon-menu", isize, ui.paused::show).get(); menu = select.addImageButton("icon-menu", "clear", isize, ui.paused::show).get();
flip = select.addImageButton("icon-arrow-up", isize, this::toggleMenus).get(); flip = select.addImageButton("icon-arrow-up", "clear", isize, this::toggleMenus).get();
select.addImageButton("icon-pause", isize, () -> { select.addImageButton("icon-pause", "clear", isize, () -> {
if(Net.active()){ if(Net.active()){
ui.listfrag.toggle(); ui.listfrag.toggle();
}else{ }else{
@@ -77,7 +82,7 @@ public class HudFragment extends Fragment{
} }
}).get(); }).get();
select.addImageButton("icon-settings", isize, () -> { select.addImageButton("icon-settings", "clear", isize, () -> {
if(Net.active() && mobile){ if(Net.active() && mobile){
if(ui.chatfrag.chatOpen()){ if(ui.chatfrag.chatOpen()){
ui.chatfrag.hide(); ui.chatfrag.hide();
@@ -94,9 +99,13 @@ public class HudFragment extends Fragment{
i.getStyle().imageUp = Core.skin.getDrawable("icon-unlocks"); i.getStyle().imageUp = Core.skin.getDrawable("icon-unlocks");
} }
}).get(); }).get();
select.addImage("blank").color(Palette.accent).width(6f).fillY();
}); });
cont.row(); cont.row();
cont.addImage("blank").height(6f).color(Palette.accent).fillX();
cont.row();
} }
cont.update(() -> { cont.update(() -> {
@@ -106,7 +115,7 @@ public class HudFragment extends Fragment{
}); });
Stack stack = new Stack(); Stack stack = new Stack();
TextButton waves = new TextButton(""); TextButton waves = new TextButton("", "wave");
Table btable = new Table().margin(0); Table btable = new Table().margin(0);
stack.add(waves); stack.add(waves);
@@ -116,7 +125,7 @@ public class HudFragment extends Fragment{
addWaveTable(waves); addWaveTable(waves);
addPlayButton(btable); addPlayButton(btable);
cont.add(stack).width(dsize * 4); cont.add(stack).width(dsize * 4 + 6f);
cont.row(); cont.row();
@@ -145,12 +154,12 @@ public class HudFragment extends Fragment{
//paused table //paused table
parent.fill(t -> { parent.fill(t -> {
t.top().visible(() -> state.is(State.paused) && !Net.active()); t.top().visible(() -> state.is(State.paused) && !Net.active());
t.table("clear", top -> top.add("$text.paused").pad(6).get().setFontScale(1.5f)); t.table("button", top -> top.add("$text.paused").pad(6f));
}); });
parent.fill(t -> { parent.fill(t -> {
t.visible(() -> netServer.isWaitingForPlayers() && !state.is(State.menu)); t.visible(() -> netServer.isWaitingForPlayers() && !state.is(State.menu));
t.table("clear", c -> c.margin(10).add("$text.waiting.players")); t.table("button", c -> c.add("$text.waiting.players"));
}); });
//'core is under attack' table //'core is under attack' table
@@ -188,7 +197,7 @@ public class HudFragment extends Fragment{
return coreAttackOpacity > 0; return coreAttackOpacity > 0;
}); });
t.table("clear", top -> top.add("$text.coreattack").pad(6) t.table("button", top -> top.add("$text.coreattack").pad(2)
.update(label -> label.setColor(Hue.mix(Color.ORANGE, Color.SCARLET, Mathf.absin(Timers.time(), 2f, 1f))))); .update(label -> label.setColor(Hue.mix(Color.ORANGE, Color.SCARLET, Mathf.absin(Timers.time(), 2f, 1f)))));
}); });
@@ -342,7 +351,7 @@ public class HudFragment extends Fragment{
if(shown){ if(shown){
shown = false; shown = false;
blockfrag.toggle(dur, in); blockfrag.toggle(dur, in);
wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + dsize) - wavetable.getTranslation().y, dur, in)); wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + Unit.dp.scl(dsize) + Unit.dp.scl(6)) - wavetable.getTranslation().y, dur, in));
infolabel.actions(Actions.translateBy(0, (wavetable.getHeight()) - wavetable.getTranslation().y, dur, in)); infolabel.actions(Actions.translateBy(0, (wavetable.getHeight()) - wavetable.getTranslation().y, dur, in));
}else{ }else{
shown = true; shown = true;
@@ -361,8 +370,6 @@ public class HudFragment extends Fragment{
table.clearChildren(); table.clearChildren();
table.setTouchable(Touchable.enabled); table.setTouchable(Touchable.enabled);
table.background("button");
table.labelWrap(() -> table.labelWrap(() ->
world.getSector() == null ? world.getSector() == null ?
(state.enemies() > 0 && state.mode.disableWaveTimer ? (state.enemies() > 0 && state.mode.disableWaveTimer ?
@@ -386,7 +393,7 @@ public class HudFragment extends Fragment{
} }
private void addPlayButton(Table table){ private void addPlayButton(Table table){
table.right().addImageButton("icon-play", 30f, () -> { table.right().addImageButton("icon-play", "right", 30f, () -> {
if(Net.client() && players[0].isAdmin){ if(Net.client() && players[0].isAdmin){
Call.onAdminRequest(players[0], AdminAction.wave); Call.onAdminRequest(players[0], AdminAction.wave);
}else{ }else{

View File

@@ -43,7 +43,8 @@ public class MenuFragment extends Fragment{
} }
//version info //version info
parent.fill(c -> c.bottom().left().add(Strings.formatArgs("Mindustry v{0} {1}-{2} {3}", Version.number, Version.modifier, Version.type, (Version.build == -1 ? "custom build" : "build " + Version.build))) parent.fill(c -> c.bottom().left().add(Strings.formatArgs("Mindustry v{0} {1}-{2} {3}{4}", Version.number, Version.modifier, Version.type,
(Version.build == -1 ? "custom build" : "build " + Version.build), Version.revision == 0 ? "" : "." + Version.revision))
.visible(() -> state.is(State.menu))); .visible(() -> state.is(State.menu)));
} }

View File

@@ -106,7 +106,7 @@ public class PlacementFragment extends Fragment{
}; };
//top table with hover info //top table with hover info
frame.table("clear", top -> { frame.table("button-edge-2", top -> {
topTable = top; topTable = top;
top.add(new Table()).growX().update(topTable -> { top.add(new Table()).growX().update(topTable -> {
if((tileDisplayBlock() == null && lastDisplay == getSelected()) || if((tileDisplayBlock() == null && lastDisplay == getSelected()) ||
@@ -160,16 +160,16 @@ public class PlacementFragment extends Fragment{
topTable.labelWrap(lastDisplay.getDisplayName(hoverTile)).left().width(190f).padLeft(5); topTable.labelWrap(lastDisplay.getDisplayName(hoverTile)).left().width(190f).padLeft(5);
} }
}); });
top.row();
top.addImage("blank").growX().color(Palette.accent).height(3f);
}).colspan(3).fillX().visible(() -> getSelected() != null || tileDisplayBlock() != null).touchable(Touchable.enabled); }).colspan(3).fillX().visible(() -> getSelected() != null || tileDisplayBlock() != null).touchable(Touchable.enabled);
frame.row(); frame.row();
frame.table("clear", blocksSelect -> { frame.addImage("blank").color(Palette.accent).colspan(3).height(3*2).growX();
frame.row();
frame.table("pane-2", blocksSelect -> {
blocksSelect.margin(4).marginTop(0);
blocksSelect.table(blocks -> blockTable = blocks).grow(); blocksSelect.table(blocks -> blockTable = blocks).grow();
blocksSelect.row(); blocksSelect.row();
blocksSelect.table(input::buildUI).growX(); blocksSelect.table(input::buildUI).growX();
}).fillY().bottom().touchable(Touchable.enabled); }).fillY().bottom().touchable(Touchable.enabled);
frame.addImage("blank").width(3f).fillY().color(Palette.accent);
frame.table(categories -> { frame.table(categories -> {
categories.defaults().size(50f); categories.defaults().size(50f);

View File

@@ -45,13 +45,13 @@ public class PlayerListFragment extends Fragment{
} }
}); });
cont.table("pane", pane -> { cont.table("button", pane -> {
pane.label(() -> Bundles.format(playerGroup.size() == 1 ? "text.players.single" : "text.players", playerGroup.size())); pane.label(() -> Bundles.format(playerGroup.size() == 1 ? "text.players.single" : "text.players", playerGroup.size()));
pane.row(); pane.row();
pane.pane("clear", content).grow().get().setScrollingDisabled(true, false); pane.pane(content).grow().get().setScrollingDisabled(true, false);
pane.row(); pane.row();
pane.table("pane", menu -> { pane.table(menu -> {
menu.defaults().growX().height(50f).fillY(); menu.defaults().growX().height(50f).fillY();
menu.addButton("$text.server.bans", ui.bans::show).disabled(b -> Net.client()); menu.addButton("$text.server.bans", ui.bans::show).disabled(b -> Net.client());
@@ -70,12 +70,14 @@ public class PlayerListFragment extends Fragment{
float h = 74f; float h = 74f;
playerGroup.all().sort((p1, p2) -> p1.getTeam().compareTo(p2.getTeam()));
playerGroup.forEach(player -> { playerGroup.forEach(player -> {
NetConnection connection = player.con; NetConnection connection = player.con;
if(connection == null && Net.server() && !player.isLocal) return; if(connection == null && Net.server() && !player.isLocal) return;
Table button = new Table("button"); Table button = new Table();
button.left(); button.left();
button.margin(5).marginBottom(10); button.margin(5).marginBottom(10);
@@ -102,19 +104,19 @@ public class PlayerListFragment extends Fragment{
if((Net.server() || players[0].isAdmin) && !player.isLocal && (!player.isAdmin || Net.server())){ if((Net.server() || players[0].isAdmin) && !player.isLocal && (!player.isAdmin || Net.server())){
button.add().growY(); button.add().growY();
float bs = (h + 14) / 2f; float bs = (h) / 2f;
button.table(t -> { button.table(t -> {
t.defaults().size(bs - 1, bs + 3); t.defaults().size(bs);
t.addImageButton("icon-ban", 14 * 2, t.addImageButton("icon-ban", "clear-partial", 14 * 2,
() -> ui.showConfirm("$text.confirm", "$text.confirmban", () -> Call.onAdminRequest(player, AdminAction.ban))).padBottom(-5.1f); () -> ui.showConfirm("$text.confirm", "$text.confirmban", () -> Call.onAdminRequest(player, AdminAction.ban)));
t.addImageButton("icon-cancel", 16 * 2, t.addImageButton("icon-cancel", "clear-partial", 16 * 2,
() -> ui.showConfirm("$text.confirm", "$text.confirmkick", () -> Call.onAdminRequest(player, AdminAction.kick))).padBottom(-5.1f); () -> ui.showConfirm("$text.confirm", "$text.confirmkick", () -> Call.onAdminRequest(player, AdminAction.kick)));
t.row(); t.row();
t.addImageButton("icon-admin", "toggle", 14 * 2, () -> { t.addImageButton("icon-admin", "clear-toggle", 14 * 2, () -> {
if(Net.client()) return; if(Net.client()) return;
String id = player.uuid; String id = player.uuid;
@@ -130,15 +132,15 @@ public class PlayerListFragment extends Fragment{
.touchable(() -> Net.client() ? Touchable.disabled : Touchable.enabled) .touchable(() -> Net.client() ? Touchable.disabled : Touchable.enabled)
.checked(player.isAdmin); .checked(player.isAdmin);
t.addImageButton("icon-zoom-small", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); t.addImageButton("icon-zoom-small", "clear-partial", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/);
}).padRight(12).padTop(-5).padLeft(0).padBottom(-10).size(bs + 10f, bs);
}).padRight(12).size(bs + 10f, bs);
} }
content.add(button).padBottom(-6).width(350f).maxHeight(h + 14); content.add(button).padBottom(-6).width(350f).maxHeight(h + 14);
content.row(); content.row();
content.addImage("blank").height(3f).color(state.mode.isPvp ? player.getTeam().color : Palette.accent).growX();
content.row();
}); });
content.marginBottom(5); content.marginBottom(5);

View File

@@ -186,6 +186,14 @@ public class Block extends BaseBlock {
return out; return out;
} }
protected float getProgressIncrease(TileEntity entity, float baseTime){
float progressIncrease = 1f / baseTime * entity.delta();
if(hasPower){
progressIncrease *= entity.power.satisfaction; // Reduced increase in case of low power
}
return progressIncrease;
}
public boolean isLayer(Tile tile){ public boolean isLayer(Tile tile){
return true; return true;
} }
@@ -387,10 +395,11 @@ public class Block extends BaseBlock {
tempColor.set(Palette.darkFlame); tempColor.set(Palette.darkFlame);
if(hasItems){ if(hasItems){
float scaling = inventoryScaling(tile);
for(Item item : content.items()){ for(Item item : content.items()){
int amount = tile.entity.items.get(item); int amount = tile.entity.items.get(item);
explosiveness += item.explosiveness * amount; explosiveness += item.explosiveness * amount * scaling;
flammability += item.flammability * amount; flammability += item.flammability * amount * scaling;
if(item.flammability * amount > 0.5){ if(item.flammability * amount > 0.5){
units++; units++;
@@ -416,7 +425,7 @@ public class Block extends BaseBlock {
float splash = Mathf.clamp(amount / 4f, 0f, 10f); float splash = Mathf.clamp(amount / 4f, 0f, 10f);
for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){ for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){
Timers.run(i / 2, () -> { Timers.run(i / 2f, () -> {
Tile other = world.tile(tile.x + Mathf.range(size / 2), tile.y + Mathf.range(size / 2)); Tile other = world.tile(tile.x + Mathf.range(size / 2), tile.y + Mathf.range(size / 2));
if(other != null){ if(other != null){
Puddle.deposit(other, liquid, splash); Puddle.deposit(other, liquid, splash);
@@ -432,6 +441,11 @@ public class Block extends BaseBlock {
} }
} }
/**Returns scaled # of inventories in this block.*/
public float inventoryScaling(Tile tile){
return 1f;
}
/** /**
* Returns the flammability of the tile. Used for fire calculations. * Returns the flammability of the tile. Used for fire calculations.
* Takes flammability of floor liquid into account. * Takes flammability of floor liquid into account.

View File

@@ -4,43 +4,32 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.function.Supplier; import io.anuke.ucore.function.Supplier;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.style.TextureRegionDrawable; import io.anuke.ucore.scene.style.TextureRegionDrawable;
import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.ImageButton;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.control;
public interface SelectionTrait{ public interface SelectionTrait{
default void buildItemTable(Table table, Supplier<Item> holder, Consumer<Item> consumer){ default void buildItemTable(Table table, Supplier<Item> holder, Consumer<Item> consumer){
buildItemTable(table, false, holder, consumer);
}
default void buildItemTable(Table table, boolean nullItem, Supplier<Item> holder, Consumer<Item> consumer){
Array<Item> items = content.items(); Array<Item> items = content.items();
ButtonGroup<ImageButton> group = new ButtonGroup<>(); ButtonGroup<ImageButton> group = new ButtonGroup<>();
group.setMinCheckCount(0);
Table cont = new Table(); Table cont = new Table();
cont.defaults().size(38, 42).padBottom(-5.1f); cont.defaults().size(38);
int i = 0; int i = 0;
if(nullItem){
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> consumer.accept(null)).group(group).get();
button.getStyle().imageUp = new TextureRegionDrawable(Draw.region("icon-nullitem"));
button.setChecked(holder.get() == null);
i ++;
}
for(Item item : items){ for(Item item : items){
if(!control.unlocks.isUnlocked(item)) continue; if(!control.unlocks.isUnlocked(item)) continue;
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> consumer.accept(item)) ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> {}).group(group).get();
.group(group).get(); button.changed(() -> consumer.accept(button.isChecked() ? item : null));
button.getStyle().imageUp = new TextureRegionDrawable(item.region); button.getStyle().imageUp = new TextureRegionDrawable(item.region);
button.setChecked(holder.get() == item); button.setChecked(holder.get() == item);

View File

@@ -11,6 +11,7 @@ import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter;
import io.anuke.mindustry.world.consumers.ConsumePower;
import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.BlockStat;
import io.anuke.mindustry.world.meta.StatUnit; import io.anuke.mindustry.world.meta.StatUnit;
@@ -41,9 +42,12 @@ public class ForceProjector extends Block {
protected float cooldownNormal = 1.75f; protected float cooldownNormal = 1.75f;
protected float cooldownLiquid = 1.5f; protected float cooldownLiquid = 1.5f;
protected float cooldownBrokenBase = 0.35f; protected float cooldownBrokenBase = 0.35f;
protected float basePowerDraw = 0.2f;
protected float powerDamage = 0.1f; protected float powerDamage = 0.1f;
protected final ConsumePower consumePower;
protected TextureRegion topRegion; protected TextureRegion topRegion;
public ForceProjector(String name) { public ForceProjector(String name) {
super(name); super(name);
update = true; update = true;
@@ -54,7 +58,7 @@ public class ForceProjector extends Block {
hasItems = true; hasItems = true;
itemCapacity = 10; itemCapacity = 10;
consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).optional(true).update(false); consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).optional(true).update(false);
consumes.powerBuffered(60f); consumePower = consumes.powerBuffered(60f);
} }
@Override @Override
@@ -67,6 +71,7 @@ public class ForceProjector extends Block {
public void setStats(){ public void setStats(){
super.setStats(); super.setStats();
stats.add(BlockStat.powerUse, basePowerDraw * 60f, StatUnit.powerSecond);
stats.add(BlockStat.powerDamage, powerDamage, StatUnit.powerUnits); stats.add(BlockStat.powerDamage, powerDamage, StatUnit.powerUnits);
} }
@@ -99,16 +104,18 @@ public class ForceProjector extends Block {
Effects.effect(BlockFx.reactorsmoke, tile.drawx() + Mathf.range(tilesize/2f), tile.drawy() + Mathf.range(tilesize/2f)); Effects.effect(BlockFx.reactorsmoke, tile.drawx() + Mathf.range(tilesize/2f), tile.drawy() + Mathf.range(tilesize/2f));
} }
if(!entity.cons.valid() && !cheat){ // Draw base power from buffer manually (ConsumePower doesn't support both filling a buffer and drawing power additionally so we have to do it here)
entity.power.satisfaction -= Math.min(entity.power.satisfaction, basePowerDraw / consumePower.powerCapacity);
if(entity.power.satisfaction == 0.0f && !cheat){
entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f); entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f);
if(entity.warmup <= 0.09f){ if(entity.warmup <= 0.09f){
entity.broken = true; entity.broken = true;
} }
}else{ }else{
entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.1f); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.1f);
// TODO Adapt power calculations to new power system float relativePowerDraw = powerDamage * entity.delta() * (1f + entity.buildup / breakage) / consumePower.powerCapacity;
// float powerUse = Math.min(powerDamage * entity.delta() * (1f + entity.buildup / breakage), powerCapacity); entity.power.satisfaction -= Math.min(relativePowerDraw, entity.power.satisfaction);
// entity.power.amount -= powerUse;
} }
if(entity.buildup > 0){ if(entity.buildup > 0){
@@ -143,14 +150,13 @@ public class ForceProjector extends Block {
if(trait.canBeAbsorbed() && trait.getTeam() != tile.getTeam() && isInsideHexagon(trait.getX(), trait.getY(), realRadius * 2f, tile.drawx(), tile.drawy())){ if(trait.canBeAbsorbed() && trait.getTeam() != tile.getTeam() && isInsideHexagon(trait.getX(), trait.getY(), realRadius * 2f, tile.drawx(), tile.drawy())){
trait.absorb(); trait.absorb();
Effects.effect(BulletFx.absorb, trait); Effects.effect(BulletFx.absorb, trait);
float hit = trait.getShieldDamage()*powerDamage; float relativePowerDraw = trait.getShieldDamage() * powerDamage / consumePower.powerCapacity;
entity.hit = 1f; entity.hit = 1f;
// TODO Adapt power calculations to new power system
// entity.power.amount -= Math.min(hit, entity.power.amount); entity.power.satisfaction -= Math.min(relativePowerDraw, entity.power.satisfaction);
// if(entity.power.satisfaction <= 0.0001f){
// if(entity.power.amount <= 0.0001f){ entity.buildup += trait.getShieldDamage() * entity.warmup * 2f;
// entity.buildup += trait.getShieldDamage() * entity.warmup*2f; }
// }
entity.buildup += trait.getShieldDamage() * entity.warmup; entity.buildup += trait.getShieldDamage() * entity.warmup;
} }
}); });

View File

@@ -84,7 +84,7 @@ public class MendProjector extends Block{
other = other.target(); other = other.target();
if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.packedPosition()) && other.entity != null && other.entity.health < other.entity.maxHealth()){
other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat*phaseBoost)/100f); other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat*phaseBoost)/100f * entity.power.satisfaction);
Effects.effect(BlockFx.healBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); Effects.effect(BlockFx.healBlockFull, Hue.mix(color, phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size);
healed.add(other.packedPosition()); healed.add(other.packedPosition());
} }

View File

@@ -68,7 +68,7 @@ public class OverdriveProjector extends Block{
if(entity.charge >= reload){ if(entity.charge >= reload){
float realRange = range + entity.phaseHeat * phaseRangeBoost; float realRange = range + entity.phaseHeat * phaseRangeBoost;
float realBoost = speedBoost + entity.phaseHeat*speedBoostPhase; float realBoost = (speedBoost + entity.phaseHeat*speedBoostPhase) * entity.power.satisfaction;
Effects.effect(BlockFx.overdriveWave, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange); Effects.effect(BlockFx.overdriveWave, Hue.mix(color, phase, entity.phaseHeat), tile.drawx(), tile.drawy(), realRange);
entity.charge = 0f; entity.charge = 0f;

View File

@@ -31,7 +31,11 @@ public class LiquidBridge extends ItemBridge{
tryDumpLiquid(tile, entity.liquids.current()); tryDumpLiquid(tile, entity.liquids.current());
}else{ }else{
if(entity.cons.valid()){ if(entity.cons.valid()){
entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, 0.04f); float alpha = 0.04f;
if(hasPower){
alpha *= entity.power.satisfaction; // Exceed boot time unless power is at max.
}
entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, alpha);
}else{ }else{
entity.uptime = Mathf.lerpDelta(entity.uptime, 0f, 0.02f); entity.uptime = Mathf.lerpDelta(entity.uptime, 0f, 0.02f);
} }

View File

@@ -37,7 +37,6 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
// TODO Adapt whole class to new power system
public class MassDriver extends Block{ public class MassDriver extends Block{
protected float range; protected float range;
protected float rotateSpeed = 0.04f; protected float rotateSpeed = 0.04f;
@@ -49,7 +48,7 @@ public class MassDriver extends Block{
protected Effect smokeEffect = ShootFx.shootBigSmoke2; protected Effect smokeEffect = ShootFx.shootBigSmoke2;
protected Effect recieveEffect = BlockFx.mineBig; protected Effect recieveEffect = BlockFx.mineBig;
protected float shake = 3f; protected float shake = 3f;
protected final static float powerPercentageUsed = 0.8f; protected final static float powerPercentageUsed = 1.0f;
protected TextureRegion turretRegion; protected TextureRegion turretRegion;
public MassDriver(String name){ public MassDriver(String name){
@@ -171,8 +170,8 @@ public class MassDriver extends Block{
entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(waiter), rotateSpeed); entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(waiter), rotateSpeed);
}else if(tile.entity.items.total() >= minDistribute && }else if(tile.entity.items.total() >= minDistribute &&
linkValid(tile) && //only fire when at least at 80% power capacity linkValid(tile) && //only fire when at 100% power capacity
tile.entity.power.satisfaction > powerPercentageUsed && tile.entity.power.satisfaction >= powerPercentageUsed &&
link.block().itemCapacity - link.entity.items.total() >= minDistribute && entity.reload <= 0.0001f){ link.block().itemCapacity - link.entity.items.total() >= minDistribute && entity.reload <= 0.0001f){
MassDriverEntity other = link.entity(); MassDriverEntity other = link.entity();

View File

@@ -40,15 +40,15 @@ public class Sorter extends Block implements SelectionTrait{
@Override @Override
public void playerPlaced(Tile tile){ public void playerPlaced(Tile tile){
if(lastItem != null){
threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem)); threads.runDelay(() -> Call.setSorterItem(null, tile, lastItem));
} }
}
@Remote(targets = Loc.both, called = Loc.both, forward = true) @Remote(targets = Loc.both, called = Loc.both, forward = true)
public static void setSorterItem(Player player, Tile tile, Item item){ public static void setSorterItem(Player player, Tile tile, Item item){
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
if(entity != null) entity.sortItem = item; if(entity != null){
entity.sortItem = item;
}
} }
@Override @Override
@@ -56,6 +56,7 @@ public class Sorter extends Block implements SelectionTrait{
super.draw(tile); super.draw(tile);
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
if(entity.sortItem == null) return;
Draw.color(entity.sortItem.color); Draw.color(entity.sortItem.color);
Draw.rect("blank", tile.worldx(), tile.worldy(), 4f, 4f); Draw.rect("blank", tile.worldx(), tile.worldy(), 4f, 4f);
@@ -130,16 +131,17 @@ public class Sorter extends Block implements SelectionTrait{
} }
public static class SorterEntity extends TileEntity{ public static class SorterEntity extends TileEntity{
public Item sortItem = content.item(0); public Item sortItem;
@Override @Override
public void writeConfig(DataOutput stream) throws IOException{ public void writeConfig(DataOutput stream) throws IOException{
stream.writeByte(sortItem.id); stream.writeByte(sortItem == null ? -1 : sortItem.id);
} }
@Override @Override
public void readConfig(DataInput stream) throws IOException{ public void readConfig(DataInput stream) throws IOException{
sortItem = content.items().get(stream.readByte()); byte b = stream.readByte();
sortItem = b == -1 ? null : content.items().get(b);
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More