diff --git a/.travis.yml b/.travis.yml index f31a2d36f3..ca66d67e1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ script: - cp -a Mindustry/core/build/docs/javadoc/. 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 +- cd ../Mindustry deploy: - provider: releases skip_cleanup: true diff --git a/android/build.gradle b/android/build.gradle index ef1791a9b6..2f040cc07c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -34,7 +34,8 @@ dependencies{ natives "com.github.Anuken.Arc:natives-freetype-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){ diff --git a/build.gradle b/build.gradle index 2a44616829..7a9ebbbe7c 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ allprojects{ ext{ versionNumber = '6' - if(!project.hasProperty("versionModifier")) versionModifier = 'pre-alpha' + if(!project.hasProperty("versionModifier")) versionModifier = 'alpha' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' @@ -261,7 +261,6 @@ project(":core"){ doLast{ def props = loadVersionProps() def androidVersion = props['androidBuildCode'].toInteger() - 2 - def buildVersion = props["build"] def loglines = file("../changelog").text.split("\n") def maxLength = 460 @@ -273,7 +272,6 @@ project(":core"){ } } def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") - new File(changelogs, buildVersion + ".txt").text = (result) new File(changelogs, androidVersion + ".txt").text = (result) } } diff --git a/core/assets-raw/sprites/ui/pack.json b/core/assets-raw/sprites/ui/pack.json index 01f4ffedac..fcd452dd9f 100644 --- a/core/assets-raw/sprites/ui/pack.json +++ b/core/assets-raw/sprites/ui/pack.json @@ -4,6 +4,5 @@ flattenPaths: true, maxWidth: 4096, maxHeight: 4096, - minHeight: 2048, fast: true } diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a8ebbbfc53..c9f0b660e3 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -20,7 +20,7 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]New highscore! 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.map = Maps @@ -509,6 +509,11 @@ error.io = Network I/O error. error.any = Unknown network error. 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.resources = Resources: sectors.production = Production: @@ -652,6 +657,7 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed @@ -842,7 +848,9 @@ rules.lighting = Lighting rules.fire = Fire rules.explosions = Block/Unit Explosion Damage 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.liquid.name = Liquids diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index d9501d6497..e8036557e0 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -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.f-droid.description = Katalog F-Droid 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. 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. @@ -63,8 +63,7 @@ stat.delivered = Materiálu vysláno: stat.playtime = Odehraný čas: [accent]{0}[] stat.rank = Celková známka: [accent]{0}[] -launcheditems = [accent]Získané předměty[] -launchinfo = [unlaunched]Je třeba vyslat zpět Tvé jádro, abys získal věci vyznačené modře.[] +globalitems = [accent]Celkové položky[] map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"? level.highscore = Nejvyšší skóre: [accent]{0}[] level.select = Výběr úrovně @@ -106,7 +105,7 @@ mods.guide = Průvodce modifikacemi mods.report = Nahlásit závadu mods.openfolder = Otevřít složku s modifikacemi 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.enabled = [lightgray]Povoleno[] 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.file = Importovat soubor 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.remove.confirm = Tato modifikace bude odstraněna. mod.author = [lightgray]Autor:[] {0} @@ -144,6 +143,7 @@ techtree = Technologie research.list = [lightgray]Výzkum:[] research = Výzkum researched = Dokončen výzkum technologie: [lightgray]{0}[]. +research.progress = {0}% dokončeno players = Hráčů: {0} players.single = Hráč: {0} players.search = hledat @@ -198,8 +198,8 @@ server.admins.none = Žádní správci nebyli nalezeni. server.add = Přidat server server.delete = Jsi si jistý, že chceš smazat tento server? server.edit = Upravit server -server.outdated = [crimson]Zastaralá verze serveru![] -server.outdated.client = [crimson]Zastaralá verze klienta![] +server.outdated = [scarlet]Zastaralá verze serveru![] +server.outdated.client = [scarlet]Zastaralá verze klienta![] server.version = [gray]Verze: {0} {1}[] server.custombuild = [accent]Upravená verze hry[] 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.addressinuse = Adresu již někdo používá! 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.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry? overwrite = Přepsat @@ -231,8 +231,8 @@ save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry? save.delete = Smazat save.export = Exportovat uložení hry 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.export.fail = [crimson]Nepodařilo se exportovat uložení hry: [accent]{0}[] +save.import.fail = [scarlet]Nepodařilo se importovat 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.newslot = Uložit hru: save.rename = Přejmenovat @@ -340,6 +340,12 @@ waves.load = Načíst ze schránky waves.invalid = Neplatné vlny ve schránce. 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í. + +#tyto jsou záměrně malými písmeny +wavemode.counts = počty +wavemode.totals = součty +wavemode.health = zdraví + editor.default = [lightgray][] details = Podrobnosti... edit = Upravit... @@ -379,7 +385,7 @@ editor.exportimage = Exportovat obrázek terénu editor.exportimage.description = Exportovat obrázek mapy do souboru editor.loadimage = Importovat 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.mapname = Jméno mapy: editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.[] @@ -459,11 +465,13 @@ locked = Zamčeno complete = [lightgray]Dokončeno: requirement.wave = Dosáhni vlny {0} na mapě {1} 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}[] bestwave = [lightgray]Nejvyšší vlna: {0} -launch = Vyslat do této mapy Tvé jádro -launch.text = Launch +#TODO fix/remove this +launch = < VYSLAT > +launch.text = Vyslat launch.title = Vyslání bylo úspěšné launch.next = [lightgray]další možnost bude až ve vlně {0}[] 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. uncover = Odkrýt mapu configure = Přizpůsobit vybavení -loadout = Loadout -resources = Resources +#TODO +loadout = Načtení +resources = Zdroje bannedblocks = Zakázané bloky addall = Přidat vše 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... 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.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ů. @@ -496,6 +505,7 @@ error.io = Vstupně/výstupní (I/O) chyba sítě. error.any = Ueznámá chyba sítě. 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.craters.name = Krátery sector.frozenForest.name = Zamrzlý les @@ -508,6 +518,10 @@ sector.tarFields.name = Dehtová pole sector.saltFlats.name = Solné nížiny 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.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. @@ -532,6 +546,8 @@ settings.graphics = Grafika settings.cleardata = Vymazat data hry... 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.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 >[] clear = Vyčistit banned = [scarlet]Zakázán[] @@ -539,7 +555,7 @@ unplaceable.sectorcaptured = [scarlet]Vyžaduje polapený sektor[] yes = Ano no = Ne info.title = Informace -error.title = [crimson]Objevila se chyba[] +error.title = [scarlet]Objevila se chyba[] error.crashtitle = Objevila se chyba unit.nobuild = [scarlet]Jednotka nemůže stavět blocks.input = Vstup @@ -574,6 +590,7 @@ blocks.boosteffect = Účinek posílení blocks.maxunits = Nejvýše aktivních jednotek blocks.health = Životy blocks.buildtime = Čas stavby +blocks.maxconsecutive = Nejvýše po sobě blocks.buildcost = Cena stavby blocks.inaccuracy = Nepřesnost blocks.shots = Střely @@ -581,8 +598,8 @@ blocks.reload = Střel za 1s blocks.ammo = Střelivo bar.drilltierreq = Je vyžadován lepší vrt -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Chybějí zdroje +bar.corereq = Je vyžadováno základní jádro bar.drillspeed = Rychlost vrtu: {0}/s bar.pumpspeed = Rychlost pumpy: {0}/s bar.efficiency = Účinnost: {0}% @@ -593,7 +610,7 @@ bar.poweroutput = Výstup energie: {0} bar.items = Předměty: {0} bar.capacity = Kapacita: {0} 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.heat = Teplo bar.power = Energie @@ -625,8 +642,9 @@ unit.persecond = /s unit.timesspeed = x větší rychlost unit.percent = % unit.items = předměty -unit.thousands = t -unit.millions = m +unit.thousands = tis +unit.millions = mio +unit.billions = mld category.general = Všeobecné category.power = Energie 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.pixelate.name = Rozpixlovat 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.musicvol.name = Hlasitost hudby 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.view.name = Pohled category.multiplayer.name = Hra více hráčů -category.blocks.name = Block Select +category.blocks.name = Výběr bloků command.attack = Útok command.rally = Shromáždění command.retreat = Ústup @@ -846,33 +864,33 @@ liquid.heatcapacity = [lightgray]Teplotní kapacita: {0}[] liquid.viscosity = [lightgray]Viskozita: {0}[] liquid.temperature = [lightgray]Teplota: {0}[] -unit.dagger.name = Mech Dýka -unit.mace.name = Mace -unit.fortress.name = Mech Pevnost +unit.dagger.name = Dýka +unit.mace.name = Palcát +unit.fortress.name = Pevnost unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Mech Slídil +unit.pulsar.name = Pulzar +unit.quasar.name = Kvasar +unit.crawler.name = Slídil unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith +unit.flare.name = Záře +unit.horizon.name = Horizont +unit.zenith.name = Zenit unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse +unit.eclipse.name = Zatmění unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde -unit.alpha.name = Alpha +unit.alpha.name = Alfa unit.beta.name = Beta -unit.gamma.name = Gamma +unit.gamma.name = Gama -block.parallax.name = Parallax -block.cliff.name = Cliff +block.parallax.name = Paralaxa +block.cliff.name = Útes block.sand-boulder.name = Pískovec block.grass.name = Tráva 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.multiplicative-reconstructor.name = Násobný přestavbovač block.exponential-reconstructor.name = Exponenciální přestavbovač -block.tetrative-reconstructor.name = Umocňující přestavbovač -block.payload-conveyor.name = Hromadný dopravník +block.tetrative-reconstructor.name = Mocninný přestavbovač +block.payload-conveyor.name = Dopravník nákladu block.payload-router.name = Směřovač nákladu block.disassembler.name = Rozebírač -block.silicon-crucible.name = Křemíková nádoba -block.large-overdrive-projector.name = Velký urychlující projektor +block.silicon-crucible.name = Tavicí tyglík pro křemík +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.crux.name = červený 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.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.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.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. @@ -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.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. + diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 22edb927f1..f8b3a20bf8 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -126,7 +126,7 @@ mod.import = 모드 가져오기 mod.import.file = 파일 가져오기 mod.import.github = Github 에서 모드 가져오기 mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다! -mod.item.remove = 이 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. +mod.item.remove = 이 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. mod.remove.confirm = 이 모드가 삭제될 것입니다. mod.author = [lightgray]제작자:[] {0} mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0} @@ -541,7 +541,7 @@ no = 아니오 info.title = 정보 error.title = [scarlet]오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다 -unit.nobuild = [scarlet]유닛을 만들 수 없습니다 +unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다. blocks.input = 입력 blocks.output = 출력 blocks.booster = 가속 @@ -554,7 +554,7 @@ blocks.damage = 공격력 blocks.targetsair = 공중 공격 blocks.targetsground = 지상 공격 blocks.itemsmoved = 이동 속도 -blocks.launchtime = 출격 사이의 시간 +blocks.launchtime = 출격 간격 blocks.shootrange = 사거리 blocks.size = 크기 blocks.liquidcapacity = 액체 용량 @@ -580,7 +580,7 @@ blocks.shots = 공격 속도 blocks.reload = 발/초 blocks.ammo = 탄약 -bar.drilltierreq = 더 좋은 드릴이 요구됨 +bar.drilltierreq = 더 좋은 드릴이 필요 bar.noresources = 자원 부족 bar.corereq = 코어 기지 필요 bar.drillspeed = 드릴 속도: {0}/s @@ -593,7 +593,7 @@ bar.poweroutput = 전력 출력: {0} bar.items = 자원량: {0} bar.capacity = 용량: {0} 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.heat = 발열 bar.power = 전력 @@ -607,7 +607,7 @@ bullet.incendiary = [stat]방화 bullet.homing = [stat]유도 bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[lightgray] 밀어내기 +bullet.knockback = [stat]{0}[lightgray] 밀침 bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 @@ -630,10 +630,10 @@ unit.millions = 백만 category.general = 일반 category.power = 전력 category.liquids = 액체 -category.items = 아이템 +category.items = 자원 category.crafting = 입력/출력 category.shooting = 사격 -category.optional = 보조 아이템 +category.optional = 보조 자원 setting.landscape.name = 가로화면 잠금 setting.shadows.name = 그림자 setting.blockreplace.name = 자동 블록 제안 @@ -679,7 +679,7 @@ setting.blockselectkeys.name = 블록 선택 키 표시 setting.vsync.name = 수직 동기화 setting.pixelate.name = 픽셀화 setting.minimap.name = 미니맵 표시 -setting.coreitems.name = 코어에 있는 아이템 표시 +setting.coreitems.name = 코어에 있는 자원 표시 setting.position.name = 플레이어 위치 표시 setting.musicvol.name = 음악 크기 setting.atmosphere.name = 행성 배경화면 표시 @@ -699,7 +699,7 @@ public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모 public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.cancel = 취소 후 나가기 -setting.bloom.name = 블룸 +setting.bloom.name = 화려한 효과 keybind.title = 조작키 설정 keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다. category.general.name = 일반 @@ -803,10 +803,10 @@ rules.title.unit = 유닛 rules.title.experimental = 실험적인 기능 rules.title.environment = 환경 rules.lighting = 조명 -rules.ambientlight = 주변 조명 +rules.ambientlight = 자연 조명 rules.solarpowermultiplier = 태양광 발전 배수 -content.item.name = 아이템 +content.item.name = 자원 content.liquid.name = 액체 content.unit.name = 유닛 content.block.name = 블록 @@ -820,58 +820,59 @@ item.silicon.name = 실리콘 item.plastanium.name = 플라스터늄 item.phase-fabric.name = 메타 item.surge-alloy.name = 설금 -item.spore-pod.name = 포자 포드 +item.spore-pod.name = 포자 버섯 item.sand.name = 모래 -item.blast-compound.name = 화합물 +item.blast-compound.name = 폭발물 item.pyratite.name = 파이라타이트 -item.metaglass.name = 금속유리 +item.metaglass.name = 강화 유리 item.scrap.name = 고철 liquid.water.name = 물 liquid.slag.name = 광재 liquid.oil.name = 기름 -liquid.cryofluid.name = 냉각 +liquid.cryofluid.name = 냉각수 item.explosiveness = [lightgray]폭발성: {0} item.flammability = [lightgray]인화성: {0} item.radioactivity = [lightgray]방사능: {0} unit.health = [lightgray]체력: {0} unit.speed = [lightgray]속도: {0} unit.weapon = [lightgray]무기: {0} -unit.itemcapacity = [lightgray]아이템 수용량: {0} +unit.itemcapacity = [lightgray]자원 수용량: {0} unit.minespeed = [lightgray]채광 속도: {0}% unit.minepower = [lightgray]채광 레벨: {0} unit.ability = [lightgray]능력: {0} unit.buildspeed = [lightgray]건설 속도: {0}% -liquid.heatcapacity = [lightgray]발열 용량: {0} +liquid.heatcapacity = [lightgray]비열: {0} liquid.viscosity = [lightgray]점도: {0} liquid.temperature = [lightgray]온도: {0} -unit.dagger.name = Dagger -unit.mace.name = Mace -unit.fortress.name = Fortress -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Crawler -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma +unit.dagger.name = 대거 +unit.mace.name = 메이스 +unit.fortress.name = 포트리스 +unit.nova.name = 노바 +unit.pulsar.name = 펄서 +unit.quasar.name = 퀘이사 +unit.crawler.name = 크롤러 +unit.atrax.name = 아트락스 +unit.spiroct.name = 스피록트 +unit.arkyid.name = 아키드 +unit.toxipod.name = 독소포드 +unit.flare.name = 플레어 +unit.horizon.name = 호라이즌 +unit.zenith.name = 제니스 +unit.antumbra.name = 안텀브라 +unit.eclipse.name = 이클립스 +unit.mono.name = 모노 +unit.poly.name = 폴리 +unit.mega.name = 메가 +unit.risso.name = 리소 +unit.minke.name = 민케 +unit.bryde.name = 브리드 +unit.alpha.name = 알파 +unit.beta.name = 베타 +unit.gamma.name = 감마 -block.parallax.name = Parallax +block.parallax.name = 시차 block.cliff.name = 낭떠러지 block.sand-boulder.name = 사암 block.grass.name = 잔디 @@ -956,7 +957,7 @@ block.phase-wall-large.name = 대형 메타 벽 block.thorium-wall.name = 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽 block.door.name = 문 -block.door-large.name = 대형문 +block.door-large.name = 대형 문 block.duo.name = 듀오 block.scorch.name = 스코치 block.scatter.name = 스캐터 @@ -966,7 +967,7 @@ block.conveyor.name = 컨베이어 block.titanium-conveyor.name = 티타늄 컨베이어 block.plastanium-conveyor.name = 플라스터늄 컨베이어 block.armored-conveyor.name = 장갑 컨베이어 -block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 아이템을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 아이템을 받을 수 없습니다. +block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 자원을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 자원을 받을 수 없습니다. block.junction.name = 교차기 block.router.name = 분배기 block.distributor.name = 대형 분배기 @@ -975,12 +976,12 @@ block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블록 block.illuminator.name = 조명 block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다. -block.overflow-gate.name = 오버플로 게이트 -block.underflow-gate.name = 언더플로 게이트 +block.overflow-gate.name = 포화 필터 +block.underflow-gate.name = 불포화 필터 block.silicon-smelter.name = 실리콘 제련소 block.phase-weaver.name = 메타 합성기 block.pulverizer.name = 분쇄기 -block.cryofluidmixer.name = 냉각 유체 제조기 +block.cryofluidmixer.name = 냉각수 제조기 block.melter.name = 융해기 block.incinerator.name = 소각로 block.spore-press.name = 포자 압축기 @@ -995,12 +996,12 @@ block.battery-large.name = 대형 배터리 block.combustion-generator.name = 연소 발전기 block.steam-generator.name = 증기 발전기 block.differential-generator.name = 차동 발잔기 -block.impact-reactor.name = 임팩트 원자로 +block.impact-reactor.name = 핵융합 원자로 block.mechanical-drill.name = 기계식 드릴 block.pneumatic-drill.name = 공압 드릴 block.laser-drill.name = 레이저 드릴 block.water-extractor.name = 물 추출기 -block.cultivator.name = 제초기 +block.cultivator.name = 온실 block.conduit.name = 파이프 block.mechanical-pump.name = 기계식 펌프 block.item-source.name = 자원 공급기 @@ -1018,7 +1019,7 @@ block.ripple.name = 립플 block.phase-conveyor.name = 메타 컨베이어 block.bridge-conveyor.name = 다리 컨베이어 block.plastanium-compressor.name = 플라스터늄 압축기 -block.pyratite-mixer.name = 라타이트 혼합기 +block.pyratite-mixer.name = 파이라타이트 혼합기 block.blast-mixer.name = 화합물 혼합기 block.solar-panel.name = 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판 @@ -1039,7 +1040,7 @@ block.thermal-pump.name = 화력 펌프 block.thermal-generator.name = 화력 생성기 block.alloy-smelter.name = 설금 제련소 block.mender.name = 멘더 -block.mend-projector.name = 대형 수리 프로젝터 +block.mend-projector.name = 수리 프로젝터 block.surge-wall.name = 설금 벽 block.surge-wall-large.name = 큰 설금 벽 block.cyclone.name = 사이클론 @@ -1057,7 +1058,7 @@ block.launch-pad-large.name = 대형 출격 패드 block.segment.name = 세그먼트 block.ground-factory.name = 지상 공장 block.air-factory.name = 항공 공장 -block.naval-factory.name = 해군 공장 +block.naval-factory.name = 해양 공장 block.additive-reconstructor.name = 첨가물 재구성기 block.multiplicative-reconstructor.name = 다중 재구성기 block.exponential-reconstructor.name = 지수 재구성기 @@ -1081,18 +1082,18 @@ tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니 tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. tutorial.blockinfo = 각 블록마다 다른 특성을 가지고 있으며, 각 드릴은 특정 광석만 채굴할 수 있습니다.\n블록의 정보와 특성을 확인하려면, [accent]건설 메뉴에서 "?" 버튼을 선택하세요.[]\n\n[accent]지금 기계식 드릴의 정보를 보세요. -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.turret = 아이템이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 아이템이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 아이템(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. +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.turret = 자원이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 자원이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 자원(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 0/1 tutorial.pause = 전투 중에는 게임을 [accent]일시정지[] 할 수 있습니다.\n일시정지 되는 동안 건설을 대기시킬 수 있습니다.\n\n[accent]일시정지하려면 스페이스 키를 누르세요. tutorial.pause.mobile = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지하려면 왼쪽 상단에 있는 이 버튼을 누르세요. tutorial.unpause = 이제 스페이스를 누르면 일시정지가 해제됩니다. tutorial.unpause.mobile = 이제 다시 누르면 일시정지가 해제됩니다. tutorial.breaking = 블록은 종종 파괴 되어야 합니다.\n선택한 모든 블록을 파괴하려면 [accent]마우스 오른쪽 클릭을 길게 누르세요[].\n\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각벽을 파괴하세요. -tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블럭을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. -tutorial.withdraw = 경우에 따라 블록에서 아이템을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]아이템이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]아이템[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. -tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 아이템을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. +tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블록을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. +tutorial.withdraw = 경우에 따라 블록에서 자원을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]자원이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]자원[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. +tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 자원을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요. @@ -1110,15 +1111,15 @@ item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치 item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다. item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. -item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 합성 포자 포드. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. -item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 포드 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. +item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. +item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질. liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다. liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다. -block.message.description = 메세지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. +block.message.description = 메시지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다. block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다. block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다. @@ -1131,14 +1132,14 @@ block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분 block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다. block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다. -block.spore-press.description = 포자 포드를 극압으로 압축하여 기름을 합성합니다. +block.spore-press.description = 포자 버섯을 극압으로 압축하여 기름을 합성합니다. block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다. block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다. -block.incinerator.description = 넘치는 아이템이나 액체를 증발시킵니다. +block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. -block.item-source.description = 아이템을 무한대로 출력합니다. 샌드박스 전용. -block.item-void.description = 모든 아이템을 파괴합니다. 샌드박스 전용. +block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. +block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다. @@ -1162,17 +1163,17 @@ block.force-projector.description = 건물과 내부의 유닛을 공격으로 block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다. block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식. block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다. -block.plastanium-conveyor.description = 아이템을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 아이템을 받고 앞쪽에 세 방향으로 내보냅니다. +block.plastanium-conveyor.description = 자원을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 자원을 받고 앞쪽에 세 방향으로 내보냅니다. block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다. block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. -block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 아이템을 순간이동 시킵니다. -block.sorter.description = 아이템을 정렬합니다. 아이템이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. -block.inverted-sorter.description = 표준 분류기와 같은 아이템을 처리하지만, 대신 선택된 아이템을 측면으로 출력합니다. -block.router.description = 아이템을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. -block.distributor.description = 고급 분배기. 아이템을 최대 7개의 다른 방향으로 동일하게 분할합니다. +block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 자원을 순간이동 시킵니다. +block.sorter.description = 자원을 정렬합니다. 자원이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. +block.inverted-sorter.description = 표준 분류기와 같은 자원을 처리하지만, 대신 선택된 자원을 측면으로 출력합니다. +block.router.description = 자원을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. +block.distributor.description = 고급 분배기. 자원을 최대 7개의 다른 방향으로 동일하게 분할합니다. block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다. block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다. -block.mass-driver.description = 최고의 아이템 운송 블록. 여러 아이템을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. +block.mass-driver.description = 최고의 자원 운송 블록. 여러 자원을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다. block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다. block.thermal-pump.description = 가장 강력한 펌프. @@ -1199,20 +1200,20 @@ block.solar-panel.description = 태양으로부터 소량의 전력을 생성합 block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전. block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다. block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다. -block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 아이템을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. +block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다. block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능. block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다. block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다. -block.cultivator.description = 대기 중의 작은 농도의 포자를 배양 가능한 포드로 배양합니다. +block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 버섯으로 배양합니다. block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다. block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오. block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다. block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다. -block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 아이템을 빼낼 수 있습니다. -block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 아이템을 빼낼 수 있습니다. -block.unloader.description = 근처의 비 수송 블록에서 아이템을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. -block.launch-pad.description = 코어 출격 없이도 아이템을 묶어 출격시킬 수 있습니다. +block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다. +block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다. +block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. +block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다. block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다. block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다. block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties new file mode 100644 index 0000000000..cdac6c48da --- /dev/null +++ b/core/assets/bundles/bundle_ro.properties @@ -0,0 +1,1296 @@ +credits.text = Creat de [royal]Anuken[] - [sky]anukendev@gmail.com[] +credits = Credite +contributors = Traducători și contributori +discord = Intrați pe serverul de Discord al Mindustry! +link.discord.description = Chatul oficial de pe Discord al Mindustry +link.reddit.description = Subredditul Mindustry +link.github.description = Codul sursă al jocului +link.changelog.description = Lista schimbărilor din update +link.dev-builds.description = Builduri instabile ale dezvoltatorului +link.trello.description = Pagina oficială de Trello pentru funcțiile planificate +link.itch.io.description = Pagina itch.io cu descărcările pentru PC +link.google-play.description = Google Play +link.f-droid.description = Catalogul F-Droid +link.wiki.description = Wikiul oficial al Mindustry +link.suggestions.description = Sugerează noi funcții +linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată. +screenshot = Captură de ecran salvată la {0} +screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran. +gameover = Jocul s-a încheiat +gameover.pvp = Echipa [accent] {0}[] este câștigătoare! +highscore = [accent]Scor maxim nou! +copied = Copiat. +indevpopup = [accent]v6[] este momentan în [accent]alpha[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este complet neterminată[]\n- Majoritatea [scarlet]AI-ului unităților[] nu funcționează bine\n- Multe unități sunt neterminate\n- Modul campanie nu este terminat \n- Tot ce vedeți se poate schimba sau poate fi eliminat.\n\nPentru a raporta buguri și crashuri intrați pe [accent]Github[]. + +load.sound = Sunete +load.map = Hărți +load.image = Imagini +load.content = Conținut +load.system = Sistem +load.mod = Moduri +load.scripts = Scripturi + +be.update = Un nou build Bleeding Edge este disponibil: +be.update.confirm = Îl descarci și repornești acum? +be.updating = Se face update... +be.ignore = Ignoră +be.noupdates = Niciun update disponibil. +be.check = Verifică updateurile + +schematic = Schemă +schematic.add = Salvează Schema... +schematics = Scheme +schematic.replace = O schemă cu acel nume există deja. O înlocuiți? +schematic.exists = O schemă cu acel nume există deja. +schematic.import = Importă Schema... +schematic.exportfile = Exportă Fișier +schematic.importfile = Importă Fișier +schematic.browseworkshop = Intră pe Workshop +schematic.copy = Copiază în Clipboard +schematic.copy.import = Importă din Clipboard +schematic.shareworkshop = Partajează pe Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Întoarce Schemă +schematic.saved = Schemă salvată. +schematic.delete.confirm = Schema această va fi ștearsă permanent. +schematic.rename = Redenumește Schema +schematic.info = {0}x{1}, {2} blocuri + +stat.wave = Valuri Învinse:[accent] {0} +stat.enemiesDestroyed = Inamici Distruși:[accent] {0} +stat.built = Structuri Construite:[accent] {0} +stat.destroyed = Structuri Distruse:[accent] {0} +stat.deconstructed = Structuri Deconstruite:[accent] {0} +stat.delivered = Resurse Lansate: +stat.playtime = Timp Joc:[accent] {0} +stat.rank = Rang Final: [accent]{0} + +globalitems = [accent]Materiale Globale +map.delete = Sigur vrei să ștergi harta "[accent]{0}[]"? +level.highscore = Scor Maxim: [accent]{0} +level.select = Selectează Nivelul +level.mode = Mod de Joc: +coreattack = < Nucleul este atacat! > +nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare imminentă +database = Datele Nucleului +savegame = Salvează Jocul +loadgame = Încarcă Jocul +joingame = Alătură-te Jocului +customgame = Joc Personalizat +newgame = Joc Nou +none = +minimap = Minihartă +position = Poziție +close = Închide +website = Site +quit = Abandonează +save.quit = Salvează și Închide +maps = Hărți +maps.browse = Selectează Hărți +continue = Continuă +maps.none = [lightgray]Nu s-au găsit hărți! +invalid = Invalid +pickcolor = Alege Culoarea +preparingconfig = Se Pregătește Configurația +preparingcontent = Se Pregătește Conținutul +uploadingcontent = Se Încarcă Conținutul +uploadingpreviewfile = Se Încarcă Previzualizarea Fișierului +committingchanges = Se Încarcă Schimbările +done = Gata +feature.unsupported = Dispozitivul tău nu suportă această funcție. + +mods.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportați orice probleme apărute pe Githubul Mindustry sau pe Discord. +mods.alpha = [accent](Alpha) +mods = Moduri +mods.none = [lightgray]Nu s-au găsit moduri! +mods.guide = Ghid de Modding +mods.report = Raportează Bug +mods.openfolder = Deschide Folder +mods.reload = Reîncarcă +mods.reloadexit = Jocul se va opri ca să reîncarce modurile. +mod.display = [gray]Mod:[orange] {0} +mod.enabled = [lightgray]Activat +mod.disabled = [scarlet]Dezactivat +mod.disable = Dezactivează +mod.content = Conținut: +mod.delete.error = Nu s-a putut șterge modul. Fișierul ar putea fi în uz. +mod.requiresversion = [scarlet]Ai nevoie de versiunea de joc minimă: [accent]{0} +mod.outdated = [scarlet]Nu este compatibil cu V6 (no minGameVersion: 105) +mod.missingdependencies = [scarlet]Dependențe Lipsă: {0} +mod.erroredcontent = [scarlet]Erori de Conținut +mod.errors = Au apărut erori la încărcarea conținutului. +mod.noerrorplay = [scarlet]Modurile tale au erori.[] Dezactivează modurile afectate sau repară erorile înainte să joci. +mod.nowdisabled = [scarlet]Modul '{0}' are dependențe lipsă:[accent] {1}\n[lightgray]Mai întâi trebuie să descarci aceste moduri.\nAcest mod va fi dezactivat automat. +mod.enable = Activează +mod.requiresrestart = Jocul se va închide acum pt a aplica modificările modurilor. +mod.reloadrequired = [scarlet]E Nevoie de o Repornire +mod.import = Importă Mod +mod.import.file = Importă Fișier +mod.import.github = Importă din GitHub +mod.jarwarn = [scarlet]Modurile în format JAR nu sunt sigure.[]\nAi grijă să importezi acest mod dintr-o sursă de încredere! +mod.item.remove = Acest obiect este parte din modul [accent] '{0}'[]. Ca să îl poți elimina, dezinstalează acel mod. +mod.remove.confirm = Acest mod va fi șters. +mod.author = [lightgray]Autor:[] {0} +mod.missing = Această salvare conține moduri cărora le-ai făcut update recent sau nu mai sunt instalate. Fișierul poate fi corupt. Sigur vrei să îl încarci?\n[lightgray]Moduri:\n{0} +mod.preview.missing = Înainte să publici acest mod pe Workshop, trebuie să adaugi o imagine pt previzualizare.\nPune o imagine numită[accent] preview.png[] în folderul modului și încearcă din nou. +mod.folder.missing = Doar modurile din câmpul folder pot fi publicate pe Workshop.\nPt a converti orice mod într-un folder, dezarhivează zipul într-un folder și șterge vechiul zip, apoi repornește jocul sau reîncărcă-ți modurile. +mod.scripts.disable = Dispozitivul tău nu suportă moduri cu scripturi. Trebuie să dezactivezi aceste moduri ca să joci jocul. + +about.button = Despre +name = Nume: +noname = Mai întâi alege un [accent] nume de jucător[]. +planetmap = Harta Planetei +launchcore = Lansează Nucleu +filename = Nume Fișier: +unlocked = Nou conținut deblocat! +completed = [accent]Finalizat +techtree = Tehnologie +research.list = [lightgray]Cercetare: +research = Cercetează +researched = [lightgray]{0} cercetat. +research.progress = {0}% finalizat +players = {0} jucători +players.single = {0} jucător +players.search = caută +players.notfound = [gray]niciun jucător găsit +server.closing = [accent]Se închide serverul... +server.kicked.kick = S-ar putea să fi fost dat afară de pe server! +server.kicked.whitelist = Nu ești în lista albă a serverului. +server.kicked.serverClose = Server închis. +server.kicked.vote = Ai fost dat afară de către ceilalți jucători. La revedere. +server.kicked.clientOutdated = Client învechit! Fă-ți update la joc! +server.kicked.serverOutdated = Server învechit! Roagă gazda să facă update! +server.kicked.banned = Ești interzis pe acest server. +server.kicked.typeMismatch = Acest server nu este compatibil cu tipul tău de build. +server.kicked.playerLimit = Serverul acesta e plin. Așteaptă pt un loc liber. +server.kicked.recentKick = Ai fost dat afară recent.\nAșteaptă înainte de a te reconecta. +server.kicked.nameInUse = Cineva cu același nume\neste deja pe server. +server.kicked.nameEmpty = Numele ales este invalid. +server.kicked.idInUse = Ești deja pe acest server! Nu poți conecta două conturi. +server.kicked.customClient = Acest server nu suportă builduri personalizate. Descarcă o versiune oficială. +server.kicked.gameover = Joc încheiat! +server.kicked.serverRestarting = Acest server se repornește. +server.versions = Versiunea ta:[accent] {0}[]\versiunea serverului:[accent] {1}[] +host.info = Butonul [accent]găzduiește[] va găzdui un server pe portul [scarlet]6567[]. \nOrice persoană de pe același port [lightgray]wifi sau rețea locală[] ar trebui să-ți vadă serverul în lista lor de servere.\n\nDacă vrei ca lumea să se poată conecta de oriunde cu IP-ul, este nevoie de [accent]port forwarding[].\n\n[lightgray]Notă: Dacă cineva are probleme în a se conecta la jocul tău LAN, verifică dacă ai lăsat Mindustry să acceseze rețeaua locală în setările de firewall. De menționat este faptul că uneori rețelele publice nu permit descoperirea serverului. +join.info = Aici poți scrie un [accent]IP de server[] pt a te conecta, a descoperi [accent]rețeaua locală[] sau serverele [accent]globale[] pt a te conecta la ele.\nAtât multiplayerul LAN cât și cel WAN este suportat.\n\n[lightgray]Dacă vrei să te conectezi la cineva cu IP-ul, trebuie să ceri gazdei IP-ul său, care poate fi găsit căutând pe Google "my ip' de pe dispozitivul lor. +hostserver = Găzduiește Joc Multiplayer +invitefriends = Invită Prieteni +hostserver.mobile = Găzduiește Joc +host = Găzduiește +hosting = [accent]Se deschide serverul... +hosts.refresh = Reîncarcă +hosts.discovering = Se caută jocur LAN +hosts.discovering.any = Se caută jocuri +server.refreshing = Se reîncarcă serverul +hosts.none = [lightgray]Nu s-au găsit jocuri locale! +host.invalid = [scarlet]Nu s-a putut face conectarea la gazdă! + +servers.local = Servere Locale +servers.remote = Servere de la Distanță +servers.global = Servere ale Comunității + +trace = Urmărește Jucător +trace.playername = Nume jucător: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = ID unic: [accent]{0} +trace.mobile = Client Mobil: [accent]{0} +trace.modclient = Client Personalizat: [accent]{0} +invalidid = ID client invalid! Raportează bugul. +server.bans = Interziși +server.bans.none = Nu s-au găsit jucători intreziși! +server.admins = Admini +server.admins.none = Nu s-au găsit admini! +server.add = Adăugă server +server.delete = Sigur vrei să ștergi acest server? +server.edit = Editează Server +server.outdated = [scarlet]Server Învechit![] +server.outdated.client = [scarlet]Client Învechit![] +server.version = [gray]v{0} {1} +server.custombuild = [accent]Build Personalizat +confirmban = Sigur vrei să interzici jucătorul "{0}[white]"? +confirmkick = Sigur vrei să-l dai afară pe "{0}[white]"? +confirmvotekick = Sigur vrei să-l dai afară pe "{0}[white]"? +confirmunban = Sigur vrei ca acest jucător să nu mai fie interzis? +confirmadmin = Sigur vrei să-l faci pe "{0}[white]" un admin? +confirmunadmin = Sigur vrei ca "{0}[white]" să nu mai fie un admin? +joingame.title = Alătură-te Jocului +joingame.ip = Adresă: +disconnect = Deconectat. +disconnect.error = Eroare de conexiune. +disconnect.closed = Conexiune închisă. +disconnect.timeout = Întârzie să răspundă. +disconnect.data = Nu s-au putut încărca datele lumii! +cantconnect = Nu te-ai putut alătura jocului ([accent]{0}[]). +connecting = [accent]Conectare... +connecting.data = [accent]Se încarcă datele hărții... +server.port = Port: +server.addressinuse = Adresa este deja în uz! +server.invalidport = Număr de port invalid! +server.error = [scarlet]Eroare la găzduirea serverului. +save.new = Nouă Salvare +save.overwrite = Sigur vrei să scrii peste \nacest slot de salvare? +overwrite = Scrie Peste +save.none = Nu s-au găsit salvări! +savefail = Salvarea jocului a eșuat! +save.delete.confirm = Sigur vrei să ștergi această salvare? +save.delete = Șterge +save.export = Exportă Salvarea +save.import.invalid = [accent]Salvarea aceasta e invalidă! +save.import.fail = [scarlet]Importul salvării a eșuat: [accent]{0} +save.export.fail = [scarlet]Exportul salvării a eșuat: [accent]{0} +save.import = Importă Salvarea +save.newslot = Numele Salvării: +save.rename = Redenumire +save.rename.text = Noul nume: +selectslot = Selectează o salvare. +slot = [accent]Slotul {0} +editmessage = Editează Mesaj +save.corrupted = Fișier salvare corupt sau invalid! +empty = +on = Pornit +off = Oprit +save.autosave = Autosalvare: {0} +save.map = Hartă: {0} +save.wave = Valul {0} +save.mode = Mod de Joc: {0} +save.date = Ultima Salvare: {0} +save.playtime = Timp în Joc: {0} +warning = Atenție +confirm = Confirmă +delete = Șterge +view.workshop = Vezi în Workshop +workshop.listing = Editează Listarea din Workshop +ok = OK +open = Deschide +customize = Personalizează Regulile +cancel = Anulare +openlink = Deschidr Linkul +copylink = Copiază Linkul +back = Înapoi +data.export = Exportă Date +data.import = Importă Date +data.openfolder = Deschide Folderul cu Date +data.exported = Date exportate. +data.invalid = Aceste date de joc nu sunt valide. +data.import.confirm = Importul de date externe va suprascrie[scarlet] toate[] datele tale de joc curente.\n[accent]Acest proces este ireversibil![]\n\nOdată ce datele sunt importate, jocul tău se va opri imediat. +quit.confirm = Sigur vrei să abandonezi? +quit.confirm.tutorial = Sigur știi ce faci?\nTutorialul poate fi reluat în[accent] Setări->Joc->Reia Tutorialul.[] +loading = [accent]Se încarcă... +reloading = [accent]Se Reincarcă Modurile... +saving = [accent]Se salvează... +respawn = [accent][[{0}][] ca să te refaci în nucleu +cancelbuilding = [accent][[{0}][] pt a curăța planul +selectschematic = [accent][[{0}][] pt selectare+copiere +pausebuilding = [accent][[{0}][] pt a face o pauză de la construit +resumebuilding = [scarlet][[{0}][] pt a continua construitul +wave = [accent]Valul {0} +wave.waiting = [lightgray]Val în {0} +wave.waveInProgress = [lightgray]Val în desfășurare +waiting = [lightgray]În așteptare... +waiting.players = Se așteaptă jucătorii... +wave.enemies = [lightgray]Mai sunt {0} inamici +wave.enemy = [lightgray]Mai e {0} inamic +loadimage = Încarcă Imagine +saveimage = Salvează Imagine +unknown = Necunoscut +custom = Personalizată +builtin = Prestabilită +map.delete.confirm = Ești sigur că vrei să ștergi această hartă? Acțiunea este ireversibilă! +map.random = [accent]Hartă Aleatorie +map.nospawn = Harta asta nu are niciun nucleu în care vor apărea jucătorii! Adaugă un nucleu[accent] portocaliu[] acestei hărți în editor. +map.nospawn.pvp = Această hartă nu are niciun nucleu inamic în care să apară jucătorii! Adaugă nuclee[scarlet] care nu sunt portocalii[] acestei hărți în editor. +map.nospawn.attack = Această hartă nu are niciun nucleu inamic pe care să îl atace jucătorii! Adaugă un nucleu[scarlet] roșu[] acestei hărți în editor. +map.invalid = Eroare la încărcarea hărții: fișier corupt sau invalid. +workshop.update = Fă Update la Item +workshop.error = Eroare la preluarea detaliilor din Workshop: {0} +map.publish.confirm = Sigur vrei să publici această hartă?\n\n[lightgray] Asigură-te că ești de acord cu Termenii și Condițiile Workshop mai întâi, sau hărțile tale nu vor fi publicate! +workshop.menu = Selectează ce ai vrea să faci cu acest item. +workshop.info = Informații despre Item +changelog = Schimbări (opțional): +eula = Steam EULA (Termeni și Condiții) +missing = Acest item a fost șters sau mutat.\n[lightgray]Listarea de pe Workshop a fost automat dezlegată. +publishing = [accent]Se Publică... +publish.confirm = Sigur vrei să publici asta?\n\n[lightgray]Asigură-te că ai verificat Termenii și Condițiile Workshop mai întâi, sau itemurile tale nu vor apărea! +publish.error = Eroare la publicarea itemului: {0} +steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0} + +editor.brush = Pensulă +editor.openin = Deschide în Editor +editor.oregen = Generarea Minereurilor +editor.oregen.info = Generarea Minereurilor: +editor.mapinfo = Informații despre Hartă +editor.author = Autor: +editor.description = Descriere: +editor.nodescription = O hartă trebuie să aibă o descriere care să conțină măcar 4 caractere înainte să fie publicată. +editor.waves = Valuri: +editor.rules = Reguli: +editor.generation = Generare: +editor.ingame = Editează în Joc +editor.publish.workshop = Publică pe Workshop +editor.newmap = Hartă Nouă +workshop = Workshop +waves.title = Valuri +waves.remove = Elimină +waves.never = +waves.every = la fiecare +waves.waves = val(uri) +waves.perspawn = per apariție +waves.shields = scuturi/val +waves.to = până la +waves.guardian = Gardian +waves.preview = Previzualizare +waves.edit = Editează... +waves.copy = Copiază în Clipboard +waves.load = Încarcă din Clipboard +waves.invalid = Valuri invalide în clipboard. +waves.copied = Valuri copiate. +waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită. + + +#astea-s intenționat cu literă mică +wavemode.counts = numere +wavemode.totals = totaluri +wavemode.health = viață + +editor.default = [lightgray] +details = Detalii... +edit = Editare... +editor.name = Nume: +editor.spawn = Adaugă Unitate +editor.removeunit = Înlătură Unitate +editor.teams = Echipe +editor.errorload = Eroare la încărcarea fișierului. +editor.errorsave = Eroare la salvarea fișierului. +editor.errorimage = Aceasta este o imagine, nu o hartă.\n\nDacă vrei să imporți o hartă din versiunile 3.5/build 40, folosește butonul 'Importă Hartă Veche' din editor. +editor.errorlegacy = Hartă aceasta este prea veche, și folosește un format învechit care nu mai este suportat. +editor.errornot = Acesta nu este un fișier cu o hartă. +editor.errorheader = Acest fișier de hartă este invalid sau corupf. +editor.errorname = Harta nu are un nume definit. Încerci cumva să încarci un fișier cu o salvare de joc? +editor.update = Update +editor.randomize = Aleatoriu +editor.apply = Aplică +editor.generate = Generează +editor.resize = Altă Dimensiue +editor.loadmap = Încarcă Harta +editor.savemap = Salvează Harta +editor.saved = Salvat! +editor.save.noname = Hartă ta nu are un nume! Setează unul în meniul 'Informații despre hartă'. +editor.save.overwrite = Hartă ta suprascrie o hartă prestabilită! Alege un nume diferit în meniul 'Informații despre hartă'. +editor.import.exists = [scarlet]Nu s-a putut importa:[] o hartă prestabilită numită '{0}' deja există! +editor.import = Importă... +editor.importmap = Importă Hartă +editor.importmap.description = Importă o hartă deja existentă +editor.importfile = Importă Fișier +editor.importfile.description = Importă un fișier hartă extern +editor.importimage = Importă Hartă Veche (Imagine) +editor.importimage.description = Importă o hartă imagine externă +editor.export = Exportă... +editor.exportfile = Exportă Fișier +editor.exportfile.description = Exportă un fișier hartă +editor.exportimage = Exportă o Hartă Imagine +editor.exportimage.description = Exportă o hartă imagine conținând doar teren de bază +editor.loadimage = Importă Hartă Imagine +editor.saveimage = Exportă Hartă Imagine +editor.unsaved = Sigur vrei să ieși?\n[scarlet]Orice schimbări nesalvate vor fi pierdute. +editor.resizemap = Altă Dimensiune Hartă +editor.mapname = Nume Hartă: +editor.overwrite = [accent]Atenție! \nAceastă hartă va suprascrie o hartă existentă. +editor.overwrite.confirm = [scarlet]Atenție![] o hartă cu acest nume există deja. Sigur vrei să o suprascrii?\n"[accent]{0}[]" +editor.exists = Există deja o hartă cu același nume. +editor.selectmap = Selectează o hartă de încărcat: + +toolmode.replace = Înlocuiește +toolmode.replace.description = Desenează doar pe blocurile solide. +toolmode.replaceall = Înlocuiește-le pe toate +toolmode.replaceall.description = Înlocuiește toate blocurile solide de pe hartă. +toolmode.orthogonal = Ortogonal +toolmode.orthogonal.description = Desenează doar linii ortogonale. +toolmode.square = Pătrat +toolmode.square.description = Pensulă pătrată. +toolmode.eraseores = Șterge Minereurile +toolmode.eraseores.description = Șterge doar minereurile. +toolmode.fillteams = Umplere Echipe +toolmode.fillteams.description = Umple hartă cu echipe în loc de blocuri. +toolmode.drawteams = Desenează Echipe +toolmode.drawteams.description = Desenează echipe în loc de blocuri. + +filters.empty = [lightgray]Fără filtre! Adaugă unul folosind butonul de mai jos. +filter.distort = Distorsionare +filter.noise = Zgomot Vizual +filter.enemyspawn = Selectare Punct de Lansare Inamic +filter.corespawn = Selectare Nucleu +filter.median = Mediană +filter.oremedian = Mediană Minereu +filter.blend = Amestecare +filter.defaultores = Miercuri Prestabilite +filter.ore = Minereu +filter.rivernoise = Zgomot Vizual Râuri +filter.mirror = Oglindă +filter.clear = Curăță +filter.option.ignore = Ignoră +filter.scatter = Împrăștie +filter.terrain = Teren +filter.option.scale = Scară +filter.option.chance = Șansă +filter.option.mag = Magnitudine +filter.option.threshold = Cantitate +filter.option.circle-scale = Scară circulară +filter.option.octaves = Octave +filter.option.falloff = Cădere +filter.option.angle = Unghi +filter.option.amount = Cantitate +filter.option.block = Bloc +filter.option.floor = Podea +filter.option.flooronto = Podea țintă +filter.option.wall = Perete +filter.option.ore = Minereu +filter.option.floor2 = Podea Secundară +filter.option.threshold2 = Cantitate Secundară +filter.option.radius = Rază +filter.option.percentile = Procent + +width = Lățime: +height = Înălțime: +menu = Meniu +play = Joacă +campaign = Campanie +load = Încarcă +save = Salvează +fps = FPS: {0} +ping = Ping: {0}ms +language.restart = Vă rugăm să reporniți jocul pentru că setările de limbă să aibă efect. +settings = Setări +tutorial = Tutorial +tutorial.retake = Reia Tutorial +editor = Editor +mapeditor = Editor Hărți + +abandon = Abandonează +abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului. +locked = Blocat +complete = [lightgray]Finalizat: +requirement.wave = Ajungi la valul {0} în {1} +requirement.core = Distruge Nucleu Inamic în{0} +requirement.research = Cercetează {0} +requirement.capture = Capturează {0} +resume = Revin la Zonă:\n[lightgray]{0} +bestwave = [lightgray]Cel Mai Bun Val: {0} +#TODO fix/remove this +launch = < LANSARE > +launch.text = Lansează +launch.title = Lansare Finalizată +launch.next = [lightgray]următoarea ocazie la valul {0} +launch.unable2 = [scarlet]Imposibil de LANSAT.[] +launch.confirm = Asta va lansa toate resursele din nucleu.\nNu te vei mai putea întoarce la această bază. +launch.skip.confirm = Dacă sari acum, Nu vei mai putea lansa decât valurile viitoare. +uncover = Descoperă +configure = Configurează Încărcarea +#TODO +loadout = Încărcare +resources = Resurse +bannedblocks = Blocuri Interzise +addall = Adaugă-le pe toate +configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. +zone.unlocked = [lightgray]{0} deblocat(ă). +zone.requirement.complete = Cerințele pt {0} finalizate:[lightgray]\n{1} +zone.resources = [lightgray]Resurse Detectate: +zone.objective = [lightgray]Obiectiv: [accent]{0} +zone.objective.survival = Supraviețuiește +zone.objective.attack = Distruge Nucleul Inamic +add = Adaugă... +boss.health = Viața Gardianului + +connectfail = [scarlet]Eroare de conexiune:\n\n[accent]{0} +error.unreachable = Nu s-a putut ajunge la server.\nesigur adresa e scrisă corect? +error.invalidaddress = Adresă invalidă. +error.timedout = Răspuns întârziat!\nAsigură-te că gazda are port forwarding activat, și că adresa este corectă! +error.mismatch = Eroare de pachet:\nPosibil ca versiunea de client/server să nu se potrivească.\nAsigură-te că tu și gazda aveți ultima versiune de Mindustry! +error.alreadyconnected = Deja conectat. +error.mapnotfound = Fișierul hărții nu a fost găsit! +error.io = Eroare de rețea I/O. +error.any = Eroare de rețea necunoscută. +error.bloom = Inițializarea strălucirii a eșuat.\nS-ar putea ca dispozitivul tău să nu suporte funcția. + +weather.rain.name = Ploaie +weather.snow.name = Ninsoare +weather.sandstorm.name = Furtună de nisip +weather.sporestorm.name = Furtună de spori + +sectors.unexplored = [lightgray]Neexplorat +sectors.resources = Resurse: +sectors.production = Producție: +sectors.stored = Stocat: +sectors.resume = Revino +sectors.launch = Lansare + +#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway +sector.groundZero.name = Ground Zero +sector.craters.name = The Craters +sector.frozenForest.name = Frozen Forest +sector.ruinousShores.name = Ruinous Shores +sector.stainedMountains.name = Stained Mountains +sector.desolateRift.name = Desolate Rift +sector.nuclearComplex.name = Nuclear Production Complex +sector.overgrowth.name = Overgrowth +sector.tarFields.name = Tar Fields +sector.saltFlats.name = Salt Flats +sector.fungalPass.name = Fungal Pass + +#unused +#sector.impact0078.name = Impact 0078 +#sector.crags.name = Crags + +sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe. +sector.frozenForest.description = Chiar și aici, aproape de munți, sperii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare. +sector.saltFlats.description = La periferia deșertului stau Salt Flats. Puține resurse pot fi găsite în această locație.\n\nInamicul a ridicat un complex-depozit aici. Distruge-le nucleul. Nu lăsa nimic în urmă. +sector.craters.description = Apa s-a acumulat în acest crater, rămășiță a vechilor războaie. Cucerește din nou zona. Adună nisip. Toarnă-l în metasticlă. Pompează apă pt a răci armele și burghiele. +sector.ruinousShores.description = După deșerturi vine țărmul. Odată, locația aceasta a avut un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai de bază rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea în afară. Redescoperă tehnologia. +sector.stainedMountains.description = Mai înspre continent sunt munții, încă neatinși de spori.\nExtrage abundentele resurse de titan din zonă. Învață cum să-l folosești.\n\nPrezența inamicului e mai mare aici. Nu le da timp să-și trimită cele mai puternice unități. +sector.overgrowth.description = Zona asta e plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un adăpost aici. Construiește unități Titan. Distruge-o. Cucerește din nou ce s-a pierdut. +sector.tarFields.description = O zonă aflată la periferia unei zone de producție petrolieră, între munți și deșert. Una din puținele zone cu resurse utilizabile de țiței.\nDeși abandonată, zona aceasta are niște forțe inamice periculoase înapropiere. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului dacă se poate. +sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puțin spațiu. Mare risc de distrugere. Pleacă cât mai curând. Nu te lăsa păcălit de timpul mare dintre atacurile inamice. +sector.nuclearComplex.description = O fostă facilitate pt producerea și procesarea de torium, redusă la ruine.\n[lightgray]Cercetează toriul și multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constând atacatori. +sector.fungalPass.description = O zonă de tranziție dintre munții înalți și zonele joase, pline cu spori. O mică bază de recunoaștere a inamicului este localizată aici.\nDistruge-o.\nFolosește unități Dagger și Crawler. Distruge cele 2 nuclee. + +settings.language = Limbă +settings.data = Datele Jocului +settings.reset = Resetează +settings.rebind = Reatribuie +settings.resetKey = Resetează +settings.controls = Controale +settings.game = Joc +settings.sound = Sunet +settings.graphics = Grafică +settings.cleardata = Șterge Datele Jocului... +settings.clear.confirm = Sigur vrei să ștergi datele?\nCe e făcut nu poate fi desfăcut! +settings.clearall.confirm = [scarlet]Atenție![]\nAsta va șterge toate datele, inclusiv salvări, hărți, deblocări și atribuiri de controale.\nOdată ce apeși 'ok' jocul va șterge toate datele și se va închide automat. +settings.clearsaves.confirm = Sigur vrei să ștergi toate salvările? +settings.clearsaves = Șterge Salvările +paused = [accent]< Pauză > +clear = Curăță +banned = [scarlet]Interzis +unplaceable.sectorcaptured = [scarlet]Ai nevoie de un sector capturat +yes = Da +no = Nu +info.title = Info +error.title = [scarlet]A apărut o eroare. +error.crashtitle = A apărut o eroare. +unit.nobuild = [scarlet]Unitatea nu poate construi. +blocks.input = Necesită +blocks.output = Produs +blocks.booster = Booster +blocks.tiles = Pătrate Necesare +blocks.affinities = Efecte Teren +block.unknown = [lightgray]??? +blocks.powercapacity = Capacitate electrică +blocks.powershot = Electricitate/Glonț +blocks.damage = Deteriorare +blocks.targetsair = Lovește Aeronave +blocks.targetsground = Lovește Artilerie +blocks.itemsmoved = Viteza de Mișcare a Materialelor +blocks.launchtime = Timp între Lansări +blocks.shootrange = Rază +blocks.size = Mărime +blocks.displaysize = Mărimea Monitorului Logic +blocks.liquidcapacity = Capacitate Lichid +blocks.powerrange = Raza Electrică +blocks.linkrange = Raza Legăturilor +blocks.instructions = Instrucțiuni +blocks.powerconnections = Maxim Conexiuni +blocks.poweruse = Consum Electricitate +blocks.powerdamage = Electricitate/Deteriorare +blocks.itemcapacity = Capacitate Materiale +blocks.basepowergeneration = Generare Electricitate (Bază) +blocks.productiontime = Timp Producție +blocks.repairtime = Durata Reparării Blocului +blocks.speedincrease = Creștere Viteză +blocks.range = Rază +blocks.drilltier = Minabile +blocks.drillspeed = Viteză Burghiu (Bază) +blocks.boosteffect = Efect de Boost +blocks.maxunits = Maxim Unități Active +blocks.health = Viață +blocks.buildtime = Timp de Construcție +blocks.maxconsecutive = Maxim Consecutive +blocks.buildcost = Cost de Construcție +blocks.inaccuracy = Inacuratețe +blocks.shots = Lovituri +blocks.reload = Lovituri/Secundă +blocks.ammo = Muniție + +bar.drilltierreq = Burghiu Mai Bun Necesar +bar.noresources = Resurse lipsă +bar.corereq = Plasare pe Nucleu Necesară +bar.drillspeed = Viteză Minare: {0}/s +bar.pumpspeed = Viteză Pompare: {0}/s +bar.efficiency = Eficiență: {0}% +bar.powerbalance = Electricitate: {0}/s +bar.powerstored = Stocată: {0}/{1} +bar.poweramount = Electricitate: {0} +bar.poweroutput = Electricitate Produsă: {0} +bar.items = Materiale: {0} +bar.capacity = Capacitate: {0} +bar.unitcap = {0} {1}/{2} +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.liquid = Lichid +bar.heat = Căldură +bar.power = Electricitate +bar.progress = Progres +bar.input = Necesită +bar.output = Produs + +bullet.damage = [stat]{0}[lightgray] deteriorare +bullet.splashdamage = [stat]{0}[lightgray] zonă deteriorare ~[stat] {1}[lightgray] pătrate +bullet.incendiary = [stat]incendiar +bullet.homing = [stat]cu radar +bullet.shock = [stat]șoc +bullet.frag = [stat]fragil +bullet.knockback = [stat]{0}[lightgray]greu +bullet.freezing = [stat]înghețat +bullet.tarred = [stat]lipicios +bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție +bullet.reload = [stat]{0}[lightgray]x lovituri + +unit.blocks = blocuri +unit.powersecond = electricitate/secundă +unit.liquidsecond = unități lichid/secundă +unit.itemssecond = materiale/secundă +unit.liquidunits = unități lichid +unit.powerunits = electricitate +unit.degrees = grade +unit.seconds = secunde +unit.minutes = minute +unit.persecond = /sec +unit.perminute = /min +unit.timesspeed = x viteză +unit.percent = % +unit.items = materiale +unit.thousands = mii +unit.millions = mil +unit.billions = b +category.general = General +category.power = Electricitate +category.liquids = Lichide +category.items = Materiale +category.crafting = Necesită/Produs +category.shooting = Lovire +category.optional = Îmbunătățiri opționale +setting.landscape.name = Blochează Mod Peisaj +setting.shadows.name = Umbre +setting.blockreplace.name = Sugestii Plasare Automats +setting.linear.name = Filtrare Liniară +setting.hints.name = Indicii +setting.flow.name = Afișează Rata de Curgere a lichidelor +setting.buildautopause.name = Autopauză de la Construit +setting.mapcenter.name = Auto Centrează Harta La Jucător +setting.animatedwater.name = Fluide Animate +setting.animatedshields.name = Scuturi Animate +setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[] +setting.playerindicators.name = Indicatori Jucător +setting.indicators.name = Indicatori Inamic +setting.autotarget.name = Auto-Țintire +setting.keyboard.name = Controale Mouse+Tastatură +setting.touchscreen.name = Controale Touchscreen +setting.fpscap.name = FPS Maxim +setting.fpscap.none = Niciuna +setting.fpscap.text = FPS (0) +setting.uiscale.name = Scară Interfață [lightgray] (repornirea necesară)[] +setting.swapdiagonal.name = Plasează Mereu Diagonal +setting.difficulty.training = Antrenament +setting.difficulty.easy = Ușor +setting.difficulty.normal = Normal +setting.difficulty.hard = Greu +setting.difficulty.insane = Nebunesc +setting.difficulty.name = Dificultate: +setting.screenshake.name = Agitare Ecran +setting.effects.name = Vezi Efectele +setting.destroyedblocks.name = Vezi Blocurile Distruse +setting.blockstatus.name = Vezi Statusul Blocului +setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii +setting.sensitivity.name = Sensibilitatea Controlului +setting.saveinterval.name = Interval de Salvare +setting.seconds = {0} secunde +setting.blockselecttimeout.name = Selectarea Blocului a Întârziat +setting.milliseconds = {0} millisecunde +setting.fullscreen.name = Ecran Complet +setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară) +setting.fps.name = Vezi FPS & Ping +setting.smoothcamera.name = Cameră Graduală +setting.blockselectkeys.name = Vezi Detalii Cheie cu Privire la Selectarea Blocurilor +setting.vsync.name = VSync +setting.pixelate.name = Pixelează +setting.minimap.name = Vezi Miniharta +setting.coreitems.name = Vezi Materialele din Nucleu (neterminat) +setting.position.name = Vezi Poziția Jucătorului +setting.musicvol.name = Volumul Muzicii +setting.atmosphere.name = Vezi Atmosfera Planetelor +setting.ambientvol.name =Volum Ambiental +setting.mutemusic.name = Muzica pe Mut +setting.sfxvol.name = Volum SFX +setting.mutesound.name = Sunetul pe Mut +setting.crashreport.name = Trimite Rapoarte de Crash anonime +setting.savecreate.name = Auto-Creează Salvări +setting.publichost.name = Vizibilitatea Jocurilor Publice +setting.playerlimit.name = Limita Jucătorilor +setting.chatopacity.name = Opacitate Chat +setting.lasersopacity.name = Opacitate Laser Electric +setting.bridgeopacity.name = Opacitate Poduri +setting.playerchat.name = Vezi Chat Temporar +public.confirm = Vrei să îți faci jocul public?\n[accent]Oricine va putea intra în jocurile tale.\n[lightgray]Asta se poate schimba mai târziu în Setări->Joc->Vizibilitatea Jocurilor Publice. +public.beta = De reținut că versiunile beta ale jocului nu poate face servere publice. +uiscale.reset = Scara interfeței a fost schimbată.\nApasă "OK" pt a confirma această scară.\n[scarlet]Revin setările și se iese în [accent] {0}[] secunde... +uiscale.cancel = Anulare și ieșire +setting.bloom.name = Strălucire +keybind.title = Reatribuie Taste +keybinds.mobile = [scarlet]Majoritatea tastelor atribuite aici nu funcționează pe mobil. Doar mișcările direcționale de bază sunt suportate. +category.general.name = General +category.view.name = Privire +category.multiplayer.name = Multiplayer +category.blocks.name = Selectare Bloc +command.attack = Atac +command.rally = Adunare +command.retreat = Retragere +command.idle = Inactiv +placement.blockselectkeys = \n[lightgray]Tastă: [{0}, +keybind.respawn.name = Regenerare +keybind.control.name = Controlează Unități +keybind.clear_building.name = Șterge Clădirea +keybind.press = Apasă o tastă... +keybind.press.axis = Apasă o axă sau o tastă... +keybind.screenshot.name = Captură Hartă +keybind.toggle_power_lines.name = Oprește/Pornește Statusul Electricelor +keybind.toggle_block_status.name = Oprește/Pornește Statusul Blocurilor +keybind.move_x.name = Mergi pe X +keybind.move_y.name = Mergi pe Y +keybind.mouse_move.name = Urmărește Mouseul +keybind.pan.name = Mișcă Harta +keybind.boost.name = Boost +keybind.schematic_select.name = Selectează Regiunea +keybind.schematic_menu.name = Meniu Scheme +keybind.schematic_flip_x.name = Întoarce Schema X +keybind.schematic_flip_y.name =Întoarce Schema Y +keybind.category_prev.name = Categoria precedentă +keybind.category_next.name = Categoria următoare +keybind.block_select_left.name = Selectează Bloc Stânga +keybind.block_select_right.name = Selectează Bloc Dreapta +keybind.block_select_up.name = Selectează Bloc Sus +keybind.block_select_down.name = Selectează Bloc Jos +keybind.block_select_01.name = Categorie 1 +keybind.block_select_02.name = Categorie 2 +keybind.block_select_03.name = Categorie 3 +keybind.block_select_04.name = Categorie 4 +keybind.block_select_05.name = Categorie 5 +keybind.block_select_06.name = Categorie 6 +keybind.block_select_07.name = Categorie 7 +keybind.block_select_08.name = Categorie 8 +keybind.block_select_09.name = Categorie 9 +keybind.block_select_10.name = Categorie 10 +keybind.fullscreen.name = Ecran Complet +keybind.select.name = Selectează/Trage +keybind.diagonal_placement.name = Plasare Diagonală +keybind.pick.name = Ia Bloc +keybind.break_block.name = Distruge Bloc +keybind.deselect.name = Deselectează +keybind.shoot.name = Trage +keybind.zoom.name = Zoom +keybind.menu.name = Meniu +keybind.pause.name = Pauză +keybind.pause_building.name = Pauză/Reia Construit +keybind.minimap.name = Minihartă +keybind.chat.name = Chat +keybind.player_list.name = Listă Jucători +keybind.console.name = Consolă +keybind.rotate.name = Rotește +keybind.rotateplaced.name = Rotește Existent (Ține) +keybind.toggle_menus.name = Pornește/Oprește Meniuri +keybind.chat_history_prev.name = Previzualizare Istoric Chat +keybind.chat_history_next.name = Chat History Next +keybind.chat_scroll.name = Scroll Chat +keybind.drop_unit.name = Lasă Unitatea +keybind.zoom_minimap.name = Zoom Minihartă +mode.help.title = Descrierea modurilor +mode.survival.name = Supraviețuire +mode.survival.description = Modul normal. Resurse limitate și valuri automate.\n[gray]E nevoie de locuri de lansare a inamicilor pt a juca. +mode.sandbox.name = Sandbox +mode.sandbox.description = Resurse infinite și fără ceas pt valuri. +mode.editor.name = Editor +mode.pvp.name = PvP +mode.pvp.description = Luptă împotriva altor jucători local.\n[gray]E nevoie de 2 nuclee colorate diferit pe hartă pt a juca. +mode.attack.name = Atac +mode.attack.description = Distruge baza inamicului. \n[gray]E nevoie de un nucleu roșu pe hartă pt a juca. +mode.custom = Reguli Personalizate + +rules.infiniteresources = Resurse Infinite +rules.reactorexplosions = Explozia Reactoarelor +rules.wavetimer = Valuri pe Timp +rules.waves = Valuri +rules.attack = Modul Atac +rules.enemyCheat = Resurse infinite pt AI (echipa roșie) +rules.buildai = AI-ul Construiește +rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor +rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor +rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților +rules.unithealthmultiplier = Multiplicatorul Vieții Unităților +rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților +rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) +rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec) +rules.buildcostmultiplier = Multiplicatorul Costului Construcției +rules.buildspeedmultiplier = Multiplicatorul Vitezei de Construcție +rules.deconstructrefundmultiplier = Multiplicatorul Recompensei la Deconstrucție +rules.waitForWaveToEnd = Valurile Așteaptă Inamicii +rules.dropzoneradius = Raza Zonei de Lansare:[lightgray] (pătrate) +rules.unitammo = Unitățile Necesită Muniție +rules.title.waves = Valuri +rules.title.resourcesbuilding = Resurse și Construit +rules.title.enemy = Inamici +rules.title.unit = Unități +rules.title.experimental = Experimental +rules.title.environment = Mediu +rules.lighting = Luminozitate +rules.fire = Foc +rules.explosions = Explozia Deteriorează Blocul/Unitatea +rules.ambientlight = Ambient +rules.weather = Vreme +rules.weather.frequency = Frevență: +rules.weather.duration = Durată: + +content.item.name = Materiale +content.liquid.name = Lichide +content.unit.name = Unități +content.block.name = Blocuri +item.copper.name = Cupru +item.lead.name = Plumb +item.coal.name = Cărbune +item.graphite.name = Grafit +item.titanium.name = Titan +item.thorium.name = Toriu +item.silicon.name = Silicon +item.plastanium.name = Plastaniu +item.phase-fabric.name = Material de Fază +item.surge-alloy.name = Aliaj de Supratensiune +item.spore-pod.name = Păstaie de Spori +item.sand.name = Nisip +item.blast-compound.name = Compus Explozibil +item.pyratite.name = Piratită +item.metaglass.name = Metasticlă +item.scrap.name = Fier Vechi +liquid.water.name = Apă +liquid.slag.name = Zgură +liquid.oil.name = Petrol +liquid.cryofluid.name = Criofluid +item.explosiveness = [lightgray]Explozivitate: {0}% +item.flammability = [lightgray]Inflamabilitate: {0}% +item.radioactivity = [lightgray]Radioactivitate: {0}% +unit.health = [lightgray]Viață: {0} +unit.speed = [lightgray]Viteză: {0} +unit.weapon = [lightgray]Armă: {0} +unit.itemcapacity = [lightgray]Capacitatea de Material: {0} +unit.minespeed = [lightgray]Viteza de Minare: {0}% +unit.minepower = [lightgray]Puterea Minării: {0} +unit.ability = [lightgray]Abilitate: {0} +unit.buildspeed = [lightgray]Viteza de Construcție: {0}% + +liquid.heatcapacity = [lightgray]Capacitatea de Căldură: {0} +liquid.viscosity = [lightgray]Vâscozitatea: {0} +liquid.temperature = [lightgray]Temperatura: {0} + +unit.dagger.name = Dagger +unit.mace.name = Mace +unit.fortress.name = Fortress +unit.nova.name = Nova +unit.pulsar.name = Pulsar +unit.quasar.name = Quasar +unit.crawler.name = Crawler +unit.atrax.name = Atrax +unit.spiroct.name = Spiroct +unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid +unit.flare.name = Flare +unit.horizon.name = Horizon +unit.zenith.name = Zenith +unit.antumbra.name = Antumbra +unit.eclipse.name = Eclipse +unit.mono.name = Mono +unit.poly.name = Poly +unit.mega.name = Mega +unit.risso.name = Risso +unit.minke.name = Minke +unit.bryde.name = Bryde +unit.alpha.name = Alpha +unit.beta.name = Beta +unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign + +block.resupply-point.name = Punct de Realimentare +block.parallax.name = Parallax +block.cliff.name = Deal +block.sand-boulder.name = Bolovan de Nisip +block.grass.name = Iarbă +block.slag.name = Zgură +block.salt.name = Sare +block.salt-wall.name = Perete de Sare +block.pebbles.name = Pietricele +block.tendrils.name = Cârcei +block.sand-wall.name = Perete de Nisip +block.spore-pine.name = Pom de Spori +block.spore-wall.name = Perete de Spori +block.boulder.name = Bolovan +block.snow-boulder.name = Bolovan de Zăpadă +block.snow-pine.name = Pom de Gheață +block.shale.name = Șist +block.shale-boulder.name = Piatră de Șist +block.moss.name = Mușchi +block.shrubs.name = Tufișuri +block.spore-moss.name = Mușchi de Spori +block.shale-wall.name = Perete de Șist +block.scrap-wall.name = Perete de Fier Vechi +block.scrap-wall-large.name = Perete Mare de Fier Vechi +block.scrap-wall-huge.name = Perete Uriaș de Fier Vechi +block.scrap-wall-gigantic.name = Perete Gigantic de Fier Vechi +block.thruster.name = Propulsor +block.kiln.name = Cuptor +block.graphite-press.name = Presă de Grafit +block.multi-press.name = Multi-Presă +block.constructing = {0} [lightgray](În Construcție) +block.spawn.name = Punctul de Lansare Inamic +block.core-shard.name = Nucleu: Shard +block.core-foundation.name = Nucleu: Foundation +block.core-nucleus.name = Nucleu: Core +block.deepwater.name = Apă Adâncă +block.water.name = Apă +block.tainted-water.name = Apă Tulbure +block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru +block.tar.name = Păcură +block.stone.name = Piatră +block.sand.name = Nisip +block.darksand.name = Nisip Negru +block.ice.name = Gheață +block.snow.name = Zăpadă +block.craters.name = Cratere +block.sand-water.name = Apă cu Nisip +block.darksand-water.name = Apă cu Nisip Negru +block.char.name = Turbă +block.dacite.name = Dacit +block.dacite-wall.name = Perete de Dacit +block.ice-snow.name = Gheață Înzăpezită +block.stone-wall.name = Perete de Piatră +block.ice-wall.name = Perete de Gheață +block.snow-wall.name = Perete de Zăpadă +block.dune-wall.name = Perete Dună +block.pine.name = Pom +block.dirt.name = Pământ +block.dirt-wall.name = Perete de Pământ +block.white-tree-dead.name = Pom Alb Mort +block.white-tree.name = Pom Alb +block.spore-cluster.name = Grup de Spori +block.metal-floor.name = Podea de Metal 1 +block.metal-floor-2.name = Podea de Metal 2 +block.metal-floor-3.name = Podea de Metal 3 +block.metal-floor-5.name = Podea de Metal 4 +block.metal-floor-damaged.name = Podea de Metal Deteriorată +block.dark-panel-1.name = Panou Negru 1 +block.dark-panel-2.name = Panou Negru 2 +block.dark-panel-3.name = Panou Negru 3 +block.dark-panel-4.name = Panou Negru 4 +block.dark-panel-5.name = Panou Negru 5 +block.dark-panel-6.name = Panou Negru 6 +block.dark-metal.name = Metal Negru +block.basalt.name = Bazalt +block.hotrock.name = Piatră Caldă +block.magmarock.name = Piatră cu Magmă +block.cliffs.name = Dealuri +block.copper-wall.name = Perete de Cupru +block.copper-wall-large.name = Perete Mare de Cupru +block.titanium-wall.name = Perete de Titan +block.titanium-wall-large.name = Perete Mare de Titan +block.plastanium-wall.name = Perete de Plastaniu +block.plastanium-wall-large.name = Perete Mare de Plastaniu +block.phase-wall.name = Perete de Fază +block.phase-wall-large.name = Perete Mare de Fază +block.thorium-wall.name = Perete de Toriu +block.thorium-wall-large.name = Perete Mare de Toriu +block.door.name = Ușă +block.door-large.name = Ușă Mare +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Bandă +block.titanium-conveyor.name = Bandă de Titan +block.plastanium-conveyor.name = Bandă de Plastaniu +block.armored-conveyor.name = Bandă Armată +block.armored-conveyor.description = Cară materialele la aceeași viteză ca benzile de titan, dar posedă o armură. Nu acceptă materiale de pe lateral decât de la alte benzi armate. +block.junction.name = Intersecție +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sortator +block.inverted-sorter.name = Sortator Invers +block.message.name = Mesaj +block.illuminator.name = Iluminator +block.illuminator.description = O sursă de lumină mică, compactă, configurabilă. Necesită electricitate pt a funcționa. +block.overflow-gate.name = Poartă de Revărsare +block.underflow-gate.name = Poartă de Subversare +block.silicon-smelter.name = Topitor de Silicon +block.phase-weaver.name = Țesătorie de Fază +block.pulverizer.name = Pulverizator +block.cryofluidmixer.name = Mixer de Criofluid +block.melter.name = Topitor +block.incinerator.name = Incinerator +block.spore-press.name = Presă de Spori +block.separator.name = Separator +block.coal-centrifuge.name = Centifugă de Cărbune +block.power-node.name = Nod Electric +block.power-node-large.name = Nod Electric Mare +block.surge-tower.name = Turn de Supratensiune +block.diode.name = Diodă de Baterie +block.battery.name = Baterie +block.battery-large.name = Baterie Mare +block.combustion-generator.name = Generator pe Combustie +block.steam-generator.name = Generator pe Abur +block.differential-generator.name = Generator Diferențial +block.impact-reactor.name = Reactor de Impact +block.mechanical-drill.name = Burghiu Mecanic +block.pneumatic-drill.name = Burghiu Pneumatic +block.laser-drill.name = Burghiu cu Laser +block.water-extractor.name = Extractor de Apă +block.cultivator.name = Cultivator +block.conduit.name = Conductă +block.mechanical-pump.name = Pompă Mecanică +block.item-source.name = Sursă de Material +block.item-void.name = Portal de Material +block.liquid-source.name = Sursă de Lichid +block.liquid-void.name = Portal de Lichid +block.power-void.name = Consumator de Electricitate +block.power-source.name = Electricitate Infinită +block.unloader.name = Descărcător +block.vault.name = Seif +block.wave.name = Wave +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Bandă de Fază +block.bridge-conveyor.name = Pod de Bandă +block.plastanium-compressor.name = Compresor de Plastaniu +block.pyratite-mixer.name = Mixer de Piratită +block.blast-mixer.name = Mixer de Explozibil +block.solar-panel.name = Panou Solar +block.solar-panel-large.name = Panou Solar Mare +block.oil-extractor.name = Extractor de Petrol +block.repair-point.name = Punct de Reparare +block.pulse-conduit.name = Conductă cu Puls +block.plated-conduit.name = Conductă Armată +block.phase-conduit.name = Conductă de Fază +block.liquid-router.name = Router de Lichid +block.liquid-tank.name = Rezervor de Lichid +block.liquid-junction.name = Intersecție de Lichid +block.bridge-conduit.name = Pod de Conductă +block.rotary-pump.name = Pompă Rotativă +block.thorium-reactor.name = Reactor de Toriu +block.mass-driver.name = Distributor în Masă +block.blast-drill.name = Burghiu Tornadă +block.thermal-pump.name = Pompă Termală +block.thermal-generator.name = Generaor Termal +block.alloy-smelter.name = Topitorie Aliaj +block.mender.name = Reparator +block.mend-projector.name = Proiector de Reparare +block.surge-wall.name = Perete de Aliaj +block.surge-wall-large.name = Perete Mare de Aliaj +block.cyclone.name = Ciclon +block.fuse.name = Fuse +block.shock-mine.name = Mină cu Șocuri +block.overdrive-projector.name = Proiector de Suprasolicitare +block.force-projector.name = Proiector de Forță +block.arc.name = Arc +block.rtg-generator.name = Generator RTG +block.spectre.name = Specter +block.meltdown.name = Meltdown +block.container.name = Container +block.launch-pad.name = Platformă de Lansare +block.launch-pad-large.name = Platformă de Lansare Mare +block.segment.name = Segment +block.command-center.name = Centru de Comandă +block.ground-factory.name = Fabrică Unități Artilerie +block.air-factory.name = Fabrică Unități Aeriene +block.naval-factory.name = Fabrică Unități Navale +block.additive-reconstructor.name = Reconstructor Aditiv +block.multiplicative-reconstructor.name = Reconstructor Multiplicativ +block.exponential-reconstructor.name = Reconstructor Exponențial +block.tetrative-reconstructor.name = Reconstructor Tetrativ +block.payload-conveyor.name = Bandă în Masă +block.payload-router.name = Router în Masă +block.disassembler.name = Dezasamblator +block.silicon-crucible.name = Creuzet de Silicon +block.overdrive-dome.name = Dom de Suprasolicitare + +block.switch.name = Întrerupător +block.micro-processor.name = Microprocesor +block.logic-processor.name = Procesor Logic +block.hyper-processor.name = Hyperprocesor +block.logic-display.name = Monitor Logic +block.large-logic-display.name = Monitor Logic Mare +block.memory-cell.name = Celulă de Memorie + +team.blue.name = albastră +team.crux.name = roșie +team.sharded.name = portocalie +team.orange.name = portocalie +team.derelict.name = abandon +team.green.name = verde +team.purple.name = mov + +tutorial.next = [lightgray] +tutorial.intro = Bun venit în[scarlet] Tutorialul Mindustry.[]\nFolosește[accent] [[WASD][] ca să te miști.\n[accent]Cu rotița[] poți face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru +tutorial.intro.mobile = Bun venit în[scarlet] Tutorialul Mindustry.[]\nGlisează pe ecran pt a te mișca.\n[accent]Trage cu 2 degete[] pt face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru +tutorial.drill = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click.\nPoți selecta burghiul și apăsând [accent][[2][] apoi rapid [accent][[1][], indiferent de ce tab este deschis.\n[accent]Click-dreapta[] ca să te oprești din a construi. +tutorial.drill.mobile = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click, apoi apasă pe[accent] bifa[] de mai jos pt a-ți confirma selecția.\nApasă pe[accent] butonul X[] pt a anula plasarea. +tutorial.blockinfo = Fiecare bloc are statistici diferite. Fiecare burghiu poate mina minereuri diferite.\nPt a verifica informațiile despre un bloc,[accent] dă click pe butonul "?" care apare când blocul este selectat din meniu.[]\n\n[accent]Accesează informații despre Burghiul Mecanic.[] +tutorial.conveyor = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent]Ține apăsat pe mouse pt a desena o linie.[]\nȚine[accent] CTRL[] în timp se plasezi o line pt a o plasa diagonal.\nFolosește rotița pt a roti blocurile înainte să le plasezi.\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. +tutorial.conveyor.mobile = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent] Construiește o linie ținând degetul pe ecran câteva secunde și apoi[] trage într-o direcție.\n\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. +tutorial.turret = Odată ce un material intră în nucleu, poate fi folosit pt a construi.\nDe reținut că nu toate materialele pot fi folosite pt construit.\nMaterialele care nu sunt folosite pt construit, cum ar fi[accent] cărbunele[] sau[accent] fierul vechi[], nu pot fi puse în nucleu.\nTrebuie să construiești structuri defensive ca să te aperi de[lightgray] inamici[].\nConstruiește [accent]o armă duo[] lângă baza ta. +tutorial.drillturret = Armele Duo au nevoie de[accent] muniție de cupru[] pt a trage.\nPlasează un burghiu lângă armă.\nConstruiește o bandă către armă pt a o alimenta cu muniție de cupru.\n\n[accent]Muniție livrată: 0/1 +tutorial.pause = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă pe space pt a da pauză. +tutorial.pause.mobile = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă butonul din colțul din stânga sus pt a da pauză. +tutorial.unpause = Acum apasă space din nou pt a continua. +tutorial.unpause.mobile = Acum apasă-l din nou pt a continua. +tutorial.breaking = Uneori, blocurile trebuie distruse.\n[accent]Ține apăsat pe click dreapta[] pt a distruge toate blocurile dintr-o selecție.[]\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. +tutorial.breaking.mobile = Uneori, blocurile trebuie distruse.\n[accent]Selectează modul deconstrucție[], aopi dă click pe un bloc pt a-l distruge.\nDistruge o zonă ținând apăsat cu degetul pt câteva secunde[] și apoi trăgând într-o direcție.\nApasă bifa de mai jos pt a confirma distrugerea.\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. +tutorial.withdraw = Câteodată a lua materiale direct din blocuri este necesar.\nPt a face asta, [accent]dă click pe un bloc[] cu materiale în el, apoi [accent]dă click pe materialul[] din inventar.\nMai multe materiale pot fi luate [accent]făcând click și ținând apăsat[].\n\n[accent]Ia niște cupru din nucleu.[] +tutorial.deposit = Depozitează materiale înapoi în blocuri trăgând din nava ta către blocul de destinație.\n\n[accent]Depozitează cuprul înapoi în nucleu.[] +tutorial.waves = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri.[accent] Click[] pt a trage cu arma.\nConstruiește mai multe arme și burghie. Minează mai mult cupru. +tutorial.waves.mobile = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri. Nava ta va trage automat către inamici.\nConstruiește mai multe arme și burghie. Minează mai mult cupru. +tutorial.launch = Odată ce ajungi la un anumit val, poți [accent]lansa nucleul[], lăsându-ți apărările în urmă și[accent] obținând toate resursele din nucleu.[]\nResursele obținute pot fi apoi folosite pt a cerceta noi tehnologii.\n\n[accent]Apasă butonul de lansare. + +item.copper.description = Materialul structural cel mai de bază. Folosit în mod extensiv în toate tipurile de blocuri. +item.lead.description = Un material de bază. Folosit în mod extensiv în electronice și blocuri transportoare de lichid. +item.metaglass.description = Un compus de sticlă super rezistent. Folosit în mod extensiv pt distribuirea și stocarea de lichide. +item.graphite.description = Carbon mineralizat, folosit pt muniție și componente electrice. +item.sand.description = Un material des întâlnit care se folosește extensiv în topitorii, în special pt aliaje. +item.coal.description = Materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. Folosit extensiv ca combustibil și pt producerea de resurse. +item.titanium.description = Un metal rar și super ușor folosit extensiv pt transportul lichidelor, burghie și aeronautică. +item.thorium.description = Un metal dens, radioactiv, folosit ca suport structural și combustibil nuclear. +item.scrap.description = Rămășițe ale structurilor și unităților vechi. Conține urme ale multor metale diferite. +item.silicon.description = Un semiconductor extrem de folositor. Aplicații în energia solară, electronice complexe și muniție cu radar. +item.plastanium.description = Un material ușor, flexibil folosit în aeronautica avansată și muniție fragilă. +item.phase-fabric.description = O substanță cu greutate aproape de 0 folosită în electronica avansată și tehnologia de autoreparare. +item.surge-alloy.description = Un aliaj avansat cu proprietăți electrice unice. +item.spore-pod.description = O păstaie de spori, sintetizați din concentrațiile atmosferice pt utilizări industriale. Folosit pt a fi convertit în petrol, explozibili și combustibil. +item.blast-compound.description = Un compus instabil folosit în bombe și explozibili. Sintetizat din păstăile de spori și alte materiale volatile. Folosirea ca combustibil nu e recomandată. +item.pyratite.description = O substanță extrem de inflamabilă folosită în armele incendiare. +liquid.water.description = Cel mai util lichid. Folosit deseori pt răcirea mașinăriilor și procesarea deșeurilor. +liquid.slag.description = Diferite tipuri de metal topit amestacate laolaltă. Poate fi separat în materialele constituente, sau pulverizat înspre unitățile inamice ca armă. +liquid.oil.description = Un lichid folosit în producerea de materiale avansate. Poate fi convertit în cărbune pt combustibil, sau pulverizat și ars ca armă. +liquid.cryofluid.description = Un lichid inert, non coroziv creat din apă și titan. Are o capacitate de absorbție a căldurii mare. Folosit în mod extensiv ca răcitor. + +block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați. +block.graphite-press.description = Compresează bucăți de cărbune în plăci de grafit pur. +block.multi-press.description = O versiune mai bună a presei de grafit. Folosește apă și electricitate pt a procesa cărbunele rapid și eficient. +block.silicon-smelter.description = Transformă nisipul și cărbunele pur. Produce silicon. +block.kiln.description = Toarnă nisip și plumb în compusul numit metasticlă. Neciesită puțină electricitate pt pornire. +block.plastanium-compressor.description = Produce plastaniu din petrol și titan. +block.phase-weaver.description = Sintetizează material de fază din toriu radioactiv și nisip. Necesită electricitate pt a funcționa. +block.alloy-smelter.description = Combină titan, plumb, silicon și cupru pt a produce aliaj de supratensiune. +block.cryofluidmixer.description = Amestecă apă și pudră fină de titan în criofluid. Esențial pt folosirea în reactoarele de toriu. +block.blast-mixer.description = Zdrobește și amestecă gramezi de spori cu piratită pt a produce compus explozibil. +block.pyratite-mixer.description = Amestecă niște cărbune, plumb și nisip în inflamabila piratită. +block.melter.description = Topește fierul vechi în zgură pt procesare ulterioară sau folosire în armele Wave. +block.separator.description = Separă zgura în componentele sale minerale. Furnizează rezultatul răcit. +block.spore-press.description = Compresează păstăi de spori sub presiuni extreme pt a sintetiza petrol. +block.pulverizer.description = Zdrobește fierul vechi în nisip fin. +block.coal-centrifuge.description = Solidifică petrolul în bucăți de cărbune. +block.incinerator.description = Vaporizează orice exces de material sau lichid primește. +block.power-void.description = Consumă toată electricitatea primită. Doar în modul sandbox. +block.power-source.description = Generează electricitate infinită. Doar în modul sandbox. +block.item-source.description = Generează materiale la infinit. Doar în modul sandbox. +block.item-void.description = Distruge orice material. Doar în modul sandbox. +block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox. +block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox. +block.copper-wall.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul și armele în primele valuri. +block.copper-wall-large.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul și armele în primele valuri.\nSe întinde pe mai multe pătrate. +block.titanium-wall.description = Un perete defensiv de rezistență moderată.\nFurnizează protecție moderată împotriva inamicilor. +block.titanium-wall-large.description = Un perete defensiv de rezistență moderată.\nFurnizează protecție moderată împotriva inamicilor. \nSe întinde pe mai multe pătrate. +block.plastanium-wall.description = Un tip special de perete care absoarbe laserele electrice și blochează conectarea automată a nodurilor electrice. +block.plastanium-wall-large.description = Un tip special de perete care absoarbe laserele electrice și blochează conectarea automată a nodurilor electrice.\nSe întinde pe mai multe pătrate. +block.thorium-wall.description = Un perete defenziv puternic. \nProtecție decentă împotriva inamicilor. +block.thorium-wall-large.description = Un perete defenziv puternic. \nProtecție decentă împotriva inamicilor.\nSe întinde pe mai multe pătrate. +block.phase-wall.description = Un perete învelit într-un material reflexiv special bazat pe material de fază. Reflectă majoritatea gloanțelor la impact. +block.phase-wall-large.description = Un perete învelit într-un material reflexiv special bazat pe material de fază. Reflectă majoritatea gloanțelor la impact.\nSe întinde pe mai multe pătrate. +block.surge-wall.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanțele, lansând-o la întâmplare. +block.surge-wall-large.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanțele, lansând-o la întâmplare.\nSe întinde pe mai multe pătrate. +block.door.description = O ușă mică. Poate fi deschisă sau închisă dând click. +block.door-large.description = O ușă mare. Poate fi deschisă sau închisă dând click.\nSe întinde pe mai multe pătrate. +block.mender.description = Repară periodic blocurile din vecinătate. Menține apărările în stare bună între valuri.\nPoate folosi silicon pt un boost al razei de acțiune și al eficienței. +block.mend-projector.description = O versiune mai bună a reparatorului. Repară periodic blocurile din vecinătate. \nPoate folosi material de fază pt un boost al razei de acțiune și al eficienței. +block.overdrive-projector.description = Grăbește blocurile din apropiere.\nPoate folosi material de fază pt un boost al razei de acțiune și al eficienței. +block.force-projector.description = Creează un câmp de forță hexagonal în jurul său, protejând blocurile și unitățile din interior de deteriorare.\nSe supraîncălzește dacă este prea deteriorat. Poate folosi răcitor pt a preveni supraîncălzirea pt a preveni supraîncălzirea. Materialul de fază poate fi folosit pt a crește mărimea scutului. +block.shock-mine.description = Lovește inamicii care calcă pe ea. Aproape invizibilă pt inamic. +block.conveyor.description = Bloc de transport al materialelor. Împinge materialele în față și le depozitează automat în blocuri. Poate fi rotită. +block.titanium-conveyor.description = Bloc avansat de transport al materialelor. Împinge materialele mai rapid decât blocurile standard. +block.plastanium-conveyor.description = Împingee grămezi de materiale.\nAcceptă materiale din spate, și le descarcă în 3 direcții în față.\nNecesită mai multe puncte de încărcare și descărcare pt a transporta nr maxim de materiale/secundă. +block.junction.description = Acționează ca un pod pt două benzi care se intersectează. Util în situații în care se intersectează 2 benzi cărând diverse materiale în diferite locații. +block.bridge-conveyor.description = Bloc avansat de transport al materialelor. Permite transportul materialelor peste orice teren sau clădire, până la 3 pătrate distanță. +block.phase-conveyor.description = Bloc avansat de transport al materialelor. Folosește electricitate pt a teleporta materialele la o altă bandă de fază peste mai multe pătrate. +block.sorter.description = Sortează materialele. Dacă un material se potrivește selecției, este lăsat să treacă. Altfel, materialul este transportat la stânga sau la dreapta. +block.inverted-sorter.description = Procesează materialele ca un sortator standard, dar materialele selectate sunt transportate la stânga sau la dreapta. +block.router.description = Acceptă materiale, apoi le distribuie în alte 3 direcții în mod egal. Util pt a împărți materialele de la o sursă către mai multe destinații.\n\n[scarlet]Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produșii blocurilor.[] +block.distributor.description = Un router avansat. Împarte materialele în alte 7 direcții în mod egal. +block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat. +block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate. +block.mass-driver.description = Cel mai bun bloc de transport al materialelor. Adună mai multe materiale și apoi le lansează până la un alt distributor în masă pe o rază mare. Necesită electricitate pt a opera. +block.mechanical-pump.description = O pompă ieftină care pompează puțin, dar nu consumă electricitate. +block.rotary-pump.description = O pompă avansată. Pompează mai mult lichid dar consumă electricitate. +block.thermal-pump.description = Cea mai bună pompă. +block.conduit.description = Un bloc de transport al lichidelor. Împinge lichidele în față. Folosit cu pompe și alte conducte. +block.pulse-conduit.description = Un bloc avansat de transport al lichidelor. Transportă lichidele mai rapid și stochează mai mult decât conductele standard. +block.plated-conduit.description = Transportă lichidele lafel de rapid precum conductele cu puls, dar este mai rezistent. Nu acceptă fluide din lateral de la altceva în afară de conducte.\nCurge mai puțin. +block.liquid-router.description = Acceptă lichide dintr-o direcție și le distribuie în alte 3 direcții în mod egal. Poate stoca o anumită cantitate de lichid. Folositor pt a distribui lichidele dintr-o sursă către mai multe destinații. +block.liquid-tank.description = Stochează o mare cantitate de lichid. Util pt depozita lichide pt situațiile în care cererea de materiale nu e constantă sau ca extra securitate pt răcirea blocurilor vitale. +block.liquid-junction.description = Acționează ca un pod pt două conducte care se intersectează. Util în situația în care 2 conducte diferite cară divesre lichide către diverse locații. +block.bridge-conduit.description = Un bloc avansat de transport al lichidelor. Permite transportul lichidelor peste orice tip teren sau bloc, până la 3 pătrate distanță. +block.phase-conduit.description = Un bloc avansat de transport al lichidelor. Folosește electricitate pt a teleporta lichidele către o altă conductă de fază la o mare distanță. +block.power-node.description = Transmite electricitate către nodurile conectate. Nodul primește electricitate din sau oferă electricitate oricăror blocuri adiacente. +block.power-node-large.description = Un nod electric avansat cu o rază mare. +block.surge-tower.description = Un nod electric cu o rază extrem de mare dar cu mai puține conexiuni disponibile. +block.diode.description = Energia din baterii poate trece prin acest bloc doar într-o direcție, dar doar dacă o parte are mai puțină energie stocată. +block.battery.description = Stochează electricitatea pt rezerve atunci când există un surplus în rețea. Oferă electricitate atunci când există un deficit. +block.battery-large.description = Stochează mai multă electricitate decât bateria standard. +block.combustion-generator.description = Generează electricitate arzând materiale inflamabile, precum cărbunele. +block.thermal-generator.description = Generează electricitate când este plasat în locuri calde. +block.steam-generator.description = Un generator de combustie avansat. Mai eficient, dar necesită apă pt a genera abur. +block.differential-generator.description = Generează mari cantități de electricitate. Utilizează diferența de temperatură dintre criofluid și piratită arzând. +block.rtg-generator.description = Un generator simplu pe care te poți baza. Folosește căldura materialelor radioactive care se dezintegrează pt a produce încet electricitate. +block.solar-panel.description = Oferă o cantitate mică de energie solară. +block.solar-panel-large.description = O versiune cu mult mai eficientă a panoului solar standard. +block.thorium-reactor.description = Generează mari cantități de electricitate din toriu. Necesită răcire constantă. Explodează violent dacă i se oferă cantități insuficiente de răcitor. Electricitatea produsă depinde de cât de plin e, cu electricitatea de bază produsă la capacitate maximă. +block.impact-reactor.description = Un generator avansat, capabil să creeze cantități masive de electricitate la eficiențî maximă. Are nevoie de o cantitate de electricitate pt a începe procesul. +block.mechanical-drill.description = Un burghiu ieftin. Odată plasat pe blocurile corezpunzătoare, minează încet materiale. Capabil să mineze materiale de bază. +block.pneumatic-drill.description = Un burghiu îmbunătățit, capabil să mineze titan. Minează mai rapid decât burghiul mecanic. +block.laser-drill.description = Poate mina mai rapid pirn tehnologia bazată pe laser, dar necesită electricitate. Poate mina toriu. +block.blast-drill.description = Cel mai bun burghiu. Necesită cantități mari de electricitate. +block.water-extractor.description = Extrage apă din pământ. Folosit în locații unde apa de suprafață nu este disponibilă. +block.cultivator.description = Cultivă mici concentrații de spori din atmosferă în păstăi pregătite pt procesare industrială. +block.oil-extractor.description = Folosește mari cantități de electricitate, nisip și apă pt a extrage petrol. +block.core-shard.description = Prima versiune a capsulei nucleice. Odată distrusă, orice contact cu regiunea se pierde. Nu lăsa asta să se întâmple. +block.core-foundation.description = A doua versiune a nucleului. Mai bine armat. Stochează mai multe resurse. +block.core-nucleus.description = A treia și ultima versiune a capsulei nucleice. Extrem de bine armată. Stochează mari cantități de resurse. +block.vault.description = Stochează o mare cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din seif. +block.container.description = Stochează o mică cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din container. +block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puțin cele de transport. Tipul materialului de descărcat poate fi schimbat. Click pe descărcător. +block.launch-pad.description = Lansează grămezi de materiale fără a fi nevoie să lansezi nucleul. +block.launch-pad-large.description = O versiune mai bună a platformei de lansare. Stochează mai multe materiale. Lansează mai frecvent. +block.duo.description = O armă mică, ieftină. Util împotriva unităților de artilerie. +block.scatter.description = O armă esențială anti aeronave. Aruncă bucățele de plumb, fier vechi sau metasticlă către inamici. +block.scorch.description = Arde orice artilerie inamică din apropiere. Mai eficient la distanță mică. +block.hail.description = O armă anti-artilerie mică, care trage la mari distanțe. +block.wave.description = O armă medie. Trage cu lichid către inamici. Extinde focul automat când este alimentată cu apă. +block.lancer.description = O armă anti-artilerie medie, cu laser. Se încarcă și trage cu lasere puternice de electricitate. +block.arc.description = O armă electrică cu o rază de acțiune mică. Trage cu mici lasere de electricitate către inamici. +block.swarmer.description = O armă medie cu rachete. Atacă atât artileria cât și navele inamice. Trage cu rachete cu radar. +block.salvo.description = O versiune mai mare, mai avansată a armei Duo. Trage salve rapide de gloanțe către inamici. +block.fuse.description = O armă șrapnel mare cu rază de acțiune mică. Trage trei raze de gloanțe care găuresc scuturile inamicilor din apropiere. +block.ripple.description = O armă de artilerie extrem de puternică. Lovește grămezi de bucăți de material înspre inamici pe distanțe mari. +block.cyclone.description = O mare armă anti-artilerie și anti-aer. Trage cu grămezi explozive de material către unitățile inamice. +block.spectre.description = O armă masivă cu două țevi. Trage cu gloanțe mari care găuresc armurile țintelor aeriene și artileriei. +block.meltdown.description = O armă cu laser masivă. Trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. +block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. +block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index a375e4ebb7..2164aa4a51 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -20,7 +20,7 @@ gameover = Игра окончена gameover.pvp = [accent]{0}[] команда победила! highscore = [accent]Новый рекорд! 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.map = Карты @@ -114,6 +114,7 @@ mod.disable = Выкл. mod.content = Содержимое: mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0} +mod.outdated = [scarlet]Не совместим с V6 (нет "min-game-version: 105") mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.erroredcontent = [scarlet]Ошибки содержимого mod.errors = Ошибки были вызваны загружаемым содержимым. @@ -126,9 +127,9 @@ mod.import = Импортировать модификацию mod.import.file = Импортировать файл mod.import.github = Импортировать мод с GitHub mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника! -mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. +mod.item.remove = Этот предмет является частью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Эта модификация будет удалена. -mod.author = [lightgray]Автор:[] {0} +mod.author = [lightgray]Автор(ы):[] {0} mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова. mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. @@ -137,6 +138,8 @@ mod.scripts.disable = Ваше устройство не поддерживае about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. +planetmap = Карта планеты +launchcore = Запуск ядра filename = Имя файла: unlocked = Новый контент разблокирован! 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"[]. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей -hostserver.mobile = Запустить\nсервер +hostserver.mobile = Запустить сервер host = Открыть сервер hosting = [accent]Открытие сервера… hosts.refresh = Обновить @@ -506,7 +509,14 @@ error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. 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.craters.name = Кратеры sector.frozenForest.name = Ледяной лес @@ -574,8 +584,11 @@ blocks.itemsmoved = Скорость перемещения blocks.launchtime = Интервал запусков blocks.shootrange = Радиус действия blocks.size = Размер +blocks.displaysize = Размер дисплея blocks.liquidcapacity = Вместимость жидкости blocks.powerrange = Дальность передачи энергии +blocks.linkrange = Дальность связи +blocks.instructions = Инструкции blocks.powerconnections = Количество соединений blocks.poweruse = Потребляет энергии blocks.powerdamage = Энергия/урон @@ -591,6 +604,7 @@ blocks.boosteffect = Ускоряющий эффект blocks.maxunits = Максимальное количество активных единиц blocks.health = Прочность blocks.buildtime = Время строительства +blocks.maxconsecutive = Макс. последовательность blocks.buildcost = Стоимость строительства blocks.inaccuracy = Разброс blocks.shots = Выстрелы @@ -638,7 +652,9 @@ unit.liquidunits = жидкостных единиц unit.powerunits = энерг. единиц unit.degrees = град. unit.seconds = сек. +unit.minutes = мин. unit.persecond = /сек +unit.perminute = /мин unit.timesspeed = x скорость unit.percent = % unit.items = предметов @@ -727,6 +743,7 @@ category.blocks.name = Выбор блока command.attack = Атаковать command.rally = Точка сбора command.retreat = Отступить +command.idle = Ждать placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, keybind.respawn.name = Возрождение в ядре keybind.control.name = Перехватить контроль над единицей @@ -739,6 +756,7 @@ keybind.toggle_block_status.name = Отображение статусов бл keybind.move_x.name = Движение по оси X keybind.move_y.name = Движение по оси Y keybind.mouse_move.name = Следовать за курсором +keybind.pan.name = Панорамирование камеры keybind.boost.name = Полёт/Ускорение keybind.schematic_select.name = Выбрать область keybind.schematic_menu.name = Меню схем @@ -800,6 +818,7 @@ rules.reactorexplosions = Взрывы реакторов rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки +rules.buildai = Строительство ИИ rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.blockhealthmultiplier = Множитель здоровья блоков rules.blockdamagemultiplier = Множитель урона блоков @@ -821,8 +840,11 @@ rules.title.unit = Боевые единицы rules.title.experimental = Экспериментально rules.title.environment = Окружение rules.lighting = Освещение +rules.fire = Огонь +rules.explosions = Урон от взрывов блоков/единиц rules.ambientlight = Окружающий свет rules.solarpowermultiplier = Множитель солнечной энергии +rules.weather = Погода content.item.name = Предметы content.liquid.name = Жидкости @@ -867,13 +889,16 @@ liquid.temperature = [lightgray]Температура: {0} unit.dagger.name = Кинжал unit.mace.name = Булава unit.fortress.name = Крепость +unit.scepter.name = Скипетр +unit.reign.name = Власть unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Обходчик +unit.crawler.name = Ползун unit.atrax.name = Атракс unit.spiroct.name = Спайрокт unit.arkyid.name = Аркид +unit.toxopid.name = Токсопид unit.flare.name = Вспышка unit.horizon.name = Горизонт unit.zenith.name = Зенит @@ -889,27 +914,28 @@ unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +block.resupply-point.name = Пункт снабжения block.parallax.name = Параллакс block.cliff.name = Скала block.sand-boulder.name = Песчаный валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Соль -block.saltrocks.name = Соляные камни +block.salt-wall.name = Соляная стена block.pebbles.name = Галька block.tendrils.name = Споровые усики -block.sandrocks.name = Песчаные камни +block.sand-wall.name = Песчаная стена block.spore-pine.name = Споровая сосна -block.sporerocks.name = Споровые камни -block.rock.name = Каменный валун -block.snowrock.name = Заснеженный валун +block.spore-wall.name = Споровая стена +block.boulder.name = Каменный валун +block.snow-boulder.name = Заснеженный валун block.snow-pine.name = Заснеженная сосна block.shale.name = Сланец block.shale-boulder.name = Сланцевый валун block.moss.name = Мох block.shrubs.name = Кусты block.spore-moss.name = Споровый мох -block.shalerocks.name = Сланцевые камни +block.shale-wall.name = Сланцевая стена block.scrap-wall.name = Стена из металлолома block.scrap-wall-large.name = Большая стена из металлолома block.scrap-wall-huge.name = Огромная стена из металлолома @@ -937,13 +963,16 @@ block.craters.name = Кратеры block.sand-water.name = Песок с водой block.darksand-water.name = Тёмный песок с водой block.char.name = Выжженная земля -block.holostone.name = Голографический камень +block.dacite.name = Дацит +block.dacite-wall.name = Дацитовая стена block.ice-snow.name = Заснеженный лёд -block.rocks.name = Камни -block.icerocks.name = Ледяные камни -block.snowrocks.name = Снежные камни -block.dunerocks.name = Тёмные песчаные камни +block.stone-wall.name = Каменная стена +block.ice-wall.name = Ледяная стена +block.snow-wall.name = Снежная стена +block.dune-wall.name = Тёмная песчаная стена block.pine.name = Сосна +block.dirt.name = Земля +block.dirt-wall.name = Земляная стена block.white-tree-dead.name = Мёртвое белое дерево block.white-tree.name = Белое дерево block.spore-cluster.name = Скопление спор @@ -959,7 +988,7 @@ block.dark-panel-4.name = Тёмная панель 4 block.dark-panel-5.name = Тёмная панель 5 block.dark-panel-6.name = Тёмная панель 6 block.dark-metal.name = Тёмный металл -block.ignarock.name = Обожжённый камень +block.basalt.name = Базальт block.hotrock.name = Горячий камень block.magmarock.name = Магмовый камень block.cliffs.name = Скалы @@ -1073,6 +1102,7 @@ block.container.name = Контейнер block.launch-pad.name = Пусковая площадка block.launch-pad-large.name = Большая пусковая площадка block.segment.name = Сегмент +block.command-center.name = Командный центр block.ground-factory.name = Наземная фабрика block.air-factory.name = Воздушная фабрика block.naval-factory.name = Морская фабрика @@ -1089,7 +1119,9 @@ block.overdrive-dome.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 = Синяя @@ -1226,10 +1258,10 @@ block.thorium-reactor.description = Генерирует значительно block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. -block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. +block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. -block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. +block.cultivator.description = Выращивает крошечные концентрации спор из атмосферы в готовые к использованию споры. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться. block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 82b70a15eb..7599189c88 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -13,14 +13,14 @@ link.google-play.description = Завантажити для Android з Google P link.f-droid.description = Завантажити для Android з F-Droid link.wiki.description = Офіційна ігрова Wiki link.suggestions.description = Запропонувати нові функції -linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. +linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. gameover = Гра завершена gameover.pvp = [accent]{0}[] команда перемогла! highscore = [accent]Новий рекорд! 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.map = Мапи @@ -40,8 +40,8 @@ be.check = Перевірити на наявність оновлень schematic = Схема schematic.add = Зберегти схему… schematics = Схеми -schematic.replace = Схема з такою назвою вже існує. Замінити її? -schematic.exists = Схема з такою назвою вже існує. +schematic.replace = Схема з такою назвою вже є. Замінити її? +schematic.exists = Схема з такою назвою вже є. schematic.import = Імпортувати схему… schematic.exportfile = Експортувати файл schematic.importfile = Імпортувати файл @@ -51,7 +51,7 @@ schematic.copy.import = Імпортувати з клавіатури schematic.shareworkshop = Поширити в Майстерню schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему schematic.saved = Схема збережена. -schematic.delete.confirm = Ця схема буде повністю випалена Викорінювачем. +schematic.delete.confirm = Ви справді хочете видалити цю схему? schematic.rename = Перейменувати схему schematic.info = {0}x{1}, {2} блоків @@ -69,7 +69,7 @@ map.delete = Ви впевнені, що хочете видалити мапу level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи level.mode = Режим гри: -coreattack = < Ядро знаходиться під атакою! > +coreattack = < Ядро перебуває під атакою! > nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча database = База даних ядра savegame = Зберегти гру @@ -78,7 +78,7 @@ joingame = Мережева гра customgame = Користувацька гра newgame = Нова гра none = <нічого> -minimap = Міні-мапа +minimap = Мінімапа position = Місцезнаходження close = Закрити website = Вебсайт @@ -98,15 +98,15 @@ committingchanges = Здійснення змін done = Зроблено feature.unsupported = Ваш пристрій не підтримує цю функцію -mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. +mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [accent](Альфа) mods = Модифікації mods.none = [lightgray]Модифікацій не знайдено! -mods.guide = Посібник з модифікацій +mods.guide = Посібник із модифікацій mods.report = Повідомити про ваду mods.openfolder = Відкрити теку mods.reload = Перезавантажити -mods.reloadexit = Гра зараз закриється, щоб перезавантажити модифікації +mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації mod.display = [gray]Модифікація:[orange] {0} mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено @@ -114,29 +114,32 @@ mod.disable = Вимкнути mod.content = Зміст: mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0} +mod.outdated = [scarlet]Не сумісна з V6 (немає мінімальної версі гри (англ. min-game-version): 105) mod.missingdependencies = [scarlet]Відсутні залежності: {0} -mod.erroredcontent = [scarlet]Помилки при завантаженні +mod.erroredcontent = [scarlet]Помилки під час завантаження mod.errors = Виникли помилки під час завантаження змісту. mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути -mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. +mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію mod.import.file = Імпортувати файл mod.import.github = Імпортувати з GitHub -mod.jarwarn = [scarlet]JAR-модифікації по своїй суті небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! -mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію. +mod.jarwarn = [scarlet]JAR-модифікації за своєю суттю небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! +mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоби видалити його, видаліть цю модифікацію. mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [lightgray]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} -mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. -mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію у теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. +mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. +mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри. about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. +planetmap = Планетна мапа +launchcore = Запустити ядро filename = Назва файлу: unlocked = Доступний новий вміст! completed = [accent]Завершено @@ -150,28 +153,28 @@ players.single = {0} гравець на сервері players.search = пошук players.notfound = [gray]гравців не знайдено server.closing = [accent]Закриття сервера… -server.kicked.kick = Ви були вигнані з сервера! +server.kicked.kick = Ви були вигнані із сервера! server.kicked.whitelist = Ви не в білому списку сервера. -server.kicked.serverClose = Сервер закрито. +server.kicked.serverClose = Сервер зачинено. server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте. server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру! server.kicked.banned = Ви заблоковані на цьому сервері. -server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки. +server.kicked.typeMismatch = Цей сервер не сумісний із вашим типом збірки. server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця. server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням. -server.kicked.nameInUse = На цьому сервері вже є хтось з таким ім’ям. +server.kicked.nameInUse = На цьому сервері вже є хтось із таким ім’ям. server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру. server.kicked.idInUse = Ви вже на цьому сервері! Під’єднанням двох облікових записів не дозволяється. server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію. server.kicked.gameover = Гру завершено! server.kicked.serverRestarting = Сервер перезавантажується 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. hostserver = Запустити багатокористувацький сервер invitefriends = Запросити друзів -hostserver.mobile = Запустити\nсервер +hostserver.mobile = Запустити сервер host = Запустити hosting = [accent]Відкриття сервера… hosts.refresh = Оновити @@ -260,25 +263,25 @@ ok = Гаразд open = Відкрити customize = Налаштувати правила cancel = Скасувати -openlink = Відкрити посилання +openlink = Перейти за посиланням copylink = Скопіювати посилання back = Назад data.export = Вивантажити дані data.import = Завантажити дані -data.openfolder = Відкрити теку з даними +data.openfolder = Відчинити теку з даними data.exported = Дані вивантажено. data.invalid = Це не дійсні ігрові дані. -data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. +data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. quit.confirm = Ви дійсно хочете вийти? quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[] loading = [accent]Завантаження… reloading = [accent]Перезавантаження модифікацій… saving = [accent]Збереження… -respawn = [accent][[{0}][], щоб відродитися в ядрі +respawn = [accent][[{0}][], щоби відродитися в ядрі cancelbuilding = [accent][[{0}][], щоб очистити план -selectschematic = [accent][[{0}][], щоб вибрати та скопіювати -pausebuilding = [accent][[{0}][], щоб призупинити будування -resumebuilding = [scarlet][[{0}][], щоб продовжити будування +selectschematic = [accent][[{0}][], щоби вибрати та скопіювати +pausebuilding = [accent][[{0}][], щоби призупинити будування +resumebuilding = [scarlet][[{0}][], щоби продовжити будування wave = [accent]Хвиля {0} wave.waiting = [lightgray]Наступна хвиля\nчерез {0} wave.waveInProgress = [lightgray]Хвиля триває @@ -294,11 +297,11 @@ builtin = Вбудована map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.random = [accent]Випадкова мапа map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. +map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. +map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. workshop.update = Оновити предмет -workshop.error = Помилка при отриманні інформації з Майстерні: {0} +workshop.error = Помилка під час отримання інформації з Майстерні: {0} map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! workshop.menu = Виберіть, що ви хочете зробити з цим предметом. workshop.info = Інформація про предмет @@ -307,7 +310,7 @@ eula = Ліцензійна угода Steam missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. publishing = [accent]Публікація… publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! -publish.error = Виникла помилка при публікації предмета: {0} +publish.error = Виникла помилка під час публікації предмета: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} editor.brush = Пензлик @@ -317,11 +320,11 @@ editor.oregen.info = Генерація руд: editor.mapinfo = Інформація про мапу editor.author = Автор: editor.description = Опис: -editor.nodescription = Мапа повинна мати щонайменше 4 символи для публікації. +editor.nodescription = Мапа мусить мати щонайменше 4 символи для публікації. editor.waves = Хвилі: editor.rules = Правила: editor.generation = Генерація: -editor.ingame = Редагувати у грі +editor.ingame = Редагувати в грі editor.publish.workshop = Опублікувати в Майстерні Steam editor.newmap = Нова мапа workshop = Майстерня @@ -338,9 +341,12 @@ waves.preview = Попередній перегляд waves.edit = Редагувати… waves.copy = Копіювати в буфер обміну waves.load = Завантажити з буфера обміну -waves.invalid = Недійсні хвилі у буфері обміну. +waves.invalid = Недійсні хвилі в буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. +wavemode.counts = кількість +wavemode.totals = усього +wavemode.health = здоров’я editor.default = [lightgray]<За замовчуванням> details = Подробиці… edit = Редагувати… @@ -350,11 +356,11 @@ editor.removeunit = Видалити бойову одиницю editor.teams = Команди editor.errorload = Помилка завантаження зображення. editor.errorsave = Помилка збереження зображення. -editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» у редакторі. +editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійсний або пошкоджений. -editor.errorname = Мапа не має назви. Може Ви намагаєтеся завантажити збереження? +editor.errorname = Мапа не має назви. Може, ви намагаєтеся завантажити збереження? editor.update = Оновити editor.randomize = Випадково editor.apply = Застосувати @@ -365,7 +371,7 @@ editor.savemap = Зберегти мапу editor.saved = Збережено! editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу». editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу». -editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує! +editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже є! editor.import = Імпорт… editor.importmap = Імпортувати мапу editor.importmap.description = Імпортувати вже наявну мапу @@ -380,12 +386,12 @@ editor.exportimage = Експорт зображення місцевості editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості editor.loadimage = Завантажити\nзображення editor.saveimage = Зберегти\nзображення -editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? +editor.unsaved = Ви впевнені, що хочете вийти?\n[scarlet]Незбережені зміни буде втрачено назавжди![] editor.resizemap = Змінити розмір мапи editor.mapname = Назва мапи: editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу. -editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» -editor.exists = Мапа з такою назвою вже існує. +editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» +editor.exists = Мапа з такою назвою вже є. editor.selectmap = Виберіть мапу для завантаження: toolmode.replace = Замінити @@ -398,7 +404,7 @@ toolmode.square = Прямокутник toolmode.square.description = Прямокутна кисть. toolmode.eraseores = Видалення руд toolmode.eraseores.description = Видалити тільки руди. -toolmode.fillteams = Змінити блок в команді +toolmode.fillteams = Змінити блок у команді toolmode.fillteams.description = Змінює належність\nблоків до команди. toolmode.drawteams = Змінити команду блока toolmode.drawteams.description = Змінює належність\nблока до команди. @@ -447,7 +453,7 @@ load = Завантажити save = Зберегти fps = FPS: {0} ping = Затримка: {0} мс -language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. +language.restart = Будь ласка, перезапустіть свою гру, щоби налаштування мови набули чинності. settings = Налаштування tutorial = Навчання tutorial.retake = Пройти навчання ще раз @@ -459,7 +465,7 @@ abandon.text = Ця зона і всі її ресурси будуть утра locked = Заблоковано complete = [lightgray]Необхідно: requirement.wave = Досягніть хвилі {0} у зоні «{1}» -requirement.core = Знищте вороже ядро у зоні «{0}» +requirement.core = Знищте вороже ядро в зоні «{0}» requirement.unlock = Розблокуйте {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} @@ -468,7 +474,7 @@ launch.text = Запуск launch.title = Запуск вдалий launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі launch.unable2 = [scarlet]ЗАПУСК неможливий.[] -launch.confirm = Це видалить всі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. +launch.confirm = Це видалить усі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Налаштувати вивантаження @@ -476,7 +482,7 @@ loadout = Вивантаження resources = Ресурси bannedblocks = Заборонені блоки addall = Додати все -configure.invalid = Кількість повинна бути числом між 0 та {0}. +configure.invalid = Кількість має бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} zone.resources = [lightgray]Виявлені ресурси: @@ -489,7 +495,7 @@ boss.health = Здоров’я босу connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0} error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса? error.invalidaddress = Некоректна адреса. -error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту! +error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна й що власник сервера налаштував переадресацію порту! error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry! error.alreadyconnected = Ви вже під’єдналися. error.mapnotfound = Файл мапи не знайдено! @@ -497,6 +503,18 @@ error.io = Мережева помилка введення-виведення. error.any = Невідома мережева помилка 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.craters.name = Кратери sector.frozenForest.name = Крижаний ліс @@ -516,7 +534,7 @@ sector.craters.description = У цьому кратері накопичилас sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології. sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці. sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам. -sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один з небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. +sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника. sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією. @@ -532,7 +550,9 @@ settings.sound = Звук settings.graphics = Графіка settings.cleardata = Очистити дані… settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати! -settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження? +settings.clearsaves = Очистити збереження paused = [accent]< Пауза> clear = Очистити banned = [scarlet]Заблоковано @@ -558,8 +578,11 @@ blocks.itemsmoved = Швидкість переміщення blocks.launchtime = Час між запусками blocks.shootrange = Радіус дії blocks.size = Розмір +blocks.displaysize = Розмір дисплею blocks.liquidcapacity = Рідинна місткість -blocks.powerrange = Діапазон передачі енергії +blocks.powerrange = Радіус передачі енергії +blocks.linkrange = Радіус з’єднання +blocks.instructions = Інструкції blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує blocks.powerdamage = Енергії за од. шкоди @@ -575,6 +598,7 @@ blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я blocks.buildtime = Час будування +blocks.maxconsecutive = Максимальна послідовність blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли @@ -582,7 +606,7 @@ blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси bar.drilltierreq = Потребується кращий бур -bar.noresources = Відсутні ресурси +bar.noresources = Бракує ресурсів bar.corereq = Необхідне основне ядро bar.drillspeed = Швидкість буріння: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с. @@ -622,7 +646,9 @@ unit.liquidunits = одиниць рідини unit.powerunits = одиниць енергії unit.degrees = град. unit.seconds = с +unit.minutes = хв unit.persecond = за секунду +unit.perminute = за хвилину unit.timesspeed = x швидкість unit.percent = % unit.items = предм. @@ -638,7 +664,7 @@ category.shooting = Стрільба category.optional = Додаткові поліпшення setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.shadows.name = Тіні -setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків +setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація setting.hints.name = Підказки setting.flow.name = Показувати темп швидкості ресурсів @@ -649,7 +675,7 @@ setting.animatedshields.name = Анімаційні щити setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.playerindicators.name = Позначки гравців setting.indicators.name = Позначки противників -setting.autotarget.name = Авто-стрільба +setting.autotarget.name = Автострільба setting.keyboard.name = Миш+Керування з клавіатури setting.touchscreen.name = Керування сенсорним екраном setting.fpscap.name = Максимальний FPS @@ -681,11 +707,11 @@ setting.blockselectkeys.name = Показувати клавіші вибору setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація setting.minimap.name = Показувати мінімапу -setting.coreitems.name = Показувати предмети в ядрі (в роботі) +setting.coreitems.name = Показувати предмети в ядрі (дороблюється) setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.atmosphere.name = Показувати планетарну атмосферу -setting.ambientvol.name = Звуки навколишнього середовища +setting.ambientvol.name = Звуки довкілля setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук @@ -697,7 +723,7 @@ setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.bridgeopacity.name = Непрозорість мостів setting.playerchat.name = Показувати хмару чата над гравцями -public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити у Налаштування->Гра->Загальнодоступність гри. +public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… uiscale.cancel = Скасувати & Вийти @@ -711,6 +737,7 @@ category.blocks.name = Вибір блока command.attack = Атака command.rally = Точка збору command.retreat = Відступити +command.idle = Бездіяти placement.blockselectkeys = \n[lightgray]Ключ: [{0}, keybind.respawn.name = Відродження keybind.control.name = Контролювання одиниці @@ -722,7 +749,8 @@ keybind.toggle_power_lines.name = Показувати лазери енерго keybind.toggle_block_status.name = Показувати стан блоків keybind.move_x.name = Рух по осі X keybind.move_y.name = Рух по осі Y -keybind.mouse_move.name = Слідкувати за мишею +keybind.mouse_move.name = Рухатися за мишею +keybind.pan.name = Політ камери за мишею keybind.boost.name = Прискорення keybind.schematic_select.name = Вибрати ділянку keybind.schematic_menu.name = Меню схем @@ -755,7 +783,7 @@ keybind.zoom.name = Наблизити keybind.menu.name = Меню keybind.pause.name = Пауза keybind.pause_building.name = Призупинити/Продовжити будування -keybind.minimap.name = Міні-мапа +keybind.minimap.name = Мінімапа keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль @@ -766,10 +794,10 @@ keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату keybind.chat_scroll.name = Прокрутка чату keybind.drop_unit.name = Скинути бойову одиницю -keybind.zoom_minimap.name = Збільшити міні-мапу +keybind.zoom_minimap.name = Збільшити мінімапу mode.help.title = Опис режимів гри mode.survival.name = Виживання -mode.survival.description = Звичайний режим. В цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. +mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. mode.sandbox.name = Пісочниця mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням. mode.editor.name = Редактор @@ -784,28 +812,34 @@ rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер для хвиль rules.waves = Хвилі rules.attack = Режим атаки +rules.buildai = Будування ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockdamagemultiplier = Множник шкоди блоків rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць -rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (плитки) +rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки) rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування -rules.deconstructrefundmultiplier = Множник відшкодування при демонтажі +rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпасів rules.title.waves = Хвилі -rules.title.resourcesbuilding = Ресурси & будування +rules.title.resourcesbuilding = Ресурси й будування rules.title.enemy = Противники rules.title.unit = Бойові одиниці rules.title.experimental = Експериментальне rules.title.environment = Середовище rules.lighting = Світлотінь +rules.fire = Вогонь +rules.explosions = Шкода від вибухів блоків і одиниць rules.ambientlight = Навколишнє світло +rules.weather = Погода +rules.weather.frequency = Повторюваність: +rules.weather.duration = Тривалість: rules.solarpowermultiplier = Множник сонячної енергії content.item.name = Предмети @@ -853,11 +887,12 @@ unit.fortress.name = Фортеця unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Камікадзе +unit.crawler.name = Плазун unit.atrax.name = Атракс unit.spiroct.name = Павучник unit.arkyid.name = Аркиїд -unit.flare.name = Фальшфейєр +unit.toxopid.name = Отруйник +unit.flare.name = Фальшфеєр unit.horizon.name = Горизонт unit.zenith.name = Зеніт unit.antumbra.name = Тіньовик @@ -871,28 +906,31 @@ unit.bryde.name = Смугач Брайда unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +unit.scepter.name = Верховна влада +unit.reign.name = Верховний Порядок +block.resupply-point.name = Пункт постачання block.parallax.name = Паралакс block.cliff.name = Скеля block.sand-boulder.name = Пісочний валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Сіль -block.saltrocks.name = Соляні камені +block.salt-wall.name = Соляна стіна block.pebbles.name = Галька block.tendrils.name = Щупальця -block.sandrocks.name = Піщані скелі +block.sand-wall.name = Піскова стіна block.spore-pine.name = Спорова сосна -block.sporerocks.name = Спорові камені -block.rock.name = Камінь -block.snowrock.name = Сніжний камінь +block.spore-wall.name = Спорова стіна +block.boulder.name = Брила +block.snow-boulder.name = Снігова брила block.snow-pine.name = Сніжні сосни block.shale.name = Сланець block.shale-boulder.name = Сланцевий валун block.moss.name = Мох block.shrubs.name = Кущі block.spore-moss.name = Споровий мох -block.shalerocks.name = Сланцеві породи +block.shale-wall.name = Сланцева стіна block.scrap-wall.name = Стіна з брухту block.scrap-wall-large.name = Велика стіна з брухту block.scrap-wall-huge.name = Величезна стіна з брухту @@ -917,16 +955,19 @@ block.darksand.name = Темний пісок block.ice.name = Лід block.snow.name = Сніг block.craters.name = Кратери -block.sand-water.name = Пісок з водою -block.darksand-water.name = Темний пісок з водою +block.sand-water.name = Пісок із водою +block.darksand-water.name = Темний пісок із водою block.char.name = Випалена земля -block.holostone.name = Голографічний камінь +block.dacite.name = Дацит +block.dacite-wall.name = Дацитова стіна block.ice-snow.name = Крижаний сніг -block.rocks.name = Камені -block.icerocks.name = Крижані камені -block.snowrocks.name = Снігові камені -block.dunerocks.name = Піщані камені +block.stone-wall.name = Кам’яна стіна +block.ice-wall.name = Крижана стіна +block.snow-wall.name = Снігова стіна +block.dune-wall.name = Дюнова стіна block.pine.name = Сосна +block.dirt.name = Ґрунт +block.dirt-wall.name = Ґрунтова стіна block.white-tree-dead.name = Мертве біле дерево block.white-tree.name = Біле дерево block.spore-cluster.name = Скупчення спор @@ -942,7 +983,7 @@ block.dark-panel-4.name = Темна панель 4 block.dark-panel-5.name = Темна панель 5 block.dark-panel-6.name = Темна панель 6 block.dark-metal.name = Темний метал -block.ignarock.name = Магматичні гірські породи +block.basalt.name = Базальт block.hotrock.name = Гарячий камінь block.magmarock.name = Магмовий камінь block.cliffs.name = Скелі @@ -967,7 +1008,7 @@ block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр block.plastanium-conveyor.name = Пластанієвий конвеєр block.armored-conveyor.name = Броньований конвеєр -block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. +block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач @@ -1056,18 +1097,26 @@ block.container.name = Сховище block.launch-pad.name = Стартовий майданчик block.launch-pad-large.name = Великий стартовий майданчик block.segment.name = Сегмент +block.command-center.name = Командний центр block.ground-factory.name = Наземний завод block.air-factory.name = Повітряний завод block.naval-factory.name = Морський завод block.additive-reconstructor.name = Додавальний реконструктор block.multiplicative-reconstructor.name = Примножувальний реконструктор block.exponential-reconstructor.name = Експоненційний реконструктор -block.tetrative-reconstructor.name = Тетративний реконструктор +block.tetrative-reconstructor.name = Тетративний реконструктор block.payload-conveyor.name = Вантажний конвеєр block.payload-router.name = Розвантажувальний маршрутизатор block.disassembler.name = Розбирач block.silicon-crucible.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.crux.name = Червона team.sharded.name = Помаранчева @@ -1077,39 +1126,39 @@ team.green.name = Зелена team.purple.name = Фіолетова tutorial.next = [lightgray]<Натисніть для продовження> -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.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.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.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.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[] -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.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються у будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди повинні бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. -tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоб заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 +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.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. +tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоби заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи. tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи. tutorial.unpause = Призупиніть гру, натиснувши на пробіл. -tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоб зняти паузу. -tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. -tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищте область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. +tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу. +tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні. +tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоби зламати його.\nВидаліть ділянку, утримуючи палець упродовж декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоби підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні. tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\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.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків. -item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та у транспортуванні рідин. +item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин. item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент. -item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів. +item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів. item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів. item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків. item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива. item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів. item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт. item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах. -item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та у технології самовідновлення. +item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення. item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями. item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо. item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується. @@ -1117,24 +1166,24 @@ item.pyratite.description = Надзвичайно легкозаймиста р liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів. liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля. -liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. +liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками. block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту. block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля. -block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. +block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній. block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії. -block.plastanium-compressor.description = Виробляє пластаній з нафти та титану. +block.plastanium-compressor.description = Виробляє пластаній із нафти та титану. block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії. block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву. -block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання у торієвому реактору. -block.blast-mixer.description = Подрібнює і змішує скупчення спор з піротитом для отримання вибухової суміші. +block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання в торієвому реактору. +block.blast-mixer.description = Подрібнює і змішує скупчення спор із піротитом для отримання вибухової суміші. block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит. -block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання у баштах «Хвиля». +block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля». block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали. block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти. block.pulverizer.description = Подрібнює брухт у дрібний пісок. -block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля. +block.coal-centrifuge.description = Нафта перетворюється в шматки вугілля. block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує. block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця. block.power-source.description = Постійно створює енергію. Тільки пісочниця. @@ -1142,30 +1191,30 @@ block.item-source.description = Постійно створює предмети block.item-void.description = Знищує будь-які предмети. Тільки пісочниця. block.liquid-source.description = Постійно створює рідини. Тільки пісочниця. block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця. -block.copper-wall.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль. -block.copper-wall-large.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. -block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників. -block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників.\nЗаймає декілька плиток. -block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів. -block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. -block.thorium-wall.description = Сильний захисний блок.\nГідний захист від противників. -block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від противників.\nЗаймає декілька плиток. -block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі. -block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.\nЗаймає декілька плиток. -block.surge-wall.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином. -block.surge-wall-large.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. -block.door.description = Невеликі двері. Можна відкрити або закрити, натиснувши. -block.door-large.description = Великі двері. Можна відкрити та закрити, натиснувши.\nЗаймає декілька плиток. -block.mender.description = Періодично ремонтує блоки у його радіусі дії. Захищає башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. -block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки у його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. +block.copper-wall.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль. +block.copper-wall-large.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. +block.titanium-wall.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників. +block.titanium-wall-large.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.\nЗаймає декілька плиток. +block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів. +block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. +block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників. +block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток. +block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару. +block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток. +block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином. +block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. +block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них. +block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток. +block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. +block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. -block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. +block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника. block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати. block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри. -block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. +block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності. block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця. -block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі. +block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі. block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток. block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа. block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. @@ -1174,35 +1223,35 @@ block.distributor.description = Поліпшений маршрутизатор. block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований. block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано. block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія. -block.mechanical-pump.description = Дешевий насос з повільним виходом, але не потребує енергоспоживання. +block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. -block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує і більше зберігає рідини, ніж стандартні трубопроводи. -block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. +block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи. +block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nПротікає менше. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. -block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. +block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця. -block.bridge-conduit.description = Удосконалений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. +block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток. block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії. block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії. block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії. -block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. +block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. -block.thermal-generator.description = Генерує енергію при розміщенні в спекотних місцях. +block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях. block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. -block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною і піротитом, що горить. +block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить. block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю. block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. -block.solar-panel-large.description = Значно ефективніша версія стандартної сонячної панелі. +block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель. block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості. -block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії при максимальній ефективності. Для запуску процесу потрібно значні обсяги енергії. +block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії. block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів. -block.pneumatic-drill.description = Поліпшений бур, здатний добувати титан. Видобуває швидше, ніж механічний бур. -block.laser-drill.description = Дозволяє виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. +block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур. +block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії. block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води. block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки. @@ -1213,15 +1262,15 @@ block.core-nucleus.description = Третя й остання версія ка block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. -block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик дозволяє вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте у нього ресурси та забезпечте енергією. +block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією. block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. -block.duo.description = Мала і дешева башта. Корисна проти наземних одиниць. -block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла у противників. +block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць. +block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників. block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. block.hail.description = Невелика артилерійська башта з далеким радіусом дії. block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води. block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії. -block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики у противників. +block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників. block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно. block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника. block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників. diff --git a/core/assets/planets/serpulo.dat b/core/assets/planets/serpulo.dat deleted file mode 100644 index 3a1465dfde..0000000000 Binary files a/core/assets/planets/serpulo.dat and /dev/null differ diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 0ef97761e1..ffc950ea7e 100644 Binary files a/core/assets/sprites/block_colors.png and b/core/assets/sprites/block_colors.png differ diff --git a/core/assets/sprites/fallback/sprites4.png b/core/assets/sprites/fallback/sprites4.png index 2e848b79c9..2eb2a849eb 100644 Binary files a/core/assets/sprites/fallback/sprites4.png and b/core/assets/sprites/fallback/sprites4.png differ diff --git a/core/assets/sprites/sprites2.png b/core/assets/sprites/sprites2.png index c869fbf0dd..412b96bfb9 100644 Binary files a/core/assets/sprites/sprites2.png and b/core/assets/sprites/sprites2.png differ diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 34ad2f6daa..2ffaff7756 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -60,6 +60,8 @@ public class Vars implements Loadable{ 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. */ 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.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; /** list of built-in servers.*/ diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 05d7b69273..a7cf9b2cca 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -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. */ private GridBits[] structQuadrants; /** Stores all damaged tile entities by team. */ - private BuildingArray[] damagedTiles = new BuildingArray[Team.all.length]; + private ObjectSet[] damagedTiles = new ObjectSet[Team.all.length]; /** All ores available on this map. */ private ObjectSet allOres = new ObjectSet<>(); /** Stores teams that are present here as tiles. */ @@ -70,7 +70,7 @@ public class BlockIndexer{ Events.on(WorldLoadEvent.class, event -> { scanOres.clear(); 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]; unitCaps = new int[Team.all.length]; activeTeams = new Seq<>(Team.class); @@ -139,14 +139,14 @@ public class BlockIndexer{ } /** Returns all damaged tiles by team. */ - public BuildingArray getDamaged(Team team){ - returnArray.clear(); + public ObjectSet getDamaged(Team team){ + breturnArray.clear(); if(damagedTiles[team.id] == null){ - damagedTiles[team.id] = new BuildingArray(); + damagedTiles[team.id] = new ObjectSet<>(); } - BuildingArray set = damagedTiles[team.id]; + ObjectSet set = damagedTiles[team.id]; for(Building build : set){ if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){ breturnArray.add(build); @@ -214,7 +214,7 @@ public class BlockIndexer{ public void notifyTileDamaged(Building entity){ if(damagedTiles[entity.team.id] == null){ - damagedTiles[entity.team.id] = new BuildingArray(); + damagedTiles[entity.team.id] = new ObjectSet(); } damagedTiles[entity.team.id].add(entity); @@ -476,35 +476,4 @@ public class BlockIndexer{ return tiles.iterator(); } } - - //TODO copy-pasted code, generics would be nice here - public static class BuildingArray implements Iterable{ - private Seq 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 iterator(){ - return tiles.iterator(); - } - } } diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index d5953dfedc..7a8adbbc44 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -87,7 +87,7 @@ public class BuilderAI extends AIController{ } //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 blocks = unit.team().data().blocks; BlockPlan block = blocks.first(); diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index 64fb8b44cd..2f01bb984a 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -1,7 +1,6 @@ package mindustry.ai.types; import arc.math.*; -import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; 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.setLength(unit.type().speed * Time.delta); + vec.setLength(unit.type().speed); unit.moveAt(vec); } diff --git a/core/src/mindustry/ai/types/RepairAI.java b/core/src/mindustry/ai/types/RepairAI.java index a90eba3e56..136cbc821b 100644 --- a/core/src/mindustry/ai/types/RepairAI.java +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -12,8 +12,8 @@ public class RepairAI extends AIController{ boolean shoot = false; if(target != null){ - if(!target.within(unit, unit.type().range)){ - moveTo(target, unit.type().range * 0.9f); + if(!target.within(unit, unit.type().range * 0.8f)){ + moveTo(target, unit.type().range * 0.8f); }else{ unit.aim(target); shoot = true; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 93c0f45a8b..b3a670a54a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -327,7 +327,7 @@ public class Blocks implements ContentList{ duneWall = new StaticWall("dune-wall"){{ variants = 2; - basalt.asFloor().wall = this; + basalt.asFloor().wall = darksandWater.asFloor().wall = darksandTaintedWater.asFloor().wall = this; }}; sandWall = new StaticWall("sand-wall"){{ @@ -1011,7 +1011,7 @@ public class Blocks implements ContentList{ mechanicalPump = new Pump("mechanical-pump"){{ requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10)); - pumpAmount = 0.1f; + pumpAmount = 0.11f; }}; 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)); powerProduction = 5.5f; itemDuration = 90f; - consumes.liquid(Liquids.water, 0.06f); + consumes.liquid(Liquids.water, 0.07f); hasLiquids = true; size = 2; }}; @@ -1269,7 +1269,7 @@ public class Blocks implements ContentList{ hasItems = true; consumes.power(0.80f); - consumes.liquid(Liquids.water, 0.18f); + consumes.liquid(Liquids.water, 0.2f); }}; oilExtractor = new Fracker("oil-extractor"){{ @@ -1645,7 +1645,7 @@ public class Blocks implements ContentList{ }}; 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( Items.graphite, Bullets.standardDenseBig, Items.pyratite, Bullets.standardIncendiaryBig, @@ -1671,7 +1671,7 @@ public class Blocks implements ContentList{ }}; 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; shootCone = 40f; recoilAmount = 4f; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 1a570948bc..a5ea22f8a2 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -41,7 +41,7 @@ public class UnitTypes implements ContentList{ //air + building + mining 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; //special block unit type diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 40cdb30c7e..6f59edbed0 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -5,7 +5,6 @@ import arc.graphics.*; import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.util.*; import mindustry.ctype.*; import mindustry.gen.*; @@ -170,8 +169,8 @@ public class Weathers implements ContentList{ sandstorm = new Weather("sandstorm"){ TextureRegion region; - float yspeed = 0.3f, xspeed = 6f, size = 140f, padding = size, invDensity = 1500f; - Vec2 force = new Vec2(0.45f, 0.01f); + float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; + float force = 0.45f; Color color = Color.valueOf("f7cba4"); Texture noise; @@ -194,22 +193,26 @@ public class Weathers implements ContentList{ @Override 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){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @Override public void drawOver(WeatherState state){ Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; float scale = 1f / 2000f; float scroll = Time.time() * scale; Tmp.tr1.texture = noise; 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.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); rand.setSeed(0); @@ -224,8 +227,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.2f); 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"){ 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"); - Vec2 force = new Vec2(0.25f, 0.01f); Texture noise; { - attrs.set(Attribute.spores, 0.5f); - attrs.set(Attribute.light, -0.1f); + attrs.set(Attribute.spores, 1f); + attrs.set(Attribute.light, -0.15f); status = StatusEffects.sporeSlowed; statusGround = false; } @@ -269,9 +271,11 @@ public class Weathers implements ContentList{ @Override 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){ - 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.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; + float scale = 1f / 2000f; float scroll = Time.time() * scale; Tmp.tr1.texture = noise; 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.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); rand.setSeed(0); @@ -306,8 +313,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.1f, 0.8f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index f91d2f1217..3a175a6819 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -329,6 +329,7 @@ public class Control implements ApplicationListener, Loadable{ } public void playTutorial(){ + ui.showInfo("There is no tutorial yet."); //TODO implement //ui.showInfo("death"); /* diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 976d80da9f..099cea086f 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -245,7 +245,8 @@ public class Logic implements ApplicationListener{ if(entry.cooldown < 0 && !entry.weather.isActive()){ float duration = Mathf.random(entry.minDuration, entry.maxDuration); 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); } } } diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index c98f8953cf..d42c8d7b4f 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -338,6 +338,8 @@ public class NetClient implements ApplicationListener{ @Remote(variants = Variant.both) public static void setRules(Rules rules){ state.rules = rules; + //campaign is not valid in multiplayer + state.rules.sector = null; } @Remote(variants = Variant.both) @@ -547,6 +549,10 @@ public class NetClient implements ApplicationListener{ quiet = true; } + public void clearRemovedEntity(int id){ + removed.remove(id); + } + public void addRemovedEntity(int id){ removed.add(id); } diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 6174798e96..7ca78f8c89 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -593,38 +593,38 @@ public class NetServer implements ApplicationListener{ if(player.isBuilder()){ player.builder().clearBuilding(); 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()){ 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(); if(!player.dead()){ diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 2ec1b4dec6..c6a448a642 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -5,11 +5,13 @@ import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.struct.ObjectIntMap.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.content.*; import mindustry.core.GameState.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; @@ -19,7 +21,6 @@ import mindustry.maps.*; import mindustry.maps.filters.*; import mindustry.maps.filters.GenerateFilter.*; import mindustry.type.*; -import mindustry.type.Sector.*; import mindustry.type.Weather.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; @@ -33,11 +34,17 @@ public class World{ public @NonNull Tiles tiles = new Tiles(0, 0); private boolean generating, invalidMap; + private ObjectMap customMapLoaders = new ObjectMap<>(); 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(){ return invalidMap; } @@ -255,9 +262,71 @@ public class World{ state.rules.weather.clear(); - if(sector.is(SectorAttribute.rainy)) state.rules.weather.add(new WeatherEntry(Weathers.rain)); - if(sector.is(SectorAttribute.snowy)) state.rules.weather.add(new WeatherEntry(Weathers.snow)); - if(sector.is(SectorAttribute.desert)) state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); + //apply weather based on terrain + ObjectIntMap floorc = new ObjectIntMap<>(); + ObjectSet 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> 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){ + //load using custom loader if possible + if(customMapLoaders.containsKey(map)){ + customMapLoaders.get(map).run(); + return; + } + try{ SaveIO.load(map.file, new FilterContext(map)); }catch(Throwable e){ diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 9cdda58104..63803d5db8 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -20,7 +20,7 @@ public class EditorTile extends Tile{ @Override public void setFloor(@NonNull Floor type){ - if(state.isGame()){ + if(skip()){ super.setFloor(type); return; } @@ -41,20 +41,25 @@ public class EditorTile extends Tile{ @Override public void setBlock(Block type, Team team, int rotation){ - if(state.isGame()){ + if(skip()){ super.setBlock(type, team, rotation); 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(team() != Team.derelict) op(OpType.team, (byte)team().id); + op(OpType.block, block.id); super.setBlock(type, team, rotation); } @Override public void setTeam(Team team){ - if(state.isGame()){ + if(skip()){ super.setTeam(team); return; } @@ -66,7 +71,7 @@ public class EditorTile extends Tile{ @Override public void setOverlay(Block overlay){ - if(state.isGame()){ + if(skip()){ super.setOverlay(overlay); return; } @@ -79,7 +84,7 @@ public class EditorTile extends Tile{ @Override protected void fireChanged(){ - if(state.isGame()){ + if(skip()){ super.fireChanged(); }else{ ui.editor.editor.renderer().updatePoint(x, y); @@ -88,14 +93,14 @@ public class EditorTile extends Tile{ @Override public void recache(){ - if(state.isGame()){ + if(skip()){ super.recache(); } } @Override protected void changeEntity(Team team, Prov entityprov, int rotation){ - if(state.isGame()){ + if(skip()){ super.changeEntity(team, entityprov, rotation); 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){ ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value)); } diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index bbef2125ed..33272b1438 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -31,6 +31,10 @@ public class MapEditor{ public Block drawBlock = Blocks.stone; public Team drawTeam = Team.sharded; + public boolean isLoading(){ + return loading; + } + public StringMap getTags(){ return tags; } @@ -52,7 +56,7 @@ public class MapEditor{ if(map.file.parent().parent().name().equals("1127400") && steam){ tags.put("steamid", map.file.parent().name()); } - MapIO.loadMap(map, context); + load(() -> MapIO.loadMap(map, context)); renderer.resize(width(), height()); loading = false; } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index 7f540750d9..a8ceb58d79 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{ } }).grow().left().pad(6).top(); }).width(280f).pad(3).top().left().fillY(); + + if(++i % cols == 0){ filterTable.row(); } diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index 0976ccbcb2..919c534128 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -116,7 +116,7 @@ public class MapRenderer implements Disposable{ wx * tilesize + wall.offset + (tilesize - width) / 2f, wy * tilesize + wall.offset + (tilesize - height) / 2f, width, height, - tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg() - 90); + tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg()); }else{ region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)]; diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 7689e7aa48..f3ce2f6630 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -255,7 +255,13 @@ public class MapView extends Element implements GestureListener{ Draw.color(Color.gray); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); 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; diff --git a/core/src/mindustry/entities/EntityCollisions.java b/core/src/mindustry/entities/EntityCollisions.java index b4e2355380..2d8402e92c 100644 --- a/core/src/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -10,7 +10,7 @@ import static mindustry.Vars.*; public class EntityCollisions{ //range for tile collision scanning - private static final int r = 2; + private static final int r = 1; //move in 1-unit chunks private static final float seg = 1f; diff --git a/core/src/mindustry/entities/bullet/SapBulletType.java b/core/src/mindustry/entities/bullet/SapBulletType.java index 6dab6ce13c..549485c3e2 100644 --- a/core/src/mindustry/entities/bullet/SapBulletType.java +++ b/core/src/mindustry/entities/bullet/SapBulletType.java @@ -39,10 +39,15 @@ public class SapBulletType extends BulletType{ 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 public float range(){ return length; diff --git a/core/src/mindustry/entities/comp/HitboxComp.java b/core/src/mindustry/entities/comp/HitboxComp.java index a1da7671df..9473dfbca3 100644 --- a/core/src/mindustry/entities/comp/HitboxComp.java +++ b/core/src/mindustry/entities/comp/HitboxComp.java @@ -61,7 +61,8 @@ abstract class HitboxComp implements Posc, QuadTreeObject{ } 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); } } diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index 52dc2bb0b5..86f5a35c3f 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -71,6 +71,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ boolean tryDropPayload(Payload payload){ 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 if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){ Fx.unitDrop.at(on.build); diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index 9bca34d271..03d9daf8b4 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -17,6 +17,7 @@ public class AIController implements UnitController{ protected static final Vec2 vec = new Vec2(); protected static final int timerTarget = 0; protected static final int timerTarget2 = 1; + protected static final int timerTarget3 = 2; protected Unit unit; protected Interval timer = new Interval(4); @@ -151,7 +152,7 @@ public class AIController implements UnitController{ vec.rotate((circleLength - vec.len()) / circleLength * 180f); } - vec.setLength(speed * Time.delta); + vec.setLength(speed); 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); - vec.setLength(unit.type().speed * Time.delta * length); + vec.setLength(unit.type().speed * length); if(length < -0.5f){ vec.rotate(180f); }else if(length < 0){ diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 7b585890c3..5f61cb26ac 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -2,9 +2,10 @@ package mindustry.game; import arc.math.*; import arc.struct.*; -import arc.util.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -32,6 +33,8 @@ public class SectorInfo{ public boolean hasCore = true; /** Sector that was launched from. */ public @Nullable Sector origin; + /** Resources known to occur at this sector. */ + public Seq resources = new Seq<>(); /** Time spent at this sector. Do not use unless you know what you're doing. */ public transient float internalTimeSpent; diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java index 4a03f6199e..9cea3b582f 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -39,7 +39,7 @@ public class Stats{ //weigh used fractions float frac = 0f; - Seq obtainable = Seq.select(zone.data.resources, i -> i instanceof Item).as(); + Seq obtainable = zone.save == null ? new Seq<>() : zone.save.meta.secinfo.resources.select(i -> i instanceof Item).as(); for(Item item : obtainable){ frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index 00bd578dc4..d78deca664 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -41,7 +41,7 @@ public enum CacheLayer{ } }, normal(5), - walls; + walls(3); public static final CacheLayer[] all = values(); /** Capacity multiplier. */ diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 268c4a9a88..26816b08d0 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -228,7 +228,7 @@ public class FloorRenderer implements Disposable{ int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); cache = new Chunk[chunksx][chunksy]; - cbatch = new MultiCacheBatch(chunksize * chunksize * 6); + cbatch = new MultiCacheBatch(chunksize * chunksize * 7); Time.mark(); diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 51389c8fe6..997c8c2721 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -96,24 +96,24 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = v2; //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++] = fy2; vertices[idx++] = color; vertices[idx++] = u2; 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); } @@ -155,6 +155,19 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = u; 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++] = y3; vertices[idx++] = color; @@ -164,28 +177,15 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = x4; vertices[idx++] = y4; vertices[idx++] = color; - vertices[idx++] = u; - vertices[idx++] = v2; + vertices[idx++] = u2; + vertices[idx++] = v; - //tri2 vertices[idx++] = x1; vertices[idx++] = y1; vertices[idx++] = color; vertices[idx++] = u; 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); } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 89ffc7c7c0..2cad25853b 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -236,7 +236,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @Remote(targets = Loc.both, forward = true, called = Loc.server) 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) || !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> { diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index a8995103d0..e6ea20cf9e 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -100,6 +100,20 @@ public class JsonIO{ } }); + json.setSerializer(Liquid.class, new Serializer(){ + @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(){ @Override 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")); } }); + + json.setSerializer(UnlockableContent.class, new Serializer(){ + @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{ diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index 3ae3996d23..28202cd94c 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -77,6 +77,7 @@ public class SaveIO{ try{ return getMeta(getStream(file)); }catch(Exception e){ + e.printStackTrace(); return getMeta(getBackupStream(file)); } } diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java index 126f5bd607..d463e51ee1 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -15,8 +15,8 @@ public enum LogicOp{ greaterThan(">", (a, b) -> a > b ? 1 : 0), greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), pow("^", Math::pow), - shl(">>", (a, b) -> (long)a >> (long)b), - shr("<<", (a, b) -> (long)a << (long)b), + shl("<<", (a, b) -> (long)a << (long)b), + shr(">>", (a, b) -> (long)a >> (long)b), or("or", (a, b) -> (long)a | (long)b), and("and", (a, b) -> (long)a & (long)b), xor("xor", (a, b) -> (long)a ^ (long)b), diff --git a/core/src/mindustry/maps/Map.java b/core/src/mindustry/maps/Map.java index e47e369140..c5237178b3 100644 --- a/core/src/mindustry/maps/Map.java +++ b/core/src/mindustry/maps/Map.java @@ -130,7 +130,7 @@ public class Map implements Comparable, Publishable{ } 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){ diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 44f8c8db6f..54c3856d7d 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -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. */ public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){ + if(shuffler != null) return shuffler.next(mode, previous); return shuffleMode.next(mode, previous); } diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index 1124c195b8..dedebfe713 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -17,13 +17,13 @@ import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; public abstract class FilterOption{ - public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); - public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); - public static final Boolf 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 wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); - public static final Boolf 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 floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)); + public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)) && b.inEditor; + public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Boolf 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 oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); - public static final Boolf anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air; + public static final Boolf anyOptional = b -> (floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air) && b.inEditor; public abstract void build(Table table); diff --git a/core/src/mindustry/maps/generators/FileMapGenerator.java b/core/src/mindustry/maps/generators/FileMapGenerator.java index e0b8bf3946..dab00370ed 100644 --- a/core/src/mindustry/maps/generators/FileMapGenerator.java +++ b/core/src/mindustry/maps/generators/FileMapGenerator.java @@ -3,7 +3,6 @@ package mindustry.maps.generators; import arc.math.*; import arc.math.geom.*; import mindustry.content.*; -import mindustry.ctype.*; import mindustry.game.*; import mindustry.io.*; import mindustry.maps.*; @@ -29,12 +28,13 @@ public class FileMapGenerator implements WorldGenerator{ world.setGenerating(true); tiles = world.tiles; + Item[] items = {Items.blastCompound, Items.pyratite, Items.copper, Items.thorium, Items.copper, Items.lead}; for(Tile tile : tiles){ if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && state.hasSector()){ - for(Content content : state.getSector().data.resources){ - if(content instanceof Item && Mathf.chance(0.3)){ - tile.build.items.add((Item)content, Math.min(Mathf.random(500), tile.block().itemCapacity)); + for(Item content : items){ + if(Mathf.chance(0.2)){ + tile.build.items.add(content, Math.min(Mathf.random(500), tile.block().itemCapacity)); } } } diff --git a/core/src/mindustry/maps/generators/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 2ce0bbae27..6bbc15ed2f 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -5,7 +5,6 @@ import arc.util.noise.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.type.*; -import mindustry.type.Sector.*; import mindustry.world.*; public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{ @@ -24,7 +23,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe if(noise < 0.15){ for(Ptile other : tile.tiles){ - if(sector.planet.getSector(other).is(SectorAttribute.base)){ + if(sector.planet.getSector(other).generateEnemyBase){ any = false; break; } @@ -32,7 +31,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe } if(any){ - sector.data.attributes |= (1 << SectorAttribute.base.ordinal()); + sector.generateEnemyBase = true; } } diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 42035abf4f..9aeee4ab2f 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -600,9 +600,14 @@ public class Mods implements Loadable{ 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()){ - 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."); } @@ -646,7 +651,9 @@ public class Mods implements Loadable{ 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); }catch(Exception e){ diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 05bd69fe32..271ea5f9d1 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -42,6 +42,8 @@ public class NetworkIO{ try(DataInputStream stream = new DataInputStream(is)){ Time.clear(); 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.wave = stream.readInt(); diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 570671de4f..651c5c7923 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -1,7 +1,6 @@ package mindustry.type; import arc.*; -import arc.files.*; import arc.func.*; import arc.graphics.*; import arc.math.*; @@ -10,15 +9,12 @@ import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; -import arc.util.io.*; import arc.util.noise.*; -import mindustry.*; import mindustry.ctype.*; import mindustry.graphics.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.maps.generators.*; -import mindustry.type.Sector.*; import static mindustry.Vars.*; @@ -83,25 +79,10 @@ public class Planet extends UnlockableContent{ sectors = new Seq<>(grid.tiles.length); 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); - - //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{ sectors = new Seq<>(); } @@ -196,7 +177,7 @@ public class Planet extends UnlockableContent{ for(Sector sector : sectors){ float sum = 1f; for(Sector other : sector.inRange(2)){ - if(other.is(SectorAttribute.base)){ + if(other.generateEnemyBase){ sum += 1f; } } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 856dd2219d..137c1b0142 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -7,12 +7,9 @@ import arc.struct.ObjectIntMap.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; -import arc.util.io.*; import mindustry.*; -import mindustry.ctype.*; import mindustry.game.Saves.*; import mindustry.graphics.g3d.PlanetGrid.*; -import mindustry.world.*; import static mindustry.Vars.*; @@ -27,24 +24,22 @@ public class Sector{ public final Ptile tile; public final int id; - public final SectorData data; - public @Nullable SaveSlot save; public @Nullable SectorPreset preset; /** Number 0-1 indicating the difficulty based on nearby bases. */ public float baseCoverage; + public boolean generateEnemyBase; //TODO implement a dynamic launch period public int launchPeriod = 10; - public Sector(Planet planet, Ptile tile, SectorData data){ + public Sector(Planet planet, Ptile tile){ this.planet = planet; this.tile = tile; this.plane = new Plane(); this.rect = makeRect(); this.id = tile.id; - this.data = data; } public Seq inRange(int range){ @@ -100,7 +95,7 @@ public class Sector{ /** @return whether the enemy has a generated base here. */ public boolean hasEnemyBase(){ - return is(SectorAttribute.base) && (save == null || save.meta.rules.waves); + return generateEnemyBase && (save == null || save.meta.rules.waves); } public boolean isBeingPlayed(){ @@ -311,10 +306,6 @@ public class Sector{ 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 final Vec3 center, top, right; public final Vec3 result = new Vec3(); @@ -335,64 +326,4 @@ public class Sector{ 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 - } } diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 163fa7f211..b14cec7f30 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -4,6 +4,7 @@ import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -14,7 +15,7 @@ import mindustry.world.blocks.*; import static mindustry.Vars.*; -public abstract class Weather extends MappableContent{ +public abstract class Weather extends UnlockableContent{ /** Default duration of this weather event in ticks. */ public float duration = 9f * Time.toMinutes; 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 public ContentType getContentType(){ return ContentType.weather; } @Remote(called = Loc.server) - public static void createWeather(Weather weather, float intensity, float duration){ - weather.create(intensity, duration); + public static void createWeather(Weather weather, float intensity, float duration, float windX, float windY){ + weather.create(intensity, duration).windVector.set(windX, windY); } public static class WeatherEntry{ @@ -104,7 +115,7 @@ public abstract class Weather extends MappableContent{ public Weather weather; /** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */ 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; /** Intensity of the weather produced. */ public float intensity = 1f; @@ -132,12 +143,12 @@ public abstract class Weather extends MappableContent{ @EntityDef(value = {WeatherStatec.class}, pooled = true, isFinal = false) @Component(base = true) - abstract static class WeatherStateComp implements Drawc{ + abstract static class WeatherStateComp implements Drawc, Syncc{ private static final float fadeTime = 60 * 4; Weather weather; float intensity = 1f, opacity = 0f, life, effectTimer; - Vec2 windVector = new Vec2(); + Vec2 windVector = new Vec2().setToRandomDirection(); void init(Weather weather){ this.weather = weather; @@ -146,7 +157,7 @@ public abstract class Weather extends MappableContent{ @Override public void update(){ if(life < fadeTime){ - opacity = life / fadeTime; + opacity = Math.min(life / fadeTime, opacity); }else{ opacity = Mathf.lerpDelta(opacity, 1f, 0.004f); } diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index cdf35ab3c3..cbc0100943 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -115,7 +115,9 @@ public class Fonts{ /** Called from a static context for use in the loading screen.*/ 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(); Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); Core.assets.setLoader(Font.class, null, new FreetypeFontLoader(resolver){ diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 8bf500205b..294e547510 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -3,19 +3,24 @@ package mindustry.ui.dialogs; import arc.*; import arc.func.*; import arc.graphics.*; +import arc.math.*; import arc.scene.style.*; import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.type.Weather.*; import mindustry.ui.*; import mindustry.world.*; +import static arc.util.Time.*; import static mindustry.Vars.*; public class CustomRulesDialog extends BaseDialog{ @@ -176,8 +181,9 @@ public class CustomRulesDialog extends BaseDialog{ }}).grow(); }).margin(4).size(50f).padRight(10); b.add("@rules.ambientlight"); - }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f); - main.row(); + }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row(); + + main.button("@rules.weather", this::weatherDialog).width(250f).left().row(); //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.row(); } + + Cell 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.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 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(); + } } diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index b59f32e995..4d710fe27c 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -427,7 +427,7 @@ public class JoinDialog extends BaseDialog{ } //get servers - Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> { + Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> { try{ Jval val = Jval.read(result.getResultAsString()); Core.app.post(() -> { diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 3462891f6a..022a92b770 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -321,16 +321,25 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.row(); } - stable.add("@sectors.resources").row(); - stable.table(t -> { - t.left(); - int idx = 0; - int max = 5; - for(UnlockableContent c : sector.data.resources){ - t.image(c.icon(Cicon.small)).padRight(3); - if(++idx % max == 0) t.row(); - } - }).fillX().row(); + if(sector.save != null){ + stable.add("@sectors.resources").row(); + stable.table(t -> { + + if(sector.save != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.resources.any()){ + t.left(); + int idx = 0; + int max = 5; + for(UnlockableContent c : sector.save.meta.secinfo.resources){ + t.image(c.icon(Cicon.small)).padRight(3); + if(++idx % max == 0) t.row(); + } + }else{ + t.add("@unknown").color(Color.lightGray); + } + + + }).fillX().row(); + } //production if(sector.hasBase() && sector.save.meta.hasProduction){ diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index e07c5dc310..d26a886e2c 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -57,7 +57,7 @@ public class ChatFragment extends Table{ } } - return net.active(); + return net.active() && ui.hudfrag.shown(); }); update(() -> { diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 97f6d6ce92..65038ee67f 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -76,6 +76,19 @@ public class HudFragment extends Fragment{ 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 //menu at top left parent.fill(cont -> { @@ -212,18 +225,6 @@ public class HudFragment extends Fragment{ }).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 parent.fill(t -> { t.top().add(coreItems); diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index f401aff34b..8d54dfad9f 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -70,10 +70,10 @@ public class ForceProjector extends Block{ Draw.color(Pal.gray); 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); Lines.stroke(1f); - Lines.poly(x * tilesize, y * tilesize, 6, radius); + Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius); Draw.color(); } diff --git a/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java index 823e390e69..18bc444eec 100644 --- a/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -28,8 +28,8 @@ public class ExtendingItemBridge extends ItemBridge{ int i = tile.absoluteRelativeTo(other.x, other.y); - float ex = other.worldx() - x - Geometry.d4[i].x * tilesize / 2f, - ey = other.worldy() - y - Geometry.d4[i].y * tilesize / 2f; + float ex = other.worldx() - x - Geometry.d4(i).x * tilesize / 2f, + ey = other.worldy() - y - Geometry.d4(i).y * tilesize / 2f; float uptime = state.isEditor() ? 1f : this.uptime; @@ -42,15 +42,15 @@ public class ExtendingItemBridge extends ItemBridge{ Lines.stroke(8f); Lines.line(bridgeRegion, - x + Geometry.d4[i].x * tilesize / 2f, - y + Geometry.d4[i].y * tilesize / 2f, + x + Geometry.d4(i).x * tilesize / 2f, + y + Geometry.d4(i).y * tilesize / 2f, x + ex, y + ey, false); Draw.rect(endRegion, x, y, i * 90 + 90); Draw.rect(endRegion, - x + ex + Geometry.d4[i].x * tilesize / 2f, - y + ey + Geometry.d4[i].y * tilesize / 2f, i * 90 + 270); + x + ex + Geometry.d4(i).x * tilesize / 2f, + 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)); @@ -61,8 +61,8 @@ public class ExtendingItemBridge extends ItemBridge{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * uptime, - y + Geometry.d4[i].y * (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, i * 90f); } Draw.reset(); diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index f188d0e902..6064963919 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -62,7 +62,7 @@ public class ItemBridge extends Block{ 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( bridgeRegion, @@ -99,7 +99,7 @@ public class ItemBridge extends Block{ 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); - 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(); } @@ -303,7 +303,7 @@ public class ItemBridge extends Block{ 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, x + Tmp.v1.x, @@ -321,8 +321,8 @@ public class ItemBridge extends Block{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), - y + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); + x + Geometry.d4(i).x * (tilesize / 2f + a * 4f + time % 4f), + y + Geometry.d4(i).y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); } Draw.reset(); } diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index 983ebaf954..d70c518bc0 100644 --- a/core/src/mindustry/world/blocks/distribution/StackConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/StackConveyor.java @@ -117,7 +117,7 @@ public class StackConveyor extends Block implements Autotiler{ 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; @@ -138,7 +138,7 @@ public class StackConveyor extends Block implements Autotiler{ //item 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); - 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 diff --git a/core/src/mindustry/world/blocks/environment/Cliff.java b/core/src/mindustry/world/blocks/environment/Cliff.java index 408fb2ee5a..d4347a7c97 100644 --- a/core/src/mindustry/world/blocks/environment/Cliff.java +++ b/core/src/mindustry/world/blocks/environment/Cliff.java @@ -6,6 +6,7 @@ import mindustry.graphics.*; import mindustry.world.*; public class Cliff extends Block{ + public float size = 11f; public Cliff(String name){ super(name); @@ -18,11 +19,12 @@ public class Cliff extends Block{ @Override public void drawBase(Tile tile){ + int r = tile.data; for(int i = 0; i < 8; i++){ if((r & (1 << i)) != 0){ 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); } } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index f297ccad57..80f15bf152 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -140,7 +140,7 @@ public class Reconstructor extends UnitBlock{ if(moveInPayload()){ if(consValid()){ valid = true; - progress += edelta(); + progress += edelta() * state.rules.unitBuildSpeedMultiplier; } //upgrade the unit diff --git a/core/src/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java index 4cdc6a6182..721ac7c582 100644 --- a/core/src/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -16,6 +16,7 @@ public enum StatUnit{ powerUnits, degrees, seconds, + minutes, perSecond, perMinute, timesSpeed(false), diff --git a/desktop/build.gradle b/desktop/build.gradle index 3955380145..c29ee65eff 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -11,7 +11,7 @@ project.ext.assetsDir = new File("../core/assets") def enableTemplates = true 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 hashDirectory = { @@ -127,13 +127,13 @@ PackrConfig.Platform.values().each{ platform -> verbose = true bundleIdentifier = getPackage() + ".mac" iconResource = ICON_DIR - outDir = file("build/packr/output") + outDir = file("$rootDir/desktop/build/packr/output") mainClass = project.ext.mainClassName - classpath = ["desktop/build/packr/desktop.jar"] - removePlatformLibs = ["desktop/build/packr/desktop.jar"] + classpath = ["$rootDir/desktop/build/packr/desktop.jar".toString()] + removePlatformLibs = ["$rootDir/desktop/build/packr/desktop.jar".toString()] vmArgs = [] - minimizeJre = "desktop/packr_minimize.json" + minimizeJre = "$rootDir/desktop/packr_minimize.json".toString() jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip" if(platform == PackrConfig.Platform.MacOS){ diff --git a/fastlane/metadata/android/en-US/changelogs/29659.txt b/fastlane/metadata/android/en-US/changelogs/29659.txt new file mode 100644 index 0000000000..77646b10bd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29659.txt @@ -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 diff --git a/fastlane/metadata/steam/korean/achievements.vdf b/fastlane/metadata/steam/korean/achievements.vdf index 4d274ee96b..14aba2fd5e 100644 --- a/fastlane/metadata/steam/korean/achievements.vdf +++ b/fastlane/metadata/steam/korean/achievements.vdf @@ -14,11 +14,11 @@ "NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부" "NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요." "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_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요." "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_DESC" "캠페인 지역에 30번 도전하세요." "NEW_ACHIEVEMENT_20_10_NAME" "끈질긴" @@ -36,9 +36,9 @@ "NEW_ACHIEVEMENT_20_17_NAME" "한 중대한 실수" "NEW_ACHIEVEMENT_20_17_DESC" "분배기를 연구하세요." "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_DESC" "적 블럭을 1,000개 파괴하세요." + "NEW_ACHIEVEMENT_20_19_DESC" "적 블록을 1,000개 파괴하세요." "NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!" "NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요." "NEW_ACHIEVEMENT_20_21_NAME" "맵퍼" @@ -88,11 +88,11 @@ "NEW_ACHIEVEMENT_21_14_NAME" "출격!" "NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요." "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_DESC" "분배기를 2개 붙여서 건설하세요." "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_DESC" "포탑에 파이라타이트를 사용하세요." "NEW_ACHIEVEMENT_21_19_NAME" "효율성" diff --git a/fastlane/metadata/steam/russian/achievements.vdf b/fastlane/metadata/steam/russian/achievements.vdf index 1289b5db58..628e39b9a5 100644 --- a/fastlane/metadata/steam/russian/achievements.vdf +++ b/fastlane/metadata/steam/russian/achievements.vdf @@ -68,7 +68,7 @@ "NEW_ACHIEVEMENT_21_4_NAME" "Стая" "NEW_ACHIEVEMENT_21_4_DESC" "Имейте одновременно 10 активных дронов «Фантом»." "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_DESC" "Постройте в целом 1000 единиц." "NEW_ACHIEVEMENT_21_7_NAME" "Super" diff --git a/gradle.properties b/gradle.properties index 41ab5eeb6c..f4752f1ab3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=557aa4c1d08c9260992a6ce108ac609272ee0eee +archash=51747eb9d90decdb53b6f4fd5d7043b9f9a219a7 diff --git a/servers_be.json b/servers_be.json index 28c7f07566..5ebfae37df 100644 --- a/servers_be.json +++ b/servers_be.json @@ -5,15 +5,6 @@ { "address": "nydustry.nydus.app:6060" }, - { - "address": "mindustry.pl:6000" - }, - { - "address": "routerchain.ddns.net" - }, - { - "address": "mindustry.pl:6666" - }, { "address": "md.surrealment.com" } diff --git a/servers_v6.json b/servers_v6.json new file mode 100644 index 0000000000..adcfa052dd --- /dev/null +++ b/servers_v6.json @@ -0,0 +1,14 @@ +[ + { + "address": "mindustry.pl:6000" + }, + { + "address": "mindustry.pl:6666" + }, + { + "address": "routerchain.ddns.net" + }, + { + "address": "pandorum.su:8000" + } +] diff --git a/tools/build.gradle b/tools/build.gradle index 1b45dd95c0..3266834485 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -409,16 +409,6 @@ task genSprites(dependsOn: classes, type: JavaExec){ 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){ file(genFolder).mkdirs() diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 8c6a9f6c9d..b9cae3a128 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -232,18 +232,22 @@ public class Generators{ boolean hasEmpty = false; Color average = new Color(); + float asum = 0f; for(int x = 0; x < image.width; x++){ for(int y = 0; y < image.height; y++){ Color color = image.getColor(x, y); - average.r += color.r; - average.g += color.g; - average.b += color.b; + average.r += color.r*color.a; + average.g += color.g*color.a; + average.b += color.b*color.a; + asum += color.a; if(color.a < 0.9f){ hasEmpty = true; } } } - average.mul(1f / (image.width * image.height)); + + average.mul(1f / asum); + if(block instanceof Floor){ average.mul(0.8f); }else{ diff --git a/tools/src/mindustry/tools/SectorDataGenerator.java b/tools/src/mindustry/tools/SectorDataGenerator.java deleted file mode 100644 index 622a0b2466..0000000000 --- a/tools/src/mindustry/tools/SectorDataGenerator.java +++ /dev/null @@ -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.getBy(ContentType.planet)){ - int[] count = {0}; - if(planet.grid == null) continue; - - Fi fi = Fi.get("planets").child(planet.name + ".dat"); - - Seq list = planet.sectors.map(sector -> { - SectorData data = new SectorData(); - - ObjectIntMap floors = new ObjectIntMap<>(); - ObjectSet 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> 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; - } -}