Merge branch 'master' into patch-1

This commit is contained in:
Anuken
2020-09-17 11:14:54 -04:00
committed by GitHub
79 changed files with 2248 additions and 861 deletions

View File

@@ -26,6 +26,7 @@ script:
- cp -a Mindustry/core/build/docs/javadoc/. docs/ - cp -a Mindustry/core/build/docs/javadoc/. docs/
- cd docs - cd docs
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi
- cd ../Mindustry
deploy: deploy:
- provider: releases - provider: releases
skip_cleanup: true skip_cleanup: true

View File

@@ -34,7 +34,8 @@ dependencies{
natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}" natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}"
natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}" natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
if(localArc()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar']) //android dependencies magically disappear during compilation, thanks gradle!
if(new File(projectDir.parent, '../Arc').exists()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar'])
} }
task deploy(type: Copy){ task deploy(type: Copy){

View File

@@ -32,7 +32,7 @@ allprojects{
ext{ ext{
versionNumber = '6' versionNumber = '6'
if(!project.hasProperty("versionModifier")) versionModifier = 'pre-alpha' if(!project.hasProperty("versionModifier")) versionModifier = 'alpha'
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
@@ -261,7 +261,6 @@ project(":core"){
doLast{ doLast{
def props = loadVersionProps() def props = loadVersionProps()
def androidVersion = props['androidBuildCode'].toInteger() - 2 def androidVersion = props['androidBuildCode'].toInteger() - 2
def buildVersion = props["build"]
def loglines = file("../changelog").text.split("\n") def loglines = file("../changelog").text.split("\n")
def maxLength = 460 def maxLength = 460
@@ -273,7 +272,6 @@ project(":core"){
} }
} }
def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") def changelogs = file("../fastlane/metadata/android/en-US/changelogs/")
new File(changelogs, buildVersion + ".txt").text = (result)
new File(changelogs, androidVersion + ".txt").text = (result) new File(changelogs, androidVersion + ".txt").text = (result)
} }
} }

View File

@@ -4,6 +4,5 @@
flattenPaths: true, flattenPaths: true,
maxWidth: 4096, maxWidth: 4096,
maxHeight: 4096, maxHeight: 4096,
minHeight: 2048,
fast: true fast: true
} }

View File

@@ -20,7 +20,7 @@ gameover = Game Over
gameover.pvp = The[accent] {0}[] team is victorious! gameover.pvp = The[accent] {0}[] team is victorious!
highscore = [accent]New highscore! highscore = [accent]New highscore!
copied = Copied. copied = Copied.
indevpopup = [accent]v6[] is currently in [accent]pre-alpha[].\n[lightgray]This means:[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work\n- Many units are unfinished\n- The campaign is completely unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. indevpopup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
load.sound = Sounds load.sound = Sounds
load.map = Maps load.map = Maps
@@ -509,6 +509,11 @@ error.io = Network I/O error.
error.any = Unknown network error. error.any = Unknown network error.
error.bloom = Failed to initialize bloom.\nYour device may not support it. error.bloom = Failed to initialize bloom.\nYour device may not support it.
weather.rain.name = Rain
weather.snow.name = Snow
weather.sandstorm.name = Sandstorm
weather.sporestorm.name = Sporestorm
sectors.unexplored = [lightgray]Unexplored sectors.unexplored = [lightgray]Unexplored
sectors.resources = Resources: sectors.resources = Resources:
sectors.production = Production: sectors.production = Production:
@@ -652,6 +657,7 @@ unit.liquidunits = liquid units
unit.powerunits = power units unit.powerunits = power units
unit.degrees = degrees unit.degrees = degrees
unit.seconds = seconds unit.seconds = seconds
unit.minutes = mins
unit.persecond = /sec unit.persecond = /sec
unit.perminute = /min unit.perminute = /min
unit.timesspeed = x speed unit.timesspeed = x speed
@@ -842,7 +848,9 @@ rules.lighting = Lighting
rules.fire = Fire rules.fire = Fire
rules.explosions = Block/Unit Explosion Damage rules.explosions = Block/Unit Explosion Damage
rules.ambientlight = Ambient Light rules.ambientlight = Ambient Light
rules.solarpowermultiplier = Solar Power Multiplier rules.weather = Weather
rules.weather.frequency = Frequency:
rules.weather.duration = Duration:
content.item.name = Items content.item.name = Items
content.liquid.name = Liquids content.liquid.name = Liquids

View File

@@ -12,7 +12,7 @@ link.itch.io.description = Stránka na itch.io s odkazy na stažení hry
link.google-play.description = Obchod Google Play link.google-play.description = Obchod Google Play
link.f-droid.description = Katalog F-Droid link.f-droid.description = Katalog F-Droid
link.wiki.description = Oficiální Wiki Mindustry link.wiki.description = Oficiální Wiki Mindustry
link.suggestions.description = Navrhni něco nového do hry! link.feathub.description = Navrhni něco nového do hry!
linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky. linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky.
screenshot = Snímek obrazovky uložen {0} screenshot = Snímek obrazovky uložen {0}
screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky. screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky.
@@ -63,8 +63,7 @@ stat.delivered = Materiálu vysláno:
stat.playtime = Odehraný čas: [accent]{0}[] stat.playtime = Odehraný čas: [accent]{0}[]
stat.rank = Celková známka: [accent]{0}[] stat.rank = Celková známka: [accent]{0}[]
launcheditems = [accent]Získané předměty[] globalitems = [accent]Celkové položky[]
launchinfo = [unlaunched]Je třeba vyslat zpět Tvé jádro, abys získal věci vyznačené modře.[]
map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"? map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"?
level.highscore = Nejvyšší skóre: [accent]{0}[] level.highscore = Nejvyšší skóre: [accent]{0}[]
level.select = Výběr úrovně level.select = Výběr úrovně
@@ -106,7 +105,7 @@ mods.guide = Průvodce modifikacemi
mods.report = Nahlásit závadu mods.report = Nahlásit závadu
mods.openfolder = Otevřít složku s modifikacemi mods.openfolder = Otevřít složku s modifikacemi
mods.reload = Znovu načíst mods.reload = Znovu načíst
mods.reloadexit = The game will now exit, to reload mods. mods.reloadexit = Hra bude nyní ukončena, aby si znovu načetla modifikace.
mod.display = [gray]Modifikace:[][orange] {0}[] mod.display = [gray]Modifikace:[][orange] {0}[]
mod.enabled = [lightgray]Povoleno[] mod.enabled = [lightgray]Povoleno[]
mod.disabled = [scarlet]Zakázáno[] mod.disabled = [scarlet]Zakázáno[]
@@ -125,7 +124,7 @@ mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry.
mod.import = Importovat modifikaci mod.import = Importovat modifikaci
mod.import.file = Importovat soubor mod.import.file = Importovat soubor
mod.import.github = Import modifikace z GitHubu mod.import.github = Import modifikace z GitHubu
mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! mod.jarwarn = [scarlet]JAR modifikace jsou z podstaty nebezpečné.[]\Ujisti se, že je importuješ z důvěryhodného zdroje!
mod.item.remove = Tato položka je součástí [accent]'{0}'[] modifikace. Pokud ji chcete odstranit, odinstalujte tuto modifikaci. mod.item.remove = Tato položka je součástí [accent]'{0}'[] modifikace. Pokud ji chcete odstranit, odinstalujte tuto modifikaci.
mod.remove.confirm = Tato modifikace bude odstraněna. mod.remove.confirm = Tato modifikace bude odstraněna.
mod.author = [lightgray]Autor:[] {0} mod.author = [lightgray]Autor:[] {0}
@@ -144,6 +143,7 @@ techtree = Technologie
research.list = [lightgray]Výzkum:[] research.list = [lightgray]Výzkum:[]
research = Výzkum research = Výzkum
researched = Dokončen výzkum technologie: [lightgray]{0}[]. researched = Dokončen výzkum technologie: [lightgray]{0}[].
research.progress = {0}% dokončeno
players = Hráčů: {0} players = Hráčů: {0}
players.single = Hráč: {0} players.single = Hráč: {0}
players.search = hledat players.search = hledat
@@ -198,8 +198,8 @@ server.admins.none = Žádní správci nebyli nalezeni.
server.add = Přidat server server.add = Přidat server
server.delete = Jsi si jistý, že chceš smazat tento server? server.delete = Jsi si jistý, že chceš smazat tento server?
server.edit = Upravit server server.edit = Upravit server
server.outdated = [crimson]Zastaralá verze serveru![] server.outdated = [scarlet]Zastaralá verze serveru![]
server.outdated.client = [crimson]Zastaralá verze klienta![] server.outdated.client = [scarlet]Zastaralá verze klienta![]
server.version = [gray]Verze: {0} {1}[] server.version = [gray]Verze: {0} {1}[]
server.custombuild = [accent]Upravená verze hry[] server.custombuild = [accent]Upravená verze hry[]
confirmban = Jsi si jistý, že chceš zakázat hráče "{0}[white]"?[] confirmban = Jsi si jistý, že chceš zakázat hráče "{0}[white]"?[]
@@ -221,7 +221,7 @@ connecting.data = [accent]Načítám data ze serveru...[]
server.port = Port: server.port = Port:
server.addressinuse = Adresu již někdo používá! server.addressinuse = Adresu již někdo používá!
server.invalidport = Neplatné číslo portu! server.invalidport = Neplatné číslo portu!
server.error = [crimson]Chyba při hostování serveru.[] server.error = [scarlet]Chyba při hostování serveru.[]
save.new = Nové uložení hry save.new = Nové uložení hry
save.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry? save.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry?
overwrite = Přepsat overwrite = Přepsat
@@ -231,8 +231,8 @@ save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry?
save.delete = Smazat save.delete = Smazat
save.export = Exportovat uložení hry save.export = Exportovat uložení hry
save.import.invalid = [accent]Toto uložení není v pořádku![] save.import.invalid = [accent]Toto uložení není v pořádku![]
save.import.fail = [crimson]Nepodařilo se importovat uložení hry: [accent]{0}[] save.import.fail = [scarlet]Nepodařilo se importovat uložení hry: [accent]{0}[]
save.export.fail = [crimson]Nepodařilo se exportovat uložení hry: [accent]{0}[] save.export.fail = [scarlet]Nepodařilo se exportovat uložení hry: [accent]{0}[]
save.import = Importovat uložení hry save.import = Importovat uložení hry
save.newslot = Uložit hru: save.newslot = Uložit hru:
save.rename = Přejmenovat save.rename = Přejmenovat
@@ -340,6 +340,12 @@ waves.load = Načíst ze schránky
waves.invalid = Neplatné vlny ve schránce. waves.invalid = Neplatné vlny ve schránce.
waves.copied = Vlny byly zkopírovány. waves.copied = Vlny byly zkopírovány.
waves.none = Žádní nepřátelé nebyli definováni.\nVlny s prázdným rozložením budou automaticky upraveny na výchozí rozložení. waves.none = Žádní nepřátelé nebyli definováni.\nVlny s prázdným rozložením budou automaticky upraveny na výchozí rozložení.
#tyto jsou záměrně malými písmeny
wavemode.counts = počty
wavemode.totals = součty
wavemode.health = zdraví
editor.default = [lightgray]<Výchozí>[] editor.default = [lightgray]<Výchozí>[]
details = Podrobnosti... details = Podrobnosti...
edit = Upravit... edit = Upravit...
@@ -379,7 +385,7 @@ editor.exportimage = Exportovat obrázek terénu
editor.exportimage.description = Exportovat obrázek mapy do souboru editor.exportimage.description = Exportovat obrázek mapy do souboru
editor.loadimage = Importovat terén editor.loadimage = Importovat terén
editor.saveimage = Exportovat terén editor.saveimage = Exportovat terén
editor.unsaved = [scarlet]Máš neuložené změny![]\nPřesto chceš odejít z editoru? Změny budou ztraceny. editor.unsaved = Opravdu chceš odejít z editoru?\n[scarlet]Neuložené změny budou ztraceny.[]
editor.resizemap = Změnit velikost mapy editor.resizemap = Změnit velikost mapy
editor.mapname = Jméno mapy: editor.mapname = Jméno mapy:
editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.[] editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.[]
@@ -459,11 +465,13 @@ locked = Zamčeno
complete = [lightgray]Dokončeno: complete = [lightgray]Dokončeno:
requirement.wave = Dosáhni vlny {0} na mapě {1} requirement.wave = Dosáhni vlny {0} na mapě {1}
requirement.core = Znič nepřátelské jádro na mapě {0} requirement.core = Znič nepřátelské jádro na mapě {0}
requirement.unlock = Odemknuto {0} requirement.research = Vynalezeno {0}
requirement.capture = Polapeno {0}
resume = Zpět do mapy:\n[lightgray]{0}[] resume = Zpět do mapy:\n[lightgray]{0}[]
bestwave = [lightgray]Nejvyšší vlna: {0} bestwave = [lightgray]Nejvyšší vlna: {0}
launch = Vyslat do této mapy Tvé jádro #TODO fix/remove this
launch.text = Launch launch = < VYSLAT >
launch.text = Vyslat
launch.title = Vyslání bylo úspěšné launch.title = Vyslání bylo úspěšné
launch.next = [lightgray]další možnost bude až ve vlně {0}[] launch.next = [lightgray]další možnost bude až ve vlně {0}[]
launch.unable2 = [scarlet]Není možno se vyslat.[] launch.unable2 = [scarlet]Není možno se vyslat.[]
@@ -471,8 +479,9 @@ launch.confirm = Toto vyšle veškeré suroviny ve Tvém jádře zpět.\nJiž se
launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až po několika dalších vlnách. launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až po několika dalších vlnách.
uncover = Odkrýt mapu uncover = Odkrýt mapu
configure = Přizpůsobit vybavení configure = Přizpůsobit vybavení
loadout = Loadout #TODO
resources = Resources loadout = Načtení
resources = Zdroje
bannedblocks = Zakázané bloky bannedblocks = Zakázané bloky
addall = Přidat vše addall = Přidat vše
configure.invalid = Hodnota musí být číslo mezi 0 a {0}. configure.invalid = Hodnota musí být číslo mezi 0 a {0}.
@@ -485,7 +494,7 @@ zone.objective.attack = Znič nepřátelské jádro
add = Přidat... add = Přidat...
boss.health = Životy Strážce boss.health = Životy Strážce
connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0}[] connectfail = [scarlet]Nepovedlo se připojení k serveru:\n\n[accent]{0}[]
error.unreachable = Server je nedostupný.\nJe IP adresa napsaná správně (XXX.XXX.XXX.XXX)? error.unreachable = Server je nedostupný.\nJe IP adresa napsaná správně (XXX.XXX.XXX.XXX)?
error.invalidaddress = Neplatná IP adresa. error.invalidaddress = Neplatná IP adresa.
error.timedout = Čas pro spojení se serverem vypršel!\nUjisti se, že IP adresa je napsaná správně. Zkus také zjistit, zda má hostitel správně nastavené přesměrování portů. error.timedout = Čas pro spojení se serverem vypršel!\nUjisti se, že IP adresa je napsaná správně. Zkus také zjistit, zda má hostitel správně nastavené přesměrování portů.
@@ -496,6 +505,7 @@ error.io = Vstupně/výstupní (I/O) chyba sítě.
error.any = Ueznámá chyba sítě. error.any = Ueznámá chyba sítě.
error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje. error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje.
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
sector.groundZero.name = Základní tábor sector.groundZero.name = Základní tábor
sector.craters.name = Krátery sector.craters.name = Krátery
sector.frozenForest.name = Zamrzlý les sector.frozenForest.name = Zamrzlý les
@@ -508,6 +518,10 @@ sector.tarFields.name = Dehtová pole
sector.saltFlats.name = Solné nížiny sector.saltFlats.name = Solné nížiny
sector.fungalPass.name = Plísňový průsmyk sector.fungalPass.name = Plísňový průsmyk
#unused
#sector.impact0078.name = Impact 0078
#sector.crags.name = Crags
sector.groundZero.description = Optimální místo, kde znovu začít. Nízký výskyt nepřátel. Několik málo surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál. sector.groundZero.description = Optimální místo, kde znovu začít. Nízký výskyt nepřátel. Několik málo surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál.
sector.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je však nemůže zadržet navěky.\n\nPusť se do práce za pomocí energie. Stav spalovací generátory. Nauč se, jak používat opravovací věže. sector.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je však nemůže zadržet navěky.\n\nPusť se do práce za pomocí energie. Stav spalovací generátory. Nauč se, jak používat opravovací věže.
sector.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází jen několik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jádro v jeho základně. Nenechej kámen na kameni. sector.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází jen několik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jádro v jeho základně. Nenechej kámen na kameni.
@@ -532,6 +546,8 @@ settings.graphics = Grafika
settings.cleardata = Vymazat data hry... settings.cleardata = Vymazat data hry...
settings.clear.confirm = Jsi si jistý, že chceš vymazat Tvá data ve hře?\nTento krok je nevratný! settings.clear.confirm = Jsi si jistý, že chceš vymazat Tvá data ve hře?\nTento krok je nevratný!
settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna Tvá data ve hře, včetně uložení hry, map, odemknutého postupu v kampani a nastavení ovládání.\nJakmile stiskneš "OK", všechna data se vymažou a hra se automaticky ukončí. settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna Tvá data ve hře, včetně uložení hry, map, odemknutého postupu v kampani a nastavení ovládání.\nJakmile stiskneš "OK", všechna data se vymažou a hra se automaticky ukončí.
settings.save.clear.confirm = Opravdu chceš smazat všechna Tvá uložení hry?
settings.save.clear = Smazat všechna Tvá uložení hry
paused = [accent]< Pozastaveno >[] paused = [accent]< Pozastaveno >[]
clear = Vyčistit clear = Vyčistit
banned = [scarlet]Zakázán[] banned = [scarlet]Zakázán[]
@@ -539,7 +555,7 @@ unplaceable.sectorcaptured = [scarlet]Vyžaduje polapený sektor[]
yes = Ano yes = Ano
no = Ne no = Ne
info.title = Informace info.title = Informace
error.title = [crimson]Objevila se chyba[] error.title = [scarlet]Objevila se chyba[]
error.crashtitle = Objevila se chyba error.crashtitle = Objevila se chyba
unit.nobuild = [scarlet]Jednotka nemůže stavět unit.nobuild = [scarlet]Jednotka nemůže stavět
blocks.input = Vstup blocks.input = Vstup
@@ -574,6 +590,7 @@ blocks.boosteffect = Účinek posílení
blocks.maxunits = Nejvýše aktivních jednotek blocks.maxunits = Nejvýše aktivních jednotek
blocks.health = Životy blocks.health = Životy
blocks.buildtime = Čas stavby blocks.buildtime = Čas stavby
blocks.maxconsecutive = Nejvýše po sobě
blocks.buildcost = Cena stavby blocks.buildcost = Cena stavby
blocks.inaccuracy = Nepřesnost blocks.inaccuracy = Nepřesnost
blocks.shots = Střely blocks.shots = Střely
@@ -581,8 +598,8 @@ blocks.reload = Střel za 1s
blocks.ammo = Střelivo blocks.ammo = Střelivo
bar.drilltierreq = Je vyžadován lepší vrt bar.drilltierreq = Je vyžadován lepší vrt
bar.noresources = Missing Resources bar.noresources = Chybějí zdroje
bar.corereq = Core Base Required bar.corereq = Je vyžadováno základní jádro
bar.drillspeed = Rychlost vrtu: {0}/s bar.drillspeed = Rychlost vrtu: {0}/s
bar.pumpspeed = Rychlost pumpy: {0}/s bar.pumpspeed = Rychlost pumpy: {0}/s
bar.efficiency = Účinnost: {0}% bar.efficiency = Účinnost: {0}%
@@ -593,7 +610,7 @@ bar.poweroutput = Výstup energie: {0}
bar.items = Předměty: {0} bar.items = Předměty: {0}
bar.capacity = Kapacita: {0} bar.capacity = Kapacita: {0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[jednotka je vypnuta]
bar.liquid = Chlazení bar.liquid = Chlazení
bar.heat = Teplo bar.heat = Teplo
bar.power = Energie bar.power = Energie
@@ -625,8 +642,9 @@ unit.persecond = /s
unit.timesspeed = x větší rychlost unit.timesspeed = x větší rychlost
unit.percent = % unit.percent = %
unit.items = předměty unit.items = předměty
unit.thousands = t unit.thousands = tis
unit.millions = m unit.millions = mio
unit.billions = mld
category.general = Všeobecné category.general = Všeobecné
category.power = Energie category.power = Energie
category.liquids = Kapaliny category.liquids = Kapaliny
@@ -679,7 +697,7 @@ setting.blockselectkeys.name = Ukázat klávesy při práci s blokem
setting.vsync.name = Vertikální synchronizace setting.vsync.name = Vertikální synchronizace
setting.pixelate.name = Rozpixlovat setting.pixelate.name = Rozpixlovat
setting.minimap.name = Ukázat mapičku setting.minimap.name = Ukázat mapičku
setting.coreitems.name = Display Core Items (WIP) setting.coreitems.name = Ukázat položky jádra (WIP)
setting.position.name = Ukázat pozici hráče setting.position.name = Ukázat pozici hráče
setting.musicvol.name = Hlasitost hudby setting.musicvol.name = Hlasitost hudby
setting.atmosphere.name = Ukázat atmosféru planety setting.atmosphere.name = Ukázat atmosféru planety
@@ -705,7 +723,7 @@ keybinds.mobile = [scarlet]Většina kláves nefunguje v mobilní verzi hry. Je
category.general.name = Všeobecné category.general.name = Všeobecné
category.view.name = Pohled category.view.name = Pohled
category.multiplayer.name = Hra více hráčů category.multiplayer.name = Hra více hráčů
category.blocks.name = Block Select category.blocks.name = Výběr bloků
command.attack = Útok command.attack = Útok
command.rally = Shromáždění command.rally = Shromáždění
command.retreat = Ústup command.retreat = Ústup
@@ -846,33 +864,33 @@ liquid.heatcapacity = [lightgray]Teplotní kapacita: {0}[]
liquid.viscosity = [lightgray]Viskozita: {0}[] liquid.viscosity = [lightgray]Viskozita: {0}[]
liquid.temperature = [lightgray]Teplota: {0}[] liquid.temperature = [lightgray]Teplota: {0}[]
unit.dagger.name = Mech Dýka unit.dagger.name = Dýka
unit.mace.name = Mace unit.mace.name = Palcát
unit.fortress.name = Mech Pevnost unit.fortress.name = Pevnost
unit.nova.name = Nova unit.nova.name = Nova
unit.pulsar.name = Pulsar unit.pulsar.name = Pulzar
unit.quasar.name = Quasar unit.quasar.name = Kvasar
unit.crawler.name = Mech Slídil unit.crawler.name = Slídil
unit.atrax.name = Atrax unit.atrax.name = Atrax
unit.spiroct.name = Spiroct unit.spiroct.name = Spiroct
unit.arkyid.name = Arkyid unit.arkyid.name = Arkyid
unit.flare.name = Flare unit.flare.name = Záře
unit.horizon.name = Horizon unit.horizon.name = Horizont
unit.zenith.name = Zenith unit.zenith.name = Zenit
unit.antumbra.name = Antumbra unit.antumbra.name = Antumbra
unit.eclipse.name = Eclipse unit.eclipse.name = Zatmění
unit.mono.name = Mono unit.mono.name = Mono
unit.poly.name = Poly unit.poly.name = Poly
unit.mega.name = Mega unit.mega.name = Mega
unit.risso.name = Risso unit.risso.name = Risso
unit.minke.name = Minke unit.minke.name = Minke
unit.bryde.name = Bryde unit.bryde.name = Bryde
unit.alpha.name = Alpha unit.alpha.name = Alfa
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gama
block.parallax.name = Parallax block.parallax.name = Paralaxa
block.cliff.name = Cliff block.cliff.name = Útes
block.sand-boulder.name = Pískovec block.sand-boulder.name = Pískovec
block.grass.name = Tráva block.grass.name = Tráva
block.slag.name = Slag block.slag.name = Slag
@@ -1061,12 +1079,19 @@ block.naval-factory.name = Námořní továrna
block.additive-reconstructor.name = Přídavný přestavbovač block.additive-reconstructor.name = Přídavný přestavbovač
block.multiplicative-reconstructor.name = Násobný přestavbovač block.multiplicative-reconstructor.name = Násobný přestavbovač
block.exponential-reconstructor.name = Exponenciální přestavbovač block.exponential-reconstructor.name = Exponenciální přestavbovač
block.tetrative-reconstructor.name = Umocňující přestavbovač block.tetrative-reconstructor.name = Mocninný přestavbovač
block.payload-conveyor.name = Hromadný dopravník block.payload-conveyor.name = Dopravník nákladu
block.payload-router.name = Směřovač nákladu block.payload-router.name = Směřovač nákladu
block.disassembler.name = Rozebírač block.disassembler.name = Rozebírač
block.silicon-crucible.name = Křemíková nádoba block.silicon-crucible.name = Tavicí tyglík pro křemík
block.large-overdrive-projector.name = Velký urychlující projektor block.overdrive-dome.name = Velká urychlující kupole
block.switch.name = Přepínač
block.micro-processor.name = Mikroprocesor
block.logic-processor.name = Logický procesor
block.logic-display.name = Zobrazovač logiky
block.memory-cell.name = Paměťová buňka
team.blue.name = modrý team.blue.name = modrý
team.crux.name = červený team.crux.name = červený
team.sharded.name = oranžový team.sharded.name = oranžový
@@ -1162,7 +1187,7 @@ block.force-projector.description = Vytvoří okolo sebe šestihrané silové po
block.shock-mine.description = Působí poškození nepřátelským jednotkám při sešlápnutí. Takřka neviditelné pro nepřátele (a i v nabídce bloků :) ). block.shock-mine.description = Působí poškození nepřátelským jednotkám při sešlápnutí. Takřka neviditelné pro nepřátele (a i v nabídce bloků :) ).
block.conveyor.description = Základní blok pro přepravu předmětů. Unáší předměty kupředu a automaticky plní vhodná úložiště (budovy, kontejnery, jádro), které po cestě potká. Lze jej otáčet dle potřeby. block.conveyor.description = Základní blok pro přepravu předmětů. Unáší předměty kupředu a automaticky plní vhodná úložiště (budovy, kontejnery, jádro), které po cestě potká. Lze jej otáčet dle potřeby.
block.titanium-conveyor.description = Pokročilý blok pro přepravu předmětů. Přenáší předměty rychleji, než základní dopravník. block.titanium-conveyor.description = Pokročilý blok pro přepravu předmětů. Přenáší předměty rychleji, než základní dopravník.
block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu. block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu.\nPro špičkový průchod vyžaduje několik nakládacích a vykládacích míst.
block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. Užitečný při situaci, kdy dva rozdílné dopravníky dopravují dva rozdílné materiály přes jedno pole. block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. Užitečný při situaci, kdy dva rozdílné dopravníky dopravují dva rozdílné materiály přes jedno pole.
block.bridge-conveyor.description = Pokročilý blok pro přepravu předmětů. Dovoluje transport předmětů až přes tři pole, a to přes jakýkoliv terén nebo budovu. block.bridge-conveyor.description = Pokročilý blok pro přepravu předmětů. Dovoluje transport předmětů až přes tři pole, a to přes jakýkoliv terén nebo budovu.
block.phase-conveyor.description = Pokročilý blok pro přepravu předmětů. Využívá energii k teleportaci předmětů na vzdálenost několika dlaždic mezi jiným propojeným fázovým dopravníkem. block.phase-conveyor.description = Pokročilý blok pro přepravu předmětů. Využívá energii k teleportaci předmětů na vzdálenost několika dlaždic mezi jiným propojeným fázovým dopravníkem.
@@ -1230,3 +1255,4 @@ block.spectre.description = Velká střílna s kanónem s dvěma hlavněmi. Stř
block.meltdown.description = Masivní laserový kanón. Nabije se a pak pálí nepřetržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení. block.meltdown.description = Masivní laserový kanón. Nabije se a pak pálí nepřetržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení.
block.repair-point.description = Nepřetržitě léčí nejbližší poškozenou jednotku v poli své působnosti. block.repair-point.description = Nepřetržitě léčí nejbližší poškozenou jednotku v poli své působnosti.
block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted.

View File

@@ -126,7 +126,7 @@ mod.import = 모드 가져오기
mod.import.file = 파일 가져오기 mod.import.file = 파일 가져오기
mod.import.github = Github 에서 모드 가져오기 mod.import.github = Github 에서 모드 가져오기
mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다! mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다!
mod.item.remove = 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. mod.item.remove = 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요.
mod.remove.confirm = 이 모드가 삭제될 것입니다. mod.remove.confirm = 이 모드가 삭제될 것입니다.
mod.author = [lightgray]제작자:[] {0} mod.author = [lightgray]제작자:[] {0}
mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0} mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0}
@@ -541,7 +541,7 @@ no = 아니오
info.title = 정보 info.title = 정보
error.title = [scarlet]오류가 발생했습니다. error.title = [scarlet]오류가 발생했습니다.
error.crashtitle = 오류가 발생했습니다 error.crashtitle = 오류가 발생했습니다
unit.nobuild = [scarlet]유닛을 만들 수 없습니다 unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다.
blocks.input = 입력 blocks.input = 입력
blocks.output = 출력 blocks.output = 출력
blocks.booster = 가속 blocks.booster = 가속
@@ -554,7 +554,7 @@ blocks.damage = 공격력
blocks.targetsair = 공중 공격 blocks.targetsair = 공중 공격
blocks.targetsground = 지상 공격 blocks.targetsground = 지상 공격
blocks.itemsmoved = 이동 속도 blocks.itemsmoved = 이동 속도
blocks.launchtime = 출격 사이의 시 blocks.launchtime = 출격 간
blocks.shootrange = 사거리 blocks.shootrange = 사거리
blocks.size = 크기 blocks.size = 크기
blocks.liquidcapacity = 액체 용량 blocks.liquidcapacity = 액체 용량
@@ -580,7 +580,7 @@ blocks.shots = 공격 속도
blocks.reload = 발/초 blocks.reload = 발/초
blocks.ammo = 탄약 blocks.ammo = 탄약
bar.drilltierreq = 더 좋은 드릴이 요구됨 bar.drilltierreq = 더 좋은 드릴이
bar.noresources = 자원 부족 bar.noresources = 자원 부족
bar.corereq = 코어 기지 필요 bar.corereq = 코어 기지 필요
bar.drillspeed = 드릴 속도: {0}/s bar.drillspeed = 드릴 속도: {0}/s
@@ -593,7 +593,7 @@ bar.poweroutput = 전력 출력: {0}
bar.items = 자원량: {0} bar.items = 자원량: {0}
bar.capacity = 용량: {0} bar.capacity = 용량: {0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[장비를 정지합니다]
bar.liquid = 액체 bar.liquid = 액체
bar.heat = 발열 bar.heat = 발열
bar.power = 전력 bar.power = 전력
@@ -607,7 +607,7 @@ bullet.incendiary = [stat]방화
bullet.homing = [stat]유도 bullet.homing = [stat]유도
bullet.shock = [stat]전격 bullet.shock = [stat]전격
bullet.frag = [stat]파편 bullet.frag = [stat]파편
bullet.knockback = [stat]{0}[lightgray] 밀어내기 bullet.knockback = [stat]{0}[lightgray] 밀
bullet.freezing = [stat]빙결 bullet.freezing = [stat]빙결
bullet.tarred = [stat]타르 bullet.tarred = [stat]타르
bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수
@@ -630,10 +630,10 @@ unit.millions = 백만
category.general = 일반 category.general = 일반
category.power = 전력 category.power = 전력
category.liquids = 액체 category.liquids = 액체
category.items = 아이템 category.items = 자원
category.crafting = 입력/출력 category.crafting = 입력/출력
category.shooting = 사격 category.shooting = 사격
category.optional = 보조 아이템 category.optional = 보조 자원
setting.landscape.name = 가로화면 잠금 setting.landscape.name = 가로화면 잠금
setting.shadows.name = 그림자 setting.shadows.name = 그림자
setting.blockreplace.name = 자동 블록 제안 setting.blockreplace.name = 자동 블록 제안
@@ -679,7 +679,7 @@ setting.blockselectkeys.name = 블록 선택 키 표시
setting.vsync.name = 수직 동기화 setting.vsync.name = 수직 동기화
setting.pixelate.name = 픽셀화 setting.pixelate.name = 픽셀화
setting.minimap.name = 미니맵 표시 setting.minimap.name = 미니맵 표시
setting.coreitems.name = 코어에 있는 아이템 표시 setting.coreitems.name = 코어에 있는 자원 표시
setting.position.name = 플레이어 위치 표시 setting.position.name = 플레이어 위치 표시
setting.musicvol.name = 음악 크기 setting.musicvol.name = 음악 크기
setting.atmosphere.name = 행성 배경화면 표시 setting.atmosphere.name = 행성 배경화면 표시
@@ -699,7 +699,7 @@ public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모
public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다.
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다...
uiscale.cancel = 취소 후 나가기 uiscale.cancel = 취소 후 나가기
setting.bloom.name = 블룸 setting.bloom.name = 화려한 효과
keybind.title = 조작키 설정 keybind.title = 조작키 설정
keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다. keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다.
category.general.name = 일반 category.general.name = 일반
@@ -803,10 +803,10 @@ rules.title.unit = 유닛
rules.title.experimental = 실험적인 기능 rules.title.experimental = 실험적인 기능
rules.title.environment = 환경 rules.title.environment = 환경
rules.lighting = 조명 rules.lighting = 조명
rules.ambientlight = 주변 조명 rules.ambientlight = 자연 조명
rules.solarpowermultiplier = 태양광 발전 배수 rules.solarpowermultiplier = 태양광 발전 배수
content.item.name = 아이템 content.item.name = 자원
content.liquid.name = 액체 content.liquid.name = 액체
content.unit.name = 유닛 content.unit.name = 유닛
content.block.name = 블록 content.block.name = 블록
@@ -820,58 +820,59 @@ item.silicon.name = 실리콘
item.plastanium.name = 플라스터늄 item.plastanium.name = 플라스터늄
item.phase-fabric.name = 메타 item.phase-fabric.name = 메타
item.surge-alloy.name = 설금 item.surge-alloy.name = 설금
item.spore-pod.name = 포자 포드 item.spore-pod.name = 포자 버섯
item.sand.name = 모래 item.sand.name = 모래
item.blast-compound.name = 화합 item.blast-compound.name = 폭발
item.pyratite.name = 파이라타이트 item.pyratite.name = 파이라타이트
item.metaglass.name = 금속유리 item.metaglass.name = 강화 유리
item.scrap.name = 고철 item.scrap.name = 고철
liquid.water.name = liquid.water.name =
liquid.slag.name = 광재 liquid.slag.name = 광재
liquid.oil.name = 기름 liquid.oil.name = 기름
liquid.cryofluid.name = 냉각 liquid.cryofluid.name = 냉각
item.explosiveness = [lightgray]폭발성: {0} item.explosiveness = [lightgray]폭발성: {0}
item.flammability = [lightgray]인화성: {0} item.flammability = [lightgray]인화성: {0}
item.radioactivity = [lightgray]방사능: {0} item.radioactivity = [lightgray]방사능: {0}
unit.health = [lightgray]체력: {0} unit.health = [lightgray]체력: {0}
unit.speed = [lightgray]속도: {0} unit.speed = [lightgray]속도: {0}
unit.weapon = [lightgray]무기: {0} unit.weapon = [lightgray]무기: {0}
unit.itemcapacity = [lightgray]아이템 수용량: {0} unit.itemcapacity = [lightgray]자원 수용량: {0}
unit.minespeed = [lightgray]채광 속도: {0}% unit.minespeed = [lightgray]채광 속도: {0}%
unit.minepower = [lightgray]채광 레벨: {0} unit.minepower = [lightgray]채광 레벨: {0}
unit.ability = [lightgray]능력: {0} unit.ability = [lightgray]능력: {0}
unit.buildspeed = [lightgray]건설 속도: {0}% unit.buildspeed = [lightgray]건설 속도: {0}%
liquid.heatcapacity = [lightgray]발열 용량: {0} liquid.heatcapacity = [lightgray]비열: {0}
liquid.viscosity = [lightgray]점도: {0} liquid.viscosity = [lightgray]점도: {0}
liquid.temperature = [lightgray]온도: {0} liquid.temperature = [lightgray]온도: {0}
unit.dagger.name = Dagger unit.dagger.name = 대거
unit.mace.name = Mace unit.mace.name = 메이스
unit.fortress.name = Fortress unit.fortress.name = 포트리스
unit.nova.name = Nova unit.nova.name = 노바
unit.pulsar.name = Pulsar unit.pulsar.name = 펄서
unit.quasar.name = Quasar unit.quasar.name = 퀘이사
unit.crawler.name = Crawler unit.crawler.name = 크롤러
unit.atrax.name = Atrax unit.atrax.name = 아트락스
unit.spiroct.name = Spiroct unit.spiroct.name = 스피록트
unit.arkyid.name = Arkyid unit.arkyid.name = 아키드
unit.flare.name = Flare unit.toxipod.name = 독소포드
unit.horizon.name = Horizon unit.flare.name = 플레어
unit.zenith.name = Zenith unit.horizon.name = 호라이즌
unit.antumbra.name = Antumbra unit.zenith.name = 제니스
unit.eclipse.name = Eclipse unit.antumbra.name = 안텀브라
unit.mono.name = Mono unit.eclipse.name = 이클립스
unit.poly.name = Poly unit.mono.name = 모노
unit.mega.name = Mega unit.poly.name = 폴리
unit.risso.name = Risso unit.mega.name = 메가
unit.minke.name = Minke unit.risso.name = 리소
unit.bryde.name = Bryde unit.minke.name = 민케
unit.alpha.name = Alpha unit.bryde.name = 브리드
unit.beta.name = Beta unit.alpha.name = 알파
unit.gamma.name = Gamma unit.beta.name = 베타
unit.gamma.name = 감마
block.parallax.name = Parallax block.parallax.name = 시차
block.cliff.name = 낭떠러지 block.cliff.name = 낭떠러지
block.sand-boulder.name = 사암 block.sand-boulder.name = 사암
block.grass.name = 잔디 block.grass.name = 잔디
@@ -956,7 +957,7 @@ block.phase-wall-large.name = 대형 메타 벽
block.thorium-wall.name = 토륨 벽 block.thorium-wall.name = 토륨 벽
block.thorium-wall-large.name = 대형 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽
block.door.name = block.door.name =
block.door-large.name = 대형문 block.door-large.name = 대형
block.duo.name = 듀오 block.duo.name = 듀오
block.scorch.name = 스코치 block.scorch.name = 스코치
block.scatter.name = 스캐터 block.scatter.name = 스캐터
@@ -966,7 +967,7 @@ block.conveyor.name = 컨베이어
block.titanium-conveyor.name = 티타늄 컨베이어 block.titanium-conveyor.name = 티타늄 컨베이어
block.plastanium-conveyor.name = 플라스터늄 컨베이어 block.plastanium-conveyor.name = 플라스터늄 컨베이어
block.armored-conveyor.name = 장갑 컨베이어 block.armored-conveyor.name = 장갑 컨베이어
block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 아이템을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 아이템을 받을 수 없습니다. block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 자원을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 자원을 받을 수 없습니다.
block.junction.name = 교차기 block.junction.name = 교차기
block.router.name = 분배기 block.router.name = 분배기
block.distributor.name = 대형 분배기 block.distributor.name = 대형 분배기
@@ -975,12 +976,12 @@ block.inverted-sorter.name = 반전 필터
block.message.name = 메모 블록 block.message.name = 메모 블록
block.illuminator.name = 조명 block.illuminator.name = 조명
block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다. block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다.
block.overflow-gate.name = 오버플로 게이트 block.overflow-gate.name = 포화 필터
block.underflow-gate.name = 언더플로 게이트 block.underflow-gate.name = 불포화 필터
block.silicon-smelter.name = 실리콘 제련소 block.silicon-smelter.name = 실리콘 제련소
block.phase-weaver.name = 메타 합성기 block.phase-weaver.name = 메타 합성기
block.pulverizer.name = 분쇄기 block.pulverizer.name = 분쇄기
block.cryofluidmixer.name = 냉각 유체 제조기 block.cryofluidmixer.name = 냉각 제조기
block.melter.name = 융해기 block.melter.name = 융해기
block.incinerator.name = 소각로 block.incinerator.name = 소각로
block.spore-press.name = 포자 압축기 block.spore-press.name = 포자 압축기
@@ -995,12 +996,12 @@ block.battery-large.name = 대형 배터리
block.combustion-generator.name = 연소 발전기 block.combustion-generator.name = 연소 발전기
block.steam-generator.name = 증기 발전기 block.steam-generator.name = 증기 발전기
block.differential-generator.name = 차동 발잔기 block.differential-generator.name = 차동 발잔기
block.impact-reactor.name = 임팩트 원자로 block.impact-reactor.name = 핵융합 원자로
block.mechanical-drill.name = 기계식 드릴 block.mechanical-drill.name = 기계식 드릴
block.pneumatic-drill.name = 공압 드릴 block.pneumatic-drill.name = 공압 드릴
block.laser-drill.name = 레이저 드릴 block.laser-drill.name = 레이저 드릴
block.water-extractor.name = 물 추출기 block.water-extractor.name = 물 추출기
block.cultivator.name = 제초기 block.cultivator.name = 온실
block.conduit.name = 파이프 block.conduit.name = 파이프
block.mechanical-pump.name = 기계식 펌프 block.mechanical-pump.name = 기계식 펌프
block.item-source.name = 자원 공급기 block.item-source.name = 자원 공급기
@@ -1018,7 +1019,7 @@ block.ripple.name = 립플
block.phase-conveyor.name = 메타 컨베이어 block.phase-conveyor.name = 메타 컨베이어
block.bridge-conveyor.name = 다리 컨베이어 block.bridge-conveyor.name = 다리 컨베이어
block.plastanium-compressor.name = 플라스터늄 압축기 block.plastanium-compressor.name = 플라스터늄 압축기
block.pyratite-mixer.name = 라타이트 혼합기 block.pyratite-mixer.name = 파이라타이트 혼합기
block.blast-mixer.name = 화합물 혼합기 block.blast-mixer.name = 화합물 혼합기
block.solar-panel.name = 태양 전지판 block.solar-panel.name = 태양 전지판
block.solar-panel-large.name = 대형 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판
@@ -1039,7 +1040,7 @@ block.thermal-pump.name = 화력 펌프
block.thermal-generator.name = 화력 생성기 block.thermal-generator.name = 화력 생성기
block.alloy-smelter.name = 설금 제련소 block.alloy-smelter.name = 설금 제련소
block.mender.name = 멘더 block.mender.name = 멘더
block.mend-projector.name = 대형 수리 프로젝터 block.mend-projector.name = 수리 프로젝터
block.surge-wall.name = 설금 벽 block.surge-wall.name = 설금 벽
block.surge-wall-large.name = 큰 설금 벽 block.surge-wall-large.name = 큰 설금 벽
block.cyclone.name = 사이클론 block.cyclone.name = 사이클론
@@ -1057,7 +1058,7 @@ block.launch-pad-large.name = 대형 출격 패드
block.segment.name = 세그먼트 block.segment.name = 세그먼트
block.ground-factory.name = 지상 공장 block.ground-factory.name = 지상 공장
block.air-factory.name = 항공 공장 block.air-factory.name = 항공 공장
block.naval-factory.name = 공장 block.naval-factory.name = 공장
block.additive-reconstructor.name = 첨가물 재구성기 block.additive-reconstructor.name = 첨가물 재구성기
block.multiplicative-reconstructor.name = 다중 재구성기 block.multiplicative-reconstructor.name = 다중 재구성기
block.exponential-reconstructor.name = 지수 재구성기 block.exponential-reconstructor.name = 지수 재구성기
@@ -1081,18 +1082,18 @@ tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니
tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다.
tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다.
tutorial.blockinfo = 각 블록마다 다른 특성을 가지고 있으며, 각 드릴은 특정 광석만 채굴할 수 있습니다.\n블록의 정보와 특성을 확인하려면, [accent]건설 메뉴에서 "?" 버튼을 선택하세요.[]\n\n[accent]지금 기계식 드릴의 정보를 보세요. tutorial.blockinfo = 각 블록마다 다른 특성을 가지고 있으며, 각 드릴은 특정 광석만 채굴할 수 있습니다.\n블록의 정보와 특성을 확인하려면, [accent]건설 메뉴에서 "?" 버튼을 선택하세요.[]\n\n[accent]지금 기계식 드릴의 정보를 보세요.
tutorial.conveyor = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 아이템을 코어로 넣으세요. tutorial.conveyor = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 자원을 코어로 넣으세요.
tutorial.conveyor.mobile = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 아이템을 코어에 넣으세요. tutorial.conveyor.mobile = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 자원을 코어에 넣으세요.
tutorial.turret = 아이템이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 아이템이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 아이템(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. tutorial.turret = 자원이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 자원이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 자원(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요.
tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 0/1 tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 0/1
tutorial.pause = 전투 중에는 게임을 [accent]일시정지[] 할 수 있습니다.\n일시정지 되는 동안 건설을 대기시킬 수 있습니다.\n\n[accent]일시정지하려면 스페이스 키를 누르세요. tutorial.pause = 전투 중에는 게임을 [accent]일시정지[] 할 수 있습니다.\n일시정지 되는 동안 건설을 대기시킬 수 있습니다.\n\n[accent]일시정지하려면 스페이스 키를 누르세요.
tutorial.pause.mobile = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지하려면 왼쪽 상단에 있는 이 버튼을 누르세요. tutorial.pause.mobile = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지하려면 왼쪽 상단에 있는 이 버튼을 누르세요.
tutorial.unpause = 이제 스페이스를 누르면 일시정지가 해제됩니다. tutorial.unpause = 이제 스페이스를 누르면 일시정지가 해제됩니다.
tutorial.unpause.mobile = 이제 다시 누르면 일시정지가 해제됩니다. tutorial.unpause.mobile = 이제 다시 누르면 일시정지가 해제됩니다.
tutorial.breaking = 블록은 종종 파괴 되어야 합니다.\n선택한 모든 블록을 파괴하려면 [accent]마우스 오른쪽 클릭을 길게 누르세요[].\n\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각벽을 파괴하세요. tutorial.breaking = 블록은 종종 파괴 되어야 합니다.\n선택한 모든 블록을 파괴하려면 [accent]마우스 오른쪽 클릭을 길게 누르세요[].\n\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각벽을 파괴하세요.
tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요.
tutorial.withdraw = 경우에 따라 블록에서 아이템을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]아이템이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]아이템[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. tutorial.withdraw = 경우에 따라 블록에서 자원을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]자원이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]자원[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요.
tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 아이템을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 자원을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[].
tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요.
tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요.
tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요. tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요.
@@ -1110,15 +1111,15 @@ item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치
item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다. item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다.
item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.
item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금.
item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 합성 포자 포드. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다.
item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 포드 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다.
item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질. item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질.
liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다. liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다.
liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다.
liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다.
liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다. liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다.
block.message.description = 지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. block.message.description = 지를 남깁니다. 같은 팀 간의 소통에 사용됩니다.
block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다. block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다.
block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다. block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다.
block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다. block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다.
@@ -1131,14 +1132,14 @@ block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분
block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다.
block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다. block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다.
block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다. block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다.
block.spore-press.description = 포자 포드를 극압으로 압축하여 기름을 합성합니다. block.spore-press.description = 포자 버섯을 극압으로 압축하여 기름을 합성합니다.
block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다. block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다.
block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다. block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다.
block.incinerator.description = 넘치는 아이템이나 액체를 증발시킵니다. block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다.
block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용. block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용.
block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용.
block.item-source.description = 아이템을 무한대로 출력합니다. 샌드박스 전용. block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용.
block.item-void.description = 모든 아이템을 파괴합니다. 샌드박스 전용. block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용.
block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용.
block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용.
block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다. block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다.
@@ -1162,17 +1163,17 @@ block.force-projector.description = 건물과 내부의 유닛을 공격으로
block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다. block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다.
block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식. block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식.
block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다. block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다.
block.plastanium-conveyor.description = 아이템을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 아이템을 받고 앞쪽에 세 방향으로 내보냅니다. block.plastanium-conveyor.description = 자원을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 자원을 받고 앞쪽에 세 방향으로 내보냅니다.
block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다. block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다.
block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다.
block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 아이템을 순간이동 시킵니다. block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 자원을 순간이동 시킵니다.
block.sorter.description = 아이템을 정렬합니다. 아이템이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. block.sorter.description = 자원을 정렬합니다. 자원이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다.
block.inverted-sorter.description = 표준 분류기와 같은 아이템을 처리하지만, 대신 선택된 아이템을 측면으로 출력합니다. block.inverted-sorter.description = 표준 분류기와 같은 자원을 처리하지만, 대신 선택된 자원을 측면으로 출력합니다.
block.router.description = 아이템을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. block.router.description = 자원을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오.
block.distributor.description = 고급 분배기. 아이템을 최대 7개의 다른 방향으로 동일하게 분할합니다. block.distributor.description = 고급 분배기. 자원을 최대 7개의 다른 방향으로 동일하게 분할합니다.
block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다. block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다.
block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다. block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다.
block.mass-driver.description = 최고의 아이템 운송 블록. 여러 아이템을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. block.mass-driver.description = 최고의 자원 운송 블록. 여러 자원을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다.
block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다. block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다.
block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다. block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다.
block.thermal-pump.description = 가장 강력한 펌프. block.thermal-pump.description = 가장 강력한 펌프.
@@ -1199,20 +1200,20 @@ block.solar-panel.description = 태양으로부터 소량의 전력을 생성합
block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전. block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전.
block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다. block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다.
block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다. block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다.
block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 아이템을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다.
block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다. block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다.
block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능. block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능.
block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다. block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다.
block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다. block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다.
block.cultivator.description = 대기 중의 작은 농도의 포자를 배양 가능한 포드로 배양합니다. block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 버섯으로 배양합니다.
block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다. block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다.
block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오. block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오.
block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다. block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다.
block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다. block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다.
block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 아이템을 빼낼 수 있습니다. block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다.
block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 아이템을 빼낼 수 있습니다. block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다.
block.unloader.description = 근처의 비 수송 블록에서 아이템을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다.
block.launch-pad.description = 코어 출격 없이도 아이템을 묶어 출격시킬 수 있습니다. block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다.
block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다. block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다.
block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다. block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다.
block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다. block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다.

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,7 @@ gameover = Игра окончена
gameover.pvp = [accent]{0}[] команда победила! gameover.pvp = [accent]{0}[] команда победила!
highscore = [accent]Новый рекорд! highscore = [accent]Новый рекорд!
copied = Скопировано. copied = Скопировано.
indevpopup = [accent]v6[] находится на стадии [accent]pre-alpha[].\n[lightgray]Это означает следующее:[]\n- Отсутствие контента.\n- Большинство [scarlet]ИИ единиц[] не работает.\n- Множество единиц [scarlet]отсутствует[] или не готово.\n- Кампания не завершена.\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]Github[]. indevpopup = [accent]v6[] находится на стадии [accent]alpha[].\n[lightgray]Это означает следующее:[]\n- Отсутствие контента.\n- Большинство [scarlet]ИИ единиц[] не работает.\n- Множество единиц не готово.\n- Кампания не завершена.\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]Github[].
load.sound = Звуки load.sound = Звуки
load.map = Карты load.map = Карты
@@ -114,6 +114,7 @@ mod.disable = Выкл.
mod.content = Содержимое: mod.content = Содержимое:
mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется.
mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0} mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0}
mod.outdated = [scarlet]Не совместим с V6 (нет "min-game-version: 105")
mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0}
mod.erroredcontent = [scarlet]Ошибки содержимого mod.erroredcontent = [scarlet]Ошибки содержимого
mod.errors = Ошибки были вызваны загружаемым содержимым. mod.errors = Ошибки были вызваны загружаемым содержимым.
@@ -126,9 +127,9 @@ mod.import = Импортировать модификацию
mod.import.file = Импортировать файл mod.import.file = Импортировать файл
mod.import.github = Импортировать мод с GitHub mod.import.github = Импортировать мод с GitHub
mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника! mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника!
mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. mod.item.remove = Этот предмет является частью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите саму модификацию.
mod.remove.confirm = Эта модификация будет удалена. mod.remove.confirm = Эта модификация будет удалена.
mod.author = [lightgray]Автор:[] {0} mod.author = [lightgray]Автор(ы):[] {0}
mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0}
mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова. mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова.
mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации.
@@ -137,6 +138,8 @@ mod.scripts.disable = Ваше устройство не поддерживае
about.button = Об игре about.button = Об игре
name = Имя: name = Имя:
noname = Для начала, придумайте[accent] себе имя[]. noname = Для начала, придумайте[accent] себе имя[].
planetmap = Карта планеты
launchcore = Запуск ядра
filename = Имя файла: filename = Имя файла:
unlocked = Новый контент разблокирован! unlocked = Новый контент разблокирован!
completed = [accent]Завершено completed = [accent]Завершено
@@ -171,7 +174,7 @@ host.info = Кнопка [accent]Открыть сервер[] запускае
join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[]. join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[].
hostserver = Запустить многопользовательский сервер hostserver = Запустить многопользовательский сервер
invitefriends = Пригласить друзей invitefriends = Пригласить друзей
hostserver.mobile = Запустить\nсервер hostserver.mobile = Запустить сервер
host = Открыть сервер host = Открыть сервер
hosting = [accent]Открытие сервера… hosting = [accent]Открытие сервера…
hosts.refresh = Обновить hosts.refresh = Обновить
@@ -506,7 +509,14 @@ error.io = Сетевая ошибка ввода-вывода.
error.any = Неизвестная сетевая ошибка. error.any = Неизвестная сетевая ошибка.
error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его. error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его.
sectors.unexplored = [lightgray]Не исследовано
sectors.resources = Ресурсы:
sectors.production = Производит:
sectors.stored = Накоплено:
sectors.resume = Продолжить
sectors.launch = Высадка
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
sector.groundZero.name = Отправная точка sector.groundZero.name = Отправная точка
sector.craters.name = Кратеры sector.craters.name = Кратеры
sector.frozenForest.name = Ледяной лес sector.frozenForest.name = Ледяной лес
@@ -574,8 +584,11 @@ blocks.itemsmoved = Скорость перемещения
blocks.launchtime = Интервал запусков blocks.launchtime = Интервал запусков
blocks.shootrange = Радиус действия blocks.shootrange = Радиус действия
blocks.size = Размер blocks.size = Размер
blocks.displaysize = Размер дисплея
blocks.liquidcapacity = Вместимость жидкости blocks.liquidcapacity = Вместимость жидкости
blocks.powerrange = Дальность передачи энергии blocks.powerrange = Дальность передачи энергии
blocks.linkrange = Дальность связи
blocks.instructions = Инструкции
blocks.powerconnections = Количество соединений blocks.powerconnections = Количество соединений
blocks.poweruse = Потребляет энергии blocks.poweruse = Потребляет энергии
blocks.powerdamage = Энергия/урон blocks.powerdamage = Энергия/урон
@@ -591,6 +604,7 @@ blocks.boosteffect = Ускоряющий эффект
blocks.maxunits = Максимальное количество активных единиц blocks.maxunits = Максимальное количество активных единиц
blocks.health = Прочность blocks.health = Прочность
blocks.buildtime = Время строительства blocks.buildtime = Время строительства
blocks.maxconsecutive = Макс. последовательность
blocks.buildcost = Стоимость строительства blocks.buildcost = Стоимость строительства
blocks.inaccuracy = Разброс blocks.inaccuracy = Разброс
blocks.shots = Выстрелы blocks.shots = Выстрелы
@@ -638,7 +652,9 @@ unit.liquidunits = жидкостных единиц
unit.powerunits = энерг. единиц unit.powerunits = энерг. единиц
unit.degrees = град. unit.degrees = град.
unit.seconds = сек. unit.seconds = сек.
unit.minutes = мин.
unit.persecond = /сек unit.persecond = /сек
unit.perminute = /мин
unit.timesspeed = x скорость unit.timesspeed = x скорость
unit.percent = % unit.percent = %
unit.items = предметов unit.items = предметов
@@ -727,6 +743,7 @@ category.blocks.name = Выбор блока
command.attack = Атаковать command.attack = Атаковать
command.rally = Точка сбора command.rally = Точка сбора
command.retreat = Отступить command.retreat = Отступить
command.idle = Ждать
placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, placement.blockselectkeys = \n[lightgray]Клавиша: [{0},
keybind.respawn.name = Возрождение в ядре keybind.respawn.name = Возрождение в ядре
keybind.control.name = Перехватить контроль над единицей keybind.control.name = Перехватить контроль над единицей
@@ -739,6 +756,7 @@ keybind.toggle_block_status.name = Отображение статусов бл
keybind.move_x.name = Движение по оси X keybind.move_x.name = Движение по оси X
keybind.move_y.name = Движение по оси Y keybind.move_y.name = Движение по оси Y
keybind.mouse_move.name = Следовать за курсором keybind.mouse_move.name = Следовать за курсором
keybind.pan.name = Панорамирование камеры
keybind.boost.name = Полёт/Ускорение keybind.boost.name = Полёт/Ускорение
keybind.schematic_select.name = Выбрать область keybind.schematic_select.name = Выбрать область
keybind.schematic_menu.name = Меню схем keybind.schematic_menu.name = Меню схем
@@ -800,6 +818,7 @@ rules.reactorexplosions = Взрывы реакторов
rules.wavetimer = Интервал волн rules.wavetimer = Интервал волн
rules.waves = Волны rules.waves = Волны
rules.attack = Режим атаки rules.attack = Режим атаки
rules.buildai = Строительство ИИ
rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда)
rules.blockhealthmultiplier = Множитель здоровья блоков rules.blockhealthmultiplier = Множитель здоровья блоков
rules.blockdamagemultiplier = Множитель урона блоков rules.blockdamagemultiplier = Множитель урона блоков
@@ -821,8 +840,11 @@ rules.title.unit = Боевые единицы
rules.title.experimental = Экспериментально rules.title.experimental = Экспериментально
rules.title.environment = Окружение rules.title.environment = Окружение
rules.lighting = Освещение rules.lighting = Освещение
rules.fire = Огонь
rules.explosions = Урон от взрывов блоков/единиц
rules.ambientlight = Окружающий свет rules.ambientlight = Окружающий свет
rules.solarpowermultiplier = Множитель солнечной энергии rules.solarpowermultiplier = Множитель солнечной энергии
rules.weather = Погода
content.item.name = Предметы content.item.name = Предметы
content.liquid.name = Жидкости content.liquid.name = Жидкости
@@ -867,13 +889,16 @@ liquid.temperature = [lightgray]Температура: {0}
unit.dagger.name = Кинжал unit.dagger.name = Кинжал
unit.mace.name = Булава unit.mace.name = Булава
unit.fortress.name = Крепость unit.fortress.name = Крепость
unit.scepter.name = Скипетр
unit.reign.name = Власть
unit.nova.name = Нова unit.nova.name = Нова
unit.pulsar.name = Пульсар unit.pulsar.name = Пульсар
unit.quasar.name = Квазар unit.quasar.name = Квазар
unit.crawler.name = Обходчик unit.crawler.name = Ползун
unit.atrax.name = Атракс unit.atrax.name = Атракс
unit.spiroct.name = Спайрокт unit.spiroct.name = Спайрокт
unit.arkyid.name = Аркид unit.arkyid.name = Аркид
unit.toxopid.name = Токсопид
unit.flare.name = Вспышка unit.flare.name = Вспышка
unit.horizon.name = Горизонт unit.horizon.name = Горизонт
unit.zenith.name = Зенит unit.zenith.name = Зенит
@@ -889,27 +914,28 @@ unit.alpha.name = Альфа
unit.beta.name = Бета unit.beta.name = Бета
unit.gamma.name = Гамма unit.gamma.name = Гамма
block.resupply-point.name = Пункт снабжения
block.parallax.name = Параллакс block.parallax.name = Параллакс
block.cliff.name = Скала block.cliff.name = Скала
block.sand-boulder.name = Песчаный валун block.sand-boulder.name = Песчаный валун
block.grass.name = Трава block.grass.name = Трава
block.slag.name = Шлак block.slag.name = Шлак
block.salt.name = Соль block.salt.name = Соль
block.saltrocks.name = Соляные камни block.salt-wall.name = Соляная стена
block.pebbles.name = Галька block.pebbles.name = Галька
block.tendrils.name = Споровые усики block.tendrils.name = Споровые усики
block.sandrocks.name = Песчаные камни block.sand-wall.name = Песчаная стена
block.spore-pine.name = Споровая сосна block.spore-pine.name = Споровая сосна
block.sporerocks.name = Споровые камни block.spore-wall.name = Споровая стена
block.rock.name = Каменный валун block.boulder.name = Каменный валун
block.snowrock.name = Заснеженный валун block.snow-boulder.name = Заснеженный валун
block.snow-pine.name = Заснеженная сосна block.snow-pine.name = Заснеженная сосна
block.shale.name = Сланец block.shale.name = Сланец
block.shale-boulder.name = Сланцевый валун block.shale-boulder.name = Сланцевый валун
block.moss.name = Мох block.moss.name = Мох
block.shrubs.name = Кусты block.shrubs.name = Кусты
block.spore-moss.name = Споровый мох block.spore-moss.name = Споровый мох
block.shalerocks.name = Сланцевые камни block.shale-wall.name = Сланцевая стена
block.scrap-wall.name = Стена из металлолома block.scrap-wall.name = Стена из металлолома
block.scrap-wall-large.name = Большая стена из металлолома block.scrap-wall-large.name = Большая стена из металлолома
block.scrap-wall-huge.name = Огромная стена из металлолома block.scrap-wall-huge.name = Огромная стена из металлолома
@@ -937,13 +963,16 @@ block.craters.name = Кратеры
block.sand-water.name = Песок с водой block.sand-water.name = Песок с водой
block.darksand-water.name = Тёмный песок с водой block.darksand-water.name = Тёмный песок с водой
block.char.name = Выжженная земля block.char.name = Выжженная земля
block.holostone.name = Голографический камень block.dacite.name = Дацит
block.dacite-wall.name = Дацитовая стена
block.ice-snow.name = Заснеженный лёд block.ice-snow.name = Заснеженный лёд
block.rocks.name = Камни block.stone-wall.name = Каменная стена
block.icerocks.name = Ледяные камни block.ice-wall.name = Ледяная стена
block.snowrocks.name = Снежные камни block.snow-wall.name = Снежная стена
block.dunerocks.name = Тёмные песчаные камни block.dune-wall.name = Тёмная песчаная стена
block.pine.name = Сосна block.pine.name = Сосна
block.dirt.name = Земля
block.dirt-wall.name = Земляная стена
block.white-tree-dead.name = Мёртвое белое дерево block.white-tree-dead.name = Мёртвое белое дерево
block.white-tree.name = Белое дерево block.white-tree.name = Белое дерево
block.spore-cluster.name = Скопление спор block.spore-cluster.name = Скопление спор
@@ -959,7 +988,7 @@ block.dark-panel-4.name = Тёмная панель 4
block.dark-panel-5.name = Тёмная панель 5 block.dark-panel-5.name = Тёмная панель 5
block.dark-panel-6.name = Тёмная панель 6 block.dark-panel-6.name = Тёмная панель 6
block.dark-metal.name = Тёмный металл block.dark-metal.name = Тёмный металл
block.ignarock.name = Обожжённый камень block.basalt.name = Базальт
block.hotrock.name = Горячий камень block.hotrock.name = Горячий камень
block.magmarock.name = Магмовый камень block.magmarock.name = Магмовый камень
block.cliffs.name = Скалы block.cliffs.name = Скалы
@@ -1073,6 +1102,7 @@ block.container.name = Контейнер
block.launch-pad.name = Пусковая площадка block.launch-pad.name = Пусковая площадка
block.launch-pad-large.name = Большая пусковая площадка block.launch-pad-large.name = Большая пусковая площадка
block.segment.name = Сегмент block.segment.name = Сегмент
block.command-center.name = Командный центр
block.ground-factory.name = Наземная фабрика block.ground-factory.name = Наземная фабрика
block.air-factory.name = Воздушная фабрика block.air-factory.name = Воздушная фабрика
block.naval-factory.name = Морская фабрика block.naval-factory.name = Морская фабрика
@@ -1089,7 +1119,9 @@ block.overdrive-dome.name = Сверхприводный купол
block.switch.name = Переключатель block.switch.name = Переключатель
block.micro-processor.name = Микропроцессор block.micro-processor.name = Микропроцессор
block.logic-processor.name = Логический процессор block.logic-processor.name = Логический процессор
block.hyper-processor.name = Гипер процессор
block.logic-display.name = Логический дисплей block.logic-display.name = Логический дисплей
block.large-logic-display.name = Большой логический дисплей
block.memory-cell.name = Запоминающее устройство block.memory-cell.name = Запоминающее устройство
team.blue.name = Синяя team.blue.name = Синяя
@@ -1226,10 +1258,10 @@ block.thorium-reactor.description = Генерирует значительно
block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса.
block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы. block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы.
block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур.
block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий.
block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии. block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии.
block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод.
block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. block.cultivator.description = Выращивает крошечные концентрации спор из атмосферы в готовые к использованию споры.
block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть.
block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться.
block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов. block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов.

View File

@@ -13,14 +13,14 @@ link.google-play.description = Завантажити для Android з Google P
link.f-droid.description = Завантажити для Android з F-Droid link.f-droid.description = Завантажити для Android з F-Droid
link.wiki.description = Офіційна ігрова Wiki link.wiki.description = Офіційна ігрова Wiki
link.suggestions.description = Запропонувати нові функції link.suggestions.description = Запропонувати нові функції
linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну.
screenshot = Зняток мапи збережено до {0} screenshot = Зняток мапи збережено до {0}
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
gameover = Гра завершена gameover = Гра завершена
gameover.pvp = [accent]{0}[] команда перемогла! gameover.pvp = [accent]{0}[] команда перемогла!
highscore = [accent]Новий рекорд! highscore = [accent]Новий рекорд!
copied = Скопійовано. copied = Скопійовано.
indevpopup = Наразі [accent]6.0[] знаходиться у стадії [accent]pre-alpha[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord. indevpopup = Наразі [accent]6.0[] знаходиться у стадії [accent]альфа[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює належним чином;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord.
load.sound = Звуки load.sound = Звуки
load.map = Мапи load.map = Мапи
@@ -40,8 +40,8 @@ be.check = Перевірити на наявність оновлень
schematic = Схема schematic = Схема
schematic.add = Зберегти схему… schematic.add = Зберегти схему…
schematics = Схеми schematics = Схеми
schematic.replace = Схема з такою назвою вже існує. Замінити її? schematic.replace = Схема з такою назвою вже є. Замінити її?
schematic.exists = Схема з такою назвою вже існує. schematic.exists = Схема з такою назвою вже є.
schematic.import = Імпортувати схему… schematic.import = Імпортувати схему…
schematic.exportfile = Експортувати файл schematic.exportfile = Експортувати файл
schematic.importfile = Імпортувати файл schematic.importfile = Імпортувати файл
@@ -51,7 +51,7 @@ schematic.copy.import = Імпортувати з клавіатури
schematic.shareworkshop = Поширити в Майстерню schematic.shareworkshop = Поширити в Майстерню
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему
schematic.saved = Схема збережена. schematic.saved = Схема збережена.
schematic.delete.confirm = Ця схема буде повністю випалена Викорінювачем. schematic.delete.confirm = Ви справді хочете видалити цю схему?
schematic.rename = Перейменувати схему schematic.rename = Перейменувати схему
schematic.info = {0}x{1}, {2} блоків schematic.info = {0}x{1}, {2} блоків
@@ -69,7 +69,7 @@ map.delete = Ви впевнені, що хочете видалити мапу
level.highscore = Рекорд: [accent]{0} level.highscore = Рекорд: [accent]{0}
level.select = Вибір мапи level.select = Вибір мапи
level.mode = Режим гри: level.mode = Режим гри:
coreattack = < Ядро знаходиться під атакою! > coreattack = < Ядро перебуває під атакою! >
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча
database = База даних ядра database = База даних ядра
savegame = Зберегти гру savegame = Зберегти гру
@@ -78,7 +78,7 @@ joingame = Мережева гра
customgame = Користувацька гра customgame = Користувацька гра
newgame = Нова гра newgame = Нова гра
none = <нічого> none = <нічого>
minimap = Міні-мапа minimap = Мінімапа
position = Місцезнаходження position = Місцезнаходження
close = Закрити close = Закрити
website = Вебсайт website = Вебсайт
@@ -98,15 +98,15 @@ committingchanges = Здійснення змін
done = Зроблено done = Зроблено
feature.unsupported = Ваш пристрій не підтримує цю функцію feature.unsupported = Ваш пристрій не підтримує цю функцію
mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord.
mods.alpha = [accent](Альфа) mods.alpha = [accent](Альфа)
mods = Модифікації mods = Модифікації
mods.none = [lightgray]Модифікацій не знайдено! mods.none = [lightgray]Модифікацій не знайдено!
mods.guide = Посібник з модифікацій mods.guide = Посібник із модифікацій
mods.report = Повідомити про ваду mods.report = Повідомити про ваду
mods.openfolder = Відкрити теку mods.openfolder = Відкрити теку
mods.reload = Перезавантажити mods.reload = Перезавантажити
mods.reloadexit = Гра зараз закриється, щоб перезавантажити модифікації mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації
mod.display = [gray]Модифікація:[orange] {0} mod.display = [gray]Модифікація:[orange] {0}
mod.enabled = [lightgray]Увімкнено mod.enabled = [lightgray]Увімкнено
mod.disabled = [scarlet]Вимкнено mod.disabled = [scarlet]Вимкнено
@@ -114,29 +114,32 @@ mod.disable = Вимкнути
mod.content = Зміст: mod.content = Зміст:
mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0} mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0}
mod.outdated = [scarlet]Не сумісна з V6 (немає мінімальної версі гри (англ. min-game-version): 105)
mod.missingdependencies = [scarlet]Відсутні залежності: {0} mod.missingdependencies = [scarlet]Відсутні залежності: {0}
mod.erroredcontent = [scarlet]Помилки при завантаженні mod.erroredcontent = [scarlet]Помилки під час завантаження
mod.errors = Виникли помилки під час завантаження змісту. mod.errors = Виникли помилки під час завантаження змісту.
mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх.
mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена.
mod.enable = Увімкнути mod.enable = Увімкнути
mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій.
mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.reloadrequired = [scarlet]Потрібно перезавантаження
mod.import = Імпортувати модифікацію mod.import = Імпортувати модифікацію
mod.import.file = Імпортувати файл mod.import.file = Імпортувати файл
mod.import.github = Імпортувати з GitHub mod.import.github = Імпортувати з GitHub
mod.jarwarn = [scarlet]JAR-модифікації по своїй суті небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! mod.jarwarn = [scarlet]JAR-модифікації за своєю суттю небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела!
mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію. mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоби видалити його, видаліть цю модифікацію.
mod.remove.confirm = Цю модифікацію буде видалено. mod.remove.confirm = Цю модифікацію буде видалено.
mod.author = [lightgray]Автор:[] {0} mod.author = [lightgray]Автор:[] {0}
mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0}
mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову.
mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію у теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації.
mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри. mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри.
about.button = Про гру about.button = Про гру
name = Ім’я: name = Ім’я:
noname = Спочатку придумайте[accent] собі ім’я[]. noname = Спочатку придумайте[accent] собі ім’я[].
planetmap = Планетна мапа
launchcore = Запустити ядро
filename = Назва файлу: filename = Назва файлу:
unlocked = Доступний новий вміст! unlocked = Доступний новий вміст!
completed = [accent]Завершено completed = [accent]Завершено
@@ -150,28 +153,28 @@ players.single = {0} гравець на сервері
players.search = пошук players.search = пошук
players.notfound = [gray]гравців не знайдено players.notfound = [gray]гравців не знайдено
server.closing = [accent]Закриття сервера… server.closing = [accent]Закриття сервера…
server.kicked.kick = Ви були вигнані з сервера! server.kicked.kick = Ви були вигнані із сервера!
server.kicked.whitelist = Ви не в білому списку сервера. server.kicked.whitelist = Ви не в білому списку сервера.
server.kicked.serverClose = Сервер закрито. server.kicked.serverClose = Сервер зачинено.
server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте. server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте.
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру! server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру!
server.kicked.banned = Ви заблоковані на цьому сервері. server.kicked.banned = Ви заблоковані на цьому сервері.
server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки. server.kicked.typeMismatch = Цей сервер не сумісний із вашим типом збірки.
server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця. server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця.
server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням. server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням.
server.kicked.nameInUse = На цьому сервері вже є хтось з таким ім’ям. server.kicked.nameInUse = На цьому сервері вже є хтось із таким ім’ям.
server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру. server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру.
server.kicked.idInUse = Ви вже на цьому сервері! Під’єднанням двох облікових записів не дозволяється. server.kicked.idInUse = Ви вже на цьому сервері! Під’єднанням двох облікових записів не дозволяється.
server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію. server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію.
server.kicked.gameover = Гру завершено! server.kicked.gameover = Гру завершено!
server.kicked.serverRestarting = Сервер перезавантажується server.kicked.serverRestarting = Сервер перезавантажується
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[] server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережах[], повинні побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер. host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер.
join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip. join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip.
hostserver = Запустити багатокористувацький сервер hostserver = Запустити багатокористувацький сервер
invitefriends = Запросити друзів invitefriends = Запросити друзів
hostserver.mobile = Запустити\nсервер hostserver.mobile = Запустити сервер
host = Запустити host = Запустити
hosting = [accent]Відкриття сервера… hosting = [accent]Відкриття сервера…
hosts.refresh = Оновити hosts.refresh = Оновити
@@ -260,25 +263,25 @@ ok = Гаразд
open = Відкрити open = Відкрити
customize = Налаштувати правила customize = Налаштувати правила
cancel = Скасувати cancel = Скасувати
openlink = Відкрити посилання openlink = Перейти за посиланням
copylink = Скопіювати посилання copylink = Скопіювати посилання
back = Назад back = Назад
data.export = Вивантажити дані data.export = Вивантажити дані
data.import = Завантажити дані data.import = Завантажити дані
data.openfolder = Відкрити теку з даними data.openfolder = Відчинити теку з даними
data.exported = Дані вивантажено. data.exported = Дані вивантажено.
data.invalid = Це не дійсні ігрові дані. data.invalid = Це не дійсні ігрові дані.
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється.
quit.confirm = Ви дійсно хочете вийти? quit.confirm = Ви дійсно хочете вийти?
quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[] quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[]
loading = [accent]Завантаження… loading = [accent]Завантаження…
reloading = [accent]Перезавантаження модифікацій… reloading = [accent]Перезавантаження модифікацій…
saving = [accent]Збереження… saving = [accent]Збереження…
respawn = [accent][[{0}][], щоб відродитися в ядрі respawn = [accent][[{0}][], щоби відродитися в ядрі
cancelbuilding = [accent][[{0}][], щоб очистити план cancelbuilding = [accent][[{0}][], щоб очистити план
selectschematic = [accent][[{0}][], щоб вибрати та скопіювати selectschematic = [accent][[{0}][], щоби вибрати та скопіювати
pausebuilding = [accent][[{0}][], щоб призупинити будування pausebuilding = [accent][[{0}][], щоби призупинити будування
resumebuilding = [scarlet][[{0}][], щоб продовжити будування resumebuilding = [scarlet][[{0}][], щоби продовжити будування
wave = [accent]Хвиля {0} wave = [accent]Хвиля {0}
wave.waiting = [lightgray]Наступна хвиля\nчерез {0} wave.waiting = [lightgray]Наступна хвиля\nчерез {0}
wave.waveInProgress = [lightgray]Хвиля триває wave.waveInProgress = [lightgray]Хвиля триває
@@ -294,11 +297,11 @@ builtin = Вбудована
map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати!
map.random = [accent]Випадкова мапа map.random = [accent]Випадкова мапа
map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі.
map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі.
map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі.
map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи.
workshop.update = Оновити предмет workshop.update = Оновити предмет
workshop.error = Помилка при отриманні інформації з Майстерні: {0} workshop.error = Помилка під час отримання інформації з Майстерні: {0}
map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться!
workshop.menu = Виберіть, що ви хочете зробити з цим предметом. workshop.menu = Виберіть, що ви хочете зробити з цим предметом.
workshop.info = Інформація про предмет workshop.info = Інформація про предмет
@@ -307,7 +310,7 @@ eula = Ліцензійна угода Steam
missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано.
publishing = [accent]Публікація… publishing = [accent]Публікація…
publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
publish.error = Виникла помилка при публікації предмета: {0} publish.error = Виникла помилка під час публікації предмета: {0}
steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
editor.brush = Пензлик editor.brush = Пензлик
@@ -317,11 +320,11 @@ editor.oregen.info = Генерація руд:
editor.mapinfo = Інформація про мапу editor.mapinfo = Інформація про мапу
editor.author = Автор: editor.author = Автор:
editor.description = Опис: editor.description = Опис:
editor.nodescription = Мапа повинна мати щонайменше 4 символи для публікації. editor.nodescription = Мапа мусить мати щонайменше 4 символи для публікації.
editor.waves = Хвилі: editor.waves = Хвилі:
editor.rules = Правила: editor.rules = Правила:
editor.generation = Генерація: editor.generation = Генерація:
editor.ingame = Редагувати у грі editor.ingame = Редагувати в грі
editor.publish.workshop = Опублікувати в Майстерні Steam editor.publish.workshop = Опублікувати в Майстерні Steam
editor.newmap = Нова мапа editor.newmap = Нова мапа
workshop = Майстерня workshop = Майстерня
@@ -338,9 +341,12 @@ waves.preview = Попередній перегляд
waves.edit = Редагувати… waves.edit = Редагувати…
waves.copy = Копіювати в буфер обміну waves.copy = Копіювати в буфер обміну
waves.load = Завантажити з буфера обміну waves.load = Завантажити з буфера обміну
waves.invalid = Недійсні хвилі у буфері обміну. waves.invalid = Недійсні хвилі в буфері обміну.
waves.copied = Хвилі скопійовані. waves.copied = Хвилі скопійовані.
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
wavemode.counts = кількість
wavemode.totals = усього
wavemode.health = здоров’я
editor.default = [lightgray]<За замовчуванням> editor.default = [lightgray]<За замовчуванням>
details = Подробиці… details = Подробиці…
edit = Редагувати… edit = Редагувати…
@@ -350,11 +356,11 @@ editor.removeunit = Видалити бойову одиницю
editor.teams = Команди editor.teams = Команди
editor.errorload = Помилка завантаження зображення. editor.errorload = Помилка завантаження зображення.
editor.errorsave = Помилка збереження зображення. editor.errorsave = Помилка збереження зображення.
editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» у редакторі. editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі.
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
editor.errornot = Це не мапа. editor.errornot = Це не мапа.
editor.errorheader = Цей файл мапи недійсний або пошкоджений. editor.errorheader = Цей файл мапи недійсний або пошкоджений.
editor.errorname = Мапа не має назви. Може Ви намагаєтеся завантажити збереження? editor.errorname = Мапа не має назви. Може, ви намагаєтеся завантажити збереження?
editor.update = Оновити editor.update = Оновити
editor.randomize = Випадково editor.randomize = Випадково
editor.apply = Застосувати editor.apply = Застосувати
@@ -365,7 +371,7 @@ editor.savemap = Зберегти мапу
editor.saved = Збережено! editor.saved = Збережено!
editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу». editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу».
editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу». editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу».
editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує! editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже є!
editor.import = Імпорт… editor.import = Імпорт…
editor.importmap = Імпортувати мапу editor.importmap = Імпортувати мапу
editor.importmap.description = Імпортувати вже наявну мапу editor.importmap.description = Імпортувати вже наявну мапу
@@ -380,12 +386,12 @@ editor.exportimage = Експорт зображення місцевості
editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості
editor.loadimage = Завантажити\nзображення editor.loadimage = Завантажити\nзображення
editor.saveimage = Зберегти\nзображення editor.saveimage = Зберегти\nзображення
editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? editor.unsaved = Ви впевнені, що хочете вийти?\n[scarlet]Незбережені зміни буде втрачено назавжди![]
editor.resizemap = Змінити розмір мапи editor.resizemap = Змінити розмір мапи
editor.mapname = Назва мапи: editor.mapname = Назва мапи:
editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу. editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу.
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]»
editor.exists = Мапа з такою назвою вже існує. editor.exists = Мапа з такою назвою вже є.
editor.selectmap = Виберіть мапу для завантаження: editor.selectmap = Виберіть мапу для завантаження:
toolmode.replace = Замінити toolmode.replace = Замінити
@@ -398,7 +404,7 @@ toolmode.square = Прямокутник
toolmode.square.description = Прямокутна кисть. toolmode.square.description = Прямокутна кисть.
toolmode.eraseores = Видалення руд toolmode.eraseores = Видалення руд
toolmode.eraseores.description = Видалити тільки руди. toolmode.eraseores.description = Видалити тільки руди.
toolmode.fillteams = Змінити блок в команді toolmode.fillteams = Змінити блок у команді
toolmode.fillteams.description = Змінює належність\nблоків до команди. toolmode.fillteams.description = Змінює належність\nблоків до команди.
toolmode.drawteams = Змінити команду блока toolmode.drawteams = Змінити команду блока
toolmode.drawteams.description = Змінює належність\nблока до команди. toolmode.drawteams.description = Змінює належність\nблока до команди.
@@ -447,7 +453,7 @@ load = Завантажити
save = Зберегти save = Зберегти
fps = FPS: {0} fps = FPS: {0}
ping = Затримка: {0} мс ping = Затримка: {0} мс
language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. language.restart = Будь ласка, перезапустіть свою гру, щоби налаштування мови набули чинності.
settings = Налаштування settings = Налаштування
tutorial = Навчання tutorial = Навчання
tutorial.retake = Пройти навчання ще раз tutorial.retake = Пройти навчання ще раз
@@ -459,7 +465,7 @@ abandon.text = Ця зона і всі її ресурси будуть утра
locked = Заблоковано locked = Заблоковано
complete = [lightgray]Необхідно: complete = [lightgray]Необхідно:
requirement.wave = Досягніть хвилі {0} у зоні «{1}» requirement.wave = Досягніть хвилі {0} у зоні «{1}»
requirement.core = Знищте вороже ядро у зоні «{0}» requirement.core = Знищте вороже ядро в зоні «{0}»
requirement.unlock = Розблокуйте {0} requirement.unlock = Розблокуйте {0}
resume = Відновити зону:\n[lightgray]{0} resume = Відновити зону:\n[lightgray]{0}
bestwave = [lightgray]Найкраща хвиля: {0} bestwave = [lightgray]Найкраща хвиля: {0}
@@ -468,7 +474,7 @@ launch.text = Запуск
launch.title = Запуск вдалий launch.title = Запуск вдалий
launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі
launch.unable2 = [scarlet]ЗАПУСК неможливий.[] launch.unable2 = [scarlet]ЗАПУСК неможливий.[]
launch.confirm = Це видалить всі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. launch.confirm = Це видалить усі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази.
launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль. launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль.
uncover = Розкрити uncover = Розкрити
configure = Налаштувати вивантаження configure = Налаштувати вивантаження
@@ -476,7 +482,7 @@ loadout = Вивантаження
resources = Ресурси resources = Ресурси
bannedblocks = Заборонені блоки bannedblocks = Заборонені блоки
addall = Додати все addall = Додати все
configure.invalid = Кількість повинна бути числом між 0 та {0}. configure.invalid = Кількість має бути числом між 0 та {0}.
zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована.
zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1}
zone.resources = [lightgray]Виявлені ресурси: zone.resources = [lightgray]Виявлені ресурси:
@@ -489,7 +495,7 @@ boss.health = Здоров’я босу
connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0} connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0}
error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса? error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса?
error.invalidaddress = Некоректна адреса. error.invalidaddress = Некоректна адреса.
error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту! error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна й що власник сервера налаштував переадресацію порту!
error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry! error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry!
error.alreadyconnected = Ви вже під’єдналися. error.alreadyconnected = Ви вже під’єдналися.
error.mapnotfound = Файл мапи не знайдено! error.mapnotfound = Файл мапи не знайдено!
@@ -497,6 +503,18 @@ error.io = Мережева помилка введення-виведення.
error.any = Невідома мережева помилка error.any = Невідома мережева помилка
error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це. error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це.
weather.rain.name = Дощ
weather.snow.name = Сніг
weather.sandstorm.name = Піщана буря
weather.sporestorm.name = Спорова буря
sectors.unexplored = [lightgray]Не досліджено
sectors.resources = Ресурси:
sectors.production = Виробництво:
sectors.stored = Зберігає:
sectors.resume = Продовжити
sectors.launch = Запуск
sector.groundZero.name = Відправний пункт sector.groundZero.name = Відправний пункт
sector.craters.name = Кратери sector.craters.name = Кратери
sector.frozenForest.name = Крижаний ліс sector.frozenForest.name = Крижаний ліс
@@ -516,7 +534,7 @@ sector.craters.description = У цьому кратері накопичилас
sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології. sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології.
sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці. sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці.
sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам. sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам.
sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один з небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти.
sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника. sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника.
sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією. sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією.
@@ -532,7 +550,9 @@ settings.sound = Звук
settings.graphics = Графіка settings.graphics = Графіка
settings.cleardata = Очистити дані… settings.cleardata = Очистити дані…
settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати! settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати!
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється.
settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження?
settings.clearsaves = Очистити збереження
paused = [accent]< Пауза> paused = [accent]< Пауза>
clear = Очистити clear = Очистити
banned = [scarlet]Заблоковано banned = [scarlet]Заблоковано
@@ -558,8 +578,11 @@ blocks.itemsmoved = Швидкість переміщення
blocks.launchtime = Час між запусками blocks.launchtime = Час між запусками
blocks.shootrange = Радіус дії blocks.shootrange = Радіус дії
blocks.size = Розмір blocks.size = Розмір
blocks.displaysize = Розмір дисплею
blocks.liquidcapacity = Рідинна місткість blocks.liquidcapacity = Рідинна місткість
blocks.powerrange = Діапазон передачі енергії blocks.powerrange = Радіус передачі енергії
blocks.linkrange = Радіус з’єднання
blocks.instructions = Інструкції
blocks.powerconnections = Максимальна кількість з’єднань blocks.powerconnections = Максимальна кількість з’єднань
blocks.poweruse = Енергії використовує blocks.poweruse = Енергії використовує
blocks.powerdamage = Енергії за од. шкоди blocks.powerdamage = Енергії за од. шкоди
@@ -575,6 +598,7 @@ blocks.boosteffect = Прискорювальний ефект
blocks.maxunits = Максимальна кількість активних одиниць blocks.maxunits = Максимальна кількість активних одиниць
blocks.health = Здоров’я blocks.health = Здоров’я
blocks.buildtime = Час будування blocks.buildtime = Час будування
blocks.maxconsecutive = Максимальна послідовність
blocks.buildcost = Вартість будування blocks.buildcost = Вартість будування
blocks.inaccuracy = Розкид blocks.inaccuracy = Розкид
blocks.shots = Постріли blocks.shots = Постріли
@@ -582,7 +606,7 @@ blocks.reload = Постріли/секунду
blocks.ammo = Боєприпаси blocks.ammo = Боєприпаси
bar.drilltierreq = Потребується кращий бур bar.drilltierreq = Потребується кращий бур
bar.noresources = Відсутні ресурси bar.noresources = Бракує ресурсів
bar.corereq = Необхідне основне ядро bar.corereq = Необхідне основне ядро
bar.drillspeed = Швидкість буріння: {0} за с. bar.drillspeed = Швидкість буріння: {0} за с.
bar.pumpspeed = Швидкість викачування: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с.
@@ -622,7 +646,9 @@ unit.liquidunits = одиниць рідини
unit.powerunits = одиниць енергії unit.powerunits = одиниць енергії
unit.degrees = град. unit.degrees = град.
unit.seconds = с unit.seconds = с
unit.minutes = хв
unit.persecond = за секунду unit.persecond = за секунду
unit.perminute = за хвилину
unit.timesspeed = x швидкість unit.timesspeed = x швидкість
unit.percent = % unit.percent = %
unit.items = предм. unit.items = предм.
@@ -638,7 +664,7 @@ category.shooting = Стрільба
category.optional = Додаткові поліпшення category.optional = Додаткові поліпшення
setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.landscape.name = Тільки альбомний (горизонтальний) режим
setting.shadows.name = Тіні setting.shadows.name = Тіні
setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків
setting.linear.name = Лінійна фільтрація setting.linear.name = Лінійна фільтрація
setting.hints.name = Підказки setting.hints.name = Підказки
setting.flow.name = Показувати темп швидкості ресурсів setting.flow.name = Показувати темп швидкості ресурсів
@@ -649,7 +675,7 @@ setting.animatedshields.name = Анімаційні щити
setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[]
setting.playerindicators.name = Позначки гравців setting.playerindicators.name = Позначки гравців
setting.indicators.name = Позначки противників setting.indicators.name = Позначки противників
setting.autotarget.name = Авто-стрільба setting.autotarget.name = Автострільба
setting.keyboard.name = Миш+Керування з клавіатури setting.keyboard.name = Миш+Керування з клавіатури
setting.touchscreen.name = Керування сенсорним екраном setting.touchscreen.name = Керування сенсорним екраном
setting.fpscap.name = Максимальний FPS setting.fpscap.name = Максимальний FPS
@@ -681,11 +707,11 @@ setting.blockselectkeys.name = Показувати клавіші вибору
setting.vsync.name = Вертикальна синхронізація setting.vsync.name = Вертикальна синхронізація
setting.pixelate.name = Пікселізація setting.pixelate.name = Пікселізація
setting.minimap.name = Показувати мінімапу setting.minimap.name = Показувати мінімапу
setting.coreitems.name = Показувати предмети в ядрі (в роботі) setting.coreitems.name = Показувати предмети в ядрі (дороблюється)
setting.position.name = Показувати координати гравця setting.position.name = Показувати координати гравця
setting.musicvol.name = Гучність музики setting.musicvol.name = Гучність музики
setting.atmosphere.name = Показувати планетарну атмосферу setting.atmosphere.name = Показувати планетарну атмосферу
setting.ambientvol.name = Звуки навколишнього середовища setting.ambientvol.name = Звуки довкілля
setting.mutemusic.name = Заглушити музику setting.mutemusic.name = Заглушити музику
setting.sfxvol.name = Гучність звукових ефектів setting.sfxvol.name = Гучність звукових ефектів
setting.mutesound.name = Заглушити звук setting.mutesound.name = Заглушити звук
@@ -697,7 +723,7 @@ setting.chatopacity.name = Непрозорість чату
setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.lasersopacity.name = Непрозорість лазерів енергопостачання
setting.bridgeopacity.name = Непрозорість мостів setting.bridgeopacity.name = Непрозорість мостів
setting.playerchat.name = Показувати хмару чата над гравцями setting.playerchat.name = Показувати хмару чата над гравцями
public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити у Налаштування->Гра->Загальнодоступність гри. public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри.
public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри.
uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд…
uiscale.cancel = Скасувати & Вийти uiscale.cancel = Скасувати & Вийти
@@ -711,6 +737,7 @@ category.blocks.name = Вибір блока
command.attack = Атака command.attack = Атака
command.rally = Точка збору command.rally = Точка збору
command.retreat = Відступити command.retreat = Відступити
command.idle = Бездіяти
placement.blockselectkeys = \n[lightgray]Ключ: [{0}, placement.blockselectkeys = \n[lightgray]Ключ: [{0},
keybind.respawn.name = Відродження keybind.respawn.name = Відродження
keybind.control.name = Контролювання одиниці keybind.control.name = Контролювання одиниці
@@ -722,7 +749,8 @@ keybind.toggle_power_lines.name = Показувати лазери енерго
keybind.toggle_block_status.name = Показувати стан блоків keybind.toggle_block_status.name = Показувати стан блоків
keybind.move_x.name = Рух по осі X keybind.move_x.name = Рух по осі X
keybind.move_y.name = Рух по осі Y keybind.move_y.name = Рух по осі Y
keybind.mouse_move.name = Слідкувати за мишею keybind.mouse_move.name = Рухатися за мишею
keybind.pan.name = Політ камери за мишею
keybind.boost.name = Прискорення keybind.boost.name = Прискорення
keybind.schematic_select.name = Вибрати ділянку keybind.schematic_select.name = Вибрати ділянку
keybind.schematic_menu.name = Меню схем keybind.schematic_menu.name = Меню схем
@@ -755,7 +783,7 @@ keybind.zoom.name = Наблизити
keybind.menu.name = Меню keybind.menu.name = Меню
keybind.pause.name = Пауза keybind.pause.name = Пауза
keybind.pause_building.name = Призупинити/Продовжити будування keybind.pause_building.name = Призупинити/Продовжити будування
keybind.minimap.name = Міні-мапа keybind.minimap.name = Мінімапа
keybind.chat.name = Чат keybind.chat.name = Чат
keybind.player_list.name = Список гравців keybind.player_list.name = Список гравців
keybind.console.name = Консоль keybind.console.name = Консоль
@@ -766,10 +794,10 @@ keybind.chat_history_prev.name = Попередня історія чату
keybind.chat_history_next.name = Наступна історія чату keybind.chat_history_next.name = Наступна історія чату
keybind.chat_scroll.name = Прокрутка чату keybind.chat_scroll.name = Прокрутка чату
keybind.drop_unit.name = Скинути бойову одиницю keybind.drop_unit.name = Скинути бойову одиницю
keybind.zoom_minimap.name = Збільшити міні-мапу keybind.zoom_minimap.name = Збільшити мінімапу
mode.help.title = Опис режимів гри mode.help.title = Опис режимів гри
mode.survival.name = Виживання mode.survival.name = Виживання
mode.survival.description = Звичайний режим. В цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри.
mode.sandbox.name = Пісочниця mode.sandbox.name = Пісочниця
mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням. mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням.
mode.editor.name = Редактор mode.editor.name = Редактор
@@ -784,28 +812,34 @@ rules.reactorexplosions = Вибухи реактора
rules.wavetimer = Таймер для хвиль rules.wavetimer = Таймер для хвиль
rules.waves = Хвилі rules.waves = Хвилі
rules.attack = Режим атаки rules.attack = Режим атаки
rules.buildai = Будування ШІ
rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ
rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockhealthmultiplier = Множник здоров’я блоків
rules.blockdamagemultiplier = Множник шкоди блоків rules.blockdamagemultiplier = Множник шкоди блоків
rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць
rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць
rules.unitdamagemultiplier = Множник шкоди бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць
rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (плитки) rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки)
rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.wavespacing = Інтервал хвиль:[lightgray] (секунди)
rules.buildcostmultiplier = Множник затрат на будування rules.buildcostmultiplier = Множник затрат на будування
rules.buildspeedmultiplier = Множник швидкості будування rules.buildspeedmultiplier = Множник швидкості будування
rules.deconstructrefundmultiplier = Множник відшкодування при демонтажі rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу
rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої
rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках)
rules.unitammo = Бойові одиниці потребують боєприпасів rules.unitammo = Бойові одиниці потребують боєприпасів
rules.title.waves = Хвилі rules.title.waves = Хвилі
rules.title.resourcesbuilding = Ресурси & будування rules.title.resourcesbuilding = Ресурси й будування
rules.title.enemy = Противники rules.title.enemy = Противники
rules.title.unit = Бойові одиниці rules.title.unit = Бойові одиниці
rules.title.experimental = Експериментальне rules.title.experimental = Експериментальне
rules.title.environment = Середовище rules.title.environment = Середовище
rules.lighting = Світлотінь rules.lighting = Світлотінь
rules.fire = Вогонь
rules.explosions = Шкода від вибухів блоків і одиниць
rules.ambientlight = Навколишнє світло rules.ambientlight = Навколишнє світло
rules.weather = Погода
rules.weather.frequency = Повторюваність:
rules.weather.duration = Тривалість:
rules.solarpowermultiplier = Множник сонячної енергії rules.solarpowermultiplier = Множник сонячної енергії
content.item.name = Предмети content.item.name = Предмети
@@ -853,11 +887,12 @@ unit.fortress.name = Фортеця
unit.nova.name = Нова unit.nova.name = Нова
unit.pulsar.name = Пульсар unit.pulsar.name = Пульсар
unit.quasar.name = Квазар unit.quasar.name = Квазар
unit.crawler.name = Камікадзе unit.crawler.name = Плазун
unit.atrax.name = Атракс unit.atrax.name = Атракс
unit.spiroct.name = Павучник unit.spiroct.name = Павучник
unit.arkyid.name = Аркиїд unit.arkyid.name = Аркиїд
unit.flare.name = Фальшфейєр unit.toxopid.name = Отруйник
unit.flare.name = Фальшфеєр
unit.horizon.name = Горизонт unit.horizon.name = Горизонт
unit.zenith.name = Зеніт unit.zenith.name = Зеніт
unit.antumbra.name = Тіньовик unit.antumbra.name = Тіньовик
@@ -871,28 +906,31 @@ unit.bryde.name = Смугач Брайда
unit.alpha.name = Альфа unit.alpha.name = Альфа
unit.beta.name = Бета unit.beta.name = Бета
unit.gamma.name = Гамма unit.gamma.name = Гамма
unit.scepter.name = Верховна влада
unit.reign.name = Верховний Порядок
block.resupply-point.name = Пункт постачання
block.parallax.name = Паралакс block.parallax.name = Паралакс
block.cliff.name = Скеля block.cliff.name = Скеля
block.sand-boulder.name = Пісочний валун block.sand-boulder.name = Пісочний валун
block.grass.name = Трава block.grass.name = Трава
block.slag.name = Шлак block.slag.name = Шлак
block.salt.name = Сіль block.salt.name = Сіль
block.saltrocks.name = Соляні камені block.salt-wall.name = Соляна стіна
block.pebbles.name = Галька block.pebbles.name = Галька
block.tendrils.name = Щупальця block.tendrils.name = Щупальця
block.sandrocks.name = Піщані скелі block.sand-wall.name = Піскова стіна
block.spore-pine.name = Спорова сосна block.spore-pine.name = Спорова сосна
block.sporerocks.name = Спорові камені block.spore-wall.name = Спорова стіна
block.rock.name = Камінь block.boulder.name = Брила
block.snowrock.name = Сніжний камінь block.snow-boulder.name = Снігова брила
block.snow-pine.name = Сніжні сосни block.snow-pine.name = Сніжні сосни
block.shale.name = Сланець block.shale.name = Сланець
block.shale-boulder.name = Сланцевий валун block.shale-boulder.name = Сланцевий валун
block.moss.name = Мох block.moss.name = Мох
block.shrubs.name = Кущі block.shrubs.name = Кущі
block.spore-moss.name = Споровий мох block.spore-moss.name = Споровий мох
block.shalerocks.name = Сланцеві породи block.shale-wall.name = Сланцева стіна
block.scrap-wall.name = Стіна з брухту block.scrap-wall.name = Стіна з брухту
block.scrap-wall-large.name = Велика стіна з брухту block.scrap-wall-large.name = Велика стіна з брухту
block.scrap-wall-huge.name = Величезна стіна з брухту block.scrap-wall-huge.name = Величезна стіна з брухту
@@ -917,16 +955,19 @@ block.darksand.name = Темний пісок
block.ice.name = Лід block.ice.name = Лід
block.snow.name = Сніг block.snow.name = Сніг
block.craters.name = Кратери block.craters.name = Кратери
block.sand-water.name = Пісок з водою block.sand-water.name = Пісок із водою
block.darksand-water.name = Темний пісок з водою block.darksand-water.name = Темний пісок із водою
block.char.name = Випалена земля block.char.name = Випалена земля
block.holostone.name = Голографічний камінь block.dacite.name = Дацит
block.dacite-wall.name = Дацитова стіна
block.ice-snow.name = Крижаний сніг block.ice-snow.name = Крижаний сніг
block.rocks.name = Камені block.stone-wall.name = Кам’яна стіна
block.icerocks.name = Крижані камені block.ice-wall.name = Крижана стіна
block.snowrocks.name = Снігові камені block.snow-wall.name = Снігова стіна
block.dunerocks.name = Піщані камені block.dune-wall.name = Дюнова стіна
block.pine.name = Сосна block.pine.name = Сосна
block.dirt.name = Ґрунт
block.dirt-wall.name = Ґрунтова стіна
block.white-tree-dead.name = Мертве біле дерево block.white-tree-dead.name = Мертве біле дерево
block.white-tree.name = Біле дерево block.white-tree.name = Біле дерево
block.spore-cluster.name = Скупчення спор block.spore-cluster.name = Скупчення спор
@@ -942,7 +983,7 @@ block.dark-panel-4.name = Темна панель 4
block.dark-panel-5.name = Темна панель 5 block.dark-panel-5.name = Темна панель 5
block.dark-panel-6.name = Темна панель 6 block.dark-panel-6.name = Темна панель 6
block.dark-metal.name = Темний метал block.dark-metal.name = Темний метал
block.ignarock.name = Магматичні гірські породи block.basalt.name = Базальт
block.hotrock.name = Гарячий камінь block.hotrock.name = Гарячий камінь
block.magmarock.name = Магмовий камінь block.magmarock.name = Магмовий камінь
block.cliffs.name = Скелі block.cliffs.name = Скелі
@@ -967,7 +1008,7 @@ block.conveyor.name = Конвеєр
block.titanium-conveyor.name = Титановий конвеєр block.titanium-conveyor.name = Титановий конвеєр
block.plastanium-conveyor.name = Пластанієвий конвеєр block.plastanium-conveyor.name = Пластанієвий конвеєр
block.armored-conveyor.name = Броньований конвеєр block.armored-conveyor.name = Броньований конвеєр
block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок.
block.junction.name = Перехрестя block.junction.name = Перехрестя
block.router.name = Маршрутизатор block.router.name = Маршрутизатор
block.distributor.name = Розподілювач block.distributor.name = Розподілювач
@@ -1056,18 +1097,26 @@ block.container.name = Сховище
block.launch-pad.name = Стартовий майданчик block.launch-pad.name = Стартовий майданчик
block.launch-pad-large.name = Великий стартовий майданчик block.launch-pad-large.name = Великий стартовий майданчик
block.segment.name = Сегмент block.segment.name = Сегмент
block.command-center.name = Командний центр
block.ground-factory.name = Наземний завод block.ground-factory.name = Наземний завод
block.air-factory.name = Повітряний завод block.air-factory.name = Повітряний завод
block.naval-factory.name = Морський завод block.naval-factory.name = Морський завод
block.additive-reconstructor.name = Додавальний реконструктор block.additive-reconstructor.name = Додавальний реконструктор
block.multiplicative-reconstructor.name = Примножувальний реконструктор block.multiplicative-reconstructor.name = Примножувальний реконструктор
block.exponential-reconstructor.name = Експоненційний реконструктор block.exponential-reconstructor.name = Експоненційний реконструктор
block.tetrative-reconstructor.name = Тетративний реконструктор block.tetrative-reconstructor.name = Тетративний реконструктор
block.payload-conveyor.name = Вантажний конвеєр block.payload-conveyor.name = Вантажний конвеєр
block.payload-router.name = Розвантажувальний маршрутизатор block.payload-router.name = Розвантажувальний маршрутизатор
block.disassembler.name = Розбирач block.disassembler.name = Розбирач
block.silicon-crucible.name = Кремнієвий тигель block.silicon-crucible.name = Кремнієвий тигель
block.large-overdrive-projector.name = Великий прискорювач block.large-overdrive-projector.name = Великий прискорювач
block.switch.name = Перемикач
block.micro-processor.name = Мікропроцесор
block.logic-processor.name = Логічний процесор
block.hyper-processor.name = Гіперпроцесор
block.logic-display.name = Логічний дисплей
block.large-logic-display.name = Великий логічний дисплей
block.memory-cell.name = Комірка пам’яті
team.blue.name = Синя team.blue.name = Синя
team.crux.name = Червона team.crux.name = Червона
team.sharded.name = Помаранчева team.sharded.name = Помаранчева
@@ -1077,39 +1126,39 @@ team.green.name = Зелена
team.purple.name = Фіолетова team.purple.name = Фіолетова
tutorial.next = [lightgray]<Натисніть для продовження> tutorial.next = [lightgray]<Натисніть для продовження>
tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді tutorial.intro = Ви розпочали[scarlet] навчання з Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді
tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді tutorial.intro.mobile = Ви розпочали[scarlet] навчання з Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді
tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від відкритої вкладки.\n[accent]Натисніть ПКМ[], щоб зупинити будування. tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від розгорнутої вкладки.\n[accent]Натисніть ПКМ[], щоби зупинити будування.
tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоб підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоб скасувати розміщення. tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоби підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоби скасувати розміщення.
tutorial.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[] tutorial.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[]
tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення в лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро.
tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро.
tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються у будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди повинні бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази.
tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоб заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоби заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1
tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи. tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи.
tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи. tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи.
tutorial.unpause = Призупиніть гру, натиснувши на пробіл. tutorial.unpause = Призупиніть гру, натиснувши на пробіл.
tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоб зняти паузу. tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу.
tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні.
tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищте область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоби зламати його.\nВидаліть ділянку, утримуючи палець упродовж декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоби підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні.
tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з ядра.[] tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з ядра.[]
tutorial.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[] tutorial.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[]
tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоби стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді.
tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді.
tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску.
item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків. item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків.
item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та у транспортуванні рідин. item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин.
item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини.
item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент. item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент.
item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів. item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів.
item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів. item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів.
item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків. item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків.
item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива. item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива.
item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів. item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів.
item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт. item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт.
item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах. item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах.
item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та у технології самовідновлення. item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення.
item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями. item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями.
item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо. item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо.
item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується. item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується.
@@ -1117,24 +1166,24 @@ item.pyratite.description = Надзвичайно легкозаймиста р
liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів. liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів.
liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя.
liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля.
liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує.
block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками. block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками.
block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту. block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту.
block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля. block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля.
block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній.
block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії. block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії.
block.plastanium-compressor.description = Виробляє пластаній з нафти та титану. block.plastanium-compressor.description = Виробляє пластаній із нафти та титану.
block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії. block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії.
block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву. block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву.
block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання у торієвому реактору. block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання в торієвому реактору.
block.blast-mixer.description = Подрібнює і змішує скупчення спор з піротитом для отримання вибухової суміші. block.blast-mixer.description = Подрібнює і змішує скупчення спор із піротитом для отримання вибухової суміші.
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит. block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит.
block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання у баштах «Хвиля». block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля».
block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали. block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали.
block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти. block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти.
block.pulverizer.description = Подрібнює брухт у дрібний пісок. block.pulverizer.description = Подрібнює брухт у дрібний пісок.
block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля. block.coal-centrifuge.description = Нафта перетворюється в шматки вугілля.
block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує. block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує.
block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця. block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця.
block.power-source.description = Постійно створює енергію. Тільки пісочниця. block.power-source.description = Постійно створює енергію. Тільки пісочниця.
@@ -1142,30 +1191,30 @@ block.item-source.description = Постійно створює предмети
block.item-void.description = Знищує будь-які предмети. Тільки пісочниця. block.item-void.description = Знищує будь-які предмети. Тільки пісочниця.
block.liquid-source.description = Постійно створює рідини. Тільки пісочниця. block.liquid-source.description = Постійно створює рідини. Тільки пісочниця.
block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця. block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця.
block.copper-wall.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль. block.copper-wall.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.
block.copper-wall-large.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. block.copper-wall-large.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток.
block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників. block.titanium-wall.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.
block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників.\nЗаймає декілька плиток. block.titanium-wall-large.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.\nЗаймає декілька плиток.
block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів. block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.
block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток.
block.thorium-wall.description = Сильний захисний блок.\nГідний захист від противників. block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників.
block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від противників.\nЗаймає декілька плиток. block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток.
block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі. block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.
block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.\nЗаймає декілька плиток. block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток.
block.surge-wall.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином. block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.
block.surge-wall-large.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток.
block.door.description = Невеликі двері. Можна відкрити або закрити, натиснувши. block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них.
block.door-large.description = Великі двері. Можна відкрити та закрити, натиснувши.\nЗаймає декілька плиток. block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток.
block.mender.description = Періодично ремонтує блоки у його радіусі дії. Захищає башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності.
block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки у його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника. block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника.
block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати. block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати.
block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри. block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри.
block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності.
block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця. block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця.
block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі. block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі.
block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток. block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток.
block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа. block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа.
block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони.
@@ -1174,35 +1223,35 @@ block.distributor.description = Поліпшений маршрутизатор.
block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований. block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований.
block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано. block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано.
block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія. block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія.
block.mechanical-pump.description = Дешевий насос з повільним виходом, але не потребує енергоспоживання. block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання.
block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію.
block.thermal-pump.description = Найкращий насос. block.thermal-pump.description = Найкращий насос.
block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами.
block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує і більше зберігає рідини, ніж стандартні трубопроводи. block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи.
block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nПротікає менше.
block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней.
block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків.
block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця. block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця.
block.bridge-conduit.description = Удосконалений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі.
block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток. block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток.
block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них.
block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії. block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії.
block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії. block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії.
block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії. block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії.
block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту.
block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор.
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля.
block.thermal-generator.description = Генерує енергію при розміщенні в спекотних місцях. block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях.
block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари.
block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною і піротитом, що горить. block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить.
block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю. block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. block.solar-panel.description = Забезпечує невелику кількість енергії від сонця.
block.solar-panel-large.description = Значно ефективніша версія стандартної сонячної панелі. block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель.
block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості. block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості.
block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії при максимальній ефективності. Для запуску процесу потрібно значні обсяги енергії. block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії.
block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів. block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів.
block.pneumatic-drill.description = Поліпшений бур, здатний добувати титан. Видобуває швидше, ніж механічний бур. block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур.
block.laser-drill.description = Дозволяє виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію.
block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії. block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії.
block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води. block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води.
block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки. block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки.
@@ -1213,15 +1262,15 @@ block.core-nucleus.description = Третя й остання версія ка
block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок.
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик дозволяє вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте у нього ресурси та забезпечте енергією. block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією.
block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше.
block.duo.description = Мала і дешева башта. Корисна проти наземних одиниць. block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць.
block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла у противників. block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників.
block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані.
block.hail.description = Невелика артилерійська башта з далеким радіусом дії. block.hail.description = Невелика артилерійська башта з далеким радіусом дії.
block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води. block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води.
block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії. block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії.
block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики у противників. block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників.
block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно. block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно.
block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника. block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника.
block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників. block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 811 B

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 186 KiB

View File

@@ -60,6 +60,8 @@ public class Vars implements Loadable{
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json"; public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
/** URL to the JSON file containing all the BE servers. Only queried in BE. */ /** URL to the JSON file containing all the BE servers. Only queried in BE. */
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */
public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
/** URL of the github issue report template.*/ /** URL of the github issue report template.*/
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md";
/** list of built-in servers.*/ /** list of built-in servers.*/

View File

@@ -33,7 +33,7 @@ public class BlockIndexer{
/** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */ /** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */
private GridBits[] structQuadrants; private GridBits[] structQuadrants;
/** Stores all damaged tile entities by team. */ /** Stores all damaged tile entities by team. */
private BuildingArray[] damagedTiles = new BuildingArray[Team.all.length]; private ObjectSet<Building>[] damagedTiles = new ObjectSet[Team.all.length];
/** All ores available on this map. */ /** All ores available on this map. */
private ObjectSet<Item> allOres = new ObjectSet<>(); private ObjectSet<Item> allOres = new ObjectSet<>();
/** Stores teams that are present here as tiles. */ /** Stores teams that are present here as tiles. */
@@ -70,7 +70,7 @@ public class BlockIndexer{
Events.on(WorldLoadEvent.class, event -> { Events.on(WorldLoadEvent.class, event -> {
scanOres.clear(); scanOres.clear();
scanOres.addAll(Item.getAllOres()); scanOres.addAll(Item.getAllOres());
damagedTiles = new BuildingArray[Team.all.length]; damagedTiles = new ObjectSet[Team.all.length];
flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
unitCaps = new int[Team.all.length]; unitCaps = new int[Team.all.length];
activeTeams = new Seq<>(Team.class); activeTeams = new Seq<>(Team.class);
@@ -139,14 +139,14 @@ public class BlockIndexer{
} }
/** Returns all damaged tiles by team. */ /** Returns all damaged tiles by team. */
public BuildingArray getDamaged(Team team){ public ObjectSet<Building> getDamaged(Team team){
returnArray.clear(); breturnArray.clear();
if(damagedTiles[team.id] == null){ if(damagedTiles[team.id] == null){
damagedTiles[team.id] = new BuildingArray(); damagedTiles[team.id] = new ObjectSet<>();
} }
BuildingArray set = damagedTiles[team.id]; ObjectSet<Building> set = damagedTiles[team.id];
for(Building build : set){ for(Building build : set){
if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){ if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){
breturnArray.add(build); breturnArray.add(build);
@@ -214,7 +214,7 @@ public class BlockIndexer{
public void notifyTileDamaged(Building entity){ public void notifyTileDamaged(Building entity){
if(damagedTiles[entity.team.id] == null){ if(damagedTiles[entity.team.id] == null){
damagedTiles[entity.team.id] = new BuildingArray(); damagedTiles[entity.team.id] = new ObjectSet<Building>();
} }
damagedTiles[entity.team.id].add(entity); damagedTiles[entity.team.id].add(entity);
@@ -476,35 +476,4 @@ public class BlockIndexer{
return tiles.iterator(); return tiles.iterator();
} }
} }
//TODO copy-pasted code, generics would be nice here
public static class BuildingArray implements Iterable<Building>{
private Seq<Building> tiles = new Seq<>(false, 16);
private IntSet contained = new IntSet();
public void add(Building tile){
if(contained.add(tile.pos())){
tiles.add(tile);
}
}
public void remove(Building tile){
if(contained.remove(tile.pos())){
tiles.remove(tile);
}
}
public int size(){
return tiles.size;
}
public Building first(){
return tiles.first();
}
@Override
public Iterator<Building> iterator(){
return tiles.iterator();
}
}
} }

View File

@@ -87,7 +87,7 @@ public class BuilderAI extends AIController{
} }
//find new request //find new request
if(!unit.team().data().blocks.isEmpty() && following == null){ if(!unit.team().data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){
Queue<BlockPlan> blocks = unit.team().data().blocks; Queue<BlockPlan> blocks = unit.team().data().blocks;
BlockPlan block = blocks.first(); BlockPlan block = blocks.first();

View File

@@ -1,7 +1,6 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.math.*; import arc.math.*;
import arc.util.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -59,7 +58,7 @@ public class FlyingAI extends AIController{
vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f)); vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f));
} }
vec.setLength(unit.type().speed * Time.delta); vec.setLength(unit.type().speed);
unit.moveAt(vec); unit.moveAt(vec);
} }

View File

@@ -12,8 +12,8 @@ public class RepairAI extends AIController{
boolean shoot = false; boolean shoot = false;
if(target != null){ if(target != null){
if(!target.within(unit, unit.type().range)){ if(!target.within(unit, unit.type().range * 0.8f)){
moveTo(target, unit.type().range * 0.9f); moveTo(target, unit.type().range * 0.8f);
}else{ }else{
unit.aim(target); unit.aim(target);
shoot = true; shoot = true;

View File

@@ -327,7 +327,7 @@ public class Blocks implements ContentList{
duneWall = new StaticWall("dune-wall"){{ duneWall = new StaticWall("dune-wall"){{
variants = 2; variants = 2;
basalt.asFloor().wall = this; basalt.asFloor().wall = darksandWater.asFloor().wall = darksandTaintedWater.asFloor().wall = this;
}}; }};
sandWall = new StaticWall("sand-wall"){{ sandWall = new StaticWall("sand-wall"){{
@@ -1011,7 +1011,7 @@ public class Blocks implements ContentList{
mechanicalPump = new Pump("mechanical-pump"){{ mechanicalPump = new Pump("mechanical-pump"){{
requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10)); requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10));
pumpAmount = 0.1f; pumpAmount = 0.11f;
}}; }};
rotaryPump = new Pump("rotary-pump"){{ rotaryPump = new Pump("rotary-pump"){{
@@ -1136,7 +1136,7 @@ public class Blocks implements ContentList{
requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30)); requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30));
powerProduction = 5.5f; powerProduction = 5.5f;
itemDuration = 90f; itemDuration = 90f;
consumes.liquid(Liquids.water, 0.06f); consumes.liquid(Liquids.water, 0.07f);
hasLiquids = true; hasLiquids = true;
size = 2; size = 2;
}}; }};
@@ -1269,7 +1269,7 @@ public class Blocks implements ContentList{
hasItems = true; hasItems = true;
consumes.power(0.80f); consumes.power(0.80f);
consumes.liquid(Liquids.water, 0.18f); consumes.liquid(Liquids.water, 0.2f);
}}; }};
oilExtractor = new Fracker("oil-extractor"){{ oilExtractor = new Fracker("oil-extractor"){{
@@ -1645,7 +1645,7 @@ public class Blocks implements ContentList{
}}; }};
spectre = new ItemTurret("spectre"){{ spectre = new ItemTurret("spectre"){{
requirements(Category.turret, with(Items.copper, 350, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250));
ammo( ammo(
Items.graphite, Bullets.standardDenseBig, Items.graphite, Bullets.standardDenseBig,
Items.pyratite, Bullets.standardIncendiaryBig, Items.pyratite, Bullets.standardIncendiaryBig,
@@ -1671,7 +1671,7 @@ public class Blocks implements ContentList{
}}; }};
meltdown = new LaserTurret("meltdown"){{ meltdown = new LaserTurret("meltdown"){{
requirements(Category.turret, with(Items.copper, 250, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325)); requirements(Category.turret, with(Items.copper, 1200, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325));
shootEffect = Fx.shootBigSmoke2; shootEffect = Fx.shootBigSmoke2;
shootCone = 40f; shootCone = 40f;
recoilAmount = 4f; recoilAmount = 4f;

View File

@@ -41,7 +41,7 @@ public class UnitTypes implements ContentList{
//air + building + mining //air + building + mining
public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType alpha, beta, gamma; public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType alpha, beta, gamma;
//water //water + commander
public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde; public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde;
//special block unit type //special block unit type

View File

@@ -5,7 +5,6 @@ import arc.graphics.*;
import arc.graphics.Texture.*; import arc.graphics.Texture.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -170,8 +169,8 @@ public class Weathers implements ContentList{
sandstorm = new Weather("sandstorm"){ sandstorm = new Weather("sandstorm"){
TextureRegion region; TextureRegion region;
float yspeed = 0.3f, xspeed = 6f, size = 140f, padding = size, invDensity = 1500f; float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f;
Vec2 force = new Vec2(0.45f, 0.01f); float force = 0.45f;
Color color = Color.valueOf("f7cba4"); Color color = Color.valueOf("f7cba4");
Texture noise; Texture noise;
@@ -194,22 +193,26 @@ public class Weathers implements ContentList{
@Override @Override
public void update(WeatherState state){ public void update(WeatherState state){
float speed = force * state.intensity;
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
for(Unit unit : Groups.unit){ for(Unit unit : Groups.unit){
unit.impulse(force.x * state.intensity(), force.y * state.intensity()); unit.impulse(windx, windy);
} }
} }
@Override @Override
public void drawOver(WeatherState state){ public void drawOver(WeatherState state){
Draw.tint(color); Draw.tint(color);
float speed = baseSpeed * state.intensity;
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
float scale = 1f / 2000f; float scale = 1f / 2000f;
float scroll = Time.time() * scale; float scroll = Time.time() * scale;
Tmp.tr1.texture = noise; Tmp.tr1.texture = noise;
Core.camera.bounds(Tmp.r1); Core.camera.bounds(Tmp.r1);
Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale);
Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); Tmp.tr1.scroll(-windx * scroll, windy * scroll);
Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height);
rand.setSeed(0); rand.setSeed(0);
@@ -224,8 +227,8 @@ public class Weathers implements ContentList{
float scl = rand.random(0.5f, 1f); float scl = rand.random(0.5f, 1f);
float scl2 = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f);
float sscl = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f);
float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2);
float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl);
float alpha = rand.random(0.2f); float alpha = rand.random(0.2f);
x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f));
@@ -247,14 +250,13 @@ public class Weathers implements ContentList{
sporestorm = new Weather("sporestorm"){ sporestorm = new Weather("sporestorm"){
TextureRegion region; TextureRegion region;
float yspeed = 1f, xspeed = 4f, size = 5f, padding = size, invDensity = 2000f; float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f;
Color color = Color.valueOf("7457ce"); Color color = Color.valueOf("7457ce");
Vec2 force = new Vec2(0.25f, 0.01f);
Texture noise; Texture noise;
{ {
attrs.set(Attribute.spores, 0.5f); attrs.set(Attribute.spores, 1f);
attrs.set(Attribute.light, -0.1f); attrs.set(Attribute.light, -0.15f);
status = StatusEffects.sporeSlowed; status = StatusEffects.sporeSlowed;
statusGround = false; statusGround = false;
} }
@@ -269,9 +271,11 @@ public class Weathers implements ContentList{
@Override @Override
public void update(WeatherState state){ public void update(WeatherState state){
float speed = force * state.intensity;
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
for(Unit unit : Groups.unit){ for(Unit unit : Groups.unit){
unit.impulse(force.x * state.intensity(), force.y * state.intensity()); unit.impulse(windx, windy);
} }
} }
@@ -285,12 +289,15 @@ public class Weathers implements ContentList{
Draw.alpha(state.opacity * 0.8f); Draw.alpha(state.opacity * 0.8f);
Draw.tint(color); Draw.tint(color);
float speed = baseSpeed * state.intensity;
float windx = state.windVector.x * speed, windy = state.windVector.y * speed;
float scale = 1f / 2000f; float scale = 1f / 2000f;
float scroll = Time.time() * scale; float scroll = Time.time() * scale;
Tmp.tr1.texture = noise; Tmp.tr1.texture = noise;
Core.camera.bounds(Tmp.r1); Core.camera.bounds(Tmp.r1);
Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale);
Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); Tmp.tr1.scroll(-windx * scroll, windy * scroll);
Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height);
rand.setSeed(0); rand.setSeed(0);
@@ -306,8 +313,8 @@ public class Weathers implements ContentList{
float scl = rand.random(0.5f, 1f); float scl = rand.random(0.5f, 1f);
float scl2 = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f);
float sscl = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f);
float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2);
float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl);
float alpha = rand.random(0.1f, 0.8f); float alpha = rand.random(0.1f, 0.8f);
x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f));

View File

@@ -329,6 +329,7 @@ public class Control implements ApplicationListener, Loadable{
} }
public void playTutorial(){ public void playTutorial(){
ui.showInfo("There is no tutorial yet.");
//TODO implement //TODO implement
//ui.showInfo("death"); //ui.showInfo("death");
/* /*

View File

@@ -245,7 +245,8 @@ public class Logic implements ApplicationListener{
if(entry.cooldown < 0 && !entry.weather.isActive()){ if(entry.cooldown < 0 && !entry.weather.isActive()){
float duration = Mathf.random(entry.minDuration, entry.maxDuration); float duration = Mathf.random(entry.minDuration, entry.maxDuration);
entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency); entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency);
Call.createWeather(entry.weather, entry.intensity, duration); Tmp.v1.setToRandomDirection();
Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y);
} }
} }
} }

View File

@@ -338,6 +338,8 @@ public class NetClient implements ApplicationListener{
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
public static void setRules(Rules rules){ public static void setRules(Rules rules){
state.rules = rules; state.rules = rules;
//campaign is not valid in multiplayer
state.rules.sector = null;
} }
@Remote(variants = Variant.both) @Remote(variants = Variant.both)
@@ -547,6 +549,10 @@ public class NetClient implements ApplicationListener{
quiet = true; quiet = true;
} }
public void clearRemovedEntity(int id){
removed.remove(id);
}
public void addRemovedEntity(int id){ public void addRemovedEntity(int id){
removed.add(id); removed.add(id);
} }

View File

@@ -593,38 +593,38 @@ public class NetServer implements ApplicationListener{
if(player.isBuilder()){ if(player.isBuilder()){
player.builder().clearBuilding(); player.builder().clearBuilding();
player.builder().updateBuilding(building); player.builder().updateBuilding(building);
if(requests != null){
for(BuildPlan req : requests){
if(req == null) continue;
Tile tile = world.tile(req.x, req.y);
if(tile == null || (!req.breaking && req.block == null)) continue;
//auto-skip done requests
if(req.breaking && tile.block() == Blocks.air){
continue;
}else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){
continue;
}else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so
continue;
}else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server
action.block = req.block;
action.rotation = req.rotation;
action.config = req.config;
})){
//force the player to remove this request if that's not the case
Call.removeQueueBlock(player.con, req.x, req.y, req.breaking);
con.rejectedRequests.add(req);
continue;
}
player.builder().plans().addLast(req);
}
}
} }
if(player.isMiner()){ if(player.isMiner()){
player.miner().mineTile(mining); player.miner().mineTile(mining);
} }
if(requests != null){
for(BuildPlan req : requests){
if(req == null) continue;
Tile tile = world.tile(req.x, req.y);
if(tile == null || (!req.breaking && req.block == null)) continue;
//auto-skip done requests
if(req.breaking && tile.block() == Blocks.air){
continue;
}else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){
continue;
}else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so
continue;
}else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server
action.block = req.block;
action.rotation = req.rotation;
action.config = req.config;
})){
//force the player to remove this request if that's not the case
Call.removeQueueBlock(player.con, req.x, req.y, req.breaking);
con.rejectedRequests.add(req);
continue;
}
player.builder().plans().addLast(req);
}
}
con.rejectedRequests.clear(); con.rejectedRequests.clear();
if(!player.dead()){ if(!player.dead()){

View File

@@ -5,11 +5,13 @@ import arc.func.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.struct.ObjectIntMap.*;
import arc.util.ArcAnnotate.*; import arc.util.ArcAnnotate.*;
import arc.util.*; import arc.util.*;
import arc.util.noise.*; import arc.util.noise.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.core.GameState.*; import mindustry.core.GameState.*;
import mindustry.ctype.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
@@ -19,7 +21,6 @@ import mindustry.maps.*;
import mindustry.maps.filters.*; import mindustry.maps.filters.*;
import mindustry.maps.filters.GenerateFilter.*; import mindustry.maps.filters.GenerateFilter.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.Sector.*;
import mindustry.type.Weather.*; import mindustry.type.Weather.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
@@ -33,11 +34,17 @@ public class World{
public @NonNull Tiles tiles = new Tiles(0, 0); public @NonNull Tiles tiles = new Tiles(0, 0);
private boolean generating, invalidMap; private boolean generating, invalidMap;
private ObjectMap<Map, Runnable> customMapLoaders = new ObjectMap<>();
public World(){ public World(){
} }
/** Adds a custom handler function for loading a custom map - usually a generated one. */
public void addMapLoader(Map map, Runnable loader){
customMapLoaders.put(map, loader);
}
public boolean isInvalidMap(){ public boolean isInvalidMap(){
return invalidMap; return invalidMap;
} }
@@ -255,9 +262,71 @@ public class World{
state.rules.weather.clear(); state.rules.weather.clear();
if(sector.is(SectorAttribute.rainy)) state.rules.weather.add(new WeatherEntry(Weathers.rain)); //apply weather based on terrain
if(sector.is(SectorAttribute.snowy)) state.rules.weather.add(new WeatherEntry(Weathers.snow)); ObjectIntMap<Block> floorc = new ObjectIntMap<>();
if(sector.is(SectorAttribute.desert)) state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); ObjectSet<UnlockableContent> content = new ObjectSet<>();
float waterFloors = 0, totalFloors = 0;
for(Tile tile : world.tiles){
if(world.getDarkness(tile.x, tile.y) >= 3){
continue;
}
Liquid liquid = tile.floor().liquidDrop;
if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop);
if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop);
if(liquid != null) content.add(liquid);
if(!tile.block().isStatic()){
totalFloors ++;
if(liquid == Liquids.water){
waterFloors += tile.floor().isDeep() ? 1f : 0.7f;
}
floorc.increment(tile.floor());
if(tile.overlay() != Blocks.air){
floorc.increment(tile.overlay());
}
}
}
//sort counts in descending order
Seq<Entry<Block>> entries = floorc.entries().toArray();
entries.sort(e -> -e.value);
//remove all blocks occuring < 30 times - unimportant
entries.removeAll(e -> e.value < 30);
Block[] floors = new Block[entries.size];
int[] floorCounts = new int[entries.size];
for(int i = 0; i < entries.size; i++){
floorCounts[i] = entries.get(i).value;
floors[i] = entries.get(i).key;
}
//TODO bad code
boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow");
boolean hasRain = !hasSnow && floors[0].name.contains("water");
boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand");
boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted");
if(hasSnow){
state.rules.weather.add(new WeatherEntry(Weathers.snow));
}
if(hasRain){
state.rules.weather.add(new WeatherEntry(Weathers.rain));
}
if(hasDesert){
state.rules.weather.add(new WeatherEntry(Weathers.sandstorm));
}
if(hasSpores){
state.rules.weather.add(new WeatherEntry(Weathers.sporestorm));
}
state.secinfo.resources = content.asArray();
state.secinfo.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id)));
} }
@@ -270,6 +339,12 @@ public class World{
} }
public void loadMap(Map map, Rules checkRules){ public void loadMap(Map map, Rules checkRules){
//load using custom loader if possible
if(customMapLoaders.containsKey(map)){
customMapLoaders.get(map).run();
return;
}
try{ try{
SaveIO.load(map.file, new FilterContext(map)); SaveIO.load(map.file, new FilterContext(map));
}catch(Throwable e){ }catch(Throwable e){

View File

@@ -20,7 +20,7 @@ public class EditorTile extends Tile{
@Override @Override
public void setFloor(@NonNull Floor type){ public void setFloor(@NonNull Floor type){
if(state.isGame()){ if(skip()){
super.setFloor(type); super.setFloor(type);
return; return;
} }
@@ -41,20 +41,25 @@ public class EditorTile extends Tile{
@Override @Override
public void setBlock(Block type, Team team, int rotation){ public void setBlock(Block type, Team team, int rotation){
if(state.isGame()){ if(skip()){
super.setBlock(type, team, rotation); super.setBlock(type, team, rotation);
return; return;
} }
op(OpType.block, block.id); //if(this.block == type && (build == null || build.rotation == rotation)){
// ui.editor.editor.renderer().updatePoint(x, y);
// return;
//}
if(rotation != 0) op(OpType.rotation, (byte)rotation); if(rotation != 0) op(OpType.rotation, (byte)rotation);
if(team() != Team.derelict) op(OpType.team, (byte)team().id); if(team() != Team.derelict) op(OpType.team, (byte)team().id);
op(OpType.block, block.id);
super.setBlock(type, team, rotation); super.setBlock(type, team, rotation);
} }
@Override @Override
public void setTeam(Team team){ public void setTeam(Team team){
if(state.isGame()){ if(skip()){
super.setTeam(team); super.setTeam(team);
return; return;
} }
@@ -66,7 +71,7 @@ public class EditorTile extends Tile{
@Override @Override
public void setOverlay(Block overlay){ public void setOverlay(Block overlay){
if(state.isGame()){ if(skip()){
super.setOverlay(overlay); super.setOverlay(overlay);
return; return;
} }
@@ -79,7 +84,7 @@ public class EditorTile extends Tile{
@Override @Override
protected void fireChanged(){ protected void fireChanged(){
if(state.isGame()){ if(skip()){
super.fireChanged(); super.fireChanged();
}else{ }else{
ui.editor.editor.renderer().updatePoint(x, y); ui.editor.editor.renderer().updatePoint(x, y);
@@ -88,14 +93,14 @@ public class EditorTile extends Tile{
@Override @Override
public void recache(){ public void recache(){
if(state.isGame()){ if(skip()){
super.recache(); super.recache();
} }
} }
@Override @Override
protected void changeEntity(Team team, Prov<Building> entityprov, int rotation){ protected void changeEntity(Team team, Prov<Building> entityprov, int rotation){
if(state.isGame()){ if(skip()){
super.changeEntity(team, entityprov, rotation); super.changeEntity(team, entityprov, rotation);
return; return;
} }
@@ -116,6 +121,10 @@ public class EditorTile extends Tile{
} }
} }
private boolean skip(){
return state.isGame() || ui.editor.editor.isLoading();
}
private void op(OpType type, short value){ private void op(OpType type, short value){
ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value)); ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value));
} }

View File

@@ -31,6 +31,10 @@ public class MapEditor{
public Block drawBlock = Blocks.stone; public Block drawBlock = Blocks.stone;
public Team drawTeam = Team.sharded; public Team drawTeam = Team.sharded;
public boolean isLoading(){
return loading;
}
public StringMap getTags(){ public StringMap getTags(){
return tags; return tags;
} }
@@ -52,7 +56,7 @@ public class MapEditor{
if(map.file.parent().parent().name().equals("1127400") && steam){ if(map.file.parent().parent().name().equals("1127400") && steam){
tags.put("steamid", map.file.parent().name()); tags.put("steamid", map.file.parent().name());
} }
MapIO.loadMap(map, context); load(() -> MapIO.loadMap(map, context));
renderer.resize(width(), height()); renderer.resize(width(), height());
loading = false; loading = false;
} }

View File

@@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{
} }
}).grow().left().pad(6).top(); }).grow().left().pad(6).top();
}).width(280f).pad(3).top().left().fillY(); }).width(280f).pad(3).top().left().fillY();
if(++i % cols == 0){ if(++i % cols == 0){
filterTable.row(); filterTable.row();
} }

View File

@@ -116,7 +116,7 @@ public class MapRenderer implements Disposable{
wx * tilesize + wall.offset + (tilesize - width) / 2f, wx * tilesize + wall.offset + (tilesize - width) / 2f,
wy * tilesize + wall.offset + (tilesize - height) / 2f, wy * tilesize + wall.offset + (tilesize - height) / 2f,
width, height, width, height,
tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg() - 90); tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg());
}else{ }else{
region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)]; region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)];

View File

@@ -255,7 +255,13 @@ public class MapView extends Element implements GestureListener{
Draw.color(Color.gray); Draw.color(Color.gray);
image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
image.draw(); image.draw();
Draw.color();
Lines.stroke(3f);
Draw.color(Pal.accent);
Lines.line(centerx - sclwidth/2f, centery, centerx + sclwidth/2f, centery);
Lines.line(centerx, centery - sclheight/2f, centerx, centery + sclheight/2f);
Draw.reset();
} }
int index = 0; int index = 0;

View File

@@ -10,7 +10,7 @@ import static mindustry.Vars.*;
public class EntityCollisions{ public class EntityCollisions{
//range for tile collision scanning //range for tile collision scanning
private static final int r = 2; private static final int r = 1;
//move in 1-unit chunks //move in 1-unit chunks
private static final float seg = 1f; private static final float seg = 1f;

View File

@@ -39,10 +39,15 @@ public class SapBulletType extends BulletType{
Draw.reset(); Draw.reset();
Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f); Drawf.light(b.team, b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f);
} }
} }
@Override
public void drawLight(Bullet b){
}
@Override @Override
public float range(){ public float range(){
return length; return length;

View File

@@ -61,7 +61,8 @@ abstract class HitboxComp implements Posc, QuadTreeObject{
} }
public void hitboxTile(Rect rect){ public void hitboxTile(Rect rect){
float size = hitSize * 0.66f; //tile hitboxes are never bigger than a tile, otherwise units get stuck
float size = Math.min(hitSize * 0.66f, 7.9f);
rect.setCentered(x, y, size, size); rect.setCentered(x, y, size, size);
} }
} }

View File

@@ -71,6 +71,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
boolean tryDropPayload(Payload payload){ boolean tryDropPayload(Payload payload){
Tile on = tileOn(); Tile on = tileOn();
//clear removed state of unit so it can be synced
if(Vars.net.client() && payload instanceof UnitPayload){
Vars.netClient.clearRemovedEntity(((UnitPayload)payload).unit.id);
}
//drop off payload on an acceptor if possible //drop off payload on an acceptor if possible
if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){ if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){
Fx.unitDrop.at(on.build); Fx.unitDrop.at(on.build);

View File

@@ -17,6 +17,7 @@ public class AIController implements UnitController{
protected static final Vec2 vec = new Vec2(); protected static final Vec2 vec = new Vec2();
protected static final int timerTarget = 0; protected static final int timerTarget = 0;
protected static final int timerTarget2 = 1; protected static final int timerTarget2 = 1;
protected static final int timerTarget3 = 2;
protected Unit unit; protected Unit unit;
protected Interval timer = new Interval(4); protected Interval timer = new Interval(4);
@@ -151,7 +152,7 @@ public class AIController implements UnitController{
vec.rotate((circleLength - vec.len()) / circleLength * 180f); vec.rotate((circleLength - vec.len()) / circleLength * 180f);
} }
vec.setLength(speed * Time.delta); vec.setLength(speed);
unit.moveAt(vec); unit.moveAt(vec);
} }
@@ -163,7 +164,7 @@ public class AIController implements UnitController{
float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / 100f, -1f, 1f); float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / 100f, -1f, 1f);
vec.setLength(unit.type().speed * Time.delta * length); vec.setLength(unit.type().speed * length);
if(length < -0.5f){ if(length < -0.5f){
vec.rotate(180f); vec.rotate(180f);
}else if(length < 0){ }else if(length < 0){

View File

@@ -2,9 +2,10 @@ package mindustry.game;
import arc.math.*; import arc.math.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*;
import arc.util.ArcAnnotate.*; import arc.util.ArcAnnotate.*;
import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.blocks.storage.CoreBlock.*;
@@ -32,6 +33,8 @@ public class SectorInfo{
public boolean hasCore = true; public boolean hasCore = true;
/** Sector that was launched from. */ /** Sector that was launched from. */
public @Nullable Sector origin; public @Nullable Sector origin;
/** Resources known to occur at this sector. */
public Seq<UnlockableContent> resources = new Seq<>();
/** Time spent at this sector. Do not use unless you know what you're doing. */ /** Time spent at this sector. Do not use unless you know what you're doing. */
public transient float internalTimeSpent; public transient float internalTimeSpent;

View File

@@ -39,7 +39,7 @@ public class Stats{
//weigh used fractions //weigh used fractions
float frac = 0f; float frac = 0f;
Seq<Item> obtainable = Seq.select(zone.data.resources, i -> i instanceof Item).as(); Seq<Item> obtainable = zone.save == null ? new Seq<>() : zone.save.meta.secinfo.resources.select(i -> i instanceof Item).as();
for(Item item : obtainable){ for(Item item : obtainable){
frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size;
} }

View File

@@ -41,7 +41,7 @@ public enum CacheLayer{
} }
}, },
normal(5), normal(5),
walls; walls(3);
public static final CacheLayer[] all = values(); public static final CacheLayer[] all = values();
/** Capacity multiplier. */ /** Capacity multiplier. */

View File

@@ -228,7 +228,7 @@ public class FloorRenderer implements Disposable{
int chunksx = Mathf.ceil((float)(world.width()) / chunksize), int chunksx = Mathf.ceil((float)(world.width()) / chunksize),
chunksy = Mathf.ceil((float)(world.height()) / chunksize); chunksy = Mathf.ceil((float)(world.height()) / chunksize);
cache = new Chunk[chunksx][chunksy]; cache = new Chunk[chunksx][chunksy];
cbatch = new MultiCacheBatch(chunksize * chunksize * 6); cbatch = new MultiCacheBatch(chunksize * chunksize * 7);
Time.mark(); Time.mark();

View File

@@ -96,24 +96,24 @@ public class IndexedRenderer implements Disposable{
vertices[idx++] = v2; vertices[idx++] = v2;
//tri2 //tri2
vertices[idx++] = x;
vertices[idx++] = y;
vertices[idx++] = color;
vertices[idx++] = u;
vertices[idx++] = v;
vertices[idx++] = fx2;
vertices[idx++] = y;
vertices[idx++] = color;
vertices[idx++] = u2;
vertices[idx++] = v;
vertices[idx++] = fx2; vertices[idx++] = fx2;
vertices[idx++] = fy2; vertices[idx++] = fy2;
vertices[idx++] = color; vertices[idx++] = color;
vertices[idx++] = u2; vertices[idx++] = u2;
vertices[idx++] = v2; vertices[idx++] = v2;
vertices[idx++] = fx2;
vertices[idx++] = y;
vertices[idx++] = color;
vertices[idx++] = u2;
vertices[idx++] = v;
vertices[idx++] = x;
vertices[idx++] = y;
vertices[idx++] = color;
vertices[idx++] = u;
vertices[idx++] = v;
mesh.updateVertices(index * vsize * 6, vertices); mesh.updateVertices(index * vsize * 6, vertices);
} }
@@ -155,6 +155,19 @@ public class IndexedRenderer implements Disposable{
vertices[idx++] = u; vertices[idx++] = u;
vertices[idx++] = v; vertices[idx++] = v;
vertices[idx++] = x2;
vertices[idx++] = y2;
vertices[idx++] = color;
vertices[idx++] = u;
vertices[idx++] = v2;
vertices[idx++] = x3;
vertices[idx++] = y3;
vertices[idx++] = color;
vertices[idx++] = u2;
vertices[idx++] = v2;
//tri2
vertices[idx++] = x3; vertices[idx++] = x3;
vertices[idx++] = y3; vertices[idx++] = y3;
vertices[idx++] = color; vertices[idx++] = color;
@@ -164,28 +177,15 @@ public class IndexedRenderer implements Disposable{
vertices[idx++] = x4; vertices[idx++] = x4;
vertices[idx++] = y4; vertices[idx++] = y4;
vertices[idx++] = color; vertices[idx++] = color;
vertices[idx++] = u; vertices[idx++] = u2;
vertices[idx++] = v2; vertices[idx++] = v;
//tri2
vertices[idx++] = x1; vertices[idx++] = x1;
vertices[idx++] = y1; vertices[idx++] = y1;
vertices[idx++] = color; vertices[idx++] = color;
vertices[idx++] = u; vertices[idx++] = u;
vertices[idx++] = v; vertices[idx++] = v;
vertices[idx++] = x2;
vertices[idx++] = y2;
vertices[idx++] = color;
vertices[idx++] = u2;
vertices[idx++] = v;
vertices[idx++] = x3;
vertices[idx++] = y3;
vertices[idx++] = color;
vertices[idx++] = u2;
vertices[idx++] = v2;
mesh.updateVertices(index * vsize * 6, vertices); mesh.updateVertices(index * vsize * 6, vertices);
} }

View File

@@ -236,7 +236,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
@Remote(targets = Loc.both, forward = true, called = Loc.server) @Remote(targets = Loc.both, forward = true, called = Loc.server)
public static void transferInventory(Player player, Building tile){ public static void transferInventory(Player player, Building tile){
if(player == null || tile == null || !player.within(tile, buildingRange)) return; if(player == null || tile == null || !player.within(tile, buildingRange) || tile.items == null) return;
if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, tile) || if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, tile) ||
!netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> { !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> {

View File

@@ -100,6 +100,20 @@ public class JsonIO{
} }
}); });
json.setSerializer(Liquid.class, new Serializer<Liquid>(){
@Override
public void write(Json json, Liquid object, Class knownType){
json.writeValue(object.name);
}
@Override
public Liquid read(Json json, JsonValue jsonData, Class type){
if(jsonData.asString() == null) return Liquids.water;
Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString());
return i == null ? Liquids.water : i;
}
});
json.setSerializer(Item.class, new Serializer<Item>(){ json.setSerializer(Item.class, new Serializer<Item>(){
@Override @Override
public void write(Json json, Item object, Class knownType){ public void write(Json json, Item object, Class knownType){
@@ -165,6 +179,21 @@ public class JsonIO{
return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount"));
} }
}); });
json.setSerializer(UnlockableContent.class, new Serializer<UnlockableContent>(){
@Override
public void write(Json json, UnlockableContent object, Class knownType){
json.writeValue(object.name);
}
@Override
public UnlockableContent read(Json json, JsonValue jsonData, Class type){
String str = jsonData.asString();
Item item = Vars.content.getByName(ContentType.item, str);
Liquid liquid = Vars.content.getByName(ContentType.liquid, str);
return item != null ? item : liquid;
}
});
} }
static class CustomJson extends Json{ static class CustomJson extends Json{

View File

@@ -77,6 +77,7 @@ public class SaveIO{
try{ try{
return getMeta(getStream(file)); return getMeta(getStream(file));
}catch(Exception e){ }catch(Exception e){
e.printStackTrace();
return getMeta(getBackupStream(file)); return getMeta(getBackupStream(file));
} }
} }

View File

@@ -15,8 +15,8 @@ public enum LogicOp{
greaterThan(">", (a, b) -> a > b ? 1 : 0), greaterThan(">", (a, b) -> a > b ? 1 : 0),
greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0),
pow("^", Math::pow), pow("^", Math::pow),
shl(">>", (a, b) -> (long)a >> (long)b), shl("<<", (a, b) -> (long)a << (long)b),
shr("<<", (a, b) -> (long)a << (long)b), shr(">>", (a, b) -> (long)a >> (long)b),
or("or", (a, b) -> (long)a | (long)b), or("or", (a, b) -> (long)a | (long)b),
and("and", (a, b) -> (long)a & (long)b), and("and", (a, b) -> (long)a & (long)b),
xor("xor", (a, b) -> (long)a ^ (long)b), xor("xor", (a, b) -> (long)a ^ (long)b),

View File

@@ -130,7 +130,7 @@ public class Map implements Comparable<Map>, Publishable{
} }
public String tag(String name){ public String tag(String name){
return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown"); return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown", "unknown");
} }
public boolean hasTag(String name){ public boolean hasTag(String name){

View File

@@ -59,6 +59,7 @@ public class Maps{
/** @return the next map to shuffle to. May be null, in which case the server should be stopped. */ /** @return the next map to shuffle to. May be null, in which case the server should be stopped. */
public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){ public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){
if(shuffler != null) return shuffler.next(mode, previous);
return shuffleMode.next(mode, previous); return shuffleMode.next(mode, previous);
} }

View File

@@ -17,13 +17,13 @@ import mindustry.world.blocks.environment.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public abstract class FilterOption{ public abstract class FilterOption{
public static final Boolf<Block> floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); public static final Boolf<Block> floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full));
public static final Boolf<Block> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); public static final Boolf<Block> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)) && b.inEditor;
public static final Boolf<Block> floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); public static final Boolf<Block> floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)));
public static final Boolf<Block> wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); public static final Boolf<Block> wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)));
public static final Boolf<Block> wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); public static final Boolf<Block> wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))) && b.inEditor;
public static final Boolf<Block> oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); public static final Boolf<Block> oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full));
public static final Boolf<Block> anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air; public static final Boolf<Block> anyOptional = b -> (floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air) && b.inEditor;
public abstract void build(Table table); public abstract void build(Table table);

View File

@@ -3,7 +3,6 @@ package mindustry.maps.generators;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.io.*; import mindustry.io.*;
import mindustry.maps.*; import mindustry.maps.*;
@@ -29,12 +28,13 @@ public class FileMapGenerator implements WorldGenerator{
world.setGenerating(true); world.setGenerating(true);
tiles = world.tiles; tiles = world.tiles;
Item[] items = {Items.blastCompound, Items.pyratite, Items.copper, Items.thorium, Items.copper, Items.lead};
for(Tile tile : tiles){ for(Tile tile : tiles){
if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && state.hasSector()){ if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && state.hasSector()){
for(Content content : state.getSector().data.resources){ for(Item content : items){
if(content instanceof Item && Mathf.chance(0.3)){ if(Mathf.chance(0.2)){
tile.build.items.add((Item)content, Math.min(Mathf.random(500), tile.block().itemCapacity)); tile.build.items.add(content, Math.min(Mathf.random(500), tile.block().itemCapacity));
} }
} }
} }

View File

@@ -5,7 +5,6 @@ import arc.util.noise.*;
import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.*;
import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.graphics.g3d.PlanetGrid.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.Sector.*;
import mindustry.world.*; import mindustry.world.*;
public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{ public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{
@@ -24,7 +23,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
if(noise < 0.15){ if(noise < 0.15){
for(Ptile other : tile.tiles){ for(Ptile other : tile.tiles){
if(sector.planet.getSector(other).is(SectorAttribute.base)){ if(sector.planet.getSector(other).generateEnemyBase){
any = false; any = false;
break; break;
} }
@@ -32,7 +31,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
} }
if(any){ if(any){
sector.data.attributes |= (1 << SectorAttribute.base.ordinal()); sector.generateEnemyBase = true;
} }
} }

View File

@@ -600,9 +600,14 @@ public class Mods implements Loadable{
zip = zip.list()[0]; zip = zip.list()[0];
} }
Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); Fi metaf =
zip.child("mod.json").exists() ? zip.child("mod.json") :
zip.child("mod.hjson").exists() ? zip.child("mod.hjson") :
zip.child("plugin.json").exists() ? zip.child("plugin.json") :
zip.child("plugin.hjson");
if(!metaf.exists()){ if(!metaf.exists()){
Log.warn("Mod @ doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile); Log.warn("Mod @ doesn't have a '[mod/plugin].[h]json' file, skipping.", sourceFile);
throw new IllegalArgumentException("Invalid file: No mod.json found."); throw new IllegalArgumentException("Invalid file: No mod.json found.");
} }
@@ -646,7 +651,9 @@ public class Mods implements Loadable{
meta.hidden = true; meta.hidden = true;
} }
Log.info("Loaded mod '@' in @", meta.name, Time.elapsed()); if(!headless){
Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed());
}
return new LoadedMod(sourceFile, zip, mainMod, meta); return new LoadedMod(sourceFile, zip, mainMod, meta);
}catch(Exception e){ }catch(Exception e){

View File

@@ -42,6 +42,8 @@ public class NetworkIO{
try(DataInputStream stream = new DataInputStream(is)){ try(DataInputStream stream = new DataInputStream(is)){
Time.clear(); Time.clear();
state.rules = JsonIO.read(Rules.class, stream.readUTF()); state.rules = JsonIO.read(Rules.class, stream.readUTF());
//campaign is not valid in multiplayer
state.rules.sector = null;
state.map = new Map(SaveIO.getSaveWriter().readStringMap(stream)); state.map = new Map(SaveIO.getSaveWriter().readStringMap(stream));
state.wave = stream.readInt(); state.wave = stream.readInt();

View File

@@ -1,7 +1,6 @@
package mindustry.type; package mindustry.type;
import arc.*; import arc.*;
import arc.files.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
@@ -10,15 +9,12 @@ import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.ArcAnnotate.*; import arc.util.ArcAnnotate.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*;
import arc.util.noise.*; import arc.util.noise.*;
import mindustry.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.*;
import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.graphics.g3d.PlanetGrid.*;
import mindustry.maps.generators.*; import mindustry.maps.generators.*;
import mindustry.type.Sector.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -83,25 +79,10 @@ public class Planet extends UnlockableContent{
sectors = new Seq<>(grid.tiles.length); sectors = new Seq<>(grid.tiles.length);
for(int i = 0; i < grid.tiles.length; i++){ for(int i = 0; i < grid.tiles.length; i++){
sectors.add(new Sector(this, grid.tiles[i], new SectorData())); sectors.add(new Sector(this, grid.tiles[i]));
} }
sectorApproxRadius = sectors.first().tile.v.dst(sectors.first().tile.corners[0].v); sectorApproxRadius = sectors.first().tile.v.dst(sectors.first().tile.corners[0].v);
//read data for sectors
Fi data = Vars.tree.get("planets/" + name + ".dat");
if(data.exists()){
try{
try(Reads read = data.reads()){
short dsize = read.s();
for(int i = 0; i < dsize; i++){
sectors.get(i).data.read(read);
}
}
}catch(Throwable t){
t.printStackTrace();
}
}
}else{ }else{
sectors = new Seq<>(); sectors = new Seq<>();
} }
@@ -196,7 +177,7 @@ public class Planet extends UnlockableContent{
for(Sector sector : sectors){ for(Sector sector : sectors){
float sum = 1f; float sum = 1f;
for(Sector other : sector.inRange(2)){ for(Sector other : sector.inRange(2)){
if(other.is(SectorAttribute.base)){ if(other.generateEnemyBase){
sum += 1f; sum += 1f;
} }
} }

View File

@@ -7,12 +7,9 @@ import arc.struct.ObjectIntMap.*;
import arc.struct.*; import arc.struct.*;
import arc.util.ArcAnnotate.*; import arc.util.ArcAnnotate.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*;
import mindustry.*; import mindustry.*;
import mindustry.ctype.*;
import mindustry.game.Saves.*; import mindustry.game.Saves.*;
import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.graphics.g3d.PlanetGrid.*;
import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -27,24 +24,22 @@ public class Sector{
public final Ptile tile; public final Ptile tile;
public final int id; public final int id;
public final SectorData data;
public @Nullable SaveSlot save; public @Nullable SaveSlot save;
public @Nullable SectorPreset preset; public @Nullable SectorPreset preset;
/** Number 0-1 indicating the difficulty based on nearby bases. */ /** Number 0-1 indicating the difficulty based on nearby bases. */
public float baseCoverage; public float baseCoverage;
public boolean generateEnemyBase;
//TODO implement a dynamic launch period //TODO implement a dynamic launch period
public int launchPeriod = 10; public int launchPeriod = 10;
public Sector(Planet planet, Ptile tile, SectorData data){ public Sector(Planet planet, Ptile tile){
this.planet = planet; this.planet = planet;
this.tile = tile; this.tile = tile;
this.plane = new Plane(); this.plane = new Plane();
this.rect = makeRect(); this.rect = makeRect();
this.id = tile.id; this.id = tile.id;
this.data = data;
} }
public Seq<Sector> inRange(int range){ public Seq<Sector> inRange(int range){
@@ -100,7 +95,7 @@ public class Sector{
/** @return whether the enemy has a generated base here. */ /** @return whether the enemy has a generated base here. */
public boolean hasEnemyBase(){ public boolean hasEnemyBase(){
return is(SectorAttribute.base) && (save == null || save.meta.rules.waves); return generateEnemyBase && (save == null || save.meta.rules.waves);
} }
public boolean isBeingPlayed(){ public boolean isBeingPlayed(){
@@ -311,10 +306,6 @@ public class Sector{
return new SectorRect(radius, center, planeTop, planeRight, angle); return new SectorRect(radius, center, planeTop, planeRight, angle);
} }
public boolean is(SectorAttribute attribute){
return (data.attributes & (1 << attribute.ordinal())) != 0;
}
public static class SectorRect{ public static class SectorRect{
public final Vec3 center, top, right; public final Vec3 center, top, right;
public final Vec3 result = new Vec3(); public final Vec3 result = new Vec3();
@@ -335,64 +326,4 @@ public class Sector{
return result.set(center).add(right, nx).add(top, ny); return result.set(center).add(right, nx).add(top, ny);
} }
} }
/** Cached data about a sector. */
public static class SectorData{
public UnlockableContent[] resources = {};
public int spawnX, spawnY;
public Block[] floors = {};
public int[] floorCounts = {};
public int attributes;
public void write(Writes write){
write.s(resources.length);
for(Content resource : resources){
write.b(resource.getContentType().ordinal());
write.s(resource.id);
}
write.s(spawnX);
write.s(spawnY);
write.s(floors.length);
for(int i = 0; i < floors.length; i++){
write.s(floors[i].id);
write.i(floorCounts[i]);
}
write.i(attributes);
}
public void read(Reads read){
resources = new UnlockableContent[read.s()];
for(int i = 0; i < resources.length; i++){
resources[i] = Vars.content.getByID(ContentType.all[read.b()], read.s());
}
spawnX = read.s();
spawnY = read.s();
floors = new Block[read.s()];
floorCounts = new int[floors.length];
for(int i = 0; i < floors.length; i++){
floors[i] = Vars.content.block(read.s());
floorCounts[i] = read.i();
}
attributes = read.i();
}
}
public enum SectorAttribute{
/** Requires naval technology to land on, e.g. mostly water */
naval,
/** Has rain. */
rainy,
/** Has snow. */
snowy,
/** Has sandstorms. */
desert,
/** Has an enemy base. */
base,
/** Has spore weather. */
spores,
/** Path from core to spawns requires traversing water. */
navalPath
}
} }

View File

@@ -4,6 +4,7 @@ import arc.func.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
@@ -14,7 +15,7 @@ import mindustry.world.blocks.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public abstract class Weather extends MappableContent{ public abstract class Weather extends UnlockableContent{
/** Default duration of this weather event in ticks. */ /** Default duration of this weather event in ticks. */
public float duration = 9f * Time.toMinutes; public float duration = 9f * Time.toMinutes;
public Attributes attrs = new Attributes(); public Attributes attrs = new Attributes();
@@ -89,14 +90,24 @@ public abstract class Weather extends MappableContent{
} }
@Override
public void displayInfo(Table table){
//do not
}
@Override
public boolean isHidden(){
return true;
}
@Override @Override
public ContentType getContentType(){ public ContentType getContentType(){
return ContentType.weather; return ContentType.weather;
} }
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void createWeather(Weather weather, float intensity, float duration){ public static void createWeather(Weather weather, float intensity, float duration, float windX, float windY){
weather.create(intensity, duration); weather.create(intensity, duration).windVector.set(windX, windY);
} }
public static class WeatherEntry{ public static class WeatherEntry{
@@ -104,7 +115,7 @@ public abstract class Weather extends MappableContent{
public Weather weather; public Weather weather;
/** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */ /** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */
public float minFrequency, maxFrequency, minDuration, maxDuration; public float minFrequency, maxFrequency, minDuration, maxDuration;
/** Cooldown time before the next weather event takes place. */ /** Cooldown time before the next weather event takes place This is *state*, not configuration. */
public float cooldown; public float cooldown;
/** Intensity of the weather produced. */ /** Intensity of the weather produced. */
public float intensity = 1f; public float intensity = 1f;
@@ -132,12 +143,12 @@ public abstract class Weather extends MappableContent{
@EntityDef(value = {WeatherStatec.class}, pooled = true, isFinal = false) @EntityDef(value = {WeatherStatec.class}, pooled = true, isFinal = false)
@Component(base = true) @Component(base = true)
abstract static class WeatherStateComp implements Drawc{ abstract static class WeatherStateComp implements Drawc, Syncc{
private static final float fadeTime = 60 * 4; private static final float fadeTime = 60 * 4;
Weather weather; Weather weather;
float intensity = 1f, opacity = 0f, life, effectTimer; float intensity = 1f, opacity = 0f, life, effectTimer;
Vec2 windVector = new Vec2(); Vec2 windVector = new Vec2().setToRandomDirection();
void init(Weather weather){ void init(Weather weather){
this.weather = weather; this.weather = weather;
@@ -146,7 +157,7 @@ public abstract class Weather extends MappableContent{
@Override @Override
public void update(){ public void update(){
if(life < fadeTime){ if(life < fadeTime){
opacity = life / fadeTime; opacity = Math.min(life / fadeTime, opacity);
}else{ }else{
opacity = Mathf.lerpDelta(opacity, 1f, 0.004f); opacity = Mathf.lerpDelta(opacity, 1f, 0.004f);
} }

View File

@@ -115,7 +115,9 @@ public class Fonts{
/** Called from a static context for use in the loading screen.*/ /** Called from a static context for use in the loading screen.*/
public static void loadDefaultFont(){ public static void loadDefaultFont(){
UI.packer = new PixmapPacker(2048, 2048, Format.rgba8888, 2, true); int max = Gl.getInt(Gl.maxTextureSize);
UI.packer = new PixmapPacker(max >= 4096 ? 4096 : 2048, 2048, Format.rgba8888, 2, true);
FileHandleResolver resolver = new InternalFileHandleResolver(); FileHandleResolver resolver = new InternalFileHandleResolver();
Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
Core.assets.setLoader(Font.class, null, new FreetypeFontLoader(resolver){ Core.assets.setLoader(Font.class, null, new FreetypeFontLoader(resolver){

View File

@@ -3,19 +3,24 @@ package mindustry.ui.dialogs;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.ImageButton.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.Weather.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
import static arc.util.Time.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class CustomRulesDialog extends BaseDialog{ public class CustomRulesDialog extends BaseDialog{
@@ -176,8 +181,9 @@ public class CustomRulesDialog extends BaseDialog{
}}).grow(); }}).grow();
}).margin(4).size(50f).padRight(10); }).margin(4).size(50f).padRight(10);
b.add("@rules.ambientlight"); b.add("@rules.ambientlight");
}, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f); }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row();
main.row();
main.button("@rules.weather", this::weatherDialog).width(250f).left().row();
//TODO add weather patterns //TODO add weather patterns
} }
@@ -214,4 +220,120 @@ public class CustomRulesDialog extends BaseDialog{
main.image().color(Pal.accent).height(3f).padRight(100f).padBottom(20); main.image().color(Pal.accent).height(3f).padRight(100f).padBottom(20);
main.row(); main.row();
} }
Cell<TextField> field(Table table, float value, Floatc setter){
return table.field(Strings.autoFixed(value, 2), v -> setter.get(Strings.parseFloat(v)))
.valid(Strings::canParsePositiveFloat)
.size(90f, 40f).pad(2f).addInputDialog();
}
void weatherDialog(){
BaseDialog dialog = new BaseDialog("@rules.weather");
Runnable[] rebuild = {null};
dialog.cont.pane(base -> {
rebuild[0] = () -> {
base.clearChildren();
int cols = Math.max(1, Core.graphics.getWidth() / 460);
int idx = 0;
for(WeatherEntry entry : rules.weather){
base.top();
//main container
base.table(Tex.pane, c -> {
c.margin(0);
//icons to perform actions
c.table(Tex.whiteui, t -> {
t.setColor(Pal.gray);
t.top().left();
t.add(entry.weather.localizedName).left().padLeft(6);
t.add().growX();
ImageButtonStyle style = Styles.geni;
t.defaults().size(42f);
t.button(Icon.cancel, style, () -> {
rules.weather.remove(entry);
rebuild[0].run();
});
}).growX();
c.row();
//all the options
c.table(f -> {
f.marginLeft(4);
f.left().top();
f.defaults().padRight(4).left();
f.add("@rules.weather.duration");
field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes);
f.add("@waves.to");
field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes);
f.add("@unit.minutes");
f.row();
f.add("@rules.weather.frequency");
field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes);
f.add("@waves.to");
field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes);
f.add("@unit.minutes");
//intensity can't currently be customized
}).grow().left().pad(6).top();
}).width(410f).pad(3).top().left().fillY();
if(++idx % cols == 0){
base.row();
}
}
};
rebuild[0].run();
}).grow();
dialog.addCloseButton();
dialog.buttons.button("@add", Icon.add, () -> {
BaseDialog addd = new BaseDialog("@add");
addd.cont.pane(t -> {
t.background(Tex.button);
int i = 0;
for(Weather weather : content.<Weather>getBy(ContentType.weather)){
t.button(weather.localizedName, Styles.cleart, () -> {
rules.weather.add(new WeatherEntry(weather));
rebuild[0].run();
addd.hide();
}).size(140f, 50f);
if(++i % 2 == 0) t.row();
}
});
addd.addCloseButton();
addd.show();
}).width(170f);
//reset cooldown to random number
dialog.hidden(() -> {
float sum = 0;
Seq<WeatherEntry> sh = rules.weather.copy();
sh.shuffle();
for(WeatherEntry w : sh){
//add the previous cooldowns to the sum so weather events are staggered and don't happen all at once.
w.cooldown = sum + Mathf.random(w.minFrequency, w.maxFrequency);
sum += w.cooldown;
}
});
dialog.show();
}
} }

View File

@@ -427,7 +427,7 @@ public class JoinDialog extends BaseDialog{
} }
//get servers //get servers
Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> { Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> {
try{ try{
Jval val = Jval.read(result.getResultAsString()); Jval val = Jval.read(result.getResultAsString());
Core.app.post(() -> { Core.app.post(() -> {

View File

@@ -321,16 +321,25 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
stable.row(); stable.row();
} }
stable.add("@sectors.resources").row(); if(sector.save != null){
stable.table(t -> { stable.add("@sectors.resources").row();
t.left(); stable.table(t -> {
int idx = 0;
int max = 5; if(sector.save != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.resources.any()){
for(UnlockableContent c : sector.data.resources){ t.left();
t.image(c.icon(Cicon.small)).padRight(3); int idx = 0;
if(++idx % max == 0) t.row(); int max = 5;
} for(UnlockableContent c : sector.save.meta.secinfo.resources){
}).fillX().row(); t.image(c.icon(Cicon.small)).padRight(3);
if(++idx % max == 0) t.row();
}
}else{
t.add("@unknown").color(Color.lightGray);
}
}).fillX().row();
}
//production //production
if(sector.hasBase() && sector.save.meta.hasProduction){ if(sector.hasBase() && sector.save.meta.hasProduction){

View File

@@ -57,7 +57,7 @@ public class ChatFragment extends Table{
} }
} }
return net.active(); return net.active() && ui.hudfrag.shown();
}); });
update(() -> { update(() -> {

View File

@@ -76,6 +76,19 @@ public class HudFragment extends Fragment{
t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX(); t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX();
}); });
//minimap + position
parent.fill(t -> {
t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown);
//minimap
t.add(new Minimap());
t.row();
//position
t.label(() -> player.tileX() + "," + player.tileY())
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial)
.touchable(Touchable.disabled);
t.top().right();
});
//TODO tear this all down //TODO tear this all down
//menu at top left //menu at top left
parent.fill(cont -> { parent.fill(cont -> {
@@ -212,18 +225,6 @@ public class HudFragment extends Fragment{
}).top().left(); }).top().left();
}); });
parent.fill(t -> {
t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown);
//minimap
t.add(new Minimap());
t.row();
//position
t.label(() -> player.tileX() + "," + player.tileY())
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial)
.touchable(Touchable.disabled);
t.top().right();
});
//core items //core items
parent.fill(t -> { parent.fill(t -> {
t.top().add(coreItems); t.top().add(coreItems);

View File

@@ -70,10 +70,10 @@ public class ForceProjector extends Block{
Draw.color(Pal.gray); Draw.color(Pal.gray);
Lines.stroke(3f); Lines.stroke(3f);
Lines.poly(x * tilesize, y * tilesize, 6, radius); Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius);
Draw.color(player.team().color); Draw.color(player.team().color);
Lines.stroke(1f); Lines.stroke(1f);
Lines.poly(x * tilesize, y * tilesize, 6, radius); Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius);
Draw.color(); Draw.color();
} }

View File

@@ -28,8 +28,8 @@ public class ExtendingItemBridge extends ItemBridge{
int i = tile.absoluteRelativeTo(other.x, other.y); int i = tile.absoluteRelativeTo(other.x, other.y);
float ex = other.worldx() - x - Geometry.d4[i].x * tilesize / 2f, float ex = other.worldx() - x - Geometry.d4(i).x * tilesize / 2f,
ey = other.worldy() - y - Geometry.d4[i].y * tilesize / 2f; ey = other.worldy() - y - Geometry.d4(i).y * tilesize / 2f;
float uptime = state.isEditor() ? 1f : this.uptime; float uptime = state.isEditor() ? 1f : this.uptime;
@@ -42,15 +42,15 @@ public class ExtendingItemBridge extends ItemBridge{
Lines.stroke(8f); Lines.stroke(8f);
Lines.line(bridgeRegion, Lines.line(bridgeRegion,
x + Geometry.d4[i].x * tilesize / 2f, x + Geometry.d4(i).x * tilesize / 2f,
y + Geometry.d4[i].y * tilesize / 2f, y + Geometry.d4(i).y * tilesize / 2f,
x + ex, x + ex,
y + ey, false); y + ey, false);
Draw.rect(endRegion, x, y, i * 90 + 90); Draw.rect(endRegion, x, y, i * 90 + 90);
Draw.rect(endRegion, Draw.rect(endRegion,
x + ex + Geometry.d4[i].x * tilesize / 2f, x + ex + Geometry.d4(i).x * tilesize / 2f,
y + ey + Geometry.d4[i].y * tilesize / 2f, i * 90 + 270); y + ey + Geometry.d4(i).y * tilesize / 2f, i * 90 + 270);
int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y));
@@ -61,8 +61,8 @@ public class ExtendingItemBridge extends ItemBridge{
for(int a = 0; a < arrows; a++){ for(int a = 0; a < arrows; a++){
Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity);
Draw.rect(arrowRegion, Draw.rect(arrowRegion,
x + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * uptime, x + Geometry.d4(i).x * (tilesize / 2f + a * 6f + 2) * uptime,
y + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * uptime, y + Geometry.d4(i).y * (tilesize / 2f + a * 6f + 2) * uptime,
i * 90f); i * 90f);
} }
Draw.reset(); Draw.reset();

View File

@@ -62,7 +62,7 @@ public class ItemBridge extends Block{
Lines.stroke(8f); Lines.stroke(8f);
Tmp.v1.set(otherReq.drawx(), otherReq.drawx()).sub(req.drawx(), req.drawy()).setLength(-tilesize/2f); Tmp.v1.set(otherReq.drawx(), otherReq.drawy()).sub(req.drawx(), req.drawy()).setLength(tilesize/2f);
Lines.line( Lines.line(
bridgeRegion, bridgeRegion,
@@ -99,7 +99,7 @@ public class ItemBridge extends Block{
float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize); float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize);
Lines.rect((x + link.x) / 2f * tilesize - w / 2f, (y + link.y) / 2f * tilesize - h / 2f, w, h); Lines.rect((x + link.x) / 2f * tilesize - w / 2f, (y + link.y) / 2f * tilesize - h / 2f, w, h);
Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4[rot].x * tilesize, link.y * tilesize + Geometry.d4[rot].y * tilesize, link.absoluteRelativeTo(x, y) * 90); Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4(rot).x * tilesize, link.y * tilesize + Geometry.d4(rot).y * tilesize, link.absoluteRelativeTo(x, y) * 90);
} }
Draw.reset(); Draw.reset();
} }
@@ -303,7 +303,7 @@ public class ItemBridge extends Block{
Lines.stroke(8f); Lines.stroke(8f);
Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(-tilesize/2f); Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(tilesize/2f).scl(-1f);
Lines.line(bridgeRegion, Lines.line(bridgeRegion,
x + Tmp.v1.x, x + Tmp.v1.x,
@@ -321,8 +321,8 @@ public class ItemBridge extends Block{
for(int a = 0; a < arrows; a++){ for(int a = 0; a < arrows; a++){
Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity);
Draw.rect(arrowRegion, Draw.rect(arrowRegion,
x + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), x + Geometry.d4(i).x * (tilesize / 2f + a * 4f + time % 4f),
y + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); y + Geometry.d4(i).y * (tilesize / 2f + a * 4f + time % 4f), i * 90f);
} }
Draw.reset(); Draw.reset();
} }

View File

@@ -117,7 +117,7 @@ public class StackConveyor extends Block implements Autotiler{
Tile from = world.tile(link); Tile from = world.tile(link);
if(link == -1 || from == null) return; if(link == -1 || from == null || lastItem == null) return;
int fromRot = from.build == null ? rotation : from.build.rotation; int fromRot = from.build == null ? rotation : from.build.rotation;
@@ -138,7 +138,7 @@ public class StackConveyor extends Block implements Autotiler{
//item //item
float size = itemSize * Mathf.lerp(Math.min((float)items.total() / itemCapacity, 1), 1f, 0.4f); float size = itemSize * Mathf.lerp(Math.min((float)items.total() / itemCapacity, 1), 1f, 0.4f);
Drawf.shadow(Tmp.v1.x, Tmp.v1.y, size * 1.2f); Drawf.shadow(Tmp.v1.x, Tmp.v1.y, size * 1.2f);
Draw.rect(items.first().icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0); Draw.rect(lastItem.icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0);
} }
@Override @Override

View File

@@ -6,6 +6,7 @@ import mindustry.graphics.*;
import mindustry.world.*; import mindustry.world.*;
public class Cliff extends Block{ public class Cliff extends Block{
public float size = 11f;
public Cliff(String name){ public Cliff(String name){
super(name); super(name);
@@ -18,11 +19,12 @@ public class Cliff extends Block{
@Override @Override
public void drawBase(Tile tile){ public void drawBase(Tile tile){
int r = tile.data; int r = tile.data;
for(int i = 0; i < 8; i++){ for(int i = 0; i < 8; i++){
if((r & (1 << i)) != 0){ if((r & (1 << i)) != 0){
Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.3f + (i >= 4 ? -0.4f : 0.3f))); Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.3f + (i >= 4 ? -0.4f : 0.3f)));
Draw.rect(region, tile.worldx(), tile.worldy(), 11f, 11f, i * 45f); Draw.rect(region, tile.worldx(), tile.worldy(), size, size, i * 45f);
} }
} }

View File

@@ -140,7 +140,7 @@ public class Reconstructor extends UnitBlock{
if(moveInPayload()){ if(moveInPayload()){
if(consValid()){ if(consValid()){
valid = true; valid = true;
progress += edelta(); progress += edelta() * state.rules.unitBuildSpeedMultiplier;
} }
//upgrade the unit //upgrade the unit

View File

@@ -16,6 +16,7 @@ public enum StatUnit{
powerUnits, powerUnits,
degrees, degrees,
seconds, seconds,
minutes,
perSecond, perSecond,
perMinute, perMinute,
timesSpeed(false), timesSpeed(false),

View File

@@ -11,7 +11,7 @@ project.ext.assetsDir = new File("../core/assets")
def enableTemplates = true def enableTemplates = true
def JDK_DIR = "$System.env.JDK_DIR" def JDK_DIR = "$System.env.JDK_DIR"
def ICON_DIR = new File("core/assets/icons/icon.icns") def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns")
def spriteHashFile = new File(project.rootDir, "build/spritehash") def spriteHashFile = new File(project.rootDir, "build/spritehash")
def hashDirectory = { def hashDirectory = {
@@ -127,13 +127,13 @@ PackrConfig.Platform.values().each{ platform ->
verbose = true verbose = true
bundleIdentifier = getPackage() + ".mac" bundleIdentifier = getPackage() + ".mac"
iconResource = ICON_DIR iconResource = ICON_DIR
outDir = file("build/packr/output") outDir = file("$rootDir/desktop/build/packr/output")
mainClass = project.ext.mainClassName mainClass = project.ext.mainClassName
classpath = ["desktop/build/packr/desktop.jar"] classpath = ["$rootDir/desktop/build/packr/desktop.jar".toString()]
removePlatformLibs = ["desktop/build/packr/desktop.jar"] removePlatformLibs = ["$rootDir/desktop/build/packr/desktop.jar".toString()]
vmArgs = [] vmArgs = []
minimizeJre = "desktop/packr_minimize.json" minimizeJre = "$rootDir/desktop/packr_minimize.json".toString()
jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip" jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip"
if(platform == PackrConfig.Platform.MacOS){ if(platform == PackrConfig.Platform.MacOS){

View File

@@ -0,0 +1,10 @@
This is the first alpha release of 6.0, a massive campaign and content update.
While this build has been tested in multiplayer, it still may have numerous issues. As usual, report problems on Github.
There are too many changes to list here, but the important bits include:
- A new unit production system, with incremental upgrades
- Direct unit and turret control
- Renamed and re-sprited units
- New blocks and units
- Naval and insect-like units

View File

@@ -14,11 +14,11 @@
"NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부" "NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부"
"NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요." "NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요."
"NEW_ACHIEVEMENT_20_6_NAME" "정복자" "NEW_ACHIEVEMENT_20_6_NAME" "정복자"
"NEW_ACHIEVEMENT_20_6_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_6_DESC" "적 코어 파괴인 지역에서 10번 승리하세요."
"NEW_ACHIEVEMENT_20_7_NAME" "챔피언" "NEW_ACHIEVEMENT_20_7_NAME" "챔피언"
"NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요."
"NEW_ACHIEVEMENT_20_8_NAME" "진격!" "NEW_ACHIEVEMENT_20_8_NAME" "진격!"
"NEW_ACHIEVEMENT_20_8_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 5단계 이일 때 적의 코어를 파괴하세요." "NEW_ACHIEVEMENT_20_8_DESC" "적 코어 파괴인 지역에서 5단계 이일 때 적의 코어를 파괴하세요."
"NEW_ACHIEVEMENT_20_9_NAME" "하늘에서 코어의 비가 쏟아진다!" "NEW_ACHIEVEMENT_20_9_NAME" "하늘에서 코어의 비가 쏟아진다!"
"NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요." "NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요."
"NEW_ACHIEVEMENT_20_10_NAME" "끈질긴" "NEW_ACHIEVEMENT_20_10_NAME" "끈질긴"
@@ -36,9 +36,9 @@
"NEW_ACHIEVEMENT_20_17_NAME" "한 중대한 실수" "NEW_ACHIEVEMENT_20_17_NAME" "한 중대한 실수"
"NEW_ACHIEVEMENT_20_17_DESC" "분배기를 연구하세요." "NEW_ACHIEVEMENT_20_17_DESC" "분배기를 연구하세요."
"NEW_ACHIEVEMENT_20_18_NAME" "창조" "NEW_ACHIEVEMENT_20_18_NAME" "창조"
"NEW_ACHIEVEMENT_20_18_DESC" "블 10,000를 설치하세요." "NEW_ACHIEVEMENT_20_18_DESC" "블 10,000를 설치하세요."
"NEW_ACHIEVEMENT_20_19_NAME" "잿더미" "NEW_ACHIEVEMENT_20_19_NAME" "잿더미"
"NEW_ACHIEVEMENT_20_19_DESC" "적 블을 1,000개 파괴하세요." "NEW_ACHIEVEMENT_20_19_DESC" "적 블을 1,000개 파괴하세요."
"NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!" "NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!"
"NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요." "NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요."
"NEW_ACHIEVEMENT_20_21_NAME" "맵퍼" "NEW_ACHIEVEMENT_20_21_NAME" "맵퍼"
@@ -88,11 +88,11 @@
"NEW_ACHIEVEMENT_21_14_NAME" "출격!" "NEW_ACHIEVEMENT_21_14_NAME" "출격!"
"NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요." "NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요."
"NEW_ACHIEVEMENT_21_15_NAME" "성급한" "NEW_ACHIEVEMENT_21_15_NAME" "성급한"
"NEW_ACHIEVEMENT_21_15_DESC" "2단계 이상 스킵하고, 당신의 코어를 적에게 파괴당하세요." "NEW_ACHIEVEMENT_21_15_DESC" "2 이상의 출격 기회를 스킵하고, 당신의 코어를 적에게 파괴당하세요."
"NEW_ACHIEVEMENT_21_16_NAME" "2단" "NEW_ACHIEVEMENT_21_16_NAME" "2단"
"NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요." "NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요."
"NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자" "NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자"
"NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블도 설치하지 않고 생존하세요." "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블도 설치하지 않고 생존하세요."
"NEW_ACHIEVEMENT_21_18_NAME" "인화성" "NEW_ACHIEVEMENT_21_18_NAME" "인화성"
"NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요." "NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요."
"NEW_ACHIEVEMENT_21_19_NAME" "효율성" "NEW_ACHIEVEMENT_21_19_NAME" "효율성"

View File

@@ -68,7 +68,7 @@
"NEW_ACHIEVEMENT_21_4_NAME" "Стая" "NEW_ACHIEVEMENT_21_4_NAME" "Стая"
"NEW_ACHIEVEMENT_21_4_DESC" "Имейте одновременно 10 активных дронов «Фантом»." "NEW_ACHIEVEMENT_21_4_DESC" "Имейте одновременно 10 активных дронов «Фантом»."
"NEW_ACHIEVEMENT_21_5_NAME" "Взрывная армия" "NEW_ACHIEVEMENT_21_5_NAME" "Взрывная армия"
"NEW_ACHIEVEMENT_21_5_DESC" "Имейте одновременно 50 активных гусеничных ботов «Камикадзе»." "NEW_ACHIEVEMENT_21_5_DESC" "Имейте одновременно 50 активных ботов «Ползун»."
"NEW_ACHIEVEMENT_21_6_NAME" "Легионы" "NEW_ACHIEVEMENT_21_6_NAME" "Легионы"
"NEW_ACHIEVEMENT_21_6_DESC" "Постройте в целом 1000 единиц." "NEW_ACHIEVEMENT_21_6_DESC" "Постройте в целом 1000 единиц."
"NEW_ACHIEVEMENT_21_7_NAME" "Super" "NEW_ACHIEVEMENT_21_7_NAME" "Super"

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=557aa4c1d08c9260992a6ce108ac609272ee0eee archash=51747eb9d90decdb53b6f4fd5d7043b9f9a219a7

View File

@@ -5,15 +5,6 @@
{ {
"address": "nydustry.nydus.app:6060" "address": "nydustry.nydus.app:6060"
}, },
{
"address": "mindustry.pl:6000"
},
{
"address": "routerchain.ddns.net"
},
{
"address": "mindustry.pl:6666"
},
{ {
"address": "md.surrealment.com" "address": "md.surrealment.com"
} }

14
servers_v6.json Normal file
View File

@@ -0,0 +1,14 @@
[
{
"address": "mindustry.pl:6000"
},
{
"address": "mindustry.pl:6666"
},
{
"address": "routerchain.ddns.net"
},
{
"address": "pandorum.su:8000"
}
]

View File

@@ -409,16 +409,6 @@ task genSprites(dependsOn: classes, type: JavaExec){
workingDir = genFolder workingDir = genFolder
} }
task genSectorData(dependsOn: classes, type: JavaExec){
main = "mindustry.tools.SectorDataGenerator"
classpath = sourceSets.main.runtimeClasspath
standardInput = System.in
workingDir = "../core/assets/"
}
task updateCache(dependsOn: [genSectorData]){
}
task updateBundles(dependsOn: classes, type: JavaExec){ task updateBundles(dependsOn: classes, type: JavaExec){
file(genFolder).mkdirs() file(genFolder).mkdirs()

View File

@@ -232,18 +232,22 @@ public class Generators{
boolean hasEmpty = false; boolean hasEmpty = false;
Color average = new Color(); Color average = new Color();
float asum = 0f;
for(int x = 0; x < image.width; x++){ for(int x = 0; x < image.width; x++){
for(int y = 0; y < image.height; y++){ for(int y = 0; y < image.height; y++){
Color color = image.getColor(x, y); Color color = image.getColor(x, y);
average.r += color.r; average.r += color.r*color.a;
average.g += color.g; average.g += color.g*color.a;
average.b += color.b; average.b += color.b*color.a;
asum += color.a;
if(color.a < 0.9f){ if(color.a < 0.9f){
hasEmpty = true; hasEmpty = true;
} }
} }
} }
average.mul(1f / (image.width * image.height));
average.mul(1f / asum);
if(block instanceof Floor){ if(block instanceof Floor){
average.mul(0.8f); average.mul(0.8f);
}else{ }else{

View File

@@ -1,228 +0,0 @@
package mindustry.tools;
import arc.*;
import arc.backend.headless.mock.*;
import arc.files.*;
import arc.math.geom.*;
import arc.mock.*;
import arc.struct.*;
import arc.struct.ObjectIntMap.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.*;
import mindustry.content.*;
import mindustry.core.*;
import mindustry.ctype.*;
import mindustry.game.*;
import mindustry.net.Net;
import mindustry.type.*;
import mindustry.type.Sector.*;
import mindustry.world.*;
import mindustry.world.blocks.storage.*;
import mindustry.world.blocks.storage.CoreBlock.*;
import static mindustry.Vars.*;
public class SectorDataGenerator{
public static void main(String[] args){
ArcNativesLoader.load();
Core.files = new MockFiles();
Core.app = new MockApplication();
Core.settings = new MockSettings();
Core.graphics = new MockGraphics();
headless = true;
net = new Net(null);
tree = new FileTree();
Vars.init();
content.createBaseContent();
logic = new Logic();
netServer = new NetServer();
world = new World();
content.init();
for(Planet planet : content.<Planet>getBy(ContentType.planet)){
int[] count = {0};
if(planet.grid == null) continue;
Fi fi = Fi.get("planets").child(planet.name + ".dat");
Seq<SectorData> list = planet.sectors.map(sector -> {
SectorData data = new SectorData();
ObjectIntMap<Block> floors = new ObjectIntMap<>();
ObjectSet<Content> content = new ObjectSet<>();
logic.reset();
world.loadSector(sector);
float waterFloors = 0, totalFloors = 0;
state.rules.sector = sector;
for(Tile tile : world.tiles){
if(world.getDarkness(tile.x, tile.y) >= 3){
continue;
}
Liquid liquid = tile.floor().liquidDrop;
if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop);
if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop);
if(liquid != null) content.add(liquid);
if(!tile.block().isStatic()){
totalFloors ++;
if(liquid == Liquids.water){
waterFloors += tile.floor().isDeep() ? 1f : 0.7f;
}
floors.increment(tile.floor());
if(tile.overlay() != Blocks.air){
floors.increment(tile.overlay());
}
}
}
CoreBuild entity = Team.sharded.core();
int cx = entity.tileX(), cy = entity.tileY();
boolean path = pathfind(true);
boolean groundPath = pathfind(false);
if(!path){
Log.err("Sector &ly@&lr has no core path!", sector.id);
}
if(!groundPath){
Log.debug("&lbSector &ly@&lb is naval-only", sector.id);
data.attributes |= (1 << SectorAttribute.navalPath.ordinal());
}
int nearTiles = 0;
int waterCheckRad = 5;
//check for water presence
for(int rx = -waterCheckRad; rx <= waterCheckRad; rx++){
for(int ry = -waterCheckRad; ry <= waterCheckRad; ry++){
Tile tile = world.tile(cx + rx, cy + ry);
if(tile == null || tile.floor().liquidDrop != null){
nearTiles ++;
}
}
}
if(waterFloors / totalFloors >= 0.6f){
Log.debug("Sector @ has @/@ water -> naval", sector.id, waterFloors, totalFloors);
}
//naval sector guaranteed
if(nearTiles > 4){
Log.debug("Sector @ has @ water tiles at @ @ -> naval", sector.id, nearTiles, cx, cy);
waterFloors = totalFloors;
}
//sort counts in descending order
Seq<Entry<Block>> entries = floors.entries().toArray();
entries.sort(e -> -e.value);
//remove all blocks occuring < 30 times - unimportant
entries.removeAll(e -> e.value < 30);
data.floors = new Block[entries.size];
data.floorCounts = new int[entries.size];
for(int i = 0; i < entries.size; i++){
data.floorCounts[i] = entries.get(i).value;
data.floors[i] = entries.get(i).key;
}
//TODO bad code
boolean hasSnow = data.floors[0].name.contains("ice") || data.floors[0].name.contains("snow");
boolean hasRain = !hasSnow && data.floors[0].name.contains("water");
boolean hasDesert = !hasSnow && !hasRain && data.floors[0].name.contains("sand");
boolean hasSpores = data.floors[0].name.contains("spore") || data.floors[0].name.contains("moss") || data.floors[0].name.contains("tainted");
if(hasSnow){
data.attributes |= (1 << SectorAttribute.snowy.ordinal());
}
if(hasRain){
data.attributes |= (1 << SectorAttribute.rainy.ordinal());
}
if(hasDesert){
data.attributes |= (1 << SectorAttribute.desert.ordinal());
}
if(hasSpores){
data.attributes |= (1 << SectorAttribute.spores.ordinal());
}
data.resources = content.asArray().sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))).toArray(UnlockableContent.class);
//50% water -> naval attribute
if(waterFloors / totalFloors >= 0.6f){
data.attributes |= (1 << SectorAttribute.naval.ordinal());
}
if(count[0]++ % 10 == 0){
Log.info("&ly[ &lg@% &ly] Done with sector &lm@/@ ", (int)((float)count[0] / planet.sectors.size * 100), count[0], planet.sectors.size);
}
return data;
});
//write data
try(Writes write = fi.writes()){
write.s(list.size);
list.each(s -> s.write(write));
}
}
}
private static boolean pathfind(boolean allowWater){
CoreBuild entity = Team.sharded.core();
IntSet enemies = new IntSet();
world.tiles.eachTile(t -> {
if((t.team() == Team.crux && t.block() instanceof CoreBlock) || t.overlay() == Blocks.spawn){
enemies.add(t.pos());
}
});
GridBits used = new GridBits(world.width(), world.height());
IntQueue queue = new IntQueue();
queue.addFirst(entity.pos());
boolean any = false;
outer:
while(!queue.isEmpty()){
int pos = queue.removeFirst();
int x = Point2.x(pos), y = Point2.y(pos);
used.set(x, y);
for(Point2 p : Geometry.d4){
int nx = p.x + x, ny = p.y + y;
if(world.tiles.in(nx, ny) && !used.get(nx, ny)){
Tile tile = world.tile(nx, ny);
//skip full solids
if((tile.block().isStatic() && tile.solid()) || (!allowWater && tile.floor().isLiquid)) continue;
int newpos = Point2.pack(nx, ny);
used.set(nx, ny);
queue.addLast(newpos);
if(enemies.contains(newpos)){
any = true;
break outer;
}
}
}
}
return any;
}
}