diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index aea352ebbe..45045d5c2d 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -384,7 +384,6 @@ public void process(RoundEnvironment env) throws Exception{ //get all methods from components for(Smethod elem : comp.methods()){ - if (comp.name().equals("PlayerComp") && elem.toString().equals("unit()")) Log.info(elem.annotations()); methods.get(elem.toString(), Seq::new).add(elem); } } @@ -417,17 +416,17 @@ public void process(RoundEnvironment env) throws Exception{ //add all methods from components for(ObjectMap.Entry> entry : methods){ - Smethod replacement = null; + Smethod base = null; for(Smethod method : entry.value){ if(method.has(Replace.class)){ - if(replacement == null) replacement = method; + if(base == null) base = method; else{ //multiple replacements for one method err("Type " + type + " has multiple components replacing method " + entry.key + "."); break; } } } - if(replacement != null) entry.value.clear().add(replacement); + if(base != null) entry.value.clear().add(base); //check multi return if(entry.value.count(m -> !m.isAny(Modifier.NATIVE, Modifier.ABSTRACT) && !m.isVoid()) > 1){ @@ -448,7 +447,7 @@ public void process(RoundEnvironment env) throws Exception{ MethodSpec.Builder mbuilder = MethodSpec.methodBuilder(first.name()).addModifiers(first.is(Modifier.PRIVATE) ? Modifier.PRIVATE : Modifier.PUBLIC); //if(isFinal || entry.value.contains(s -> s.has(Final.class))) mbuilder.addModifiers(Modifier.FINAL); if(entry.value.contains(s -> s.has(CallSuper.class))) mbuilder.addAnnotation(CallSuper.class); //add callSuper here if necessary - if(first.has(Nullable.class)) mbuilder.addAnnotation(Nullable.class); //add Nullable here if necessary + if(first.has(Nullable.class)) mbuilder.addAnnotation(Nullable.class); if(first.is(Modifier.STATIC)) mbuilder.addModifiers(Modifier.STATIC); mbuilder.addTypeVariables(first.typeVariables().map(TypeVariableName::get)); mbuilder.returns(first.retn()); @@ -779,6 +778,7 @@ public void process(RoundEnvironment env) throws Exception{ //implement each definition for(EntityDefinition def : definitions){ + ObjectSet methodNames = def.components.flatMap(type -> type.methods().map(Smethod::simpleString)).as().asSet(); //add base class extension if it exists diff --git a/build.gradle b/build.gradle index 2c62344f58..969b124320 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,6 @@ buildscript{ } dependencies{ - classpath "com.mobidevelop.robovm:robovm-gradle-plugin:2.3.16" classpath arcModule(":extensions:packer") classpath arcModule(":arc-core") } @@ -46,7 +45,7 @@ allprojects{ if(!project.hasProperty("assetUrl")) assetUrl = 'mindustry-antigrief/mindustry-client' if(!project.hasProperty("assetRef")) assetRef = 'v8' if(!project.hasProperty("versionModifier")) versionModifier = 'bleeding-edge' - if(!project.hasProperty("buildversion")) buildversion = '25370' + if(!project.hasProperty("buildversion")) buildversion = '25411' if(!project.hasProperty("clientVersion")) clientVersion = 'v1.0.0, Jan. 1, 1970' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' @@ -149,6 +148,7 @@ allprojects{ props.put("number", versionNumber) props.put("modifier", versionModifier) props.put("build", buildid) + props.put("commitHash", project.hasProperty("showCommitHash") ? 'git rev-parse --verify --short HEAD'.execute().text.trim() : "unknown") PropertiesUtils.store(props, pfile.newWriter(), "Autogenerated file. Do not modify.") } diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2e21fc5ca6..1f9c29b244 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -2,6 +2,7 @@ # General client stuff with no category (clean this up probably) # FINISHME: Finish making all of the categories and individual items alphabetical client.name = Foo's Client +category.client.name = Foo's Client client.features = Features and Documentation client.changelog = Client Changelog client.mute = Toggles mute for this player @@ -884,8 +885,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Loading world data... server.port = Port: -server.addressinuse = Address already in use! server.invalidport = Invalid port number! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Error hosting server. save.new = New Save save.overwrite = Are you sure you want to overwrite\nthis save slot? @@ -1256,7 +1257,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Uncover configure = Configure Loadout @@ -1331,6 +1331,7 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround for this issue. weather.rain.name = Rain weather.snowing.name = Snow @@ -1422,6 +1423,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1445,11 +1448,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis @@ -2708,6 +2713,10 @@ block.phase-wall.description = Protects structures from enemy projectiles, refle block.phase-wall-large.description = Protects structures from enemy projectiles, reflecting most bullets upon impact. block.surge-wall.description = Protects structures from enemy projectiles, periodically releasing electric arcs upon contact. block.surge-wall-large.description = Protects structures from enemy projectiles, periodically releasing electric arcs upon contact. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = A wall that can be opened and closed. block.door-large.description = A wall that can be opened and closed. block.mender.description = Periodically repairs blocks in its vicinity.\nOptionally uses silicon to boost range and efficiency. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index dee8d2da71..55c6d913f0 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Перападключэнне... reconnect = Reconnect connecting.data = [accent]Загрузка дадзеных свету… server.port = Порт: -server.addressinuse = Дадзены адрас ужо выкарыстоўваецца! server.invalidport = Няправільны нумар порта! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [барвовы]Памылка стварэння сервера. save.new = Новае захаванне save.overwrite = Вы ўпэўненыя, што жадаеце перазапісаць\nгэты слот для захавання? @@ -1136,7 +1136,6 @@ requirement.capture = Захапіць {0} requirement.onplanet = Кантраляваць Сектар На {0} requirement.onsector = Прызямліцца На Сектар: {0} launch.text = Запуск -research.multiplayer = Толькі хасты могуць даследаваць прадметы. map.multiplayer = Толькі хасты могуць праглядаць сектары. uncover = Раскрыць configure = Канфігурацыя выгрузкі @@ -1204,6 +1203,8 @@ error.mapnotfound = Файл карты не знойдзены! error.io = Сеткавая памылка ўводу-высновы. error.any = Невядомая сеткавая памылка. error.bloom = Не атрымалася ініцыялізаваць свячэнне (Bloom). \nМагчыма, зараз Вашая прылада не падтрымлівае яго. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Дождж weather.snowing.name = Снег weather.sandstorm.name = Пясчаная бура @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Аптымальнае месца каб пачаць. Нізкая варожая пагроза. Мала рэсурсаў.\nВазімце як мага болей свінца і медзі.\nІ рухайцеся далей. sector.frozenForest.description = Нават тут, бліжэй да гор, распаўсюдзіліся споры. Ледзяныя тэмпературы не могуць утрымліваць іх заўсёды.\n\nПачніце выкарыстоўваць энергію. Пабудуйце генератары на цвёрдым паліве. Даведайцеся як выкарыстоуваць рэгенератары. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Пачатак sector.aegis.name = Ахова sector.lake.name = Рака @@ -2528,6 +2533,10 @@ block.phase-wall.description = Сцяна, пакрытая спецыяльны block.phase-wall-large.description = Сцяна, пакрытая спецыяльным фазавым адлюстроўваюць складам. Адлюстроўвае большасць куль пры ўдары. \nРазмяшчаецца на некалькіх плітках. block.surge-wall.description = Вельмі трывалы ахоўны блок. \nНакаплвае зарад пры кантакце з куляй, выпускаючы яго выпадковым чынам. block.surge-wall-large.description = Вельмі трывалы ахоўны блок. \nНакаплвает зарад пры кантакце з куляй, выпускаючы яго выпадковым чынам. \nРазмяшчаецца на некалькіх плітках. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Маленькая дзверы. Можна адкрыць або зачыніць націскам. block.door-large.description = Вялікая дзверы. Можна адкрыць і закрыць націскам. \nРазмяшчаецца на некалькіх плітках. block.mender.description = Перыядычна рамантуе блокі ў непасрэднай блізкасці. Захоўвае сродкі абароны ў цэласнасці паміж хвалямі. \nОпцонально выкарыстоўвае крэмній для павелічэння далёкасці і эфектыўнасці. diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 1148460913..997a33afd7 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Повторно свързване... reconnect = Reconnect connecting.data = [accent]Зареждане на информация за света... server.port = Порт: -server.addressinuse = Адресът вече се използва! server.invalidport = Невалиден порт! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Грешка при стартиране на сървър. save.new = Нов Запис save.overwrite = Сигурни ли сте, че искате\nда презапишете тази позиция за запиз? @@ -1137,7 +1137,6 @@ requirement.capture = Превземете {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Изстреляй -research.multiplayer = Само хостващият играч може да провежда изследвания. map.multiplayer = Само хостващият играч може да преглежда секторите. uncover = Разкрий configure = Избор на екипировка @@ -1205,6 +1204,8 @@ error.mapnotfound = Не е намерен файл с карта! error.io = Мрежова I/O грешка. error.any = Неизвестна мрежова грешка. error.bloom = Неуспешно инициализиране на Сияния.\nВашето устройство може да не поддържа този ефект. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Дъжд weather.snowing.name = Сняг weather.sandstorm.name = Пясъчна буря @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Перфектното място за започване отначало. Ниска заплаха. Ниски ресурси.\nСъбери колкото можеш мед и олово.\nПродължи напред. sector.frozenForest.description = Дори тук, близо до планините, спорите са се разпространили. Мразовитите температури не могат да ги задържат вечно.\n\nОвладейте електричеството. Постройте горивни генератори. Научете се да ползвате възстрановители. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2529,6 +2534,10 @@ block.phase-wall.description = Защитава структури от враж block.phase-wall-large.description = Защитава структури от вражески огън, отразявайки повечето куршуми при удар. block.surge-wall.description = Защитава структури от вражески огън, периодично освобождавайки волтови дъги при контакт. block.surge-wall-large.description = Защитава структури от вражески огън, периодично освобождавайки волтови дъги при контакт. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Стена, която може да бъде отворена и затворена. block.door-large.description = Стена, която може да бъде отворена и затворена. block.mender.description = Периодично поправя близки блокове.\nОпционално използва силикон за да увеличи обхвата и ефективността си. diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 39a0c02eef..dece154ba2 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Es torna a connectar… reconnect = Reconnect connecting.data = [accent]Es carreguen les dades del món… server.port = Port: -server.addressinuse = L’adreça ja es fa servir! server.invalidport = El número de port no és vàlid! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]S’ha produït un error mentre s’allotjava el servidor. save.new = Desa en un fitxer nou save.overwrite = Esteu segur que voleu sobreescriure\naquesta ranura de desades? @@ -1138,7 +1138,6 @@ requirement.capture = Captureu {0}. requirement.onplanet = Controleu el sector {0}. requirement.onsector = Aterreu al sector {0}. launch.text = Inicia el llançament -research.multiplayer = Només l’amfitrió pot recercar tecnologies. map.multiplayer = Només l’amfitrió pot veure els sectors. uncover = Descobreix configure = Configura la càrrega inicial @@ -1206,6 +1205,8 @@ error.mapnotfound = El fitxer del mapa no s’ha trobat! error.io = S’ha produït un error d’entrada/sortida de la xarxa. error.any = S’ha produït un error de xarxa desconegut. error.bloom = No s’ha pogut inicialitzar l’efecte «bloom».\nPotser el dispositiu no admet aquesta funció. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Pluja weather.snowing.name = Neu weather.sandstorm.name = Tempesta de sorra @@ -1288,6 +1289,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = El lloc adequat per a començar de nou. Amenaça enemiga baixa. Pocs recursos.\nRecolliu tot el coure i plom que pugueu.\nDesprés, continueu en un altre sector. sector.frozenForest.description = Les espores han arribat fins aquí, prop de les muntanyes. Les temperatures baixes no les podran contenir per sempre.\n\nComenceu el camí del poder. Construïu generadors a combustió. Apreneu a fer servir els reparadors. @@ -1310,11 +1313,13 @@ sector.navalFortress.description = L’enemic ha establert una base en una illa sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = El principi sector.aegis.name = L’ègida @@ -2532,6 +2537,10 @@ block.phase-wall.description = Protegeix les estructures dels projectils enemics block.phase-wall-large.description = Protegeix les estructures dels projectils enemics, reflectint la majoria de munició que hi impacta. block.surge-wall.description = Protegeix les estructures dels projectils enemics, alliberant descàrregues elèctriques periòdicament quan algun enemic el toca. block.surge-wall-large.description = Protegeix les estructures dels projectils enemics, alliberant descàrregues elèctriques periòdicament quan algun enemic el toca. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Un mur que es pot obrir i tancar. block.door-large.description = Un mur gros que es pot obrir i tancar. block.mender.description = Repara blocs propers periòdicament.\nTambé pot usar silici per a potenciar el seu abast i eficiència. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index d4b92e2203..847781a81c 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Znovu se připojuji... reconnect = Reconnect 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.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! 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? @@ -1137,7 +1137,6 @@ requirement.capture = Polap {0} requirement.onplanet = Kontrolovat Sektor na {0} requirement.onsector = Přistát na Sektor: {0} launch.text = Vyslat -research.multiplayer = Jen hostitel hry může vynalézat nové technologie. map.multiplayer = Jen hostitel může prohlížet sektory. uncover = Odkrýt mapu configure = Přizpůsobit vybavení @@ -1205,6 +1204,8 @@ error.mapnotfound = Soubor s mapou nebyl nalezen! error.io = Vstupně/výstupní (I/O) chyba sítě. error.any = Neznámá chyba sítě. error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Déšť weather.snowing.name = Sníh weather.sandstorm.name = Písečná ouře @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier 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. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = Nepřítel si vybudoval základnu na odlehlé sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Nástup sector.aegis.name = Aegis sector.lake.name = Jezero @@ -2529,6 +2534,10 @@ block.phase-wall.description = Chrání konstrukce před nepřátelskými střel block.phase-wall-large.description = Chrání konstrukce před nepřátelskými střelami, reflecting most bullets upon impact. block.surge-wall.description = Chrání konstrukce před nepřátelskými střelami. Při doteku opakovaně vydává energetické výboje. block.surge-wall-large.description = Chrání konstrukce před nepřátelskými střelami. Při doteku opakovaně vydává energetické výboje. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Zeď, která může být otevřena a zavřena. block.door-large.description = Zeď, která může být otevřena a zavřena. block.mender.description = Opakovaně opravuje bloky ve svém dosahu.\nVolitelně umí použít křemík pro posílení dosahu a efektivity. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index d01c4bdb24..da46a5673a 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Indlæser bane-data... server.port = Port: -server.addressinuse = IP-adressen er allerede i brug! server.invalidport = Ugyldigt port-nummer! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Der skete en fejl. save.new = Nyt gem save.overwrite = Er du sikker på, at du vil overskrive\ndette gem? @@ -1136,7 +1136,6 @@ requirement.capture = Overtag {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Affyr -research.multiplayer = Kun værten kan researche genstande. map.multiplayer = Only the host can view sectors. uncover = Afdæk configure = Konfigurer udrustning @@ -1204,6 +1203,8 @@ error.mapnotfound = Bane-filen er blevet væk! error.io = Network I/O-fejl. error.any = Ukendt netværksfejl. error.bloom = Kunne ikke etablere bloom-effekt.\nMåske understøtter din enhed den ikke. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Regn weather.snowing.name = Sne weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = En væg legeret med specielt, reflekterende fase- block.phase-wall-large.description = En væg legeret med specielt, reflekterende fase-stof. Reflekterer de fleste slags skud.\nFylder flere felter. block.surge-wall.description = En ekstremt hård væg.\nOpbygger en ladning ved at absorbere skud. Ladningen affyres tilfældigt block.surge-wall-large.description = En ekstremt hård væg.\nOpbygger en ladning ved at absorbere skud. Ladningen affyres tilfældigt.\nFylder flere felter. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = En bette dør. Kan åbnes og lukkes ved at trykke på den. block.door-large.description = En stor dør. Kan åbnes og lukkes ved at trykke på den.\nFylder flere felter. block.mender.description = Reparerer løbende blokke i nærheden. Hjælper til at holde forsvaret oppe mellem bølger.\nSilicium kan bruges til at øge rækkevidde og effektivitet. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index d1b700c7e1..752ed66878 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Verbindung wird wiederhergestellt... reconnect = Reconnect connecting.data = [accent] Welt wird geladen... server.port = Port: -server.addressinuse = Adresse bereits in Verwendung! server.invalidport = Falscher Port! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson] Fehler beim Hosten des Servers:[accent] {0} save.new = Neuer Spielstand save.overwrite = Möchtest du diesen Spielstand wirklich überschreiben? @@ -1137,7 +1137,6 @@ requirement.capture = Erobere {0} requirement.onplanet = Kontrolliere Sektor auf {0} requirement.onsector = Lande auf Sektor: {0} launch.text = Start -research.multiplayer = Nur der Host kann forschen. map.multiplayer = Nur der Host kann Sektoren ansehen. uncover = Freischalten configure = Anfangsressourcen festlegen @@ -1205,6 +1204,8 @@ error.mapnotfound = Kartendatei nicht gefunden! error.io = Netzwerk-I/O-Fehler. error.any = Unbekannter Netzwerkfehler. error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Regen weather.snowing.name = Schnee weather.sandstorm.name = Sandsturm @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Der optimale Ort, um anzufangen. Schwache Gegner und weniger Ressourcen.\nSammele so viel Kupfer und Blei wie möglich.\nGeh weiter. sector.frozenForest.description = Auch hier, näher an den Bergen, sind die Sporen. Sogar die niedrigen Temperaturen können sie nicht zurückhalten.\n\nLerne, Strom zu verwenden. Baue Verbrennungsgeneratoren und Reparateure. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = Der Gegner hat auf einer abgelegenen, von Nat sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Der Anfang sector.aegis.name = Aegis @@ -2534,6 +2539,10 @@ block.phase-wall.description = Beschützt Blöcke vor Gegnern, indem sie die mei block.phase-wall-large.description = Beschützt Blöcke vor Gegnern, indem sie die meisten Schüsse reflektiert. block.surge-wall.description = Beschützt Blöcke vor Gegnern und greift Gegner mit Lichtbögen an. block.surge-wall-large.description = Beschützt Blöcke vor Gegnern und greift Gegner mit Lichtbögen an. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Ein Tor, das geöffnet und geschlossen werden kann. block.door-large.description = Ein großes Tor, das geöffnet und geschlossen werden kann. block.mender.description = Repariert regelmäßig Blöcke in seiner Umgebung.\nVerwendet optional Silizium, um Reichweite und Effizienz zu steigern. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index bc7ac6b447..2116505518 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconectado... reconnect = Reconnect connecting.data = [accent]Cargando datos del mundo... server.port = Puerto: -server.addressinuse = ¡La dirección ya está en uso! server.invalidport = ¡El número de puerto no es valido! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Error alojando el servidor. save.new = Nuevo archivo de guardado save.overwrite = ¿Quieres sobrescribir\neste guardado? @@ -1138,7 +1138,6 @@ requirement.capture = Capturar {0} requirement.onplanet = Dominar sector de {0} requirement.onsector = Aterrizar en el sector: {0} launch.text = Lanzar -research.multiplayer = Solo el anfitrión de la partida puede investigar nuevas tecnologías. map.multiplayer = Solo el anfitrión de la partida puede ver los sectores del planeta. uncover = Descubrir configure = Configurar carga inicial @@ -1206,6 +1205,8 @@ error.mapnotfound = ¡Archivo de mapa no encontrado! error.io = Error I/O de conexión. error.any = Error de red desconocido. error.bloom = Error al cargar el efecto de bloom.\nPuede que tu dispositivo no sea compatible con esta característica. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Lluvia weather.snowing.name = Nieve weather.sandstorm.name = Tormenta de arena @@ -1288,6 +1289,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = La ubicación adecuada para empezar una vez más. Baja amenaza enemiga. Pocos recursos.\nReúne la mayor cantidad de plomo y cobre posible y sigue adelante. sector.frozenForest.description = Incluso aquí, cerca de las montañas, se han extendido las esporas. Las gélidas temperaturas no las contendrán para siempre.\nDescubre la energía eléctrica. Construye generadores de combustión. Aprende a usar reparadores. @@ -1310,11 +1313,13 @@ sector.navalFortress.description = El enemigo ha establecido una base en una rem sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = El Inicio sector.aegis.name = Égida @@ -2537,6 +2542,10 @@ block.phase-wall.description = Protege estructuras de proyectiles enemigos. Pued block.phase-wall-large.description = Protege estructuras de proyectiles enemigos. Puede reflejar la mayoría de proyectiles al impactar. block.surge-wall.description = Protege estructuras de proyectiles enemigos. Al contaco, libera arcos eléctricos periódicamente. block.surge-wall-large.description = Protege estructuras de proyectiles enemigos. Al contaco, libera arcos eléctricos periódicamente. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Un muro que puede estar cerrado o abierto, permitiendo el paso a través de él. block.door-large.description = Un muro que puede estar cerrado o abierto, permitiendo el paso a través de él. block.mender.description = Repara estructuras cercanas constantemente. Puede usar silicio para potenciar su alcance y eficiencia. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 92152a5eae..0764cb4782 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Maailma andmete allalaadimine... server.port = Port: -server.addressinuse = Aadress on juba kasutusel! server.invalidport = Ebasobiv pordi number! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Viga serveri hostimisel. save.new = Uus salvestis save.overwrite = Oled kindel, et soovid selle salvestise asendada? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Ava configure = Muuda varustust @@ -1204,6 +1203,8 @@ error.mapnotfound = Maailmafaili ei leitud! error.io = Võrgu sisend-väljundi viga. error.any = Teadmata viga võrgus. error.bloom = Bloom-efekti lähtestamine ebaõnnestus.\nSinu seade ei pruugi seda efekti toetada. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Tugev kaitsekonstruktsioon, mis on kaetud erilise block.phase-wall-large.description = Tugev kaitsekonstruktsioon, mis on kaetud erilise faaskangapõhise peegeldava ühendiga. Pakub kaitset peaaegu kõiki tüüpi kuulide ja mürskude eest.\nUlatub üle mitme bloki. block.surge-wall.description = Äärmiselt tugev kaitsekonstruktsioon.\nKuulidega kokkupõrkel neelab energiat, vabastades seda suvalistel hetkedel. block.surge-wall-large.description = Äärmiselt tugev kaitsekonstruktsioon.\nKuulidega kokkupõrkel neelab energiat, vabastades seda suvalistel hetkedel.\nUlatub üle mitme bloki. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Väike uks, mida saab avada ja sulgeda sellele vajutades. block.door-large.description = Suur uks, mida saab avada ja sulgeda sellele vajutades.\nUlatub üle mitme bloki. block.mender.description = Parandab perioodiliselt enda ümber olevaid konstruktsioone, hoides neid lahingulainete järel töökorras ja tervena. Ulatuse ja efektiivsuse parendamiseks on võimalik kasutada räni. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 7bf092385b..83018d1da7 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Munduaren datuak kargatzen... server.port = Ataka: -server.addressinuse = Helbidea dagoeneko erabilita dago! server.invalidport = Ataka zenbaki baliogabea! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Errorea zerbitzaria ostatatzean: [accent]{0} save.new = Gordetako partida berria save.overwrite = Ziur gordetzeko tarte hau gainidatzi nahi duzula? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Estalgabetu configure = Konfiguratu zuzkidura @@ -1204,6 +1203,8 @@ error.mapnotfound = Ez da mapa-fitxategia aurkitu! error.io = Sareko irteera/sarrera errorea. error.any = Sareko errore ezezaguna. error.bloom = Ezin izan da distira hasieratu.\nAgian zure gailuak ez du onartzen. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Fasez osatutako konposatu islatzaile batez estali block.phase-wall-large.description = Fasez osatutako konposatu islatzaile batez estalitako horma bat. Talkan jasotako bala gehienak desbideratzen ditu.\nHainbat lauza hartzen ditu. block.surge-wall.description = Defentsarako bloke nabarmen iraunkorra.\nKarga hartzen du balakadak jasotzean, hau edonora askatuz. block.surge-wall-large.description = Defentsarako bloke nabarmen iraunkorra.\nKarga hartzen du balakadak jasotzean, edonora askatuz.\nHainbat lauza hartzen ditu. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Ate txiki bat. Sakatuz ireki eta itxi daiteke. block.door-large.description = Ate handi bat. Sakatuz ireki eta itxi daiteke.\nHainbat lauza hartzen ditu. block.mender.description = Aldiro inguruko blokeak konpontzen ditu. Defentsak bere onean mantentzen ditu boladen artean.\nAukeran silizioa erabili dezake irismena eta eraginkortasuna hobetzeko. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 0107905e45..caf73002b1 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Yhdistetään uudelleen... reconnect = Reconnect connecting.data = [accent]Ladataan maailman tietoja... server.port = Portti: -server.addressinuse = Osoite on jo käytössä! server.invalidport = Tällä portilla ei löytynyt peliä! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Virhe palvelimen hostaamisessa: [accent]{0} save.new = Uusi tallennus save.overwrite = Haluatko varmasti korvata \ntämän tallennuspaikan?? @@ -1136,7 +1136,6 @@ requirement.capture = Valtaa {0} requirement.onplanet = Hallitse sektoria planeetalla {0} requirement.onsector = Laskeudu sektorille: {0} launch.text = Laukaise -research.multiplayer = Vain ylläpitäjä voi tutkia tavaroita. map.multiplayer = Vain ylläpitäjä voi katsella sektoreita. uncover = Paljasta configure = Muokkaa lastia @@ -1204,6 +1203,8 @@ error.mapnotfound = Karttatiedostoa ei löydy! error.io = Verkon I/O-virhe. error.any = Tuntematon verkon virhe. error.bloom = Bloomin initialisointi epäonnistui.\nLaitteesi ei ehkä tue sitä. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Sade weather.snowing.name = Lumi weather.sandstorm.name = Hiekkamyrsky @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Optimaalinen sijainti aloittaa jälleen kerran. Matala vihollisuhka. Vähän resursseja.\nKerää niin paljon kuparia ja lyijyä, kuin mahdollista.\nJatka matkaa. sector.frozenForest.description = Itiöt ovat levittäytyneet jopa tänne, lähemmäs vuoria. Jäätävät lämpötilat eivät voi torjua niitä ikuisesti.\n\nAloita seikkailusi virtaan. Rakenna polttogeneraattoreita. Opi käyttämään korjaajia. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Alku sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Muuri, joka on päällystetty erityisellä kiihto block.phase-wall-large.description = Muuri, joka on päällystetty erityisellä kiihtokuitupohjaisella heijastavalla yhdisteellä. Torjuu useimmat ammukset näiden törmätessä.\nKattaa useita laattoja. block.surge-wall.description = Äärimmäisen kestävä puolustava palikka.\nVaraa jännitteen ammusten iskeytyessä, vapauttaen sen satunnaisesti. block.surge-wall-large.description = Äärimmäisen kestävä puolustava palikka.\nVaraa jännitteen ammusten iskeytyessä, vapauttaen sen satunnaisesti.\nKattaa useita laattoja. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Pieni ovi. Voidaan avata ja sulkea painamalla. block.door-large.description = Suuri ovi. Voidaan avata ja sulkea painamalla.\nKattaa useita laattoja. block.mender.description = Korjaa läheisiä palikoita ajoittain. Pitää puolustuksia korjattuna tasojen aikana ja välillä.\nKäyttää valinnaisesti piitä tehostaakseen kantamaa ja tehoa. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index d491ef632a..025285ee1b 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Loading world data... server.port = Port: -server.addressinuse = Address already in use! server.invalidport = Invalid port number! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Error hosting server. save.new = Bagong Save save.overwrite = Sigurado ka bang gusto mong i-overwrite ang save slot na ito? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Ang host lang ang makakapagsaliksik ng mga item. map.multiplayer = Ang host lang ang makakatingin sa mga sektor. uncover = Uncover configure = I-Configure ang Loadout @@ -1204,6 +1203,8 @@ error.mapnotfound = Hindi nakita ang file ng mapa! error.io = Network I/O error. error.any = Unknown network error. error.bloom = Nabigong simulan ang bloom.\nMaaaring hindi ito sinusuportahan ng iyong device. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Ang pinakamainam na lokasyon upang magsimulang muli. Mababang banta ng kaaway. Kaunting mapagkukunan.\nMagtipon ng mas maraming tingga at tanso hangga't maaari.\nItuloy. sector.frozenForest.description = Kahit dito, mas malapit sa mga bundok, ang mga spore ay kumalat. Ang napakalamig na temperatura ay hindi maaaring maglaman ng mga ito magpakailanman.\n\nSimulan ang pakikipagsapalaran sa kapangyarihan. Bumuo ng mga generator ng pagkasunog. Matutong gumamit ng mga mender. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Isang pader na pinahiran ng espesyal na phase-bas block.phase-wall-large.description = Isang pader na pinahiran ng espesyal na phase-based na reflective compound. Pinapalihis ang karamihan sa mga bala kapag natamaan.\nGumagamit ng maraming tile. block.surge-wall.description = Isang napakatibay na defensive block.\nNagpapalaki ng singil sa bullet contact, na ilalabas ito nang random. block.surge-wall-large.description = Isang napakatibay na defensive block.\nBumubuo ng singil sa bullet contact, ilalabas ito nang random.\nGumagamit ng maraming tile. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Isang maliit na pinto. Maaaring buksan o isara sa pamamagitan ng pag-tap. block.door-large.description = Isang malaking pinto. Maaaring buksan at isara sa pamamagitan ng pag-tap.\nSpans maramihang mga tile. block.mender.description = Pana-panahong nag-aayos ng mga blocks sa paligid nito. Pinapanatiling maayos ang mga depensa sa pagitan ng mga alon.\nOpsyonal na gumagamit ng silicon upang palakasin ang saklaw at kahusayan. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 91d6168f5d..d3813891c2 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnexion... reconnect = Reconnect connecting.data = [accent]Chargement des données du monde... server.port = Port : -server.addressinuse = Adresse déjà utilisée ! server.invalidport = Numéro de port invalide ! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Erreur lors de l'hébergement du serveur. save.new = Nouvelle sauvegarde save.overwrite = Êtes-vous sûr de vouloir\nécraser cette sauvegarde ? @@ -1138,7 +1138,6 @@ requirement.capture = Capturer {0} requirement.onplanet = Contrôler le Secteur sur {0} requirement.onsector = Atterrir sur le Secteur: {0} launch.text = Décoller -research.multiplayer = Seul l'hôte peut rechercher des objets. map.multiplayer = Seul l'hôte peut voir les secteurs. uncover = Découvrir configure = Modifier le chargement @@ -1206,6 +1205,8 @@ error.mapnotfound = Fichier de carte introuvable ! error.io = Erreur de Réseau (I/O) error.any = Erreur de réseau inconnue. error.bloom = Échec de l'initialisation du flou lumineux.\nIl se peut que votre appareil ne le prenne pas en charge. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Pluie weather.snowing.name = Neige weather.sandstorm.name = Tempête de sable @@ -1288,6 +1289,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et peu de ressources disponibles.\nRassemblez autant de cuivre et de plomb que possible pour continuer votre exploration. sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin. @@ -1310,11 +1313,13 @@ sector.navalFortress.description = L’ennemi a établi une base sur une île is sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis @@ -2534,6 +2539,10 @@ block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, m block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis. block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index f1cb94898b..ce8fa436ef 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -778,8 +778,8 @@ reconnecting = [accent]Újrakapcsolódás... reconnect = Reconnect connecting.data = [accent]Világadatok betöltése... server.port = Port: -server.addressinuse = A cím már használatban van! server.invalidport = Érvénytelen port! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Kiszolgálóhiba. save.new = Új mentés save.overwrite = Biztosan felülírod\nezt a mentést? @@ -1139,7 +1139,6 @@ requirement.capture = Foglald el a(z) {0} szektort requirement.onplanet = Szektor elfoglalása a(z) {0} bolygón requirement.onsector = Landolj a(z) {0} szektorban launch.text = Kilövés -research.multiplayer = Csak a kiszolgáló fedezhet fel nyersanyagokat. map.multiplayer = Csak a kiszolgáló tekintheti meg a szektorokat. uncover = Felfedés configure = Rakomány szerkesztése @@ -1209,6 +1208,8 @@ error.mapnotfound = A pályafájl nem található! error.io = Internet I/O hiba. error.any = Ismeretlen hálózati hiba. error.bloom = A bloom hatás előkészítése nem sikerült.\nElőfordulhat, hogy az eszköz nem támogatja. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Eső weather.snowing.name = Hóesés weather.sandstorm.name = Homokvihar @@ -1294,6 +1295,8 @@ sector.atolls.name = Atollok sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Az ideális helyszín, hogy ismét belekezdjünk. Alacsony ellenséges fenyegetés. Kevés nyersanyag.\nGyűjts annyi rezet és ólmot, amennyit csak tudsz.\nHaladj tovább. sector.frozenForest.description = Még itt, a hegyekhez közel is elterjedtek a spórák. A fagypont alatti hőmérséklet nem tudja örökké fogva tartani őket.\n\nFedezd fel az elektromosság erejét! Építs égetőerőműveket! Tanuld meg a foltozók használatát! @@ -1317,11 +1320,13 @@ sector.navalFortress.description = Az ellenség bázist létesített egy távoli sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = A kezdet sector.aegis.name = Égisz @@ -2545,6 +2550,10 @@ block.phase-wall.description = Megvédi az épületeket az ellenséges lövedék block.phase-wall-large.description = Megvédi az épületeket az ellenséges lövedékektől, a legtöbb lövedék visszapattan róla. block.surge-wall.description = Megvédi az épületeket az ellenséges lövedékektől, periodikusan elektromos kisüléseket generál, ha hozzáérnek. block.surge-wall-large.description = Megvédi az épületeket az ellenséges lövedékektől, periodikusan elektromos kisüléseket generál, ha hozzáérnek. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Nyitható és zárható fal. block.door-large.description = Nyitható és zárható fal. block.mender.description = Időnként javítja a közeli épületeket.\nSzilíciummal növelhető a hatósugara és hatékonysága. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index fdee136925..1c4e951cf9 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -778,8 +778,8 @@ reconnecting = [accent]Menghubungkan kembali... reconnect = Reconnect connecting.data = [accent]Memuat data server... server.port = Port: -server.addressinuse = Alamat sudah dipakai! server.invalidport = Nomor port tidak valid! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Terjadi kesalahan saat menghosting server: [accent]{0} save.new = Simpanan Baru save.overwrite = Anda yakin ingin menimpa \nsimpanan ini? @@ -1139,7 +1139,6 @@ requirement.capture = Kuasai {0} requirement.onplanet = Kendalikan Sektor Di {0} requirement.onsector = Mendarat Di Sektor: {0} launch.text = Luncurkan -research.multiplayer = Hanya host yang dapat meneliti barang. map.multiplayer = Hanya host yang dapat melihat sektor. uncover = Buka configure = Konfigurasi Muatan @@ -1207,6 +1206,8 @@ error.mapnotfound = File peta tidak ditemaukan! error.io = Terjadi kesalahan jaringan I/O. error.any = Terjadi kesalahan Jaringan tidak diketahui. error.bloom = Gagal untuk menjalankan efek bloom.\nPerangkat Anda mungkin tidak mendukung fitur ini. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Hujan weather.snowing.name = Salju weather.sandstorm.name = Badai Pasir @@ -1289,6 +1290,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Lokasi yang optimal untuk bermain satu kali lagi. Sangat sedikit musuh. Sedikit sumber daya.\nKumpulkan timah dan tembaga sebanyak yang Anda bisa.\nMulai dari sini. sector.frozenForest.description = Di sini, dekat dengan gunung, spora sudah menyebar. Suhu dingin tidak dapat menahannya.\n\nMulailah hasilkan listrik. Bangun generator pembakar. Pelajari cara menggunakan mender. @@ -1311,11 +1314,13 @@ sector.navalFortress.description = Musuh telah mendirikan markas di sebuah pulau sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Serangan Awal sector.aegis.name = Aegis @@ -2536,6 +2541,10 @@ block.phase-wall.description = Melindungi bangunan dari tembakan musuh, dan dapa block.phase-wall-large.description = Melindungi bangunan dari tembakan musuh, dan dapat memantulkan beberapa jenis peluru senjata. block.surge-wall.description = Melindungi bangunan dari tembakan musuh, dan dapat mengeluarkan setruman listrik. block.surge-wall-large.description = Melindungi bangunan dari tembakan musuh, dan dapat mengeluarkan setruman listrik. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Dinding yang bisa dibuka dan ditutup. block.door-large.description = Dinding yang bisa dibuka dan ditutup. block.mender.description = Menyembuhkan blok di sekelilingnya secara berkala.\nGunakan silikon untuk meningkatkan jangkauan dan efisiensi (Opsional). diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index c31ab6a498..7e4d8a8430 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Riconnessione in corso... reconnect = Reconnect connecting.data = [accent]Caricamento del mondo... server.port = Porta: -server.addressinuse = Indirizzo già in uso! server.invalidport = Numero porta non valido! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Errore nell'hosting del server. save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? @@ -1137,7 +1137,6 @@ requirement.capture = Cattura {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Lancia -research.multiplayer = Solo l'host può scoprire gli oggetti. map.multiplayer = Solo l'host può vedere i settori. uncover = Scopri configure = Configura Equipaggiamento @@ -1205,6 +1204,8 @@ error.mapnotfound = Mappa non trovata! error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. error.bloom = Errore dell'avvio delle shaders.\nIl tuo dispositivo potrebbe non supportarle. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Pioggia weather.snowing.name = Neve weather.sandstorm.name = Tempesta di Sabbia @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = La posizione ottimale per ricominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nParti. sector.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature gelide non possono contenerle per sempre.\n\nInizia l'avventura nell'energia. Costruisci generatori a combustione. Impara a usare i riparatori. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = Il nemico ha stabilito una base su un'isola r sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Nome @@ -2529,6 +2534,10 @@ block.phase-wall.description = Protegge le strutture dai proiettili nemici rifle block.phase-wall-large.description = Protegge le strutture dai proiettili nemici riflettendone la maggior parte all'impatto. block.surge-wall.description = Protegge le strutture dai proiettili nemici rilasciando periodicamente archi elettrici al contatto. block.surge-wall-large.description = Protegge le strutture dai proiettili nemici rilasciando periodicamente archi elettrici al contatto. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Un muro che può essere aperto o chiuso. block.door-large.description = Un muro che può essere aperto o chiuso. block.mender.description = Ripara periodicamente i blocchi nelle sue vicinanze.\nAccetta silicio per aumentare la portata e l'efficienza. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 7b408c12d8..cf6bd4e8b8 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -838,8 +838,8 @@ reconnecting = [accent]再接続中... reconnect = 再接続 connecting.data = [accent]ワールドデータを読み込み中... server.port = ポート: -server.addressinuse = アドレスがすでに使用されています! server.invalidport = 無効なポート番号です! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]サーバーのホストエラー: [accent]{0} save.new = 新規保存 save.overwrite = このスロットに上書きしてもよろしいですか? @@ -1199,7 +1199,6 @@ requirement.capture = 制圧: {0} requirement.onplanet = {0} の制御セクター requirement.onsector = セクターに着陸: {0} launch.text = 発射 -research.multiplayer = 研究できるのはホストのみです。 map.multiplayer = ホストのみがセクターを表示できます。 uncover = 開放 configure = 積み荷の設定 @@ -1267,6 +1266,8 @@ error.mapnotfound = マップファイルが見つかりません! error.io = I/O ネットワークエラーです。 error.any = 不明なネットワークエラーです。 error.bloom = ブルームの初期化に失敗しました。\n恐らくあなたのデバイスではブルームがサポートされていません。 +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = 雨 weather.snowing.name = 雪 weather.sandstorm.name = 砂嵐 @@ -1350,6 +1351,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = 奪回を始めるには最適な場所です。敵の脅威は小さいですが、資源が乏しいです。\nできるだけ多くの銅と鉛を集めましょう。\n始めましょう。 sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっています。\n極寒の気候もでさえ胞子を永遠に封じ込めることはできませんでした。\n\n電気に挑みましょう。\n火力発電機を建設し、修復機の使い方を学びましょう。 @@ -1373,11 +1376,13 @@ sector.navalFortress.description = 敵は、自然要塞化した離島に基地 sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = オンセット sector.aegis.name = イージス sector.lake.name = レイク @@ -2597,6 +2602,10 @@ block.phase-wall.description = トリウムの壁ほど強固ではないが、 block.phase-wall-large.description = トリウムの壁ほど強固ではないが、強力な弾でなければ弾き返すことができます。 block.surge-wall.description = 最も硬い防壁ブロックです。\n攻撃されるとたまに放電して敵を攻撃します。 block.surge-wall-large.description = 最も硬い大型防壁ブロックです。\n攻撃されるとたまに放電して敵を攻撃します。 +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = 小さなドアブロックです。タップすることで開閉することができます。\nただし、ドアが開いている場合、弾や敵も通過できます。 block.door-large.description = 大型のドアブロックです。タップすることで開閉することができます。\nただし、ドアが開いている場合、弾や敵も通過できます。 block.mender.description = 定期的に周囲のブロックを修復します。ウェーブの間も修復し続けます。\nオプションでシリコンを利用して、さらに効率的に修復が出来ます。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 5932401c46..6f35d94b98 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -552,7 +552,7 @@ schematic.shareworkshop = 창작마당에 공유 schematic.flip = [accent][[{0}][]/[accent][[{1}][]: 설계도 뒤집기 schematic.saved = 설계도 저장됨 schematic.delete.confirm = 이 설계도는 완전히 삭제될 것입니다. -schematic.edit = Edit Schematic +schematic.edit = 설계도 수정 schematic.info = {0}x{1}, {2} 블록 schematic.disabled = [scarlet]설계도 비활성화됨[]\n이 [accent]맵[] 또는 [accent]서버[] 에서는 설계도를 사용할 수 없습니다. schematic.tags = 태그: @@ -561,12 +561,12 @@ schematic.addtag = 태그 추가하기 schematic.texttag = 텍스트 태그 schematic.icontag = 아이콘 태그 schematic.renametag = 태그 이름바꾸기 -schematic.tagged = {0} tagged +schematic.tagged = {0} 태그됨 schematic.tagdelconfirm = 이 태그를 완전히 삭제하시겠습니까? schematic.tagexists = 이 태그는 이미 존재합니다. stats = 기록 stats.wave = 진행 단계 -stats.unitsCreated = 생성한 기체 +stats.unitsCreated = 생성한 유닛 stats.enemiesDestroyed = 파괴한 적 stats.built = 건설한 건물 stats.destroyed = 파괴한 건물 @@ -578,7 +578,7 @@ level.highscore = 최고 점수: [accent]{0} level.select = 맵 선택 level.mode = 게임 모드: coreattack = < 코어가 공격을 받고 있습니다! > -nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나세요[] ]\n단계가 시작하는 순간 구역 내의 모든 건물과 기체가 파괴됩니다! +nearpoint = [[ [scarlet]즉시 적 소환구역에서 떠나세요[] ]\n단계가 시작하는 순간 구역 내의 모든 건물과 유닛이 파괴됩니다! database = 코어 데이터베이스 database.button = 데이터베이스 savegame = 게임 저장 @@ -627,6 +627,7 @@ mod.content = 콘텐츠: mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다. mod.outdatedv7 = [scarlet]Incompatible with V7 (no minGameVersion: 136) mod.missingdependencies = [scarlet]Missing dependencies: {0} + mod.incompatiblegame = [red]구버전 게임 mod.incompatiblemod = [red]호환되지 않음 mod.blacklisted = [red]지원하지 않음 @@ -634,7 +635,7 @@ mod.unmetdependencies = [red]충촉되지 않은 종속성 mod.erroredcontent = [scarlet]콘텐츠 오류 mod.circulardependencies = [red]순환 의존성 mod.incompletedependencies = [red]불완전한 의존성 -mod.requiresversion = 필요한 게임 버전: [red]{0} + mod.requiresversion.details = 게임 버전 요구: [accent]{0}[]\n당신의 게임은 구버전입니다. 이 모드가 작동하려면 최신 버전의 게임이 필요합니다. (베타/알파 릴리즈일 가능성이 있음). mod.outdatedv7.details = 이 모드는 최신 버전의 게임과 호환되지 않습니다. 반드시 작성자가 업데이트해야 하고, [accent]mod.json[] 파일에 [accent]최소게임버전: 136[]을 추가해야 합니다. mod.blacklisted.details = 이 모드는 이 버전의 게임에서 충돌 또는 기타 문제를 일으키는 것으로 인해 수동으로 블랙리스트에 올라와 있습니다. 사용하지 마세요. @@ -642,6 +643,9 @@ mod.missingdependencies.details = 이 모드에는 종속성이 없음: {0} mod.erroredcontent.details = 이 게임은 로딩하는 동안 오류가 발생했습니다. 모드 작성자에게 수정하도록 요청하세요. mod.circulardependencies.details = 이 모드는 서로 의존하는 의존성을 지니고 있습니다. mod.incompletedependencies.details = 잘못되었거나 누락한 종속성으로 인해 이 모드를 불러올 수 없습니다: {0}. + +mod.requiresversion = 필요한 게임 버전: [red]{0} + mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함 mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] 영향을 받는 모드를 비활성화하거나 플레이하기 전에 오류를 수정하세요. mod.nowdisabled = [scarlet]모드 '{0}'에 필요한 종속성이 없습니다:[accent] {1}\n[lightgray]이 모드를 먼저 내려받아야 합니다.\n이 모드는 자동으로 비활성화됩니다. @@ -671,9 +675,9 @@ available = 새로운 콘텐츠 해금이 가능합니다! unlock.incampaign = < 해금 후 상세정보 열람이 가능합니다 > campaign.select = 캠페인 시작지점 선택하기 campaign.none = [lightgray]시작할 행성을 선택하십시오.\n언제든지 전환할 수 있습니다. -campaign.erekir = [accent]신규 플레이어에게 추천합니다.[]\n\n보다 새롭고 세련된 컨텐츠. 대부분 순차적으로 캠페인이 진행됩니다.\n\n더 높은 완성도의 지도와 다채로운 경험. -campaign.serpulo = [scarlet]신규 플레이어에게 권장되지 않습니다.[]\n\n오래된 컨텐츠: 고전적인 경험. 좀 더 개방적이죠.\n\n잠재적으로 불균형한 지도와 캠페인 메커니즘. 덜 세련됩니다. -campaign.difficulty = Difficulty +campaign.erekir = [scarlet]신규 플레이어에게 권장되지 않습니다.[]\n\n보다 새롭고 세련된 컨텐츠. 대부분 순차적으로 캠페인이 진행됨.\n\n더 어렵고, 더 높은 완성도의 맵과 다채로운 경험. +campaign.serpulo = [accent]신규 플레이어에게 추천합니다.[]\n\n오래된 콘텐츠, 고전적인 경험. 더 개방적이고, 더 많은 콘텐츠.\n\n잠재적으로 불균형한 맵과 캠페인 메커니즘. 덜 세련됨. +campaign.difficulty = 난이도 completed = [accent]완료됨 techtree = 연구 기록 techtree.select = 연구 기록 선택 @@ -728,6 +732,7 @@ servers.disclaimer = 커뮤니티 서버는 개발자가 소유하거나 제어 servers.showhidden = 숨겨진 서버 보이기/숨기기 server.shown = 서버 숨기기 server.hidden = 서버 보이기 + viewplayer = 플레이어 보기: [accent]{0} trace = 플레이어 정보 보기 trace.playername = 플레이어 이름: [accent]{0} @@ -738,14 +743,16 @@ trace.mobile = 모바일 클라이언트: [accent]{0} trace.modclient = 사용자 지정 클라이언트: [accent]{0} trace.times.joined = 입장 횟수: [accent]{0} trace.times.kicked = 추방 횟수: [accent]{0} -trace.ips = IPs: -trace.names = Names: +trace.ips = IP: +trace.names = 이름: invalidid = 잘못된 클라이언트 ID입니다! 버그 보고서를 보내주세요. + player.ban = 플레이어 차단 player.kick = 플레이어 강퇴 player.trace = 플레이어 찾기 player.admin = 관리자 권한 부여 player.team = 팀 변경하기 + server.bans = 차단 목록 server.bans.none = 차단된 플레이어를 찾을 수 없습니다! server.admins = 관리자 @@ -763,7 +770,7 @@ confirmunban = 정말로 이 플레이어를 차단 해제하시겠습니까? confirmadmin = 정말로 "{0}[white]" 을(를) 관리자로 임명하시겠습니까? confirmunadmin = 정말로 "{0}[white]"의 관리자를 박탈하시겠습니까? votekick.reason = 강퇴 사유 -votekick.reason.message = "{0}[white]" 을(를) 투표 추방하시려면 해당 사유를 적어주세요 : +votekick.reason.message = "{0}[white]" 을(를) 투표 추방하시려면 해당 사유를 적어주세요: joingame.title = 게임 참가 joingame.ip = 주소: disconnect = 연결이 끊어졌습니다. @@ -777,8 +784,8 @@ reconnecting = [accent]재접속중... reconnect = Reconnect connecting.data = [accent]맵 데이터 불러오는중... server.port = 포트: -server.addressinuse = 이미 사용 중인 주소입니다! server.invalidport = 잘못된 포트 번호입니다! +server.error.addressinuse = [scarlet]포트 6567에서 서버를 열지 못했습니다.[]\n\n다른 Mindustry 서버가 귀하의 장치나 네트워크에서 실행되고 있지 않은지 확인하세요! server.error = [scarlet]서버 호스팅 오류 save.new = 새로 저장 save.overwrite = 저장된 슬롯을 덮어쓰시겠습니까? @@ -820,7 +827,7 @@ open = 열기 customize = 사용자 정의 규칙 cancel = 취소 command = 명령 -command.queue = [lightgray][Queuing] +command.queue = 대기 command.mine = 채굴 command.repair = 수리 command.rebuild = 재건 @@ -831,7 +838,7 @@ command.enterPayload = 화물 블록에 들어가기 command.loadUnits = 유닛 적재 command.loadBlocks = 블록 적재 command.unloadPayload = 화물 내려놓기 -command.loopPayload = Loop Unit Transfer +command.loopPayload = 유닛 반복 운반 stance.stop = 명령 취소하기 stance.shoot = 명령: 사격 stance.holdfire = 명령: 사격 중지 @@ -871,7 +878,7 @@ wave.waiting = 다음 단계까지[lightgray] {0}초 wave.waveInProgress = [lightgray]단계 진행중 waiting = [lightgray]대기중... waiting.players = 상대 플레이어를 기다리는 중... -wave.enemies = [lightgray]적 기체 {0}기 남음 +wave.enemies = [lightgray]적 유닛 {0}기 남음 wave.enemycores = [accent]{0}[lightgray] 적 코어들 wave.enemycore = [accent]{0}[lightgray] 적 코어 wave.enemy = [lightgray]{0}기 남음 @@ -901,6 +908,7 @@ publishing = [accent]게시 중... publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EULA에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다! publish.error = 아이템 게시 오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} + editor.planet = 행성: editor.sector = 구역: editor.seed = 시드: @@ -917,12 +925,12 @@ editor.waves = 단계 editor.rules = 규칙 editor.generation = 지형 생성 editor.objectives = 목표 -editor.locales = Locale Bundles -editor.worldprocessors = World Processors -editor.worldprocessors.editname = Edit Name -editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. -editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? -editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. +editor.locales = 번역 팩 +editor.worldprocessors = 월드 프로세서 +editor.worldprocessors.editname = 이름 수정 +editor.worldprocessors.none = [lightgray]월드 프로세서 블록을 찾을 수 없습니다!\n맵 편집기에서 추가하거나 아래의 \ue813 추가 버튼을 사용하세요. +editor.worldprocessors.nospace = 월드 프로세서를 배치할 여유 공간이 없습니다!\n맵을 전부 구조물로 채웠나요? 왜 이렇게 했나요? +editor.worldprocessors.delete.confirm = 이 월드 프로세서를 삭제하시겠습니까?\n\n주변이 벽으로 둘러싸여 있다면 지형 벽으로 대체될 것입니다. editor.ingame = 인게임 편집 editor.playtest = 맵 테스트 editor.publish.workshop = 창작마당 게시 @@ -964,26 +972,27 @@ waves.sort = 정렬 기준 waves.sort.reverse = 정렬 뒤집기 waves.sort.begin = 시작 단계 waves.sort.health = 체력 -waves.sort.type = 기체 유형 -waves.search = Search waves... -waves.filter = Unit Filter +waves.sort.type = 유닛 유형 +waves.search = 단계 검색... +waves.filter = 유닛 필터 waves.units.hide = 모두 숨기기 waves.units.show = 모두 보이기 #these are intentionally in lower case wavemode.counts = 기 wavemode.totals = 총 wavemode.health = 체력 -wavemode.dps = dps -all = All + +all = 모두 editor.default = [lightgray]<기본값> details = 설명... edit = 편집... variables = 변수 -logic.clear.confirm = Are you sure you want to clear all code from this processor? -logic.globals = Built-in Variables +logic.clear.confirm = 이 프로세서의 모든 코드를 삭제하시겠습니까? +logic.globals = 내장 변수 + editor.name = 이름: -editor.spawn = 기체 생성 -editor.removeunit = 기체 삭제 +editor.spawn = 유닛 생성 +editor.removeunit = 유닛 삭제 editor.teams = 팀 editor.errorload = 파일을 불러오지 못했습니다. editor.errorsave = 파일을 저장하지 못했습니다. @@ -992,7 +1001,7 @@ editor.errorlegacy = 이 맵은 너무 오래됐고, 더 이상 지원하지 않 editor.errornot = 맵 파일이 아닙니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. editor.errorname = 맵에 이름이 지정되어 있지 않습니다. 저장 파일을 불러오려고 시도하는 건가요? -editor.errorlocales = Error reading invalid locale bundles. +editor.errorlocales = 잘못된 언어 팩을 읽는 동안 오류가 발생했습니다. editor.update = 업데이트 editor.randomize = 무작위 editor.moveup = 위로 이동 @@ -1004,7 +1013,7 @@ editor.sectorgenerate = 구역 형성 editor.resize = 맵 크기조정 editor.loadmap = 맵 불러오기 editor.savemap = 맵 저장 -editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? +editor.savechanges = [scarlet]저장하지 않은 변경 사항이 있습니다!\n\n[]저장하시겠습니까? editor.saved = 저장됨! editor.save.noname = 맵에 이름이 없습니다! '맵 정보' 메뉴에서 설정하세요. editor.save.overwrite = 이 맵은 내장된 맵을 덮어씁니다! '맵 정보' 에서 다른 이름을 선택하세요. @@ -1042,8 +1051,8 @@ toolmode.eraseores = 자원 초기화 toolmode.eraseores.description = 자원만 초기화합니다. toolmode.fillteams = 팀 채우기 toolmode.fillteams.description = 블록의 팀을 선택한 팀으로 채웁니다. -toolmode.fillerase = Fill Erase -toolmode.fillerase.description = Erase blocks of the same type. +toolmode.fillerase = 유형별 지우기 +toolmode.fillerase.description = 같은 유형의 블록을 지웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록의 팀을 선택한 팀으로 그립니다. #unused @@ -1066,7 +1075,8 @@ filter.clear = 초기화 filter.option.ignore = 무시 filter.scatter = 흩뿌리기 filter.terrain = 지형 -filter.logic = Logic +filter.logic = 로직 + filter.option.scale = 크기 filter.option.chance = 배치 빈도 filter.option.mag = 크기 @@ -1091,23 +1101,25 @@ filter.option.radius = 반경 filter.option.percentile = 백분율 filter.option.code = 코드 filter.option.loop = 루프 -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Are you sure you want to delete this locale bundle? -locales.applytoall = Apply Changes To All Locales -locales.addtoother = Add To Other Locales -locales.rollback = Rollback to last applied -locales.filter = Property filter -locales.searchname = Search name... -locales.searchvalue = Search value... -locales.searchlocale = Search locale... -locales.byname = By name -locales.byvalue = By value -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales -locales.viewproperty = View in all locales -locales.viewing = Viewing property "{0}" -locales.addicon = Add Icon + +locales.info = 여기에서 특정 언어에 대한 언어 팩을 맵에 추가할 수 있습니다. 언어 팩에서 각 속성에는 이름과 값이 있습니다. 이러한 속성은 이름을 사용하여 월드 프로세서와 목표에서 사용할 수 있습니다. 텍스트 서식 지정(플레이스홀더를 실제 값으로 대체)을 지원합니다.\n\n[cyan]예시 속성:\n[]이름: [accent]timer[]\n값: [accent]예시 타이머, 남은 시간: {0}[]\n\n[cyan]사용법:\n[]목표의 텍스트로 설정: [accent]@timer\n\n[]월드 프로세서에서 Print:\n[accent]localeprint "timer"\nformat time\n[gray](여기서 시간은 별도로 계산된 변수) +locales.deletelocale = 이 언어 팩을 삭제하시겠습니까? +locales.applytoall = 모든 언어 팩에 변경 사항 적용 +locales.addtoother = 다른 언어 팩에 추가 +locales.rollback = 마지막으로 적용된 상태로 롤백 +locales.filter = 속성 필터 +locales.searchname = 이름 검색... +locales.searchvalue = 값 검색... +locales.searchlocale = 언어 팩 검색... +locales.byname = 이름으로 +locales.byvalue = 값으로 +locales.showcorrect = 모든 언어 팩에 존재하고 모든 곳에서 고유한 값을 갖는 속성을 표시 +locales.showmissing = 일부 언어 팩에서 누락된 속성 표시 +locales.showsame = 다른 언어 팩에서 동일한 값을 갖는 속성 표시 +locales.viewproperty = 모든 언어 팩에서 보기 +locales.viewing = 속성 보기 "{0}" +locales.addicon = 아이콘 추가 + width = 너비: height = 높이: menu = 메뉴 @@ -1138,30 +1150,32 @@ requirement.capture = {0} 점령 requirement.onplanet = {0} 구역을 제어 requirement.onsector = {0} 구역에 착륙 launch.text = 출격 -research.multiplayer = 캠페인 멀티 플레이 시에는 해당 캠페인 서버의 호스트만 연구할 수 있습니다. map.multiplayer = 캠페인 멀티 플레이 시에는 해당 캠페인 서버의 호스트만 다른 구역을 보고, 이동이 가능합니다. uncover = 지역 개방 configure = 초기자원 설정 + objective.research.name = 연구 objective.produce.name = 획득 objective.item.name = 획득한 자원 objective.coreitem.name = 코어 자원 objective.buildcount.name = 건설 횟수 -objective.unitcount.name = 기체 횟수 -objective.destroyunits.name = 기체 처치 +objective.unitcount.name = 유닛 횟수 +objective.destroyunits.name = 유닛 처치 objective.timer.name = 타이머 objective.destroyblock.name = 단일 블록 파괴 objective.destroyblocks.name = 다수 블록 파괴 objective.destroycore.name = 코어 파괴 objective.commandmode.name = 명령 모드 objective.flag.name = 플래그 + marker.shapetext.name = 도형과 문자 -marker.point.name = Point +marker.point.name = 포인트 marker.shape.name = 도형 marker.text.name = 문자 -marker.line.name = Line -marker.quad.name = Quad -marker.texture.name = Texture +marker.line.name = 라인 +marker.quad.name = 쿼드 +marker.texture.name = 텍스처 + marker.background = 배경 marker.outline = 외곽선 objective.research = [accent]연구:\n[]{0}[lightgray]{1} @@ -1171,14 +1185,15 @@ objective.destroyblocks = [accent]파괴: [lightgray]{0}[white]/{1}\n{2}[lightgr objective.item = [accent]획득: [][lightgray]{0}[]/{1}\n{2}[lightgray]{3} objective.coreitem = [accent]코어로 운반:\n[][lightgray]{0}[]/{1}\n{2}[lightgray]{3} objective.build = [accent]건설: [][lightgray]{0}[]개\n{1}[lightgray]{2} -objective.buildunit = [accent]기체 생산: [][lightgray]{0}[]기\n{1}[lightgray]{2} -objective.destroyunits = [accent]처치: [][lightgray]{0}[]기의 기체 +objective.buildunit = [accent]유닛 생산: [][lightgray]{0}[]기\n{1}[lightgray]{2} +objective.destroyunits = [accent]처치: [][lightgray]{0}[]기의 유닛 objective.enemiesapproaching = [accent]적이 [lightgray]{0}[]초 후에 도착합니다 objective.enemyescelating = [accent]적의 생산량이 증가하고 있습니다[lightgray]{0}[] -objective.enemyairunits = [accent]적의 공중 기체가 생산되고 있습니다[lightgray]{0}[] +objective.enemyairunits = [accent]적의 공중 유닛이 생산되고 있습니다[lightgray]{0}[] objective.destroycore = [accent]적의 코어를 파괴하세요 -objective.command = [accent]기체 조종 +objective.command = [accent]유닛 조종 objective.nuclearlaunch = [accent]⚠ 핵공격이 감지되었습니다: [lightgray]{0} + announce.nuclearstrike = [red]⚠ 핵 공습 감지 ⚠ loadout = 출격 resources = 자원 @@ -1206,11 +1221,14 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.io = 네트워크 I/O 오류 error.any = 알 수 없는 네트워크 오류 error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n기기가 이 기능을 지원하지 않는 것일 수도 있습니다. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = 비 weather.snowing.name = 눈 weather.sandstorm.name = 모래 폭풍 weather.sporestorm.name = 포자 폭풍 weather.fog.name = 안개 + campaign.playtime = \uf129 [lightgray]지역 플레이타임: {0} campaign.complete = [accent]축하드립니다.\n\n {0} 지역의 적이 패배하였습니다\n[lightgray] 마지막 지역을 점령하였습니다. sectorlist = 지역 목록 @@ -1253,11 +1271,13 @@ threat.medium = 보통 threat.high = 높음 threat.extreme = 매우 높음 threat.eradication = 극한 -difficulty.casual = Casual -difficulty.easy = Easy -difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication + +difficulty.casual = 캐주얼 +difficulty.easy = 쉬움 +difficulty.normal = 보통 +difficulty.hard = 어려움 +difficulty.eradication = 근절 + planets = 태양계 planet.serpulo.name = 세르플로 planet.erekir.name = 에르키아 @@ -1277,24 +1297,26 @@ sector.fungalPass.name = 포자 지대 sector.biomassFacility.name = 유기물 합성 시설 sector.windsweptIslands.name = 폭풍의 격전지 sector.extractionOutpost.name = 자원 추출기지 -sector.facility32m.name = Facility 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons +sector.facility32m.name = 32 M 시설 +sector.taintedWoods.name = 오염된 산림 +sector.infestedCanyons.name = 감염된 깊은 협곡 sector.planetaryTerminal.name = 대행성 출격단지 sector.coastline.name = 해안선 sector.navalFortress.name = 해군 요새 -sector.polarAerodrome.name = Polar Aerodrome -sector.atolls.name = Atolls -sector.testingGrounds.name = Testing Grounds -sector.seaPort.name = Sea Port -sector.weatheredChannels.name = Weathered Channels +sector.polarAerodrome.name = 극지 비행장 +sector.atolls.name = 환초 +sector.testingGrounds.name = 시험장 +sector.seaPort.name = 바다 항구 +sector.weatheredChannels.name = 풍화된 수로 +sector.mycelialBastion.name = 균사 요새 +sector.frontier.name = 국경 지방 sector.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지녔습니다. 적은 위협적이지 않지만, 자원도 풍부하진 않습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n이제 출격할 시간입니다! sector.frozenForest.description = 산과 가까운 이곳에도, 포자가 퍼졌습니다. 혹한의 추위조차 포자가 퍼지는 것을 억누를 수 없습니다.\n화력 발전기를 건설하고, 멘더를 사용하는 방법을 배워야 합니다. sector.saltFlats.description = 사막의 변두리에는 소금으로 이루어진 평원이 있습니다. 이곳에선 매우 적은 자원만 발견되었습니다.\n\n하지만 자원이 희소한 이곳에서도 적들의 요새가 포착되었습니다. 그들을 사막의 모래로 만들어버리세요! sector.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 탈환하여 강화 유리를 제련하고, 포탑과 드릴에 물을 공급하여 더 강력한 방어선을 구축하여야 합니다. sector.ruinousShores.description = 폐허를 지나서 나오는 해안선. 한때, 이곳에는 해안 방어기지가 있었습니다.\n많은 부분이 소실되었습니다. 기본적인 방어 시설을 제외한 모든 것이 고철 덩어리가 되었습니다. \n외부로 세력을 확장하기 위한 첫 발걸음으로, 무너진 시설을 재건하고 잃어버린 기술을 다시 회수하십시오. -sector.stainedMountains.description = 더 내륙에는 아직 포자에 오염되지 않은 산맥이 있습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n이곳은 더 강력한 적이 주둔하고 있습니다. 적이 가장 강력한 기체를 준비할 시간을 주지 마십시오. +sector.stainedMountains.description = 더 내륙에는 아직 포자에 오염되지 않은 산맥이 있습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n이곳은 더 강력한 적이 주둔하고 있습니다. 적이 가장 강력한 유닛을 준비할 시간을 주지 마십시오. sector.overgrowth.description = 이곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이곳에 전초기지를 설립했습니다. 대거를 생산해 적의 기지를 박살 내고 우리가 잃어버린 것을 되찾아야 합니다! sector.tarFields.description = 산지와 사막 사이에 있는 석유 생산지의 외곽이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이지만 이곳에는 위험한 적군이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 가공기술을 익히는 것이 도움이 될 것입니다. sector.desolateRift.description = 극도로 위험한 지역입니다. 자원은 풍부하지만, 사용 가능한 공간은 거의 없습니다. 적의 공격 주기가 길지만, 기지가 파괴될 위험이 높으니 가능한 한 빨리 방어시설을 구축하여야 합니다. @@ -1305,16 +1327,20 @@ sector.windsweptIslands.description = 육지에서 멀리 떨어진 이곳에는 sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내기 위한 용도로 건설한 보급기지입니다.\n\n강력한 적들이 지키고 있는 지역을 공격하거나, 적에게 침공당한 지역을 효과적으로 수호하기 위해서는 우리도 이 수송 기술이 필요합니다. 적의 기지를 파괴하고, 그들의 수송 기술을 강탈하십시오. sector.impact0078.description = 이곳에는 태양계에 처음 진입한 우주 수송선의 잔해가 존재합니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하십시오. sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하십시오.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 행성간 이동 기술을 강탈하십시오.\n\n[royal] 건투를 빕니다.[] -sector.coastline.description = 이 장소에서 해상 기체 기술의 잔재가 발견되었습니다. 적의 공격을 격퇴하고, 이 지역을 점령하고, 기술을 습득하십시오. +sector.coastline.description = 이 장소에서 해상 유닛 기술의 잔재가 발견되었습니다. 적의 공격을 격퇴하고, 이 지역을 점령하고, 기술을 습득하십시오. sector.navalFortress.description = 적은 자연적으로 요새화된 외딴 섬에 기지를 세웠습니다. 이 전초기지를 파괴하여 적의 발전된 함선 건조 기술을 습득하고 연구하십시오. + sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon + sector.onset.name = 시작 sector.aegis.name = 보호 sector.lake.name = 호수 @@ -1332,22 +1358,23 @@ sector.siege.name = 포위 sector.crossroads.name = 교차로 sector.karst.name = 카르스트 sector.origin.name = 근원 -sector.onset.description = 튜토리얼 지역. 아직 목표가 정해지지 않았습니다. 추가적인 정보를 제공받기 위해 잠시 대기해 주세요 -sector.aegis.description = 적은 방어막으로 보호받고 있습니다. 이 구역에서 실험적인 방어막 차단기 모듈이 감지되었습니다.\n이 구조물을 찾으. 텅스텐을 공급해 방어막 차단기를 가동하고 적의 기지를 파괴하여야 합니다. + +sector.onset.description = 에르키아 정복을 시작하세요. 자원을 모으고, 유닛을 생산하고, 기술 연구를 시작하세요. +sector.aegis.description = 이 구역에는 텅스텐 매장지가 있습니다.\n[accent]충격 드릴[]을 연구해 이 자원을 채굴하고 해당 지역의 적 기지를 파괴하세요. sector.lake.description = 이 지역의 광재 호수는 기체의 활동범위를 크게 제한시킵니다. 호버링 유닛만이 유일한 선택지입니다.\n[accent]함선 재구성기[]를 연구하고 [accent]일루드[]를 가능한 한 빨리 생산하여야 합니다. -sector.intersect.description = 정찰 결과 이 지역은 착륙 직후 여러 방향에서 공격받을 것으로 예측됩니다.\n방어선을 빠르게 구축하고 가능한 한 빠르게 확장하여야 합니다.\n이 지역의 험난한 지형을 위해서는 [accent]기계[] 기체가 필요할 것입니다. -sector.atlas.description = 이 지역은 각기 다른 지형을 포함하고 있으며, 효과적으로 공격하기 위해서는 다양한 기체가 필요합니다.\n이곳에서 발견된 더 강력한 적의 기지를 통과하기 위해서는 상위 등급의 기체가 필요할 수도 있습니다.\n[accent]전해조[]와 [accent]전차 재조립기[]를 연구하세요. +sector.intersect.description = 정찰 결과 이 지역은 착륙 직후 여러 방향에서 공격받을 것으로 예측됩니다.\n방어선을 빠르게 구축하고 가능한 한 빠르게 확장하여야 합니다.\n이 지역의 험난한 지형을 위해서는 [accent]기계[] 유닛이 필요할 것입니다. +sector.atlas.description = 이 지역은 각기 다른 지형을 포함하고 있으며, 효과적으로 공격하기 위해서는 다양한 기체가 필요합니다.\n이곳에서 발견된 더 강력한 적의 기지를 통과하기 위해서는 상위 등급의 유닛이 필요할 수도 있습니다.\n[accent]전해조[]와 [accent]전차 재조립기[]를 연구하세요. sector.split.description = 이 지역에 최소한으로 존재하는 적 주둔군은 새로운 운송 기술을 시험하기에 완벽합니다. sector.basin.description = 이 지역에는 많은 수의 적이 확인되었습니다. 발판을 마련하기 위해 신속히 유닛을 생산하여 적의 기지를 무력화 해야 합니다. sector.marsh.description = 이 지역은 아르키사이트가 풍부하지만 분출구의 수는 한정적입니다.\n[accent]화학적 연소실[]을 건설하여 전력을 생산하세요. -sector.peaks.description = 이 지역의 산악 지형은 대부분의 기체를 무용지물로 만들었습니다. 비행 가능한 기체가 필요합니다.\n적의 방공망에 유의하십시오. 일부 시설은 지원 건물을 공격하여 무력화시킬 수 있습니다. -sector.ravine.description = 적의 중요한 이동 경로이긴 하지만, 해당 구역에선 적의 기지가 감지되지 않았습니다. 다양한 적군을 맞닥뜨릴 것으로 예상됩니다.\n[accent]설금[]을 생산하여 포탑 [accent]어플릭트[]를 건설하세요. +sector.peaks.description = 이 지역의 산악 지형은 대부분의 유닛을 무용지물로 만들었습니다. 비행 가능한 유닛이 필요합니다.\n적의 방공망에 유의하십시오. 일부 시설은 지원 건물을 공격하여 무력화시킬 수 있습니다. +sector.ravine.description = 적의 중요한 이동 경로이긴 하지만, 해당 구역에선 적의 기지가 감지되지 않았습니다. 다양한 적군을 맞닥뜨릴 것으로 예상됩니다.\n[accent]서지 합금[]을 생산하여 포탑 [accent]어플릭트[]를 건설하세요. sector.caldera-erekir.description = 이 지역에서 탐지된 자원은 여러 섬에 분산되어 있습니다 .\n드론을 기반으로 한 운송수단을 연구하고 활용하세요. -sector.stronghold.description = 이 지역의 대규모 적 야영지에는 적들이 지키고 있는 상당한 양의 [accent]토륨[] 매장지가 있습니다.\n더 높은 등급의 기체와 포탑을 연구할 때 사용합니다. +sector.stronghold.description = 이 지역의 대규모 적 야영지에는 적들이 지키고 있는 상당한 양의 [accent]토륨[] 매장지가 있습니다.\n더 높은 등급의 유닛과 포탑을 연구할 때 사용합니다. sector.crevice.description = 적들은 이 지역에서 당신의 기지를 제거하기 위해 맹렬한 공격부대를 보낼 것입니다.\n[accent]탄화물[]과 [accent]열분해 발전기[]를 연구하는 것은 살아남기 위해 반드시 필요합니다. -sector.siege.description = 이 지역은 두 갈래의 공격을 강요하는 두 개의 평행 협곡이 특징입니다.\n더 강력한 전차 기체를 만들기 위한 능력을 얻기 위해 [accent]시아노겐[]을 연구하시오.\n주의: 적의 장거리 발사체가 감지되었습니다. 미사일은 충돌 전에 격추될 수 있습니다. -sector.crossroads.description = 이 지역의 적 기지는 다양한 지형에 위차하고 있는 것이 확인 되었으며 이로 인해 위해 다양한 기체가 필요합니다. \n또한, 일부 기지는 보호막으로 보호되고 있습니다. 그들이 어떻게 전력을 공급받는지 알아보아야 합니다. -sector.karst.description = 이 지역은 자원이 풍부하지만, 새로운 코어가 착륙하면 적에게 공격을 받을 것입니다.\n자원의 이점을 활용하고 [accent]메타[]를 연구하세요. +sector.siege.description = 이 지역은 두 갈래의 공격을 강요하는 두 개의 평행 협곡이 특징입니다.\n더 강력한 전차 유닛을 만들기 위한 능력을 얻기 위해 [accent]시아노겐[]을 연구하시오.\n주의: 적의 장거리 발사체가 감지되었습니다. 미사일은 충돌 전에 격추될 수 있습니다. +sector.crossroads.description = 이 지역의 적 기지는 다양한 지형에 위차하고 있는 것이 확인 되었으며 이로 인해 다양한 유닛이 필요합니다. \n또한, 일부 기지는 보호막으로 보호되고 있습니다. 그들이 어떻게 전력을 공급받는지 알아보아야 합니다. +sector.karst.description = 이 지역은 자원이 풍부하지만, 새로운 코어가 착륙하면 적에게 공격을 받을 것입니다.\n자원의 이점을 활용하고 [accent]위상 섬유[]를 연구하세요. sector.origin.description = 상당한 적이 존재하는 마지막 지역입니다.\n 모든 연구를 마쳤으니 오직 모든 적의 코어를 파괴하는 데만 집중하세요. status.burning.name = 발화 status.freezing.name = 빙결 @@ -1436,13 +1463,13 @@ stat.repairspeed = 수리 속도 stat.weapons = 무기 stat.bullet = 탄환 stat.moduletier = 모듈 등급 -stat.unittype = Unit Type +stat.unittype = 유닛 유형 stat.speedincrease = 속도 증가 stat.range = 사거리 stat.drilltier = 채굴 가능 stat.drillspeed = 기본 채굴 속도 stat.boosteffect = 버프 효과 -stat.maxunits = 최대 기체 수 +stat.maxunits = 최대 유닛 수 stat.health = 체력 stat.armor = 방어력 stat.buildtime = 건설 시간 @@ -1473,7 +1500,7 @@ stat.abilities = 능력 stat.canboost = 이륙 가능 stat.flying = 비행 stat.ammouse = 탄약 사용 -stat.ammocapacity = Ammo Capacity +stat.ammocapacity = 탄약 용량 stat.damagemultiplier = 피해량 배수 stat.healthmultiplier = 체력 배수 stat.speedmultiplier = 이동속도 배수 @@ -1483,47 +1510,49 @@ stat.reactive = 작용 받음 stat.immunities = 상태이상 면역 stat.healing = 회복량 ability.forcefield = 보호막 필드 -ability.forcefield.description = Projects a force shield that absorbs bullets +ability.forcefield.description = 탄약을 흡수하는 보호막을 만들어냄 ability.repairfield = 수리 필드 -ability.repairfield.description = Repairs nearby units +ability.repairfield.description = 근처 유닛을 수리함 ability.statusfield = 상태이상 필드 -ability.statusfield.description = Applies a status effect to nearby units +ability.statusfield.description = 근처 유닛에 상태 효과를 제공함 ability.unitspawn = 공장 -ability.unitspawn.description = Constructs units +ability.unitspawn.description = 유닛을 생산함 ability.shieldregenfield = 방어막 복구 필드 -ability.shieldregenfield.description = Regenerates shields of nearby units +ability.shieldregenfield.description = 근처 유닛의 방어막을 재생성함 ability.movelightning = 가속 전격 -ability.movelightning.description = Releases lightning while moving -ability.armorplate = Armor Plate -ability.armorplate.description = Reduces damage taken while shooting -ability.shieldarc = 방어막 아크 -ability.shieldarc.description = Projects a force shield in an arc that absorbs bullets +ability.movelightning.description = 이동하면서 번개를 방출함 +ability.armorplate = 장갑판 +ability.armorplate.description = 사격 시 받는 피해가 감소됨 +ability.shieldarc = 호 보호막 +ability.shieldarc.description = 탄약을 흡수하는 호 형태의 보호막을 만들어냄 ability.suppressionfield = 재생성 억제 필드 -ability.suppressionfield.description = Stops nearby repair buildings +ability.suppressionfield.description = 근처 수리 건물을 잠깐동안 억제함 ability.energyfield = 에너지 필드 -ability.energyfield.description = Zaps nearby enemies -ability.energyfield.healdescription = Zaps nearby enemies and heals allies -ability.regen = Regeneration -ability.regen.description = Regenerates own health over time -ability.liquidregen = Liquid Absorption -ability.liquidregen.description = Absorbs liquid to heal itself -ability.spawndeath = Death Spawns -ability.spawndeath.description = Releases units on death -ability.liquidexplode = Death Spillage -ability.liquidexplode.description = Spills liquid on death -ability.stat.firingrate = [stat]{0}/sec[lightgray] firing rate -ability.stat.regen = [stat]{0}[lightgray] health/sec -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse -ability.stat.shield = [stat]{0}[lightgray] shield -ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed -ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit -ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets -ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.energyfield.description = 근처 적을 감전시킴 +ability.energyfield.healdescription = 근처 적에게 전기 충격을 주고 아군을 치료함 +ability.regen = 재생 +ability.regen.description = 시간이 지남에 따라 스스로 체력을 재생함 +ability.liquidregen = 액체 흡수 +ability.liquidregen.description = 액체를 흡수하여 스스로를 치유함 +ability.spawndeath = 스폰 죽음 +ability.spawndeath.description = 사망 시 유닛을 방출함 +ability.liquidexplode = 유출 죽음 +ability.liquidexplode.description = 사망 시 액체를 쏟음 + +ability.stat.firingrate = [stat]{0}/초[lightgray] 발사 속도 +ability.stat.regen = [stat]{0}[lightgray] 체력/초 +ability.stat.pulseregen = [stat]{0}[lightgray] 체력/파동 +ability.stat.shield = [stat]{0}[lightgray] 실드 +ability.stat.repairspeed = [stat]{0}/초[lightgray] 수리 속도 +ability.stat.slurpheal = [stat]{0}[lightgray] 체력/액체 단위 +ability.stat.cooldown = [stat]{0} 초[lightgray] 쿨타임 +ability.stat.maxtargets = [stat]{0}[lightgray] 최대 목표 +ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] 동일 유형 회복량 +ability.stat.damagereduction = [stat]{0}%[lightgray] 피해 감소 +ability.stat.minspeed = [stat]{0} tiles/초[lightgray] 최소 속도 +ability.stat.duration = [stat]{0} 초[lightgray] 지속 시간 +ability.stat.buildtime = [stat]{0} 초[lightgray] 건설 시간 + bar.onlycoredeposit = 코어에만 투입할 수 있습니다 bar.drilltierreq = 더 좋은 드릴 필요 bar.noresources = 자원 부족 @@ -1606,8 +1635,8 @@ category.items = 자원 category.crafting = 입력/출력 category.function = 기능 category.optional = 선택적 향상 -setting.alwaysmusic.name = Always Play Music -setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. +setting.alwaysmusic.name = 항상 음악 재생 +setting.alwaysmusic.description = 이 기능을 활성화하면, 게임 내에서 음악이 항상 반복 재생됩니다.\n비활성화하면, 무작위 간격으로만 재생됩니다. setting.skipcoreanimation.name = 코어 발사/착륙 애니메이션 건너뛰기 setting.landscape.name = 가로화면 잠금 setting.shadows.name = 그림자 @@ -1619,7 +1648,7 @@ setting.backgroundpause.name = 백그라운드에서 일시정지 setting.buildautopause.name = 건설 자동 일시정지 setting.doubletapmine.name = 연속 터치로 채광 setting.commandmodehold.name = 키를 누른 상태로 명령 -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit +setting.distinctcontrolgroups.name = 유닛당 하나의 제어 그룹으로 제한 setting.modcrashdisable.name = 로딩 중 충돌 시 모드 비활성화 setting.animatedwater.name = 액체 애니메이션 효과 setting.animatedshields.name = 보호막 애니메이션 효과 @@ -1667,7 +1696,7 @@ setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 setting.crashreport.name = 익명으로 오류 보고서 자동 전송 setting.savecreate.name = 자동 저장 활성화 -setting.steampublichost.name = Public Game Visibility +setting.steampublichost.name = 공개 게임 가시성 setting.playerlimit.name = 플레이어 제한 setting.chatopacity.name = 채팅창 투명도 setting.lasersopacity.name = 전선 투명도 @@ -1687,12 +1716,12 @@ keybind.title = 조작키 설정 keybinds.mobile = [scarlet]대부분의 조작키 설정은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다. category.general.name = 일반 category.view.name = 보기 -category.command.name = Unit Command +category.command.name = 유닛 지휘 category.multiplayer.name = 멀티플레이어 category.blocks.name = 블록 선택 placement.blockselectkeys = \n[lightgray]단축키: [{0}, keybind.respawn.name = 리스폰 -keybind.control.name = 기체 제어 +keybind.control.name = 유닛 제어 keybind.clear_building.name = 설계도 초기화 keybind.press = 키를 누르세요... keybind.press.axis = 마우스 휠 또는 키를 누르세요... @@ -1705,14 +1734,16 @@ keybind.mouse_move.name = 커서를 따라서 이동 keybind.pan.name = 팬 보기 keybind.boost.name = 이륙 keybind.command_mode.name = 명령 모드 -keybind.command_queue.name = 유닛 명령 Queue +keybind.command_queue.name = 유닛 명령 대기 keybind.create_control_group.name = 컨트롤 그룹 만들기 keybind.cancel_orders.name = 명령 취소 + keybind.unit_stance_shoot.name = 유닛 명령: 사격 keybind.unit_stance_hold_fire.name = 유닛 명령: 사격 중지 keybind.unit_stance_pursue_target.name = 유닛 명령: 타겟 추격 keybind.unit_stance_patrol.name = 유닛 명령: 정찰 keybind.unit_stance_ram.name = 유닛 명령: 돌격 + keybind.unit_command_move.name = 유닛 제어: 이동 keybind.unit_command_repair.name = 유닛 제어: 수리 keybind.unit_command_rebuild.name = 유닛 제어: 재건 @@ -1723,7 +1754,8 @@ keybind.unit_command_load_units.name = 유닛 제어: 유닛 적재 keybind.unit_command_load_blocks.name = 유닛 제어: 블록 적재 keybind.unit_command_unload_payload.name = 유닛 제어: 화물 투하 keybind.unit_command_enter_payload.name = 유닛 제어: 화물 건물에 착륙/진입 -keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer +keybind.unit_command_loop_payload.name = 유닛 제어: 유닛 반복 운반 + keybind.rebuild_select.name = 지역 재건 keybind.schematic_select.name = 영역 설정 keybind.schematic_menu.name = 설계도 메뉴 @@ -1750,8 +1782,8 @@ keybind.select.name = 선택/공격 keybind.diagonal_placement.name = 대각선 설치 keybind.pick.name = 블록 선택 keybind.break_block.name = 블록 파괴 -keybind.select_all_units.name = 전체 기체 선택 -keybind.select_all_unit_factories.name = 전체 기체 공장 선택 +keybind.select_all_units.name = 전체 유닛 선택 +keybind.select_all_unit_factories.name = 전체 유닛 공장 선택 keybind.deselect.name = 선택해제 keybind.pickupCargo.name = 화물 집기 keybind.dropCargo.name = 화물 내려놓기 @@ -1774,7 +1806,7 @@ keybind.chat_history_prev.name = 이전 채팅 기록 keybind.chat_history_next.name = 다음 채팅 기록 keybind.chat_scroll.name = 채팅 스크롤 keybind.chat_mode.name = 채팅 모드 변경 -keybind.drop_unit.name = 기체 내려놓기 +keybind.drop_unit.name = 유닛 내려놓기 keybind.zoom_minimap.name = 미니맵 확대 mode.help.title = 모드 설명 mode.survival.name = 생존 @@ -1787,6 +1819,7 @@ mode.pvp.description = 다른 플레이어와 현장에서 싸우세요.\n[gray] mode.attack.name = 공격 mode.attack.description = 적의 기지를 파괴하세요.\n[gray]플레이하려면 맵에 적 코어가 필요합니다. mode.custom = 사용자 정의 규칙 + rules.invaliddata = 잘못된 클립보드 데이터 입니다. rules.hidebannedblocks = 금지된 블록 숨기기 rules.infiniteresources = 무한 자원 @@ -1798,18 +1831,18 @@ rules.disableworldprocessors = 월드 프로세서 비활성화 rules.schematic = 설계도 허용 rules.wavetimer = 시간 제한이 있는 단계 rules.wavesending = 단계 넘김 -rules.allowedit = Allow Editing Rules -rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +rules.allowedit = 규칙 편집 허용 +rules.allowedit.info = 이 기능을 활성화하면, 플레이어는 일시 정지 메뉴의 왼쪽 하단에 있는 버튼을 통해 게임 내에서 규칙을 편집할 수 있습니다. +rules.alloweditworldprocessors = 월드 프로세서 편집 허용 +rules.alloweditworldprocessors.info = 이 기능을 활성화하면 편집기 외부에서도 월드 로직 블록을 배치하고 편집할 수 있습니다. rules.waves = 단계 -rules.airUseSpawns = Air units use spawn points +rules.airUseSpawns = 공중 유닛 스폰 지점 사용 rules.attack = 공격 모드 rules.buildai = 기지 건설 AI rules.buildaitier = 건설 AI 등급 rules.rtsai = RTS AI -rules.rtsai.campaign = RTS Attack AI -rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. +rules.rtsai.campaign = RTS 공격 AI +rules.rtsai.campaign.info = 공격 맵에서는 유닛을 그룹화하여 더욱 지능적인 방식으로 플레이어 기지를 공격합니다. rules.rtsminsquadsize = 최소 부대 규모 rules.rtsmaxsquadsize = 최대 부대 규모 rules.rtsminattackweight = 최소 공격 중량 @@ -1827,7 +1860,7 @@ rules.unitdamagemultiplier = 기체 피해량 배수 rules.unitcrashdamagemultiplier = 기체 파손 피해량 배수 rules.solarmultiplier = 태양광 전력 배수 rules.unitcapvariable = 코어 기체수 제한 추가 -rules.unitpayloadsexplode = Carried Payloads Explode With The Unit +rules.unitpayloadsexplode = 들어올린 화물 유닛과 함께 폭발 rules.unitcap = 기본 기체 제한 rules.limitarea = 맵 영역 제한 rules.enemycorebuildradius = 적 코어 건설금지 범위:[lightgray] (타일) @@ -1837,7 +1870,7 @@ rules.buildcostmultiplier = 건설 비용 배수 rules.buildspeedmultiplier = 건설 속도 배수 rules.deconstructrefundmultiplier = 철거 환불 배수 rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기 -rules.wavelimit = Map Ends After Wave +rules.wavelimit = 특정 단계 이후 맵 종료 rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일) rules.unitammo = 기체 탄약 필요 rules.enemyteam = 적 팀 @@ -1852,9 +1885,9 @@ rules.title.teams = 팀 rules.title.planet = 행성 rules.lighting = 조명 표시 rules.fog = 전장의 안개 -rules.invasions = Enemy Sector Invasions -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI +rules.invasions = 적 지역 침공 +rules.showspawns = 적 스폰 표시 +rules.randomwaveai = 무작위 단계 AI rules.fire = 방화 허용 rules.anyenv = <모두> rules.explosions = 블록/기체 폭발 피해 @@ -1863,7 +1896,8 @@ rules.weather = 날씨 추가 rules.weather.frequency = 빈도: rules.weather.always = 항상 rules.weather.duration = 지속 시간: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. + +rules.randomwaveai.info = 단계에 생성된 유닛이 코어 또는 전력 생산기를 공격하는 대신 무작위 구조물을 공격하게 됩니다. rules.placerangecheck.info = 플레이어가 적 건물 근처에 건설 불가 구역을 생성합니다. 만일, 플레이어가 포탑을 건설하고자 할 경우 반경이 증가되어 적 건물이 포탑의 사정거리에 닿지 않게됩니다. rules.onlydepositcore.info = 코어를 제외한 어떠한 건물에도 자원을 투하할 수 없게 만듭니다. content.item.name = 자원 @@ -1873,6 +1907,7 @@ content.block.name = 블록 content.status.name = 상태 이상 content.sector.name = 지역 content.team.name = 파벌 + wallore = (벽) item.copper.name = 구리 item.lead.name = 납 @@ -2001,8 +2036,8 @@ block.graphite-press.name = 흑연 압축기 block.multi-press.name = 다중 압축기 block.constructing = {0} [lightgray](제작중) block.spawn.name = 적 소환지점 -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore +block.remove-wall.name = 벽 제거 +block.remove-ore.name = 광석 제거 block.core-shard.name = 코어: 조각 block.core-foundation.name = 코어: 기반 block.core-nucleus.name = 코어: 핵심 @@ -2082,7 +2117,7 @@ block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블록 block.reinforced-message.name = 보강된 메모 블록 block.world-message.name = 월드 메모 블록 -block.world-switch.name = World Switch +block.world-switch.name = 월드 스위치 block.illuminator.name = 조명 block.overflow-gate.name = 포화 필터 block.underflow-gate.name = 불포화 필터 @@ -2198,6 +2233,8 @@ block.payload-unloader.name = 화물 언로더 block.payload-unloader.description = 들어간 블록에서 액체와 아이템을 가져옵니다. block.heat-source.name = 열 공급기 block.heat-source.description = 엄청난 양의 열을 출력합니다. 샌드박스 전용. + +#Erekir block.empty.name = 공백 block.rhyolite-crater.name = 유문암 구덩이 block.rough-rhyolite.name = 거친 유문암 @@ -2355,6 +2392,7 @@ block.logic-display.name = 로직 디스플레이 block.large-logic-display.name = 대형 로직 디스플레이 block.memory-cell.name = 메모리 셀 block.memory-bank.name = 메모리 보관소 + team.malis.name = 말리스 team.crux.name = 크럭스 team.sharded.name = 샤디드 @@ -2366,20 +2404,20 @@ hint.desktopMove = [accent][[WASD][] 키를 이용해 움직이십시오. hint.zoom = [accent]스크롤[]을 통해 화면 확대/축소가 가능합니다. hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually. hint.desktopShoot = [accent][[좌클릭][]으로 발사할 수 있습니다. -hint.depositItems = 자원을 코어로 옮기려면, 기체의 자원을 코어로 끌어다놓으십시오. -hint.respawn = 기체를 떠나려면 [accent][[V][]를 누르십시오. -hint.respawn.mobile = 기체 혹은 포탑을 조종할 수 있습니다. 기체를 떠나려면 [accent]왼쪽 위의 아바타를 누르십시오.[] +hint.depositItems = 자원을 코어로 옮기려면, 유닛의 자원을 코어로 끌어다놓으십시오. +hint.respawn = 유닛을 떠나려면 [accent][[V][]를 누르십시오. +hint.respawn.mobile = 유닛 혹은 포탑을 조종할 수 있습니다. 유닛을 떠나려면 [accent]왼쪽 위의 아바타를 누르십시오.[] hint.desktopPause = 게임을 일시 정지/재개하기 위해 [accent][[Space][]를 누르십시오. hint.breaking = 블록을 부수려면 [accent]우클릭[]한 후 드래그하십시오. -hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오. +hint.breaking.mobile = 블록을 부수려면 오른쪽 하단의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오. hint.blockInfo = 블록 정보를 확인하려면, [accent]건설 목록[]에서 블록을 선택한 후 오른쪽의 [accent][[?][] 버튼을 누르십시오. hint.derelict = [accent]버려진[] 구조물은 더 이상 작동하지 않는 오래된 기지의 부서진 잔해입니다.\n\n이 구조물은 [accent]철거[]하여 자원을 얻을 수 있습니다. hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오. hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오. -hint.unitControl = 아군 기체와 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오. -hint.unitControl.mobile = 아군 기체와 포탑을 조종하려면 해당 개체를 [accent]빠르게 두 번 누르십시오[]. -hint.unitSelectControl = 기체를 조종하려면, [accent]왼쪽 shift[]를 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 누르거나 끌어서 기체를 선택합니다. [accent]우클릭[]으로 기체에게 이동과 공격을 명령할 수 있습니다. -hint.unitSelectControl.mobile = 기체를 조종하려면, 왼쪽 아래에 있는 [accent]명령[]을 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 길게 누르거나 끌어서 기체를 선택합니다. 눌러서 기체에게 이동과 공격을 명령할 수 있습니다. +hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오. +hint.unitControl.mobile = 아군 유닛과 포탑을 조종하려면 해당 개체를 [accent]빠르게 두 번 누르십시오[]. +hint.unitSelectControl = 유닛을 조종하려면, [accent]왼쪽 shift[]를 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 누르거나 끌어서 유닛을 선택합니다. [accent]우클릭[]으로 유닛에게 이동과 공격을 명령할 수 있습니다. +hint.unitSelectControl.mobile = 유닛을 조종하려면, 왼쪽 아래에 있는 [accent]명령[]을 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 길게 누르거나 끌어서 유닛을 선택합니다. 눌러서 유닛에게 이동과 공격을 명령할 수 있습니다. hint.launch = 충분한 자원을 모았으면, 오른쪽 아래의 \ue827 [accent]지도[]에서 주변 지역을 선택해서 [accent]출격[]할 수 있습니다. hint.launch.mobile = 충분한 자원을 모았으면, 오른쪽 아래의 \ue88c [accent]메뉴[]에 있는 \ue827 [accent]지도[]에서 주변 지역을 선택해서 [accent]출격[]할 수 있습니다. hint.schematicSelect = [accent][[F][]를 누른 채로 끌어서 복사하고 붙여넣을 블록을 선택하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다. @@ -2387,56 +2425,57 @@ hint.rebuildSelect = [accent][[B][]를 누르고 끌어서 파괴된 블록 흔 hint.rebuildSelect.mobile = 복사버튼 \ue874 을 선택하시고, 재건축 버튼 \ue80f 을 탭 하신 뒤, 드래그 하여 블록 흔적을 선택하세요. 선택된 블록은 자동으로 복구됩니다. hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다. hint.conveyorPathfind.mobile = \ue844 [accent]대각 모드[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다. -hint.boost = [accent][[왼쪽 Shift][]를 눌러 탑승한 기체로 장애물을 넘을 수 있습니다. \n\n 일부 지상 기체만 이륙할 수 있습니다. +hint.boost = [accent][[왼쪽 Shift][]를 눌러 탑승한 기체로 장애물을 넘을 수 있습니다. \n\n 일부 지상 유닛만 이륙할 수 있습니다. hint.payloadPickup = 작은 블록이나 기체를 집으려면 [accent][[[]를 누르십시오. -hint.payloadPickup.mobile = 작은 블록이나 기체를 집으려면 [accent]잠깐 누르십시오[]. +hint.payloadPickup.mobile = 작은 블록이나 유닛을 집으려면 [accent]잠깐 누르십시오[]. hint.payloadDrop = 다시 내려놓으려면 [accent]][]를 누르십시오. hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 [accent]화면을 잠깐 누르십시오[]. hint.waveFire = [accent]파도[] 포탑에 물을 공급하면 주변에 발생한 화재를 자동으로 진압합니다. hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]전력 노드[]를 활용하십시오. -hint.guardian = [accent]수호자[] 기체는 방어력이 존재합니다. [accent]구리[]와 [accent]납[]처럼 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n수호자를 제거하려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오. +hint.guardian = [accent]수호자[] 유닛은 높은 체력과 방어력을 가졌습니다. [accent]구리[]와 [accent]납[]처럼 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n수호자를 제거하려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오. hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치[]하여 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지 확인하십시오. hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다. hint.presetDifficulty = 이 지역은 [scarlet]위험도가 높은[] 지역입니다.\n적절한 기술과 준비 없이 이런 지역들로 출격하는건 [accent]추천하지 않습니다[]. hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다. -hint.coopCampaign = When playing the [accent]co-op campaign[], items that are produced in the current map will also be sent [accent]to your local sectors[].\n\nAny new research done by the host also carries over. -hint.factoryControl = 기체 공장의 [accent]출력 목적지[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 마우스 오른쪽 버튼으로 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다. -hint.factoryControl.mobile = 기체 공장의 [accent]출력 목적지[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 눌러서 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다. -gz.mine = 주변 바닥에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요. -gz.mine.mobile = 주변 바닥에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요. -gz.research = \ue875 연구 기록을 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 오른쪽 아래에 있는 메뉴에서 선택하세요.\n구리조각 위를 눌러서 배치합니다. -gz.research.mobile = \ue875 연구 기록을 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 오른쪽 아래에 있는 메뉴에서 선택하세요.\n구리조각 위를 눌러서 배치합니다.\n\n오른쪽 아래에서 \ue800 [accent]체크마크[]를 눌러 확정지으세요. -gz.conveyors = \uf896 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n클릭하고 끌어서 컨베이어를 길게 배치하세요.\n[accent]스크롤[]해서 방향을 회전할 수 있습니다. -gz.conveyors.mobile = \uf896 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n손가락을 길게 누르고 끌어서 컨베이어를 길게 배치하세요. -gz.drills = 채굴 작업을 확장하세요.\n기계식 드릴을 더 배치하세요.\n구리 100개 채굴하기. -gz.lead = \uf837 [accent]납[]은 일반적으로 사용되는 또 다른 자원입니다.\n납을 채굴하기 위한 드릴을 설치하세요. +hint.factoryControl = 유닛 공장의 [accent]출력 목적지[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 마우스 오른쪽 버튼으로 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다. +hint.factoryControl.mobile = 유닛 공장의 [accent]출력 목적지[]를 설정하려면, 명령 모드에서 공장 블록을 클릭한 다음, 눌러서 위치를 지정합니다.\n생산된 유닛은 자동으로 그곳으로 이동합니다. + +gz.mine = 주변 땅에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 클릭해서 채굴을 시작하세요. +gz.mine.mobile = 주변 땅에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요. +gz.research = 오른쪽 하단에 \ue875 연구 기록을 클릭하거나 [J]키를 눌러 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 연구 기록을 닫아서 오른쪽 아래에 있는 메뉴에서 해당 드릴을 선택하세요.\n구리 광석 위에 클릭해서 배치합니다.\n(만약 바로 건설되는게 불편하다면, 설정에서 건설 자동 일시정지를 킬 수 있습니다.)[] +gz.research.mobile = 왼쪽 상단에 \ue875 연구 기록을 눌러 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 연구 메뉴를 닫아서 오른쪽 아래에 있는 블록 메뉴에서 해당 드릴을 선택하세요.\n구리 광석 위에 눌러서 배치합니다.\n\n오른쪽 아래 \ue800 [accent]체크마크[]를 눌러 확정지으세요. +gz.conveyors = \uf896 이제 연구 기록을 다시 열어 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n컨베이어를 선택하고, 클릭하고 드래그해서 컨베이어를 길게 배치하세요.\n[accent]스크롤[]로 방향을 회전할 수 있습니다. +gz.conveyors.mobile = \uf896 이제 연구 기록을 다시 열어 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n손가락을 길게 누르고 끌어서 컨베이어를 길게 배치하세요. +gz.drills = 채굴 작업을 확장하세요.\n기계식 드릴을 더 배치하세요.\n[accent]새 목표:[] 드릴로 구리를 채굴하고 컨베이어를 이용해 [accent]구리 100개[]를 코어로 운반하기. +gz.lead = \uf837 [accent]납[]은 일반적으로 사용되는 또 다른 자원입니다.\n납을 채굴하기 위한 드릴을 건설하세요. gz.moveup = \ue804 추가 목표를 위해 위로 이동하세요. -gz.turrets = 코어를 보호하기 위해 \uf861 [accent]듀오[] 포탑을 연구하고 2개를 설치하세요.\n듀오 포탑은 컨베이어로부터 \uf838 [accent]탄약[]을 공급받아야 합니다. +gz.turrets = 연구하는 방법은 얼추 익히셨다고 생각하니 이제 이 게임의 핵심인 '코어'를 보호하기 위해 \uf861 [accent]듀오[] 포탑을 연구하고 2개를 설치하세요.\n듀오 포탑은 컨베이어로부터 \uf838 [accent]탄약[]을 공급받아야 합니다. gz.duoammo = 컨베이어를 활용하여, 듀오 포탑에 [accent]구리[]를 공급하세요. gz.walls = [accent]벽[]은 건물로 날아오는 공격을 막을 수 있습니다. \n포탑 주변에 \uf8ae [accent]구리 벽[]을 배치하세요. gz.defend = 적이 다가옵니다, 방어 태세를 갖추세요. -gz.aa = 비행 기체는 기본 포탑으로는 쉽게 처리할 수 없습니다.\n\uf860 [accent]스캐터[] 포탑은 훌륭한 대공 방어를 자랑하지만, 탄환으로 \uf837 [accent]납[]이 필요합니다. +gz.aa = 비행 유닛은 기본 포탑으로는 쉽게 처리할 수 없습니다.\n\uf860 [accent]스캐터[] 포탑은 훌륭한 대공 방어를 자랑하지만, 탄환으로 \uf837 [accent]납[]이 필요합니다. gz.scatterammo = 컨베이어를 활용하여,스캐터 포탑에 [accent]납[]을 공급하세요. gz.supplyturret = [accent]보급 포탑 gz.zone1 = 이건 적의 착륙 지점입니다. gz.zone2 = 반경에 세워진 모든 것은 단계가 시작되면 파괴됩니다. gz.zone3 = 단계가 지금 시작됩니다.\n준비하세요. -gz.finish = 포탑을 더 건설하고, 자원을 더 채굴하고,\n그리고 모든 단계를 막아내어 [accent]지역을 점령[]하세요. -onset.mine = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 클릭하여 채굴하세요.\n\n[accent][[WASD]로 움직이세요. +gz.finish = 포탑을 더 건설하고, 자원을 더 채굴하고,\n그리고 모든 단계를 막아내어 [accent]지역을 점령[]하세요. 이것으로 튜토리얼을 마칩니다. 행운을 빕니다. + +onset.mine = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 클릭하여 채굴하세요.\n\n[accent][WASD]로 움직이세요. onset.mine.mobile = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 눌러서 채굴하세요. -onset.research = \ue875 연구 기록을 여세요.\n \uf73e [accent]터빈 응결기[]를 연구하고, 구덩이 위에 배치하세요.\n[accent]전력[]을 생산합니다. -onset.bore = \uf741 [accent]플라즈마 채광기[]를 연구하고 배치하세요.\n벽으로부터 자동으로 자원을 채굴합니다. +onset.research = \ue875 연구 기록을 여세요.\n \uf73e [accent]터빈 응결기[]를 연구하고, 연구 기록을 다시 닫은 다음, 구덩이 위에 배치하세요.\n[accent]전력[]을 생산합니다. +onset.bore = 다시 연구 기록을 열어 \uf741 [accent]플라즈마 채광기[]를 연구하고 배치하세요.\n벽으로부터 자동으로 자원을 채굴합니다. onset.power = [accent]전력[]을 플라즈마 채광기로 전달하기 위해선, \uf73d [accent]빔 노드[]를 연구하고 배치하세요.\n터빈 응결기와 플라즈마 채광기를 연결하세요. onset.ducts = \uf799 [accent]도관[]을 연구하고 배치하여 플라즈마 채광기에서 채굴한 자원을 코어로 운반하세요.\n클릭하고 끌어서 도관을 길게 연결하세요.\n[accent]스크롤해서[]해서 방향을 회전할 수 있습니다. onset.ducts.mobile = \uf799 [accent]도관[]을 연구하고 배치하여 플라즈마 채광기에서 채굴한 자원을 코어로 운반하세요.\n손가락을 길게 누르고 끌어서 도관을 길게 연결하세요. -onset.moremine = 채굴 작업을 확장하세요.\n더 많은 플라즈마 채광기를 배치하고 빔 노드와 덕트를 사용하여 보조하세요.\n베릴륨 200개 채굴하기. +onset.moremine = 채굴 작업을 확장하세요.\n더 많은 플라즈마 채광기를 배치하고 빔 노드와 도관을 사용하여 보조하세요.\n베릴륨 200개 채굴하기. onset.graphite = 더 복잡한 건물은 \uf835 [accent]흑연[]이 필요합니다.\n흑연을 채굴하는 플라즈마 채광기를 배치하세요. onset.research2 = [accent]공장[]을 연구할 시간입니다.\n \uf74d [accent]벽 분쇄기[]와 \uf779 [accent]실리콘 아크 화로[]를 연구하세요. onset.arcfurnace = 아크 화로는 \uf834 [accent]모래[]와 \uf835 [accent]흑연[]을 가공하여 \uf82f [accent]실리콘[]을 생산합니다.\n[accent]전력[] 또한 필수입니다. onset.crusher = \uf74d [accent]벽 분쇄기[]를 사용하여 모래를 채굴하세요. -onset.fabricator = [accent]기체[]는 지도를 정찰하거나, 건물을 보호하거나, 적을 공격할 때 활용할 수 있습니다. \uf6a2 [accent]전차 재조립기[]를 연구하고 배치하세요. -onset.makeunit = 기체를 생산하세요.\n"?" 버튼을 눌러 선택한 공장의 요구사항을 확인할 수 있습니다. -onset.turrets = 기체는 유용하지만, [accent]포탑[]은 사용하기에 따라 더 나은 방어 성능을 보여줍니다.\n \uf6eb [accent]브리치[] 포탑을 배치하세요.\n포탑은 \uf748 [accent]탄약[]이 필요합니다. +onset.fabricator = [accent]유닛[]은 맵을 정찰하거나, 건물을 보호하거나, 적을 공격할 때 활용할 수 있습니다. \uf6a2 [accent]전차 재조립기[]를 연구하고 배치하세요. +onset.makeunit = 유닛을 생산하세요.\n"?" 버튼을 눌러 선택한 공장의 요구사항을 확인할 수 있습니다. +onset.turrets = 유닛은 유용하지만, [accent]포탑[]은 사용하기에 따라 더 나은 방어 성능을 보여줍니다.\n \uf6eb [accent]브리치[] 포탑을 배치하세요.\n포탑은 \uf748 [accent]탄약[]이 필요합니다. onset.turretammo = 포탑에 [accent]베릴륨 탄약[]을 공급하세요. onset.walls = [accent]벽[]은 건물로 날아오는 공격을 막을 수 있습니다. \n포탑 주변에 \uf6ee [accent]베릴륨 벽[]을 배치하세요. onset.enemies = 적이 다가옵니다, 방어 태세를 갖추세요. @@ -2444,14 +2483,16 @@ onset.defenses = [accent]방어 태세 갖추기:[lightgray] {0} onset.attack = 적은 취약한 상태입니다. 반격하세요. onset.cores = 새로운 코어는 [accent]코어 타일[]위에 배치할 수 있습니다.\n새로운 코어는 전진기지 역할을 하며 다른 코어와 저장된 자원을 공유합니다.\n \uf725 코어를 배치하세요. onset.detect = 적은 2분 이내에 당신을 탐지할 것입니다.\n생산, 채굴, 방어시설을 구성하세요. -onset.commandmode = [accent]shift[]를 눌러 [accent]명령 모드[]를 활성화하세요.\n[accent]좌클릭과 드래그[]로 기체를 선택하세요.\n[accent]우클릭[]으로 선택된 기체들에게 이동 또는 공격 명령을 내리세요. -onset.commandmode.mobile = [accent]명령 버튼[]을 눌러 [accent]명령 모드[]를 활성화하세요.\n손가락을 꾹 누르고, [accent]드래그[]해서 유닛을 선택하세요.\n[accent]눌러서[] 선택된 기체들에게 이동 또는 공격 명령을 내리세요. -aegis.tungsten = 텅스텐을 채굴하려면 [accent]충격드릴[]이 필요합니다.\n 충격 드릴은[accent]물[]과 [accent]전력[]을 필요로 합니다. -split.pickup = 일부 블록은 코어 기체로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(화물을 집어올리거나 내리는 기본 키는 [ 그리고 ]입니다) -split.pickup.mobile = 일부 블록은 코어 기체로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(무언가를 집어올리거나 내려놓으려면, 길게 누르세요.) -split.acquire = 기체를 제조하려면 텅스텐을 채굴해야 합니다. -split.build = 기체를 벽의 반대편으로 운반해야 합니다.\n두 개의 [accent]회물 매스 드라이버[]를 각 벽면에 하나씩 배치하세요.\n둘 중 하나를 누른 다음 다른 하나를 선택하여 연결을 설정합니다. -split.container = 컨테이너와 마찬가지로, 기체도 [accent]화물 매스 드라이버[]를 사용하여 운송할 수 있습니다.\n기체 조립대를 매스 드라이버 근처에 배치하여 기체를 적재한 후, 벽을 가로질러 보내 적 기지를 공격합니다. +onset.commandmode = [accent]shift[]를 눌러 [accent]명령 모드[]를 활성화하세요.\n[accent]좌클릭과 드래그[]로 유닛을 선택하세요.\n[accent]우클릭[]으로 선택된 유닛들에게 이동 또는 공격 명령을 내리세요. +onset.commandmode.mobile = [accent]명령 버튼[]을 눌러 [accent]명령 모드[]를 활성화하세요.\n손가락을 꾹 누르고, [accent]드래그[]해서 유닛을 선택하세요.\n[accent]눌러서[] 선택된 유닛들에게 이동 또는 공격 명령을 내리세요. 이것으로 에르키아의 튜토리얼을 마칩니다. 행운을 빕니다. +aegis.tungsten = 텅스텐을 채굴하려면 [accent]충격 드릴[]이 필요합니다.\n 충격 드릴은[accent]물[]과 [accent]전력[]을 필요로 합니다. + +split.pickup = 일부 블록은 코어 유닛으로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(화물을 집어올리거나 내리는 기본 키는 [ 그리고 ]입니다.) +split.pickup.mobile = 일부 블록은 코어 유닛으로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(무언가를 집어올리거나 내려놓으려면, 길게 누르세요.) +split.acquire = 유닛을 생산하려면 텅스텐을 채굴해야 합니다. +split.build = 유닛을 벽의 반대편으로 운반해야 합니다.\n두 개의 [accent]화물 매스 드라이버[]를 각 벽면에 하나씩 배치하세요.\n둘 중 하나를 누른 다음 다른 하나를 선택하여 연결을 설정합니다. +split.container = 컨테이너와 마찬가지로, 유닛도 [accent]화물 매스 드라이버[]를 사용하여 운송할 수 있습니다.\n유닛 조립대를 매스 드라이버 근처에 배치하여 유닛을 적재한 후, 벽을 가로질러 보내 적 기지를 공격하게 만듭니다. + item.copper.description = 모든 종류의 구조물 및 탄약으로 사용하는 기본 자원입니다. item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포되어 있습니다. 기본적으로 보강하지 않는 한 구조적으로 약합니다. item.lead.description = 전자 및 액체 수송 블록에서 광범위하게 사용하는 기본 자원입니다. @@ -2473,6 +2514,8 @@ item.spore-pod.description = 석유, 폭발물과 연료로 전환하는 데 사 item.spore-pod.details = 포자, 합성 생명체로 판단됩니다. 타 유기체에 치명적인 독가스를 내뿜으며. 매우 빠르게 퍼집니다. 특정한 조건에서 인화성이 매우 높습니다. item.blast-compound.description = 폭탄과 폭발성 탄약에 사용되는 불안정한 화합물입니다. item.pyratite.description = 방화 무기와 연료를 연소하는 발전기에 사용되는 가연성이 매우 높은 물질입니다. + +#Erekir item.beryllium.description = 에르키아의 여러 종류의 건축물과 탄약에 사용됩니다. item.tungsten.description = 드릴, 장갑 및 탄약에 사용됩니다. 보다 발전된 구조물을 건설하는 데 필요합니다. item.oxide.description = 전원의 열전도체 및 절연체로 사용됩니다. @@ -2481,6 +2524,8 @@ liquid.water.description = 냉각기 및 폐기물 처리에 사용됩니다. liquid.slag.description = 분리기를 통해 다른 자원으로 정제하거나 탄환으로 적들에게 살포할 수 있습니다. liquid.oil.description = 고급 재료 생산, 석탄으로 전환 및 적들에게 살포하여 불을 지를 수 있습니다. liquid.cryofluid.description = 원자로, 포탑 및 공장에서 냉각수로 사용되는 비부식성 액체입니다. + +#Erekir liquid.arkycite.description = 발전 및 재료 합성을 위한 화학 반응에 사용됩니다. liquid.ozone.description = 재료 생산에서 산화제로 사용되며 연료로도 사용됩니다. 적당한 폭발성 물질입니다. liquid.hydrogen.description = 자원 추출, 기체 생산 및 구조물 수리에 사용됩니다. 가연성 물질입니다. @@ -2488,7 +2533,8 @@ liquid.cyanogen.description = 탄약, 첨단 기체의 구축 및 첨단 블록 liquid.nitrogen.description = 자원 추출, 가스 생성 및 기체 생산에 사용됩니다. 불활성 물질입니다. liquid.neoplasm.description = 신생물 반응로의 위험한 생물학적 부산물. 접촉하는 즉시 인접한 모든 수분 함유 블록으로 빠르게 확산되며, 진행되는 동안 피해를 입힙니다. 점성을 띄는 물질입니다. liquid.neoplasm.details = 신생물, 진흙과 비슷한 점성을 가졌으며, 통제 불능의 속도로 빠르게 확산되는 합성세포 덩어리 입니다. 고온에 저항력이 있으며, 일반적인 분석으로는 너무나 복잡하고 불안정하여 아직 정확한 행동 양식이나 생태를 확인하지 못 했습니다. 열 저항. 물과 관련된 구조물에는 매우 위험합니다.\n\n 광재 웅덩이에 소각하는 것이 바람직합니다. -block.derelict = \ue815 [lightgray]잔해 + +block.derelict = \uf77e [lightgray]잔해 block.armored-conveyor.description = 자원을 앞으로 운반합니다. 측면에서 자원을 받아들이지 않습니다. block.illuminator.description = 발광합니다. block.message.description = 아군 간의 소통을 위한 메시지를 저장합니다. @@ -2530,6 +2576,10 @@ block.phase-wall.description = 적 발사체로부터 아군 구조물을 보호 block.phase-wall-large.description = 적 발사체로부터 아군 구조물을 보호합니다. 충돌한 탄환 대부분을 반사합니다. \n여러 타일을 차지합니다. block.surge-wall.description = 적 발사체로부터 아군 구조물을 보호합니다. 접촉 시 무작위로 전격 아크를 방출합니다. block.surge-wall-large.description = 적 발사체로부터 아군 구조물을 보호합니다. 접촉 시 무작위로 전격 아크를 방출합니다.\n여러 타일을 차지합니다. +block.scrap-wall.description = 적 발사체로부터 아군 구조물을 보호합니다. +block.scrap-wall-large.description = 적 발사체로부터 아군 구조물을 보호합니다. +block.scrap-wall-huge.description = 적 발사체로부터 아군 구조물을 보호합니다. +block.scrap-wall-gigantic.description = 적 발사체로부터 아군 구조물을 보호합니다. block.door.description = 탭하여 열거나 닫을 수 있는 벽입니다. block.door-large.description = 탭하여 열거나 닫을 수 있는 벽입니다.\n여러 타일을 차지합니다. block.mender.description = 주변 블록을 주기적으로 수리합니다.\n선택적으로 실리콘을 사용하여 범위와 효율성을 향상할 수 있습니다. @@ -2545,7 +2595,7 @@ block.bridge-conveyor.description = 지형이나 건물을 넘어 자원을 운 block.phase-conveyor.description = 지형이나 건물 너머로 자원을 즉시 운반합니다. 속도가 빠르고 다리 컨베이어보다 길지만, 작동하려면 전력이 필요합니다. block.sorter.description = 입력된 자원이 선택과 일치하면 앞으로 통과하며, 그렇지 않으면 왼쪽과 오른쪽으로 출력합니다. block.inverted-sorter.description = 필터와 비슷하지만, 대신 선택된 자원을 측면으로 출력합니다. -block.router.description = 입력된 자원을 최대 3개의 다른 방향으로 동등하게 분배합니다.\n\n[scarlet]공장에서 생산된 자원으로 인해 입력이 막힐 수 있으므로, 절대로 공장 바로 옆에서 사용하지 마세요. +block.router.description = 입력된 자원을 최대 3개의 다른 방향으로 동등하게 분배합니다.\n\n[scarlet]공장에서 생산된 자원으로 인해 입력이 막힐 수 있으므로, 절대로 공장 바로 옆에서 사용하지 마세요.[] block.router.details = 필요악. 자원 입력을 위해 공장 옆에 설치하는 것은 그 공장의 출력으로 인해 막힐 수 있으므로 사용하지 않는 것이 좋음. block.distributor.description = 입력된 자원을 최대 7개의 다른 방향으로 동등하게 분배합니다. block.overflow-gate.description = 앞쪽 경로가 차단된 경우에만 왼쪽과 오른쪽으로 출력합니다. @@ -2638,6 +2688,8 @@ block.logic-display.description = 프로세서를 이용해 임의로 그래픽 block.large-logic-display.description = 프로세서를 이용해 임의로 그래픽을 출력할 수 있습니다. block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 행성 간 이동을 위한 탈출 속도까지 코어를 가속합니다. block.repair-turret.description = 피해를 입은 가장 가까운 기체를 지속적으로 수리합니다. 선택적으로 냉각수를 넣을 수 있습니다. + +#Erekir block.core-bastion.description = 기지의 핵심입니다. 튼튼합니다. 한번 파괴되면, 구역을 잃습니다. block.core-citadel.description = 기지의 핵심입니다. 더 튼튼합니다. 코어: 요새보다 더 많은 양의 자원을 저장합니다. block.core-acropolis.description = 기지의 핵심입니다. 매우 튼튼합니다. 코어: 성채보다 더 많은 양의 자원을 저장합니다. @@ -2768,6 +2820,8 @@ unit.oxynoe.description = 주변의 적을 향해 구조물을 수리하는 화 unit.cyerce.description = 주변의 적을 향해 유도 집속 미사일을 발사합니다. 아군 기체를 수리합니다. unit.aegires.description = 에너지 필드로 들어온 모든 적 기체와 구조물에게 충격을 줍니다. 모든 아군을 수리합니다. unit.navanax.description = 적 전력망에 상당한 피해를 주고 아군 블록을 수리하는 폭발성 EMP 탄환을 발사합니다. 4개의 자율 레이저 포탑으로 주변 적을 녹입니다. + +#Erekir unit.stell.description = 적 대상에게 일반적인 탄환을 발사합니다. unit.locus.description = 적 대상에게 번갈아 나오는 탄환을 발사합니다. unit.precept.description = 적 대상에게 관통하는 집속탄환을 발사합니다. @@ -2786,101 +2840,113 @@ unit.disrupt.description = 적 대상에게 장거리 유도 억제 발사체를 unit.evoke.description = 코어: 요새를 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. unit.incite.description = 코어: 성채를 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. unit.emanate.description = 코어: 도심을 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. -lst.read = 연결된 메모리 셀에서 숫자 읽음 -lst.write = 연결된 메모리 셀에 숫자 작성 -lst.print = 프린트 버퍼에 텍스트 추가\n[accent]Print Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다 -lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" -lst.draw = 드로잉 버퍼에 실행문 추가\n[accent]Draw Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다 -lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출력 -lst.printflush = 대기중인 [accent]Print[]실행문을 메시지 블록에 출력 -lst.getlink = 순서별로 프로세서의 연결을 가져옴. 0부터 시작 -lst.control = 건물 조종 -lst.radar = 건물 주변의 기체 검색 -lst.sensor = 건물 또는 기체의 정보 수집 -lst.set = 변수 선언/할당 -lst.operation = 1~2개의 변수로 연산 -lst.end = 실행줄의 가장 위로 건너뜀 -lst.wait = 일정 시간(초) 동안 대기 -lst.stop = 이 프로세서의 실행 중지 -lst.lookup = id를 통해 특정 유형의 아이템/액체/기체/블록 조회\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]\n...로 각 유형의 총 갯수를 알 수 있습니다. -lst.jump = 조건부로 다른 실행문으로 건너뜀 -lst.unitbind = type 옆에 있는 기체를 지정하고, [accent]@unit[]에 저장 -lst.unitcontrol = 현재 지정된 기체 조종 -lst.unitradar = 현재 지정된 기체 주변의 기체 검색 -lst.unitlocate = 특정 유형의 위치/건물을 지도상에서 조회\n지정된 기체가 필요합니다 -lst.getblock = 특정 위치의 타일 정보를 불러옴 -lst.setblock = 특정 위치의 타일 정보 설정 -lst.spawnunit = 특정 위치에 기체 소환 -lst.applystatus = 기체에게 상태이상을 적용하거나 삭제 -lst.weathersense = Check if a type of weather is active. -lst.weatherset = Set the current state of a type of weather. -lst.spawnwave = 특정 위치에 이전 단계를 실행\n실제 단계가 넘어가지 않습니다 -lst.explosion = 특정 위치에 폭발 생성 -lst.setrate = 프로세서 실행 속도를 틱당 연산량으로 설정 -lst.fetch = 기체, 코어, 플레이어 또는 건물을 엔티티 번호로 조회\n번호는 0에서 시작하여 엔티티 번호-1에서 끝납니다 -lst.packcolor = 그리기 혹은 규칙 설정을 위해 [0, 1] RGBA 단일 요소로 묶음 -lst.setrule = 게임 규칙 설정 -lst.flushmessage = 텍스트 버퍼로부터 화면에 메세지를 표시\n이전 메세지가 완료될 때까지 기다립니다 -lst.cutscene = 플레이어 카메라 조작 -lst.setflag = 모든 프로세서가 읽을 수 있는 전역 플래그 설정 -lst.getflag = 전역 플래그가 설정되어 있는지 확인 -lst.setprop = 기체 혹은 건물의 속성을 설정합니다. -lst.effect = Create a particle effect. -lst.sync = Sync a variable across the network.\nOnly invoked 10 times a second at most. -lst.playsound = Plays a sound.\nVolume and pan can be a global value, or calculated based on position. -lst.makemarker = Create a new logic marker in the world.\nAn ID to identify this marker must be provided.\nMarkers currently limited to 20,000 per world. -lst.setmarker = Set a property for a marker.\nThe ID used must be the same as in the Make Marker instruction. -lst.localeprint = Add map locale property value to the text buffer.\nTo set map locale bundles in map editor, check [accent]Map Info > Locale Bundles[].\nIf client is a mobile device, tries to print a property ending in ".mobile" first. + +lst.read = 연결된 메모리 셀에서 숫자를 읽습니다. +lst.write = 연결된 메모리 셀에 숫자를 작성합니다. +lst.print = 프린트 버퍼에 텍스트를 추가합니다.\n[accent]Print Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다. +lst.format = 텍스트 버퍼의 다음 플레이스홀더를 값으로 바꿉니다.\n자리 표시자 패턴이 유효하지 않은 경우 아무것도 하지 않습니다.\n플레이스홀더 패턴: "{[accent]number 0-9[]}"\n예:\n[accent]print "test {0}"\nformat "example" +lst.draw = 드로잉 버퍼에 실행문을 추가합니다.\n[accent]Draw Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다. +lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출력합니다. +lst.printflush = 대기중인 [accent]Print[]실행문을 메시지 블록에 출력합니다. +lst.getlink = 순서별로 프로세서의 연결을 가져옵니다. 0부터 시작합니다. +lst.control = 건물을 조종합니다. +lst.radar = 건물 주변의 유닛을 검색합니다. +lst.sensor = 건물 또는 기체의 정보를 수집합니다. +lst.set = 변수를 설정합니다. +lst.operation = 1~2개의 변수로 연산합니다. +lst.end = 실행줄의 가장 위로 건너뜁니다. +lst.wait = 일정 시간(초) 동안 대기합니다. +lst.stop = 이 프로세서의 실행 중지합니다. +lst.lookup = id를 통해 특정 유형의 아이템/액체/기체/블록을 조회합니다.\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]\n...로 각 유형의 총 갯수를 알 수 있습니다. +lst.jump = 조건부로 다른 실행문으로 건너뜁니다. +lst.unitbind = type 옆에 있는 유닛을 지정하고, [accent]@unit[]에 저장합니다. +lst.unitcontrol = 현재 지정된 유닛을 조종합니다. +lst.unitradar = 현재 지정된 유닛 주변의 다른 유닛을 검색합니다. +lst.unitlocate = 특정 유형의 위치/건물을 맵 상에서 조회.\n지정된 유닛이 필요합니다. +lst.getblock = 특정 위치의 타일 정보를 불러옵니다. +lst.setblock = 특정 위치의 타일 정보 설정합니다. +lst.spawnunit = 특정 위치에 유닛을 소환합니다. +lst.applystatus = 유닛에게 상태 이상을 적용하거나 삭제합니다. +lst.weathersense = 어떤 유형의 날씨가 활동하는지 확인합니다. +lst.weatherset = 날씨 유형의 현재 상태를 설정합니다. +lst.spawnwave = 특정 위치에 이전 단계를 실행합니다.\n실제로 단계가 넘어가지는 않습니다. +lst.explosion = 특정 위치에 폭발을 생성합니다. +lst.setrate = 프로세서 실행 속도를 틱당 연산량으로 설정합니다. +lst.fetch = 기체, 코어, 플레이어 또는 건물을 엔티티 번호로 조회합니다.\n번호는 0에서 시작하여 엔티티 번호-1에서 끝납니다. +lst.packcolor = 그리기 혹은 규칙 설정을 위해 [0, 1] RGBA 단일 요소로 묶습니다. +lst.setrule = 게임 규칙을 설정합니다. +lst.flushmessage = 텍스트 버퍼로부터 화면에 메세지를 표시합니다.\n이전 메세지가 완료될 때까지 기다립니다. +lst.cutscene = 플레이어 카메라를 조작합니다. +lst.setflag = 모든 프로세서가 읽을 수 있는 전역 플래그 설정합니다. +lst.getflag = 전역 플래그가 설정되어 있는지 확인합니다. +lst.setprop = 유닛 혹은 건물의 속성을 설정합니다. +lst.effect = 파티클 효과를 만듭니다. +lst.sync = 네트워크 전체에서 변수를 동기화합니다.\n1초에 최대 10번만 호출됩니다. +lst.playsound = 소리를 재생합니다.\n볼륨과 팬은 전역 값이 될 수도 있고, 위치를 기준으로 계산될 수도 있습니다. +lst.makemarker = 월드에 새로운 논리 마커를 만듭니다.\n 이 마커를 식별할 ID를 제공해야 합니다.\n 현재 마커는 월드당 20,000개로 제한되어 있습니다. +lst.setmarker = 마커의 속성을 설정합니다.\n사용된 ID는 마커 만들기 지침에서와 동일해야 합니다. +lst.localeprint = 텍스트 버퍼에 맵 언어 팩 속성 값을 추가합니다.\n맵 편집기에서 맵 언어 팩을 설정하려면 [accent]맵 정보 > 언어 팩[]을 선택합니다.\n클라이언트가 모바일 기기인 경우 먼저 ".mobile"로 끝나는 속성을 print하려고 시도합니다. + lglobal.false = 0 lglobal.true = 1 lglobal.null = null -lglobal.@pi = The mathematical constant pi (3.141...) -lglobal.@e = The mathematical constant e (2.718...) -lglobal.@degToRad = Multiply by this number to convert degrees to radians -lglobal.@radToDeg = Multiply by this number to convert radians to degrees -lglobal.@time = Playtime of current save, in milliseconds -lglobal.@tick = Playtime of current save, in ticks (1 second = 60 ticks) -lglobal.@second = Playtime of current save, in seconds -lglobal.@minute = Playtime of current save, in minutes -lglobal.@waveNumber = Current wave number, if waves are enabled -lglobal.@waveTime = Countdown timer for waves, in seconds -lglobal.@mapw = Map width in tiles -lglobal.@maph = Map height in tiles -lglobal.sectionMap = Map -lglobal.sectionGeneral = General -lglobal.sectionNetwork = Network/Clientside [World Processor Only] -lglobal.sectionProcessor = Processor -lglobal.sectionLookup = Lookup -lglobal.@this = The logic block executing the code -lglobal.@thisx = X coordinate of block executing the code -lglobal.@thisy = Y coordinate of block executing the code -lglobal.@links = Total number of blocks linked to this processors -lglobal.@ipt = Execution speed of the processor in instructions per tick (60 ticks = 1 second) -lglobal.@unitCount = Total number of types of unit content in the game; used with the lookup instruction -lglobal.@blockCount = Total number of types of block content in the game; used with the lookup instruction -lglobal.@itemCount = Total number of types of item content in the game; used with the lookup instruction -lglobal.@liquidCount = Total number of types of liquid content in the game; used with the lookup instruction -lglobal.@server = True if the code is running on a server or in singleplayer, false otherwise -lglobal.@client = True if the code is running on a client connected to a server -lglobal.@clientLocale = Locale of the client running the code. For example: en_US -lglobal.@clientUnit = Unit of client running the code -lglobal.@clientName = Player name of client running the code -lglobal.@clientTeam = Team ID of client running the code -lglobal.@clientMobile = True is the client running the code is on mobile, false otherwise -logic.nounitbuild = [red]기체의 건설 로직은 여기서 허용되지 않습니다. -lenum.type = 건물/기체의 유형\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다. +lglobal.@pi = 수학적 상수; 파이(pi) (3.141...) +lglobal.@e = 수학적 상수; 자연상수(e) (2.718...) +lglobal.@degToRad = 이 숫자를 곱하여 각도를 라디안으로 변환 +lglobal.@radToDeg = 이 숫자를 곱하여 라디안을 각도로 변환 + +lglobal.@time = 현재 저장의 재생 시간(밀리초) +lglobal.@tick = 현재 저장의 재생 시간(틱 단위, 1초 = 60틱) +lglobal.@second = 현재 저장의 재생 시간(초) +lglobal.@minute = 현재 저장 파일의 재생 시간(분) +lglobal.@waveNumber = 현재 단계 번호(단계가 활성화된 경우) +lglobal.@waveTime = 단계 카운트다운 타이머(초) +lglobal.@mapw = 타일 ​​단위의 맵 너비 +lglobal.@maph = 타일 ​​단위의 맵 높이 + +lglobal.sectionMap = 맵 +lglobal.sectionGeneral = 일반 +lglobal.sectionNetwork = 네트워크/클라이언트 측 [월드 프로세서 전용] +lglobal.sectionProcessor = 프로세서 +lglobal.sectionLookup = 조회 + +lglobal.@this = 코드를 실행하는 로직 블록 +lglobal.@thisx = 코드를 실행하는 블록의 X 좌표 +lglobal.@thisy = 코드를 실행하는 블록의 Y 좌표 +lglobal.@links = 이 프로세서에 연결된 총 블록 수 +lglobal.@ipt = 틱당 명령어로 표현된 프로세서의 실행 속도(60틱 = 1초) + +lglobal.@unitCount = 게임에서 유닛 콘텐츠 유형의 총 수; 조회 지침과 함께 사용됨 +lglobal.@blockCount = 게임의 블록 콘텐츠 유형의 총 수; 조회 지침과 함께 사용됨 +lglobal.@itemCount = 게임의 아이템 콘텐츠 유형의 총 수; 조회 지침과 함께 사용됨 +lglobal.@liquidCount = 게임의 액체 콘텐츠 유형의 총 수; 조회 지침과 함께 사용됨 + +lglobal.@server = 코드가 서버 또는 싱글 플레이어에서 실행되는 경우 true, 그렇지 않은 경우 false +lglobal.@client = 코드가 서버에 연결된 클라이언트에서 실행되는 경우 true + +lglobal.@clientLocale = 코드를 실행하는 클라이언트의 언어 팩. 예: en_US (한국어는 ko_KR) +lglobal.@clientUnit = 코드를 실행하는 클라이언트의 단위 +lglobal.@clientName = 코드를 실행하는 클라이언트의 플레이어 이름 +lglobal.@clientTeam = 코드를 실행하는 클라이언트의 팀 ID +lglobal.@clientMobile = 코드를 실행하는 클라이언트가 모바일에 있는 경우 true, 그렇지 않으면 false + +logic.nounitbuild = [red]유닛의 건설 로직은 여기에서 허용되지 않습니다. + +lenum.type = 건물/유닛의 유형\n예로 분배기는 문자열이 아니라 [accent]@router[]를 반환합니다. lenum.shoot = 특정 위치에 발사 lenum.shootp = 목표물 속도를 예측하여 발사 lenum.config = 필터의 아이템같은 건물의 설정 lenum.enabled = 블록의 활성 여부 -laccess.currentammotype = Current ammo item/liquid of a turret. -laccess.color = 조명 색상 -laccess.controller = 기체 제어자. 프로세서가 제어하면, 프로세서를 반환합니다.\n다른 기체에 의해 지휘되면(G키), 지휘하는 기체를 반환합니다.\n그 외에는 자신을 반환합니다. -laccess.dead = 기체 또는 건물 사망/무효 여부 -laccess.controlled = 만약 기체 제어자가 프로세서라면 [accent]@ctrlProcessor[]를 반환합니다.\n만약 기체/건물 제어자가 플레이어라면 [accent]@ctrlPlayer[]를 반환합니다.\n만약 기체가 다른 기체에 의해 지휘되면(G키)[accent]@ctrlFormation[]를 반환합니다.\n그 외에는 0을 반환합니다. + +laccess.currentammotype = 포탑의 현재 탄약/액체. +laccess.color = 조명 색상. +laccess.controller = 유닛 제어자. 프로세서가 제어하면, 프로세서를 반환합니다.\n다른 유닛에 의해 지휘되면(G키), 지휘하는 유닛을 반환합니다.\n그 외에는 자신을 반환합니다. +laccess.dead = 기체 또는 건물 사망/무효 여부. +laccess.controlled = 만약 유닛 제어자가 프로세서라면 [accent]@ctrlProcessor[]를 반환합니다.\n만약 유닛/건물 제어자가 플레이어라면 [accent]@ctrlPlayer[]를 반환합니다.\n만약 유닛가 다른 유닛에 의해 지휘되면(G키)[accent]@ctrlFormation[]를 반환합니다.\n그 외에는 0을 반환합니다. laccess.progress = 작업 진행률, 0 에서 1 로 감.\n포탑 재장전이나 구조물 진행률을 반환합니다. -laccess.speed = 기체의 최대 속도, 타일/초 -laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. +laccess.speed = 기체의 최대 속도, 타일/초. +laccess.id = 유닛/블록/아이템/액체의 ID.\n이것은 조회 작업의 역순입니다. + lcategory.unknown = 알 수 없음 lcategory.unknown.description = 분류되지 않은 설명 lcategory.io = 입력 & 출력 @@ -2906,7 +2972,8 @@ graphicstype.poly = 정다각형 채우기 graphicstype.linepoly = 정다각형 외곽선 그리기 graphicstype.triangle = 삼각형 채우기 graphicstype.image = 일부 콘텐츠의 이미지 그리기\n예: [accent]@router[] 또는 [accent]@dagger[]. -graphicstype.print = Draws text from the print buffer.\nClears the print buffer. +graphicstype.print = 프린트 버퍼에서 텍스트를 그립니다.\n프린트 버퍼를 지웁니다. + lenum.always = 항상 참 lenum.idiv = 정수 나누기 lenum.div = 나누기\n0으로 나누면 [accent]null[]을 반환합니다. @@ -2924,7 +2991,7 @@ lenum.xor = 비트연산자 XOR lenum.min = 두 수의 최솟값 lenum.max = 두 수의 최댓값 lenum.angle = 벡터의 각(도) -lenum.anglediff = Absolute distance between two angles in degrees. +lenum.anglediff = 두 각도 사이의 절대 거리(도). lenum.len = 벡터의 길이 lenum.sin = 사인(도) lenum.cos = 코사인(도) @@ -2981,14 +3048,16 @@ unitlocate.building = 찾은 건물을 대입할 변수 unitlocate.outx = X좌표 unitlocate.outy = Y좌표 unitlocate.group = 찾을 건물 집단 -playsound.limit = If true, prevents this sound from playing\nif it has already been played in the same frame. + +playsound.limit = true인 경우, 같은 프레임에서 이미 재생된 사운드는 재생되지 않습니다. + lenum.idle = 이동 정지, 채광/건설 유지\n기본 상태입니다. lenum.stop = 이동/채광/건설 중단 lenum.unbind = 로직 컨트롤 완전 비활성화\n표준 AI를 다시 따릅니다. lenum.move = 특정 위치로 이동 lenum.approach = 특정 위치로 반지름만큼 접근 lenum.pathfind = 적 스폰 지점으로 길찾기 -lenum.autopathfind = Automatically pathfinds to the nearest enemy core or drop point.\nThis is the same as standard wave enemy pathfinding. +lenum.autopathfind = 가장 가까운 적의 코어이나 착륙 지점까지 자동으로 경로를 찾습니다.\n이것은 일반적인 웨이브 적 경로 찾기와 동일합니다. lenum.target = 특정 위치에 발사 lenum.targetp = 목표물 속도를 예측하여 발사 lenum.itemdrop = 아이템 투하 @@ -2999,13 +3068,14 @@ lenum.payenter = 유닛 아래의 화물 건물에 착륙/진입 lenum.flag = 깃발 수 설정 lenum.mine = 특정 위치에서 채광 lenum.build = 구조물 건설 -lenum.getblock = Fetch building, floor and block type at coordinates.\nUnit must be in range of the position, otherwise null is returned. +lenum.getblock = 좌표에서 건물, 층, 블록 유형을 가져옵니다.\n단위는 위치 범위 내에 있어야 하며, 그렇지 않으면 null이 반환됩니다. lenum.within = 좌표 주변 기체 발견 여부 lenum.boost = 이륙 시작/중단 -lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle. -lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument. -lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size. -lenum.autoscale = Whether to scale marker corresponding to player's zoom level. -lenum.posi = Indexed position, used for line and quad markers with index zero being the first position. -lenum.uvi = Texture's position ranging from zero to one, used for quad markers. -lenum.colori = Indexed position, used for line and quad markers with index zero being the first color. + +lenum.flushtext = 해당되는 경우, 프린트 버퍼의 내용을 마커에 플러시.\nFetch가 true로 설정된 경우, 맵 언어 팩 또는 게임 번들에서 속성을 가져오려고 시도합니다. +lenum.texture = 게임의 texture atlas에서 직접 가져온 텍스처 이름(케밥식 명명 스타일 사용).\n printFlush가 true로 설정된 경우, 텍스트 인수로 텍스트 버퍼 내용을 사용합니다. +lenum.texturesize = 타일의 텍스처 크기. 0 값은 마커 너비를 원래 텍스처 크기에 맞게 조정합니다. +lenum.autoscale = 플레이어의 확대/축소 레벨에 맞춰 마커의 크기를 조정할지 여부. +lenum.posi = 인덱스 위치. 라인 및 쿼드 마커에 사용되며 인덱스 0이 첫 번째 위치입니. +lenum.uvi = 0에서 1까지의 텍스처 위치, 쿼드 마커에 사용. +lenum.colori = 인덱스된 위치, 인덱스 0이 첫 번째 색상이며 라인 및 쿼드 마커에 사용. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 5726588d4f..03c86f3944 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Kraunama pasaulio informacija... server.port = Prievadas: -server.addressinuse = Adresas jau naudojamas! server.invalidport = Negaliams prievado numeris! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Įvyko klaida. save.new = Naujas Išsaugojimas save.overwrite = Ar esate tikras, jog\n norite perrašyti šį elementą? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Atidengti configure = Keisti resursų kiekį @@ -1204,6 +1203,8 @@ error.mapnotfound = Žemėlapis nerastas! error.io = Tinklo I/O klaida. error.any = Nžinoma tinklo klaida. error.bloom = Nepavyko inicijuoti spindėjimo.\nJūsų įrenginys gali nepalaikyti šios funkcijos. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Siena padengta specialiu faziniu pagrindu sukurtu block.phase-wall-large.description = Siena padengta specialiu faziniu pagrindu sukurtu junginiu. Atmuša daugumą šovinių.\nUžima kelias vietas. block.surge-wall.description = Ypač patvarus gynybinis blokas.\nKaupia krūvį kontakto metu su šoviniu atsitiktinai jį išleisdamas. block.surge-wall-large.description = Ypač patvarus gynybinis blokas.\nKaupia krūvį kontakto metu su šoviniu atsitiktinai jį išleisdamas.\nUžima kelias vietas. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Mažos durys. Gali būti atidarytos ir uždarytos paspaudus. block.door-large.description = Didelės durys. Gali būti atidarytos ir uždarytos paspaudus.\nUžima kelias vietas. block.mender.description = Periodiškai taiso blokus pasiekiamame plote. Palaiko gynybines konstrukcijas pataisytas tarp bangu.\nPapildomai naudoja silicį atstumo ir efektyvumo padidinimui. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 08a8998650..8fe0c99915 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Aan het herverbinden... reconnect = Reconnect connecting.data = [accent]Wereld aan het laden... server.port = Poort: -server.addressinuse = Adres is al in gebruik! server.invalidport = Poort is geen geldig getal! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Fout met hosten: [accent]{0} save.new = Nieuwe Save save.overwrite = Weet je zeker dat je deze\nsave wilt overschrijven? @@ -1136,7 +1136,6 @@ requirement.capture = Verover {0} requirement.onplanet = Controlesector Op {0} requirement.onsector = Land Op Sector: {0} launch.text = Lanceer -research.multiplayer = Alleen de host kan dingen onderzoeken. map.multiplayer = Alleen de host kan sectoren bekijken. uncover = Ontmasker configure = Configureer startinventaris @@ -1204,6 +1203,8 @@ error.mapnotfound = Kaartbestand niet gevonden! error.io = Netwerk I/O fout. error.any = Onbekende netwerk fout. error.bloom = Bloom aanzetten mislukt.\nJe apparaat ondersteunt het waarschijnlijk niet. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Regen weather.snowing.name = Sneeuw weather.sandstorm.name = Zandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = De optimale locatie om nog een keer te beginnen. Lage vijandelijke dreiging. Enkele grondstoffen.\nVerzamel zoveel mogelijk lood en koper.\nGa door. sector.frozenForest.description = Zelfs hier, dichter bij de bergen, hebben de schimmels zich verspreid. De koude temperaturen kunnen ze niet eeuwig tegenhouden.\n\nBegin de onderneming in energie. Bouw verbrandingsgeneratoren. Leer herstellers te gebruiken. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = De vijand heeft een basis gevestigd op een af sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis @@ -2529,6 +2534,10 @@ block.phase-wall.description = Not as strong as a thorium wall but will deflect block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 5f9b767387..99ebbf57a5 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Laden map data... server.port = Poort: -server.addressinuse = Dit adres wordt al gebruikt! server.invalidport = Ongeldige poort! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Fout bij het openen van de server: [accent]{0} save.new = Nieuwe save save.overwrite = Ben je zeker dat je deze save\nwilt overschrijven? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Uncover configure = Configure Loadout @@ -1204,6 +1203,8 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Not as strong as a thorium wall but will deflect block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index bf9653a798..61750f80ae 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Ponowne łączenie... reconnect = Reconnect connecting.data = [accent]Ładowanie danych świata... server.port = Port: -server.addressinuse = Adres jest już w użyciu! server.invalidport = Nieprawidłowy numer portu. +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Błąd hostowania serwera: [accent]{0} save.new = Nowy zapis save.overwrite = Czy na pewno chcesz nadpisać zapis gry? @@ -1137,7 +1137,6 @@ requirement.capture = Zdobądź {0} requirement.onplanet = Kontrolowane Sektory na {0} requirement.onsector = Wyląduj na Sektorze: {0} launch.text = Wystrzel -research.multiplayer = Tylko host może odkrywać przedmioty. map.multiplayer = Tylko host może widzieć sektory uncover = Odkryj configure = Skonfiguruj Ładunek @@ -1205,6 +1204,8 @@ error.mapnotfound = Plik mapy nie został znaleziony! error.io = Błąd sieciowy I/O. error.any = Nieznany błąd sieci. error.bloom = Nie udało się załadować funkcji bloom.\nTwoje urządzenie może nie wspierać tej funkcji. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Deszcz weather.snowing.name = Śnieg weather.sandstorm.name = Burza piaskowa @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz możliwie jak najwięcej miedzi i ołowiu.\nPrzejdź do następnej strefy jak najszybciej. sector.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki się rozprzestrzeniały. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nZacznij od produkcji prądu. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = Wróg założył bazę na odległej, naturaln sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Początek sector.aegis.name = Egida @@ -2530,6 +2535,10 @@ block.phase-wall.description = Mur pokryty specjalną mieszanką opartą o Włó block.phase-wall-large.description = Mur pokryty specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków.\nObejmuje wiele kratek. block.surge-wall.description = Ekstremalnie wytrzymały blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego. block.surge-wall-large.description = Ekstremalnie wytrzymały blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą przez nie strzelać oraz nimi przechodzić. block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą przez nie strzelać oraz nimi przechodzić.\nObejmują wiele kratek. block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje struktury obronne w dobrym stanie.\nOpcjonalnie używa krzemu do zwiększenia zasięgu i szybkości naprawy. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index fb7cae019d..2410ea052d 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconectando... reconnect = Reconnect connecting.data = [accent]Carregando dados do mundo... server.port = Porta: -server.addressinuse = Porta em uso! server.invalidport = Numero de port inválido! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} save.new = Novo save save.overwrite = Você tem certeza que quer sobrescrever este save? @@ -1138,7 +1138,6 @@ requirement.capture = Capture {0} requirement.onplanet = Controle o setor em {0} requirement.onsector = Lance no setor: {0} launch.text = Lançar -research.multiplayer = Apenas o host pode pesquisar itens. map.multiplayer = Apenas o host consegue ver os setores. uncover = Descobrir configure = Configurar carregamento @@ -1206,6 +1205,8 @@ error.mapnotfound = Arquivo de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Chuva weather.snowing.name = Neve weather.sandstorm.name = Tempestade de Areia @@ -1288,6 +1289,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Um lugar bom para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsiga o máximo possível de chumbo e cobre.\nContinue. sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos se espalharam. As temperaturas baixas não conseguirão contê-los para sempre.\n\nComeçe a aventura com energia. Construa geradores a combustão. Aprenda a usar reparadores. @@ -1310,11 +1313,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = O Começo sector.aegis.name = Aegis @@ -2535,6 +2540,10 @@ block.phase-wall.description = Um muro revestido com tecido de fase. Reflete a m block.phase-wall-large.description = Um muro revestido com tecido de fase. Reflete a maioria das balas ao impacto. Ocupa múltiplos blocos. block.surge-wall.description = Um bloco defensivo extremamente durável. Se carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. block.surge-wall-large.description = Um bloco defensivo extremamente durável. Se carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. Ocupa multiplos blocos. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar. Ocupa múltiplos blocos. block.mender.description = Periodicamente repara blocos vizinhos.\nOpicionalmente usa silício para aumentar o alcance e a eficácia. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index bda21f5fef..ee6299eacc 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Carregando dados do mundo... server.port = Porte: -server.addressinuse = Endereço em uso! server.invalidport = Numero de porta invalido! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} save.new = Novo gravamento save.overwrite = Você tem certeza que quer sobrescrever este gravamento? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Descobrir configure = Configurar carregamento @@ -1204,6 +1203,8 @@ error.mapnotfound = Ficheiro de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu aparelho talvez não o suporte. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Um muro revestido com um composto especial basead block.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto.\nSOcupa múltiplos blocos. block.surge-wall.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente. block.surge-wall-large.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente.\nOcupa multiplos blocos. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar.\nOcupa múltiplos blocos. block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficiência. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index d5ab496094..fc05826e6b 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconectare... reconnect = Reconnect 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.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Eroare la găzduirea serverului. save.new = Nouă Salvare save.overwrite = Sigur vrei să scrii peste \nacest slot de salvare? @@ -1137,7 +1137,6 @@ requirement.capture = Capturează {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Lansează -research.multiplayer = Doar gazda poate cerceta noi tehnologii. map.multiplayer = Doar gazda poate vedea harta sectoarelor. uncover = Descoperă configure = Configurează Încărcarea @@ -1205,6 +1204,8 @@ 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. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Ploaie weather.snowing.name = Ninsoare weather.sandstorm.name = Furtună de nisip @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier 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, sporii 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. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2529,6 +2534,10 @@ block.phase-wall.description = Protejează clădirile de proiectilele inamice, r block.phase-wall-large.description = Protejează clădirile de proiectilele inamice, reflectând majoritatea gloanțelor la impact. block.surge-wall.description = Protejează clădirile de proiectilele inamice, lansând periodic lasere electrice la contactul cu gloanțele. block.surge-wall-large.description = Protejează clădirile de proiectilele inamice, lansând periodic lasere electrice la contactul cu gloanțele. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Un perete care poate fi deschis sau închis. block.door-large.description = Un perete care poate fi deschis sau închis. block.mender.description = Repară periodic blocurile din vecinătate. \nPoate folosi silicon pt a îmbunătăți raza de acțiune și eficiența. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 97645d39f9..1bf9a88698 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Переподключение… reconnect = Reconnect connecting.data = [accent]Загрузка данных мира… server.port = Порт: -server.addressinuse = Данный адрес уже используется! server.invalidport = Неверный номер порта! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Ошибка создания сервера. save.new = Новое сохранение save.overwrite = Вы уверены, что хотите перезаписать\nэтот слот для сохранения? @@ -1137,7 +1137,6 @@ requirement.capture = Захватите {0} requirement.onplanet = Возьмите сектор под контроль на {0} requirement.onsector = Высадитесь на сектор: {0} launch.text = Высадка -research.multiplayer = Только хост может исследовать предметы. map.multiplayer = Только хост может просматривать секторы. uncover = Раскрыть configure = Конфигурация выгрузки @@ -1205,6 +1204,8 @@ error.mapnotfound = Файл карты не найден! error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Дождь weather.snowing.name = Снегопад weather.sandstorm.name = Песчаная буря @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = Враг возвел базу на удал sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Начало sector.aegis.name = Защита @@ -2530,6 +2535,10 @@ block.phase-wall.description = Защищает постройки от враж block.phase-wall-large.description = Защищает постройки от вражеских снарядов, отражая большинство пуль при ударе. block.surge-wall.description = Защищает постройки от вражеских снарядов, периодически выпускает электрический разряд при ударе. block.surge-wall-large.description = Защищает постройки от вражеских снарядов, периодически выпускает электрический разряд при ударе. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Стена, которую можно открыть или закрыть нажатием. block.door-large.description = Стена, которую можно открыть или закрыть нажатием. block.mender.description = Периодически ремонтирует блоки в непосредственной близости.\nОпционально использует кремний для увеличения дальности и эффективности. diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 4ef7673dee..bd6b218c2b 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Ponovno povezivanje... reconnect = Reconnect connecting.data = [accent]Učitavanje podataka... server.port = Port: -server.addressinuse = Adresa je već u upotrebi! server.invalidport = Invalid port number! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Error hosting server. save.new = Novi Snimak save.overwrite = Da li ste sigurni da želite da prerežete\novaj snimak? @@ -1137,7 +1137,6 @@ requirement.capture = Zauzmi {0} requirement.onplanet = Kontroliši Sektor Na {0} requirement.onsector = Sleti Na Sektor: {0} launch.text = Lansiraj -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Razotkrij configure = Konfiguriši Zalihe @@ -1205,6 +1204,8 @@ error.mapnotfound = Datoteka mape nije pronađena! error.io = I/O mrežna greška. error.any = Nepoznata greška u mreži. error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Kiša weather.snowing.name = Sneg weather.sandstorm.name = Peščana Oluja @@ -1287,6 +1288,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Savršena lokacija za ponovni početak. Niska neprijateljska pretnja, ali i mala količina resursa.\nSakupite sav bakar i svo olovo koje možete. Nastavite dalje. sector.frozenForest.description = Čak i ovde, u blizini planina, spore su se proširile… ledene temperature ih neće večno zadržati.\n\nZapočnite upotrebu elektriciteta. Graditei sagorevne generatore. Naučite primenu popravljača. @@ -1309,11 +1312,13 @@ sector.navalFortress.description = Neprijatelj je sagradio bazu na dalekom, prir sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Žačetak sector.aegis.name = Okrilje @@ -2531,6 +2536,10 @@ block.phase-wall.description = Štiti građevine od neprijateljskih projektila, block.phase-wall-large.description = Štiti građevine od neprijateljskih projektila, odbijajući većinu metaka pri udaru. block.surge-wall.description = Štiti građevine od neprijateljskih projektila, povremeno uzrokavajući električne udare pri kontaktu. block.surge-wall-large.description = Štiti građevine od neprijateljskih projektila, povremeno uzrokavajući električne udare pri kontaktu. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Zid koji se može otvarati i zatvarati. block.door-large.description = Zid koji se može otvarati i zatvarati. block.mender.description = Povremeno popravlja blokove u okolini.\nMože koristiti silicijum da poveća domet i efikasnost. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 024e39ad40..6f29524677 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Loading world data... server.port = Port: -server.addressinuse = Address already in use! server.invalidport = Ogiltigt portnummer! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Error hosting server: [accent]{0} save.new = Ny sparfil save.overwrite = Are you sure you want to overwrite\nthis save slot? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Uncover configure = Configure Loadout @@ -1204,6 +1203,8 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Okänt nätverksfel. error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = A wall coated with special phase-based reflective block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = A small door. Can be opened or closed by tapping. block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 5e96a21df9..f44475ac0a 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -777,8 +777,8 @@ reconnecting = [accent]กำลังเชื่อมต่อใหม่... reconnect = Reconnect connecting.data = [accent]กำลังโหลดข้อมูลของโลก ... server.port = พอร์ต: -server.addressinuse = มีคนใช้ที่อยู่นี้อยู่แล้ว! server.invalidport = เลขพอร์ตไม่ถูกต้อง! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]การโฮสต์เซิร์ฟเวอร์ผิดพลาด save.new = เซฟใหม่ save.overwrite = คุณแน่ใจหรือว่าจะเซฟทับ\nเซฟนี้? @@ -1140,7 +1140,6 @@ requirement.capture = ยึดครอง {0} requirement.onplanet = ควบคุมเซ็กเตอร์บน {0} requirement.onsector = ลงจอดบนเซ็กเตอร์: {0} launch.text = ลุย! -research.multiplayer = โฮสต์เท่านั้นที่วิจัยได้ map.multiplayer = โฮสต์เท่านั้นที่สามารถดูเซ็กเตอร์ได้ uncover = เปิดเผย configure = ตั้งค่าทรัพยากร @@ -1208,6 +1207,8 @@ error.mapnotfound = ไม่พบไฟล์แมพ error.io = ข้อผิดพลาด I/O ของเครือข่าย error.any = ข้อผิดพลาด: เครือข่ายที่ไม่รู้จัก error.bloom = ไม่สามารถเริ่มต้นบลูมได้\nอุปกรณ์ของคุณอาจไม่รองรับ +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = ฝน weather.snowing.name = หิมะตก weather.sandstorm.name = พายุทราย @@ -1290,6 +1291,8 @@ sector.atolls.name = อะทอลส์ sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = จุดที่ดีที่สุดในการตั้งต้นใหม่อีกครั้งนึง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ sector.frozenForest.description = แม้แต่ที่นี่ ณ ที่ที่อยู่ใกล้กับภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่ได้ อากาศอันแสนเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้ เรียนรู้ที่จะใช้เครื่องซ่อมแซม @@ -1312,11 +1315,13 @@ sector.navalFortress.description = ศัตรูได้ตั้งฐาน sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = การเริ่มต้น sector.aegis.name = อีจีส @@ -2541,6 +2546,10 @@ block.phase-wall.description = ป้องกันสิ่งก่อสร block.phase-wall-large.description = ป้องกันสิ่งก่อสร้างจากศัตรู ทนทานและแข็งแรง\nเคลือบด้วยวัสดุพิเศษที่สะท้อนกระสุนส่วนใหญ่ที่รับมา\nครอบคลุมหลายช่อง block.surge-wall.description = ป้องกันสิ่งก่อสร้างจากศัตรู แข็งแกร่งอย่างมาก\nจะปล่อยพลังงานสายฟ้าออกมาเป็นระยะๆ เมื่อถูกโจมตี block.surge-wall-large.description = ป้องกันสิ่งก่อสร้างจากศัตรู แข็งแกร่งอย่างมาก\nจะปล่อยพลังงานสายฟ้าออกมาเป็นระยะๆ เมื่อถูกโจมตี\nครอบคลุมหลายช่อง +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = กำแพงที่สามารถเปิดและปิดได้ ไว้ใช้เพื่อให้ยูนิตเดินผ่าน block.door-large.description = กำแพงที่สามารถเปิดและปิดได้ ไว้ใช้เพื่อให้ยูนิตเดินผ่าน\nครอบคลุมหลายช่อง block.mender.description = ซ่อมแซมสิ่งก่อสร้างในวงของมันอย่างช้าๆ\nสามารถใช้ซิลิกอนเพื่อเพิ่มระยะและประสิทธิภาพได้ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index af4e012a75..c71e1c5725 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Reconnecting... reconnect = Reconnect connecting.data = [accent]Loading world data... server.port = Link: -server.addressinuse = Addres zaten kullaniliyor! server.invalidport = Geçersiz Oyun numarasi! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Oyun acarkes sorun olustu: [accent]{0} save.new = Yeni Kayit Dosyasi save.overwrite = Bu oyunun uzerinden\ngecmek istedigine emin\nmisin? @@ -1136,7 +1136,6 @@ requirement.capture = Capture {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = Launch -research.multiplayer = Only the host can research items. map.multiplayer = Only the host can view sectors. uncover = Uncover configure = Configure Loadout @@ -1204,6 +1203,8 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Unkown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Rain weather.snowing.name = Snow weather.sandstorm.name = Sandstorm @@ -1286,6 +1287,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. @@ -1308,11 +1311,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis sector.lake.name = Lake @@ -2528,6 +2533,10 @@ block.phase-wall.description = Not as strong as a thorium wall but will deflect block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 1934124545..6982015a28 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -779,8 +779,8 @@ reconnecting = [accent]Yeniden Bağlanılıyor... reconnect = Reconnect connecting.data = [accent]Dünya verisi yükleniyor... server.port = Port: -server.addressinuse = Adres zaten kullanılıyor! server.invalidport = Geçersiz port sayısı! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Sunucu kurulamadı: [accent]{0} save.new = Yeni kayıt save.overwrite = Bu kaydın üstüne yazmak istediğine\nemin misin? @@ -1139,7 +1139,6 @@ requirement.capture = {0} sektörünü ele geçir requirement.onplanet = Sektör {0} Kontrol Et requirement.onsector = Sektör {0}e İniş Yap launch.text = Kalkış -research.multiplayer = Sadece sunucu sahibi araştırma yapabilir. map.multiplayer = Sadece sunucu sahibi sektörleri görebilir. uncover = Aç configure = Ekipmanı Yapılandır @@ -1207,6 +1206,8 @@ error.mapnotfound = Harita dosyası bulunamadı! error.io = Ağ I/O hatası. error.any = Bilinmeyen ağ hatası. error.bloom = Kamaşma başlatılamadı.\nCihazınız bu özelliği desteklemiyor olabilir. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Yağmur weather.snowing.name = Kar weather.sandstorm.name = Kum Fırtınası @@ -1289,6 +1290,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle. sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. @@ -1311,11 +1314,13 @@ sector.navalFortress.description = Düşman bu uzak adaya doğal olarak korunan sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Yeni Başlangıç sector.aegis.name = Siper sector.lake.name = Göletçik @@ -2536,6 +2541,10 @@ block.phase-wall.description = Özel faz örgüsü bazlı yansıtıcı materyal block.phase-wall-large.description = Özel faz bazlı yansıtıcı bileşik ile kaplanmış bir duvar. Çoğu mermi çarpma anında geri sektirir.\nBirçok blok alan kaplar. block.surge-wall.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır. block.surge-wall-large.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır.\nBirçok blok alan kaplar. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Küçük bir kapı. Dokunarak açılabilir veya kapatılabilir. block.door-large.description = Büyük bir kapı. Dokunarak açılabilir veya kapatılabilir.\nBirçok blok alan kaplar. block.mender.description = Çevresindeki blokları periyodik olarak tamir eder. Savunmaları dalgalar arasında tamir eder.\nİsteğe bağlı olarak menzili ve verimi arttırmak için silikon kullanılabilir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 5355e52b5f..1293a4fd5e 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -779,8 +779,8 @@ reconnecting = [accent]Повторне з’єднання… reconnect = Reconnect connecting.data = [accent]Завантаження даних світу… server.port = Порт: -server.addressinuse = Ця адреса вже використовується! server.invalidport = Недійсний номер порту! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]Помилка створення сервера. save.new = Нове збереження save.overwrite = Ви дійсно хочете перезаписати це місце збереження? @@ -1140,7 +1140,6 @@ requirement.capture = Захопіть {0} requirement.onplanet = Установіть контроль над сектором на {0} requirement.onsector = Приземліться на такий сектор: {0} launch.text = Запуск -research.multiplayer = Лише власник сервера має змогу досліджувати предмети. map.multiplayer = Лише власник може переглядати сектори. uncover = Розкрити configure = Налаштувати вивантаження @@ -1208,6 +1207,8 @@ error.mapnotfound = Файл мапи не знайдено! error.io = Мережева помилка введення-виведення. error.any = Невідома мережева помилка error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Дощ weather.snowing.name = Сніг weather.sandstorm.name = Піщана буря @@ -1290,6 +1291,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗберіть якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі. sector.frozenForest.description = Навіть тут, ближче до гір, уже поширилися спори. Холодна температура не змогла стримати їх назавжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами. @@ -1312,11 +1315,13 @@ sector.navalFortress.description = Ворог створив базу на ві sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Перший наступ sector.aegis.name = Егіда @@ -2539,6 +2544,10 @@ block.phase-wall.description = Англійська назва: Phase Wall\nЗа block.phase-wall-large.description = Англійська назва: Phase Wall Large\nЗахищає споруди від ворожих снарядів, відбиває більшість куль у разі зіткненні. block.surge-wall.description = Англійська назва: Surge Wall\nЗахищає споруди від ворожих снарядів, періодично випускає електричні дуги в разі зіткненні. block.surge-wall-large.description = Англійська назва: Surge Wall Large\nЗахищає споруди від ворожих снарядів, періодично випускає електричні дуги в разі зіткненні. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Англійська назва: Door\nСтіна, яку можна відчинити й зачинити. block.door-large.description = Англійська назва: Door Large\nСтіна, яку можна відчинити й зачинити. block.mender.description = Англійська назва: Mender\nПеріодично ремонтує блоки у своєму радіусі дії.\nЗа бажанням можна використати кремній задля підвищення радіусу дії й ефективності. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index d5c4742e71..7287183f6a 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -777,8 +777,8 @@ reconnecting = [accent]Đang kết nối lại... reconnect = Reconnect connecting.data = [accent]Đang tải dữ liệu thế giới... server.port = Cổng: -server.addressinuse = Địa chỉ đang được sử dụng! server.invalidport = Số cổng không hợp lệ! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Lỗi tạo máy chủ. save.new = Bản lưu mới save.overwrite = Bạn có chắc muốn ghi đè\nbản lưu này? @@ -1138,7 +1138,6 @@ requirement.capture = Chiếm {0} requirement.onplanet = Kiểm soát khu vực {0} requirement.onsector = Đáp xuống khu vực: {0} launch.text = Phóng -research.multiplayer = Chỉ máy chủ mới có thể nghiên cứu các mục. map.multiplayer = Chỉ máy chủ mới có thể xem các khu vực. uncover = Khám phá configure = Cấu hình vật phẩm khởi đầu @@ -1208,6 +1207,8 @@ error.mapnotfound = Không tìm thấy tệp bản đồ! error.io = Lỗi mạng đầu vào/ra. error.any = Lỗi mạng không xác định. error.bloom = Không khởi tạo được hiệu ứng phát sáng.\nThiết bị của bạn có thể không hỗ trợ. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = Mưa weather.snowing.name = Tuyết weather.sandstorm.name = Bão cát @@ -1292,6 +1293,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = Vị trí tối ưu để bắt đầu một lần nữa. Mối đe dọa của kẻ địch thấp. Ít tài nguyên.\nThu thập càng nhiều đồng và chì càng tốt.\nTiến lên. sector.frozenForest.description = Dù ở đây, gần núi cao, các bào tử vẫn bắt đầu phát tán. Nhiệt độ lạnh giá không thể giữ chúng lại mãi.\n\nBắt đầu tạo năng lượng. Hãy xây dựng máy phát điện đốt. Học cách sử dụng máy sửa chữa. @@ -1315,11 +1318,13 @@ sector.navalFortress.description = Kẻ địch đã thiết lập một căn c sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis @@ -2541,6 +2546,10 @@ block.phase-wall.description = Bảo vệ các công trình khỏi đạn của block.phase-wall-large.description = Bảo vệ các công trình khỏi đạn của kẻ địch, phản hầu hết đạn khi va chạm. block.surge-wall.description = Bảo vệ các công trình khỏi đạn của kẻ địch, thường phóng ra các tia điện khi đạn va chạm. block.surge-wall-large.description = Bảo vệ các công trình khỏi đạn của kẻ địch, thường phóng ra các tia điện khi đạn va chạm. +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Một bức tường có thể mở và đóng. block.door-large.description = Một bức tường có thể mở và đóng. block.mender.description = Sửa chữa định kỳ các khối trong vùng lân cận.\nTùy chọn sử dụng silicon để tăng phạm vi và hiệu quả. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index c9b81c7b53..032be7f895 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -834,8 +834,8 @@ reconnecting = [accent]重新连接中… reconnect = 重新连接 connecting.data = [accent]地图加载中… server.port = 端口: -server.addressinuse = 地址已被占用! server.invalidport = 无效的端口! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]创建服务器错误。 save.new = 新存档 save.overwrite = 确定要覆盖这个存档吗? @@ -1195,7 +1195,6 @@ requirement.capture = 占领{0} requirement.onplanet = 控制区块{0} requirement.onsector = 着陆区块:{0} launch.text = 发射 -research.multiplayer = 只有服务器创建者能研究科技。 map.multiplayer = 只有服务器创建者能查看区块。 uncover = 已解锁 configure = 设定装运的物资 @@ -1260,9 +1259,11 @@ error.timedout = 连接超时!\n请确认服务器设置了端口转发且地 error.mismatch = 数据包错误。 \n可能是客户端/服务器的版本不匹配。 \n请确保客户端和服务器都是最新的版本! error.alreadyconnected = 已经建立连接。 error.mapnotfound = 找不到地图文件! -error.io = 网络I/O错误。 -error.any = 未知网络错误。 -error.bloom = 未能初始化光效。 \n您的设备可能不支持。 +error.io = 网络I/O错误。 +error.any = 未知网络错误。 +error.bloom = 未能初始化光效。 \n您的设备可能不支持。 +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = 降雨 weather.snowing.name = 降雪 weather.sandstorm.name = 沙尘暴 @@ -1346,6 +1347,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = 踏上旅程的最佳位置。 这里的敌人威胁很小,但资源也少。\n\n尽你所能收集铅和铜,出发吧! sector.frozenForest.description = 一个靠近山脉的地方。 哪怕是在这里,也有了孢子扩散的痕迹。\n连极寒也无法长久地约束它们。\n\n开始运用电力,建造火力发电机并学会使用修理器。 @@ -1368,11 +1371,13 @@ sector.navalFortress.description = 敌人在一个有天然防御屏障的偏远 sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = 始发地区 sector.aegis.name = 庇护前哨 @@ -2593,6 +2598,10 @@ block.phase-wall.description = 保护己方建筑,挡下敌方炮弹。 受大 block.phase-wall-large.description = 保护己方建筑,挡下敌方炮弹。 受大多数子弹攻击时有概率将其反弹。 block.surge-wall.description = 保护己方建筑,挡下敌方炮弹。 受攻击时间断释放电弧。 block.surge-wall-large.description = 保护己方建筑,挡下敌方炮弹。 受攻击时间断释放电弧。 +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = 可以开关的墙。 block.door-large.description = 可以开关的墙。 block.mender.description = 定期修复附近的建筑。\n可使用硅提高范围和效率。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 3f3159e16c..d9ecdc3594 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -777,8 +777,8 @@ reconnecting = [accent]重新連接中…… reconnect = Reconnect connecting.data = [accent]地圖資料載入中…… server.port = 連接埠: -server.addressinuse = 該位置已被使用! server.invalidport = 無效的連接埠! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [crimson]建立伺服器時發生錯誤。 save.new = 新存檔 save.overwrite = 您確定要覆寫存檔嗎? @@ -1138,7 +1138,6 @@ requirement.capture = 捕獲 {0} requirement.onplanet = Control Sector On {0} requirement.onsector = Land On Sector: {0} launch.text = 發射 -research.multiplayer = 只有管理者可以使用這個物品 map.multiplayer = 只有管理者可以查看地圖 uncover = 探索 configure = 資源配置 @@ -1206,6 +1205,8 @@ error.mapnotfound = 找不到地圖! error.io = 網路錯誤。 error.any = 未知網路錯誤。 error.bloom = 初始化特效失敗。\n您的裝置可能不支援 +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. + weather.rain.name = 雨 weather.snowing.name = 雪 weather.sandstorm.name = 沙塵暴 @@ -1289,6 +1290,8 @@ sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds sector.seaPort.name = Sea Port sector.weatheredChannels.name = Weathered Channels +sector.mycelialBastion.name = Mycelial Bastion +sector.frontier.name = Frontier sector.groundZero.description = 再次開始的最佳位置。敵人威脅程度低。資源少。\n盡可能地採集鉛與銅。\n繼續前進。 sector.frozenForest.description = 即使是在如此靠近山脈的地方,孢子也已經擴散了。低溫無法永遠遏止它們。\n\n開始探索電力。建造火力發電機。學習如何修理方塊。 @@ -1311,11 +1314,13 @@ sector.navalFortress.description = The enemy has established a base on a remote, sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = 著陸點 sector.aegis.name = 神盾 @@ -2534,6 +2539,10 @@ block.phase-wall.description = 沒有釷牆那麼堅固但特殊的相位化合 block.phase-wall-large.description = 沒有釷牆那麼堅固但特殊的相位化合物塗層會使大多的子彈偏離。\n佔據多個方塊。 block.surge-wall.description = 最強的防禦方塊。\n有低機率對攻擊者觸發閃電。 block.surge-wall-large.description = 最強的防禦方塊。\n有低機率對攻擊者觸發閃電。\n佔據多個方塊。 +block.scrap-wall.description = Protects structures from enemy projectiles. +block.scrap-wall-large.description = Protects structures from enemy projectiles. +block.scrap-wall-huge.description = Protects structures from enemy projectiles. +block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = 可以通過點擊打開和關閉的一扇小門。\n如果打開,敵人可以穿過它射擊和移動。 block.door-large.description = 可以通過點擊打開和關閉的一扇大門。\n如果打開,敵人可以穿過它射擊和移動。\n佔據多個方塊。 block.mender.description = 定期修復附近的建築物。在每一波之間保持防禦力的修復。\n可選擇使用矽來提高範圍和效率。 diff --git a/core/assets/maps/desolateRift.msav b/core/assets/maps/desolateRift.msav index d08ee30cfe..11d62928a0 100644 Binary files a/core/assets/maps/desolateRift.msav and b/core/assets/maps/desolateRift.msav differ diff --git a/core/assets/maps/infestedCanyons.msav b/core/assets/maps/infestedCanyons.msav index dfa31fb144..02f0c043de 100644 Binary files a/core/assets/maps/infestedCanyons.msav and b/core/assets/maps/infestedCanyons.msav differ diff --git a/core/assets/maps/mycelialBastion.msav b/core/assets/maps/mycelialBastion.msav index 32ee4f04f8..e4d41aab47 100644 Binary files a/core/assets/maps/mycelialBastion.msav and b/core/assets/maps/mycelialBastion.msav differ diff --git a/core/assets/maps/planetaryTerminal.msav b/core/assets/maps/planetaryTerminal.msav index 2cf2df9dd6..c7efc2bfbf 100644 Binary files a/core/assets/maps/planetaryTerminal.msav and b/core/assets/maps/planetaryTerminal.msav differ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 88a05e3056..181de69387 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -185,7 +185,6 @@ const GeneratorPressureExplodeEvent = Packages.mindustry.game.EventType.Generato const BlockDestroyEvent = Packages.mindustry.game.EventType.BlockDestroyEvent const BuildSelectEvent = Packages.mindustry.game.EventType.BuildSelectEvent const BuildRotateEvent = Packages.mindustry.game.EventType.BuildRotateEvent -const BlockBreakEvent = Packages.mindustry.game.EventType.BlockBreakEvent const BuildPayloadDrop = Packages.mindustry.game.EventType.BuildPayloadDrop const BuildPayloadPickup = Packages.mindustry.game.EventType.BuildPayloadPickup const BlockBuildEventTile = Packages.mindustry.game.EventType.BlockBuildEventTile diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 70bdc29643..34188bdd86 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -73,10 +73,12 @@ public class Vars implements Loadable{ public static final String clientDiscord = "https://discord.gg/yp9ZW7j"; /** URL the links to the wiki's modding guide.*/ public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/"; - /** URL to the JSON file containing all the BE servers. Only queried in BE. */ - public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_be.json"; - /** URL to the JSON file containing all the stable servers. */ - public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_v8.json"; + /** URLs to the JSON file containing all the BE servers. Only queried in BE. */ + public static final String[] serverJsonBeURLs = {"https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_be.json", "https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_be.json", "https://cdn.jsdelivr.net/gh/anuken/mindustryserverlist/servers_be.json"}; + /** URLs to the JSON file containing all the stable servers. */ + public static final String[] serverJsonURLs = {"https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_v8.json", "https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_v8.json", "https://cdn.jsdelivr.net/gh/anuken/mindustryserverlist/servers_v8.json"}; + /** URLs to the JSON files containing the list of mods. */ + public static final String[] modJsonURLs = {"https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", "https://cdn.jsdelivr.net/gh/anuken/mindustrymods/mods.json"}; /** URL of the github issue report template.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; /** list of built-in servers.*/ diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index e6de644bf1..9446e72aa3 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -55,7 +55,7 @@ public UnitCommand currentCommand(){ /** Attempts to assign a command to this unit. If not supported by the unit type, does nothing. */ public void command(UnitCommand command){ - if(Structs.contains(unit.type.commands, command)){ + if(unit.type.commands.contains(command)){ //clear old state. unit.mineTile = null; unit.clearBuilding(); @@ -88,8 +88,8 @@ public void updateUnit(){ } //assign defaults - if(command == null && unit.type.commands.length > 0){ - command = unit.type.defaultCommand == null ? unit.type.commands[0] : unit.type.defaultCommand; + if(command == null && unit.type.commands.size > 0){ + command = unit.type.defaultCommand == null ? unit.type.commands.first() : unit.type.defaultCommand; } //update command controller based on index. diff --git a/core/src/mindustry/client/Spectate.kt b/core/src/mindustry/client/Spectate.kt index 068a159efb..cd2fddd9b4 100644 --- a/core/src/mindustry/client/Spectate.kt +++ b/core/src/mindustry/client/Spectate.kt @@ -8,7 +8,7 @@ import mindustry.client.ClientVars.* import mindustry.gen.* import mindustry.input.* -object Spectate { +object Spectate { // FINISHME v8: Remove this as vanilla now has a spectate feature that we should use instead. var pos: Position? = null var cursor = false diff --git a/core/src/mindustry/client/ui/ResearchAssistant.kt b/core/src/mindustry/client/ui/ResearchAssistant.kt index a4c7876b42..dff8f15a9c 100644 --- a/core/src/mindustry/client/ui/ResearchAssistant.kt +++ b/core/src/mindustry/client/ui/ResearchAssistant.kt @@ -3,8 +3,10 @@ package mindustry.client.ui import arc.* import arc.scene.ui.layout.* import arc.struct.* +import arc.util.* import mindustry.Vars.* import mindustry.content.TechTree.* +import mindustry.ctype.* import mindustry.game.* import mindustry.type.* import mindustry.ui.dialogs.ResearchDialog.* @@ -12,45 +14,62 @@ import mindustry.ui.dialogs.ResearchDialog.* /** Handles various client behavior related to research in campaign */ object ResearchAssistant : Table() { private val queue = Seq() - private var sectors = content.planets().sum { it.sectors.count(Sector::hasBase) } // Owned sector count + private var sectors = content.planets().sum { it.sectors.count(Sector::hasBase) } // Captured sector count FINISHME: Have a number for the current planet too private var autoResearch = Core.settings.getBool("autoresearch") init { - drawQueue() + Events.on(EventType.ClientLoadEvent::class.java) { // FINISHME: Do on the unimportant work thread. + ui.research.checkNodes(ui.research.root) + switchTree() // Setup initial tree + } + Events.on(EventType.TurnEvent::class.java) { - if (state.isCampaign && !net.client()) { - sectors = content.planets().sum { it.sectors.count(Sector::hasBase) } // FINISHME: Change to or add per planet sector capture count. Also add uncaptured sectors and total sectors? + if (!state.isCampaign || net.client()) return@on - queue.each(ui.research.nodes::contains) { spend(it.node) } // Terrible way to handle multiple planets I know. + sectors = content.planets().sum { it.sectors.count(Sector::hasBase) } // FINISHME: Change to or add per planet sector capture count. Also add uncaptured sectors and total sectors? - // Run until no new nodes are unlocked - var any = autoResearch - if (any) ui.research.checkNodes(ui.research.root) // Set visibility for each node (needed in case the research dialog hasn't been opened yet) - while (any) { - any = ui.research.nodes.any { it.visible && it.node.content.locked() && ui.research.view.canSpend(it.node) && spend(it.node) } - } + queue.copy().each(ui.research.nodes::contains) { spend(it.node) } // Terrible way to handle multiple planets I know. + + // Run until no new nodes are unlocked + var any = autoResearch + if (any) ui.research.checkNodes(ui.research.root) // Set visibility for each node (needed in case the research dialog hasn't been opened yet) + while (any) { + any = ui.research.nodes.any { it.visible && it.node.content.locked() && ui.research.view.canSpend(it.node) && spend(it.node) } } } } - fun queue(node: TechTreeNode) { + fun queue(node: TechTreeNode, tail: Boolean = true) { if (queue.contains(node)) dequeue(node) // Requeue the node if (node.node.objectives.contains { !it.complete() }) return // Requirements not met - queue.add(node) - drawQueue() + if (tail) queue.add(node) else queue.insert(0, node) + updateQueue() } fun dequeue(node: TechTreeNode) { queue.remove(node) - drawQueue() + updateQueue() } fun dequeue(node: TechNode) { // This is super hacky dequeue(queue.find { it.node == node } ?: return) } - fun drawQueue() { + /** Called when the tech tree switches */ + fun switchTree() { + Time.mark() + queue.clear() + @Suppress("UNCHECKED_CAST") + (Core.settings.getJson("autoresearchqueue-${ui.research.root.node.name}", Seq::class.java, UnlockableContent::class.java) { null } as? Seq)?.each { queue.add(ui.research.nodes.find { n -> n.node == (it.techNode ?: return@each) } ?: return@each) } + updateQueue(true) + Log.debug("Research queue loaded in ${Time.elapsed()}") + } + + /** Called when adding or removing queued research */ + fun updateQueue(switched: Boolean = false) { + if (!switched) Core.settings.putJson("autoresearchqueue-${ui.research.root.node.name}", queue.map { it.node.content }) + top().right().clearChildren() defaults().right().top() @@ -60,7 +79,7 @@ object ResearchAssistant : Table() { table { it.add(if (queue.isEmpty) "@client.research.queue" else "@client.research.queued") - for (node in queue) it.button(node.node.content.emoji()) { dequeue(node) }.pad(5F).disabled { !ui.research.nodes.contains(node) } + for (node in queue) it.button(node.node.icon()) { if (Core.input.shift()) queue(node, tail = false) else dequeue(node) }.size(48F).pad(5F) } row() diff --git a/core/src/mindustry/client/utils/ServerUtils.kt b/core/src/mindustry/client/utils/ServerUtils.kt index e232a61692..f04256fa19 100644 --- a/core/src/mindustry/client/utils/ServerUtils.kt +++ b/core/src/mindustry/client/utils/ServerUtils.kt @@ -297,9 +297,6 @@ enum class CustomMode( fun handleKick(reason: String) { Log.debug("Kicked from server '${ui.join.lastHost?.name ?: "unknown"}' for: '$reason'.") - if (reason == "Custom client detected.") { - - } } // FINISHME: The jank is growing worse. The servers really need their own classes diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index ea14131137..e1c0a9bd74 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1606,29 +1606,33 @@ public static void load(){ }}; scrapWall = new Wall("scrap-wall"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with(Items.scrap, 6)); + requirements(Category.defense, with(Items.scrap, 6)); health = 60 * wallHealthMultiplier; variants = 5; + buildCostMultiplier = 4f; }}; scrapWallLarge = new Wall("scrap-wall-large"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 4)); + requirements(Category.defense, ItemStack.mult(scrapWall.requirements, 4)); health = 60 * 4 * wallHealthMultiplier; size = 2; variants = 4; + buildCostMultiplier = 4f; }}; scrapWallHuge = new Wall("scrap-wall-huge"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 9)); + requirements(Category.defense, ItemStack.mult(scrapWall.requirements, 9)); health = 60 * 9 * wallHealthMultiplier; size = 3; variants = 3; + buildCostMultiplier = 4f; }}; scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 16)); + requirements(Category.defense, ItemStack.mult(scrapWall.requirements, 16)); health = 60 * 16 * wallHealthMultiplier; size = 4; + buildCostMultiplier = 4f; }}; thruster = new Thruster("thruster"){{ diff --git a/core/src/mindustry/content/Items.java b/core/src/mindustry/content/Items.java index cfb8bb14d6..00cc3cc5d5 100644 --- a/core/src/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -60,7 +60,7 @@ public static void load(){ }}; scrap = new Item("scrap", Color.valueOf("777777")){{ - + cost = 0.5f; }}; silicon = new Item("silicon", Color.valueOf("53565c")){{ diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 2d099f35db..9152290555 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -120,7 +120,7 @@ public static void load(){ difficulty = 7; }}; - mycelialBastion = new SectorPreset("mycelialBastion", serpulo, 133){{ + mycelialBastion = new SectorPreset("mycelialBastion", serpulo, 260){{ difficulty = 7; }}; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index d16383e1b8..fad4e43143 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -236,7 +236,7 @@ public static void load(){ node(steamGenerator, Seq.with(new SectorComplete(craters)), () -> { node(thermalGenerator, () -> { - node(differentialGenerator, Seq.with(new SectorComplete(testingGrounds)), () -> { + node(differentialGenerator, () -> { node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { node(impactReactor, () -> { @@ -262,12 +262,21 @@ public static void load(){ node(duo, () -> { node(copperWall, () -> { node(copperWallLarge, () -> { + node(scrapWall, () -> { + node(scrapWallLarge, () -> { + node(scrapWallHuge, () -> { + node(scrapWallGigantic); + }); + }); + }); + node(titaniumWall, () -> { node(titaniumWallLarge); node(door, () -> { node(doorLarge); }); + node(plastaniumWall, () -> { node(plastaniumWallLarge, () -> { @@ -365,7 +374,7 @@ public static void load(){ node(atrax, () -> { node(spiroct, () -> { node(arkyid, () -> { - node(toxopid, () -> { + node(toxopid, Seq.with(new SectorComplete(mycelialBastion)), () -> { }); }); @@ -511,12 +520,15 @@ public static void load(){ new Research(risso), new Research(minke), new Research(bryde), + new Research(sei), + new Research(omura), new Research(spectre), new Research(launchPad), new Research(massDriver), new Research(impactReactor), new Research(additiveReconstructor), - new Research(exponentialReconstructor) + new Research(exponentialReconstructor), + new Research(tetrativeReconstructor) ), () -> { }); @@ -615,7 +627,8 @@ public static void load(){ node(mycelialBastion, Seq.with( new Research(atrax), new Research(spiroct), - new Research(multiplicativeReconstructor) + new Research(multiplicativeReconstructor), + new Research(exponentialReconstructor) ), () -> { }); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 8e83af02f4..1f752a375a 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -322,7 +322,7 @@ public static void load(){ speed = 0.55f; hitSize = 8f; health = 120f; - buildSpeed = 0.35f; + buildSpeed = 0.3f; armor = 1f; abilities.add(new RepairFieldAbility(10f, 60f * 4, 60f)); @@ -1256,6 +1256,7 @@ public static void load(){ controller = u -> new MinerAI(); defaultCommand = UnitCommand.mineCommand; + allowChangeCommands = false; flying = true; drag = 0.06f; diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index 067a96138e..2e3364c9f0 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -27,6 +27,7 @@ public class ContentLoader{ private ObjectMap[] contentNameMap = new ObjectMap[ContentType.all.length]; private Seq[] contentMap = new Seq[ContentType.all.length]; + private ObjectMap nameMap = new ObjectMap<>(); private MappableContent[][] temporaryMapper; private @Nullable LoadedMod currentMod; private @Nullable Content lastAdded; @@ -216,12 +217,18 @@ public void handleMappableContent(MappableContent content){ } } contentNameMap[content.getContentType().ordinal()].put(content.name, content); + nameMap.put(content.name, content); } public void setTemporaryMapper(MappableContent[][] temporaryMapper){ this.temporaryMapper = temporaryMapper; } + /** @return the last registered content with the specified name. Note that the content loader makes no attempt to resolve name conflicts. This method can be unreliable. */ + public @Nullable MappableContent byName(String name){ + return nameMap.get(name); + } + public Seq[] getContentMap(){ return contentMap; } diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 4a107477c9..996b94a249 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -396,8 +396,8 @@ public static void gameOver(Team winner){ public static void researched(Content content){ if(!(content instanceof UnlockableContent u)) return; - boolean was = u.unlockedNow(); - state.rules.researched.add(u.name); + boolean was = u.unlockedNowHost(); + state.rules.researched.add(u); if(!was){ Events.fire(new UnlockEvent(u)); diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 31a38d4d63..edd891ab09 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -41,7 +41,7 @@ import static mindustry.Vars.*; public class NetClient implements ApplicationListener{ - private static final float dataTimeout = 60 * 30; // Give up after 30s (vanilla is 20s) + private static final float dataTimeout = 60 * 30; /** ticks between syncs, e.g. 5 means 60/5 = 12 syncs/sec*/ private static final float playerSyncTime = 4; private static final Reads dataReads = new Reads(null); @@ -69,7 +69,10 @@ public class NetClient implements ApplicationListener{ private DataInputStream dataStream = new DataInputStream(byteStream); /** Packet handlers for custom types of messages. */ private ObjectMap>> customPacketHandlers = new ObjectMap<>(); - /** Foo's thing to make ServerJoinEvent work good */ + /** Packet handlers for custom types of messages, in binary. */ + private ObjectMap>> customBinaryPacketHandlers = new ObjectMap<>(); + + /** Foo's addition to make ServerJoinEvent only fire on first join. */ public static boolean firstLoad = true; public NetClient(){ @@ -149,11 +152,11 @@ public NetClient(){ Time.runTask(3f, ui.loadfrag::hide); - String title = - packet.reason == null ? "@disconnect" : - packet.reason.equals("closed") ? "@disconnect.closed" : - packet.reason.equals("timeout") ? "@disconnect.timeout" : - "@disconnect.error"; + String title = packet.reason == null ? "@disconnect" : switch(packet.reason){ + case "closed" -> "@disconnect.closed"; + case "timeout" -> "@disconnect.timeout"; + default -> "@disconnect.error"; + }; ui.showCustomConfirm(title, "@disconnect.closed", "@reconnect", "@ok", () -> ui.join.reconnect(), () -> {}); //FINISHME: duped code, ctrl+f ui.showCustomConfirm }); @@ -174,10 +177,34 @@ public Seq> getPacketHandlers(String type){ return customPacketHandlers.get(type, Seq::new); } + public void addBinaryPacketHandler(String type, Cons handler){ + customBinaryPacketHandlers.get(type, Seq::new).add(handler); + } + + public Seq> getBinaryPacketHandlers(String type){ + return customBinaryPacketHandlers.get(type, Seq::new); + } + + @Remote(targets = Loc.server, variants = Variant.both) + public static void clientBinaryPacketReliable(String type, byte[] contents){ + var arr = netClient.customBinaryPacketHandlers.get(type); + if(arr != null){ + for(var c : arr){ + c.get(contents); + } + } + } + + @Remote(targets = Loc.server, variants = Variant.both, unreliable = true) + public static void clientBinaryPacketUnreliable(String type, byte[] contents){ + clientBinaryPacketReliable(type, contents); + } + @Remote(targets = Loc.server, variants = Variant.both) public static void clientPacketReliable(String type, String contents){ - if(netClient.customPacketHandlers.containsKey(type)){ - for(Cons c : netClient.customPacketHandlers.get(type)){ + var arr = netClient.customPacketHandlers.get(type); + if(arr != null){ + for(Cons c : arr){ c.get(contents); } } diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 84ebbb833b..dfd8241807 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -117,6 +117,8 @@ public class NetServer implements ApplicationListener{ private DataOutputStream dataStream = new DataOutputStream(syncStream); /** Packet handlers for custom types of messages. */ private ObjectMap>> customPacketHandlers = new ObjectMap<>(); + /** Packet handlers for custom types of messages - binary version. */ + private ObjectMap>> customBinaryPacketHandlers = new ObjectMap<>(); /** Packet handlers for logic client data */ private ObjectMap>> logicClientDataHandlers = new ObjectMap<>(); @@ -517,6 +519,14 @@ public Seq> getPacketHandlers(String type){ return customPacketHandlers.get(type, Seq::new); } + public void addBinaryPacketHandler(String type, Cons2 handler){ + customBinaryPacketHandlers.get(type, Seq::new).add(handler); + } + + public Seq> getBinaryPacketHandlers(String type){ + return customBinaryPacketHandlers.get(type, Seq::new); + } + public void addLogicDataHandler(String type, Cons2 handler){ logicClientDataHandlers.get(type, Seq::new).add(handler); } @@ -589,6 +599,20 @@ public static void serverPacketUnreliable(Player player, String type, String con serverPacketReliable(player, type, contents); } + @Remote(targets = Loc.client) + public static void serverBinaryPacketReliable(Player player, String type, byte[] contents){ + if(netServer.customPacketHandlers.containsKey(type)){ + for(var c : netServer.customBinaryPacketHandlers.get(type)){ + c.get(player, contents); + } + } + } + + @Remote(targets = Loc.client, unreliable = true) + public static void serverBinaryPacketUnreliable(Player player, String type, byte[] contents){ + serverBinaryPacketReliable(player, type, contents); + } + @Remote(targets = Loc.client) public static void clientLogicDataReliable(Player player, String channel, Object value){ Seq> handlers = netServer.logicClientDataHandlers.get(channel); diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 3ccb774fc0..23b71a6188 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -553,6 +553,7 @@ public void showLaunch(CoreBlock coreType){ public void showLaunch(CoreBuild landCore, CoreBlock coreType){ control.input.config.hideConfig(); + control.input.planConfig.hide(); control.input.inv.hide(); this.landCore = landCore; diff --git a/core/src/mindustry/core/Version.java b/core/src/mindustry/core/Version.java index 0cabb59318..b95981813c 100644 --- a/core/src/mindustry/core/Version.java +++ b/core/src/mindustry/core/Version.java @@ -12,6 +12,8 @@ public class Version{ public static String type = "unknown"; /** Build modifier, e.g. 'alpha' or 'release' */ public static String modifier = "unknown"; + /** Git commit hash (short) */ + public static String commitHash = "unknown"; /** Number specifying the major version, e.g. '4' */ public static int number; /** Build number, e.g. '43'. set to '-1' for custom builds. */ @@ -29,10 +31,6 @@ public class Version{ /** Allows for mods to detect the presence of the client */ @SuppressWarnings("unused") private static boolean foos; - public static String path(){ - return Version.class.getProtectionDomain().getCodeSource().getLocation().getPath().replace('\\', '/'); - } - public static void init(){ if(!enabled) return; @@ -48,7 +46,9 @@ public static void init(){ type = map.get("type"); number = Integer.parseInt(map.get("number", "4")); modifier = map.get("modifier"); - if(path().contains("/steamapps/common/Mindustry/")) modifier += " steam"; + var path = Version.class.getProtectionDomain().getCodeSource().getLocation().getPath().replace('\\', '/'); + if(path.contains("/steamapps/common/Mindustry/")) modifier += " steam"; + commitHash = map.get("commitHash"); if(map.get("build").contains(".")){ String[] split = map.get("build").split("\\."); try{ @@ -90,6 +90,6 @@ public static String combined(){ if(build == -1){ return "custom build"; } - return (type.equals("official") ? modifier : type) + " build " + build + (revision == 0 ? "" : "." + revision) + "\n(Foo's Client Version: " + (clientVersion.equals("v0.0.0") ? "Dev" : clientVersion) + ")"; + return (type.equals("official") ? modifier : type) + " build " + build + (revision == 0 ? "" : "." + revision) + "\n(Foo's Client Version: " + (clientVersion.equals("v0.0.0") ? "Dev" : clientVersion) + ")" + (commitHash.equals("unknown") ? "" : " (" + commitHash + ")"); } } diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index a2279dd4fe..c5eadddfa5 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -223,15 +223,24 @@ public void quietUnlock(){ } public boolean unlockedNowHost(){ - if(!state.isCampaign()) return true; + return !state.isCampaign() || unlockedHost(); + } + + /** @return in multiplayer, whether this is unlocked for the host player, otherwise, whether it is unlocked for the local player (same as unlocked()) */ + public boolean unlockedHost(){ return net != null && net.client() ? - alwaysUnlocked || state.rules.researched.contains(name) : + alwaysUnlocked || state.rules.researched.contains(this) : unlocked || alwaysUnlocked; } + /** @return whether this content is unlocked, or the player is in a custom (non-campaign) game. */ + public boolean unlockedNow(){ + return unlocked() || !state.isCampaign(); + } + public boolean unlocked(){ return net != null && net.client() ? - alwaysUnlocked || unlocked || state.rules.researched.contains(name) : + alwaysUnlocked || unlocked || state.rules.researched.contains(this) : unlocked || alwaysUnlocked; } @@ -243,11 +252,6 @@ public void clearUnlock(){ } } - /** @return whether this content is unlocked, or the player is in a custom (non-campaign) game. */ - public boolean unlockedNow(){ - return unlocked() || !state.isCampaign(); - } - public boolean locked(){ return !unlocked(); } diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index db41340364..add82f3606 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -867,7 +867,7 @@ public void createNet(Team team, float x, float y, float angle, float damage, fl @Remote(called = Loc.server, unreliable = true) public static void createBullet(BulletType type, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl){ if (type == null) return; - if (Core.settings.getBool("nyduspadpatch") && Server.nydus.b() && world.tileWorld(x, y) != null && world.tileWorld(x, y).block() == Blocks.launchPad) return; // Nydus is annoying + if (Server.nydus.b() && Core.settings.getBool("nyduspadpatch") && world.tileWorld(x, y) != null && world.tileWorld(x, y).block() == Blocks.launchPad) return; // Nydus is annoying else if ((damage < .1F || team == player.team()) && Server.io.b() && Groups.player.contains(p -> p.admin && p.within(x, y, tilesize * 10))) return; // .io admin abuse is annoying type.create(null, team, x, y, angle, damage, velocityScl, lifetimeScl, null); } diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index f2ce3032e9..d8cb9b0eec 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -132,7 +132,7 @@ boolean tryDropPayload(Payload payload){ } //drop off payload on an acceptor if possible - if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){ + if(on != null && on.build != null && on.build.team == team && on.build.acceptPayload(on.build, payload)){ Fx.unitDrop.at(on.build); on.build.handlePayload(on.build, payload); return true; diff --git a/core/src/mindustry/entities/units/BuildPlan.java b/core/src/mindustry/entities/units/BuildPlan.java index b8f5c67f9d..5d9f6c7d1c 100644 --- a/core/src/mindustry/entities/units/BuildPlan.java +++ b/core/src/mindustry/entities/units/BuildPlan.java @@ -192,30 +192,30 @@ public float drawy(){ return y*tilesize + (block == null ? 0 : block.offset); } - public @Nullable Tile tile(){ - return world.tile(x, y); - } - - public @Nullable Building build(){ - return world.build(x, y); - } - - public boolean isDone(){ // FINISHME: Surely most of this is redundant for no reason... + public boolean isDone(){ Tile tile = world.tile(x, y); if(tile == null) return true; Block tblock = tile.block(); if(breaking){ - return tblock == Blocks.air || tblock == tile.floor(); // covering all the bases + return tblock == Blocks.air || tblock == tile.floor(); }else{ return tblock == block && (tile.build == null || tile.build.rotation == rotation); } } + public @Nullable Tile tile(){ + return world.tile(x, y); + } + + public @Nullable Building build(){ + return world.build(x, y); + } + public boolean isVisible(){ final Rect r1 = Tmp.r1; return !worldContext || cameraBounds.overlaps(block.bounds(x, y, r1)) || - (block instanceof ItemBridge b && Tmp.r2.set(cameraBounds).grow(2 * b.range * tilesizeF).overlaps(r1)) || - (block instanceof PowerNode p && Tmp.r2.set(cameraBounds).grow(2 * tilesize * p.laserRange).overlaps(r1)); + (block instanceof ItemBridge b && Tmp.r2.set(cameraBounds).grow(2 * b.range * tilesizeF).overlaps(r1)) || + (block instanceof PowerNode p && Tmp.r2.set(cameraBounds).grow(2 * tilesize * p.laserRange).overlaps(r1)); } public static void getVisiblePlans(Eachable plans, Seq output){ @@ -232,7 +232,7 @@ public void hitbox(Rect out){ out.setCentered(x * tilesize, y * tilesize, tilesize); } } - + public Rect bounds(Rect rect){ return block.bounds(x, y, rect); } diff --git a/core/src/mindustry/entities/units/UnitController.java b/core/src/mindustry/entities/units/UnitController.java index b77a857a2f..240728b2cc 100644 --- a/core/src/mindustry/entities/units/UnitController.java +++ b/core/src/mindustry/entities/units/UnitController.java @@ -1,10 +1,11 @@ package mindustry.entities.units; +import arc.util.*; import mindustry.gen.*; public interface UnitController{ void unit(Unit unit); - Unit unit(); + @Nullable Unit unit(); default void hit(Bullet bullet){ diff --git a/core/src/mindustry/game/Objectives.java b/core/src/mindustry/game/Objectives.java index f50c8c0ca1..fb947c4bd0 100644 --- a/core/src/mindustry/game/Objectives.java +++ b/core/src/mindustry/game/Objectives.java @@ -19,14 +19,14 @@ protected Research(){} @Override public boolean complete(){ - return content.unlocked(); + return content.unlockedHost(); } @Override public String display(){ return Core.bundle.format("requirement.research", //TODO broken for multi tech nodes. - (content.techNode == null || content.techNode.parent == null || content.techNode.parent.content.unlocked()) ? + (content.techNode == null || content.techNode.parent == null || content.techNode.parent.content.unlockedHost()) ? (content.emoji() + " " + content.localizedName) : "???"); } } @@ -42,13 +42,13 @@ protected Produce(){} @Override public boolean complete(){ - return content.unlocked(); + return content.unlockedHost(); } @Override public String display(){ return Core.bundle.format("requirement.produce", - content.unlocked() ? (content.emoji() + " " + content.localizedName) : "???"); + content.unlockedHost() ? (content.emoji() + " " + content.localizedName) : "???"); } } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 37632948b0..f2b940154c 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -7,6 +7,7 @@ import arc.util.serialization.Json.*; import mindustry.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.graphics.g3d.*; import mindustry.io.*; import mindustry.type.*; @@ -160,7 +161,7 @@ public class Rules{ /** Reveals blocks normally hidden by build visibility. */ public ObjectSet revealedBlocks = new ObjectSet<>(); /** Unlocked content names. Only used in multiplayer when the campaign is enabled. */ - public ObjectSet researched = new ObjectSet<>(); + public ObjectSet researched = new ObjectSet<>(); /** In-map objective executor. */ public MapObjectives objectives = new MapObjectives(); /** Flags set by objectives. Used in world processors. */ diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 78573032eb..ae4c7c2e7a 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -686,7 +686,7 @@ public static Schematic rotate(Schematic input, int times){ private static Schematic rotated(Schematic input, boolean counter){ int direction = Mathf.sign(counter); - Schematic schem = input == tmpSchem ? tmpSchem2 : tmpSchem2; + Schematic schem = input == tmpSchem ? tmpSchem2 : tmpSchem; schem.width = input.width; schem.height = input.height; Pools.freeAll(schem.tiles); diff --git a/core/src/mindustry/input/Binding.java b/core/src/mindustry/input/Binding.java index f794210a43..5e2e7f10bf 100644 --- a/core/src/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -101,7 +101,7 @@ public enum Binding implements KeyBind{ chat_mode(KeyCode.tab), console(KeyCode.f8), - tile_actions_menu_modifier(KeyCode.altLeft, "client.name"), + tile_actions_menu_modifier(KeyCode.altLeft, "client"), freecam_modifier(KeyCode.altLeft), reset_camera(KeyCode.r), place_waypoint(KeyCode.y), diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index b8d4a94ceb..a2d5229a87 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -445,15 +445,18 @@ else if (selectPlans.isEmpty()){ // SHIFT + Z to view lastSentPos, double tap to if(!detached){ panning = false; } + spectating = null; } if(input.keyDown(Binding.pan)){ panCam = true; panning = true; + spectating = null; } if(Core.settings.getBool("returnonmove") && ((!input.keyDown(Binding.freecam_modifier) && (Math.abs(Core.input.axis(Binding.move_x)) > 0 || Math.abs(Core.input.axis(Binding.move_y)) > 0)) || input.keyDown(Binding.mouse_move))){ panning = false; + spectating = null; } } @@ -487,11 +490,13 @@ else if (selectPlans.isEmpty()){ // SHIFT + Z to view lastSentPos, double tap to } Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(camSpeed)); - }else if(!player.dead() && !panning){ + }else if((!player.dead() || spectating != null) && !panning){ //TODO do not pan Team corePanTeam = state.won ? state.rules.waveTeam : player.team(); Position coreTarget = state.gameOver && !state.rules.pvp && corePanTeam.data().lastCore != null ? corePanTeam.data().lastCore : null; - Core.camera.position.lerpDelta(coreTarget != null ? coreTarget : player, Core.settings.getBool("smoothcamera") ? 0.08f : 1f); + Position panTarget = coreTarget != null ? coreTarget : spectating != null ? spectating : player; + + Core.camera.position.lerpDelta(panTarget, Core.settings.getBool("smoothcamera") ? 0.08f : 1f); } if(panCam){ @@ -1129,6 +1134,15 @@ else if (Core.input.ctrl()) { if(getPlan(splan.x, splan.y, splan.block.size, splan) != null){ player.unit().plans().remove(splan, true); } + + if(input.ctrl()){ + inv.hide(); + config.hideConfig(); + planConfig.showConfig(splan); + }else{ + planConfig.hide(); + } + splan = null; } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 816d759ba5..c694673ee0 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -11,8 +11,8 @@ import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.layout.*; -import arc.struct.Queue; import arc.struct.*; +import arc.struct.Queue; import arc.util.*; import kotlin.Pair; import mindustry.*; @@ -108,6 +108,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public BuildPlan bplan = new BuildPlan(); public Seq linePlans = new Seq<>(); public Seq selectPlans = new Seq<>(BuildPlan.class); + public Queue lastPlans = new Queue<>(); + public @Nullable Unit lastUnit; + public @Nullable Unit spectating; + + // Client stuff public boolean conveyorPlaceNormal = false; /** Last logic virus warning block FINISHME: All the client stuff here is awful */ @Nullable public LogicBlock.LogicBuild lastVirusWarning, virusBuild; @@ -152,9 +157,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ // These 3 vars and init block are used for retrying configs that the server has denied due to exceeding the ratelimit private static boolean fromServer; private static Queue> prevs = new Queue<>(32); // This is by no means the best way to do this, but I'm too lazy to write a proper LRU cache - private static IntIntMap queued = new IntIntMap(); + private static IntIntMap queued = new IntIntMap(); // Stores the last "config id" for a tile, used to prevent multiple attempts to retry configs. - static { + static { // Intercept TileConfigCallPacket and set fromServer to true before handling it normally. net.handleClient(TileConfigCallPacket.class, packet -> { fromServer = true; packet.handleClient(); @@ -182,6 +187,9 @@ public InputHandler(){ logicCutscene = false; itemDepositCooldown = 0f; Arrays.fill(controlGroups, null); + lastUnit = null; + lastPlans.clear(); + queued.clear(51); }); } @@ -866,7 +874,16 @@ public boolean isUsingSchematic(){ return !selectPlans.isEmpty(); } + public void spectate(Unit unit){ + spectating = unit; + camera.position.set(unit); + } + public void update(){ + if(spectating != null && (!spectating.isValid() || spectating.team != player.team())){ + spectating = null; + } + if(logicCutscene && !renderer.isCutscene() && Core.settings.getBool("showcutscenes", true)){ Core.camera.position.lerpDelta(logicCamPan, logicCamSpeed); }else{ @@ -881,6 +898,21 @@ public void update(){ commandRect = false; } + if(player.isBuilder()){ + if(player.unit() != lastUnit && player.unit().plans.size <= 1){ + player.unit().plans.ensureCapacity(lastPlans.size); + for(var plan : lastPlans){ + player.unit().plans.addLast(plan); + } + } + lastPlans.clear(); + for(var plan : player.unit().plans){ + lastPlans.addLast(plan); + } + } + + lastUnit = player.unit(); + playerPlanTree.clear(); if(!player.dead()){ player.unit().plans.each(playerPlanTree::insert); @@ -1914,7 +1946,6 @@ boolean checkConfigTap(){ /** Handles tile tap events that are not platform specific. */ boolean tileTapped(@Nullable Building build){ - // Should hide plan config regardless of what was tapped planConfig.hide(); if(build == null){ inv.hide(); @@ -2028,7 +2059,7 @@ boolean tryRepairDerelict(Tile selected){ } boolean canRepairDerelict(Tile tile){ - return tile != null && tile.build != null && !state.rules.editor && player.team() != Team.derelict && tile.build.team == Team.derelict && tile.build.block.unlockedNow() && + return tile != null && tile.build != null && !state.rules.editor && player.team() != Team.derelict && tile.build.team == Team.derelict && tile.build.block.unlockedNowHost() && Build.validPlace(tile.block(), player.team(), tile.build.tileX(), tile.build.tileY(), tile.build.rotation); } diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index fb9e24eac5..24a74521fd 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -88,9 +88,11 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Check and assign targets for a specific position. */ void checkTargets(float x, float y){ + if(player.dead()) return; + Unit unit = Units.closestEnemy(player.team(), x, y, 20f, u -> !u.dead); - if(unit != null && !player.dead() && player.unit().type.canAttack){ + if(unit != null && player.unit().type.canAttack){ player.unit().mineTile = null; target = unit; }else{ @@ -777,7 +779,11 @@ public void update(){ if(!Core.settings.getBool("keyboard") && !locked && !scene.hasKeyboard()){ //move camera around float camSpeed = 6f; - Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta * camSpeed)); + Vec2 delta = Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta * camSpeed); + Core.camera.position.add(delta); + if(!delta.isZero()){ + spectating = null; + } } if(Core.settings.getBool("keyboard")){ @@ -938,6 +944,7 @@ public boolean pan(float x, float y, float deltaX, float deltaY){ //pan player Core.camera.position.x -= deltaX; Core.camera.position.y -= deltaY; + spectating = null; } camera.position.clamp(-camera.width/4f, -camera.height/4f, world.unitWidth() + camera.width/4f, world.unitHeight() + camera.height/4f); diff --git a/core/src/mindustry/input/Placement.java b/core/src/mindustry/input/Placement.java index 04d579a41d..8b2209ebe8 100644 --- a/core/src/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -143,7 +143,7 @@ public static void calculateBridges(Seq plans, ItemBridge bridge, Boo Boolf placeable = plan -> (plan.placeable(player.team()) || (plan.tile() != null && plan.tile().block() == plan.block)) && //don't count the same block as inaccessible - !(plan.build() != null && plan.build().rotation != plan.rotation && avoid.get(plan.tile().block())); + !(plan != plans.first() && plan.build() != null && plan.build().rotation != plan.rotation && avoid.get(plan.tile().block())); var result = plans1.clear(); var rotated = plans.first().tile() != null && plans.first().tile().absoluteRelativeTo(plans.peek().x, plans.peek().y) == Mathf.mod(plans.first().rotation + 2, 4); @@ -218,7 +218,7 @@ public static void calculateBridges(Seq plans, DirectionBridge bridge Boolf placeable = plan -> (plan.placeable(player.team()) || (plan.tile() != null && plan.tile().block() == plan.block)) && //don't count the same block as inaccessible - !(plan.build() != null && plan.build().rotation != plan.rotation && avoid.get(plan.tile().block())); + !(plan != plans.first() && plan.build() != null && plan.build().rotation != plan.rotation && avoid.get(plan.tile().block())); var result = plans1.clear(); diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index e301f5b499..34957d1443 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -261,15 +261,8 @@ public void write(Json json, UnlockableContent object, Class knownType){ public UnlockableContent read(Json json, JsonValue jsonData, Class type){ if(jsonData.isNull()) return null; String str = jsonData.asString(); - Item item = Vars.content.item(str); - Liquid liquid = Vars.content.liquid(str); - Block block = Vars.content.block(str); - UnitType unit = Vars.content.unit(str); - return - item != null ? item : - liquid != null ? liquid : - block != null ? block : - unit; + var map = Vars.content.byName(str); + return map instanceof UnlockableContent u ? u : null; } }); diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index c86931cbb6..f47372d52e 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -42,7 +42,12 @@ public class ArcNetProvider implements NetProvider{ public ArcNetProvider(){ ArcNet.errorHandler = e -> { if(Log.level == LogLevel.debug){ - Log.debug(Strings.getStackTrace(e)); + var finalCause = Strings.getFinalCause(e); + + //"connection is closed" is a pointless annoying error that should not be logged + if(!"Connection is closed.".equals(finalCause.getMessage())){ + Log.debug(Strings.getStackTrace(e)); + } } }; @@ -361,10 +366,12 @@ protected Object next(byte[] bytes){ @Override public void send(Object object, boolean reliable){ try{ - if(reliable){ - connection.sendTCP(object); - }else{ - connection.sendUDP(object); + if(connection.isConnected()){ + if(reliable){ + connection.sendTCP(object); + }else{ + connection.sendUDP(object); + } } }catch(Exception e){ Log.err(e); diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 48599c6b96..3dac108090 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -30,7 +30,7 @@ public static void writeWorld(Player player, OutputStream os){ for(ContentType type : ContentType.all){ for(Content c : content.getBy(type)){ if(c instanceof UnlockableContent u && u.unlocked() && u.techNode != null){ - state.rules.researched.add(u.name); + state.rules.researched.add(u); } } } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 9d8eab2503..fb10820d24 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -185,7 +185,7 @@ public String iconChar(){ } public boolean isCaptured(){ - if(isBeingPlayed()) return !info.waves && !info.attack; + if(isBeingPlayed()) return !state.rules.waves && !state.rules.attackMode; return save != null && !info.waves && !info.attack; } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 9af6b35b51..e28ae79139 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -302,12 +302,14 @@ public class UnitType extends UnlockableContent implements Senseable{ /** Flags to target based on priority. Null indicates that the closest target should be found. The closest enemy core is used as a fallback. */ public BlockFlag[] targetFlags = {null}; + /** A value of false is used to hide command changing UI in unit factories. */ + public boolean allowChangeCommands = true; /** Commands available to this unit through RTS controls. An empty array means commands will be assigned based on unit capabilities in init(). */ - public UnitCommand[] commands = {}; + public Seq commands = new Seq<>(); /** Command to assign to this unit upon creation. Null indicates the first command in the array. */ public @Nullable UnitCommand defaultCommand; /** Stances this unit can have. An empty array means stances will be assigned based on unit capabilities in init(). */ - public UnitStance[] stances = {}; + public Seq stances = new Seq<>(); /** color for outline generated around sprites */ public Color outlineColor = Pal.darkerMetal; @@ -839,49 +841,49 @@ public void init(){ canAttack = weapons.contains(w -> !w.noAttack); //assign default commands. - if(commands.length == 0){ - Seq cmds = new Seq<>(UnitCommand.class); + if(commands.size == 0){ - cmds.add(UnitCommand.moveCommand, UnitCommand.enterPayloadCommand); + commands.add(UnitCommand.moveCommand, UnitCommand.enterPayloadCommand); if(canBoost){ - cmds.add(UnitCommand.boostCommand); + commands.add(UnitCommand.boostCommand); if(buildSpeed > 0f){ - cmds.add(UnitCommand.rebuildCommand, UnitCommand.assistCommand); + commands.add(UnitCommand.rebuildCommand, UnitCommand.assistCommand); } } //healing, mining and building is only supported for flying units; pathfinding to ambiguously reachable locations is hard. if(flying){ if(canHeal){ - cmds.add(UnitCommand.repairCommand); + commands.add(UnitCommand.repairCommand); } if(buildSpeed > 0){ - cmds.add(UnitCommand.rebuildCommand, UnitCommand.assistCommand); + commands.add(UnitCommand.rebuildCommand, UnitCommand.assistCommand); } if(mineTier > 0){ - cmds.add(UnitCommand.mineCommand); + commands.add(UnitCommand.mineCommand); } if(example instanceof Payloadc){ - cmds.addAll(UnitCommand.loadUnitsCommand, UnitCommand.loadBlocksCommand, UnitCommand.unloadPayloadCommand, UnitCommand.loopPayloadCommand); + commands.addAll(UnitCommand.loadUnitsCommand, UnitCommand.loadBlocksCommand, UnitCommand.unloadPayloadCommand, UnitCommand.loopPayloadCommand); } } + } - commands = cmds.toArray(); + if(defaultCommand == null && commands.size > 0){ + defaultCommand = commands.first(); } - if(stances.length == 0){ + if(stances.size == 0){ if(canAttack){ - Seq seq = Seq.with(UnitStance.stop, UnitStance.shoot, UnitStance.holdFire, UnitStance.pursueTarget, UnitStance.patrol); + stances.addAll(UnitStance.stop, UnitStance.shoot, UnitStance.holdFire, UnitStance.pursueTarget, UnitStance.patrol); if(!flying){ - seq.add(UnitStance.ram); + stances.add(UnitStance.ram); } - stances = seq.toArray(UnitStance.class); }else{ - stances = new UnitStance[]{UnitStance.stop, UnitStance.patrol}; + stances.addAll(UnitStance.stop, UnitStance.patrol); } } diff --git a/core/src/mindustry/ui/ItemsDisplay.java b/core/src/mindustry/ui/ItemsDisplay.java index f7e62ded29..dc83f5e54d 100644 --- a/core/src/mindustry/ui/ItemsDisplay.java +++ b/core/src/mindustry/ui/ItemsDisplay.java @@ -30,6 +30,8 @@ public void rebuild(ItemSeq items, @Nullable boolean[] shine){ top().left(); margin(0); + if(items == null) return; + table(Tex.button, c -> { c.margin(10).marginLeft(12).marginTop(15f); c.marginRight(12f); diff --git a/core/src/mindustry/ui/dialogs/AboutDialog.java b/core/src/mindustry/ui/dialogs/AboutDialog.java index fe755d8879..24a49ced6c 100644 --- a/core/src/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/mindustry/ui/dialogs/AboutDialog.java @@ -41,7 +41,7 @@ void setup(){ ScrollPane pane = new ScrollPane(in); for(LinkEntry link : Links.getLinks()){ - if((ios || OS.isMac || steam) && bannedItems.contains(link.name)){ + if((ios || steam) && bannedItems.contains(link.name)){ continue; } @@ -50,7 +50,7 @@ void setup(){ table.table(img -> { img.image().height(h - 5).width(40f).color(link.color); img.row(); - img.image().height(5).width(40f).color(link.color.cpy().mul(0.8f, 0.8f, 0.8f, 1f)); + img.image().height(5).width(40f).color(link.color.cpy().mul(0.6f, 0.6f, 0.8f, 1f)); }).expandY(); table.table(i -> { @@ -64,7 +64,7 @@ void setup(){ inset.labelWrap(link.description).width(w - 100f - h).color(Color.lightGray).growX(); }).padLeft(8); - table.button(Icon.link, Styles.clearNoneTogglei, () -> { + table.button(Icon.link, Styles.clearNonei, () -> { if(link.name.equals("wiki")) Events.fire(Trigger.openWiki); if(!Core.app.openURI(link.link)){ diff --git a/core/src/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java index 6abba5784e..5f8f143498 100644 --- a/core/src/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -9,7 +9,7 @@ import mindustry.gen.*; import mindustry.ui.*; -import java.io.*; +import java.util.*; import static mindustry.Vars.*; @@ -90,8 +90,8 @@ public void runHost(){ } - }catch(IOException e){ - ui.showException("@server.error", e); + }catch(Exception e){ + ui.showException(e.getMessage() != null && e.getMessage().toLowerCase(Locale.ROOT).contains("address already in use") ? "@server.error.addressinuse" : "@server.error", e); } ui.loadfrag.hide(); hide(); diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 6eb5ebdf8c..9c2f7772ee 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -47,7 +47,7 @@ public class JoinDialog extends BaseDialog{ @Nullable public Host lastHost; int lastPort, lastColumns = -1; Task ping; - private boolean beList = Version.type.equals("bleeding-edge"), fetchingCommunityServersErrored; + private boolean beList = Version.type.equals("bleeding-edge") || Vars.forceBeServers, fetchingCommunityServersErrored; public boolean hasFetchedCommunity; public Runnable onCommunityFetch; // This is jank, I know. @@ -77,7 +77,7 @@ public JoinDialog(){ buttons.button("", () -> { beList ^= true; defaultServers.clear(); - loadCommunityServers(beList ? serverJsonBeURL : serverJsonURL, 8, true); + fetchServers(beList ? serverJsonBeURLs : serverJsonURLs, 0, true); }).update(b -> b.setText("Use " + (beList ? "v7" : "BE") + " server list")).wrapLabel(false).height(64); addCloseButton(mobile ? 190f : 210f); @@ -681,17 +681,27 @@ private void loadServers(){ Core.settings.remove("server-list"); } - loadCommunityServers(beList || Vars.forceBeServers ? serverJsonBeURL : serverJsonURL, 5, false); + var urls = beList ? serverJsonBeURLs : serverJsonURLs; + + fetchServers(urls, 0, false); } - private void loadCommunityServers(String url, int attempts, boolean refreshCommunity) { - Log.info("Fetching community servers at @", url); - Http.get(url) + private void fetchServers(String[] urls, int index, boolean refreshCommunity){ + if(index >= urls.length) return; + Log.debug("Fetching community servers at @", urls[index]); + + //get servers + Http.get(urls[index]) .error(t -> { - Log.debug("Failed to fetch community servers, retrying"); - Log.err(t.toString()); - if(attempts > 1) Timer.schedule(() -> loadCommunityServers(url, attempts - 1, refreshCommunity), 0.5f); // Sometimes this just randomly times out the first time - else fetchingCommunityServersErrored = true; + if(index < urls.length - 1){ + Log.debug("Failed to fetch community servers from @, trying next url.", urls[index]); + //attempt fetching from the next URL upon failure + Timer.schedule(() -> fetchServers(urls, index + 1, refreshCommunity), 0.5f); + }else{ + Log.err("Failed to fetch community servers", t); + fetchingCommunityServersErrored = true; + Core.app.post(this::refreshCommunity); // Refresh community list to show error + } }) .submit(result -> { Jval val = Jval.read(result.getResultAsString()); diff --git a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java index 1b309e05b6..082b8c134e 100644 --- a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java @@ -89,7 +89,7 @@ public void show(CoreBlock core, Sector sector, Sector destination, Runnable con total.clear(); selected.requirements().each(total::add); universe.getLaunchResources().each(total::add); - valid = sitems.has(total); + valid = sitems.has(total) || PlanetDialog.debugSelect; }; Cons rebuild = table -> { diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 8672345f6e..5dd460420b 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -141,40 +141,56 @@ void modError(Throwable error){ ui.showErrorMessage("@feature.unsupported"); }else if(error instanceof HttpStatusException st){ ui.showErrorMessage(Core.bundle.format("connectfail", Strings.capitalize(st.status.toString().toLowerCase()))); + }else if(error.getMessage() != null && error.getMessage().toLowerCase(Locale.ROOT).contains("writable dex")){ + ui.showException("@error.moddex", error); }else{ ui.showException(error); } } - void getModList(Cons> listener){ - if(modList == null){ - Http.get("https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", response -> { - String strResult = response.getResultAsString(); + void getModList(int index, Cons> listener){ + if(index >= modJsonURLs.length) return; - Core.app.post(() -> { - try{ - modList = JsonIO.json.fromJson(Seq.class, ModListing.class, strResult); + if(modList != null){ + listener.get(modList); + return; + } - var d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - Func parser = text -> { - try{ - return d.parse(text); - }catch(Exception e){ - return new Date(); - } - }; + Http.get(modJsonURLs[index], response -> { + String strResult = response.getResultAsString(); + + Core.app.post(() -> { + try{ + modList = JsonIO.json.fromJson(Seq.class, ModListing.class, strResult); + + var d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + Func parser = text -> { + try{ + return d.parse(text); + }catch(Exception e){ + return new Date(); + } + }; - modList.sortComparing(m -> parser.get(m.lastUpdated)).reverse(); - listener.get(modList); - }catch(Exception e){ - e.printStackTrace(); - ui.showException(e); + modList.sortComparing(m -> parser.get(m.lastUpdated)).reverse(); + listener.get(modList); + }catch(Exception e){ + Log.err(e); + ui.showException(e); + } + }); + }, error -> { + if(index < modJsonURLs.length - 1){ + getModList(index + 1, listener); + }else{ + Core.app.post(() -> { + modError(error); + if(browser != null){ + browser.hide(); } }); - }, error -> Core.app.post(() -> modError(error))); - }else{ - listener.get(modList); - } + } + }); } void setup(){ @@ -209,7 +225,7 @@ void setup(){ mods.importMod(file); setup(); }catch(Exception e){ - ui.showException(e); + ui.showException(e.getMessage() != null && e.getMessage().toLowerCase(Locale.ROOT).contains("writable dex") ? "@error.moddex" : "", e); Log.err(e); } }, "zip", "jar"); @@ -507,7 +523,7 @@ private void rebuildBrowser(){ int cols = (int)Math.max(Core.graphics.getWidth() / Scl.scl(480), 1); - getModList(rlistings -> { + getModList(0, rlistings -> { browserTable.clear(); int i = 0; diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index 21d067c011..34dd578ccc 100644 --- a/core/src/mindustry/ui/dialogs/ResearchDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -48,10 +48,30 @@ public class ResearchDialog extends BaseDialog{ public ItemSeq items; private boolean showTechSelect; + private boolean needsRebuild; public ResearchDialog(){ super(""); + Events.on(ResetEvent.class, e -> { + hide(); + }); + + Events.on(UnlockEvent.class, e -> { + if(net.client() && !needsRebuild){ + needsRebuild = true; + Core.app.post(() -> { + needsRebuild = false; + + checkNodes(root); + view.hoverNode = null; + treeLayout(); + view.rebuild(); + Core.scene.act(); + }); + } + }); + titleTable.remove(); titleTable.clear(); titleTable.top(); @@ -68,7 +88,7 @@ public ResearchDialog(){ t.table(Tex.button, in -> { in.defaults().width(300f).height(60f); for(TechNode node : TechTree.roots){ - if(node.requiresUnlock && !node.content.unlocked() && node != getPrefRoot()) continue; + if(node.requiresUnlock && !node.content.unlockedHost() && node != getPrefRoot()) continue; //TODO toggle in.button(node.localizedName(), node.icon(), Styles.flatTogglet, iconMed, () -> { @@ -85,10 +105,11 @@ public ResearchDialog(){ addCloseButton(); }}.show(); - }).visible(() -> showTechSelect = TechTree.roots.count(node -> !(node.requiresUnlock && !node.content.unlocked())) > 1).minWidth(300f); + }).visible(() -> showTechSelect = TechTree.roots.count(node -> !(node.requiresUnlock && !node.content.unlockedHost())) > 1).minWidth(300f); margin(0f).marginBottom(8); cont.stack(titleTable, view = new View(), itemDisplay = new ItemsDisplay(), ResearchAssistant.INSTANCE).grow(); + itemDisplay.visible(() -> !net.client()); titleTable.toFront(); @@ -179,15 +200,6 @@ public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){ }); } - @Override - public Dialog show(){ - if(net.client()){ - ui.showInfo("@research.multiplayer"); - return this; - } - return show(Core.scene); - } - void checkMargin(){ if(Core.graphics.isPortrait() && showTechSelect){ itemDisplay.marginTop(60f); @@ -274,8 +286,9 @@ public void switchTree(TechNode node){ lastNode = node; view.rebuildAll(); + checkNodes(root); rebuildItems(); - ResearchAssistant.INSTANCE.drawQueue(); + ResearchAssistant.INSTANCE.switchTree(); } public void rebuildTree(TechNode node){ @@ -288,7 +301,6 @@ public void rebuildTree(TechNode node){ view.infoTable.remove(); view.infoTable.clear(); - checkNodes(root); treeLayout(); } @@ -364,11 +376,12 @@ public void checkNodes(TechTreeNode node){ } boolean selectable(TechNode node){ - return node.content.unlocked() || !node.objectives.contains(i -> !i.complete()); + //there's a desync here as far as sectors go, since the client doesn't know about that, but I'm not too concerned + return node.content.unlockedHost() || !node.objectives.contains(i -> !i.complete()); } boolean locked(TechNode node){ - return node.content.locked(); + return !node.content.unlockedHost(); } class LayoutNode extends TreeNode{ @@ -421,32 +434,34 @@ public void rebuildAll(){ button.resizeImage(32f); button.getImage().setScaling(Scaling.fit); button.visible(() -> node.visible); - button.clicked(() -> { - if(moved) return; - - if(mobile){ - hoverNode = button; - rebuild(); - float right = infoTable.getRight(); - if(right > Core.graphics.getWidth()){ - float moveBy = right - Core.graphics.getWidth(); - addAction(new RelativeTemporalAction(){ - { - setDuration(0.1f); - setInterpolation(Interp.fade); - } + if(!net.client()){ + button.clicked(() -> { + if(moved) return; + + if(mobile){ + hoverNode = button; + rebuild(); + float right = infoTable.getRight(); + if(right > Core.graphics.getWidth()){ + float moveBy = right - Core.graphics.getWidth(); + addAction(new RelativeTemporalAction(){ + { + setDuration(0.1f); + setInterpolation(Interp.fade); + } - @Override - protected void updateRelative(float percentDelta){ - panX -= moveBy * percentDelta; - } - }); + @Override + protected void updateRelative(float percentDelta){ + panX -= moveBy * percentDelta; + } + }); + } + }else if(locked(node.node)){ + if (Core.input.shift()) ResearchAssistant.INSTANCE.queue(node, true); + else if (canSpend(node.node)) spend(node.node); } - }else if(locked(node.node)){ - if (Core.input.shift()) ResearchAssistant.INSTANCE.queue(node); - else if (canSpend(node.node)) spend(node.node); - } - }); + }); + } button.hovered(() -> { if(!mobile && hoverNode != button && node.visible){ hoverNode = button; @@ -463,9 +478,10 @@ protected void updateRelative(float percentDelta){ button.userObject = node.node; button.setSize(nodeSize); button.update(() -> { + button.setDisabled(net.client() && !mobile); float offset = (Core.graphics.getHeight() % 2) / 2f; button.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f + offset, Align.center); - button.getStyle().up = !locked(node.node) ? Tex.buttonOver : !selectable(node.node) || !canSpend(node.node) ? Tex.buttonRed : Tex.button; + button.getStyle().up = !locked(node.node) ? Tex.buttonOver : !selectable(node.node) || (!canSpend(node.node) && !net.client()) ? Tex.buttonRed : Tex.button; ((TextureRegionDrawable)button.getStyle().imageUp).setRegion(node.selectable ? node.node.content.uiIcon : Icon.lock.getRegion()); button.getImage().setColor(!locked(node.node) ? Color.white : node.selectable ? Color.gray : Pal.gray); @@ -502,7 +518,7 @@ void clamp(){ } public boolean canSpend(TechNode node){ - if(!selectable(node)) return false; + if(!selectable(node) || net.client()) return false; if(node.requirements.length == 0) return true; @@ -518,6 +534,8 @@ public boolean canSpend(TechNode node){ } public void spend(TechNode node){ + if(net.client()) return; + boolean complete = true; boolean[] shine = new boolean[node.requirements.length]; @@ -616,45 +634,48 @@ public void rebuild(@Nullable boolean[] shine){ desc.left().defaults().left(); desc.add(selectable ? node.content.localizedName : "[accent]???"); desc.row(); - if(locked(node) || debugShowRequirements){ - - desc.table(t -> { - t.left(); - if(selectable){ - - //check if there is any progress, add research progress text - if(Structs.contains(node.finishedRequirements, s -> s.amount > 0)){ - float sum = 0f, used = 0f; - boolean shiny = false; + if(locked(node) || (debugShowRequirements && !net.client())){ + + if(net.client()){ + desc.add("@locked").color(Pal.remove); + }else{ + desc.table(t -> { + t.left(); + if(selectable){ + + //check if there is any progress, add research progress text + if(Structs.contains(node.finishedRequirements, s -> s.amount > 0)){ + float sum = 0f, used = 0f; + boolean shiny = false; + + for(int i = 0; i < node.requirements.length; i++){ + sum += node.requirements[i].item.cost * node.requirements[i].amount; + used += node.finishedRequirements[i].item.cost * node.finishedRequirements[i].amount; + if(shine != null) shiny |= shine[i]; + } - for(int i = 0; i < node.requirements.length; i++){ - sum += node.requirements[i].item.cost * node.requirements[i].amount; - used += node.finishedRequirements[i].item.cost * node.finishedRequirements[i].amount; - if(shine != null) shiny |= shine[i]; - } + Label label = t.add(Core.bundle.format("research.progress", Math.min((int)(used / sum * 100), 99))).left().get(); - Label label = t.add(Core.bundle.format("research.progress", Math.min((int)(used / sum * 100), 99))).left().get(); + if(shiny){ + label.setColor(Pal.accent); + label.actions(Actions.color(Color.lightGray, 0.75f, Interp.fade)); + }else{ + label.setColor(Color.lightGray); + } - if(shiny){ - label.setColor(Pal.accent); - label.actions(Actions.color(Color.lightGray, 0.75f, Interp.fade)); - }else{ - label.setColor(Color.lightGray); + t.row(); } - t.row(); - } - - for(int i = 0; i < node.requirements.length; i++){ - ItemStack req = node.requirements[i]; - ItemStack completed = node.finishedRequirements[i]; + for(int i = 0; i < node.requirements.length; i++){ + ItemStack req = node.requirements[i]; + ItemStack completed = node.finishedRequirements[i]; - //skip finished stacks - if(req.amount <= completed.amount && !debugShowRequirements) continue; - boolean shiny = shine != null && shine[i]; + //skip finished stacks + if(req.amount <= completed.amount && !debugShowRequirements) continue; + boolean shiny = shine != null && shine[i]; - t.table(list -> { - int reqAmount = debugShowRequirements ? req.amount : req.amount - completed.amount; + t.table(list -> { + int reqAmount = debugShowRequirements ? req.amount : req.amount - completed.amount; list.left(); list.image(req.item.uiIcon).size(8 * 3).padRight(3); @@ -664,43 +685,44 @@ public void rebuild(@Nullable boolean[] shine){ + UI.formatAmount(reqAmount, true)).get(); float fraction = (float)items.get(req.item) / reqAmount; - Color targetColor = + Color targetColor = fraction > 1.8 ? Color.green : fraction >= 1 ? Color.lime : fraction >= 0.5 ? Color.salmon : - Color.red; + Color.scarlet; - if(shiny){ - label.setColor(Pal.accent); - label.actions(Actions.color(targetColor, 0.75f, Interp.fade)); - }else{ - label.setColor(targetColor); - } + if(shiny){ + label.setColor(Pal.accent); + label.actions(Actions.color(targetColor, 0.75f, Interp.fade)); + }else{ + label.setColor(targetColor); + } - }).fillX().left(); + }).fillX().left(); + t.row(); + } + }else if(node.objectives.size > 0){ + t.table(r -> { + r.add("@complete").colspan(2).left(); + r.row(); + for(Objective o : node.objectives){ + if(o.complete()) continue; + + r.add("> " + o.display()).color(Color.lightGray).left(); + r.image(o.complete() ? Icon.ok : Icon.cancel, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3); + r.row(); + } + }); t.row(); } - }else if(node.objectives.size > 0){ - t.table(r -> { - r.add("@complete").colspan(2).left(); - r.row(); - for(Objective o : node.objectives){ - if(o.complete()) continue; - - r.add("> " + o.display()).color(Color.lightGray).left(); - r.image(o.complete() ? Icon.ok : Icon.cancel, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3); - r.row(); - } - }); - t.row(); - } - }); + }); + } }else{ desc.add("@completed"); } }).pad(9); - if(mobile && locked(node)){ + if(mobile && locked(node) && !net.client()){ b.row(); b.button("@research", Icon.ok, new TextButtonStyle(){{ disabled = Tex.button; diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 346d8db789..679d73e050 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -569,7 +569,7 @@ public void build(Group parent){ firstCommand = true; }else{ //remove commands that this next unit type doesn't have - commands.removeAll(com -> !Structs.contains(type.commands, com)); + commands.removeAll(com -> !type.commands.contains(com)); } if(!firstStance){ @@ -577,7 +577,7 @@ public void build(Group parent){ firstStance = true; }else{ //remove commands that this next unit type doesn't have - stances.removeAll(st -> !Structs.contains(type.stances, st)); + stances.removeAll(st -> !type.stances.contains(st)); } } } @@ -787,8 +787,8 @@ Block getSelectedBlock(Category cat){ } boolean unlocked(Block block){ - return block.unlockedNow() && block.placeablePlayer && block.environmentBuildable() && - block.supportsEnv(state.rules.env); //TODO this hides env unsupported blocks, not always a good thing + return block.unlockedNowHost() && block.placeablePlayer && block.environmentBuildable() && + block.supportsEnv(state.rules.env); } boolean hasInfoBox(){ diff --git a/core/src/mindustry/ui/fragments/PlanConfigFragment.java b/core/src/mindustry/ui/fragments/PlanConfigFragment.java index e8ee712233..46da387cf7 100644 --- a/core/src/mindustry/ui/fragments/PlanConfigFragment.java +++ b/core/src/mindustry/ui/fragments/PlanConfigFragment.java @@ -11,83 +11,57 @@ import mindustry.ctype.*; import mindustry.entities.units.*; import mindustry.game.*; -import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; -import mindustry.world.blocks.payloads.Constructor; -import mindustry.world.blocks.payloads.PayloadRouter; -import mindustry.world.blocks.payloads.PayloadSource; -import mindustry.world.blocks.units.UnitFactory; import static mindustry.Vars.*; /** * Displays the configuration UI for build plans before they have been placed. */ -public class PlanConfigFragment { +public class PlanConfigFragment{ Table table = new Table(); BuildPlan selected; - public void build(Group parent) { + public void build(Group parent){ table.visible = false; parent.addChild(table); Events.on(EventType.ResetEvent.class, e -> forceHide()); } - public void showConfig(BuildPlan plan) { - if (this.selected == plan) { + public void showConfig(BuildPlan plan){ + if(this.selected == plan || plan.block == null){ hide(); return; } Block block = plan.block; - if (!block.configurable) return; + if(!block.configurable) return; selected = plan; table.clear(); - //Only allows configuring content (items, liquids, units, blocks) - //Each block manages its own configs, but that function requires an existing build - //Try to guess it var options = new Seq(); - if (block.configurations.containsKey(Item.class)) { - options.add(content.items()); - } - if (block.configurations.containsKey(Liquid.class)) { - options.add(content.liquids()); - } - if (block instanceof UnitFactory f) { - options.add(f.plans.map(p -> p.unit).retainAll(u -> !u.isBanned())); - } else if (block.configurations.containsKey(UnitType.class)) { - options.add(content.units().retainAll(u -> !u.isBanned())); - } - if (block instanceof Constructor b) { - options.add(content.blocks().select(b::canProduce)); - } else if (block instanceof PayloadSource b) { - options.add(content.blocks().select(b::canProduce)); - } else if (block instanceof PayloadRouter b) { - options.add(content.blocks().select(b::canSort)); - } else if (block.configurations.containsKey(Block.class)) { - options.add(content.blocks()); - } - if (options.isEmpty()) return; + block.getPlanConfigs(options); + + if(options.isEmpty()) return; ItemSelection.buildTable( - table, options, - () -> selected != null ? (selected.config instanceof UnlockableContent c ? c : null) : null, - content -> { - selected.config = content; - hide(); - }, - block.selectionRows, block.selectionColumns + table, options, + () -> selected != null ? (selected.config instanceof UnlockableContent c ? c : null) : null, + content -> { + selected.config = content; + hide(); + }, + block.selectionRows, block.selectionColumns ); table.pack(); table.setTransform(true); table.visible = true; table.actions(Actions.scaleTo(0f, 1f), Actions.visible(true), - Actions.scaleTo(1f, 1f, 0.07f, Interp.pow3Out)); + Actions.scaleTo(1f, 1f, 0.07f, Interp.pow3Out)); table.update(() -> { table.setOrigin(Align.center); - if (plan.isDone() || !(control.input.selectPlans.contains(plan) || player.unit().plans.contains(plan))) { + if(plan.isDone() || !(control.input.selectPlans.contains(plan) || player.unit().plans.contains(plan))){ this.hide(); return; } @@ -96,13 +70,13 @@ public void showConfig(BuildPlan plan) { }); } - public void forceHide() { + public void forceHide(){ table.visible = false; selected = null; } - public void hide() { + public void hide(){ selected = null; table.actions(Actions.scaleTo(0f, 1f, 0.06f, Interp.pow3Out), Actions.visible(false)); } -} +} \ No newline at end of file diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index e3cd0a769a..deac810cce 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -1440,6 +1440,16 @@ public void flipRotation(BuildPlan req, boolean x){ } } + /** Fills the specified array with the list of configuration options this block has. Only used for plans. */ + public void getPlanConfigs(Seq options){ + if(configurations.containsKey(Item.class)){ + options.add(content.items()); + } + if(configurations.containsKey(Liquid.class)){ + options.add(content.liquids()); + } + } + @Override public double sense(LAccess sensor){ return switch(sensor){ diff --git a/core/src/mindustry/world/blocks/ItemSelection.java b/core/src/mindustry/world/blocks/ItemSelection.java index 24e49706de..6bbe2ba127 100644 --- a/core/src/mindustry/world/blocks/ItemSelection.java +++ b/core/src/mindustry/world/blocks/ItemSelection.java @@ -1,5 +1,6 @@ package mindustry.world.blocks; +import arc.*; import arc.func.*; import arc.math.*; import arc.scene.style.*; @@ -93,6 +94,11 @@ public static void buildTable(@Nullable Block bloc ScrollPane pane = new ScrollPane(cont, Styles.smallPane); pane.setScrollingDisabled(true, false); + pane.exited(() -> { + if(pane.hasScroll()){ + Core.scene.setScrollFocus(null); + } + }); if(block != null){ pane.setScrollYForce(block.selectScroll); diff --git a/core/src/mindustry/world/blocks/defense/BaseShield.java b/core/src/mindustry/world/blocks/defense/BaseShield.java index c8dcc71c4a..544bc2815a 100644 --- a/core/src/mindustry/world/blocks/defense/BaseShield.java +++ b/core/src/mindustry/world/blocks/defense/BaseShield.java @@ -20,6 +20,8 @@ public class BaseShield extends Block{ //TODO game rule? or field? should vary by base. public float radius = 200f; public int sides = 24; + + public @Nullable Color shieldColor; public static Seq baseShields = new Seq<>(2); @@ -131,7 +133,7 @@ public void drawShield(){ Draw.z(Layer.shields); - Draw.color(team.color, Color.white, Mathf.clamp(hit)); + Draw.color(shieldColor == null ? team.color : shieldColor, Color.white, Mathf.clamp(hit)); if(renderer.animateShields){ Fill.poly(x, y, sides, radius); diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index fd2f4751e9..3ffd58e1ef 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -407,13 +407,15 @@ public void updateCode(String str, boolean keep, Cons assemble){ asm.putConst("@links", executor.links.length); asm.putConst("@ipt", instructionsPerTick); + Object oldUnit = null; + if(keep){ + oldUnit = executor.unit.objval; //store any older variables for(LVar var : executor.vars){ - boolean unit = var.name.equals("@unit"); - if(!var.constant || unit){ + if(!var.constant){ LVar dest = asm.getVar(var.name); - if(dest != null && (!dest.constant || unit)){ + if(dest != null && !dest.constant){ dest.isobj = var.isobj; dest.objval = var.objval; dest.numval = var.numval; @@ -425,6 +427,10 @@ public void updateCode(String str, boolean keep, Cons assemble){ //inject any extra variables if(assemble != null){ assemble.get(asm); + + if(oldUnit == null && asm.getVar("@unit") != null && asm.getVar("@unit").objval instanceof Unit u){ + oldUnit = u; + } } asm.getVar("@this").setconst(this); @@ -432,6 +438,8 @@ public void updateCode(String str, boolean keep, Cons assemble){ asm.putConst("@thisy", World.conv(y)); executor.load(asm); + executor.unit.objval = oldUnit; + executor.unit.isobj = true; }catch(Exception e){ //handle malformed code and replace it with nothing executor.load(LAssembler.assemble(code = "", privileged)); diff --git a/core/src/mindustry/world/blocks/payloads/Constructor.java b/core/src/mindustry/world/blocks/payloads/Constructor.java index 695600afdd..2983023068 100644 --- a/core/src/mindustry/world/blocks/payloads/Constructor.java +++ b/core/src/mindustry/world/blocks/payloads/Constructor.java @@ -7,6 +7,7 @@ import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.ctype.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.blocks.storage.*; @@ -44,10 +45,15 @@ public void setStats(){ stats.add(Stat.output, "@x@ ~ @x@", minBlockSize, minBlockSize, maxBlockSize, maxBlockSize); } + @Override + public void getPlanConfigs(Seq options){ + options.add(content.blocks().select(this::canProduce)); + } + public boolean canProduce(Block b){ return b.isVisible() && b.size >= minBlockSize && b.size <= maxBlockSize && !(b instanceof CoreBlock) && !state.rules.isBanned(b) && b.environmentBuildable() && (filter.isEmpty() || filter.contains(b)); } - + public class ConstructorBuild extends BlockProducerBuild{ public @Nullable Block recipe; @@ -65,7 +71,7 @@ public void buildConfiguration(Table table){ public Object config(){ return recipe; } - + @Override public void drawSelect(){ if(recipe != null){ diff --git a/core/src/mindustry/world/blocks/payloads/PayloadRouter.java b/core/src/mindustry/world/blocks/payloads/PayloadRouter.java index 20fbde8091..e2219de3cf 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadRouter.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadRouter.java @@ -4,6 +4,7 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.*; @@ -22,7 +23,7 @@ public class PayloadRouter extends PayloadConveyor{ public boolean invert = false; - + public @Load("@-over") TextureRegion overRegion; public PayloadRouter(String name){ @@ -45,6 +46,12 @@ public void drawPlanRegion(BuildPlan plan, Eachable list){ Draw.rect(overRegion, plan.drawx(), plan.drawy()); } + @Override + public void getPlanConfigs(Seq options){ + options.add(content.blocks().select(this::canSort)); + options.add(content.units().select(this::canSort)); + } + public boolean canSort(Block b){ return b.isVisible() && b.size <= size && !(b instanceof CoreBlock) && !state.rules.isBanned(b) && b.environmentBuildable(); } diff --git a/core/src/mindustry/world/blocks/payloads/PayloadSource.java b/core/src/mindustry/world/blocks/payloads/PayloadSource.java index e3043362fa..0e83d2de92 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadSource.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadSource.java @@ -5,6 +5,7 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.*; @@ -66,6 +67,12 @@ public PayloadSource(String name){ }); } + @Override + public void getPlanConfigs(Seq options){ + options.add(content.blocks().select(this::canProduce)); + options.add(content.units().select(this::canProduce)); + } + @Override public TextureRegion[] icons(){ return new TextureRegion[]{region, outRegion, topRegion}; diff --git a/core/src/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index 05d10090fb..c1cffa7290 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -88,9 +88,15 @@ public void updateTile(){ } } + @Override + public void afterPickedUp(){ + super.afterPickedUp(); + sum = 0f; + } + @Override public float totalProgress(){ - return enabled ? super.totalProgress() : 0f; + return enabled && sum > 0 ? super.totalProgress() : 0f; } @Override diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index cf32cd5c29..e6c052e630 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -177,7 +177,7 @@ public boolean acceptUnitPayload(Unit unit){ public boolean canSetCommand(){ var output = unit(); - return output != null && output.commands.length > 1; + return output != null && output.commands.size > 1 && output.allowChangeCommands; } @Override diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 9c7411c54d..cc74b22658 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -6,11 +6,14 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.style.*; +import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.ai.*; +import mindustry.ctype.*; import mindustry.core.*; import mindustry.entities.*; import mindustry.entities.units.*; @@ -47,23 +50,32 @@ public UnitFactory(String name){ commandable = true; ambientSound = Sounds.respawning; - config(Integer.class, (UnitFactoryBuild tile, Integer i) -> { + config(Integer.class, (UnitFactoryBuild build, Integer i) -> { if(!configurable) return; - if(tile.currentPlan == i) return; - tile.currentPlan = i < 0 || i >= plans.size ? -1 : i; - tile.progress = 0; + if(build.currentPlan == i) return; + build.currentPlan = i < 0 || i >= plans.size ? -1 : i; + build.progress = 0; + if(build.command != null && !build.unit().commands.contains(build.command)){ + build.command = null; + } }); - config(UnitType.class, (UnitFactoryBuild tile, UnitType val) -> { + config(UnitType.class, (UnitFactoryBuild build, UnitType val) -> { if(!configurable) return; int next = plans.indexOf(p -> p.unit == val); - if(tile.currentPlan == next) return; - tile.currentPlan = next; - tile.progress = 0; + if(build.currentPlan == next) return; + build.currentPlan = next; + build.progress = 0; + if(build.command != null && !val.commands.contains(build.command)){ + build.command = null; + } }); + config(UnitCommand.class, (UnitFactoryBuild build, UnitCommand command) -> build.command = command); + configClear((UnitFactoryBuild build) -> build.command = null); + consume(new ConsumeItemDynamic((UnitFactoryBuild e) -> e.currentPlan != -1 ? plans.get(Math.min(e.currentPlan, plans.size - 1)).requirements : ItemStack.empty)); } @@ -165,6 +177,15 @@ public void drawPlanRegion(BuildPlan plan, Eachable list){ Draw.rect(topRegion, plan.drawx(), plan.drawy()); } + @Override + public void getPlanConfigs(Seq options){ + for(var plan : plans){ + if(!plan.unit.isBanned()){ + options.add(plan.unit); + } + } + } + public static class UnitPlan{ public UnitType unit; public ItemStack[] requirements; @@ -181,6 +202,7 @@ public UnitPlan(UnitType unit, float time, ItemStack[] requirements){ public class UnitFactoryBuild extends UnitBuild{ public @Nullable Vec2 commandPos; + public @Nullable UnitCommand command; public int currentPlan = -1; public float fraction(){ @@ -191,6 +213,13 @@ public float ticksRemaining(){ return currentPlan == -1 ? 0 : efficiency() <= 0.01 ? 0 : (plans.get(currentPlan).time - progress) / efficiency() / timeScale / Vars.state.rules.unitBuildSpeedMultiplier; } + public boolean canSetCommand(){ + var output = unit(); + return output != null && output.commands.size > 1 && output.allowChangeCommands && + //to avoid cluttering UI, don't show command selection for "standard" units that only have two commands. + !(output.commands.size == 2 && output.commands.get(1) == UnitCommand.enterPayloadCommand); + } + @Override public void created(){ //auto-set to the first plan, it's better than nothing. @@ -233,6 +262,62 @@ public void buildConfiguration(Table table){ if(units.any()){ ItemSelection.buildTable(UnitFactory.this, table, units, () -> currentPlan == -1 ? null : plans.get(currentPlan).unit, unit -> configure(plans.indexOf(u -> u.unit == unit)), selectionRows, selectionColumns); + + table.row(); + + Table commands = new Table(); + commands.top().left(); + + Runnable rebuildCommands = () -> { + commands.clear(); + commands.background(null); + var unit = unit(); + if(unit != null && canSetCommand()){ + commands.background(Styles.black6); + var group = new ButtonGroup(); + group.setMinCheckCount(0); + int i = 0, columns = Mathf.clamp(units.size, 2, selectionColumns); + var list = unit.commands; + + commands.image(Tex.whiteui, Pal.gray).height(4f).growX().colspan(columns).row(); + + for(var item : list){ + ImageButton button = commands.button(item.getIcon(), Styles.clearNoneTogglei, 40f, () -> { + configure(item); + }).tooltip(item.localized()).group(group).get(); + + button.update(() -> button.setChecked(command == item || (command == null && unit.defaultCommand == item))); + + if(++i % columns == 0){ + commands.row(); + } + } + + if(list.size < columns){ + for(int j = 0; j < (columns - list.size); j++){ + commands.add().size(40f); + } + } + } + }; + + rebuildCommands.run(); + + //Since the menu gets hidden when a new unit is selected, this is unnecessary. + /* + UnitType[] lastUnit = {unit()}; + + commands.update(() -> { + if(lastUnit[0] != unit()){ + lastUnit[0] = unit(); + rebuildCommands.run(); + } + });*/ + + table.row(); + + table.add(commands).fillX().left(); + }else{ table.table(Styles.black3, t -> t.add("@none").color(Color.lightGray)); } @@ -319,9 +404,14 @@ public void updateTile(){ progress %= 1f; Unit unit = plan.unit.create(team); - if(commandPos != null && unit.isCommandable()){ - unit.command().commandPosition(commandPos); + if(unit.isCommandable()){ + if(commandPos != null){ + unit.command().commandPosition(commandPos); + } + + unit.command().command(command == null && unit.type.defaultCommand != null ? unit.type.defaultCommand : command); } + payload = new UnitPayload(unit); payVector.setZero(); consume(); @@ -357,7 +447,7 @@ public boolean acceptItem(Building source, Item item){ @Override public byte version(){ - return 2; + return 3; } @Override @@ -366,6 +456,7 @@ public void write(Writes write){ write.f(progress); write.s(currentPlan); TypeIO.writeVecNullable(write, commandPos); + TypeIO.writeCommand(write, command); } @Override @@ -376,6 +467,10 @@ public void read(Reads read, byte revision){ if(revision >= 2){ commandPos = TypeIO.readVecNullable(read); } + + if(revision >= 3){ + command = TypeIO.readCommand(read); + } } } } diff --git a/core/src/mindustry/world/modules/ItemModule.java b/core/src/mindustry/world/modules/ItemModule.java index 8e1ff0d9a2..0b319aa440 100644 --- a/core/src/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -187,8 +187,7 @@ public boolean any(){ return total > 0; } - @Nullable - public Item first(){ + public @Nullable Item first(){ for(int i = 0; i < items.length; i++){ if(items[i] > 0){ return content.item(i); @@ -197,8 +196,7 @@ public Item first(){ return null; } - @Nullable - public Item take(){ + public @Nullable Item take(){ for(int i = 0; i < items.length; i++){ int index = (i + takeRotation); if(index >= items.length) index -= items.length; @@ -212,30 +210,6 @@ public Item take(){ return null; } - /** Begins a speculative take operation. This returns the item that would be returned by #take(), but does not change state. */ - @Nullable - public Item takeIndex(int takeRotation){ - for(int i = 0; i < items.length; i++){ - int index = (i + takeRotation); - if(index >= items.length) index -= items.length; - if(items[index] > 0){ - return content.item(index); - } - } - return null; - } - - public int nextIndex(int takeRotation){ - for(int i = 1; i < items.length; i++){ - int index = (i + takeRotation); - if(index >= items.length) index -= items.length; - if(items[index] > 0){ - return (takeRotation + i) % items.length; - } - } - return takeRotation; - } - public int get(int id){ return items[id]; } diff --git a/servers_v7.json b/servers_v7.json index 54f5f61172..0491416178 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -1,7 +1,7 @@ [ { "name": "EscoCorp", - "address": ["81.30.105.171:6567", "81.30.105.171:6568", "202.49.176.213:6567"] + "address": ["202.49.176.213:6567", "202.49.176.213:6568", "202.49.176.213:6569"] }, { "name": "Redundancy Dept", @@ -318,7 +318,7 @@ }, { "name": "ArmyOFUkraine", - "address": ["194.247.42.131:27715", "194.247.42.131:27512","220.141.232.67"] + "address": ["194.247.42.131:27715", "194.247.42.131:27512", "194.247.42.130:27505"] }, { "name": "Erbium", diff --git a/tools/src/mindustry/tools/ScriptMainGenerator.java b/tools/src/mindustry/tools/ScriptMainGenerator.java index c630004e0c..4b0fdac9e5 100644 --- a/tools/src/mindustry/tools/ScriptMainGenerator.java +++ b/tools/src/mindustry/tools/ScriptMainGenerator.java @@ -24,7 +24,7 @@ public class ScriptMainGenerator{ public static void main(String[] args) throws Exception{ String base = "mindustry"; - Seq blacklist = Seq.with("tools"); + Seq blacklist = Seq.with("tools", "arc.flabel.effects"); Seq nameBlacklist = Seq.with(); Seq> whitelist = Seq.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Shader.class, @@ -49,7 +49,7 @@ public static void main(String[] args) throws Exception{ classes.sort(Structs.comparing(Class::getName)); classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.getCanonicalName() == null || Modifier.isPrivate(type.getModifiers()) - || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); + || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName()) || blacklist.contains(type.getPackage().getName())); classes.add(NetConnection.class, SaveIO.class, SystemCursor.class); classes.distinct();