diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 8fdb041fc7..b0e4475812 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -20,7 +20,7 @@ diff --git a/build.gradle b/build.gradle index 6367e64024..147a1be3fb 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = 'f73e538757ac66ff62d7f25d93011142b6abb8df' + uCoreVersion = '7eb80a9765557d025d589f28fa1910dffa3fc8ed' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/assets-raw/sprites/ui/border.9.png b/core/assets-raw/sprites/ui/border.9.png deleted file mode 100644 index 49417e1eca..0000000000 Binary files a/core/assets-raw/sprites/ui/border.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/button-down.9.png b/core/assets-raw/sprites/ui/button-down.9.png index 9107880338..de800bf233 100644 Binary files a/core/assets-raw/sprites/ui/button-down.9.png and b/core/assets-raw/sprites/ui/button-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-edge-1.9.png b/core/assets-raw/sprites/ui/button-edge-1.9.png new file mode 100644 index 0000000000..5833e18f2f Binary files /dev/null and b/core/assets-raw/sprites/ui/button-edge-1.9.png differ diff --git a/core/assets-raw/sprites/ui/button-edge-2.9.png b/core/assets-raw/sprites/ui/button-edge-2.9.png new file mode 100644 index 0000000000..40ef1bad93 Binary files /dev/null and b/core/assets-raw/sprites/ui/button-edge-2.9.png differ diff --git a/core/assets-raw/sprites/ui/button-edge-3.9.png b/core/assets-raw/sprites/ui/button-edge-3.9.png new file mode 100644 index 0000000000..bc63ca5beb Binary files /dev/null and b/core/assets-raw/sprites/ui/button-edge-3.9.png differ diff --git a/core/assets-raw/sprites/ui/button-edge-4.9.png b/core/assets-raw/sprites/ui/button-edge-4.9.png new file mode 100644 index 0000000000..0d1aac1186 Binary files /dev/null and b/core/assets-raw/sprites/ui/button-edge-4.9.png differ diff --git a/core/assets-raw/sprites/ui/button-left-down.9.png b/core/assets-raw/sprites/ui/button-left-down.9.png new file mode 100644 index 0000000000..a8d4d637d2 Binary files /dev/null and b/core/assets-raw/sprites/ui/button-left-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-left-over.9.png b/core/assets-raw/sprites/ui/button-left-over.9.png new file mode 100644 index 0000000000..e6727f11bd Binary files /dev/null and b/core/assets-raw/sprites/ui/button-left-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-left.9.png b/core/assets-raw/sprites/ui/button-left.9.png new file mode 100644 index 0000000000..a3e813eefb Binary files /dev/null and b/core/assets-raw/sprites/ui/button-left.9.png differ diff --git a/core/assets-raw/sprites/ui/button-over.9.png b/core/assets-raw/sprites/ui/button-over.9.png index 9107880338..e274175562 100644 Binary files a/core/assets-raw/sprites/ui/button-over.9.png and b/core/assets-raw/sprites/ui/button-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-down.9.png b/core/assets-raw/sprites/ui/button-right-down.9.png new file mode 100644 index 0000000000..dea5fa0eac Binary files /dev/null and b/core/assets-raw/sprites/ui/button-right-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-over.9.png b/core/assets-raw/sprites/ui/button-right-over.9.png new file mode 100644 index 0000000000..aeb5860006 Binary files /dev/null and b/core/assets-raw/sprites/ui/button-right-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right.9.png b/core/assets-raw/sprites/ui/button-right.9.png new file mode 100644 index 0000000000..0cbe0e8288 Binary files /dev/null and b/core/assets-raw/sprites/ui/button-right.9.png differ diff --git a/core/assets-raw/sprites/ui/button.9.png b/core/assets-raw/sprites/ui/button.9.png index d27ab20c12..f982c6939b 100644 Binary files a/core/assets-raw/sprites/ui/button.9.png and b/core/assets-raw/sprites/ui/button.9.png differ diff --git a/core/assets-raw/sprites/ui/pane-2.9.png b/core/assets-raw/sprites/ui/pane-2.9.png new file mode 100644 index 0000000000..bf9ca991b5 Binary files /dev/null and b/core/assets-raw/sprites/ui/pane-2.9.png differ diff --git a/core/assets-raw/sprites/ui/pane-button.9.png b/core/assets-raw/sprites/ui/pane-button.9.png deleted file mode 100644 index 4ecdc37357..0000000000 Binary files a/core/assets-raw/sprites/ui/pane-button.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/pane.9.png b/core/assets-raw/sprites/ui/pane.9.png index e82766bafc..56c69a8dd8 100644 Binary files a/core/assets-raw/sprites/ui/pane.9.png and b/core/assets-raw/sprites/ui/pane.9.png differ diff --git a/core/assets-raw/sprites/ui/scroll-horizontal.9.png b/core/assets-raw/sprites/ui/scroll-horizontal.9.png index 70fdf066f2..eea4d3f872 100644 Binary files a/core/assets-raw/sprites/ui/scroll-horizontal.9.png and b/core/assets-raw/sprites/ui/scroll-horizontal.9.png differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png new file mode 100644 index 0000000000..d6227471aa Binary files /dev/null and b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-horizontal.9.png b/core/assets-raw/sprites/ui/scroll-knob-horizontal.9.png deleted file mode 100644 index e29eff71ab..0000000000 Binary files a/core/assets-raw/sprites/ui/scroll-knob-horizontal.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png index ed838ff3bf..acd97cdd79 100644 Binary files a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png and b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical.9.png b/core/assets-raw/sprites/ui/scroll-knob-vertical.9.png deleted file mode 100644 index 4c0d362150..0000000000 Binary files a/core/assets-raw/sprites/ui/scroll-knob-vertical.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/scroll.9.png b/core/assets-raw/sprites/ui/scroll.9.png index 527d2c29c2..afcdf783b9 100644 Binary files a/core/assets-raw/sprites/ui/scroll.9.png and b/core/assets-raw/sprites/ui/scroll.9.png differ diff --git a/core/assets-raw/sprites/ui/slider-knob-down.png b/core/assets-raw/sprites/ui/slider-knob-down.png index 4be43a4176..efb573acb3 100644 Binary files a/core/assets-raw/sprites/ui/slider-knob-down.png and b/core/assets-raw/sprites/ui/slider-knob-down.png differ diff --git a/core/assets-raw/sprites/ui/slider-knob-over.png b/core/assets-raw/sprites/ui/slider-knob-over.png index 4be43a4176..a8936dca95 100644 Binary files a/core/assets-raw/sprites/ui/slider-knob-over.png and b/core/assets-raw/sprites/ui/slider-knob-over.png differ diff --git a/core/assets-raw/sprites/ui/slider-knob.png b/core/assets-raw/sprites/ui/slider-knob.png index 6346d62c52..700f69c594 100644 Binary files a/core/assets-raw/sprites/ui/slider-knob.png and b/core/assets-raw/sprites/ui/slider-knob.png differ diff --git a/core/assets-raw/sprites/ui/slider.png b/core/assets-raw/sprites/ui/slider.png index 88dcd70693..904b8f2001 100644 Binary files a/core/assets-raw/sprites/ui/slider.png and b/core/assets-raw/sprites/ui/slider.png differ diff --git a/core/assets-raw/sprites/ui/textarea.9.png b/core/assets-raw/sprites/ui/textarea.9.png deleted file mode 100644 index 16f8cb4fe6..0000000000 Binary files a/core/assets-raw/sprites/ui/textarea.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/textfield-over.9.png b/core/assets-raw/sprites/ui/textfield-over.9.png deleted file mode 100644 index 3fe1f1ec4f..0000000000 Binary files a/core/assets-raw/sprites/ui/textfield-over.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/textfield.9.png b/core/assets-raw/sprites/ui/textfield.9.png deleted file mode 100644 index 742b040dee..0000000000 Binary files a/core/assets-raw/sprites/ui/textfield.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/underline-2.9.png b/core/assets-raw/sprites/ui/underline-2.9.png new file mode 100644 index 0000000000..bd2c4fbf18 Binary files /dev/null and b/core/assets-raw/sprites/ui/underline-2.9.png differ diff --git a/core/assets-raw/sprites/ui/underline.9.png b/core/assets-raw/sprites/ui/underline.9.png new file mode 100644 index 0000000000..2c764bd6b5 Binary files /dev/null and b/core/assets-raw/sprites/ui/underline.9.png differ diff --git a/core/assets-raw/sprites/ui/window.9.png b/core/assets-raw/sprites/ui/window.9.png deleted file mode 100644 index 7bae102db6..0000000000 Binary files a/core/assets-raw/sprites/ui/window.9.png and /dev/null differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6cae7f175d..55a215f9cc 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -351,6 +351,7 @@ text.category.items = Items text.category.crafting = Crafting text.category.shooting = Shooting text.category.optional = Optional Enhancements +setting.indicators.name = Ally Indicators setting.autotarget.name = Auto-Target setting.fpscap.name = Max FPS setting.fpscap.none = None diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 5d753f7732..a8d9fa9b3e 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -99,7 +99,7 @@ text.hosts.refresh = Actualizar text.hosts.discovering = Descubrir partidas LAN text.server.refreshing = Actualizando servidor... 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.playername = Nombre de jugador: [accent]{0} text.trace.ip = IP: [accent]{0} @@ -176,7 +176,7 @@ text.open = Abrir text.cancel = Cancelar text.openlink = Abrir 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.changelog.title = Registro de Parches text.changelog.loading = Consiguiendo el registro de parches... @@ -252,7 +252,7 @@ text.load = Cargar text.save = Guardar text.fps = FPS: {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.settings = Ajustes text.tutorial = Tutorial @@ -277,9 +277,9 @@ text.settings.graphics = Gráficos 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.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.clearunlocks = Limpiar Desbloqueos -text.settings.clearall = Limpiar Todo +text.settings.clearsectors = Eliminar Sectores +text.settings.clearunlocks = Eliminar Desbloqueos +text.settings.clearall = Eliminar Todo text.paused = Pausado text.yes = Sí text.no = No @@ -311,10 +311,10 @@ text.blocks.inputitem = Objeto de Entrada text.blocks.inputitems = Objetos de Entrada text.blocks.outputitem = Objeto de Salida 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.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.coolantuse = Uso del Refrigerante text.blocks.inputliquidfuel = Combustible Líquido @@ -345,7 +345,7 @@ text.category.liquids = Líquidos text.category.items = Objetos text.category.crafting = Fabricación text.category.shooting = Disparo -text.category.optional = Optional Enhancements +text.category.optional = Mejoras Opcionales setting.autotarget.name = Auto apuntado setting.fpscap.name = Máx FPS setting.fpscap.none = Nada @@ -370,7 +370,7 @@ setting.musicvol.name = Volumen de la Música setting.mutemusic.name = Silenciar Musica setting.sfxvol.name = Volumen de los efectos de 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 category.general.name = General category.view.name = Visión @@ -412,7 +412,7 @@ mode.pvp.name = PvP mode.pvp.description = Pelea contra otros jugadores localmente. content.item.name = Objetos content.liquid.name = Líquidos -content.unit.name = Units +content.unit.name = Unidades content.recipe.name = Bloques content.mech.name = Mecanoides 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.plastanium.name = Plastanio 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.surge-alloy.name = Surge Alloy item.surge-alloy.description = Una aleación avanzada con propiedades eléctricas únicas. @@ -500,7 +500,7 @@ block.metalfloor.name = Suelo de Metal block.deepwater.name = Aguas profundas block.water.name = Agua block.lava.name = Lava -block.tar.name = Tar +block.tar.name = Alquitrán block.blackstone.name = Piedra negra block.stone.name = Piedra 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.dense-alloy-wall.name = Muro de aleación densa block.dense-alloy-wall-large.name = Muro de aleación densa grande -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall +block.phase-wall.name = Muro de Fase grande +block.phase-wall-large.name = Muro de Fase grande block.thorium-wall.name = Pared de Torio block.thorium-wall-large.name = Pared de Torio grande block.door.name = Puerta @@ -532,7 +532,7 @@ block.junction.name = Cruce block.router.name = Enrutador block.distributor.name = Distribuidor 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.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 @@ -562,7 +562,7 @@ block.dart-ship-pad.name = Pad de nave de dardos block.delta-mech-pad.name = Pad de mecanoide Delta block.javelin-ship-pad.name = Pad de nave Jabalina 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.tau-mech-pad.name = Pad de mecanoide Tau 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.spirit-factory.name = Fábrica de Drones Espíritu block.phantom-factory.name = Fábrica de Drones Fantasmales -block.wraith-factory.name = Wraith Fighter Factory -block.ghoul-factory.name = Ghoul Bomber Factory +block.wraith-factory.name = Fábrica de Wraith Fighter +block.ghoul-factory.name = Fábrica de Ghoul Bomber block.dagger-factory.name = Fábrica de Dagas block.titan-factory.name = Fábrica de Titanes -block.fortress-factory.name = Fortress Mech Factory -block.revenant-factory.name = Revenant Fighter Factory +block.fortress-factory.name = Fábrica de mecanoide Fortress +block.revenant-factory.name = Fábrica de Revenant Fighter block.repair-point.name = Punto de Reparación block.pulse-conduit.name = Conducto de Pulso 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.command-center.name = Centro de Comando 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-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.surge-wall.name = Surge Wall block.surge-wall-large.name = Large Surge Wall block.cyclone.name = Ciclón block.fuse.name = Fuse block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector +block.overdrive-projector.name = Proyector de sobremarcha +block.force-projector.name = Proyector de fuerza block.arc.name = Arc block.rtg-generator.name = Generador RTG 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.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.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.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. @@ -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.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.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.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.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.titan-factory.description = Produce unidades terrestres avanzadas. block.fortress-factory.description = Produce unidades terrestres de artillería pesada. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 7218e4051e..4d5e3040c6 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -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.contributors = Переводчики и контрибьюторы text.discord = Присоединяйтесь к нашему Discord! text.link.discord.description = Официальный discord-сервер Mindustry text.link.github.description = Исходный код игры @@ -14,7 +15,7 @@ text.gameover.pvp = [accent] {0}[] команда победила! text.sector.gameover = Этот сектор потерян. Высадится повторно? text.sector.retry = Повторить попытку text.highscore = [YELLOW]Новый рекорд! -text.wave.lasted = Вы продержались до волны [accent]{0}[]. +text.wave.lasted = Вы продержались до [accent]{0}[]-ой волны. text.level.highscore = Рекорд: [accent]{0} text.level.delete.title = Подтвердите удаление text.map.delete = Вы действительно хотите удалить карту "[accent]{0}[]"? @@ -30,7 +31,7 @@ text.coreattack = < Ядро находится под атакой! > text.unlocks = Разблокированные text.savegame = Сохранить игру text.loadgame = Загрузить игру -text.joingame = Присоединиться +text.joingame = Присоеди\nниться text.addplayers = Доб/удалить игроков text.customgame = Пользовательская игра text.sectors = Секторы @@ -238,7 +239,7 @@ text.editor.exportimage = Экспортировать изображение л text.editor.exportimage.description = Экспортировать файл с изображением карты text.editor.loadimage = Загрузить \nизображение text.editor.saveimage = Сохранить \nизображение -text.editor.unsaved = [scarlet]У вас есть несохранённые изменения![] \nВы уверены, что хотите выйти? +text.editor.unsaved = [scarlet]У вас есть несохранённые изменения![]\nВы уверены, что хотите выйти? text.editor.resizemap = Изменить размер карты text.editor.mapname = Название карты: text.editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту. @@ -258,12 +259,12 @@ text.settings = Настройки text.tutorial = Обучение text.editor = Редактор text.mapeditor = Редактор карт -text.donate = Донат +text.donate = Пожертво\nвать text.connectfail = [crimson]Не удалось подключиться к серверу: [accent] {0} text.error.unreachable = Сервер недоступен. text.error.invalidaddress = Некорректный адрес. text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! -text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у вас и у создателя сервера установлена последняя версия Mindustry\\! +text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry! text.error.alreadyconnected = Вы уже подключены. text.error.mapnotfound = Map file not found! text.error.any = Неизвестная сетевая ошибка. @@ -319,8 +320,8 @@ text.blocks.coolant = Охлаждающая жидкость text.blocks.coolantuse = Охлажд. жидкости используется text.blocks.inputliquidfuel = Жидкое топливо text.blocks.liquidfueluse = Жидкого топлива используется -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = Ускоряющий предмет +text.blocks.boostliquid = Ускоряющая жидкость text.blocks.health = Здоровье text.blocks.inaccuracy = Разброс text.blocks.shots = Выстрелы @@ -345,7 +346,7 @@ text.category.liquids = Жидкости text.category.items = Предметы text.category.crafting = Создание text.category.shooting = Cтрельба -text.category.optional = Optional Enhancements +text.category.optional = Дополнительные улучшения setting.autotarget.name = Авто-цель setting.fpscap.name = Макс. FPS setting.fpscap.none = Неограниченный @@ -364,13 +365,13 @@ setting.seconds = {0} Секунд setting.fullscreen.name = Полноэкранный режим setting.fps.name = Показывать FPS setting.vsync.name = Верт. синхронизация -setting.lasers.name = Показывать энергетические лазеры +setting.lasers.name = Показывать энергию лазеров setting.minimap.name = Показать миникарту setting.musicvol.name = Громкость музыки setting.mutemusic.name = Заглушить музыку setting.sfxvol.name = Громкость звуковых эффектов setting.mutesound.name = Заглушить звук -setting.crashreport.name = Отправлять анонимные отчёты о сбоях +setting.crashreport.name = Отправлять анонимные отчёты о вылетах text.keybind.title = Настройка управления category.general.name = Основное category.view.name = Просмотр @@ -380,14 +381,14 @@ command.retreat = Отступить command.patrol = Патрулирование keybind.press = Нажмите клавишу... keybind.press.axis = Нажмите клавишу... -keybind.move_x.name = Движение по x -keybind.move_y.name = Движение по y +keybind.move_x.name = Движение по оси x +keybind.move_y.name = Движение по оси y keybind.select.name = Выбор/Выстрел keybind.break.name = Разрушение keybind.deselect.name = Отмена keybind.shoot.name = Выстрел -keybind.zoom_hold.name = Удержание зума -keybind.zoom.name = Приблизить +keybind.zoom_hold.name = Управление масштабом +keybind.zoom.name = Приблизить/Отдалить keybind.menu.name = Меню keybind.pause.name = Пауза keybind.dash.name = Мчаться @@ -403,10 +404,10 @@ keybind.drop_unit.name = Сбросить юнита keybind.zoom_minimap.name = Увеличить миникарту. mode.text.help.title = Описание режимов mode.waves.name = Волны -mode.waves.description = В режиме "волны" ограниченные ресурсы и автоматические наступающие волны. +mode.waves.description = Обычный режим. В режиме "Волны" надо самим добывать ресурсы и сами волны идут безостановочно. mode.sandbox.name = Песочница mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. -mode.freebuild.name = Свободная\nстройка +mode.freebuild.name = Cвободная\nстрой mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. mode.pvp.name = Противо-\nстояние mode.pvp.description = боритесь против других игроков. @@ -460,7 +461,7 @@ mech.delta-mech.description = Быстрый, легкобронированны mech.tau-mech.name = Тау mech.tau-mech.weapon = Восстановительный лазер mech.tau-mech.ability = Регенирирующая вспышка -mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может потушить пожары и исцелить союзников радиусом с его способностью восстанавления. +mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления. mech.omega-mech.name = Омега mech.omega-mech.weapon = Ракетомётный пулемётконфигурация mech.omega-mech.ability = Защитная @@ -493,9 +494,10 @@ text.mech.ability = [LIGHT_GRAY]Способность: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Теплоёмкость: {0} text.liquid.viscosity = [LIGHT_GRAY]Вязкость: {0} text.liquid.temperature = [LIGHT_GRAY]Температура: {0} -block.constructing = {0}\n[LIGHT_GRAY](В процессе) -block.spawn.name = Спаун врагов +block.constructing = {0}[LIGHT_GRAY](В процессе) +block.spawn.name = Точка появления врагов block.core.name = Ядро +block.space.name = Пустота block.metalfloor.name = Мeталичeский пoл block.deepwater.name = Глубоководье block.water.name = Вода @@ -590,7 +592,7 @@ block.oil-extractor.name = Нефтяной экстрактор block.spirit-factory.name = Завод дронов "Призрак" block.phantom-factory.name = Завод дронов "Фантом" block.wraith-factory.name = Завод призрачных истребителей -block.ghoul-factory.name = Завод гулевых бомбардировщиков +block.ghoul-factory.name = Завод бомбардировщиков "Гуль" block.dagger-factory.name = Завод мехов "Разведчик" block.titan-factory.name = Завод мехов "Титан" block.fortress-factory.name = Завод мехов "Крепость" @@ -775,6 +777,6 @@ block.itemvoid.description = Уничтожает любые предметы, block.powerinfinite.description = Бесконечность — не предел. Бесконечно выводит энергию. Доступен только в песочнице. block.powervoid.description = Энергия просто уходит в пустоту. Присутствует только в песочнице. liquid.water.description = Намного лучше чем [BLUE]монооксид дигидрогена[].\n\n Для получения воды используйте помпу(насос) на источнике(блоке) или экстрактор воды.\n\n Эту жидкость можно подвести к бурам для ускорения скорости добычи или к турелям для ускорения стрельбы. -liquid.lava.description = [accent]Горячо...\nВещество расплавленное из горно-каменных пород.\nСлужит как топливо для термального генератора. -liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления.\nСлужит для пластиниевого компрессора и т.д.. +liquid.lava.description = [accent]Горячо...\nВещество расплавленное из горно-каменных пород. +liquid.oil.description = Кто-то писал о добавлении золота в игру. Его добавили, правда оно какое-то чёрное...\nСмесь жидких углеводородов, выделяющаяся из природного газа в результате снижения температуры и пластового давления. liquid.cryofluid.description = Жидкость с температурой ниже чем -273 градусов по цельсию. Может быть использована для ускорения стрельбы турелей или для охлаждения чего-то. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index f5d883551b..6bc5700d53 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -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.contributors = Перекладачі та Контриб'ютори text.discord = Приєднуйтесь до нашого Discord! -text.link.discord.description = Офіційний сервер discord Mindustry -text.link.github.description = Вихідний код гри +text.link.discord.description = Офіційний discord-сервер Mindustry +text.link.github.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.google-play.description = Скачати з Google Play для Android text.link.wiki.description = Офіційна Mindustry вікі (англ.) @@ -14,15 +15,15 @@ text.gameover.pvp = [accent] {0}[] команда перемогла! text.sector.gameover = Цей сектор було втрачено. Повторно висадитися? text.sector.retry = Повторити спробу text.highscore = [YELLOW]Новий рекорд! -text.wave.lasted = Ви проіснували до [accent]{0}[]-ої хвилі. +text.wave.lasted = Вы продержались до [accent]{0}[]-ой волны. text.level.highscore = Рекорд: [accent]{0} text.level.delete.title = Підтвердьте видалення text.map.delete = Ви впевнені, що хочете видалити карту "[accent]{0}[]"? text.level.select = Вибір мапи -text.level.mode = Ігровий режим: +text.level.mode = Режим гри: text.construction.desktop = Щоб скасувати вибір блоку або припинити будівництво, [accent] скористайтеся пробілом[]. 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 = Ви тільки що перешли в [accent] режим деконструкції блоків[].\n\nЩоб почати руйнувати, просто торкніться блоку поруч із вашим кораблем.\nПісля вибору деяких блоків натисніть прапорець, щоб підтвердити, і ваш корабель почне їх деконструювати.\n\n- [accent]Вилучіть блоки[] з вашого вибору, торкнувшись їх.\n- [accent]Вилучіть блоки в зоні[] , торкнувшись і утримуючи порожнє місце, потім перетягніть у потрібному напрямку.\n- [accent]Скасуйте деконструкцію або виділення[] натиснувши X внизу ліворуч. text.showagain = Не показувати знову до наступного сеансу @@ -30,11 +31,11 @@ text.coreattack = < Ядро під атакою! > text.unlocks = Розблоковане text.savegame = Зберегти гру text.loadgame = Завантажити гру -text.joingame = Приєднатися\nдо гри +text.joingame = Приєднатися text.addplayers = Дод/Видалити гравців -text.customgame = Індивідуальна гра +text.customgame = Користувальницька гра text.sectors = Сектори -text.sector = Сектор: [LIGHT_GRAY]{0} +text.sector = Обраний сектор: [LIGHT_GRAY]{0} text.sector.time = Час: [LIGHT_GRAY]{0} text.sector.deploy = Висадитися text.sector.abandon = Відступити @@ -45,27 +46,27 @@ text.sector.unexplored = [accent][[Недосліджений] text.missions = Місії:[LIGHT_GRAY] {0} text.mission = Місія:[LIGHT_GRAY] {0} text.mission.main = Головна місія:[LIGHT_GRAY] {0} -text.mission.info = Інформація про місії -text.mission.complete = Місія завершена! +text.mission.info = Інформація про місію +text.mission.complete = Місія виконана! text.mission.complete.body = Сектор {0},{1} був завойований. -text.mission.wave = Пережити наступну кількість хвиль:[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.menu = Пережити[accent] {0} []хвиль -text.mission.battle = Знищити базу супротивника. +text.mission.wave = Пережити [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.menu = Пережити[accent] {0} [] хвиль +text.mission.battle = Знищте ядро супротивника. 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.unit = Створити {0} бой.од. -text.mission.command = Надіслати команду {0} до боїв. одиниць +text.mission.command = Надіслати команду {0} боїв. одиницям text.mission.linknode = З'єднати силові вузли text.mission.display = [accent]Місія:\n[LIGHT_GRAY]{0} text.mission.mech = Переключитися на мех[accent] {0}[] -text.mission.create = Створити[accent] {0} [] +text.mission.create = Створити[accent] {0}[] text.none = <нічого> text.close = Закрити text.quit = Вийти -text.maps = Карти +text.maps = Мапи text.continue = Продовжити text.nextmission = Наступна місія text.maps.none = [LIGHT_GRAY]Карт не знайдено! @@ -74,27 +75,27 @@ text.name = Нік: text.filename = Ім'я файлу: text.unlocked = Новий блок розблоковано! text.unlocked.plural = Нові блоки розблоковано! -text.players = {0} гравців онлайн -text.players.single = {0} гравець онлайн +text.players = Гравців на сервері: {0} +text.players.single = {0} гравець на сервері text.server.closing = [accent]Закриття серверу... text.server.kicked.kick = Ви були вигнані(кікнуті) з сервера! -text.server.kicked.serverClose = Сервер закритий. -text.server.kicked.sectorComplete = Сектор завойован. -text.server.kicked.sectorComplete.text = Ваша місія завершена. \nСервер продовжить роботу в наступному секторі. +text.server.kicked.serverClose = Сервер закрито. +text.server.kicked.sectorComplete = Сектор завойовано. +text.server.kicked.sectorComplete.text = Ваша місія завершена. \nСервер продовжить роботу і висадить Вас в наступному секторі. text.server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! -text.server.kicked.serverOutdated = Застарілий сервер! Попросіть хост оновити сервер/гру! +text.server.kicked.serverOutdated = Застарілий сервер! Попросіть адміністратора серверу оновити сервер/гру! text.server.kicked.banned = Ви були заблоковані на цьому сервері. -text.server.kicked.recentKick = Нещодавно вас вигнали(кікнули). \nПочекайте, перш ніж підключитися знову. +text.server.kicked.recentKick = Нещодавно Вас вигнали(кікнули). \nПочекайте трохи перед наступним підключенням. text.server.kicked.nameInUse = На цьому сервері є хтось \nз таким ніком. text.server.kicked.nameEmpty = Ваш нікнейм має містити принаймні один символ або цифру. text.server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не допускається. text.server.kicked.customClient = Цей сервер не підтримує користувальницькі збірки. Завантажте офіційну версію. -text.host.info = Кнопка [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.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.hostserver = Запустити сервер -text.hostserver.mobile = Запустити\nСервер +text.hostserver.mobile = Запустити\nсерверу text.host = Сервер -text.hosting = [accent]Открытие сервера ... +text.hosting = [accent]Відкриття серверу... text.hosts.refresh = Оновити text.hosts.discovering = Пошук локальних ігор text.server.refreshing = Оновлення серверу @@ -113,9 +114,9 @@ text.trace.totalblocksplaced = Всього встановлено блоків: text.trace.lastblockplaced = Останній встановлений блок: [accent]{0} text.invalidid = Невірний ідентифікатор клієнта! Надішліть звіт про помилку. text.server.bans = Блокування -text.server.bans.none = Нема заблокованих гравців! +text.server.bans.none = Заблокованих гравців нема! text.server.admins = Адміністратори -text.server.admins.none = Адміністраторів нема! +text.server.admins.none = Адміністраторів нема text.server.add = Додати сервер text.server.delete = Ви впевнені, що хочете видалити цей сервер? text.server.hostname = Хост: {0} @@ -123,10 +124,10 @@ text.server.edit = Редагувати сервер text.server.outdated = [crimson]Застарілий сервер![] text.server.outdated.client = [crimson]Застарілий клієнт![] text.server.version = [lightgray]Версія: {0} -text.server.custombuild = [yellow]Користувацький білд -text.confirmban = Ви впевнені, що хочете заблокувати(забанити) цього гравця? +text.server.custombuild = [yellow]Користувацький збірка +text.confirmban = Ви впевнені, що хочете заблокувати цього гравця? text.confirmkick = Ви впевнені, що хочете викинути(кікнути) цього гравця? -text.confirmunban = Ви впевнені, що хочете розблокувати) цього гравця? +text.confirmunban = Ви впевнені, що хочете розблокувати цього гравця? text.confirmadmin = Ви впевнені, що хочете зробити цього гравця адміністратором? text.confirmunadmin = Ви впевнені, що хочете видалити статус адміністратора з цього гравця? text.joingame.title = Приєднатися до гри @@ -136,10 +137,10 @@ text.disconnect.data = Не вдалося завантажити світові text.connecting = [accent]Підключення... text.connecting.data = [accent]Завантаження даних світу... text.server.port = Порт: -text.server.addressinuse = Адреса вже використовується! +text.server.addressinuse = Ця адреса вже використовується! text.server.invalidport = Недійсний номер порту! -text.server.error = [crimson]Помилка хостингу сервера: [accent]{0} -text.save.old = Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [LIGHT_GRAY]Зберігати зворотну сумісність буде реалізовано у повній версії 4.0. +text.server.error = [crimson]Помилка запуску сервера: [accent]{0} +text.save.old = Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [LIGHT_GRAY]Зворотна сумісність буде реалізовано у повній версії 4.0. text.save.new = Нове збереження text.save.overwrite = Ви впевнені, що хочете перезаписати цей слот для збереження? text.overwrite = Перезаписати @@ -152,24 +153,24 @@ text.save.export = Экспортувати збереження text.save.import.invalid = [accent]Це збереження недійсне! text.save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0} text.save.export.fail = [crimson]Не вдалося экспортувати збереження: [accent]{0} -text.save.import = Імпорт збереження -text.save.newslot = Зберегти ім'я: +text.save.import = Імпортувати збереження +text.save.newslot = Назва збереження: text.save.rename = Перейменувати text.save.rename.text = Нова назва: text.selectslot = Виберіть збереження. text.slot = [accent]Слот {0} -text.save.corrupted = [accent]Збережений файл пошкоджений або недійсний! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не []є помилкою. -text.sector.corrupted = [accent]Знайдено файл збереження для цього сектора, але завантаження не вдалося. \n Буде створено новий. +text.save.corrupted = [accent]Збережений файл пошкоджено або э недійсним! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не[] є помилкою. +text.sector.corrupted = [accent]Файл збереження для цього сектора знайдено, але завантаження не вдалося. \n Буде створено новий файл. text.empty = <порожній> -text.on = Вкл -text.off = Викл +text.on = Включено +text.off = Вимкнено text.save.autosave = Автозбереження: {0} -text.save.map = Карта: {0} +text.save.map = Мапа: {0} text.save.wave = Хвиля {0} -text.save.difficulty = Рівень складності: {0} -text.save.date = Останне збереження: {0} +text.save.difficulty = Складність: {0} +text.save.date = Останнє збереження text.save.playtime = Час гри: {0} -text.confirm = Підтвердити +text.confirm = Підтвердження text.delete = Видалити text.ok = ОК text.open = Відкрити @@ -177,11 +178,11 @@ text.cancel = Скасувати text.openlink = Відкрити посилання text.copylink = Скопіювати посилання text.back = Назад -text.quit.confirm = Ти впевнений що хочеш вийти? +text.quit.confirm = Ви впевнені що хочете вийти? text.changelog.title = Журнал змін text.changelog.loading = Отримання журналу змін... 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.current = [yellow][[Поточна версія] text.changelog.latest = [accent][[Остання версія] @@ -190,7 +191,7 @@ text.saving = [accent]Збереження... text.wave = [accent]Хвиля {0} text.wave.waiting = Хвиля через {0} text.waiting = Очікування... -text.waiting.players = Очікування гравців ... +text.waiting.players = Очікування гравців text.wave.enemies = [LIGHT_GRAY]{0} ворог. залишилося text.wave.enemy = [LIGHT_GRAY]{0} ворог залишився text.loadimage = Завантажити зображення @@ -199,91 +200,90 @@ text.unknown = Невідомо text.custom = Користувальницька text.builtin = Bбудована text.map.delete.confirm = Ви впевнені, що хочете видалити цю карту? Цю дію не можна скасувати! -text.map.random = [accent]Випадкова карта -text.map.nospawn = Ця карта не має жодного ядра для спавну гравця! Додайте[ROYAL] сине[] ядро в цю карту в редакторі. +text.map.random = [accent]Випадкова мапа +text.map.nospawn = Ця мапа не має жодного ядра для спавну гравця! Додайте[ROYAL] сине[] ядро в цю мапу редакторі. text.map.nospawn.pvp = У цій карти немає ворожих ядер, в яких гравець може з'явитися! Додайте[SCARLET] червоні[] ядра до цієї карті в редакторі. text.map.invalid = Помилка завантаження карти: пошкоджений або невірний файл карти. text.editor.brush = Пензлик -text.editor.slope = \\ +text.editor.slope = text.editor.openin = Відкрити в редакторі text.editor.oregen = Генерація руд text.editor.oregen.info = Генерація руд: -text.editor.mapinfo = Інформація про карту +text.editor.mapinfo = Інформація про мапу text.editor.author = Автор: text.editor.description = Опис: text.editor.name = Назва: text.editor.teams = Команди -text.editor.elevation = Высота височини -text.editor.errorimageload = Помилка завантаження файлу:\n[accent]{0} -text.editor.errorimagesave = Помилка збереження файлу:\n[accent]{0} -text.editor.generate = Генерувати -text.editor.resize = Змінити розмір -text.editor.loadmap = Завантажити карту +text.editor.elevation = Висота +text.editor.errorimageload = Помилка завантаження зображення:[accent] {0} +text.editor.errorimagesave = Помилка збереження зображення:\n[accent]{0} +text.editor.generate = Створити +text.editor.resize = Змінити \nрозмір +text.editor.loadmap = Завантажити мапу text.editor.savemap = Зберегти карту text.editor.saved = Збережено! -text.editor.save.noname = Ваша карта не має назви! Встановіть його в меню "інформація про карту". -text.editor.save.overwrite = Ваша карта перезаписує вбудовану карту! Виберіть інше ім'я в меню "інформація про карту". +text.editor.save.noname = Ваша карта не має назви! Встановіть його в меню «Інформація про карту». +text.editor.save.overwrite = Ваша карта перезаписує вбудовану карту! Виберіть інше ім'я в меню «Інформація про карту». text.editor.import.exists = [scarlet]Неможливо імпортувати: [] вбудована карта з назвою "{0}" вже існує! text.editor.import = Імпорт... text.editor.importmap = Імпортувати карту -text.editor.importmap.description = Імпортуйте вже існуючої карти +text.editor.importmap.description = Імпортувати вже існуючу карту text.editor.importfile = Імпортувати файл -text.editor.importfile.description = Імпортуйте зовнішній файл карти -text.editor.importimage = Імпорт зображення місцевості -text.editor.importimage.description = Імпорт зовнішнього файла зображення карти +text.editor.importfile.description = Імпортувати зовнішній файл карти +text.editor.importimage = Імпорт зовнішнього файла зображення карти +text.editor.importimage.description = Імпорт зображення місцевості text.editor.export = Експорт... text.editor.exportfile = Експорт файлу text.editor.exportfile.description = Експортувати файл карти text.editor.exportimage = Експорт зображення місцевості text.editor.exportimage.description = Експорт файла з зображенням карти -text.editor.loadimage = Імпорт місцевості -text.editor.saveimage = Екпорт місцевості +text.editor.loadimage = Завантажити\nзображення +text.editor.saveimage = Зберегти\nзображення text.editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? text.editor.resizemap = Змінити розмір карти -text.editor.mapname = Назва карти: +text.editor.mapname = Название карты: text.editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу карту. text.editor.overwrite.confirm = [scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її? -text.editor.selectmap = Виберіть карту для завантаження: +text.editor.selectmap = Виберіть мапу для завантаження: text.width = Ширина: text.height = Висота: text.menu = Меню text.play = Грати -text.load = Завантаження +text.load = Завантажити text.save = Зберегти text.fps = FPS: {0} text.tps = TPS: {0} text.ping = Пінг: {0} мс -text.language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. +text.language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності.\nPlease restart your game for the language settings to take effect. text.settings = Налаштування text.tutorial = Навчання text.editor = Редактор -text.mapeditor = Редактор карт -text.donate = Пожертвувати +text.mapeditor = Редактор мап +text.donate = Пожертву\nвання text.connectfail = [crimson]Не вдалося підключитися до сервера: [accent]{0} -text.error.unreachable = Server unreachable. -text.error.invalidaddress = Invalid address. -text.error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -text.error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -text.error.alreadyconnected = Already connected. -text.error.mapnotfound = Map file not found! -text.error.any = Unkown network error. +text.error.unreachable = Сервер не доступний. +text.error.invalidaddress = Некоректна адреса. +text.error.timedout = Час очікувування вийшов.\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту! +text.error.mismatch = Ошибка пакету:\nможливе невідповідність версії клієнта / сервера.\nПереконайтеся, що у Вас та у володара сервера встановлена остання версія Mindustry! +text.error.alreadyconnected = Ви вже підключилися. +text.error.any = Невідома мережева помилка text.settings.language = Мова -text.settings.reset = Скинути до стандартних -text.settings.rebind = Змінити -text.settings.controls = Елементи управління +text.settings.reset = Скинути за замовчуванням +text.settings.rebind = Зміна +text.settings.controls = Управління text.settings.game = Гра text.settings.sound = Звук text.settings.graphics = Графіка -text.settings.cleardata = Очистити ігрові дані... -text.settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЩо робиться, не може бути скасовано! -text.settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, карти, розблокування та призначенні клавіші.\nПісля того, як ви натиснете "ОК", гра видалить усі дані та автоматично вийде. +text.settings.cleardata = Очистити дані... +text.settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЦя дія не може бути скасовано! +text.settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, карти, розблокуване та призначенні клавіші.\nПісля того, як ви натиснете ОК, гра видалить усі дані та автоматично вийде. text.settings.clearsectors = Очистити сектори text.settings.clearunlocks = Очистити розблоковане text.settings.clearall = Очистити все text.paused = Пауза text.yes = Так text.no = Ні -text.info.title = [accent]Інформація +text.info.title = Інформація text.error.title = [crimson]Виникла помилка text.error.crashtitle = Виникла помилка text.blocks.unknown = [LIGHT_GRAY]??? @@ -291,14 +291,14 @@ text.blocks.blockinfo = Інформація про блок text.blocks.powercapacity = Місткість енергії text.blocks.powershot = Енергія/постріл text.blocks.targetsair = Атакуе повітряних ворогів? -text.blocks.itemspeed = Переміщення одиниць -text.blocks.shootrange = Діапазон +text.blocks.itemspeed = Швидкість переміщення ресурсів +text.blocks.shootrange = Діапазон дії text.blocks.size = Розмір text.blocks.liquidcapacity = Місткість рідини text.blocks.maxitemssecond = Макс. кількість предметів/секунду text.blocks.powerrange = Діапазон передачі енергії -text.blocks.poweruse = Енергії використовується -text.blocks.powerdamage = Енергія/Урон +text.blocks.poweruse = Енергії використовує +text.blocks.powerdamage = Енергія/урон text.blocks.inputitemcapacity = Ємність вхідних елементів text.blocks.outputitemcapacity = Ємність вихідних елементів text.blocks.itemcapacity = Місткість предметів @@ -314,102 +314,102 @@ text.blocks.drilltier = Видобуває text.blocks.drillspeed = Базова швидкість свердління text.blocks.liquidoutput = Вихідна рідина text.blocks.liquidoutputspeed = Швидкість вихідної рідини -text.blocks.liquiduse = Використовуеться рідина +text.blocks.liquiduse = Використовуеться рідин text.blocks.coolant = Охолоджуюча рідина text.blocks.coolantuse = Охолодж. рідини використовуеться text.blocks.inputliquidfuel = Рідке паливо text.blocks.liquidfueluse = Рідкого палива використовуеться -text.blocks.boostitem = Boost Item -text.blocks.boostliquid = Boost Liquid +text.blocks.boostitem = Прискорюючий предмет +text.blocks.boostliquid = Прискорююча рідина text.blocks.health = Здоров'я text.blocks.inaccuracy = Розкид text.blocks.shots = Постріли -text.blocks.reload = Перезарядка +text.blocks.reload = Постріли/секунду text.blocks.inputfuel = Паливо text.blocks.fuelburntime = Час горіння топлива -text.blocks.inputcapacity = Вміщення вводу -text.blocks.outputcapacity = Вміщення виводу +text.blocks.inputcapacity = Макс. місткість вхідних предметів +text.blocks.outputcapacity = Макс. місткість вихідних предметів text.unit.blocks = блоки text.unit.powersecond = одиниць енергії/секунду text.unit.liquidsecond = рідких одиниць/секунду text.unit.itemssecond = предметів/секунду text.unit.pixelssecond = пікселів/секунду -text.unit.liquidunits = рідин. одиниць -text.unit.powerunits = енерг. одиниць +text.unit.liquidunits = рідинних одиниць +text.unit.powerunits = енергетичних одиниць text.unit.degrees = град. text.unit.seconds = сек. text.unit.items = предм. -text.category.general = Загальне -text.category.power = Енергетичне -text.category.liquids = Рідинне -text.category.items = Елементи +text.category.general = Загальні +text.category.power = Енергетичні +text.category.liquids = Рідини +text.category.items = Предмети text.category.crafting = Створення text.category.shooting = Стрільба -text.category.optional = Optional Enhancements +text.category.optional = Додаткові поліпшення setting.autotarget.name = Авто-ціль setting.fpscap.name = Макс. FPS setting.fpscap.none = Необмежений setting.fpscap.text = {0} FPS setting.difficulty.training = навчання -setting.difficulty.easy = легкий -setting.difficulty.normal = нормальний -setting.difficulty.hard = важкий -setting.difficulty.insane = божевільний -setting.difficulty.name = Рівень складності: +setting.difficulty.easy = легка +setting.difficulty.normal = нормальна +setting.difficulty.hard = важка +setting.difficulty.insane = божевільна +setting.difficulty.name = Складність: setting.screenshake.name = Тряска екрану setting.effects.name = Ефекти setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал автозбереження setting.seconds = {0} сек. setting.fullscreen.name = Повноекранний режим -setting.fps.name = Показати FPS +setting.fps.name = Показувати FPS setting.vsync.name = Вертикальна синхронізація -setting.lasers.name = Показати енергетичні лазери +setting.lasers.name = Показувати енергію лазерів setting.minimap.name = Показати мінікарту setting.musicvol.name = Гучність музики setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук -setting.crashreport.name = Send Anonymous Crash Reports +setting.crashreport.name = Надіслати анонімні звіти про аварійне завершення гри text.keybind.title = Налаштування управління category.general.name = Основне category.view.name = Перегляд category.multiplayer.name = Мультиплеєр command.attack = Атакувати command.retreat = Відступити -command.patrol = Патрулювання +command.patrol = Патрулювати keybind.press = Натисніть клавішу... keybind.press.axis = Натисніть клавішу... -keybind.move_x.name = Переміщення по осі x -keybind.move_y.name = Переміщення по осі y -keybind.select.name = Виберіть -keybind.break.name = Зламати +keybind.move_x.name = Рух по осі x +keybind.move_y.name = Рух по осі x +keybind.select.name = ВибратиПостріл +keybind.break.name = Руйнування keybind.deselect.name = Скасувати keybind.shoot.name = Постріл -keybind.zoom_hold.name = Утримувати масштаб -keybind.zoom.name = Збільшити +keybind.zoom_hold.name = Удержание зума +keybind.zoom.name = Приблизить keybind.menu.name = Меню keybind.pause.name = Пауза -keybind.dash.name = Тире +keybind.dash.name = Мчати keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль -keybind.rotate.name = Повертати +keybind.rotate.name = Обертати keybind.toggle_menus.name = Меню перемикання keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату keybind.chat_scroll.name = Прокрутка чату -keybind.drop_unit.name = Скинути юніта +keybind.drop_unit.name = Скинути бой. од. keybind.zoom_minimap.name = Збільшити мінікарту mode.text.help.title = Опис режимів mode.waves.name = Хвилі -mode.waves.description = Нормальний режим. Обмежені ресурси та автоматичні хвилі. +mode.waves.description = Звичайний режим. В режимі "Хвилі" треба самим добувати ресурси та хвилі йдуть беззупинно. mode.sandbox.name = Пісочниця -mode.sandbox.description = Нескінченні ресурси і нема таймера для хвиль. -mode.freebuild.name = Вільний режим -mode.freebuild.description = обмежені ресурси і немає таймера для хвиль. -mode.pvp.name = PvP -mode.pvp.description = борітесь проти інших гравців тут. +mode.sandbox.description = В режимі "Пісочниця" бескінечні ресурси(але їх все одно можно добувати) та хвилі йдуть за вашим бажанням. +mode.freebuild.name = Вільне\nбудівництво +mode.freebuild.description = В режимі "Пісочниця" треба самим добувати ресурси та хвилі йдуть за вашим бажанням. +mode.pvp.name = PVP +mode.pvp.description = боріться проти інших гравців. content.item.name = Предмети content.liquid.name = Рідини content.unit.name = Бойові одиниці @@ -420,29 +420,29 @@ item.stone.description = Загальна сировина. Використов item.copper.name = Мідь item.copper.description = Корисний структурний матеріал. Широко використовується у всіх типах блоків. item.lead.name = Свинець -item.lead.description = Базовий стартовий матеріал. Широко використовується в електроніки та транспорту рідини. +item.lead.description = Базовий стартовий матеріал. Широко використовується в електроніки та транспорту рідин. item.coal.name = Вугілля item.coal.description = Загальне та легкодоступне паливо. item.dense-alloy.name = Щільний сплав -item.dense-alloy.description = Жорсткий сплав з свинцем та міддю. Використовується в передових транспортних блоках та високорівневих свердлах. +item.dense-alloy.description = Жорсткий сплав вироблений зі свинця та міді. Використовується в передових транспортних блоках та високорівневих свердлах. item.titanium.name = Титан item.titanium.description = Рідкий суперлегкий метал широко використовується в рідкому транспорті, свердлах та літальних апаратах. item.thorium.name = Торій item.thorium.description = Густий, радіоактивний метал, що використовується як структурна підтримка та ядерне паливо. -item.silicon.name = Кремній -item.silicon.description = Надзвичайно корисний напівпровідник з застосуванням в сонячних батареях та багатьох складних електроніках. +item.silicon.name = Кремень +item.silicon.description = Надзвичайно корисний напівпровідник з застосуванням в сонячних батареях та складній електроніці. item.plastanium.name = Пластиній -item.plastanium.description = Легкий, пластичний матеріал, що використовується в сучасних літальних апаратах, та боєприпаси для фрагментації. -item.phase-fabric.name = Phase Fabric -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. -item.surge-alloy.name = Хвилястий сплав -item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.plastanium.description = Легкий, пластичний матеріал, що використовується в сучасних літальних апаратах та у боєприпасах для фрагментації. +item.phase-fabric.name = Фазова тканина +item.phase-fabric.description = Невагоме речовина, що використовується в сучасній електроніці і технології самовідновлення. +item.surge-alloy.name = Високоміцний сплав +item.surge-alloy.description = Передовий сплав з унікальними електричними властивостями. item.biomatter.name = Біоматерія -item.biomatter.description = Скупчення органічної муси; використовується для перетворення в нафту або як основне паливо. +item.biomatter.description = Скупчення органічної муси; використовується для перетворення в нафту або як паливо. item.sand.name = Пісок -item.sand.description = Загальний матеріал, який широко використовується при плавленні, як у процесі плавки, так і в відходах. +item.sand.description = Загальний матеріал, який широко використовується при плавленні, як у процесі плавки, так і у вигляді шлака. item.blast-compound.name = Вибухонебезпечне з'єднання -item.blast-compound.description = Нестійкий склад, що використовується в бомбах та вибухових речовинах. Хоча воно може спалюватися як паливо, та це не рекомендується. +item.blast-compound.description = Нестійке з'єднання, що використовується в бомбах та вибухових речовинах. Хоча воно може спалюватися як паливо, та це не рекомендується. item.pyratite.name = Піротит item.pyratite.description = Вкрай легкозаймиста речовина, що використовується у запальній зброї. liquid.water.name = Вода @@ -450,9 +450,9 @@ liquid.lava.name = Лава liquid.oil.name = Нафта liquid.cryofluid.name = Кріогенна рідина mech.alpha-mech.name = Альфа -mech.alpha-mech.weapon = Кулемет +mech.alpha-mech.weapon = Звичайний кулемет mech.alpha-mech.ability = Виклик дронів -mech.alpha-mech.description = Стандартний мех. Має пристойну швидкість і урон; може створити до 3-х дронів для збільшення можливості перемоги. +mech.alpha-mech.description = Стандартний мех для настільних пристроїв. Має пристойну швидкість і урон; може створити до 3-х дронів для збільшення можливості перемоги. mech.delta-mech.name = Дельта mech.delta-mech.weapon = Генератор дуг mech.delta-mech.ability = Розряд @@ -460,18 +460,18 @@ mech.delta-mech.description = Швидкий, легкоброньований mech.tau-mech.name = Тау mech.tau-mech.weapon = Відновлювальний лазер mech.tau-mech.ability = Відновлювальний спалах -mech.tau-mech.description = Мех підтримки. Зцілює союзницькі блоки, стріляючи в них. Можна гасити пожежі і зцілити союзників у радіусі зі своєю можливостю для ремонту. +mech.tau-mech.description = Мех підтримки. Зцілює союзницькі блоки, стріляючи в них. Може зцілити союзників у радіусі зі своєю здатністю для ремонту. mech.omega-mech.name = Омега mech.omega-mech.weapon = Купа ракет mech.omega-mech.ability = Захисна конфігурація -mech.omega-mech.description = Громіздкий і добре броньований хутро, зроблений для фронтових нападів. Його здатність може блокувати до 90% вхідного шкоди. +mech.omega-mech.description = Громіздкий і добре броньований мех, зроблений для фронтових нападів. Його здатність може блокувати до 90% вхідного урона. mech.dart-ship.name = Дротик mech.dart-ship.weapon = Ретранслятор -mech.dart-ship.description = Стандартний корабель для мобільних пристріях. Досить швидкий і легкий, але має невеликі наступальні можливості і низьку швидкість видобутку. +mech.dart-ship.description = Стандартний корабель на мобільних пристріях. Досить швидкий і легкий, але має невеликі наступальні можливості і низьку швидкість видобутку. mech.javelin-ship.name = Джавелін mech.javelin-ship.description = Ударний корабель, який використовує набіг з відскоком. Спочатку повільний, але пізніше він може прискоритися до великих швидкостей і літати над ворожими заставами, завдаючи великої шкоди своєю. блискавичною здатністю і ракетами. mech.javelin-ship.weapon = Вибухові ракети -mech.javelin-ship.ability = Дуговий генератор +mech.javelin-ship.ability = Генератор дуг mech.trident-ship.name = Тризубець mech.trident-ship.description = Важкий бомбардувальник. Досить добре броньований. mech.trident-ship.weapon = Вантажний відсік з бомбами @@ -493,9 +493,10 @@ text.mech.ability = [LIGHT_GRAY]Здібність: {0} text.liquid.heatcapacity = [LIGHT_GRAY]Теплоємність: {0} text.liquid.viscosity = [LIGHT_GRAY]В'язкість: {0} text.liquid.temperature = [LIGHT_GRAY]Температура: {0} -block.constructing = {0}\n[LIGHT_GRAY](Constructing) -block.spawn.name = Спавн ворога +block.constructing = {0}[LIGHT_GRAY](В процесі) +block.spawn.name = Місце появи ворога block.core.name = Ядро +block.space.name = Пустота block.metalfloor.name = Металічна підлога block.deepwater.name = Глибоководдя block.water.name = Вода @@ -510,7 +511,7 @@ block.snow.name = Сніг block.grass.name = Трава block.shrub.name = Кущ block.rock.name = Кругляк -block.blackrock.name = Чорнийкругляк +block.blackrock.name = Чорний кругляк block.icerock.name = Льодяний кругляк block.copper-wall.name = Мідна стіна block.copper-wall-large.name = Велика мідна стіна @@ -557,9 +558,9 @@ block.pneumatic-drill.name = Пневматичний дриль block.laser-drill.name = Лазерний дриль block.water-extractor.name = Екстрактор води block.cultivator.name = Культиватор -block.alpha-mech-pad.name = Завод мехів "Альфа" +block.alpha-mech-pad.name = Реконстуктор "Альфа" block.dart-ship-pad.name = Завод дротікових літаків -block.delta-mech-pad.name = Завод мехів "Дельта" +block.delta-mech-pad.name = Реконструктор "Дельта" block.javelin-ship-pad.name = Реконструктор "Джавелін" block.trident-ship-pad.name = Реконструктор "Тризуб" block.glaive-ship-pad.name = Реконструктор "Спис" @@ -577,7 +578,7 @@ block.vault.name = Сховище block.wave.name = Хвиля block.swarmer.name = Ройевик block.salvo.name = Залп -block.ripple.name = Хвилястість +block.ripple.name = Рябь block.phase-conveyor.name = Фазовий конвеєр block.bridge-conveyor.name = Мостовий конвеєр block.plastanium-compressor.name = Пластиновий компресор @@ -587,14 +588,14 @@ block.solidifer.name = Затверджувач block.solar-panel.name = Сонячна панель block.solar-panel-large.name = Велика сонячна панель block.oil-extractor.name = Екстрактор нафти -block.spirit-factory.name = Завод дронів "Привид" -block.phantom-factory.name = Завод дронів "Фантом" -block.wraith-factory.name = Завод примарних винищувачів -block.ghoul-factory.name = Завод гулевих бомбардувальників -block.dagger-factory.name = Завод мехів "Розвідник" -block.titan-factory.name = Завод мехів "Титан" -block.fortress-factory.name = Завод мехів "Фортеця" -block.revenant-factory.name = Завод бомбардувальників "Потойбічний вбивця" +block.spirit-factory.name = Завод дронов "Призрак" +block.phantom-factory.name = Завод дронов "Фантом" +block.wraith-factory.name = Завод винищувачів "Примара" +block.ghoul-factory.name = Завод бомбардувальників "Ґуль" +block.dagger-factory.name = Завод мехов "Разведчик" +block.titan-factory.name = Завод мехов "Титан" +block.fortress-factory.name = Завод мехов "Крепость" +block.revenant-factory.name = Завод бомбардировщиков "Потусторонний убийца" block.repair-point.name = Ремонтний пункт block.pulse-conduit.name = Імпульсний водовід block.phase-conduit.name = Фазовий водопровід @@ -620,161 +621,161 @@ block.overdrive-projector.name = Сверхприводний проектор block.force-projector.name = Силовий проектор block.arc.name = Дуга block.rtg-generator.name = Радіоізотопний термоелектричний генератор -block.spectre.name = Spectre -block.meltdown.name = Meltdown +block.spectre.name = Мара +block.meltdown.name = Розтоплення block.container.name = Склад -block.core.description = Найголовніша будівля в грі. team.blue.name = Синя team.red.name = Червона team.orange.name = Помаренчева team.none.name = Сіра team.green.name = Зелена team.purple.name = Фіолетова -unit.alpha-drone.name = Альфа дрон +unit.alpha-drone.name = Альфа unit.spirit.name = Дрон-привид unit.spirit.description = Початковий дрон. З'являється в ядрі за замовчуванням. Автоматично добуває руди та ремонтує блоки. unit.phantom.name = Фантом -unit.phantom.description = Покращений дрон. Автоматично добуває руди та ремонтує блоки.\nЗначно краще дрона-привида. -unit.dagger.name = Кинджал +unit.phantom.description = Покращений дрон. Автоматично добуває руди та ремонтує блоки. +unit.dagger.name = Розвідник unit.dagger.description = Базова наземна бойова одиниця. Корисен у купі. unit.titan.name = Титан -unit.titan.description = Просунута броньована наземна одиниця. Атакуе наземні та повітряні цілі. -unit.ghoul.name = Гулевий бомбардувальник -unit.ghoul.description = Тяжкий ковровий бомбардувальник +unit.titan.description = Улучшенная бронированная наземная боевая единица. Атакует наземные и воздушные цели. +unit.ghoul.name = Бомбардувальний "Ґуль" +unit.ghoul.description = Тяжкий ковровий бомбардувальник. unit.wraith.name = Примарний винищувач -unit.wraith.description = Швидка бойова одиниця. +unit.wraith.description = Швидка бойова одиниця, котрий використовує набіг з відскоком. unit.fortress.name = Фортеця unit.fortress.description = Тяжка артилерійна наземна бойова одиниця. unit.revenant.name = Потойбічний вбивця -unit.revenant.description = Важка лазерна платформа. -tutorial.begin = Ваша місія тут полягає в ліквідації[LIGHT_GRAY] противника[].\\n\\nПочнімо з[accent] видобутку міді[]. Щоб зробити це, торкніться мідної рудної жили біля вашого ядра. -tutorial.drill = Ручна робота не ефективна\\n[accent]Бури []можуть копати автоматично.\\nПоставте один на мідній жилі. -tutorial.conveyor = [accent]Конвейери[] використовуються для транспортування предметів в ядра.\\nЗробіть лінію конвейерів від бурів до ядра. -tutorial.morecopper = Треба більше міді\\n\\nДобудьте вручну або поставте більше бурів -tutorial.turret = Захистні споруди повинні бути побудованими для захисту від [LIGHT_GRAY] ворога[].\\nПобудуйте подвійну турель біля бази. -tutorial.drillturret = Подвійні турелі потребують[accent] мідні патрони []для стрільби.\\nПоставте бури поруч з турелею, щоб знаюдити її видобутою міддю. -tutorial.waves = [LIGHT_GRAY] Супротивник[] прижується.\\n\\nЗахистіть своє ядро від двух хвиль противника. Побудуйте більше турелей. -tutorial.lead = Стало доступно більше руд. Знайдіть і добудьте[accent] свинець[].\\n\\nПеретягніть з вашого меху в ядро для передачі ресурсів. -tutorial.smelter = Свинець і мідь тяжкі метали.\\nНайліпший[accent] щільний сплав[] може бути створеним у плавильному заводі.\\n\\nПобудуйте один завод. +unit.revenant.description = Бойова одиниця з важкою лазерною зброєю. +tutorial.begin = Ваша місія тут полягає в ліквідації[LIGHT_GRAY] противника[].\n\nПочнімо з[accent] видобутку міді[]. Щоб зробити це, торкніться мідної рудної жили біля вашого ядра. +tutorial.drill = Ручна робота не ефективна\n[accent]Бури []можуть копати автоматично.\nПоставте один на мідній жилі. +tutorial.conveyor = [accent]Конвейери[] використовуються для транспортування предметів в ядра.\nЗробіть лінію конвейерів від бурів до ядра. +tutorial.morecopper = Треба більше міді\n\nДобудьте вручну або поставте більше бурів +tutorial.turret = Захистні споруди повинні бути побудованими для захисту від [LIGHT_GRAY] ворога[].\nПобудуйте подвійну турель біля бази. +tutorial.drillturret = Подвійні турелі потребують[accent] мідні патрони []для стрільби.\nПоставте бури поруч з турелею, щоб знаюдити її видобутою міддю. +tutorial.waves = [LIGHT_GRAY] Супротивник[] прижується.\n\nЗахистіть своє ядро від двух хвиль противника. Побудуйте більше турелей. +tutorial.lead = Стало доступно більше руд. Знайдіть і добудьте[accent] свинець[].\n\nПеретягніть з вашого меху в ядро для передачі ресурсів. +tutorial.smelter = Свинець і мідь тяжкі метали.\nНайліпший[accent] щільний сплав[] може бути створеним у плавильному заводі.\n\nПобудуйте один завод. tutorial.densealloy = Плавильний завод тепер буде створювати сплав. -tutorial.siliconsmelter = Ядро зараз створить[accent] дрона привида[] для добування і ремонтування блоків.\\n\\nЗаводи для других одиниць(юнітов) може бути створено за допомогою [accent] кремнія.\\nЗробіть кремнієвий завод. -tutorial.silicondrill = Кремній потребує[accent] вугілляl[] та[accent] пісок[].\\nПочніть зі створення бурів. -tutorial.generator = Ця технологія потребує енергії.\\nЗробіть[accent] генератор внутрішнього згорання[] для цього. -tutorial.generatordrill = Генератор потребує вугілля.\\nПобудуйте бур на вугільній жилі. -tutorial.node = Енергії потребує транспортування\\nСоздайте[accent] силовий вузол[] поруч з вашим генератором згорання, щоб передавати його енергію. -tutorial.nodelink = Енергія може бути передана через контактні енергетичні блоки та генератори, або з'єднані силові вузли.\\n\\nЗ'єднайте живлення, торкнувшись вузла та вибравши генератор і кремнієвий завод. -tutorial.silicon = Кремній почався створюватися. Отримайте трохи.\\n\\nРекомендується вдосконалити виробничу систему. -tutorial.daggerfactory = Побудуйте[accent] завод "Розвідник".[]\\n\\nЦе буде використано для створення мехів атаки. -tutorial.router = Фабрики потребують ресурсів для функціонування.\\nСтворіть маршрутизатор для розподілення ресурсів з конвейера. +tutorial.siliconsmelter = Ядро зараз створить[accent] дрона привида[] для добування і ремонтування блоків.\n\nЗаводи для других одиниць(юнітов) може бути створено за допомогою [accent] кремнія.\nЗробіть кремнієвий завод. +tutorial.silicondrill = Кремній потребує[accent] вугілляl[] та[accent] пісок[].\nПочніть зі створення бурів. +tutorial.generator = Ця технологія потребує енергії.\nЗробіть[accent] генератор внутрішнього згорання[] для цього. +tutorial.generatordrill = Генератор потребує вугілля.\nПобудуйте бур на вугільній жилі. +tutorial.node = Енергії потребує транспортування\nСоздайте[accent] силовий вузол[] поруч з вашим генератором згорання, щоб передавати його енергію. +tutorial.nodelink = Енергія може бути передана через контактні енергетичні блоки та генератори, або з'єднані силові вузли.\n\nЗ'єднайте живлення, торкнувшись вузла та вибравши генератор і кремнієвий завод. +tutorial.silicon = Кремній почався створюватися. Отримайте трохи.\n\nРекомендується вдосконалити виробничу систему. +tutorial.daggerfactory = Побудуйте[accent] завод "Розвідник".[]\n\nЦе буде використано для створення мехів атаки. +tutorial.router = Фабрики потребують ресурсів для функціонування.\nСтворіть маршрутизатор для розподілення ресурсів з конвейера. tutorial.dagger = Зв'яжіть силовий вузол з заводом.\nЯк тільки вимоги будуть виконані, буде створено мех.\n\nЯкщо необхідно, то створіть ще бурів, генераторів та конвейерів -tutorial.battle = [LIGHT_GRAY] Супротивник[] показав своє ядро.\\nЗнищьте його з вашим мехом та бойовою одиницею. -block.copper-wall.description = Стіна з найменшим запасом міцності.\nДуж на початку гри для захисту. -block.copper-wall-large.description = Велика стіна найменшим запасом міцності.\nХороша на початку гри. +tutorial.battle = [LIGHT_GRAY] Супротивник[] показав своє ядро.\nЗнищьте його з вашим мехом та бойовою одиницею. +block.core.description = Найголовніше будівля в грі. +block.copper-wall.description = Дешевий оборонний блок.\nКорисен для захисту ядра і турелей під час перших хвиль. +block.copper-wall-large.description = Велика стіна найменшим запасом міцності.\nКорисна на початку гри. block.dense-alloy-wall.description = Стіна з показником міцності "нижче середнього". block.dense-alloy-wall-large.description = Велика стіна з показником міцності "нижче середнього". block.thorium-wall.description = Стіна з показником міцності "вище середнього". block.thorium-wall-large.description = Велика стіна з показником міцності "вище середнього". block.phase-wall.description = Стіна з середнім показником міцності. block.phase-wall-large.description = Велика стіна з середнім показником міцності. -block.surge-wall.description = Стіна з найбільшим запасом міцності. +block.surge-wall.description = Стіна з найбільшим показником міцності. block.surge-wall-large.description = Велика стіна з найбільшим запасом міцності. -block.door.description = Через ці двері не пройдуть вороги, якщо вона закрита. Щоб відкрити / закрити просто натисніть на неї. -block.door-large.description = Для великих стін потрібні великі двері. Щоб відкрити / закрити просто натисніть на неї. +block.door.description = Двері в прямому сенсі цього слова. Просто натисніть на неї. +block.door-large.description = Для великих стін потрібні великі двері.\nДля відкриття або закриття просто натисніть на неї. block.mend-projector.description = Ремонтує будівлі в невеликому радіусі. Споживає енергію. -block.overdrive-projector.description = Прискорює в невеликому радіусі всі ваші дії. -block.force-projector.description = Створює в невеликому радіусі силове поле, яке захищає від противника. -block.shock-mine.description = Поставте її. Вона б'є електрикою О_О -block.duo.description = Хороша турель початкова турель. Використовуйте стіни для її захисту.\n\n Використовує як снаряди мідь, щільний сплав, кремній і піротит.\n\nМожно підвести воду і криогенну рідина для прискорення стрільби. -block.arc.description = Турель з малим радіусом атаки. Для патронів треба воду або кріогенну рідина. Також потрібна енергія. -block.hail.description = Далекобійна початкова турель.\nВикористовує як снаряди щільний сплав, кремній і піротит.\nДля прискорення стрільби можна підвести воду і криогенну рідину. -block.lancer.description = Турель, яка стріляє лазером на середню відстань.\nВикористовує як снаряди енергію.\nДля прискорення стрільби можна підвести воду, нафту і криогенну рідину. -block.wave.description = Турель з середнім радіусом атаки, яка відштовхує супротивників в сторони. Використовує в якості снарядів воду, нафту, лаву або кріогенну рідину. -block.salvo.description = Турель з середнім радіусом атаки. Використовує в якості снарядів мідь, щільний сплав, торій, кремній і піротит.\nТакож потрібна якась рідина: вода, нафта або кріогенна. -block.swarmer.description = Навіть Керріган в захваті від такого.\nВикористовує в якості снарядів високоміцний сплав, піротит і вибухонебезпечне з'єднання.\nТакож потрібна якась рідина: вода, нафта або кріогенна. -block.ripple.description = Перша турель 3х3.\nВикористовує в якості снарядів щільний сплав, кремній, піротит, вибухонебезпечне з'єднання.\nТакож потрібна якась рідина: вода, нафта або кріогенна. -block.cyclone.description = Турель з великою дальністю. Використовує в якості снарядів пластиній, вибухонебезпечне з'єднання і високоміцний сплав.\nТакож потрібна якась рідина: вода, нафта або кріогенна. -block.fuse.description = Турель з малою дальністю атаки. Використовує в якості снарядів щільний сплав.\nТакож потрібна якась рідина: вода, нафта або кріогенна. -block.spectre.description = Перша турель 4х4 з середнім радіусом атаки. Використовує в якості снарядів щільний сплав, торій і піротит. -block.meltdown.description = Турель з середнім радіусом атаки. Для патронів треба воду або кріогенну рідину. Також потрібна енергія. +block.overdrive-projector.description = Прискорює в невеликому радіусі роботу механізмів. +block.force-projector.description = Створює в невеликому радіусі силове поле, яке захищає від атак супротивника. +block.shock-mine.description = Поставте її на землю. Вона б'ється ЕЛЕКТРИКОЮ О_О +block.duo.description = Маленька і дешева турель.\nДля прискорення стрільби можна підвести воду або кріогенну рідина. +block.arc.description = Турель с малым радиусом атаки.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.hail.description = Далекобійна початкова турель.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.lancer.description = Турель, яка стріляє лазером на середню відстань.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.wave.description = Турель з середнім радіусом атаки, яка відштовхує супротивників в сторони. +block.salvo.description = Турель з середнім радіусом атаки.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.swarmer.description = Середній розмір турелі з великим радіусом атаки, яка стріляє ракетами.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.ripple.description = Велика артилерійська турель, яка одночасно стріляє декільками пострілами. +block.cyclone.description = Велика швидка вогняна турель. \nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.fuse.description = Велика турель, яка стріляє потужними ближніми променями.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.spectre.description = Велика вежа, яка стріляє зразу двома потужніми кулями.\nДля прискорення стрільби можна підвести воду або кріогенну рідину. +block.meltdown.description = Велика турель, яка стріляє могутніми далекобійними променями. block.conveyor.description = Переміщує ресурси з малою швидкістю. -block.titanium-conveyor.description = Конвеєр другого покоління. Збільшена швидкість переміщення предметів і міцність. -block.phase-conveyor.description = Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі. Вимагає енергії. +block.titanium-conveyor.description = Конвеєр другого покоління. Збільшена швидкість переміщення предметів і міцність конвеєра. +block.phase-conveyor.description = Поки гра знаходиться в 2D, цей конвеєр вже в чотиривимірному просторі (можливо, це брехня).\nПотрібує енергії і підключається як мостовий конвеєр. block.junction.description = Назва говорить сама за себе. За допомогою нього можна зробити дві конвеєрні стрічки, які проходять через один одного і не змішуються. block.mass-driver.description = При наявності енергії передають ресурси на відстань 100 блоків, стріляючи в один-одного. block.smelter.description = Виробляє щільний сплав з міді і свинцю. Можна підвести пісок для прискорення виробництва. -block.arc-smelter.description = Покращена версія плавильного заводу. Вимагає енергію. Виробляє щільний сплав з вугілля, міді і свинцю.\nМожно підвести пісок для прискорення виробництва. -block.silicon-smelter.description = За допомогою піску, вугілля і енергії виробляє кремній.\n[RED]НЕ СИЛІКОН[] -block.plastanium-compressor.description = Створює пластини з титану і нафти. Вимагає енергії. Для прискорення виробництва можна додати в компресор пісок. -block.phase-weaver.description = Виробляє фазову матерію з торію і піску. Вимагає багато енергії. -block.alloy-smelter.description = Створює високоміцний сплав з титану, кремнію, міді і свинцю. Вимагає енергію. +block.arc-smelter.description = Покращена версія плавильного заводу. Вимагає енергію. Виробляє щільний сплав зміді і свинця.\nМожно підвести пісок для прискорення виробництва. +block.silicon-smelter.description = За допомогою піску, вугілля і енергії виробляє кремній. +block.plastanium-compressor.description = Створює пластинійи з титану і нафти. Вимагає енергії. Для прискорення виробництва можна додати в компресор пісок. +block.phase-weaver.description = Виробляє фазову тканину торію і піску. Вимагає багато енергії. +block.alloy-smelter.description = Створює високоміцний сплав з титану, кременя, міді і свинця. Вимагає енергію. block.pulverizer.description = Подрібнює камінь в пісок. Вимагає енергії. block.pyratite-mixer.description = Створює піротит з вугілля, свинцю і піску. Вимагає енергії. block.blast-mixer.description = Створює вибухонебезпечне з'єднання з нафти і піротіта. Для прискорення виробництва можна додати в мішалку пісок. -block.cryofluidmixer.description = Виробляє криогенну рідина з води і титану. Вимагає енергії. +block.cryofluidmixer.description = Виробляє криогенну рідину з води і титану. Вимагає енергії. block.solidifer.description = Остуджує лаву до каменя. Вимагає енергію. block.melter.description = Переплавляє камінь в лаву. Вимагає енергію. -block.incinerator.description = Спалює сміття за допомогою енергії. -block.biomattercompressor.description = Робить біоматерію з біосміття і енергії. +block.incinerator.description = Якщо є непотрібні ресурси, можна просто їх спалити.\nВимагає енергії. +block.biomattercompressor.description = Виробляє нафту з біоматеріі, біосміття і енергії. block.separator.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться". -block.centrifuge.description = Покращена версія отделителя.\nШукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться".\nВимагає енергію. -block.power-node.description = Максимум допустимо 4 підключення. Щоб з'єднати з якимось блоком потрібно наступне:\n1. Щоб він знаходився в радіусі дії\n2.Нажать на потрібний блок. -block.power-node-large.description = Силовий вузол другого покоління. Збільшено розмір вузла, кількість максимально допустимих підключень і інше. -block.battery.description = Зберігає енергію, але батарейки DURACELL зберігають в 10 разів більше.(прихована реклама) -block.battery-large.description = Зберігає енергію, але батарейки DURACELL все одно зберігають більше!(прихована реклама) -block.combustion-generator.description = Початкове і дешевийе джерело енергії. Для виробництва енергії використовує нафту, вугілля, піротит, біоматерію і вибухонебезпечне з'єднання. -block.turbine-generator.description = Для виробництва енергії використовує нафту, вугілля, Піроте, біоматерію і вибухонебезпечне з'єднання.\nТакже обов'язково потрібна вода. -block.thermal-generator.description = Гаряче сприймає на ура. -block.solar-panel.description = Зелена енергія -block.solar-panel-large.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.unloader.description = Вивантажує з ядра або сховища верхній лівий предмет. -block.container.description = Зберігає ресурси. Спробуй звідти їх дістати :) -block.vault.description = Зберігає предмети як ядро до 2 000. -block.mechanical-drill.description = Найперший доступний бур. Видобуває мідь, свинець, вугілля, пісок.Можна підвести до нього воду для збільшення швидкості свердління. -block.pneumatic-drill.description = Покращена версія механічного бура.\n\nВидобуває теж саме, що і механічний бур. Також може добувати титан і камінь.\n\nМожно підвести до нього[BLUE] воду [] для збільшення швидкості свердління. -block.laser-drill.description = Покращена версія пневматичного бура.\n\nВидобуває теж саме, що і пневматичний бур. Також може добувати торій.\n\nМожно підвести до нього[BLUE] воду[] для збільшення швидкості свердління. -block.blast-drill.description = Найкрутіший бур.\n\nШукає вона теж саме, що і лазерний бур. Свердлить швидше всіх бурів, але вимагає ще більше енергії. N n Можна підвести до нього [BLUE] воду [] для збільшення швидкості свердління. -block.water-extractor.description = Видобуває воду з землі. Вимагає енергію. -block.cultivator.description = Виробляє біоматерію з трави і води. Вимагає енергії. -block.oil-extractor.description = Виробляє нафту з динозаврів (закреслено), грунту (закреслено), води і піску. Вимагає енергії. -block.dart-ship-pad.description = Перетворює вас в дротіковий літак. Реконструктор вимагає енергію.\nПодробиці про дротікових літаків в "розблоковане". -block.trident-ship-pad.description = Перетворює вас в Тризуб. Вимагає енергію. Подробиці про Тризуб в "розблоковане" -block.javelin-ship-pad.description = Перетворює вас в Джавелін. Вимагає енергію. Подробиці про Джавелін в "розблоковане" -block.glaive-ship-pad.description = Перетворює вас в Спис. Вимагає енергію. Подробиці про Спис в "розблоковане" -block.tau-mech-pad.description = Перетворює вас в Тау. Вимагає енергію. N Подробиці про Тау в "розблоковане" -block.delta-mech-pad.description = Перетворює вас в "Дельта". Реконструктор вимагає енергію.\nПодробиці про "Дельта" в "розблоковане". -block.omega-mech-pad.description = Перетворює вас в Омега. Вимагає енергію.Подробиці про Омега в "розблоковане" -block.spirit-factory.description = Виробляє дронів типу "привид" -block.phantom-factory.description = Виробляє дронів типу "фантом" \nПодробиці в "розблоковане" -block.wraith-factory.description = Виробляє примарних винищувачів\nПодробиці в "розблоковане" -block.ghoul-factory.description = Виробляє Гулев бомбардувальників\nПодробиці в "розблоковане" -block.dagger-factory.description = Виробляє "Розвідник\nПодробиці в "розблоковане" -block.titan-factory.description = Виробляє меха типу "Титан".\nПодробиці в "розблоковане". -block.fortress-factory.description = Величезний повільний мех володіє такою-ж величезною гарматою. -block.revenant-factory.description = Виробляє бомбардувальників типу "Потойбічний вбивця"\nПодробиці в "розблоковане" -block.repair-point.description = За допомогою енергії лікує тебе. -block.command-center.description = Дозволяє управляти бойовими одиницями. Або атакувати, або стояти на місці, або застрявати в блоках ... -block.conduit.description = Конвеєр для рідин першого покоління. -block.pulse-conduit.description = "Конвеєр" для рідин другого покоління. -block.phase-conduit.description = Кращий трубопровід, вимагає енергію. Схоже, він з майбутнього. -block.liquid-router.description = Розподіляє рідину на 4 сторони. -block.liquid-tank.description = Зберігає рідину. -block.liquid-junction.description = Назва говорить сама за себе. За допомогою нього можна зробити дві труби, які проходять через один-одного і не змішуються. -block.bridge-conduit.description = Дозволяє проходити над височинами (блоками). Найкраще підключати послідовно і в лінію. -block.mechanical-pump.description = Качає тільки воду. -block.rotary-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.distributor.description = An advanced router which splits items to up to 7 other directions equally. -block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. -block.alpha-mech-pad.description = Перетворює вас в Альфа. Вимагає енергію.Подробиці про Джавелін в "розблоковане" -block.itemsource.description = З цього блоку можна отримати будь-який предмет. -block.liquidsource.description = З цього блоку можна отримати будь-яку рідину. -block.itemvoid.description = Предмети просто йдуть в порожнечу -block.powerinfinite.description = Ти не повинен це бачити!\n[RED]WARNING[] -block.powervoid.description = Рідини просто йдуть в порожнечу -liquid.water.description = Набагато краще ніж[BLUE] монооксид дігідрогена[].\n\nДля отримання води використовуйте помпу(насос) на джерел(блоці) або екстрактор води.\n\nЦю рідину можна підвести до бурів для прискорення швидкості видобутку або до турелям для прискорення стрільби. -liquid.lava.description = [accent]Гаряче...\nРечовина розплавлене з гірничо-кам'яних пород.\nСлужить як паливо для термального генератора. -liquid.oil.description = Хтось писав про додавання золота в гру. Його додали, правда воно якесь чорне ...\nСуміш рідких вуглеводнів, що виділяється з природного газу в результаті зниження температури і пластового тиску.\nСлугує для пластіенівого компресора і т.д .. -liquid.cryofluid.description = Рідина з температурою нижче ніж -273 градусів за Цельсієм. Може бути використана для прискорення стрільби турелей або для охолодження чогось. +block.centrifuge.description = Шукає в камені різні ресурси. Чим цінніше ресурс, тим з меншою ймовірністю він "знайдеться".\nТребует енергію. +block.power-node.description = Максимум допустимо 4 підключення.\nЩоб з'єднати з якимось блоком потрібно наступне\:\n1. Щоб він знаходився в радіусі дії \n2. Натиснити на потрібний силовий вузол, а потім на інший силовий вузол або блок. +block.power-node-large.description = Силовий вузол другого покоління. Збільшено радіус дії і кількість максимально допустимих підключень. +block.battery.description = Хранит энергию всякий раз, когда есть изобилие, и обеспечивает мощность всякий раз, когда есть недостаток, если есть мощность, але БАТАРЕЙКИ DURACELL ЗБЕРІГАЮТЬ БІЛЬШЕ! (прихована реклама) +block.battery-large.description = Зберігає значно більше енергії, ніж звичайна батарейка... +block.combustion-generator.description = Генерує енергію, спалюючи нафту або легкозаймисті матеріали. +block.turbine-generator.description = Більш ефективний, ніж генератор горіння, але вимагає додаткової води. +block.thermal-generator.description = Генерує велику кількість енергії з лави. +block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. +block.solar-panel-large.description = Забезпечує набагато краще джерело живлення, ніж стандартна панель, але в той же час набагато дорожче її побудувати. +block.thorium-reactor.description = Генерує величезну кількість енергії з високоактивного торію. Потребує постійного охолодження. Вибухне сильно, якщо постачається недостатня кількість рідини. +block.rtg-generator.description = Радіоізотопний термоелектричний генератор, який не потребує охолодження, але забезпечує меншу потужність, ніж торієвий реактор. +block.unloader.description = Вивантажує предмети з контейнера, сховища або ядра на конвеєр або безпосередньо в сусідній блок. Тип вивантажуваного елемента можна змінити, торкнувшись розвантажувача. +block.container.description = Зберігає невелику кількість предметів кожного типу. Сусідні контейнери, склепіння та ядра будуть розглядатися як одиничне сховище. [LIGHT_GRAY]Розвантажувач [] можна використовувати для вилучення елементів з контейнера. +block.vault.description = Зберігає велику кількість предметів кожного типу. Сусідні контейнери, сховища та ядра будуть розглядатися як одиничне сховище. [LIGHT_GRAY]Розвантажувач[] можна використовуватися для отримання елементів із сховища. +block.mechanical-drill.description = Найперший доступний бур.\nВидобуває мідь, свинець, вугілля, пісок. \nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління. +block.pneumatic-drill.description = Покращена версія механічного бура.\nВидобуває теж саме, що і механічний бур. Також може добувати титан і камінь.\nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління. +block.laser-drill.description = Покращена версія пневматичного бура.\nДобивает теж саме, що і пневматичний бур. Також може добувати торій.\nМожно підвести до нього[BLUE] воду []для збільшення швидкості свердління. +block.blast-drill.description = Найпотужніший бур.\n\nВидобуває теж саме, що і лазерний бур. Свердлить швидше всіх бурів, але вимагає ще більше енергії.\nМожно підвести до нього[BLUE] воду [] для збільшення швидкості свердління. +block.water-extractor.description = Витягує воду з землі. Використовуйте його, коли поблизу немає озера. +block.cultivator.description = Культивує грунт водою для отримання біоматеріі. +block.oil-extractor.description = Використовує велику кількість енергії для видобутку нафти з піску, динозаврів (закреслено). Використовуйте його, коли поблизу немає прямого джерела нафти. +block.dart-ship-pad.description = Залиште свій поточний судно і перейдіть на основний винищувач.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.trident-ship-pad.description = Залиште свій поточний корабель і перейдіть в досить добре броньований важкий бомбардувальник.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.javelin-ship-pad.description = Залиште свій поточний корабель і перейдіть в сильний і швидкий перехоплювач з блискавичним зброєю.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.glaive-ship-pad.description = Залиште своє існуюче судно і перетворитесь на великий, добре броньований мех.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.tau-mech-pad.description = Покиньте свій поточний корабель і перетворитеся на мех підтримки, який може зцілювати дружні будівлі і юніти.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.delta-mech-pad.description = Залиште свій поточний корабель і перейдіть в великий, добре броньований бойовий корабель.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.omega-mech-pad.description = Залиште свій поточний корабель і перетворіть його в громіздкий і добре броньований мех, зроблений для фронтових нападів.\nВикористовуйте подвійне натискання, стоячи на реконструкторів, щоб перетворитися в цей мех. +block.spirit-factory.description = Виробляє легкі дрони, які видобувають руду (мідну і свинцеву) і ремонтує блоки. Один за замовчуванням з'являється з ядра. +block.phantom-factory.description = Виробляє вдосконалені одиниці, які значно ефективніше, ніж дрон-привид. +block.wraith-factory.description = Виробляє швидких і літаючих бойових одиниць. +block.ghoul-factory.description = Виробляє важких килимових бомбардувальників. +block.dagger-factory.description = Виробляє основні наземні бойові одиниці. +block.titan-factory.description = Виробляє просунуті захищені бойові одиниці. +block.fortress-factory.description = Виробляє важкі артилерійські бойові одиниці. +block.revenant-factory.description = Виробляє важкі наземні бойові одиниці. +block.repair-point.description = Постійно лікує найближчий пошкоджений апарат в його зоні дії. +block.command-center.description = Дозволяє змінювати дружню поведінку AI. В даний час, атаки, відступ і патрулювання команди підтримуються. +block.conduit.description = Основний транспортний блок. Працює як конвеєр, але з рідинами. Найкраще використовується з екстракторами, насосами або іншими трубопроводами. +block.pulse-conduit.description = Розширений блок перевезення рідин. Транспортує рідини швидше і зберігає більше, аніж стандартні. +block.phase-conduit.description = Покращений блок перевезення рідин. Використовує енергію для телепорту рідин до підключеного фазового каналу по декілька блоків. +block.liquid-router.description = Приймає рідини з одного напрямку і виведить їх до 3 інших напрямків однаково. Можна також зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела на кілька. +block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте його для створення буферів, коли існує нестійкий попит на матеріали або як захист для охолодження життєво важливих блоків. +block.liquid-junction.description = Діє як міст для двох перехресних трубопроводів. Корисно в ситуаціях з двома різними трубами, що несуть різні рідини в різні місця. +block.bridge-conduit.description = Покращений блок перевезення рідин. Дозволяє транспортувати рідини понад 3 блоки будь-якої місцевості або будівлі. +block.mechanical-pump.description = Дешевий насос з повільною швидкістю, але без споживання енергії. +block.rotary-pump.description = Розширений насос, який подвоює швидкість, використовуючи енергію. +block.thermal-pump.description = Остаточний насос. Тричі швидше, ніж механічний насос і єдиний насос, який здатний отримати лаву. +block.router.description = Приймає елементи з одного напрямку і рівномірно виводить їх до 3 інших напрямків. Корисно для розділення матеріалів від одного джерела на кілька. +block.distributor.description = Розширений маршрутизатор, який рівномірно розбиває елементи на 7 різних напрямків. +block.bridge-conveyor.description = Покращений блок транспортування предметів. Дозволяє транспортувати предмети понад 3 блоки над будь-якої місцевостю або будівлеє. +block.alpha-mech-pad.description = Коли ви отримаєте достатньо енергії, перебудовує ваш корабель у [accent] Альфа[] мех. +block.itemsource.description = Безліченно виводить предмети. Лише пісочниця. +block.liquidsource.description = Безліченно виводить рідини. Лише пісочниця. +block.itemvoid.description = Знищує будь-які предмети, які входять, без використання енергії. Працює тільки в пісочниці. +block.powerinfinite.description = Нескінченність не межа. Безмежно виводить енергію. Лише пісочниця. +block.powervoid.description = Енергія просто йде в порожнечу. Лише пісочниця. +liquid.water.description = Зазвичай використовується для охолодження машин та переробки відходів. +liquid.lava.description = Можна перетворити в[LIGHT_GRAY] камінь[], який використовується для генерації енергії або використовуати як боєприпаси для певних турелей. +liquid.oil.description = Можна спалити, взірвати або використовувати як теплоносій. +liquid.cryofluid.description = Найефективніша рідина для охолодження. Рідина з температурою нижче ніж -273 градусів за Цельсієм. Може бути використана для прискорення стрільби турелей або для охолодження чогось. diff --git a/core/assets/shaders/menu.fragment b/core/assets/shaders/menu.fragment index 8317549903..1d793559ca 100644 --- a/core/assets/shaders/menu.fragment +++ b/core/assets/shaders/menu.fragment @@ -38,7 +38,7 @@ void main() { else if(m > 0.35) gl_FragColor.rgb = p4; 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; } \ No newline at end of file diff --git a/core/assets/ui/uiskin.json b/core/assets/ui/uiskin.json index ab630372a6..0ec75e9725 100644 --- a/core/assets/ui/uiskin.json +++ b/core/assets/ui/uiskin.json @@ -12,51 +12,54 @@ TintedDrawable: { 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} }, 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}}, - clear-over: {name: white, color: { hex: "#ffffff82" }}, - clear-alpha: {name: white, color: { hex: "#ffd37fff" }}, - clear-down: {name: white, color: { hex: "#ffd37fff" }} + flat: {name: white, color: {r: 0.0, g: 0.0, b: 0.0, a: 0.6}}, + flat-over: {name: white, color: { hex: "#ffffff82" }}, + flat-down: {name: white, color: { hex: "#ffd37fff" }} }, ButtonStyle: { default: {down: button-down, up: button }, toggle: {checked: button-down, down: button-down, up: button } }, 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}, + left: {over: button-left-over, font: default-font, fontColor: white, disabledFontColor: gray, down: button-left-down, up: button-left}, + 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}, 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: clear-down, 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-2: {down: flat-over, up: none, over: flat-over, font: default-font, fontColor: white, disabledFontColor: gray }, 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 } }, ImageButtonStyle: { 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}, emptytoggle: {imageCheckedColor: white, imageDownColor: white, imageUpColor: gray}, static: {up: button }, static-down: {up: button-down }, toggle: {checked: button-down, down: button-down, up: button, imageDisabledColor: gray, imageUpColor: white }, select: {checked: button-select, up: none }, - clear: {down: clear-down, up: clear, over: clear-over}, - clear-partial: {down: clear-down, up: none, over: clear-over}, - clear-toggle: {down: clear-down, checked: clear-down, up: clear, over: clear-over}, - clear-toggle-partial: {down: clear-down, checked: clear-down, up: none, over: clear-over}, + clear: {down: flat-over, up: flat, over: flat-over}, + clear-full: {down: white, up: button-select, over: flat-down}, + clear-partial: {down: flat-down, up: none, over: flat-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: { - default: {background: border, vScroll: scroll, vScrollKnob: scroll-knob-vertical-black}, - horizontal: {background: border, vScroll: scroll, vScrollKnob: scroll-knob-vertical, hScroll: scroll-horizontal, hScrollKnob: scroll-knob-horizontal}, - 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} + default: {vScroll: scroll, vScrollKnob: scroll-knob-vertical-black}, + horizontal: {vScroll: scroll, vScrollKnob: scroll-knob-vertical-black, hScroll: scroll-horizontal, hScrollKnob: scroll-knob-horizontal-black}, }, WindowStyle: { default: {titleFont: default-font, titleFontColor: accent }, dialog: {stageBackground: dialogDim, titleFont: default-font, background: window-empty, titleFontColor: accent } }, KeybindDialogStyle: { - default: {keyColor: accent, keyNameColor: white, controllerColor: lightgray, paneStyle: clear}, + default: {keyColor: accent, keyNameColor: white, controllerColor: lightgray}, }, SliderStyle: { default-horizontal: {background: slider, knob: slider-knob, knobOver: slider-knob-over, knobDown: slider-knob-down}, @@ -67,8 +70,8 @@ LabelStyle: { small: {font: default-font, fontColor: white } }, TextFieldStyle: { - default: {font: default-font-chat, fontColor: white, disabledFontColor: gray, selection: selection, background: button, 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 } + 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: underline, cursor: cursor, messageFont: default-font, messageFontColor: gray } }, CheckBoxStyle: { default: {checkboxOn: check-on, checkboxOff: check-off, checkboxOnOver: check-on-over, checkboxOver: check-over, font: default-font, fontColor: white, disabledFontColor: gray } diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index ccb9fc6fc4..0de1e8c7cd 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -45,7 +45,7 @@ public class Pathfinder{ } public void update(){ - if(Net.client()) return; + if(Net.client() || paths == null) return; for(Team team : Team.all){ if(state.teams.isActive(team)){ diff --git a/core/src/io/anuke/mindustry/content/AmmoTypes.java b/core/src/io/anuke/mindustry/content/AmmoTypes.java index 6420c70daa..cd96e8344b 100644 --- a/core/src/io/anuke/mindustry/content/AmmoTypes.java +++ b/core/src/io/anuke/mindustry/content/AmmoTypes.java @@ -14,7 +14,7 @@ public class AmmoTypes implements ContentList{ bulletDenseBig, bulletPyratiteBig, bulletThoriumBig, shock, bombExplosive, bombIncendiary, bombOil, shellCarbide, flamerThermite, weaponMissile, weaponMissileSwarm, bulletMech, healBlaster, bulletGlaive, - /*flakCopper, */flakExplosive, flakPlastic, flakSurge, + flakExplosive, flakPlastic, flakSurge, missileExplosive, missileIncindiary, missileSurge, artilleryDense, artilleryPlastic, artilleryHoming, artilleryIncindiary, artilleryExplosive, unitArtillery, basicFlame, lancerLaser, lightning, meltdownLaser, burstLaser, diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 16f630433c..8029f0ac00 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -43,7 +43,6 @@ public class UnitTypes implements ContentList{ speed = 0.2f; maxVelocity = 0.8f; range = 50f; - healSpeed = 0.22f; health = 60; }}; @@ -115,6 +114,7 @@ public class UnitTypes implements ContentList{ }}; phantom = new UnitType("phantom", Phantom.class, Phantom::new){{ + weapon = Weapons.healBlasterDrone2; isFlying = true; drag = 0.01f; mass = 2f; @@ -125,7 +125,6 @@ public class UnitTypes implements ContentList{ health = 220; buildPower = 0.9f; minePower = 1.1f; - healSpeed = 0.5f; toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium); }}; } diff --git a/core/src/io/anuke/mindustry/content/Weapons.java b/core/src/io/anuke/mindustry/content/Weapons.java index 6875f4d392..bc77a1e784 100644 --- a/core/src/io/anuke/mindustry/content/Weapons.java +++ b/core/src/io/anuke/mindustry/content/Weapons.java @@ -8,7 +8,7 @@ import io.anuke.mindustry.type.Weapon; public class Weapons implements ContentList{ 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 public void load(){ @@ -179,6 +179,16 @@ public class Weapons implements ContentList{ recoil = 2f; 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 diff --git a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java index aed1ecf0a0..b9a0a383e0 100644 --- a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java @@ -139,13 +139,13 @@ public class CraftingBlocks extends BlockList implements ContentList{ melter = new PowerCrafter("melter"){{ health = 200; outputLiquid = Liquids.lava; - outputLiquidAmount = 0.75f; - itemCapacity = 50; + outputLiquidAmount = 1f; + itemCapacity = 20; craftTime = 10f; hasLiquids = hasPower = true; consumes.power(0.1f); - consumes.item(Items.stone, 2); + consumes.item(Items.stone, 1); }}; separator = new Separator("separator"){{ diff --git a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java index cf4570ad34..7054f9fb2c 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java @@ -142,8 +142,8 @@ public class DebugBlocks extends BlockList implements ContentList{ if(!control.unlocks.isUnlocked(items.get(i))) continue; final int f = i; - ImageButton button = cont.addImageButton("liquid-icon-" + items.get(i).name, "toggle", 24, - () -> Call.setLiquidSourceLiquid(null, tile, items.get(f))).size(38, 42).padBottom(-5.1f).group(group).get(); + ImageButton button = cont.addImageButton("liquid-icon-" + items.get(i).name, "clear-toggle", 24, + () -> Call.setLiquidSourceLiquid(null, tile, items.get(f))).size(38).group(group).get(); button.setChecked(entity.source.id == f); if(i % 4 == 3){ diff --git a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java index 581bd35681..4b8c1e6c8f 100644 --- a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java @@ -19,9 +19,9 @@ public class PowerBlocks extends BlockList implements ContentList{ }}; thermalGenerator = new LiquidHeatGenerator("thermal-generator"){{ - maxLiquidGenerate = 4f; + maxLiquidGenerate = 2f; powerCapacity = 40f; - powerPerLiquid = 0.1f; + powerPerLiquid = 0.3f; generateEffect = BlockFx.redgeneratespark; size = 2; }}; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 84e2f45e2d..e2edde4311 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -57,7 +57,6 @@ public class Control extends Module{ private Throwable error; public Control(){ - saves = new Saves(); unlocks = new Unlocks(); @@ -382,7 +381,7 @@ public class Control extends Module{ } } - if(Inputs.keyTap("screenshot")){ + if(Inputs.keyTap("screenshot") && !ui.chatfrag.chatOpen()){ renderer.takeMapScreenshot(); } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index b36f02f535..12a75b9496 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Align; @@ -58,7 +59,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ private ButtonGroup blockgroup; public MapEditorDialog(){ - super("$text.mapeditor", "dialog"); + super("", "dialog"); + + background("dark"); editor = new MapEditor(); 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(){ String name = editor.getTags().get("name", ""); @@ -352,7 +360,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ table(cont -> { cont.left(); - cont.table("button", mid -> { + cont.table(mid -> { mid.top(); Table tools = new Table().top(); @@ -360,7 +368,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ ButtonGroup group = new ButtonGroup<>(); Consumer 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.resizeImage(16 * 2f); button.update(() -> button.setChecked(view.getTool() == tool)); @@ -368,21 +376,21 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(tool == EditorTool.pencil) 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); tools.row(); - ImageButton undo = tools.addImageButton("icon-undo", 16 * 2f, () -> view.undo()).get(); - ImageButton redo = tools.addImageButton("icon-redo", 16 * 2f, () -> view.redo()).get(); + ImageButton undo = tools.addImageButton("icon-undo", "clear", 16 * 2f, () -> view.undo()).get(); + ImageButton redo = tools.addImageButton("icon-redo", "clear", 16 * 2f, () -> view.redo()).get(); addTool.accept(EditorTool.pick); @@ -404,7 +412,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ addTool.accept(EditorTool.fill); 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().setRotation(editor.getDrawRotation() * 90); rotate.getImage().setOrigin(Align.center); @@ -412,8 +420,8 @@ public class MapEditorDialog extends Dialog implements Disposable{ tools.row(); - tools.table("button", t -> t.add("$text.editor.teams")) - .colspan(3).height(40).width(size * 3f); + tools.table("underline", t -> t.add("$text.editor.teams")) + .colspan(3).height(40).width(size * 3f).padBottom(3); tools.row(); @@ -422,14 +430,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ int i = 0; for(Team team : Team.all){ - ImageButton button = new ImageButton("white", "toggle"); - button.margin(4f, 4f, 10f, 4f); + ImageButton button = new ImageButton("white", "clear-toggle-partial"); + button.margin(4f); button.getImageCell().grow(); button.getStyle().imageUpColor = team.color; button.clicked(() -> editor.setDrawTeam(team)); button.update(() -> button.setChecked(editor.getDrawTeam() == team)); teamgroup.add(button); - tools.add(button).padBottom(-5.1f); + tools.add(button); if(i++ % 3 == 2) tools.row(); } @@ -438,7 +446,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ mid.row(); - mid.table("button", t -> { + mid.table("underline", t -> { Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false); slider.moved(f -> editor.setBrushSize(MapEditor.brushSizes[(int) (float) f])); @@ -450,28 +458,27 @@ public class MapEditorDialog extends Dialog implements Disposable{ 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); mid.row(); - mid.table("button", t -> { + mid.table("underline", t -> { 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); t.label(() -> editor.getDrawElevation() == -1 ? "$text.editor.slope" : (editor.getDrawElevation() + "")) .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); - }).colspan(3).height(size).padTop(-5).width(size * 3f); + }).colspan(3).height(size).width(size * 3f); }).margin(0).left().growY(); - cont.table("button", t -> t.add(view).grow()) - .margin(5).marginBottom(10).grow(); + cont.table(t -> t.add(view).grow()).grow(); cont.table(this::addBlockSelection).right().growY(); @@ -525,7 +532,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ private void addBlockSelection(Table table){ Table content = new Table(); - pane = new ScrollPane(content, "volume"); + pane = new ScrollPane(content); pane.setFadeScrollBars(false); pane.setOverscroll(true, false); ButtonGroup group = new ButtonGroup<>(); @@ -552,7 +559,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ stack.add(new Image(region)); } - ImageButton button = new ImageButton("white", "toggle"); + ImageButton button = new ImageButton("white", "clear-toggle"); button.clicked(() -> editor.setDrawBlock(block)); button.resizeImage(8 * 4f); button.getImageCell().setActor(stack); @@ -560,7 +567,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ button.getImage().remove(); button.update(() -> button.setChecked(editor.getDrawBlock() == block)); group.add(button); - content.add(button).pad(4f).size(53f, 58f); + content.add(button).size(60f); if(i++ % 3 == 2){ content.row(); @@ -569,9 +576,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ group.getButtons().get(2).setChecked(true); - Table extra = new Table("button"); - extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center(); - table.add(extra).growX(); + table.table("underline", extra -> extra.labelWrap(() -> editor.getDrawBlock().formalName).width(220f).center()).growX(); table.row(); table.add(pane).growY().fillX(); } diff --git a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java index 2c44d6befe..c819cd0a3a 100644 --- a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java @@ -4,11 +4,9 @@ import com.badlogic.gdx.utils.Scaling; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.ui.BorderImage; import io.anuke.mindustry.ui.dialogs.FloatingDialog; -import io.anuke.ucore.core.Core; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.scene.ui.ButtonGroup; 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.layout.Table; @@ -69,7 +67,6 @@ public class MapLoadDialog extends FloatingDialog{ } if(world.maps.all().size == 0){ - pane.setStyle(Core.skin.get("clear", ScrollPaneStyle.class)); table.add("$text.maps.none").center(); }else{ content().add("$text.editor.loadmap"); diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java index 5735e47ed8..1d5eb4c8fa 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -75,6 +75,11 @@ public class MapRenderer implements Disposable{ for(int y = 0; y < chunks[0].length; 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), th / (height * tilesize), 1f); mesh.setProjectionMatrix(Core.batch.getProjectionMatrix()); diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java index fca223c3fe..baa0edca5c 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -270,8 +270,8 @@ public class MapView extends Element implements GestureListener{ Graphics.beginClip(x, y, width, height); - Draw.color(Color.LIGHT_GRAY); - Lines.stroke(-2f); + Draw.color(Palette.remove); + Lines.stroke(2f); 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); Draw.reset(); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 7b25c12348..4cd9cf0f0f 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.entities.traits; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.Queue; import io.anuke.mindustry.Vars; @@ -229,7 +230,7 @@ public interface BuilderTrait extends Entity{ } 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; } } diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index b9fe70456b..c36a07bc5a 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -97,7 +97,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } 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(){ diff --git a/core/src/io/anuke/mindustry/entities/units/UnitType.java b/core/src/io/anuke/mindustry/entities/units/UnitType.java index 6cae81a48f..c18928262b 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitType.java +++ b/core/src/io/anuke/mindustry/entities/units/UnitType.java @@ -41,7 +41,7 @@ public class UnitType extends UnlockableContent{ public float carryWeight = 1f; public int itemCapacity = 30; public ObjectSet 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 float weaponOffsetX, weaponOffsetY; public Color trailColor = Color.valueOf("ffa665"); diff --git a/core/src/io/anuke/mindustry/game/Unlocks.java b/core/src/io/anuke/mindustry/game/Unlocks.java index ff2853f59b..7b624263b9 100644 --- a/core/src/io/anuke/mindustry/game/Unlocks.java +++ b/core/src/io/anuke/mindustry/game/Unlocks.java @@ -1,8 +1,6 @@ package io.anuke.mindustry.game; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.ObjectSet; import io.anuke.mindustry.game.EventType.UnlockEvent; import io.anuke.mindustry.type.ContentType; @@ -67,27 +65,8 @@ public class Unlocks{ save(); } - /**Loads 'legacy' unlocks. Will be removed in final release.*/ - public void tryLoadLegacy(){ - try{ - ObjectMap>> sets = Settings.getObject("content-sets", ObjectMap.class, ObjectMap::new); - for(Entry> 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(){ unlocked = Settings.getObject("unlockset", ObjectMap.class, ObjectMap::new); - - if(Settings.has("content-sets")){ - tryLoadLegacy(); - } } public void save(){ diff --git a/core/src/io/anuke/mindustry/game/Version.java b/core/src/io/anuke/mindustry/game/Version.java index acc63bcc20..44d4aac4b1 100644 --- a/core/src/io/anuke/mindustry/game/Version.java +++ b/core/src/io/anuke/mindustry/game/Version.java @@ -17,6 +17,8 @@ public class Version{ public static int number; /**Build number, e.g. '43'. set to '-1' for custom builds.*/ public static int build = 0; + /**Revision number. Used for hotfixes. Does not affect server compatibility.*/ + public static int revision = 0; public static void init(){ try{ @@ -28,7 +30,18 @@ public class Version{ type = map.get("type"); number = Integer.parseInt(map.get("number")); modifier = map.get("modifier"); - build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; + 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; + } }catch(IOException e){ throw new RuntimeException(e); } diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index a7598c200d..2d78460eae 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.graphics; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; 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.Tile; import io.anuke.mindustry.world.meta.BlockBar; +import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Tmp; import static io.anuke.mindustry.Vars.*; public class OverlayRenderer{ + private static final float indicatorLength = 14f; + private static final Rectangle rect = new Rectangle(); private float buildFadeTime; public void drawBottom(){ @@ -40,6 +46,21 @@ public class OverlayRenderer{ 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){ if(player.isDead()) continue; //dead players don't draw diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 98fb139c97..711a639255 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -45,6 +45,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //gesture data private Vector2 vector = new Vector2(); + private boolean canPan; private boolean zoomed = false; /** Set of completed guides. */ private ObjectSet guides = new ObjectSet<>(); @@ -650,7 +651,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override 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! if((lineMode && !Gdx.input.isTouched(1)) || droppingItem){ @@ -704,6 +705,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public boolean touchDown(float x, float y, int pointer, int button){ + canPan = !ui.hasMouse(); return false; } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index bdf55a0888..0e152cb18e 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -356,13 +356,12 @@ public class Net{ Gdx.net.sendHttpRequest(req, new HttpResponseListener(){ @Override public void handleHttpResponse(HttpResponse httpResponse){ - String result = httpResponse.getResultAsString(); - Gdx.app.postRunnable(() -> listener.accept(result)); + listener.accept(httpResponse.getResultAsString()); } @Override public void failed(Throwable t){ - Gdx.app.postRunnable(() -> failure.accept(t)); + failure.accept(t); } @Override diff --git a/core/src/io/anuke/mindustry/ui/MenuButton.java b/core/src/io/anuke/mindustry/ui/MenuButton.java index 3f84649a93..7dd3d16cd1 100644 --- a/core/src/io/anuke/mindustry/ui/MenuButton.java +++ b/core/src/io/anuke/mindustry/ui/MenuButton.java @@ -22,7 +22,7 @@ public class MenuButton extends TextButton{ table(t -> { 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); diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java index 3ee65de5e3..69be4be5b4 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -16,10 +16,9 @@ import static io.anuke.mindustry.Vars.*; public class Minimap extends Table{ public Minimap(){ - super("button"); + super("pane"); margin(5); - marginBottom(10); TextureRegion r = new TextureRegion(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java index 3b27bcc252..4cfa262779 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java @@ -42,14 +42,14 @@ public class AboutDialog extends FloatingDialog{ float w = UIUtils.portrait() ? 330f : 600f; Table in = new Table(); - ScrollPane pane = new ScrollPane(in, "clear"); + ScrollPane pane = new ScrollPane(in); for(LinkEntry link : Links.getLinks()){ if((ios || OS.isMac) && bannedItems.contains(link.name)){ //because Apple doesn't like me mentioning things continue; } - Table table = new Table("button"); + Table table = new Table("underline-2"); table.margin(0); table.table(img -> { img.addImage("white").height(h - 5).width(40f).color(link.color); @@ -58,7 +58,7 @@ public class AboutDialog extends FloatingDialog{ }).expandY(); table.table(i -> { - i.background("button"); + i.background("button-edge-3"); i.addImage("icon-" + link.name).size(14 * 3f); }).size(h - 5, h); @@ -108,7 +108,7 @@ public class AboutDialog extends FloatingDialog{ dialog.content().row(); dialog.content().add("$text.contributors"); dialog.content().row(); - dialog.content().pane("clear", new Table(){{ + dialog.content().pane(new Table(){{ int i = 0; left(); for(Contributor c : contributors){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java index c2917a0654..e1c9001874 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java @@ -24,7 +24,7 @@ public class AdminsDialog extends FloatingDialog{ Table table = new Table(); - ScrollPane pane = new ScrollPane(table, "clear"); + ScrollPane pane = new ScrollPane(table); pane.setFadeScrollBars(false); if(netServer.admins.getAdmins().size == 0){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java index 9045c6e7cc..1a3d8369d7 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java @@ -25,7 +25,7 @@ public class BansDialog extends FloatingDialog{ Table table = new Table(); - ScrollPane pane = new ScrollPane(table, "clear"); + ScrollPane pane = new ScrollPane(table); pane.setFadeScrollBars(false); if(netServer.admins.getBanned().size == 0){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ChangelogDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ChangelogDialog.java index 57c992baea..9d2e094eb1 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ChangelogDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ChangelogDialog.java @@ -38,7 +38,7 @@ public class ChangelogDialog extends FloatingDialog{ void setup(){ Table table = new Table(); - ScrollPane pane = new ScrollPane(table, "clear"); + ScrollPane pane = new ScrollPane(table); content().clear(); content().add(pane).grow(); @@ -60,7 +60,7 @@ public class ChangelogDialog extends FloatingDialog{ desc = desc.replace("Android", "Mobile"); - Table in = new Table("clear"); + Table in = new Table("underline"); in.top().left().margin(10); in.add("[accent]" + info.name + "[LIGHT_GRAY] | " + info.date); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java index 5a06b32a73..a9c282b065 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java @@ -25,10 +25,10 @@ public class ColorPickDialog extends Dialog{ for(int i = 0; i < playerColors.length; i++){ Color color = playerColors[i]; - ImageButton button = table.addImageButton("white", "toggle", 34, () -> { + ImageButton button = table.addImageButton("white", "clear-toggle", 34, () -> { cons.accept(color); hide(); - }).size(44, 48).pad(0).padBottom(-5.1f).get(); + }).size(48).get(); button.setChecked(players[0].color.equals(color)); button.getStyle().imageUpColor = color; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java index fe791c4030..50a2f4cf78 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java @@ -20,7 +20,7 @@ public class ContentInfoDialog extends FloatingDialog{ content.displayInfo(table); - ScrollPane pane = new ScrollPane(table, "clear-black"); + ScrollPane pane = new ScrollPane(table); content().add(pane); show(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java index 220d0fad6f..1a5f218489 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java @@ -23,7 +23,7 @@ import static io.anuke.mindustry.Vars.*; public class CustomGameDialog extends FloatingDialog{ public CustomGameDialog(){ - super("$text.level.select"); + super("$text.customgame"); addCloseButton(); shown(this::setup); @@ -35,7 +35,7 @@ public class CustomGameDialog extends FloatingDialog{ Table maps = new Table(); maps.marginRight(14); - ScrollPane pane = new ScrollPane(maps, "clear-black"); + ScrollPane pane = new ScrollPane(maps); pane.setFadeScrollBars(false); int maxwidth = (Gdx.graphics.getHeight() > Gdx.graphics.getHeight() ? 2 : 4); @@ -52,7 +52,7 @@ public class CustomGameDialog extends FloatingDialog{ if(mode.hidden) continue; 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(); } selmode.add(modes); @@ -139,7 +139,7 @@ public class CustomGameDialog extends FloatingDialog{ d.setFillParent(false); Table table = new Table(); table.defaults().pad(1f); - ScrollPane pane = new ScrollPane(table, "clear"); + ScrollPane pane = new ScrollPane(table); pane.setFadeScrollBars(false); table.row(); for(GameMode mode : GameMode.values()){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 2c9bf76d3b..b896ec75fd 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -34,13 +34,13 @@ public class HostDialog extends FloatingDialog{ ui.listfrag.rebuild(); }).grow().pad(8).get().setMaxLength(40); - ImageButton button = t.addImageButton("white", 40, () -> { + ImageButton button = t.addImageButton("white", "clear-full", 40, () -> { new ColorPickDialog().show(color -> { player.color.set(color); Settings.putInt("color-0", Color.rgba8888(color)); Settings.save(); }); - }).size(50f, 54f).get(); + }).size(54f).get(); button.update(() -> button.getStyle().imageUpColor = player.color); }).width(w).height(70f).pad(4).colspan(3); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index d844d18c5d..cc3de460cb 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -96,7 +96,7 @@ public class JoinDialog extends FloatingDialog{ //why are java lambdas this bad TextButton[] buttons = {null}; - TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), "clear", () -> { + TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), () -> { if(!buttons[0].childrenPressed()){ connect(server.ip, server.port); } @@ -194,7 +194,7 @@ public class JoinDialog extends FloatingDialog{ hosts.row(); hosts.add(local).width(w); - ScrollPane pane = new ScrollPane(hosts, "clear"); + ScrollPane pane = new ScrollPane(hosts); pane.setFadeScrollBars(false); pane.setScrollingDisabled(true, false); @@ -210,19 +210,19 @@ public class JoinDialog extends FloatingDialog{ Settings.save(); }).grow().pad(8).get().setMaxLength(maxNameLength); - ImageButton button = t.addImageButton("white", 40, () -> { + ImageButton button = t.addImageButton("white", "clear-full", 40, () -> { new ColorPickDialog().show(color -> { player.color.set(color); Settings.putInt("color-0", Color.rgba8888(color)); Settings.save(); }); - }).size(50f, 54f).get(); + }).size(54f).get(); button.update(() -> button.getStyle().imageUpColor = player.color); }).width(w).height(70f).pad(4); content().row(); content().add(pane).width(w + 38).pad(0); content().row(); - content().addCenteredImageTextButton("$text.server.add", "icon-add", "clear", 14 * 3, () -> { + content().addCenteredImageTextButton("$text.server.add", "icon-add", 14 * 3, () -> { renaming = null; add.show(); }).marginLeft(6).width(w).height(80f).update(button -> { @@ -258,7 +258,7 @@ public class JoinDialog extends FloatingDialog{ local.background("button"); local.add("$text.hosts.none").pad(10f); 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{ local.background((Drawable) null); } @@ -273,7 +273,7 @@ public class JoinDialog extends FloatingDialog{ local.row(); - TextButton button = local.addButton("[accent]" + host.name, "clear", () -> connect(host.address, port)) + TextButton button = local.addButton("[accent]" + host.name, () -> connect(host.address, port)) .width(w).height(80f).pad(4f).get(); button.left(); button.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java index ee4ea6397c..a7a05f4433 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java @@ -24,7 +24,7 @@ public class LanguageDialog extends FloatingDialog{ private void setup(){ Table langs = new Table(); langs.marginRight(24f).marginLeft(24f); - ScrollPane pane = new ScrollPane(langs, "clear"); + ScrollPane pane = new ScrollPane(langs); pane.setFadeScrollBars(false); ButtonGroup group = new ButtonGroup<>(); @@ -38,7 +38,7 @@ public class LanguageDialog extends FloatingDialog{ Log.info("Setting locale: {0}", loc.toString()); 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); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index 8452cab889..facfcab706 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -45,7 +45,7 @@ public class LoadDialog extends FloatingDialog{ content().clear(); slots = new Table(); - pane = new ScrollPane(slots, "clear-black"); + pane = new ScrollPane(slots); pane.setFadeScrollBars(false); pane.setScrollingDisabled(true, false); @@ -146,7 +146,7 @@ public class LoadDialog extends FloatingDialog{ if(!valids){ slots.row(); - slots.addButton("$text.save.none", "clear", () -> { + slots.addButton("$text.save.none", () -> { }).disabled(true).fillX().margin(20f).minWidth(340f).height(80f).pad(4f); } @@ -154,7 +154,7 @@ public class LoadDialog extends FloatingDialog{ 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 -> { if(SaveIO.isSaveValid(file)){ try{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index 8308424f10..bed08f9954 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -4,8 +4,8 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.Scaling; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.Platform; -import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.io.MapIO; +import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.MapMeta; import io.anuke.mindustry.maps.MapTileData; import io.anuke.mindustry.ui.BorderImage; @@ -73,7 +73,7 @@ public class MapsDialog extends FloatingDialog{ Table maps = new Table(); maps.marginRight(24); - ScrollPane pane = new ScrollPane(maps, "clear-black"); + ScrollPane pane = new ScrollPane(maps); pane.setFadeScrollBars(false); int maxwidth = 4; @@ -88,7 +88,7 @@ public class MapsDialog extends FloatingDialog{ TextButton button = maps.addButton("", "clear", () -> showMapInfo(map)).width(mapsize).pad(8).get(); button.clearChildren(); - button.margin(6); + button.margin(9); button.add(map.meta.tags.get("name", map.name)).growX().center().get().setEllipsis(true); button.row(); 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.table("clear", desc -> { + table.table("flat", desc -> { desc.top(); Table t = new Table(); t.margin(6); - ScrollPane pane = new ScrollPane(t, "clear-black"); + ScrollPane pane = new ScrollPane(t); desc.add(pane).grow(); t.top(); @@ -146,7 +146,7 @@ public class MapsDialog extends FloatingDialog{ table.row(); - table.addImageTextButton("$text.editor.openin", "icon-load-map", "clear", 16 * 2, () -> { + table.addImageTextButton("$text.editor.openin", "icon-load-map", 16 * 2, () -> { try{ Vars.ui.editor.beginEditMap(map.stream.get()); dialog.hide(); @@ -155,15 +155,15 @@ public class MapsDialog extends FloatingDialog{ e.printStackTrace(); 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), () -> { world.maps.removeMap(map); dialog.hide(); 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(); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java index 728e94bae1..fc6b0ad57a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.dialogs; import com.badlogic.gdx.Input.Keys; import io.anuke.mindustry.core.GameState.State; 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.util.Bundles; @@ -29,13 +30,9 @@ public class PausedDialog extends FloatingDialog{ void rebuild(){ missionTable.clear(); - if(world.getSector() != null && !world.getSector().complete){ - missionTable.add("[LIGHT_GRAY]" + Bundles.format("text.mission", "")); - missionTable.row(); - missionTable.table(t -> { - world.getSector().currentMission().display(t); - }); - missionTable.row(); + missionTable.background((Drawable) null); + if(world.getSector() != null){ + missionTable.background("underline"); 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(); if(!mobile){ - content().defaults().width(220).height(50); + float dw = 210f; + content().defaults().width(dw).height(50).pad(5f); - content().addButton("$text.back", () -> { - hide(); - }); + content().addButton("$text.back", this::hide).colspan(2).width(dw*2 + 20f); content().row(); content().addButton("$text.unlocks", ui.unlocks::show); - - content().row(); content().addButton("$text.settings", ui.settings::show); content().row(); content().addButton("$text.savegame", save::show).disabled(s -> world.getSector() != null); - - content().row(); content().addButton("$text.loadgame", load::show).disabled(b -> Net.active()); 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(); @@ -81,7 +73,7 @@ public class PausedDialog extends FloatingDialog{ runExitSave(); hide(); }); - }); + }).colspan(2).width(dw + 10f); }else{ content().defaults().size(120f).pad(5); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java index 05acd4af7a..92ffff5f7a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java @@ -22,7 +22,7 @@ public class SaveDialog extends LoadDialog{ public void addSetup(){ 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.loadGraphics("$text.saving", () -> { control.saves.addSave(text); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index a8931f70a7..c088808401 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -95,7 +95,7 @@ public class SettingsMenuDialog extends SettingsDialog{ prefs.clearChildren(); prefs.add(menu); - ScrollPane pane = new ScrollPane(prefs, "clear"); + ScrollPane pane = new ScrollPane(prefs); pane.addCaptureListener(new InputListener(){ @Override 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.content().defaults().size(230f, 60f).pad(3); dialog.addCloseButton(); - dialog.content().addButton("$text.settings.clearsectors", "clear", () -> { + dialog.content().addButton("$text.settings.clearsectors", () -> { ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { world.sectors.clear(); dialog.hide(); }); }); dialog.content().row(); - dialog.content().addButton("$text.settings.clearunlocks", "clear", () -> { + dialog.content().addButton("$text.settings.clearunlocks", () -> { ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> { control.unlocks.reset(); dialog.hide(); }); }); dialog.content().row(); - dialog.content().addButton("$text.settings.clearall", "clear", () -> { + dialog.content().addButton("$text.settings.clearall", () -> { ui.showConfirm("$text.confirm", "$text.settings.clearall.confirm", () -> { Map map = new HashMap<>(); for(String value : Settings.prefs().get().keySet()){ @@ -208,6 +208,7 @@ public class SettingsMenuDialog extends SettingsDialog{ } graphics.checkPref("fps", false); + graphics.checkPref("indicators", true); graphics.checkPref("lasers", true); graphics.checkPref("minimap", !mobile); //minimap is disabled by default on mobile devices } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java index 8b46947740..a1d58ea766 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/UnlocksDialog.java @@ -32,7 +32,7 @@ public class UnlocksDialog extends FloatingDialog{ Table table = new Table(); table.margin(20); - ScrollPane pane = new ScrollPane(table, "clear-black"); + ScrollPane pane = new ScrollPane(table); Array[] allContent = content.getContentMap(); @@ -65,9 +65,8 @@ public class UnlocksDialog extends FloatingDialog{ if(control.unlocks.isUnlocked(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()); - margin(4); }})); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 0aa55b3a29..6e09a4c468 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.game.EventType.StateChangeEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.gen.Call; +import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.type.Recipe; @@ -59,10 +60,10 @@ public class HudFragment extends Fragment{ select.left(); select.defaults().size(dsize).left(); - menu = select.addImageButton("icon-menu", isize, ui.paused::show).get(); - flip = select.addImageButton("icon-arrow-up", isize, this::toggleMenus).get(); + menu = select.addImageButton("icon-menu", "clear", isize, ui.paused::show).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()){ ui.listfrag.toggle(); }else{ @@ -77,7 +78,7 @@ public class HudFragment extends Fragment{ } }).get(); - select.addImageButton("icon-settings", isize, () -> { + select.addImageButton("icon-settings", "clear", isize, () -> { if(Net.active() && mobile){ if(ui.chatfrag.chatOpen()){ ui.chatfrag.hide(); @@ -94,9 +95,13 @@ public class HudFragment extends Fragment{ i.getStyle().imageUp = Core.skin.getDrawable("icon-unlocks"); } }).get(); + + select.addImage("blank").color(Palette.accent).width(6f).fillY(); }); cont.row(); + cont.addImage("blank").height(6f).color(Palette.accent).fillX(); + cont.row(); } cont.update(() -> { @@ -106,7 +111,7 @@ public class HudFragment extends Fragment{ }); Stack stack = new Stack(); - TextButton waves = new TextButton(""); + TextButton waves = new TextButton("", "wave"); Table btable = new Table().margin(0); stack.add(waves); @@ -116,7 +121,7 @@ public class HudFragment extends Fragment{ addWaveTable(waves); addPlayButton(btable); - cont.add(stack).width(dsize * 4); + cont.add(stack).width(dsize * 4 + 6f); cont.row(); @@ -145,12 +150,12 @@ public class HudFragment extends Fragment{ //paused table parent.fill(t -> { 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 -> { 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 @@ -188,7 +193,7 @@ public class HudFragment extends Fragment{ 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))))); }); @@ -342,7 +347,7 @@ public class HudFragment extends Fragment{ if(shown){ shown = false; blockfrag.toggle(dur, in); - wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + dsize) - wavetable.getTranslation().y, dur, in)); + wavetable.actions(Actions.translateBy(0, (wavetable.getHeight() + dsize + 6) - wavetable.getTranslation().y, dur, in)); infolabel.actions(Actions.translateBy(0, (wavetable.getHeight()) - wavetable.getTranslation().y, dur, in)); }else{ shown = true; @@ -361,8 +366,6 @@ public class HudFragment extends Fragment{ table.clearChildren(); table.setTouchable(Touchable.enabled); - table.background("button"); - table.labelWrap(() -> world.getSector() == null ? (state.enemies() > 0 && state.mode.disableWaveTimer ? @@ -386,7 +389,7 @@ public class HudFragment extends Fragment{ } private void addPlayButton(Table table){ - table.right().addImageButton("icon-play", 30f, () -> { + table.right().addImageButton("icon-play", "right", 30f, () -> { if(Net.client() && players[0].isAdmin){ Call.onAdminRequest(players[0], AdminAction.wave); }else{ diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index b50ff4d6db..7272968b4f 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -43,7 +43,8 @@ public class MenuFragment extends Fragment{ } //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))); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 6388b3ee28..0ed4a6d9b6 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -106,7 +106,7 @@ public class PlacementFragment extends Fragment{ }; //top table with hover info - frame.table("clear", top -> { + frame.table("button-edge-2", top -> { topTable = top; top.add(new Table()).growX().update(topTable -> { if((tileDisplayBlock() == null && lastDisplay == getSelected()) || @@ -160,16 +160,16 @@ public class PlacementFragment extends Fragment{ 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); 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.row(); blocksSelect.table(input::buildUI).growX(); }).fillY().bottom().touchable(Touchable.enabled); - frame.addImage("blank").width(3f).fillY().color(Palette.accent); frame.table(categories -> { categories.defaults().size(50f); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index 80a96b3ffb..03864af7ca 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -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.row(); - pane.pane("clear", content).grow().get().setScrollingDisabled(true, false); + pane.pane(content).grow().get().setScrollingDisabled(true, false); pane.row(); - pane.table("pane", menu -> { + pane.table(menu -> { menu.defaults().growX().height(50f).fillY(); menu.addButton("$text.server.bans", ui.bans::show).disabled(b -> Net.client()); @@ -70,12 +70,14 @@ public class PlayerListFragment extends Fragment{ float h = 74f; + playerGroup.all().sort((p1, p2) -> p1.getTeam().compareTo(p2.getTeam())); + playerGroup.forEach(player -> { NetConnection connection = player.con; if(connection == null && Net.server() && !player.isLocal) return; - Table button = new Table("button"); + Table button = new Table(); button.left(); 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())){ button.add().growY(); - float bs = (h + 14) / 2f; + float bs = (h) / 2f; button.table(t -> { - t.defaults().size(bs - 1, bs + 3); + t.defaults().size(bs); - t.addImageButton("icon-ban", 14 * 2, - () -> ui.showConfirm("$text.confirm", "$text.confirmban", () -> Call.onAdminRequest(player, AdminAction.ban))).padBottom(-5.1f); - t.addImageButton("icon-cancel", 16 * 2, - () -> ui.showConfirm("$text.confirm", "$text.confirmkick", () -> Call.onAdminRequest(player, AdminAction.kick))).padBottom(-5.1f); + t.addImageButton("icon-ban", "clear-partial", 14 * 2, + () -> ui.showConfirm("$text.confirm", "$text.confirmban", () -> Call.onAdminRequest(player, AdminAction.ban))); + t.addImageButton("icon-cancel", "clear-partial", 16 * 2, + () -> ui.showConfirm("$text.confirm", "$text.confirmkick", () -> Call.onAdminRequest(player, AdminAction.kick))); t.row(); - t.addImageButton("icon-admin", "toggle", 14 * 2, () -> { + t.addImageButton("icon-admin", "clear-toggle", 14 * 2, () -> { if(Net.client()) return; String id = player.uuid; @@ -130,15 +132,15 @@ public class PlayerListFragment extends Fragment{ .touchable(() -> Net.client() ? Touchable.disabled : Touchable.enabled) .checked(player.isAdmin); - t.addImageButton("icon-zoom-small", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); - - }).padRight(12).padTop(-5).padLeft(0).padBottom(-10).size(bs + 10f, bs); - + t.addImageButton("icon-zoom-small", "clear-partial", 14 * 2, () -> ui.showError("Currently unimplemented.")/*Call.onAdminRequest(player, AdminAction.trace)*/); + }).padRight(12).size(bs + 10f, bs); } content.add(button).padBottom(-6).width(350f).maxHeight(h + 14); content.row(); + content.addImage("blank").height(3f).color(state.mode.isPvp ? player.getTeam().color : Palette.accent).growX(); + content.row(); }); content.marginBottom(5); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 898f1ec187..7b7ce7bc78 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -381,10 +381,11 @@ public class Block extends BaseBlock { tempColor.set(Palette.darkFlame); if(hasItems){ + float scaling = inventoryScaling(tile); for(Item item : content.items()){ int amount = tile.entity.items.get(item); - explosiveness += item.explosiveness * amount; - flammability += item.flammability * amount; + explosiveness += item.explosiveness * amount * scaling; + flammability += item.flammability * amount * scaling; if(item.flammability * amount > 0.5){ units++; @@ -410,7 +411,7 @@ public class Block extends BaseBlock { float splash = Mathf.clamp(amount / 4f, 0f, 10f); 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)); if(other != null){ Puddle.deposit(other, liquid, splash); @@ -426,6 +427,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. * Takes flammability of floor liquid into account. diff --git a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java index d54b112439..9c84856aac 100644 --- a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java +++ b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java @@ -24,12 +24,12 @@ public interface SelectionTrait{ ButtonGroup group = new ButtonGroup<>(); Table cont = new Table(); - cont.defaults().size(38, 42).padBottom(-5.1f); + cont.defaults().size(38); int i = 0; if(nullItem){ - ImageButton button = cont.addImageButton("white", "toggle", 24, () -> consumer.accept(null)).group(group).get(); + ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> consumer.accept(null)).group(group).get(); button.getStyle().imageUp = new TextureRegionDrawable(Draw.region("icon-nullitem")); button.setChecked(holder.get() == null); @@ -39,7 +39,7 @@ public interface SelectionTrait{ for(Item item : items){ if(!control.unlocks.isUnlocked(item)) continue; - ImageButton button = cont.addImageButton("white", "toggle", 24, () -> consumer.accept(item)) + ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> consumer.accept(item)) .group(group).get(); button.getStyle().imageUp = new TextureRegionDrawable(item.region); button.setChecked(holder.get() == item); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index c9e494757b..336302d25e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -84,6 +84,12 @@ public abstract class StorageBlock extends Block{ } } + @Override + public float inventoryScaling(Tile tile){ + StorageEntity entity = tile.entity(); + return 1f / entity.graph.getTiles().size; + } + @Override public TileEntity newEntity(){ return new StorageEntity(); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index f07756b4d2..c42c272985 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.world.blocks.storage; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockGroup; public abstract class Unloader extends Block{ protected final int timerUnload = timers++; @@ -13,7 +12,6 @@ public abstract class Unloader extends Block{ update = true; solid = true; health = 70; - group = BlockGroup.transportation; hasItems = true; } @@ -24,6 +22,5 @@ public abstract class Unloader extends Block{ } @Override - public void setBars(){ - } + public void setBars(){} } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java index f8f540fdb9..f8ca2beb6a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -84,12 +84,12 @@ public class CommandCenter extends Block{ Table buttons = new Table(); for(UnitCommand cmd : UnitCommand.values()){ - buttons.addImageButton("command-" + cmd.name(), "toggle", 8*3, () -> threads.run(() -> Call.onCommandCenterSet(players[0], tile, cmd))).size(40f, 44f) - .checked(entity.command == cmd).group(group); + buttons.addImageButton("command-" + cmd.name(), "clear-toggle", 8*3, () -> threads.run(() -> Call.onCommandCenterSet(players[0], tile, cmd))) + .size(38f).checked(entity.command == cmd).group(group); } table.add(buttons); table.row(); - table.table("button", t -> t.label(() -> entity.command.localized()).center().growX()).growX().padTop(-5); + table.table("pane", t -> t.label(() -> entity.command.localized()).center().growX()).growX(); } @Remote(called = Loc.server, forward = true, targets = Loc.both) diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/io/anuke/mindustry/world/consumers/Consume.java index f4ec4cb01f..f8456fc9e9 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consume.java @@ -33,7 +33,7 @@ public abstract class Consume{ } public void build(Table table){ - Table t = new Table("clear"); + Table t = new Table("flat"); t.margin(4); buildTooltip(t);