diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index d8bd20638f..6d55eb1d6c 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -7,4 +7,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - - uses: gradle/wrapper-validation-action@v2 + - uses: gradle/actions/wrapper-validation@v3 diff --git a/core/assets-raw/sprites/ui/flat-angled.9.png b/core/assets-raw/sprites/ui/flat-angled.9.png new file mode 100644 index 0000000000..a9919160e6 Binary files /dev/null and b/core/assets-raw/sprites/ui/flat-angled.9.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 538719ebc8..d8d0891ad9 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -866,8 +866,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production begins in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 79cce0db4d..5dd2bce180 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -861,8 +861,7 @@ objective.build = [accent]Пабудуйце: [][lightgray]{0}[]x\n{1}[lightgray objective.buildunit = [accent]Пабудуйце адзінку: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Знішчыце: [][lightgray]{0}[]x Адзінак objective.enemiesapproaching = [accent]Ворагі з'явяцца праз [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Павышэнне скорасці варожай вытворчасці праз [lightgray]{0}[] +objective.enemyescalating = [accent]Павышэнне скорасці варожай вытворчасці праз [lightgray]{0}[] objective.enemyairunits = [accent]Вытворчасць варожых паветранных адзінак пачынаецца праз [lightgray]{0}[] objective.enemyunitproduction = [accent]Выраб адзінак ворага пачнецца праз [lightgray]{0}[] objective.destroycore = [accent]Знішчыць Варожае Ядро diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 156c95e702..5e96f52b60 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -861,8 +861,7 @@ objective.build = [accent]Построете: [][lightgray]{0}[]x\n{1}[lightgray objective.buildunit = [accent]Постройте единица: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Унищожете: [][lightgray]{0}[]x Единици objective.enemiesapproaching = [accent]Враговете наближават след [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Вражеската продукция се увеличава след [lightgray]{0}[] +objective.enemyescalating = [accent]Вражеската продукция се увеличава след [lightgray]{0}[] objective.enemyairunits = [accent]Вражеското производство на въздушни сили започва след [lightgray]{0}[] objective.enemyunitproduction = [accent]Вражеската продукция започва след [lightgray]{0}[] objective.destroycore = [accent]Унищожете вражеско ядро diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 9e90e6918b..5324f754c9 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -861,8 +861,7 @@ objective.build = [accent]Construïu: [][lightgray]{0}[]×\n{1}[lightgray]{2} objective.buildunit = [accent]Construïu unitats: [][lightgray]{0}[]×\n{1}[lightgray]{2} objective.destroyunits = [accent]Destruïu [][lightgray]{0}[] unitats. objective.enemiesapproaching = [accent]Arribaran enemics d’aquí [lightgray]{0}[]. -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]La producció enemiga augmentarà d’aquí [lightgray]{0}[] +objective.enemyescalating = [accent]La producció enemiga augmentarà d’aquí [lightgray]{0}[] objective.enemyairunits = [accent]L’enemic començarà a produir unitats aèries d’aquí [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destruïu el nucli enemic. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index e181f8965f..16c944ad33 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -861,8 +861,7 @@ objective.build = [accent]Postaveno: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Vytvořeno jednotek: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Zničeno: [][lightgray]{0}[]x jednotek objective.enemiesapproaching = [accent]Nepřátelé se blíží [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Produkce nepřátel eskaluje [lightgray]{0}[] +objective.enemyescalating = [accent]Produkce nepřátel eskaluje [lightgray]{0}[] objective.enemyairunits = [accent]Začátek výroby nepřátelských leteckých jednotek [lightgray]{0}[] objective.enemyunitproduction = [accent]Výroba nepřátelských jednotek začne za [lightgray]{0}[] objective.destroycore = [accent]Znič nepřátelské Jádro diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 3e58be9036..bc9b5b099b 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 6a00eeff60..5ce70c44a3 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -861,8 +861,7 @@ objective.build = [accent]Baue: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Baue Einheit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Zerstöre: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Gegner in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Gegnerische Einheit-Produktion steigert sich in [lightgray]{0}[] +objective.enemyescalating = [accent]Gegnerische Einheit-Produktion steigert sich in [lightgray]{0}[] objective.enemyairunits = [accent]Gegnerische Lufteinheit-Produktion startet in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Gegnerischen Kern zerstören diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 78ff23142b..ed577fdbdc 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -861,8 +861,7 @@ objective.build = [accent]Construye: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Ensambla unidades: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destruye: [][lightgray]{0}[]x Unidades objective.enemiesapproaching = [accent]Se aproximan enemigos a [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]La produccion enemiga escalará en [lightgray]{0}[] +objective.enemyescalating = [accent]La produccion enemiga escalará en [lightgray]{0}[] objective.enemyairunits = [accent]La producción de unidades aereas enemigas iniciará en [lightgray]{0}[] objective.enemyunitproduction = [accent]La producción de unidades enemigas iniciará en [lightgray]{0}[] objective.destroycore = [accent]Destruye el núcleo enemigo diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 659c765dec..0302afc0b0 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 5651998d7c..33727c76c9 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -861,8 +861,7 @@ objective.build = [accent]Eraiki: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Unitatea eraiki: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Suntsitu: [][lightgray]{0}[]x Unitate objective.enemiesapproaching = [accent]Etsaiak gerturatzen [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Etsaien ekoizketa eskalatzen [lightgray]{0}[] +objective.enemyescalating = [accent]Etsaien ekoizketa eskalatzen [lightgray]{0}[] objective.enemyairunits = [accent]Etsaien aire unitateen ekoizketaren hasiera [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Suntsitu etsai nukleoa diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 7d42e559ca..a892e478d6 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -861,8 +861,7 @@ objective.build = [accent]Rakenna: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Rakenna yksikkö: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Tuhoa: [][lightgray]{0}[]x yksikköä objective.enemiesapproaching = [accent]Vihollinen lähestyy ajassa [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Tuhoa vihollisydin diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 0c9e725b38..7e15e14029 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index ea58e198c6..e64dd3fde9 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -861,8 +861,7 @@ objective.build = [accent]Construisez: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Construisez des Unités: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Détruisez: [][lightgray]{0}[]x Unités objective.enemiesapproaching = [accent]Arrivée des ennemis dans [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]La production ennemie augmente dans [lightgray]{0}[] +objective.enemyescalating = [accent]La production ennemie augmente dans [lightgray]{0}[] objective.enemyairunits = [accent]La production d'unités aériennes ennemies commence dans [lightgray]{0}[] objective.enemyunitproduction = [accent]La production d'unités ennemies débute dans [lightgray]{0}[] objective.destroycore = [accent]Détruisez le Noyau Ennemi @@ -985,20 +984,20 @@ sector.impact0078.name = Impacte 0078 sector.groundZero.name = Zone Zero sector.crateredBattleground.name = Arène de Cratères sector.frozenForest.name = Foret glacée -sector.ruinousShores.name = Ruines costales +sector.ruinousShores.name = Ruines littorales sector.stainedMountains.name = Montagnes tachées sector.desolateRift.name = Desolate Rift sector.nuclearComplex.name = Complexe de Production Nucléaire -sector.overgrowth.name = Overgrowth +sector.overgrowth.name = Sur-pousse sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass -sector.biomassFacility.name = Biomass Synthesis Facility -sector.windsweptIslands.name = Windswept Islands -sector.extractionOutpost.name = Extraction Outpost -sector.facility32m.name = Facility 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons +sector.fungalPass.name = Passe sporifique +sector.biomassFacility.name = Complexe de Synthèse de Biomasse +sector.windsweptIslands.name = îles soufflés +sector.extractionOutpost.name = Avant-poste d'Extraction +sector.facility32m.name = Complexe 32 M +sector.taintedWoods.name = Forêts Teintes +sector.infestedCanyons.name = Canyons Infestés sector.planetaryTerminal.name = Planetary Launch Terminal sector.coastline.name = Côtes Humides sector.navalFortress.name = Fortresse Naval @@ -1007,10 +1006,10 @@ sector.testingGrounds.name = Testing Grounds sector.perilousHarbor.name = Perilous Harbor sector.weatheredChannels.name = Weathered Channels sector.fallenVessel.name = Fallen Vessel -sector.mycelialBastion.name = Mycelial Bastion +sector.mycelialBastion.name = Bastion Myceliale sector.frontier.name = Frontière sector.sunkenPier.name = Sunken Pier -sector.littoralShipyard.name = Litorral Shipyard +sector.littoralShipyard.name = Port Littoral sector.geothermalStronghold.name = Geothermal Stronghold 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. @@ -1095,10 +1094,10 @@ status.blasted.name = Explosé status.corroded.name = Corrodé status.unmoving.name = Immobilisé status.boss.name = Gardien -status.slow.name = Slow -status.fast.name = Fast -status.shielded.name = Shielded -status.disarmed.name = Disarmed +status.slow.name = Lent +status.fast.name = Rapide +status.shielded.name = Protégé +status.disarmed.name = Désarmé settings.language = Langage settings.data = Données du Jeu @@ -1119,10 +1118,10 @@ settings.clearresearch = Supprimer la Recherche settings.clearresearch.confirm = Êtes-vous sûr de vouloir supprimer toutes les recherches de la campagne ? settings.clearcampaignsaves = Supprimer la Campagne settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne ? -settings.clearplanetdata = Clear Planet Data -settings.planetselect = Planet: {0} -settings.clearplanetresearch = Clear Planet Research -settings.clearplanetresearch.confirm = Are you sure you want to clear {0}'s research? +settings.clearplanetdata = Supprimer les données de la planète +settings.planetselect = Planète: {0} +settings.clearplanetresearch = Supprimer la recherche de la planète. +settings.clearplanetresearch.confirm = Êtes-vous sur de vouloir supprimer toutes les recherches de la planète {0}? settings.clearplanetcampaignsaves = Clear Planet Campaign Saves settings.clearplanetcampaignsaves.confirm = Are you sure you want to clear {0}'s campaign saves? diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 7c91a0d625..fd0dd6c47d 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -154,10 +154,10 @@ mods.update.available = [lightgray]Frissítés érhető el: {0} mods.update.all = Összes mod frissítése mods.downloading = [accent]Mod letöltése: {0} -mod.warning = ⚠ Mods can execute arbitrary code.\n\nNever download mods from sources you don't trust - they could steal data or compromise your computer. -mod.warning.read = I actually read this -mod.warning.accept = I accept the responsibility -mod.warning.deny = Disable my mods +mod.warning = ⚠ A modok tetszőleges kódot futtathatnak.\n\nSoha ne tölts le modokat megbízhatatlan forrásból - adatokat lophatnak vagy kárt tehetnek a számítógépedben. +mod.warning.read = Ezt tényleg elolvastam +mod.warning.accept = Vállalom a felelősséget +mod.warning.deny = Modok letiltása mod.installed = [[Telepítve] mod.display = [gray]Mod:[accent] {0} mod.enabled = [lightgray]Aktív @@ -289,8 +289,8 @@ servers.connect.confirm = Belépsz a következő kiszolgálóra?\n\n[accent]{0}[ servers.showhidden = Rejtett kiszolgálók megjelenítése server.shown = Látható server.hidden = Rejtett -servers.sortping = Sorting By: Ping -servers.sortplayers = Sorting By: Player Count +servers.sortping = Rendezés: Ping szerint +servers.sortplayers = Rendezés: Játékosok száma szerint viewplayer = Játékos figyelése: [accent]{0} trace = Játékos követése @@ -564,7 +564,7 @@ asset.image.importzip = Importálás ZIP-fájlból asset.image.exportzip = Exportálás ZIP-fájlba asset.clearall = Összes törlése asset.clearall.confirm = Biztosan törölni szeretnél [red]minden[] összetevőt erről a pályáról?\nEbbe beletartoznak a képek, a hangok, a tartalmak stb. -asset.path.invalid = Path is invalid! +asset.path.invalid = Érvénytelen elérési útvonal! asset.imports = Importálás eredménye asset.imported = [accent]{0} összetevő importálva. asset.import.none = Nem találhatók érvényes összetevő-fájlok a ZIP-archívumban. @@ -861,8 +861,7 @@ objective.build = [accent]Építs: [][lightgray]{0}[] db\n{1}[lightgray]{2} objective.buildunit = [accent]Gyárts egységeket: [][lightgray]{0}[] db\n{1}[lightgray]{2} objective.destroyunits = [accent]Semmisíts meg: [][lightgray]{0}[] db egységet objective.enemiesapproaching = [accent]Ellenség érkezik: [lightgray]{0}[] mp múlva -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Az ellenséges gyártás fokozódik: [lightgray]{0}[] mp múlva +objective.enemyescalating = [accent]Az ellenséges gyártás fokozódik: [lightgray]{0}[] mp múlva objective.enemyairunits = [accent]Az ellenséges légi egységek gyártása elkezdődik: [lightgray]{0}[] mp múlva objective.enemyunitproduction = [accent]Az ellenséges szárazföldi egységek gyártása elkezdődik: [lightgray]{0}[] mp múlva objective.destroycore = [accent]Semmisítsd meg az ellenséges támaszpontot @@ -1174,7 +1173,7 @@ stat.powerdamage = Áram/sebzés stat.itemcapacity = Nyersanyag-kapacitás stat.memorycapacity = Memóriakapacitás stat.basepowergeneration = Alap áramtermelés -stat.meltdowntime = Meltdown Time +stat.meltdowntime = Leolvadási idő stat.productiontime = Gyártási idő stat.warmuptime = Bemelegedési idő stat.repairtime = Teljes javítási idő @@ -1306,8 +1305,8 @@ bar.liquid = Folyadék bar.heat = Hő bar.cooldown = Lehűlés bar.instability = Instabilitás -bar.whenfull = when full -bar.nevermelts = never melts +bar.whenfull = ha tele van +bar.nevermelts = soha nem olvad le bar.heatamount = Hő: {0} bar.heatpercent = Hő: {0} ({1}%) bar.power = Áram @@ -2180,8 +2179,8 @@ block.radar.name = Radar block.build-tower.name = Építőtorony block.regen-projector.name = Regeneráló vetítő block.shockwave-tower.name = Sokkhullámtorony -block.shield-projector.name = Védőréteg-vetítő -block.large-shield-projector.name = Nagy védőréteg-vetítő +block.shield-projector.name = Pajzsvetítő +block.large-shield-projector.name = Nagy pajzsvetítő block.armored-duct.name = Páncélozott szállítócsatorna block.overflow-duct.name = Túlcsorduló szállítócsatorna block.underflow-duct.name = Alulcsorduló szállítócsatorna @@ -2394,11 +2393,11 @@ onset.commandmode = Tartsd nyomva a [accent]bal shift[] gombot, hogy belépj a [ onset.commandmode.mobile = Nyomd meg a [accent]parancs gombot[], hogy belépj a [accent]parancsmódba[].\nTartsd nyomva az ujjad, majd [accent]húzd[] az egységek kiválasztásához.\n[accent]Koppintással[] az egységek mozgásra vagy támadásra utasíthatók. aegis.tungsten = Volfrámot [accent]ütvefúróval[] lehet bányászni.\nEnnek az épületnek [accent]vízre[] és [accent]áramra[] van szüksége. -split.pickup = Egyes blokkok a támaszpont drónjával is felvehetők.\nVedd fel ezt a [accent]konténert[] és helyezd egy [accent]rakománycsomagolóba[].\n(A felvétel és lerakás alapértelmezett gombjai: [[ és ].) -split.pickup.mobile = Egyes blokkok a támaszpont drónjával is felvehetők.\nVedd fel ezt a [accent]konténert[] és helyezd egy [accent]rakománycsomagolóba[].\n(A felvételhez és lerakáshoz nyomd meg hosszan.) +split.pickup = Egyes blokkok a támaszpont drónjával is felvehetők.\nLebegj e felett a [accent]konténer[] felett, vedd fel és helyezd egy [accent]rakománycsomagolóba[].\n(A felvétel és lerakás alapértelmezett gombjai: [accent][[[] és [accent][]].) +split.pickup.mobile = Egyes blokkok a támaszpont drónjával is felvehetők.\nLebegj e felett a [accent]konténer[] felett, vedd fel és helyezd egy [accent]rakománycsomagolóba[].\n(A felvételhez és lerakáshoz nyomd meg hosszan.) split.acquire = Szerezz volfrámot az egységek gyártásához. -split.build = Az egységeket a fal másik oldalára kell eljuttatni.\nÉpíts két [accent]rakomány-tömegmozgatót[], egyet-egyet a fal mindkét oldalán.\nÁllítsd be a szállítási kapcsolatukat úgy, hogy kiválasztod az egyiket, majd kiválasztod a másikat. -split.container = A konténerekhez hasonlóan, az egységek is szállíthatók a [accent]rakomány-tömegmozgatóval[].\nÉpíts egy egységgyárat egy tömegmozgató mellé, hogy feltöltsd őket, majd küldd át őket a falon, hogy megtámadják az ellenséges bázist. +split.build = Az egységeket a fal másik oldalára kell eljuttatni.\nFejleszd ki a :payload-mass-driver: [accent]rakomány-tömegmozgatót[].\nÉpíts két [accent]rakomány-tömegmozgatót[], egyet-egyet a fal mindkét oldalán.\nÁllítsd be a szállítási kapcsolatukat úgy, hogy kiválasztod az egyiket, majd kiválasztod a másikat. +split.container = A konténerekhez hasonlóan, az egységek is szállíthatók a [accent]rakomány-tömegmozgatóval[].\nÉpíts egy egységgyárat egy tömegmozgató mellé, hogy feltöltsd őket,\nmajd küldd át őket a falon, hogy megtámadják az ellenséges bázist. item.copper.description = Széleskörűen használatos építkezésnél és lőszerként. item.copper.details = Réz. Szokatlanul bőségesen elterjedt fém a Serpulon. Megerősítés nélkül strukturálisan gyenge. @@ -2447,12 +2446,12 @@ block.armored-conveyor.description = Nyersanyagokat szállít. Nem fogad el olda block.illuminator.description = Világít. block.message.description = Üzenetet tárol a szövetségesek kommunikációjához. block.reinforced-message.description = Üzenetet tárol a szövetségesek közötti kommunikációhoz. -block.world-message.description = A pályakészítésben használható üzenetblokk. Nem lehet megsemmisíteni. -block.world-processor.description = A processor for use in mapmaking. Cannot be destroyed. Capable of using privileged instructions, such as those that spawn units or change tiles. -block.world-cell.description = A memory cell for use in mapmaking. Cannot be destroyed. -block.world-switch.description = A switch block for use in mapmaking. Cannot be destroyed. Can only be interacted by players on the same team. -block.shield-projector.description = An unbreakable shield projector for use in mapmaking. -block.large-shield-projector.description = An unbreakable shield projector for use in mapmaking. +block.world-message.description = A pályakészítéshez használható üzenetblokk. Elpusztíthatatlan. +block.world-processor.description = A pályakészítéshez használható processzor. Elpusztíthatatlan. Képes kiemelt jogosultságú utasítások használatára, mint például egységek elhelyezése vagy mezők módosítása. +block.world-cell.description = A pályakészítéshez használható memóriacella. Elpusztíthatatlan. +block.world-switch.description = A pályakészítéshez használható kapcsolóblokk. Elpusztíthatatlan. Csak az azonos csapatban lévő játékosok léphetnek vele interakcióba. +block.shield-projector.description = A pályakészítéshez használható pajzsvetítő. Elpusztíthatatlan. +block.large-shield-projector.description = A pályakészítéshez használható nagy pajzsvetítő. Elpusztíthatatlan. block.graphite-press.description = Grafittá préseli a szenet. block.multi-press.description = Grafittá sajtolja a szenet. Hűtéséhez víz szükséges. block.silicon-smelter.description = A homokot és a szenet szilíciummá finomítja. @@ -2795,7 +2794,7 @@ lst.weathersense = Ellenőrzés, hogy egy bizonyos típusú időjárás aktív-e lst.weatherset = Időjárástípusok jelenlegi állapotának megadása. lst.spawnwave = Egy hullám indítása. lst.explosion = Robbanás létrehozása az adott helyen. -lst.setrate = Processzor végrehajtási sebességének beállítása utasítás/órajelciklusban. +lst.setrate = Processzor végrehajtási sebességének beállítása utasítás/órajelciklusban.\nNem haladhatja meg a legnagyobb végrehajtási sebességet. lst.fetch = Egységek, támaszpontok, játékosok, vagy épületek lekérdezése index szerint.\nAz indexek 0-tól indulnak és a visszaadott számuknál végződnek. lst.packcolor = Egyetlen számba tömöríti a [0, 1] RGBA-összetevőket a rajzoláshoz vagy szabálymeghatározáshoz. lst.unpackcolor = RGBA-összetevők kicsomagolása egy színből, amely a „Pack Color” használatával lett becsomagolva. diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 572517f994..9ce38c6405 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -154,10 +154,10 @@ mods.update.available = [lightgray]Pembaruan Tersedia: {0} mods.update.all = Perbarui Semua Mod mods.downloading = [accent]Mengunduh Mod: {0} -mod.warning = ⚠ Mods can execute arbitrary code.\n\nNever download mods from sources you don't trust - they could steal data or compromise your computer. -mod.warning.read = I actually read this -mod.warning.accept = I accept the responsibility -mod.warning.deny = Disable my mods +mod.warning = ⚠ Perlu diingat bahwa sebuah mod dapat menjalankan kode arbitrer.\n\nJangan pernah mengunduh mod dari sumber yang tidak dipercayai — mod tersebut bisa mencuri data atau membahayakan keamanan komputer Anda. +mod.warning.read = Saya benar-benar membaca ini. +mod.warning.accept = Saya menerima tanggung jawab tersebut. +mod.warning.deny = Nonaktifkan mod saya mod.installed = [[Terpasang] mod.display = [gray]Mod:[accent] {0} mod.enabled = [lightgray]Aktif @@ -285,12 +285,12 @@ servers.remote = Server Jarak Jauh servers.global = Server Komunitas servers.disclaimer = Server komunitas [accent]tidak[] dimiliki atau diatur oleh pengembang.\n\nServer dapat berisi konten buatan pemain lain yang mungkin tidak sesuai untuk semua umur. -servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust! +servers.connect.confirm = Gabung ke server berikut?\n\n[accent]{0}[]\n\nPastikan hanya terhubung ke server yang Anda percayai! servers.showhidden = Tampilkan Server Tersembunyi server.shown = Ditampilkan server.hidden = Disembunyikan -servers.sortping = Sorting By: Ping -servers.sortplayers = Sorting By: Player Count +servers.sortping = Urutkan Berdasarkan: Ping +servers.sortplayers = Urutkan Berdasarkan: Jumlah Pemain viewplayer = Melihat Pemain: [accent]{0} trace = Lacak Pemain @@ -564,7 +564,7 @@ asset.image.importzip = Impor Zip asset.image.exportzip = Ekspor Zip asset.clearall = Hapus Semua asset.clearall.confirm = Apakah Anda yakin ingin menghapus [red]semua[] aset dari peta ini?\nTermasuk gambar, audio, konten, dll. -asset.path.invalid = Path is invalid! +asset.path.invalid = Jalur tidak valid! asset.imports = Impor Hasil asset.imported = [accent]{0} aset diimpor. asset.import.none = Tidak ada file aset yang valid di dalam arsip zip. @@ -861,8 +861,7 @@ objective.build = [accent]Bangun: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Produksi Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Hancurkan: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Musuh akan datang dalam [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Produksi musuh meningkat dalam [lightgray]{0}[] +objective.enemyescalating = [accent]Produksi musuh meningkat dalam [lightgray]{0}[] objective.enemyairunits = [accent]Produksi unit udara musuh dimulai dalam [lightgray]{0}[] objective.enemyunitproduction = [accent]Produksi unit musuh dimulai dalam [lightgray]{0}[] objective.destroycore = [accent]Hancurkan Inti Musuh @@ -1129,7 +1128,7 @@ settings.clearplanetcampaignsaves.confirm = Apakah Anda yakin ingin membersihkan paused = [accent]< Jeda > clear = Kosongkan banned = [scarlet]Dilarang -block.limit = [scarlet]Limit: {0} Buildings +block.limit = [scarlet]Batas: {0} Bangunan unsupported.environment = [scarlet]Ruang Lingkup Tidak Cocok yes = Ya no = Tidak @@ -1174,7 +1173,7 @@ stat.powerdamage = Tenaga/Damage stat.itemcapacity = Kapasitas Item stat.memorycapacity = Kapasitas Memori stat.basepowergeneration = Produksi Tenaga Dasar -stat.meltdowntime = Meltdown Time +stat.meltdowntime = Waktu Meleleh stat.productiontime = Waktu Produksi stat.warmuptime = Waktu Pemanasan stat.repairtime = Waktu Penuh Perbaikan Blok @@ -1306,8 +1305,8 @@ bar.liquid = Zat Cair bar.heat = Panas bar.cooldown = Pendinginan bar.instability = Instabilitas -bar.whenfull = when full -bar.nevermelts = never melts +bar.whenfull = saat penuh +bar.nevermelts = tidak pernah meleleh bar.heatamount = Panas: {0} bar.heatpercent = Panas: {0} ({1}%) bar.power = Tenaga @@ -2394,10 +2393,10 @@ onset.commandmode = Tahan [accent]shift[] untuk masuk ke[accent]mode perintah[]. onset.commandmode.mobile = Tekan tombol [accent]perintah[] untuk masuk ke [accent]mode perintah[].\nTekan dan tahan jari Anda, lalu [accent]seret[] untuk memilih unit.\n[accent]Ketuk[] untuk memerintahkan unit yang dipilih untuk bergerak atau menyerang. aegis.tungsten = Tungsten dapat ditambang menggunakan [accent]bor tumbukan[].\nBangunan ini memerlukan [accent]air[] dan [accent]tenaga[]. -split.pickup = Beberapa blok dapat diangkut oleh unit inti.\nAngkut [accent]kontainer[] ini dan letakkan di [accent]pemuat muatan[].\n(Tombol bawaannya ialah [accent][[] dan [accent]][] untuk mengangkut dan menurunkan) -split.pickup.mobile = Beberapa blok dapat diangkut oleh unit inti.\nAngkut [accent]kontainer[] ini dan letakkan di [accent]pemuat muatan[].\n(Untuk mengangkut atau menurunkan sesuatu, tekan lama blok tersebut) +split.pickup = Beberapa blok dapat diangkut oleh unit inti.\nArahkan unit inti Anda diatas [accent]kontainer[] ini, angkat dan letakkan di atas [accent]pemuat muatan[].\n(Tombol bawaannya ialah [accent][[] dan [accent]][] untuk mengangkut dan menurunkan) +split.pickup.mobile = Beberapa blok dapat diangkut oleh unit inti.\nArahkan unit inti Anda diatas [accent]kontainer[] ini, angkat dan letakkan di atas [accent]pemuat muatan[].\n(Untuk mengangkut atau menurunkan sesuatu, tekan lama blok tersebut) split.acquire = Peroleh beberapa tungsten untuk membangun unit. -split.build = Unit harus diangkut ke sisi lain tembok.\nTempatkan dua [accent]Penembak Muatan Massal[], satu di setiap sisi dinding.\nHubungkan penembak muatan massal dengan menekan salah satunya, lalu pilih penembak muatan massal yang lain. +split.build = Unit harus diangkut ke sisi lain tembok.\nRiset dan tempatkan dua :payload-mass-driver: [accent]Penembak Muatan Massal[], satu di setiap sisi dinding.\nHubungkan penembak muatan massal dengan menekan salah satunya, lalu pilih penembak muatan massal yang lain. split.container = Mirip dengan kontainer, unit juga dapat diangkut menggunakan [accent]Penembak Muatan Massal[].\nTempatkan pabrikator meka menghadap ke penembak muatan massal untuk memuat unit,\nlalu kirim mereka melintasi dinding untuk menyerang markas musuh. item.copper.description = Digunakan pada semua tipe konstruksi dan amunisi. @@ -2447,12 +2446,12 @@ block.armored-conveyor.description = Memindahkan barang ke depan. Tidak dapat me block.illuminator.description = Memancarkan cahaya. block.message.description = Menyimpan pesan untuk komunikasi antar sekutu. block.reinforced-message.description = Menyimpan pesan untuk komunikasi antar sekutu. -block.world-message.description = Blok pesan untuk digunakan dalam pembuatan peta. Tidak dapat dihancurkan. -block.world-processor.description = A processor for use in mapmaking. Cannot be destroyed. Capable of using privileged instructions, such as those that spawn units or change tiles. -block.world-cell.description = A memory cell for use in mapmaking. Cannot be destroyed. -block.world-switch.description = A switch block for use in mapmaking. Cannot be destroyed. Can only be interacted by players on the same team. -block.shield-projector.description = An unbreakable shield projector for use in mapmaking. -block.large-shield-projector.description = An unbreakable shield projector for use in mapmaking. +block.world-message.description = Blok pesan yang digunakan dalam pembuatan peta. Tidak dapat dihancurkan. +block.world-processor.description = Prosesor yang digunakan dalam pembuatan peta. Tidak dapat dihancurkan. Mampu menggunakan instruksi khusus, seperti instruksi untuk memunculkan unit atau mengubah ubin. +block.world-cell.description = Sel memori yang digunakan dalam pembuatan peta. Tidak dapat dihancurkan. +block.world-switch.description = Saklar yang digunakan dalam pembuatan peta. Tidak dapat dihancurkan. Hanya dapat berinteraksi dengan pemain di dalam tim yang sama. +block.shield-projector.description = Proyektor penghalang yang tak bisa dihancurkan. Digunakan dalam pembuatan peta. +block.large-shield-projector.description = Proyektor penghalang yang tak bisa dihancurkan. Digunakan dalam pembuatan peta. block.graphite-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit. block.multi-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit. Memerlukan air sebagai pendingin. block.silicon-smelter.description = Memproduksi silikon dari pasir dan batu bara. @@ -2671,7 +2670,7 @@ block.unit-cargo-loader.description = Memproduksi unit kargo. Unit kargo secara block.unit-cargo-unload-point.description = Bertindak sebagai titik bongkar muatan unit kargo. Menerima barang yang cocok dengan filter yang dipilih. block.beam-node.description = Mentransmisikan tenaga ke blok lain secara ortogonal. Menyimpan tenaga dalam jumlah yang kecil. block.beam-tower.description = Mentransmisikan tenaga ke blok lain secara ortogonal. Menyimpan tenaga dalam jumlah yang besar. Jarak jauh. -block.beam-link.description = Mentransmisikan tenaga ke blok lain dengan jarak yang sangat jauh.\nHanya bisa tersambung ke struktur yang berdekatan atau tautan sinar lainnya. +block.beam-link.description = Mentransmisikan tenaga ke blok lain dalam jarak yang sangat jauh.\nHanya bisa tersambung ke struktur yang berdekatan atau tautan sinar lainnya. block.turbine-condenser.description = Menghasilkan tenaga ketika ditempatkan pada ventilasi. Memproduksi sedikit air. block.chemical-combustion-chamber.description = Menghasilkan tenaga dari arkisit dan ozon. block.pyrolysis-generator.description = Menghasilkan tenaga dalam jumlah besar dari arkisit dan lava. Memproduksi air sebagai produk sampingan. @@ -2764,10 +2763,10 @@ unit.emanate.description = Membangun struktur untuk melindungi Inti Acropolis. M lst.read = Membaca angka dari memori sel yang dihubungkan.\nDapat juga membaca dari variabel di prosesor lain. lst.write = Menulis angka ke memori sel yang dihubungkan.\nDapat juga menulis ke variabel di prosesor lain. -lst.print = Menambahkan teks ke daftar cetak.\nTidak dapat menampilkan apapun sampai [accent]Print Flush[] dipakai. -lst.printchar = Tambahkan karakter UTF-16 atau ikon konten ke buffer cetak.\nTidak menampilkan apa pun sampai [accent]Print Flush[] digunakan. +lst.print = Menambahkan teks ke daftar cetak.\nTidak dapat menampilkan apapun jika belum ada perintah [accent]Print Flush[]. +lst.printchar = Tambahkan karakter UTF-16 atau ikon konten ke buffer cetak.\nTidak menampilkan apapun jika belum ada perintah [accent]Print Flush[]. lst.format = Ganti placeholder berikutnya di buffer teks dengan sebuah nilai.\nTidak melakukan apa pun jika pola placeholder tidak valid.\nPola placeholder: "{[accent]nomor 0-9[]}"\nContoh:\n[accent]print "test {0}"\nformat "example" -lst.draw = Menambahkan perintah ke daftar gambar.\nTidak dapat menampilkan apapun sampai [accent]Draw Flush[] dipakai. +lst.draw = Menambahkan perintah ke daftar gambar.\nTidak dapat menampilkan apapun jika belum ada perintah [accent]Draw Flush[]. lst.drawflush = Mengeluarkan perintah [accent]Draw[] dari daftar antrean untuk ditampilkan. lst.printflush = Mengeluarkan perintah [accent]Print[] dari daftar antrean untuk blok pesan. lst.getlink = Dapatkan tautan prosesor dengan indeks. Dimulai dari 0. @@ -2795,17 +2794,17 @@ lst.weathersense = Periksa apakah jenis cuaca aktif. lst.weatherset = Tetapkan suatu keadaan pada jenis cuaca saat ini. lst.spawnwave = Simulasikan adanya gelombang pada lokasi acak.\nTidak akan ditambahkan pada jumlah gelombang keseluruhan. lst.explosion = Membuat sebuah ledakan pada lokasi yang ditentukan. -lst.setrate = Menentukan kecepatan eksekusi prosesor dalam instruksi per tick. +lst.setrate = Menentukan kecepatan eksekusi prosesor dalam instruksi per tick.\nTidak dapat melampaui kecepatan eksekusi maksimum. lst.fetch = Mencari unit, inti, pemain atau bangunan dari indeks.\nIndeks dimulai dari 0 dan berakhir pada jumlah yang dikembalikan. -lst.packcolor = Mengemas [0, 1] komponen RGBA menjadi satu angka untuk menggambar atau rule-setting. -lst.unpackcolor = Membuka komponen RGBA dari warna yang dikemas menggunakan Paket Warna. +lst.packcolor = Mengemas komponen RGBA [0, 1] menjadi satu angka untuk keperluan menggambar atau penetapan aturan. +lst.unpackcolor = Membuka komponen RGBA dari warna yang dikemas menggunakan Pack Color. lst.setrule = Menentukan suatu peraturan permainan. lst.flushmessage = Tampilkan sebuah pesan di layar dari antrian teks.\nAkan menunggu hingga pesan sebelumnya selesai. lst.cutscene = Mengendalikan kamera pemain. lst.setflag = Menentukan global flag yang dapat dibaca oleh semua prosesor. lst.getflag = Periksa apakah ada global flag yang ditentukan. lst.setprop = Menetapkan properti unit atau bangunan. -lst.effect = Buat efek partikel. +lst.effect = Membuat berbagai macam efek. lst.sync = Sinkronkan variabel di seluruh jaringan.\nHanya dipanggil paling banyak 10 kali per detik. lst.playsound = Memutar suara.\nVolume dan kontrol suara dapat berupa nilai global, atau dihitung berdasarkan posisi. lst.playmusic = Memutar musik berdasarkan nama, misalnya [accent]"game1"[].\nJika [accent]interrupt[] bernilai true, musik yang sedang diputar sebelumnya akan dihentikan.\nMemutar dengan musik [accent]null[] dan [accent]interrupt[] diatur ke true akan menghentikan musik yang sedang diputar saat ini.\nPerhatikan bahwa penamaan musik dari patch data harus diawali dengan [accent]dp-[]. @@ -2856,8 +2855,8 @@ lglobal.@clientUnit = Unit pada klien yang menjalankan suatu kode lglobal.@clientName = Nama player pada klien yang menjalankan suatu kode lglobal.@clientTeam = ID Tim pada klien yang menjalankan suatu kode lglobal.@clientMobile = True jika kode dijalankan di server atau di singleplayer, false sebaliknya -lglobal.@clientMusicPlaying = True if any music is currently playing -lglobal.@clientCurrentMusic = Name of the current track being played, or null +lglobal.@clientMusicPlaying = True jika ada musik yang sedang diputar saat ini +lglobal.@clientCurrentMusic = Nama musik yang sedang diputar, atau null lenum.type = Bentuk dari bangunan/unit.\nMisalnya, untuk blok pengarah masa, akan tampil sebagai [accent]@router[].\nBukan string. lenum.shoot = Menembak pada suatu posisi yang ditentukan. @@ -3055,4 +3054,4 @@ lenum.solarmultiplier = Menggandakan pengeluaran tenaga panel surya. lenum.dragmultiplier = Penggandaan hambatan lingkungan. lenum.ban = Blok atau unit yang tidak dapat ditempatkan atau dibangun. lenum.unban = Batalkan larangan memproduksi suatu unit atau membangun blok. -lenum.musicvolume = Global music volume multiplier.\nClamped to [0, 1]. +lenum.musicvolume = Penggandaan volume musik global.\nDibatasi ke [0, 1]. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 7b5cdaa1e0..747f136abb 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -861,8 +861,7 @@ objective.build = [accent]Costruisci: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Costruisci unità: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Distruggi: [][lightgray]{0}[]x unità objective.enemiesapproaching = [accent]Nemici in arrivo tra [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Produzione nemica in aumento tra [lightgray]{0}[] +objective.enemyescalating = [accent]Produzione nemica in aumento tra [lightgray]{0}[] objective.enemyairunits = [accent]La produzione aerea nemica comincia tra [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Distruggi il nucleo nemico diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 9b503efdfe..778de3631e 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -19,7 +19,7 @@ clipboardcopy = このサーバーはクリップボードにテキストをコ linkfail = リンクを開けませんでした!\nURLをクリップボードにコピーしました。 screenshot = スクリーンショットを {0} に保存しました。 screenshot.invalid = マップが広すぎます。スクリーンショットに必要なメモリが足りない可能性があります。 -screenshot.error = Failed to take screenshot. Your device likely does not support screenshots this large. +screenshot.error = スクリーンショットを取るのに失敗しました。 このデバイスはこれほど大きいスクリーンショットに対応していません。 gameover = ゲームオーバー gameover.disconnect = 切断 gameover.pvp = [accent] {0}[] チームの勝利! @@ -150,13 +150,13 @@ mods.openfolder = Modフォルダを開く mods.viewcontent = コンテンツを見る mods.reload = 再読み込み mods.reloadexit = Modを読み込む為にゲームを再起動します。 -mods.update.available = [lightgray]Update Available: {0} -mods.update.all = Update All Mods -mods.downloading = [accent]Downloading Mod: {0} +mods.update.available = [lightgray]利用可能なアップデート: {0} +mods.update.all = すべてのmodをダウンロードする +mods.downloading = [accent]ダウンロード中のmod: {0} -mod.warning = ⚠ Mods can execute arbitrary code.\n\nNever download mods from sources you don't trust - they could steal data or compromise your computer. -mod.warning.read = I actually read this -mod.warning.accept = I accept the responsibility +mod.warning = ⚠ Modsは任意のコードを実行できます\n\n信用できないソースからmodを絶対にダウンロードしないでください! - あなたのコンピューターを覗いたりデータを盗んだりすることが可能です! +mod.warning.read = しっかりと読みました +mod.warning.accept = 責任を受け入れる mod.warning.deny = Disable my mods mod.installed = [[インストール済み] mod.display = [gray]Mod:[orange] {0} @@ -861,8 +861,7 @@ objective.build = [accent]建設: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]ユニット建造: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]破壊: [][lightgray]{0}[]x ユニット objective.enemiesapproaching = [accent]敵が接近中 [lightgray]{0}[] 秒 -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent][lightgray]{0} で敵の生産が早くなる。[] +objective.enemyescalating = [accent][lightgray]{0} で敵の生産が早くなる。[] objective.enemyairunits = [accent][lightgray]{0} で敵の航空部隊の生産が始まる。[] objective.enemyunitproduction = [accent]敵ユニットの生産開始まで [lightgray]{0}[] objective.destroycore = [accent]敵のコアを破壊する diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index aedeaf2f1c..a5cd8acbe6 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -861,8 +861,7 @@ objective.build = [accent]건설: [][lightgray]{0}[]개의\n{1}[lightgray]{2} objective.buildunit = [accent]유닛 생산: [][lightgray]{0}[]기\n{1}[lightgray]{2} objective.destroyunits = [accent]처치: [][lightgray]{0}[]기의 유닛 objective.enemiesapproaching = [lightgray]{0}[][accent]후, 적이 접근하기 시작합니다 -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [lightgray]{0}[][accent]후, 적의 생산량이 증가합니다 +objective.enemyescalating = [lightgray]{0}[][accent]후, 적의 생산량이 증가합니다 objective.enemyairunits = [lightgray]{0}[][accent]후, 적 공중 유닛이 생산되기 시작합니다 objective.enemyunitproduction = [lightgray]{0}[][accent]후, 적 유닛이 생산되기 시작합니다 objective.destroycore = [accent]적의 코어를 파괴하세요 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 5e3bc67c75..89725177c3 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index a77f67b542..29d2a6e76e 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -861,8 +861,7 @@ objective.build = [accent]Bouw: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Bouw Eenheid: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Vernietig: [][lightgray]{0}[]x Eenheden objective.enemiesapproaching = [accent]Vijanden naderen in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Vijandelijke productie stijgt in [lightgray]{0}[] +objective.enemyescalating = [accent]Vijandelijke productie stijgt in [lightgray]{0}[] objective.enemyairunits = [accent]De productie van vijandelijke luchtmachteenheden begint in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Vernietig Vijandelijke Core diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 19c7fb2516..ab29a1e0df 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index eeb01d888f..1abadc2b2d 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -861,8 +861,7 @@ objective.build = [accent]Buduj: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Zbudowane Jednostki: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Zniszczono: [][lightgray]{0}[]x Jednostek objective.enemiesapproaching = [accent]Wrogowie zbliżą się za [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Produkcja wrogich jednostek za [lightgray]{0}[] +objective.enemyescalating = [accent]Produkcja wrogich jednostek za [lightgray]{0}[] objective.enemyairunits = [accent]Produkcja latających wrogich jednostek za [lightgray]{0}[] objective.enemyunitproduction = [accent]Produkcja wrogich jednostek rozpocznie się za [lightgray]{0}[] objective.destroycore = [accent]Zniszcz Rdzeń Przeciwnika diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 62a5075fe8..62d50d68f5 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -861,8 +861,7 @@ objective.build = [accent]Construa: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Construa Unidade: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destrua: [][lightgray]{0}[]x Unidades objective.enemiesapproaching = [accent]Inimigos se aproximando em [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]A produção inimiga está aumentando em [lightgray]{0}[] +objective.enemyescalating = [accent]A produção inimiga está aumentando em [lightgray]{0}[] objective.enemyairunits = [accent]A produção de unidades aéreas inimigas começa em [lightgray]{0}[] objective.enemyunitproduction = [accent]A produção de unidades inimigas começa em [lightgray]{0}[] objective.destroycore = [accent]Destrua o Núcleo Inimigo diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 3367166179..db7e3a86a2 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -861,8 +861,7 @@ objective.build = [accent]Constrói: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Constrói a Unidade: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destrói: [][lightgray]{0}[]x Unidades objective.enemiesapproaching = [accent]Inimigos aproximando em [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Produção inimiga a aumentar em [lightgray]{0}[] +objective.enemyescalating = [accent]Produção inimiga a aumentar em [lightgray]{0}[] objective.enemyairunits = [accent]Produção de unidades aéreas inimigas a partir de [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destrói o Núcleo Inimigo diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 720b9fbb64..fb749d438f 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 4f2aea1a2b..dc769999d3 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -154,10 +154,10 @@ mods.update.available = [lightgray]Доступно обновление: {0} mods.update.all = Обновить все модификации mods.downloading = [accent]Загрузка модификации: {0} -mod.warning = ⚠ Mods can execute arbitrary code.\n\nNever download mods from sources you don't trust - they could steal data or compromise your computer. -mod.warning.read = I actually read this -mod.warning.accept = I accept the responsibility -mod.warning.deny = Disable my mods +mod.warning = ⚠ Модификации могут выполнять произвольный код.\n\nНикогда не загружайте модификации с неизвестных источников - они могут украсть ваши данные или превратить ваше устройство в кирпич. +mod.warning.read = Я это внимательно прочитал +mod.warning.accept = Я принимаю ответственность +mod.warning.deny = Отключить все модификации mod.installed = [[Установлено] mod.display = [gray]Модификация:[accent] {0} mod.enabled = [lightgray]Включено @@ -289,8 +289,8 @@ servers.connect.confirm = Присоединиться к этому серве servers.showhidden = Отображать скрытые серверы server.shown = Отображается server.hidden = Скрыт -servers.sortping = Sorting By: Ping -servers.sortplayers = Sorting By: Player Count +servers.sortping = Сортировка по пингу +servers.sortplayers = Сортировка по количеству игроков viewplayer = Отслеживаем игрока: [accent]{0} trace = Отслеживать игрока @@ -564,7 +564,7 @@ asset.image.importzip = Импортировать архив с изображ asset.image.exportzip = Экспортировать архив с изображениями asset.clearall = Очистить всё asset.clearall.confirm = Вы точно хотите удалить [red]все[] ресурсы из этой карты?\nБудут удалены изображения, звуки, контент, и т.д. -asset.path.invalid = Path is invalid! +asset.path.invalid = Путь файла неверный! asset.imports = Результаты импорта asset.imported = [accent]Ресурсов импортировано: {0}. asset.import.none = Нет подходящих файлов ресурсов в архиве. @@ -576,7 +576,7 @@ asset.content.badname = [red]Неверное имя! Большинство с asset.content.import.file = Импортировать файл asset.content.import.clipboard = Импортировать из буфера обмена asset.exists = Ресурс этого типа с таким путём/именем уже существует:\n[lightgray]{0} -asset.exists.audio = A sound/music asset with that name is already loaded:\n[lightgray]{0} +asset.exists.audio = Звук/музыка с таким именем уже существует:\n[lightgray]{0} asset.broken = Не удалось обнаружить файл ресурса.\nЭто скорее всего произошло из-за некорректного импорта данных или экспорта сохранения. asset.audio.invalid = Аудио не удалось загрузить.\nУбедитесь, что это рабочий файл OGG или MP3. asset.delete.confirm = Вы уверены, что хотите удалить этот ресурс? @@ -861,8 +861,7 @@ objective.build = [accent]Постройте: [][lightgray]{0}[]x\n{1}[lightgray objective.buildunit = [accent]Произведите боевую единицу: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Уничтожьте: [][lightgray]{0}[]x боевых единиц objective.enemiesapproaching = [accent]Враги прибудут через [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Вражеское производство возрастет через [lightgray]{0}[] +objective.enemyescalating = [accent]Вражеское производство возрастет через [lightgray]{0}[] objective.enemyairunits = [accent]Производство вражеских воздушных единиц начнется через [lightgray]{0}[] objective.enemyunitproduction = [accent]Производство вражеских единиц начнется в [lightgray]{0}[] objective.destroycore = [accent]Уничтожьте вражеское ядро @@ -1174,7 +1173,7 @@ stat.powerdamage = Энергия/урон stat.itemcapacity = Вместимость предметов stat.memorycapacity = Размер памяти stat.basepowergeneration = Базовая генерация энергии -stat.meltdowntime = Meltdown Time +stat.meltdowntime = Время до расплавления stat.productiontime = Время производства stat.warmuptime = Время разогрева stat.repairtime = Время полного ремонта @@ -1306,8 +1305,8 @@ bar.liquid = Жидкости bar.heat = Нагрев bar.cooldown = Перезарядка bar.instability = Нестабильность -bar.whenfull = when full -bar.nevermelts = never melts +bar.whenfull = если заполнен +bar.nevermelts = не плавится bar.heatamount = Нагрев: {0} bar.heatpercent = Нагрев: {0} ({1}%) bar.power = Энергия @@ -2448,11 +2447,11 @@ block.illuminator.description = Излучает свет. block.message.description = Сохраняет сообщение для связи между союзниками. block.reinforced-message.description = Сохраняет сообщение для связи между союзниками. block.world-message.description = Блок сообщения для использования в создании карт. Не может быть уничтожен. -block.world-processor.description = A processor for use in mapmaking. Cannot be destroyed. Capable of using privileged instructions, such as those that spawn units or change tiles. -block.world-cell.description = A memory cell for use in mapmaking. Cannot be destroyed. -block.world-switch.description = A switch block for use in mapmaking. Cannot be destroyed. Can only be interacted by players on the same team. -block.shield-projector.description = An unbreakable shield projector for use in mapmaking. -block.large-shield-projector.description = An unbreakable shield projector for use in mapmaking. +block.world-processor.description = Блок процессора для использования в создании карт. Не может быть уничтожен. Может выполнять привилегированные инструкции, такие как создание боевых единиц или изменение блоков. +block.world-cell.description = Блок памяти для использования в создании карт. Не может быть уничтожен. +block.world-switch.description = Блок переключателя для использования в создании карт. Не может быть уничтожен. Может быть переключён только игроками из такой же команды. +block.shield-projector.description = Неразрушимый щит для использования в создании карт. +block.large-shield-projector.description = Неразрушимый щит для использования в создании карт. block.graphite-press.description = Сжимает куски угля в листы графита. block.multi-press.description = Сжимает куски угля в листы графита. Требуется вода в качестве охлаждающей жидкости. block.silicon-smelter.description = Синтезирует кремний из песка и угля. @@ -2795,10 +2794,10 @@ lst.weathersense = Проверяет состояние погоды. lst.weatherset = Устанавливает погоду. lst.spawnwave = Имитация волны, создаваемой в произвольном месте.\nСчетчик волн не увеличивается. lst.explosion = Создает взрыв на локации. -lst.setrate = Устанавливает скорость выполнения процессора в инструкциях/тиках. +lst.setrate = Устанавливает скорость выполнения процессора в инструкциях/тиках.\nНе может превысить максимальную скорость процессора. lst.fetch = Ищет единицы, ядра, игроков или зданий по индексу.\nИндексы начинаются с 0 и заканчиваются возвращаемым числом. lst.packcolor = Упаковывает компоненты RGBA [0, 1] в один номер для рисования или установки правил. -lst.unpackcolor = Unpack RGBA components from a color that was packed using Pack Color. +lst.unpackcolor = Распаковывает компоненты RGBA, ранее упакованные с Pack Color. lst.setrule = Устанавливает игровое правило. lst.flushmessage = Отображает сообщение из текстового буфера на экране игрока.\nБудет ожидать окончание предыдущего сообщения. lst.cutscene = Управляет камерой игрока. diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 3b13cc4811..28f0dc7906 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -861,8 +861,7 @@ objective.build = [accent]Sagradi: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Proizvedi Jedinica: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Uništi: [][lightgray]{0}[]x Jedinica objective.enemiesapproaching = [accent]Neprijatelji dolaze za: [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Neprijateljska proizvodnja se umnožava za [lightgray]{0}[] +objective.enemyescalating = [accent]Neprijateljska proizvodnja se umnožava za [lightgray]{0}[] objective.enemyairunits = [accent]Neprijateljska vazdušna proizvodnja počinje za [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Uništi Neprijateljsko Jezgro diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index e5ef9c5b30..1ed8729b63 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index e71c56067f..9ab80c71fb 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -861,8 +861,7 @@ objective.build = [accent]สร้าง: [][lightgray]{0}[]x\n{1}[lightgray]{2 objective.buildunit = [accent]ผลิตยูนิต: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]ทำลาย: [][lightgray]{0}[]x ยูนิต objective.enemiesapproaching = [accent]ศัตรูจะปรากฏตัวใน [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]โรงงานศัตรูจะทวีความรุนแรงขึ้นใน [lightgray]{0}[] +objective.enemyescalating = [accent]โรงงานศัตรูจะทวีความรุนแรงขึ้นใน [lightgray]{0}[] objective.enemyairunits = [accent]การผลิตยานบินศัตรูจะเริ่มใน [lightgray]{0}[] objective.enemyunitproduction = [accent]การผลิตยูนิตศัตรูจะเริ่มใน [lightgray]{0}[] objective.destroycore = [accent]ทำลายแกนกลางศัตรู diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 042068f3ef..0c4716927c 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -861,8 +861,7 @@ objective.build = [accent]Build: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] +objective.enemyescalating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 09dc7a40f9..d1b7ecfc52 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -463,7 +463,7 @@ saveimage = Resim Kaydet unknown = Bilinmeyen custom = Özel builtin = Yerleşik -modded = Modded +modded = Modlanmış map.delete.confirm = Bu haritayı silmek istediğinizden emin misiniz? Bunu geri alamazsınız! map.random = [accent]Rastgele Harita map.nospawn = Bu haritada oyuncunun doğacağı hiç bir Merkez yok! Düzenleyiciden bu haritaya {0} bir Merkez ekleyin. @@ -861,8 +861,7 @@ objective.build = [accent]İnşa Et: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Birim İnşa Et: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Yok Et: [][lightgray]{0}[]x Birim objective.enemiesapproaching = [accent]Düşman saldırısına: [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Düşman üretimi [lightgray]{0}[] içinde hızlanacak. +objective.enemyescalating = [accent]Düşman üretimi [lightgray]{0}[] içinde hızlanacak. objective.enemyairunits = [accent]Düşman hava birimi üretimi [lightgray]{0}[] içinde başlayacak. objective.enemyunitproduction = [accent]Düşman birim üretimi [lightgray]{0}[] içinde başlayacak. objective.destroycore = [accent]Düşman Merkezini Yok Et @@ -2055,8 +2054,8 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Konteyner -block.launch-pad.name = Fıralatış Rampası -block.advanced-launch-pad.name = Gelişmiş Fıralatış Rampası +block.launch-pad.name = Fırlatış Rampası +block.advanced-launch-pad.name = Gelişmiş Fırlatış Rampası block.landing-pad.name = İniş Rampası block.segment.name = Segment diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 5e08c2e7a0..612ab78218 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -19,7 +19,7 @@ clipboardcopy = Цей сервер хоче скопіювати текст д linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. -screenshot.error = Failed to take screenshot. Your device likely does not support screenshots this large. +screenshot.error = Не вдалося зробити зняток мапи. Мабуть, ваш пристрій не підтримує настільки великі знятки. gameover = Гра завершена gameover.disconnect = Від’єднатися gameover.pvp = [accent]{0}[] перемогли! @@ -62,7 +62,7 @@ export.file = Експортувати файл import.file = Імпортувати файл copy.clipboard = Копіювати в буфер обміну load.clipboard = Імпортувати з клавіатури -workshop.browse = Browse Workshop +workshop.browse = Шукати в Майстерні workshop.share = Поширити в Майстерню schematic = Схема @@ -151,8 +151,8 @@ mods.viewcontent = Подивитися вміст mods.reload = Перезавантажити mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації mods.update.available = [lightgray]Доступне оновлення: {0} -mods.update.all = Update All Mods -mods.downloading = [accent]Downloading Mod: {0} +mods.update.all = Оновити всі модифікації +mods.downloading = [accent]Завантаження модифікації: {0} mod.warning = ⚠ Mods can execute arbitrary code.\n\nNever download mods from sources you don't trust - they could steal data or compromise your computer. mod.warning.read = I actually read this @@ -285,12 +285,12 @@ servers.remote = Віддалені сервери servers.global = Глобальні сервери servers.disclaimer = Сервери спільноти [accent]не[] належать чи контролюються власником.\n\nСервери можуть містити користувацький вміст, що не підходить для якогось віку. -servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust! +servers.connect.confirm = Під'єднатися до цього сервера?\n\n[accent]{0}[]\n\nПід'єднуйтеся лише до серверів, яким ви довіряєте! servers.showhidden = Показати приховані сервери server.shown = Показано server.hidden = Приховано -servers.sortping = Sorting By: Ping -servers.sortplayers = Sorting By: Player Count +servers.sortping = Сортувати за затримкою +servers.sortplayers = Сортувати за кількістю гравців viewplayer = Перегляд гравця: [accent]{0} trace = Стежити за гравцем @@ -339,7 +339,7 @@ disconnect.timeout = Час вийшов. disconnect.data = Не вдалося завантажити світові дані! disconnect.snapshottimeout = Час вийшов під час отримання даних UDP. Це могло статися через нестабільну мережу або з’єднання. cantconnect = Не вдалося під’єднатися до гри ([accent]{0}[]). -disconnect.reason = Disconnected: {0} +disconnect.reason = Відключено: {0} connecting = [accent]Приєднання… reconnecting = [accent]Повторне з’єднання… @@ -555,49 +555,49 @@ patch.fields = Кількість полів: {0} bundle.lines = {0} Ліній images = Зображення -asset.title = Data Patches & Assets +asset.title = Патчі даних та вміст asset.guide = Гайд на використання -asset.bundle.exists = A bundle with path '{0}' already exists. +asset.bundle.exists = Пакет локалізації за шляхом '{0}' вже існує. asset.importzip = Імпортувати ресурси Zip asset.exportzip = Експортувати ресурси Zip asset.image.importzip = Імпортувати Zip asset.image.exportzip = Експортувати Zip asset.clearall = Очистити все asset.clearall.confirm = Ти впевнений, що хочеш очистити [red]всі[] ресурси з цієї мапи?\nЦе включає зображення, звук, і т.д. -asset.path.invalid = Path is invalid! -asset.imports = Import Results -asset.imported = [accent]{0} assets imported. -asset.import.none = No valid asset files found in zip archive. -asset.content.errors = Content Errors -asset.content.add = Add Content -asset.content.type = Type: -asset.content.exists = [red]Content with that name already exists! -asset.content.badname = [red]Invalid name! Most symbols are not allowed. -asset.content.import.file = Import File -asset.content.import.clipboard = Import From Clipboard -asset.exists = An asset of that type with the same path/name already exists:\n[lightgray]{0} -asset.exists.audio = A sound/music asset with that name is already loaded:\n[lightgray]{0} -asset.broken = This asset file could not be located.\nThis can be caused by improper import of data, or an incorrectly exported save. -asset.audio.invalid = Audio file could not be loaded.\nEnsure that it is a valid OGG or MP3 file. +asset.path.invalid = Недійсний шлях! +asset.imports = Результати імпорту +asset.imported = [accent]{0} файлів вмісту імпортовано. +asset.import.none = В Zip не знайдено дійсних файлів вмісту. +asset.content.errors = Помилки контенту +asset.content.add = Додати контент +asset.content.type = Тип: +asset.content.exists = [red]Контент із такою назвою вже існує! +asset.content.badname = [red]Недійсна назва! Використання більшості символів заборонено. +asset.content.import.file = Імпортувати файл +asset.content.import.clipboard = Імпортувати з буфера обміну +asset.exists = Файл вмісту цього типу з таким самим шляхом або назвою вже існує:\n[lightgray]{0} +asset.exists.audio = Звуковий або музичний вміст з такою назвою вже завантажено:\n[lightgray]{0} +asset.broken = Цей файл вмісту не вдалося знайти.\nЦе могло статися через неправильний імпорт даних або помилку під час експорту збереження. +asset.audio.invalid = Не вдалося завантажити аудіофайл.\nПереконайтесь, що це дійсний файл OGG або MP3. asset.delete.confirm = Ви дійсно хочете видалити цей ресурс? -asset.images = Data Patch Images -asset.image.imports = Import Results -asset.image.imported = [accent]{0} images imported. -asset.image.none = No valid PNG files found in zip archive. -asset.image.error = [red]The following errors were encountered:[] +asset.images = Зображення патчів даних +asset.image.imports = Результати імпорту +asset.image.imported = [accent]{0} зображень імпортовано. +asset.image.none = В Zip не знайдено дійсних файлів PNG. +asset.image.error = [red]Виникли такі помилки:[] asset.image.clearall.confirm = Ти впевнений, що хочеш очистити [red]всі[] зображення?\nЦе включає зображення, звук, і т.д. -asset.image.info = Image Info -asset.image.toolarge = Image ([lightgray]{0}x{1}[]) is too large. Maximum size is {2}x{3}. -asset.image.exists = An image with that path/name already exists:\n[lightgray]{0} +asset.image.info = Інформація про зображення +asset.image.toolarge = Зображення ([lightgray]{0}x{1}[]) завелике. Максимальний розмір: {2}x{3}. +asset.image.exists = Зображення з таким шляхом або назвою вже існує:\n[lightgray]{0} asset.image.delete.confirm = Ти точно хочеш видалити це зображення? asset.image.name = [accent]Назва файлу: [lightgray]{0} asset.image.region.name = [accent]Region Name: [lightgray]{0} asset.image.path = [accent]Шлях: [lightgray]{0} -asset.image.env = [accent]Uses Environment Atlas: [lightgray]{0} +asset.image.env = [accent]Використовує атлас середовища: [lightgray]{0} asset.image.size = [accent]Розмір: [lightgray]{0}x{1} asset.image.filesize = [accent]Розмір файлу: [lightgray]{0} -asset.image.packfailed = [red]⚠ Failed to pack sprite![] -asset.image.packfailed.env = This is likely caused by a lack of space in the environment atlas.\nNote that environment sprites are limited to a 512x512 total area. +asset.image.packfailed = [red]⚠ Не вдалося запакувати спрайт![] +asset.image.packfailed.env = Найімовірніше, це сталося через брак місця в атласі середовища.\nЗверніть увагу, що загальна площа спрайтів середовища обмежена розміром 512x512. asset.emoji.delete = Delete Selected ({0}) asset.emoji.notfound = Image with specified name not found. @@ -647,7 +647,7 @@ details = Подробиці… edit = Змінити… edit.menu = Змінити... variables = Змінні -logic.error.toolong = Processor code too long (Limit: {0} compressed bytes, actual length: {1} bytes) +logic.error.toolong = Код процесора задовгий (ліміт: {0} стиснених байтів, фактична довжина: {1} байтів) logic.clear.confirm = Ви впевнені, що хочете очистити весь код в цьому процесорі? logic.restart = Перезавантажити logic.globals = Вбудовані змінні @@ -861,8 +861,7 @@ objective.build = [accent]Збудуйте: [][lightgray]{0}[]x\n{1}[lightgray]{ objective.buildunit = [accent]Сконструюйте одиницю: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Знищте: [][lightgray]{0}[]x одиниць objective.enemiesapproaching = [accent]Вороги наблизяться через [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Нарощування ворожого виробництва почнеться через [lightgray]{0}[] +objective.enemyescalating = [accent]Нарощування ворожого виробництва почнеться через [lightgray]{0}[] objective.enemyairunits = [accent]Виробництво ворожих повітряних одиниць почнеться через [lightgray]{0}[] objective.enemyunitproduction = [accent]Виробництво ворожих одиниць почнеться через [lightgray]{0}[] objective.destroycore = [accent]Знищте вороже ядро @@ -1129,7 +1128,7 @@ settings.clearplanetcampaignsaves.confirm = Ви справді хочете о paused = [accent]< Пауза > clear = Очистити banned = [scarlet]Заблоковано -block.limit = [scarlet]Limit: {0} Buildings +block.limit = [scarlet]Ліміт будівель: {0} unsupported.environment = [scarlet]Непідтримуване середовище yes = Так no = Ні @@ -1159,7 +1158,7 @@ stat.targetsground = Наземні противники stat.crushdamage = Шкода трощенням stat.legsplashdamage = Шкода ніг по ділянці stat.itemsmoved = Швидкість переміщення -stat.itemsmoved.info = Throughput is often not linear and tied to FPS/TPS. +stat.itemsmoved.info = Швидкість переміщення часто нелінійна й залежить від FPS/TPS. stat.launchtime = Час між запусками stat.shootrange = Радіус дії stat.size = Розмір @@ -1174,7 +1173,7 @@ stat.powerdamage = Енергії за од. шкоди stat.itemcapacity = Місткість предметів stat.memorycapacity = Місткість пам’яті stat.basepowergeneration = Базова генерація енергії -stat.meltdowntime = Meltdown Time +stat.meltdowntime = Час розплавлення stat.productiontime = Час виробництва stat.warmuptime = Час розігріву stat.repairtime = Час повного відновлення будівлі @@ -1184,7 +1183,7 @@ stat.bullet = Кулі stat.moduletier = Рівень модуля stat.unittype = Тип одиниці stat.receiverate = Receiving Rate -stat.receiverate.info = Affected by overdrive. Throughput can be increased by placing additional unloaders. +stat.receiverate.info = Враховує прискорення. Швидкість переміщення можна збільшити, якщо розмістити додаткові розвантажувачі. stat.speedincrease = Збільшення швидкості stat.range = Радіус дії stat.drilltier = Видобуває @@ -1306,8 +1305,8 @@ bar.liquid = Рідина bar.heat = Нагрівання bar.cooldown = Охолодження bar.instability = Нестабільність -bar.whenfull = when full -bar.nevermelts = never melts +bar.whenfull = коли повний +bar.nevermelts = ніколи не плавиться bar.heatamount = Нагрівання: {0} bar.heatpercent = Нагрівання: {0} ({1}%) bar.power = Енергія @@ -1442,7 +1441,7 @@ setting.fullscreen.name = Повноекранний режим setting.fps.name = Показувати FPS і затримку до сервера setting.console.name = Увімкнути консоль setting.drawhitboxes.name = Показати хітбокси -setting.showperformance.name = Display Performance Metrics +setting.showperformance.name = Відображати показники продуктивності setting.buildingtimestep.name = Fixed Building Timestep setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option. setting.smoothcamera.name = Гладка камера @@ -1587,9 +1586,9 @@ keybind.chat_mode.name = Змінити режим чату keybind.drop_unit.name = Скинути бойову одиницю keybind.zoom_minimap.name = Збільшити мінімапу keybind.detach_camera.name = Перемкнути вільну камеру -keybind.teleport_cursor.name = Teleport To Cursor (Sandbox) +keybind.teleport_cursor.name = Телепортуватися до курсора (пісочниця) keybind.debug_hitboxes.name = Перемкнути область влучання -keybind.performance_metrics.name = Toggle Performance Metrics +keybind.performance_metrics.name = Перемкнути показники продуктивності mode.help.title = Опис режимів гри mode.survival.name = Виживання mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. @@ -2222,9 +2221,9 @@ block.disperse.name = Розпорошувач block.afflict.name = Уражач block.lustre.name = Блиск block.scathe.name = Знищувач -block.scathe.carbide.info = Travels significantly faster.\nModerate damage at any range. -block.scathe.surge-alloy.info = Splits into micro missiles.\nHeavy damage at close distance. -block.scathe.phase-fabric.info = Equipped with a force field.\nLow damage, largest radius. +block.scathe.carbide.info = Летить набагато швидше.\nСередня шкода на будь-якій відстані. +block.scathe.surge-alloy.info = Розлітається на мікроракети.\nВелика шкода на близькій відстані. +block.scathe.phase-fabric.info = Оснащений силовим полем.\nМала шкода, найбільший радіус. block.tank-refabricator.name = Танковий перебудовний завод block.mech-refabricator.name = Меховий перебудовний завод block.ship-refabricator.name = Корабельний перебудовний завод @@ -2448,11 +2447,11 @@ block.illuminator.description = Англійська назва: Illuminator\nВ block.message.description = Англійська назва: Message\nЗберігає повідомлення для комунікації між союзниками. block.reinforced-message.description = Англійська назва: Reinforced Message\nЗберігає повідомлення для комунікації між союзниками. block.world-message.description = Англійська назва: World Message\nБлок повідомлення для використання у створенні мап. Не можна знищити. -block.world-processor.description = A processor for use in mapmaking. Cannot be destroyed. Capable of using privileged instructions, such as those that spawn units or change tiles. -block.world-cell.description = A memory cell for use in mapmaking. Cannot be destroyed. -block.world-switch.description = A switch block for use in mapmaking. Cannot be destroyed. Can only be interacted by players on the same team. -block.shield-projector.description = An unbreakable shield projector for use in mapmaking. -block.large-shield-projector.description = An unbreakable shield projector for use in mapmaking. +block.world-processor.description = Англійська назва: World Processor\nПроцесор для використання у створенні мап. Не можна знищити. Здатний використовувати привілейовані інструкції, як-от породження одиниць або зміна плиток. +block.world-cell.description = Англійська назва: World Cell\nКомірка пам'яті для використання у створенні мап. Не можна знищити. +block.world-switch.description = Англійська назва: World Switch\nПеремикач для використання у створенні мап. Не можна знищити. Взаємодіяти з ним можуть лише гравці з тієї самої команди. +block.shield-projector.description = Англійська назва: Barrier Projector\nНезнищенний щитовий проєктор для використання у створенні мап. +block.large-shield-projector.description = Англійська назва: Large Barrier Projector\nНезнищенний щитовий проєктор для використання у створенні мап. block.graphite-press.description = Англійська назва: Graphite Press\nСтискає вугілля в графіт. block.multi-press.description = Англійська назва: Multi Press\nСтискає вугілля в графіт. Потребує воду для охолодження. block.silicon-smelter.description = Англійська назва: Silicon Smelter\nСинтезує пісок із вугіллям для отримання кремнію. @@ -3055,4 +3054,4 @@ lenum.solarmultiplier = Множник вихідної енергії соня lenum.dragmultiplier = Множник опору середовища. lenum.ban = Блоки або одиниці, які заборонено розміщувати чи будувати. lenum.unban = Розблокувати одиницю або блок. -lenum.musicvolume = Global music volume multiplier.\nClamped to [0, 1]. +lenum.musicvolume = Коефіцієнт гучності загальної музики.\nОбмежений діапазоном [0, 1]. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 37ef368b68..3a69136789 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -216,7 +216,7 @@ mod.dependencies.imported = Bản mod này cần có các phụ thuộc. Có t about.button = Giới thiệu name = Tên: -noname = Hãy nhập một[accent] tên người chơi[] trước. +noname = Hãy chọn một[accent] tên người chơi[] trước. search = Tìm kiếm: planetmap = Bản đồ hành tinh launchcore = Phóng lõi @@ -289,8 +289,8 @@ servers.connect.confirm = Tham gia máy chủ sau?\n\n[accent]{0}[]\n\nChỉ k servers.showhidden = Hiện máy chủ ẩn server.shown = Đã hiện server.hidden = Đã ẩn -servers.sortping = Sorting By: Ping -servers.sortplayers = Sorting By: Player Count +servers.sortping = Sắp Xếp Theo: Ping +servers.sortplayers = Sắp Xếp Theo: Số Người Chơi viewplayer = Đang xem người chơi: [accent]{0} trace = Truy vết người chơi @@ -564,7 +564,7 @@ asset.image.importzip = Nhập Gói Zip Hình Ảnh asset.image.exportzip = Xuất Gói Zip Hình Ảnh asset.clearall = Xóa Tất Cả asset.clearall.confirm = Bạn có chắc rằng bạn muốn xóa [red]tất cả[] tài sản khỏi bản đồ này?\nBao gồm cả hình ảnh, âm thanh, nội dung, v.v... -asset.path.invalid = Path is invalid! +asset.path.invalid = Đường dẫn không hợp lệ! asset.imports = Kết Quả Nhập asset.imported = [accent]{0} tài sản đã nhập. asset.import.none = Không tìn thấy tập tin tài sản hợp lệ trong lưu trữ zip. @@ -861,8 +861,7 @@ objective.build = [accent]Xây: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Tạo đơn vị: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Tiêu diệt: [][lightgray]{0}[]x Đơn vị objective.enemiesapproaching = [accent]Kẻ địch đến sau [lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]Kẻ địch leo thang sản xuất sau [lightgray]{0}[] +objective.enemyescalating = [accent]Kẻ địch leo thang sản xuất sau [lightgray]{0}[] objective.enemyairunits = [accent]Kẻ địch bắt đầu sản xuất đơn vị không quân sau [lightgray]{0}[] objective.enemyunitproduction = [accent]Kẻ địch bắt đầu sản xuất đơn vị sau [lightgray]{0}[] objective.destroycore = [accent]Phá huỷ lõi kẻ địch @@ -1174,7 +1173,7 @@ stat.powerdamage = Năng lượng/Sát thương stat.itemcapacity = Sức chứa vật phẩm stat.memorycapacity = Dung lượng bộ nhớ stat.basepowergeneration = Năng lượng tạo ra cơ bản -stat.meltdowntime = Meltdown Time +stat.meltdowntime = Thời Gian Tan Chảy stat.productiontime = Thời gian sản xuất stat.warmuptime = Thời Gian Khởi Động stat.repairtime = Thời gian hoàn thành sửa chữa @@ -1306,8 +1305,8 @@ bar.liquid = Chất lỏng bar.heat = Nhiệt lượng bar.cooldown = Thời gian hồi bar.instability = Bất ổn định -bar.whenfull = when full -bar.nevermelts = never melts +bar.whenfull = khi đầy +bar.nevermelts = không bao giờ tan chảy bar.heatamount = Nhiệt lượng: {0} bar.heatpercent = Nhiệt lượng: {0} ({1}%) bar.power = Năng lượng @@ -1562,7 +1561,7 @@ keybind.select_all_unit_factories.name = Chọn tất cả các nhà máy đơn keybind.select_all_unit_transport.name = Chọn tất cả các đơn vị vận chuyển keybind.select_across_screen.name = Chọn toàn màn hình (Giữ) keybind.deselect.name = Bỏ chọn -keybind.pickupCargo.name = Nhặt hàng +keybind.pickupCargo.name = Nhặt Hàng keybind.dropCargo.name = Thả hàng keybind.shoot.name = Bắn keybind.zoom.name = Thu phóng @@ -2349,7 +2348,7 @@ frontier.tutorial3 = [accent]Tấn công căn cứ kẻ địch nhanh chóng đ atolls.destroy1 = Tiêu diệt 2 [accent]lõi trụ sở[] trước.\n[accent]Tiếp cận quặng thori[]. atolls.mega1 = Vào [accent]chế độ mệnh lệnh[] và chọn các đơn vị :mega:[accent]Mega[]. -atolls.mega2 = Chọn lệnh \ue87b [accent]Nhận Đơn Vị[] để các đơn vị Mega nhận các đơn vị lục quân. +atolls.mega2 = Chọn lệnh \ue87b [accent]Nhận Đơn Vị[] để các đơn vị Mega nhặt các đơn vị lục quân. atolls.mega3 = Di chuyển các đơn vị Mega [accent]phía trên[] các đơn vị lục quân để nhận chúng. atolls.mega4 = [accent]Thả các đơn vị lục quân ở đây để tấn công. atolls.mega5 = Chọn lệnh \ue879 [accent]Dỡ Khối Hàng[] để các đơn vị Mega thả các đơn vị chúng đã mang theo. @@ -2360,7 +2359,7 @@ atolls.attack1 = 1: Thả các đơn vị lục quân ở đây để tấn côn atolls.attack2 = 2: Ngoài ra, thả các đơn vị thủy quân ở đây để tấn công bất ngờ. atolls.carry1 = Mang các đơn vị lục quân cần có các đơn vị :mega:[accent]Mega[]. atolls.carry2 = 1: Ra lệnh các đơn vị Mega để [accent]di chuyển bên trên[] các đơn vị lục quân. -atolls.carry3 = 2: Chọn lệnh \ue87b [accent]Nhận Đơn Vị[] để yêu cầu nhận các đơn vị lục quân với các đơn vị Mega. +atolls.carry3 = 2: Chọn lệnh \ue87b [accent]Nhận Đơn Vị[] để ra lệnh nhặt các đơn vị lục quân với các đơn vị Mega. atolls.carry4 = 3: Ra lệnh và di chuyển Mega [accent]chứa các đơn vị[]. atolls.carry5 = 4: Chọn lệnh \ue879 [accent]'Dỡ Khối Hàng'[] để các đơn vị Mega thả các đơn vị lục quân. atolls.carry6 = Những bước này có thể xem lại [accent]ở đây[]. @@ -2394,10 +2393,10 @@ onset.commandmode = Giữ [accent]Shift[] để vào [accent]chế độ mệnh onset.commandmode.mobile = Nhấn vào [accent]nút mệnh lệnh[] để vào [accent]chế độ mệnh lệnh[].\nGiữ một ngón tay, sau đó [accent]kéo[] để chọn các đơn vị.\n[accent]Nhấp[] để ra lệnh các đơn vị di chuyển hoặc tấn công. aegis.tungsten = Tungsten có thể khai thác bằng [accent]khoan thủy lực[].\nCông trình này cần có [accent]nước[] và [accent]điện[]. -split.pickup = Một số khối có thể được mang theo bởi đơn vị từ lõi.\nNhấn vào [accent]thùng chứa[] và đặt nó lên [accent]máy nạp vật phẩm[].\n(Phím mặc định là [[ và ] để mang theo và thả) -split.pickup.mobile = Một số khối có thể được mang theo bởi đơn vị từ lõi.\nNhấp vào [accent]thùng chứa[] và đặt nó lên [accent]máy nạp vật phẩm[].\n(Để mang theo hoặc thả thứ gì đó, ấn giữ nó một chút.) +split.pickup = Một số khối có thể được mang theo bởi đơn vị từ lõi.\nBay lại trên [accent]thùng chứa[] này, nhặt và đặt nó lên [accent]máy nạp vật phẩm[].\n(Phím mặc định là [accent][[[]và [accent]][]để nhặt và thả) +split.pickup.mobile = Một số khối có thể được mang theo bởi đơn vị từ lõi.\nBay lại trên [accent]thùng chứa[] này, nhặt và đặt nó lên [accent]máy nạp vật phẩm[].\n(Để nhặt hoặc thả thứ gì đó, ấn giữ nó một chút.) split.acquire = Khai thác một ít tungsten để sản xuất đơn vị. -split.build = Đơn vị phải được vận chuyển đến phía bên kia của tường.\nĐặt hai [accent]Máy phóng từ trường khối hàng[], một ở mỗi bên của tường.\nĐặt liên kết bằng cách nhấp vào một trong số chúng, sau đó chọn cái còn lại. +split.build = Đơn vị phải được vận chuyển đến phía bên kia của tường.\nNghiên cứu :payload-mass-driver: [accent]Máy phóng từ trường[].\nĐặt hai [accent]Máy phóng từ trường khối hàng[], một ở mỗi bên của tường.\nĐặt liên kết bằng cách nhấp vào một trong số chúng, sau đó chọn cái còn lại. split.container = Tương tự như thùng chứa, đơn vị cũng có thể được vận chuyển bằng [accent]Máy phóng từ trường khối hàng[].\nĐặt một máy chế tạo đơn vị cạnh máy phóng từ trường để nạp chúng, sau đó gửi chúng qua tường để tấn công căn cứ địch. item.copper.description = Dùng trong tất cả các loại xây dựng và các loại đạn dược. @@ -2448,11 +2447,11 @@ block.illuminator.description = Phát sáng. block.message.description = Lưu trữ thông điệp giao tiếp giữa các đồng đội. block.reinforced-message.description = Lưu trữ thông điệp giao tiếp giữa các đồng đội. block.world-message.description = Một khối thông điệp đùng để sử dụng trong việc tạo bản đồ. Không thể bị phá hủy. -block.world-processor.description = A processor for use in mapmaking. Cannot be destroyed. Capable of using privileged instructions, such as those that spawn units or change tiles. -block.world-cell.description = A memory cell for use in mapmaking. Cannot be destroyed. -block.world-switch.description = A switch block for use in mapmaking. Cannot be destroyed. Can only be interacted by players on the same team. -block.shield-projector.description = An unbreakable shield projector for use in mapmaking. -block.large-shield-projector.description = An unbreakable shield projector for use in mapmaking. +block.world-processor.description = Một bộ vi xử lý dùng trong tạo bản đồ. Không thể bị phá hủy. Có khả năng dùng các chỉ lệnh đặc quyền, như là xuất hiện các đơn vị hoặc đổi nền. +block.world-cell.description = Một bộ nhớ dùng trong tạo bản đồ. Không thể bị phá hủy. +block.world-switch.description = Một công tắc dùng trong tạo bản đồ. Không thể bị phá hủy. Chỉ có thể thao tác bởi người chơi cùng đội. +block.shield-projector.description = Một máy phát khiên chắn không thể phá vỡ dùng trong tạo bản đồ. +block.large-shield-projector.description = Một máy phát khiên chắn không thể phá vỡ dùng trong tạo bản đồ. block.graphite-press.description = Nén than thành than chì. block.multi-press.description = Nén than thành than chì. Cần nước làm mát. block.silicon-smelter.description = Tinh chế silicon từ cát và than. @@ -2795,7 +2794,7 @@ lst.weathersense = Kiểm tra kiểu thời tiết có đang hoạt động. lst.weatherset = Thiết lập trạng thái hiện tại của kiểu thời tiết. lst.spawnwave = Làm xuất hiện một đợt. lst.explosion = Tạo ra một vụ nổ tại một vị trí. -lst.setrate = Đặt tốc độ thực thi khối xử lý theo chỉ lệnh/tích-tắc. +lst.setrate = Đặt tốc độ thực thi khối xử lý theo chỉ lệnh/tích-tắc.\nKhông thể vượt quá tốc độ thực thi tối đa. lst.fetch = Tra cứu các đơn vị, lõi, người chơi hoặc công trình bằng chỉ số.\nCác chỉ số bắt đầu từ 0 và kết thúc tại số lượng đếm của chúng. lst.packcolor = Đóng gói màu thành phần RGBA [0, 1] thành một số đơn dùng cho vẽ hoặc thiết lập quy tắc. lst.unpackcolor = Mở đóng gói thành phần RGBA từ một màu đã đóng gói bằng Pack Color. @@ -3012,7 +3011,7 @@ lenum.targetp = Bắn vào một mục tiêu với tốc độ dự đoán. lenum.itemdrop = Thả một vật phẩm. lenum.itemtake = Lấy một vật phẩm từ một công trình. lenum.paydrop = Thả khối hàng hiện tại. -lenum.paytake = Nhận khối hàng tại vị trí hiện tại. +lenum.paytake = Nhặt khối hàng tại vị trí hiện tại. lenum.payenter = Vào trong/hạ cánh trên khối hàng mà đơn vị đang ở trên nó. lenum.flag = Cờ đơn vị kiểu số. lenum.mine = Đào tại một vị trí. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 74725f57a5..e53db10968 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -154,10 +154,10 @@ mods.update.available = [lightgray]有可用更新:{0} mods.update.all = 更新所有模组 mods.downloading = [accent]正在下载模组:{0} -mod.warning = ⚠ Mods can execute arbitrary code.\n\nNever download mods from sources you don't trust - they could steal data or compromise your computer. -mod.warning.read = I actually read this -mod.warning.accept = I accept the responsibility -mod.warning.deny = Disable my mods +mod.warning = ⚠ 模组可能加载任意代码。\n\n不要从不信任的来源下载模组——它们可能会偷取你的数据或者损害设备。 +mod.warning.read = 我已阅读完毕 +mod.warning.accept = 我对此负责 +mod.warning.deny = 禁用此模组 mod.installed = [[已安装] mod.display = [gray]模组:[orange] {0} mod.enabled = [lightgray]已启用 @@ -861,8 +861,7 @@ objective.build = [accent]建造:[][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]生产单位:[][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]摧毁单位:[][lightgray]{0}[]x objective.enemiesapproaching = [accent]敌人来袭:[lightgray]{0}[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]敌方在[lightgray]{0}[]后扩大单位生产 +objective.enemyescalating = [accent]敌方在[lightgray]{0}[]后扩大单位生产 objective.enemyairunits = [accent]敌方在[lightgray]{0}[]后开始生产空军单位 objective.enemyunitproduction = [accent]敌方在[lightgray]{0}[]后开始生产单位 objective.destroycore = [accent]摧毁敌方核心 @@ -1174,7 +1173,7 @@ stat.powerdamage = 电力/伤害 stat.itemcapacity = 物品容量 stat.memorycapacity = 内存容量 stat.basepowergeneration = 基础电力输出 -stat.meltdowntime = Meltdown Time +stat.meltdowntime = 熔毁时间 stat.productiontime = 生产时间 stat.warmuptime = 预热时间 stat.repairtime = 建筑完全修复时间 @@ -1306,8 +1305,8 @@ bar.liquid = 液体 bar.heat = 热量 bar.cooldown = 冷却 bar.instability = 不稳定性 -bar.whenfull = when full -bar.nevermelts = never melts +bar.whenfull = (充满物品时) +bar.nevermelts = 永不熔毁 bar.heatamount = 热量:{0} bar.heatpercent = 热量:{0}({1}%) bar.power = 电力 @@ -2448,11 +2447,11 @@ block.illuminator.description = 提供照明。 block.message.description = 保存文字信息,用于队友间进行交流。 block.reinforced-message.description = 保存文字信息,用于队友间进行交流。 block.world-message.description = 一个用于制图的信息板。无法被摧毁。 -block.world-processor.description = A processor for use in mapmaking. Cannot be destroyed. Capable of using privileged instructions, such as those that spawn units or change tiles. -block.world-cell.description = A memory cell for use in mapmaking. Cannot be destroyed. -block.world-switch.description = A switch block for use in mapmaking. Cannot be destroyed. Can only be interacted by players on the same team. -block.shield-projector.description = An unbreakable shield projector for use in mapmaking. -block.large-shield-projector.description = An unbreakable shield projector for use in mapmaking. +block.world-processor.description = 一个用于制图的处理器。无法被摧毁。可使用特殊指令,如生成单位或改变地块。 +block.world-cell.description = 一个用于制图的内存元。无法被摧毁。 +block.world-switch.description = 一个用于制图的开关。无法被摧毁。只能与同队玩家交互。 +block.shield-projector.description = 一个用于制图的护盾投影。无法被摧毁。 +block.large-shield-projector.description = 一个用于制图的护盾投影。无法被摧毁。 block.graphite-press.description = 将煤炭压缩为石墨。 block.multi-press.description = 将煤炭压缩为石墨,需要水进行冷却。 block.silicon-smelter.description = 将沙和煤炭精炼为硅。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 6581c013ba..17e5324d65 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -861,8 +861,7 @@ objective.build = [accent]建造:[][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]產生單位:[][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]摧毀:[][lightgray]{0}[]x 單位 objective.enemiesapproaching = [accent]的人在 [lightgray]{0} 到達[] -#TODO: fix the typo (escelating -> escalating) and update every objective that uses it -objective.enemyescelating = [accent]敵人在[lightgray]{0}[]後擴大單位生產 +objective.enemyescalating = [accent]敵人在[lightgray]{0}[]後擴大單位生產 objective.enemyairunits = [accent]敵人在[lightgray]{0}[]後產生空軍單位 objective.enemyunitproduction = [accent]敵方單位將在[lightgray]{0}[]後開始生成 objective.destroycore = [accent]摧毀敵人核心 diff --git a/core/assets/contributors b/core/assets/contributors index 84fc3b04d7..3963cd528b 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -194,6 +194,8 @@ Jovinull Alon 硫缺铅/PyratiteNoLead Space +DeterMination NeilGreenFly Sunky.MP3G jhonnata.andre +Zaxerf1234 \ No newline at end of file diff --git a/core/assets/maps/erekir/crossroads.msav b/core/assets/maps/erekir/crossroads.msav index be583d26fd..3eb8a3e2d9 100644 Binary files a/core/assets/maps/erekir/crossroads.msav and b/core/assets/maps/erekir/crossroads.msav differ diff --git a/core/assets/maps/erekir/origin.msav b/core/assets/maps/erekir/origin.msav index f3a9763229..c3af45d6aa 100644 Binary files a/core/assets/maps/erekir/origin.msav and b/core/assets/maps/erekir/origin.msav differ diff --git a/core/assets/maps/erekir/siege.msav b/core/assets/maps/erekir/siege.msav index a3be106191..f5e9ed3a92 100644 Binary files a/core/assets/maps/erekir/siege.msav and b/core/assets/maps/erekir/siege.msav differ diff --git a/core/assets/maps/erekir/stronghold.msav b/core/assets/maps/erekir/stronghold.msav index d0315f7979..7577757d13 100644 Binary files a/core/assets/maps/erekir/stronghold.msav and b/core/assets/maps/erekir/stronghold.msav differ diff --git a/core/assets/maps/serpulo/hidden/127.msav b/core/assets/maps/serpulo/hidden/127.msav index 64c98ad1e7..dabf995cf3 100644 Binary files a/core/assets/maps/serpulo/hidden/127.msav and b/core/assets/maps/serpulo/hidden/127.msav differ diff --git a/core/assets/maps/serpulo/hidden/161.msav b/core/assets/maps/serpulo/hidden/161.msav index 716afba48c..30e14529d5 100644 Binary files a/core/assets/maps/serpulo/hidden/161.msav and b/core/assets/maps/serpulo/hidden/161.msav differ diff --git a/core/assets/maps/serpulo/hidden/19.msav b/core/assets/maps/serpulo/hidden/19.msav index 4ae8975767..bcaf75dbd8 100644 Binary files a/core/assets/maps/serpulo/hidden/19.msav and b/core/assets/maps/serpulo/hidden/19.msav differ diff --git a/core/assets/maps/serpulo/hidden/197.msav b/core/assets/maps/serpulo/hidden/197.msav index b1677ea768..081360e978 100644 Binary files a/core/assets/maps/serpulo/hidden/197.msav and b/core/assets/maps/serpulo/hidden/197.msav differ diff --git a/core/assets/maps/serpulo/hidden/207.msav b/core/assets/maps/serpulo/hidden/207.msav index 92b991cf29..fb25d6f806 100644 Binary files a/core/assets/maps/serpulo/hidden/207.msav and b/core/assets/maps/serpulo/hidden/207.msav differ diff --git a/core/assets/maps/serpulo/hidden/225.msav b/core/assets/maps/serpulo/hidden/225.msav index 24ac0c5228..f6aa636d6e 100644 Binary files a/core/assets/maps/serpulo/hidden/225.msav and b/core/assets/maps/serpulo/hidden/225.msav differ diff --git a/core/assets/maps/serpulo/hidden/242.msav b/core/assets/maps/serpulo/hidden/242.msav index b9ec31a47d..efc92d1d19 100644 Binary files a/core/assets/maps/serpulo/hidden/242.msav and b/core/assets/maps/serpulo/hidden/242.msav differ diff --git a/core/assets/maps/serpulo/hidden/247.msav b/core/assets/maps/serpulo/hidden/247.msav index 9c6ccc497e..98b97148ef 100644 Binary files a/core/assets/maps/serpulo/hidden/247.msav and b/core/assets/maps/serpulo/hidden/247.msav differ diff --git a/core/assets/maps/serpulo/hidden/6.msav b/core/assets/maps/serpulo/hidden/6.msav index 5a8acb7265..4b14e829fe 100644 Binary files a/core/assets/maps/serpulo/hidden/6.msav and b/core/assets/maps/serpulo/hidden/6.msav differ diff --git a/core/assets/maps/serpulo/hidden/67.msav b/core/assets/maps/serpulo/hidden/67.msav index f892f47e54..0168704814 100644 Binary files a/core/assets/maps/serpulo/hidden/67.msav and b/core/assets/maps/serpulo/hidden/67.msav differ diff --git a/core/src/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java index 58c44e99c6..7bdc18ece1 100644 --- a/core/src/mindustry/ClientLauncher.java +++ b/core/src/mindustry/ClientLauncher.java @@ -60,19 +60,18 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Log.info("[GL] Version: @", graphics.getGLVersion()); Log.info("[GL] Max texture size: @", maxTextureSize); - if(NvGpuInfo.hasMemoryInfo()) Log.info("[GL] Total available VRAM: @mb", NvGpuInfo.getMaxMemoryKB()/1024); + if(NvGpuInfo.hasMemoryInfo()) Log.info("[GL] Total available VRAM: @", Strings.formatByteCount(NvGpuInfo.getMaxMemoryKB() * 1000L)); if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues."); Log.info("[JAVA] Version: @", OS.javaVersion); - if(Core.app.isAndroid()){ - Log.info("[ANDROID] API level: @", Core.app.getVersion()); - } + + if(Core.app.isAndroid()) Log.info("[ANDROID] API level: @", Core.app.getVersion()); + if(Core.app.isIOS()) Log.info("[iOS] OS version: @", Core.app.getVersion()); + long ram = Runtime.getRuntime().maxMemory(); - boolean gb = ram >= 1024 * 1024 * 1024; - if(!OS.isIos){ - Log.info("[RAM] Available: @ @", Strings.fixed(gb ? ram / 1024f / 1024 / 1024f : ram / 1024f / 1024f, 1), gb ? "GB" : "MB"); - } + + if(!OS.isIos) Log.info("[RAM] Available: @", Strings.formatByteCount(ram)); Time.setDeltaProvider(() -> { float result = Core.graphics.getDeltaTime() * 60f; diff --git a/core/src/mindustry/ai/UnitStance.java b/core/src/mindustry/ai/UnitStance.java index ff09b7eccb..c1140136d4 100644 --- a/core/src/mindustry/ai/UnitStance.java +++ b/core/src/mindustry/ai/UnitStance.java @@ -94,7 +94,6 @@ public class UnitStance extends MappableContent{ holdPosition = new UnitStance("holdposition", "effect", Binding.unitStanceHoldPosition); mineAuto = new UnitStance("mineauto", "settings", null, false); - //Only vanilla items are supported for now for(Item item : Vars.content.items()){ new ItemUnitStance(item); } @@ -102,4 +101,13 @@ public class UnitStance extends MappableContent{ Seq.with(UnitCommand.repairCommand, UnitCommand.assistCommand, UnitCommand.rebuildCommand) .each(c -> c.extraStances.add(holdPosition)); } + + public static void loadAfterMods(){ + //load stances for mod items + for(Item item : Vars.content.items()){ + if(ItemUnitStance.getByItem(item) == null){ + new ItemUnitStance(item); + } + } + } } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index a90e5624da..a2f9e4c56d 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -3,8 +3,10 @@ package mindustry.editor; import arc.*; import arc.func.*; import arc.graphics.*; +import arc.input.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.ImageButton.*; import arc.scene.ui.layout.*; @@ -36,9 +38,15 @@ public class MapGenerateDialog extends BaseDialog{ Seq filters = new Seq<>(); int scaling = mobile ? 3 : 1; Table filterTable; + BorderImage preview; Future result; boolean generating; + boolean updateQueued; + MirrorFilter dragging; + Rect dragRect = new Rect(); + Vec2 dragAxis = new Vec2(); + long lastDrag; long[] buffer1, buffer2; Cons> applier; @@ -192,6 +200,57 @@ public class MapGenerateDialog extends BaseDialog{ editor.clearOp(); } + MirrorFilter hit(float x, float y){ + if(preview == null) return null; + + MirrorFilter.getDrawRect(preview, dragRect); + if(dragRect.width <= 0f || dragRect.height <= 0f) return null; + + MirrorFilter out = null; + float dst = Float.MAX_VALUE; + float pad = Scl.scl(16f); + int amount = 0; + + //pick the closest mirror line to the cursor + for(var filter : filters){ + if(filter instanceof MirrorFilter){ + MirrorFilter mirror = (MirrorFilter)filter; + float px = dragRect.x + Mathf.clamp(mirror.axisX, 0f, 1f) * dragRect.width; + float py = dragRect.y + Mathf.clamp(mirror.axisY, 0f, 1f) * dragRect.height; + + dragAxis.trnsExact(mirror.angle - 90f, 1f); + float ndst = Math.abs((x - px) * dragAxis.y - (y - py) * dragAxis.x); + if(ndst < dst){ + dst = ndst; + out = mirror; + } + amount++; + } + } + + if(out != null && dst <= pad) return out; + if(amount == 1 && out != null && x >= dragRect.x - pad && y >= dragRect.y - pad && x <= dragRect.x + dragRect.width + pad && y <= dragRect.y + dragRect.height + pad) return out; + return null; + } + + void drag(float x, float y){ + if(preview == null || dragging == null) return; + + MirrorFilter.getDrawRect(preview, dragRect); + if(dragRect.width <= 0f || dragRect.height <= 0f) return; + + //convert preview coordinates back into normalized axis coordinates + dragging.axisX = Mathf.clamp((x - dragRect.x) / dragRect.width, 0f, 1f); + dragging.axisY = Mathf.clamp((y - dragRect.y) / dragRect.height, 0f, 1f); + } + + void dragUpdate(boolean force){ + long now = Time.millis(); + if(!force && now - lastDrag < 33L) return; + lastDrag = now; + update(); + } + void setup(){ if(pixmap != null){ pixmap.dispose(); @@ -206,7 +265,7 @@ public class MapGenerateDialog extends BaseDialog{ cont.clear(); cont.table(t -> { t.margin(8f); - t.stack(new BorderImage(texture){ + preview = new BorderImage(texture){ { setScaling(Scaling.fit); } @@ -218,10 +277,39 @@ public class MapGenerateDialog extends BaseDialog{ filter.draw(this); } } - }, new Stack(){{ + }; + preview.addListener(new InputListener(){ + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ + if(button != KeyCode.mouseLeft) return false; + + dragging = hit(x, y); + if(dragging == null) return false; + + drag(x, y); + dragUpdate(true); + return true; + } + + @Override + public void touchDragged(InputEvent event, float x, float y, int pointer){ + if(dragging == null) return; + drag(x, y); + dragUpdate(false); + } + + @Override + public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){ + if(dragging == null) return; + drag(x, y); + dragUpdate(true); + dragging = null; + } + }); + t.stack(preview, new Stack(){{ add(new Image(Styles.black8)); add(new Image(Icon.refresh, Scaling.none)); - visible(() -> generating && !updateEditorOnChange); + visible(() -> generating && !updateEditorOnChange && dragging == null); }}).uniformX().grow().padRight(10); t.pane(p -> filterTable = p.marginRight(6)).update(pane -> { if(Core.scene.getKeyboardFocus() instanceof Dialog && Core.scene.getKeyboardFocus() != this){ @@ -394,6 +482,8 @@ public class MapGenerateDialog extends BaseDialog{ buffer1 = null; buffer2 = null; generating = false; + preview = null; + dragging = null; if(pixmap != null){ pixmap.dispose(); texture.dispose(); @@ -407,18 +497,25 @@ public class MapGenerateDialog extends BaseDialog{ void update(){ if(generating){ + updateQueued = true; return; } - var copy = filters.copy(); + Seq copy = new Seq<>(filters.size); + //copy filters so preview generation doesn't race with UI edits + for(var filter : filters){ + copy.add(filter.copy()); + } + + generating = true; + updateQueued = false; result = mainExecutor.submit(() -> { try{ int w = pixmap.width; world.setGenerating(true); - generating = true; - if(!filters.isEmpty()){ + if(!copy.isEmpty()){ //write to buffer1 for reading for(int px = 0; px < pixmap.width; px++){ for(int py = 0; py < pixmap.height; py++){ @@ -446,7 +543,7 @@ public class MapGenerateDialog extends BaseDialog{ for(int py = 0; py < pixmap.height; py++){ int color; //get result from buffer1 if there's filters left, otherwise get from editor directly - if(filters.isEmpty()){ + if(copy.isEmpty()){ Tile tile = editor.tile(px * scaling, py * scaling); color = MapIO.colorFor(tile.block(), tile.floor(), tile.overlay(), Team.derelict); }else{ @@ -459,14 +556,24 @@ public class MapGenerateDialog extends BaseDialog{ Core.app.post(() -> { if(pixmap == null || texture == null){ + generating = false; return; } texture.draw(pixmap); generating = false; + if(updateQueued){ + //run one more pass if changes came in while generating + update(); + } }); }catch(Exception e){ generating = false; Log.err(e); + Core.app.post(() -> { + if(updateQueued){ + update(); + } + }); } world.setGenerating(false); }); diff --git a/core/src/mindustry/entities/GroupDefs.java b/core/src/mindustry/entities/GroupDefs.java index a612659dd3..5e1a8dbd24 100644 --- a/core/src/mindustry/entities/GroupDefs.java +++ b/core/src/mindustry/entities/GroupDefs.java @@ -5,7 +5,7 @@ import mindustry.gen.*; class GroupDefs{ @GroupDef(value = Entityc.class, exclude = {Unitc.class, PowerGraphUpdaterc.class, Bulletc.class, EffectStatec.class, Playerc.class}, update = true) G all; - @GroupDef(value = {EffectStatec.class}) G effect; + @GroupDef(value = EffectStatec.class) G effect; @GroupDef(value = Playerc.class, mapping = true) G player; @GroupDef(value = Bulletc.class, spatial = true, collide = true) G bullet; @GroupDef(value = Unitc.class, spatial = true, mapping = true) G unit; diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index c246a120e5..69b926dba7 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -924,6 +924,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ lastUnit = null; lastPlans.clear(); player.shooting = false; + player.pingTime = 0f; } public void getSyncedPlans(Seq out){ diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 70c47fb56c..aae498aa55 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1176,9 +1176,8 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - if(target.building() instanceof MessageBuild d && d.isValid() && (exec.privileged || (d.team == exec.team && !d.block.privileged))){ - d.message.setLength(0); - d.message.append(exec.textBuffer, 0, Math.min(exec.textBuffer.length(), ((MessageBlock)d.block).maxTextLength)); + if(target.building() instanceof LPrintable d && d.printable(exec)){ + d.print(exec.textBuffer); } exec.textBuffer.setLength(0); diff --git a/core/src/mindustry/logic/LPrintable.java b/core/src/mindustry/logic/LPrintable.java new file mode 100644 index 0000000000..9d0aa0b799 --- /dev/null +++ b/core/src/mindustry/logic/LPrintable.java @@ -0,0 +1,6 @@ +package mindustry.logic; + +public interface LPrintable{ + boolean printable(LExecutor exec); + void print(StringBuilder text); +} diff --git a/core/src/mindustry/maps/filters/MirrorFilter.java b/core/src/mindustry/maps/filters/MirrorFilter.java index 0bc62f80a0..210efb0e12 100644 --- a/core/src/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/mindustry/maps/filters/MirrorFilter.java @@ -1,6 +1,7 @@ package mindustry.maps.filters; import arc.graphics.g2d.*; +import arc.math.*; import arc.math.geom.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; @@ -15,6 +16,7 @@ public class MirrorFilter extends GenerateFilter{ public int angle = 45; public boolean rotate = false; + public float axisX = 0.5f, axisY = 0.5f; @Override public FilterOption[] options(){ @@ -34,8 +36,9 @@ public class MirrorFilter extends GenerateFilter{ v1.trnsExact(angle - 90, 1f); v2.set(v1).scl(-1f); - v1.add(in.width/2f - 0.5f, in.height/2f - 0.5f); - v2.add(in.width/2f - 0.5f, in.height/2f - 0.5f); + //place the mirror line at the configured normalized pivot + v1.add(coord(axisX, in.width), coord(axisY, in.height)); + v2.add(coord(axisX, in.width), coord(axisY, in.height)); v3.set(in.x, in.y); @@ -54,25 +57,48 @@ public class MirrorFilter extends GenerateFilter{ @Override public void draw(Image image){ super.draw(image); - float imageGetWidth = image.getWidth()/2f; - float imageGetHeight = image.getHeight()/2f; - float size = Math.max(imageGetWidth, imageGetHeight); + getDrawRect(image, Tmp.r1); + if(Tmp.r1.width <= 0f || Tmp.r1.height <= 0f) return; - Vec2 vsize = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), imageGetWidth, imageGetHeight); + float px = Tmp.r1.x + Mathf.clamp(axisX, 0f, 1f) * Tmp.r1.width; + float py = Tmp.r1.y + Mathf.clamp(axisY, 0f, 1f) * Tmp.r1.height; - Tmp.v1.trns(angle - 90, size); - clipHalfLine(Tmp.v1, -vsize.x, -vsize.y, vsize.x, vsize.y); + Tmp.v1.trns(angle - 90, 99999f); + clipHalfLine(Tmp.v1, Tmp.r1.x - px, Tmp.r1.y - py, Tmp.r1.x + Tmp.r1.width - px, Tmp.r1.y + Tmp.r1.height - py); Tmp.v2.set(Tmp.v1).scl(-1f); //opposite of v1 + clipHalfLine(Tmp.v2, Tmp.r1.x - px, Tmp.r1.y - py, Tmp.r1.x + Tmp.r1.width - px, Tmp.r1.y + Tmp.r1.height - py); - //adding back the coordinates of the center of the image - Tmp.v1.add(imageGetWidth + image.x, imageGetHeight + image.y); - Tmp.v2.add(imageGetWidth + image.x, imageGetHeight + image.y); + Tmp.v1.add(px + image.x, py + image.y); + Tmp.v2.add(px + image.x, py + image.y); + Lines.stroke(Scl.scl(8f), Pal.darkerGray); + Lines.line(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); Lines.stroke(Scl.scl(3f), Pal.accent); Lines.line(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); + + Draw.color(Pal.accent); + Fill.circle(px + image.x, py + image.y, Scl.scl(6f)); + Draw.color(Pal.darkerGray); + Fill.circle(px + image.x, py + image.y, Scl.scl(4f)); Draw.reset(); } + public static void getDrawRect(Image image, Rect out){ + if(image == null || image.getDrawable() == null || out == null){ + if(out != null) out.set(0f, 0f, 0f, 0f); + return; + } + + Vec2 size = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), image.getWidth(), image.getHeight()); + //account for fit scaling so handles stay on the actual map area + out.set((image.getWidth() - size.x)/2f, (image.getHeight() - size.y)/2f, size.x, size.y); + } + + float coord(float axis, int size){ + if(size <= 1) return 0f; + return Mathf.clamp(axis, 0f, 1f) * (size - 1f); + } + void mirror(int width, int height, Vec2 p, float x0, float y0, float x1, float y1){ //special case: uneven map mirrored at 45 degree angle (or someone might just want rotational symmetry) if((width != height && angle % 90 != 0) || rotate){ diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index e2ab0f20f3..8a978b1268 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -13,6 +13,7 @@ import arc.util.*; import arc.util.io.*; import arc.util.serialization.*; import arc.util.serialization.Jval.*; +import mindustry.ai.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.EventType.*; @@ -786,15 +787,20 @@ public class Mods implements Loadable{ Fi contentRoot = mod.root.child("content"); for(ContentType type : ContentType.all){ String lower = type.name().toLowerCase(Locale.ROOT); - Fi folder = contentRoot.child(lower + (lower.endsWith("s") ? "" : "s")); - if(folder.exists()){ - for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){ + //search both the proper folder name (e.g. "weather", "statuses") and the old nonsensical folder names ("weathers", "status") + String oldName = lower + (lower.endsWith("s") ? "" : "s"); + Fi[] folders = {oldName.equals(type.folderName) ? null : contentRoot.child(oldName), contentRoot.child(type.folderName)}; - //if this is part of the ordered content, put it aside to be dealt with later - if(orderSet != null && orderSet.contains(file.nameWithoutExtension())){ - orderedContent.put(file.nameWithoutExtension(), new LoadRun(type, file, mod)); - }else{ - unorderedContent.add(new LoadRun(type, file, mod)); + for(Fi folder : folders){ + if(folder != null && folder.exists()){ + for(Fi file : folder.findAll(f -> f.extEquals("json") || f.extEquals("hjson"))){ + + //if this is part of the ordered content, put it aside to be dealt with later + if(orderSet != null && orderSet.contains(file.nameWithoutExtension())){ + orderedContent.put(file.nameWithoutExtension(), new LoadRun(type, file, mod)); + }else{ + unorderedContent.add(new LoadRun(type, file, mod)); + } } } } @@ -836,6 +842,8 @@ public class Mods implements Loadable{ //this finishes parsing content fields parser.finishParsing(); + UnitStance.loadAfterMods(); + Events.fire(new ModContentLoadEvent()); } diff --git a/core/src/mindustry/ui/builder/UiBuilder.java b/core/src/mindustry/ui/builder/UiBuilder.java index 85746e1552..cfb49b5ebc 100644 --- a/core/src/mindustry/ui/builder/UiBuilder.java +++ b/core/src/mindustry/ui/builder/UiBuilder.java @@ -264,6 +264,8 @@ public class UiBuilder{ public ButtonBuilder style(String style){ return prop(UiKey.style, style); } public ButtonBuilder clicked(String result){ return prop(UiKey.clicked, result); } public ButtonBuilder disabled(boolean disabled){ return prop(UiKey.disabled, disabled); } + public ButtonBuilder group(String group){ return prop(UiKey.group, group); } + public ButtonBuilder checked(boolean checked){ return prop(UiKey.checked, checked); } } public static class ImageButtonBuilder extends NodeBuilder{ @@ -273,6 +275,8 @@ public class UiBuilder{ public ImageButtonBuilder style(String style){ return prop(UiKey.style, style); } public ImageButtonBuilder clicked(String result){ return prop(UiKey.clicked, result); } public ImageButtonBuilder disabled(boolean disabled){ return prop(UiKey.disabled, disabled); } + public ImageButtonBuilder group(String group){ return prop(UiKey.group, group); } + public ImageButtonBuilder checked(boolean checked){ return prop(UiKey.checked, checked); } } public static class FieldBuilder extends NodeBuilder{ @@ -293,6 +297,7 @@ public class UiBuilder{ public CheckBuilder checked(boolean checked){ return prop(UiKey.checked, checked); } public CheckBuilder style(String style){ return prop(UiKey.style, style); } public CheckBuilder disabled(boolean disabled){ return prop(UiKey.disabled, disabled); } + public CheckBuilder group(String group){ return prop(UiKey.group, group); } } public static class SliderBuilder extends NodeBuilder{ @@ -321,5 +326,7 @@ public class UiBuilder{ public ButtonTableBuilder clicked(String result){ return prop(UiKey.clicked, result); } public ButtonTableBuilder margin(float m){ return prop(UiKey.margin, m); } public ButtonTableBuilder disabled(boolean disabled){ return prop(UiKey.disabled, disabled); } + public ButtonTableBuilder group(String group){ return prop(UiKey.group, group); } + public ButtonTableBuilder checked(boolean checked){ return prop(UiKey.checked, checked); } } } \ No newline at end of file diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 14fc314ac1..038ae010aa 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -807,7 +807,7 @@ public class PlacementFragment{ } //if the tile has a drop, display the drop - if((hoverTile.drop() != null && hoverTile.block() == Blocks.air) || hoverTile.wallDrop() != null || (hoverTile.floor().liquidDrop != null && hoverTile.block() == Blocks.air)){ + if(hoverTile.displayable()){ return hoverTile; } } diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 7ab828049f..d9f9733442 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -727,6 +727,11 @@ public class Tile implements Position, QuadTreeObject, Displayable{ }).growX().left(); } + @Override + public boolean displayable(){ + return (drop() != null && block == Blocks.air) || wallDrop() != null || (floor().liquidDrop != null && block == Blocks.air); + } + @Override public float getX(){ return drawx(); diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index c1e57abed1..049c91662b 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -48,6 +48,7 @@ public class ForceProjector extends Block{ public float hitSoundVolume = 0.12f; public Effect absorbEffect = Fx.absorb; public Effect shieldBreakEffect = Fx.shieldBreak; + public Effect forceShrinkEffect = Fx.forceShrink; public @Load("@-top") TextureRegion topRegion; //TODO json support @@ -187,7 +188,7 @@ public class ForceProjector extends Block{ @Override public void onRemoved(){ float radius = realRadius(); - if(!broken && radius > 1f) Fx.forceShrink.at(x, y, radius, team.color); + if(!broken && radius > 1f) forceShrinkEffect.at(x, y, radius, team.color); super.onRemoved(); } diff --git a/core/src/mindustry/world/blocks/logic/MemoryBlock.java b/core/src/mindustry/world/blocks/logic/MemoryBlock.java index 84a9b208be..5e702870b0 100644 --- a/core/src/mindustry/world/blocks/logic/MemoryBlock.java +++ b/core/src/mindustry/world/blocks/logic/MemoryBlock.java @@ -32,6 +32,14 @@ public class MemoryBlock extends Block{ return !privileged || state.rules.editor || state.rules.allowEditWorldProcessors; } + @Override + public double sense(LAccess sensor){ + return switch(sensor){ + case memoryCapacity -> memoryCapacity; + default -> super.sense(sensor); + }; + } + @Override public boolean canBreak(Tile tile){ return accessible(); diff --git a/core/src/mindustry/world/blocks/logic/MessageBlock.java b/core/src/mindustry/world/blocks/logic/MessageBlock.java index c0cfca9ae9..e5a92bda91 100644 --- a/core/src/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/mindustry/world/blocks/logic/MessageBlock.java @@ -70,7 +70,7 @@ public class MessageBlock extends Block{ return accessible(); } - public class MessageBuild extends Building implements LReadable{ + public class MessageBuild extends Building implements LReadable, LPrintable{ public StringBuilder message = new StringBuilder(); @Override @@ -179,6 +179,17 @@ public class MessageBlock extends Block{ output.setnum(address < 0 || address >= message.length() ? Double.NaN : message.charAt(address)); } + @Override + public boolean printable(LExecutor exec) { + return isValid() && (exec.privileged || (team == exec.team && !privileged)); + } + + @Override + public void print(StringBuilder text) { + message.setLength(0); + message.append(text, 0, Math.min(text.length(), maxTextLength)); + } + @Override public double sense(LAccess sensor){ return switch(sensor){ @@ -212,7 +223,7 @@ public class MessageBlock extends Block{ @Override public void updateTableAlign(Table table){ Vec2 pos = Core.input.mouseScreen(x, y + size * tilesize / 2f + 1); - table.setPosition(pos.x, pos.y, Align.bottom); + table.setPosition(pos.x - Core.scene.marginLeft, pos.y - Core.scene.marginBottom, Align.bottom); } @Override diff --git a/core/src/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java index 16914b1f3a..a35cee2a51 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -140,6 +140,9 @@ public class Unloader extends Block{ Pools.freeAll(possibleBlocks, true); possibleBlocks.clear(); + //check item length for data patches - this method is called upon world load; keep it out of the update loop + if(allItems.length != content.items().size) allItems = content.items().toArray(Item.class); + for(int i = 0; i < proximity.size; i++){ var other = proximity.get(i); if(!other.interactable(team)) continue; //avoid blocks of the wrong team diff --git a/ios/Info.plist.xml b/ios/Info.plist.xml index 66ddf3a143..3ace8e7c9c 100644 --- a/ios/Info.plist.xml +++ b/ios/Info.plist.xml @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 MinimumOSVersion - 13.0.0 + 15.0.0 CFBundleName ${app.name} CFBundlePackageType diff --git a/tools/src/mindustry/tools/MapFixer.java b/tools/src/mindustry/tools/MapFixer.java index 19915c868f..9c4ad7a4e8 100644 --- a/tools/src/mindustry/tools/MapFixer.java +++ b/tools/src/mindustry/tools/MapFixer.java @@ -77,14 +77,27 @@ public class MapFixer{ changed = true; } - Seq timers = state.rules.objectives.all.select(m -> m instanceof TimerObjective && !m.hidden && ((TimerObjective)m).text != null && - !((TimerObjective)m).text.isEmpty() && !((TimerObjective)m).text.contains("@")).as(); + { //unlocalized check + Seq timers = state.rules.objectives.all.select(m -> m instanceof TimerObjective t && !m.hidden && t.text != null && + !t.text.isEmpty() && !t.text.contains("@")).as(); - if(!timers.isEmpty()){ - Log.warn("@: Unlocalized objectives: @", map.name(), timers.toString(", ", t -> "'" + t.text + "'")); - if(isHidden){ + if(!timers.isEmpty()){ + Log.warn("@: Unlocalized objectives: @", map.name(), timers.toString(", ", t -> "'" + t.text + "'")); + if(isHidden){ + changed = true; + timers.each(t -> t.hidden = true); + } + } + } + + { //'escelating' typo check + Seq timers = state.rules.objectives.all.select(m -> m instanceof TimerObjective t && !m.hidden && t.text != null && + !t.text.isEmpty() && t.text.trim().equals("@objective.enemyescelating")).as(); + + if(!timers.isEmpty()){ + Log.warn("@: Typo in objective: @", map.name(), timers.toString(", ", t -> "'" + t.text + "'")); changed = true; - timers.each(t -> t.hidden = true); + timers.each(t -> t.text = "@objective.enemyescalating"); } }